diff --git a/Strategic/Map Screen Interface.h b/Strategic/Map Screen Interface.h index 6e13fc10..4e0ad4ed 100644 --- a/Strategic/Map Screen Interface.h +++ b/Strategic/Map Screen Interface.h @@ -64,6 +64,7 @@ enum{ MILCON_MENU_GETDOWN, MILCON_MENU_CROUCH, MILCON_MENU_TAKE_COVER, + MILCON_MENU_MOVE_TO, MILCON_MENU_ALL_ATTACK, MILCON_MENU_ALL_HOLD, MILCON_MENU_ALL_RETREAT, diff --git a/Tactical/Handle UI.cpp b/Tactical/Handle UI.cpp index 80552a52..d813c585 100644 --- a/Tactical/Handle UI.cpp +++ b/Tactical/Handle UI.cpp @@ -229,6 +229,9 @@ UINT32 UIHandleOpenDoorMenu( UI_EVENT *pUIEvent ); UINT32 UIHandleEXExitSectorMenu( UI_EVENT *pUIEvent ); +// sevenfm: +UINT32 UIHandleChangeToRadio(UI_EVENT *pUIEvent); + BOOLEAN ValidQuickExchangePosition( ); @@ -365,7 +368,7 @@ UI_EVENT gEvents[ NUM_UI_EVENTS ] = 0, RUBBERBAND_MODE, UIHandleRubberBandOnTerrain, FALSE, FALSE, 0, 0, 0, 0, 0, JUMPOVER_MODE, UIHandleJumpOverOnTerrain, FALSE, FALSE, 0, 0, 0, 0, 0, MOVE_MODE, UIHandleJumpOver, FALSE, FALSE, 0, 0, 0, 0, - + 0, RADIOCURSOR_MODE, UIHandleChangeToRadio, FALSE, FALSE, 0, 0, 0, 0, }; UI_MODE gCurrentUIMode = IDLE_MODE; @@ -745,7 +748,7 @@ UINT32 HandleTacticalUI( void ) } } - // Check if menu event is done and if so set to privious mode + // Check if menu event is done and if so set to previous mode // This is needed to hook into the interface stuff which sets the fDoneMenu flag if ( gEvents[ uiNewEvent ].fDoneMenu == TRUE ) { @@ -754,7 +757,7 @@ UINT32 HandleTacticalUI( void ) gCurrentUIMode = (UI_MODE) gEvents[ uiNewEvent ].uiMenuPreviousMode; } } - // Check to return to privious mode + // Check to return to previous mode // If the event is a single event, return to previous if ( gEvents[ uiNewEvent ].uiFlags & UIEVENT_SINGLEEVENT ) { @@ -767,7 +770,7 @@ UINT32 HandleTacticalUI( void ) else { // ATE: Check first that some modes are met.... - if ( gCurrentUIMode != HANDCURSOR_MODE && gCurrentUIMode != LOOKCURSOR_MODE && gCurrentUIMode != TALKCURSOR_MODE ) + if (gCurrentUIMode != HANDCURSOR_MODE && gCurrentUIMode != LOOKCURSOR_MODE && gCurrentUIMode != TALKCURSOR_MODE && gCurrentUIMode != RADIOCURSOR_MODE) { guiCurrentEvent = M_ON_TERRAIN; } @@ -1935,7 +1938,7 @@ UINT32 UIHandleAOnTerrain( UI_EVENT *pUIEvent ) // Get soldier to determine range if ( GetSoldier( &pSoldier, gusSelectedSoldier ) ) { - // ATE: Add stuff here to display a system message if we are targeting smeothing and + // ATE: Add stuff here to display a system message if we are targeting something and // are out of range. // Are we using a gun? if ( GetActionModeCursor( pSoldier ) == TARGETCURS ) @@ -5813,6 +5816,14 @@ UINT32 UIHandleLAOnTerrain( UI_EVENT *pUIEvent ) return( GAME_SCREEN ); } +UINT32 UIHandleChangeToRadio(UI_EVENT *pUIEvent) +{ + ErasePath(TRUE); + + guiNewUICursor = PLACE_REMOTE_GREY_UICURSOR; + + return(GAME_SCREEN); +} void GetGridNoScreenXY( INT32 sGridNo, INT16 *pScreenX, INT16 *pScreenY ) { diff --git a/Tactical/Handle UI.h b/Tactical/Handle UI.h index da0a6cbf..73002afe 100644 --- a/Tactical/Handle UI.h +++ b/Tactical/Handle UI.h @@ -60,6 +60,7 @@ typedef enum EXITSECTORMENU_MODE, RUBBERBAND_MODE, JUMPOVER_MODE, + RADIOCURSOR_MODE, } UI_MODE; @@ -163,6 +164,8 @@ typedef enum JP_ON_TERRAIN, JP_JUMP, + R_CHANGE_TO_RADIO, + NUM_UI_EVENTS } UI_EVENT_DEFINES; @@ -346,6 +349,7 @@ void BeginDisplayTimedCursor( UINT32 uiCursorID, UINT32 uiDelay ); void HandleHandCursorClick( INT32 usMapPos, UINT32 *puiNewEvent ); void HandleHandCursorRightClick( INT32 usMapPos, UINT32 *puiNewEvent ); +void HandleRadioCursorClick(INT32 usMapPos, UINT32 *puiNewEvent); INT8 HandleMoveModeInteractiveClick( INT32 usMapPos, UINT32 *puiNewEvent ); BOOLEAN HandleUIReloading( SOLDIERTYPE *pSoldier ); diff --git a/Tactical/Militia Control.cpp b/Tactical/Militia Control.cpp index b2ecd788..895739cf 100644 --- a/Tactical/Militia Control.cpp +++ b/Tactical/Militia Control.cpp @@ -619,32 +619,6 @@ void CreateDestroyMouseRegionsForMilitiaControlMenu( void ) SGPRect pDimensions; static BOOLEAN fShowRemoveMenu = FALSE; - - // will create/destroy mouse regions for the map screen assignment main menu - // check if we can only remove character from team..not assign - //if( ( bSelectedAssignChar != -1 ) || ( fShowRemoveMenu == TRUE ) ) - //{ - // if( fShowRemoveMenu == TRUE ) - // { - // // dead guy handle menu stuff - // fShowRemoveMenu = fShowMilitiaControlMenu | fShowContractMenu; - // - // CreateDestroyMouseRegionsForRemoveMenu( ); - - // return; - // } - // if( ( Menptr[gCharactersList[bSelectedAssignChar].usSolID].bLife == 0 ) || ( Menptr[gCharactersList[bSelectedAssignChar].usSolID].bMilitiaControl == MilitiaControl_POW ) ) - // { - // // dead guy handle menu stuff - // fShowRemoveMenu = fShowMilitiaControlMenu | fShowContractMenu; - // - // CreateDestroyMouseRegionsForRemoveMenu( ); - - // return; - // } - //} - - if( ( fShowMilitiaControlMenu == TRUE ) && ( fCreated == FALSE ) ) { gfIgnoreScrolling = FALSE; @@ -1062,7 +1036,12 @@ void HandleShadingOfLinesForMilitiaControlMenu( void ) UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_COMETOME ); UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_GETDOWN ); UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_CROUCH ); - UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_TAKE_COVER ); + UnShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_TAKE_COVER ); + + if ((gTacticalStatus.uiFlags & TURNBASED) && (gTacticalStatus.uiFlags & INCOMBAT)) + ShadeStringInBox(ghMilitiaControlBox, MILCON_MENU_MOVE_TO); + else + UnShadeStringInBox(ghMilitiaControlBox, MILCON_MENU_MOVE_TO); } else { @@ -1073,6 +1052,8 @@ void HandleShadingOfLinesForMilitiaControlMenu( void ) ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_GETDOWN ); ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_CROUCH ); ShadeStringInBox( ghMilitiaControlBox, MILCON_MENU_TAKE_COVER ); + + ShadeStringInBox(ghMilitiaControlBox, MILCON_MENU_MOVE_TO); } } @@ -1169,6 +1150,10 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTMilitiaSoldier->EVENT_StopMerc(pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->ubDirection); + CancelAIAction(pTMilitiaSoldier, TRUE); + // Attack !!! pTMilitiaSoldier->aiData.bOrders = SEEKENEMY; pTMilitiaSoldier->aiData.bAttitude = AGGRESSIVE; @@ -1197,6 +1182,10 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTMilitiaSoldier->EVENT_StopMerc(pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->ubDirection); + CancelAIAction(pTMilitiaSoldier, TRUE); + //Hold Position !!! //ScreenMsg( FONT_WHITE, MSG_INTERFACE, L"Hold Position" ); pTMilitiaSoldier->aiData.bOrders = STATIONARY; @@ -1223,6 +1212,10 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTMilitiaSoldier->EVENT_StopMerc(pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->ubDirection); + CancelAIAction(pTMilitiaSoldier, TRUE); + INT16 sActionGridNo; pTMilitiaSoldier->aiData.bOrders = FARPATROL; @@ -1275,6 +1268,10 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTMilitiaSoldier->EVENT_StopMerc(pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->ubDirection); + CancelAIAction(pTMilitiaSoldier, TRUE); + INT32 sActionGridNo, sGridNo, sAdjustedGridNo; UINT8 ubDirection; @@ -1321,10 +1318,13 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->stats.bLife >= OKLIFE) ) { - //if ( SoldierCanAffordNewStance( pTeamSoldier, ANIM_PRONE ) ) + // sevenfm: stop any AI + pTMilitiaSoldier->EVENT_StopMerc(pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->ubDirection); + CancelAIAction(pTMilitiaSoldier, TRUE); + + if (pTMilitiaSoldier->InternalIsValidStance(pTMilitiaSoldier->ubDirection, ANIM_PRONE)) { SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_PRONE ); - //SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_CROUCH ); } } @@ -1346,8 +1346,17 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) case( MILCON_MENU_CROUCH ): if (fCanCommunicate) { - if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->stats.bLife >= OKLIFE) ) - SendChangeSoldierStanceEvent( pTMilitiaSoldier, ANIM_CROUCH ); + if ((pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->stats.bLife >= OKLIFE)) + { + // sevenfm: stop any AI + pTMilitiaSoldier->EVENT_StopMerc(pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->ubDirection); + CancelAIAction(pTMilitiaSoldier, TRUE); + + if (pTMilitiaSoldier->InternalIsValidStance(pTMilitiaSoldier->ubDirection, ANIM_CROUCH)) + { + SendChangeSoldierStanceEvent(pTMilitiaSoldier, ANIM_CROUCH); + } + } DeductPoints( pSoldier, APBPConstants[AP_TALK], 0 ); StatChange( pSoldier, LDRAMT, 1, FALSE ); @@ -1369,6 +1378,10 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTMilitiaSoldier->bActive) && (pTMilitiaSoldier->bInSector) && (pTMilitiaSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTMilitiaSoldier->EVENT_StopMerc(pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->ubDirection); + CancelAIAction(pTMilitiaSoldier, TRUE); + INT16 sActionGridNo; INT32 iDummy; @@ -1404,6 +1417,27 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) } break; + case( MILCON_MENU_MOVE_TO ): + if (!((gTacticalStatus.uiFlags & TURNBASED) && (gTacticalStatus.uiFlags & INCOMBAT))) + { + // sevenfm: stop any AI + pTMilitiaSoldier->EVENT_StopMerc(pTMilitiaSoldier->sGridNo, pTMilitiaSoldier->ubDirection); + CancelAIAction(pTMilitiaSoldier, TRUE); + + DeductPoints(pSoldier, APBPConstants[AP_TALK], 0); + StatChange(pSoldier, LDRAMT, 1, FALSE); + + // stop showing menu + fShowMilitiaControlMenu = FALSE; + giAssignHighLine = -1; + + // set dirty flag + fTeamPanelDirty = TRUE; + fMapScreenBottomDirty = TRUE; + + guiPendingOverrideEvent = R_CHANGE_TO_RADIO; + } + break; case( MILCON_MENU_ALL_ATTACK ): if (fAllowSectorOrder) @@ -1417,6 +1451,10 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTeamSoldier->EVENT_StopMerc(pTeamSoldier->sGridNo, pTeamSoldier->ubDirection); + CancelAIAction(pTeamSoldier, TRUE); + pTeamSoldier->aiData.bOrders = SEEKENEMY; pTeamSoldier->aiData.bAttitude = AGGRESSIVE; pTeamSoldier->usUIMovementMode = RUNNING; @@ -1450,6 +1488,10 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTeamSoldier->EVENT_StopMerc(pTeamSoldier->sGridNo, pTeamSoldier->ubDirection); + CancelAIAction(pTeamSoldier, TRUE); + pTeamSoldier->aiData.bOrders = STATIONARY; pTeamSoldier->aiData.bAttitude = DEFENSIVE; } @@ -1483,6 +1525,10 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTeamSoldier->EVENT_StopMerc(pTeamSoldier->sGridNo, pTeamSoldier->ubDirection); + CancelAIAction(pTeamSoldier, TRUE); + pTeamSoldier->aiData.bOrders = FARPATROL; pTeamSoldier->aiData.bAttitude = DEFENSIVE; pTeamSoldier->usUIMovementMode = RUNNING; @@ -1542,6 +1588,10 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTeamSoldier->EVENT_StopMerc(pTeamSoldier->sGridNo, pTeamSoldier->ubDirection); + CancelAIAction(pTeamSoldier, TRUE); + // OK, find an adjacent gridno.... sGridNo = pSoldier->sGridNo; @@ -1594,6 +1644,9 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTeamSoldier->EVENT_StopMerc(pTeamSoldier->sGridNo, pTeamSoldier->ubDirection); + CancelAIAction(pTeamSoldier, TRUE); // See if we can get there sActionGridNo = RandDestWithinRange( pTeamSoldier ); @@ -1643,10 +1696,13 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->stats.bLife >= OKLIFE) ) { - //if ( SoldierCanAffordNewStance( pTeamSoldier, ANIM_PRONE ) ) + // sevenfm: stop any AI + pTeamSoldier->EVENT_StopMerc(pTeamSoldier->sGridNo, pTeamSoldier->ubDirection); + CancelAIAction(pTeamSoldier, TRUE); + + if (pTeamSoldier->InternalIsValidStance(pTeamSoldier->ubDirection, ANIM_PRONE)) { SendChangeSoldierStanceEvent( pTeamSoldier, ANIM_PRONE ); - //SendChangeSoldierStanceEvent( pTeamSoldier, ANIM_CROUCH ); } } } @@ -1678,7 +1734,14 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->stats.bLife >= OKLIFE) ) { - SendChangeSoldierStanceEvent( pTeamSoldier, ANIM_CROUCH ); + // sevenfm: stop any AI + pTeamSoldier->EVENT_StopMerc(pTeamSoldier->sGridNo, pTeamSoldier->ubDirection); + CancelAIAction(pTeamSoldier, TRUE); + + if (pTeamSoldier->InternalIsValidStance(pTeamSoldier->ubDirection, ANIM_CROUCH)) + { + SendChangeSoldierStanceEvent(pTeamSoldier, ANIM_CROUCH); + } } } @@ -1711,6 +1774,10 @@ void MilitiaControlMenuBtnCallBack( MOUSE_REGION * pRegion, INT32 iReason ) { if ( (pTeamSoldier->bActive) && (pTeamSoldier->bInSector) && (pTeamSoldier->stats.bLife >= OKLIFE) ) { + // sevenfm: stop any AI + pTeamSoldier->EVENT_StopMerc(pTeamSoldier->sGridNo, pTeamSoldier->ubDirection); + CancelAIAction(pTeamSoldier, TRUE); + // See if we can get there sActionGridNo = FindBestNearbyCover(pTeamSoldier,pTeamSoldier->aiData.bAIMorale,&iDummy); diff --git a/Tactical/Real Time Input.cpp b/Tactical/Real Time Input.cpp index e855e991..4fb392b3 100644 --- a/Tactical/Real Time Input.cpp +++ b/Tactical/Real Time Input.cpp @@ -578,6 +578,11 @@ void QueryRTLeftButton( UINT32 *puiNewEvent ) HandleHandCursorClick( usMapPos, puiNewEvent ); break; + case RADIOCURSOR_MODE: + + HandleRadioCursorClick(usMapPos, puiNewEvent); + break; + case ACTION_MODE: //*puiNewEvent = A_CHANGE_TO_CONFIM_ACTION; @@ -1108,6 +1113,7 @@ void QueryRTRightButton( UINT32 *puiNewEvent ) case IDLE_MODE: case ACTION_MODE: case HANDCURSOR_MODE: + case RADIOCURSOR_MODE: case LOOKCURSOR_MODE: case TALKCURSOR_MODE: case MOVE_MODE: @@ -1322,6 +1328,11 @@ void QueryRTRightButton( UINT32 *puiNewEvent ) *puiNewEvent = A_CHANGE_TO_MOVE; break; + case RADIOCURSOR_MODE: + // If we cannot actually do anything, return to movement mode + *puiNewEvent = A_CHANGE_TO_MOVE; + break; + case LOOKCURSOR_MODE: // If we cannot actually do anything, return to movement mode @@ -1491,6 +1502,10 @@ void GetRTMousePositionInput( UINT32 *puiNewEvent ) *puiNewEvent = HC_ON_TERRAIN; break; + case RADIOCURSOR_MODE: + //*puiNewEvent = A_CHANGE_TO_MOVE; + break; + case MOVE_MODE: if ( usMapPos != usOldMapPos ) @@ -1826,6 +1841,7 @@ void QueryRTWheels( UINT32 *puiNewEvent ) case IDLE_MODE: case MOVE_MODE: case HANDCURSOR_MODE: + case RADIOCURSOR_MODE: if(gGameExternalOptions.bAlternateMouseCommands) HandleAltMouseRTWheel(); else diff --git a/Tactical/Turn Based Input.cpp b/Tactical/Turn Based Input.cpp index 31fb4842..0c2ba66d 100644 --- a/Tactical/Turn Based Input.cpp +++ b/Tactical/Turn Based Input.cpp @@ -123,6 +123,7 @@ #include "DynamicDialogueWidget.h" // added by Flugente for DelayBoxDestructionBy(...) #include "Utilities.h" // added by Flugente #include "AIInternals.h" // sevenfm +#include "Interface Cursors.h" // sevenfm //forward declarations of common classes to eliminate includes class OBJECTTYPE; @@ -165,6 +166,9 @@ extern COVER_DRAW_MODE gubDrawMode; extern MOUSE_REGION gMPanelRegion; +extern UINT32 guiNewUICursor; +extern SOLDIERTYPE *pTMilitiaSoldier; + void HandleTalkingMenuKeys( InputAtom *pInputEvent, UINT32 *puiNewEvent ); void HandleMenuKeys( InputAtom *pInputEvent, UINT32 *puiNewEvent ); void HandleItemMenuKeys( InputAtom *pInputEvent, UINT32 *puiNewEvent ); @@ -722,6 +726,11 @@ void QueryTBLeftButton( UINT32 *puiNewEvent ) HandleHandCursorClick( usMapPos, puiNewEvent ); break; + case RADIOCURSOR_MODE: + + HandleRadioCursorClick(usMapPos, puiNewEvent); + break; + case JUMPOVER_MODE: if( GetSoldier( &pSoldier, gusSelectedSoldier ) ) @@ -889,6 +898,7 @@ void QueryTBRightButton( UINT32 *puiNewEvent ) case IDLE_MODE: case ACTION_MODE: case HANDCURSOR_MODE: + case RADIOCURSOR_MODE: case LOOKCURSOR_MODE: case TALKCURSOR_MODE: case MOVE_MODE: @@ -1080,6 +1090,11 @@ void QueryTBRightButton( UINT32 *puiNewEvent ) *puiNewEvent = A_CHANGE_TO_MOVE; break; + case RADIOCURSOR_MODE: + // If we cannot actually do anything, return to movement mode + *puiNewEvent = A_CHANGE_TO_MOVE; + break; + case LOOKCURSOR_MODE: case TALKCURSOR_MODE: @@ -1408,6 +1423,9 @@ void GetTBMousePositionInput( UINT32 *puiNewEvent ) *puiNewEvent = HC_ON_TERRAIN; break; + case RADIOCURSOR_MODE: + break; + } usOldMapPos = usMapPos; @@ -1438,6 +1456,7 @@ void GetPolledKeyboardInput( UINT32 *puiNewEvent ) case MOVE_MODE: case ACTION_MODE: case HANDCURSOR_MODE: + case RADIOCURSOR_MODE: if ( _KeyDown( CTRL ) ) { @@ -2063,6 +2082,11 @@ void GetKeyboardInput( UINT32 *puiNewEvent ) *puiNewEvent = A_CHANGE_TO_MOVE; } + if (gCurrentUIMode == RADIOCURSOR_MODE) + { + *puiNewEvent = A_CHANGE_TO_MOVE; + } + if ( !( gTacticalStatus.uiFlags & ENGAGED_IN_CONV ) ) { if ( gusSelectedSoldier != NOBODY ) @@ -5518,6 +5542,63 @@ INT8 CheckForAndHandleHandleVehicleInteractiveClick( SOLDIERTYPE *pSoldier, UINT return( 0 ); } +void HandleRadioCursorClick(INT32 usMapPos, UINT32 *puiNewEvent) +{ + SOLDIERTYPE * pSoldier = NULL; + GetSoldier(&pSoldier, gusSelectedSoldier); + + if (pSoldier && + pTMilitiaSoldier && + pTMilitiaSoldier->bActive && + pTMilitiaSoldier->bInSector && + pTMilitiaSoldier->stats.bLife >= OKLIFE) + { + INT32 sMoveSpot = usMapPos; + BOOLEAN fClimbingNecessary; + INT32 sClimbSpot; + INT32 iPathCost = EstimatePathCostToLocation(pTMilitiaSoldier, sMoveSpot, gsInterfaceLevel, FALSE, &fClimbingNecessary, &sClimbSpot); + + // See if we can get there + if (iPathCost > 0) + { + // sevenfm: change from stationary/patrol etc + pTMilitiaSoldier->aiData.bOrders = STATIONARY; + pTMilitiaSoldier->aiData.bAttitude = DEFENSIVE; + + // sevenfm: set this spot as original point + pTMilitiaSoldier->aiData.sPatrolGrid[0] = sMoveSpot; + + CancelAIAction(pTMilitiaSoldier, TRUE); + if (fClimbingNecessary) + { + pTMilitiaSoldier->aiData.bNextAction = AI_ACTION_MOVE_TO_CLIMB; + pTMilitiaSoldier->aiData.usNextActionData = sClimbSpot; + pTMilitiaSoldier->sAbsoluteFinalDestination = sMoveSpot; + + BeginMultiPurposeLocator(sClimbSpot, pTMilitiaSoldier->pathing.bLevel, FALSE); + } + else + { + pTMilitiaSoldier->aiData.bNextAction = AI_ACTION_SEEK_OPPONENT; + pTMilitiaSoldier->aiData.usNextActionData = sMoveSpot; + + BeginMultiPurposeLocator(sMoveSpot, pTMilitiaSoldier->pathing.bLevel, FALSE); + } + RESETTIMECOUNTER(pTMilitiaSoldier->timeCounters.AICounter, 100); + + //pTMilitiaSoldier->usSoldierFlagMask |= SOLDIER_MILITIA_ORDER; + } + else + { + pTMilitiaSoldier->DoMercBattleSound(BATTLE_SOUND_CURSE1); + } + } + + *puiNewEvent = A_CHANGE_TO_MOVE; + + return; +} + void HandleHandCursorClick( INT32 usMapPos, UINT32 *puiNewEvent ) { SOLDIERTYPE *pSoldier; @@ -6892,6 +6973,7 @@ void QueryTBWheel( UINT32 *puiNewEvent ) case MOVE_MODE: case CONFIRM_MOVE_MODE: case HANDCURSOR_MODE: + case RADIOCURSOR_MODE: if(gGameExternalOptions.bAlternateMouseCommands) HandleAltMouseTBWheel(); else diff --git a/TacticalAI/DecideAction.cpp b/TacticalAI/DecideAction.cpp index d44518aa..17c61935 100644 --- a/TacticalAI/DecideAction.cpp +++ b/TacticalAI/DecideAction.cpp @@ -1130,7 +1130,12 @@ INT8 DecideActionGreen(SOLDIERTYPE *pSoldier) // CLIMB A BUILDING //////////////////////////////////////////////////////////////////////////// - if (!fCivilian && pSoldier->aiData.bLastAction != AI_ACTION_CLIMB_ROOF && !is_networked) + if (!fCivilian && + pSoldier->CheckInitialAP() && + pSoldier->aiData.bLastAction != AI_ACTION_CLIMB_ROOF && + pSoldier->aiData.bOrders != STATIONARY && + pSoldier->pathing.bLevel == 0 && + !is_networked) { iChance = 10 + pSoldier->aiData.bBypassToGreen; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index e824d352..78f61fad 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -2798,6 +2798,7 @@ STR16 pMilitiaControlMenuStrings[] = L"卧倒", L"蹲下", // L"Crouch", L"隐蔽", + L"Move to", // TODO. Translate L"全体: 自动进攻", L"全体: 原地坚守", L"全体: 撤退", diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index 56066f29..10769158 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -2797,6 +2797,7 @@ STR16 pMilitiaControlMenuStrings[] = L"Get down", // retreat militia L"Crouch", // TODO.Translate L"Take cover", + L"Move to", // TODO.Translate L"All: Attack", L"All: Hold Position", L"All: Retreat", diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 8aceb31f..003cb6b6 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -2798,6 +2798,7 @@ STR16 pMilitiaControlMenuStrings[] = L"Get down", L"Crouch", L"Take cover", + L"Move to", L"All: Attack", L"All: Hold Position", L"All: Retreat", diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 80c4f01b..94d16e4e 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -2806,6 +2806,7 @@ STR16 pMilitiaControlMenuStrings[] = L"Couchez-vous", // retreat militia L"Accroupi", L"À couvert !", + L"Move to", // TODO.Translate L"Tous : Attaquez", L"Tous : Tenez la position", L"Tous : Retraite", diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 869e06eb..6c8a5e92 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -2827,6 +2827,7 @@ STR16 pMilitiaControlMenuStrings[] = L"Auf den Boden", // retreat militia L"Ducken", L"In Deckung gehen", + L"Move to", // TODO.Translate L"Alle: Angreifen", L"Alle: Position halten", L"Alle: Rückzug", diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 69aaac55..89f405e1 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -2792,6 +2792,7 @@ STR16 pMilitiaControlMenuStrings[] = L"Get down", // retreat militia L"Crouch", // TODO.Translate L"Take cover", + L"Move to", // TODO.Translate L"All: Attack", L"All: Hold Position", L"All: Retreat", diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index f73036a9..389148cb 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -2804,6 +2804,7 @@ STR16 pMilitiaControlMenuStrings[] = L"Padnij", // retreat militia L"Crouch", // TODO.Translate L"Kryj się", + L"Move to", // TODO.Translate L"Wszyscy: Atakujcie", L"Wszyscy: Utrzymajcie pozycje", L"Wszyscy: Wycofajcie się", diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 6fc051e0..ab9732ff 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -2798,6 +2798,7 @@ STR16 pMilitiaControlMenuStrings[] = L"Ложись", L"Присесть", L"В укрытие", + L"Двигаться в точку", L"Все в атаку", L"Всем держать оборону", L"Всем отступать",