diff --git a/SaveLoadGame.cpp b/SaveLoadGame.cpp index a434be2d..02d890b7 100644 --- a/SaveLoadGame.cpp +++ b/SaveLoadGame.cpp @@ -2038,12 +2038,14 @@ BOOLEAN SOLDIERTYPE::Load(HWFILE hFile) numBytesRead = ReadFieldByField(hFile, &this->usLastRandomAnim, sizeof(usLastRandomAnim), sizeof(INT16), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->usAnimSurface, sizeof(usAnimSurface), sizeof(UINT16), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->sZLevel, sizeof(sZLevel), sizeof(UINT16), numBytesRead); + numBytesRead = ReadFieldByField(hFile, &this->sWalkToAttackMovementMode, sizeof(sWalkToAttackMovementMode), sizeof(INT16), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->sWalkToAttackGridNo, sizeof(sWalkToAttackGridNo), sizeof(INT32), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->sWalkToAttackWalkToCost, sizeof(sWalkToAttackWalkToCost), sizeof(INT16), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->sLocatorOffX, sizeof(sLocatorOffX), sizeof(INT16), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->sLocatorOffY, sizeof(sLocatorOffY), sizeof(INT16), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->pForcedShade, sizeof(pForcedShade), 4, numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->bDisplayDamageCount, sizeof(bDisplayDamageCount), sizeof(INT8), numBytesRead); + numBytesRead = ReadFieldByField(hFile, &this->sWalkToAttackEndDirection, sizeof(sWalkToAttackEndDirection), sizeof(UINT8), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->sDamage, sizeof(sDamage), sizeof(INT16), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->sDamageX, sizeof(sDamageX), sizeof(INT16), numBytesRead); numBytesRead = ReadFieldByField(hFile, &this->sDamageY, sizeof(sDamageY), sizeof(INT16), numBytesRead); diff --git a/Tactical/Handle Items.cpp b/Tactical/Handle Items.cpp index 19482fa5..b14f3f1f 100644 --- a/Tactical/Handle Items.cpp +++ b/Tactical/Handle Items.cpp @@ -1049,19 +1049,16 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa if ( EnoughPoints( pSoldier, sAPCost, 0, fFromUI ) ) { + // OK, set UI + SetUIBusy(pSoldier->ubID); + // CHECK IF WE ARE AT THIS GRIDNO NOW if ( pSoldier->sGridNo != sActionGridNo ) { // SEND PENDING ACTION pSoldier->aiData.ubPendingAction = MERC_REPAIR; - pSoldier->aiData.sPendingActionData2 = sAdjustedGridNo; - - if ( fVehicle ) - { - pSoldier->aiData.sPendingActionData2 = sVehicleGridNo; - } - - pSoldier->aiData.bPendingActionData3 = ubDirection; + pSoldier->aiData.sPendingActionData2 = fVehicle ? sVehicleGridNo : sAdjustedGridNo; + pSoldier->aiData.bPendingActionData3 = ubDirection; pSoldier->aiData.ubPendingActionAnimCount = 0; // WALK UP TO DEST FIRST @@ -1069,12 +1066,9 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa } else { - pSoldier->EVENT_SoldierBeginRepair( sAdjustedGridNo, ubDirection ); + pSoldier->EVENT_SoldierBeginRepair(fVehicle ? sVehicleGridNo : sAdjustedGridNo, ubDirection ); } - // OK, set UI - SetUIBusy( pSoldier->ubID ); - if ( fFromUI ) { guiPendingOverrideEvent = A_CHANGE_TO_MOVE; @@ -1131,8 +1125,6 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa { // SEND PENDING ACTION pSoldier->aiData.ubPendingAction = MERC_FUEL_VEHICLE; - pSoldier->aiData.sPendingActionData2 = sAdjustedGridNo; - pSoldier->aiData.sPendingActionData2 = sVehicleGridNo; pSoldier->aiData.bPendingActionData3 = ubDirection; pSoldier->aiData.ubPendingActionAnimCount = 0; @@ -1142,7 +1134,7 @@ INT32 HandleItem( SOLDIERTYPE *pSoldier, INT32 sGridNo, INT8 bLevel, UINT16 usHa } else { - pSoldier->EVENT_SoldierBeginRefuel( sAdjustedGridNo, ubDirection ); + pSoldier->EVENT_SoldierBeginRefuel(sVehicleGridNo, ubDirection ); } // OK, set UI @@ -10267,6 +10259,16 @@ void TakePhoto(SOLDIERTYPE* pSoldier, INT32 sGridNo, INT8 bLevel ) INT16 sBaseX, sBaseY; ConvertGridNoToXY( sGridNo, &sBaseX, &sBaseY ); + UINT8 ubDirection = GetDirectionFromGridNo(sGridNo, pSoldier); + + // CHANGE DIRECTION AND GOTO ANIMATION NOW + if (pSoldier->ubDirection != ubDirection) + { + pSoldier->flags.uiStatusFlags |= SOLDIER_LOOK_NEXT_TURNSOLDIER;//shadooow: fix for vision not updating + pSoldier->EVENT_SetSoldierDesiredDirection(ubDirection); + pSoldier->EVENT_SetSoldierDirection(ubDirection); + } + int radius = 3; for ( int x = -radius; x < radius; ++x ) diff --git a/Tactical/Handle UI.cpp b/Tactical/Handle UI.cpp index ef10f5b3..bcece36f 100644 --- a/Tactical/Handle UI.cpp +++ b/Tactical/Handle UI.cpp @@ -2991,6 +2991,7 @@ UINT32 UIHandleCAMercShoot( UI_EVENT *pUIEvent ) if ( ( pTSoldier->bTeam == gbPlayerNum || pTSoldier->bTeam == MILITIA_TEAM ) && Item[ pSoldier->inv[ HANDPOS ].usItem ].usItemClass != IC_MEDKIT && !Item[pSoldier->inv[ HANDPOS ].usItem].gascan + && !Item[pSoldier->inv[HANDPOS].usItem].toolkit && !ItemCanBeAppliedToOthers( pSoldier->inv[ HANDPOS ].usItem ) && gTacticalStatus.ubLastRequesterTargetID != pTSoldier->ubProfile && ( pTSoldier->ubID != pSoldier->ubID ) ) @@ -4304,10 +4305,12 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) { sAPCost += UIPlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints ); } + + //sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } else if ( uiFlags == MOVEUI_TARGET_WIREFENCE ) { - sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, NULL, FALSE, TRUE ); + sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, TRUE, FALSE ); if ( sActionGridNo == -1 ) { sAPCost = 0; @@ -4323,11 +4326,13 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) gfUIHandleShowMoveGrid = TRUE; gsUIHandleShowMoveGridLocation = sActionGridNo; } + + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } } else if ( uiFlags == MOVEUI_TARGET_JAR ) { - sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, NULL, FALSE, TRUE ); + sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, TRUE, FALSE ); if ( sActionGridNo == -1 ) { sActionGridNo = usMapPos; @@ -4342,6 +4347,8 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) gfUIHandleShowMoveGrid = TRUE; gsUIHandleShowMoveGridLocation = sActionGridNo; } + + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } else if ( uiFlags == MOVEUI_TARGET_CAN ) { @@ -4354,7 +4361,8 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) sActionGridNo = FindAdjacentGridEx( pSoldier, sIntTileGridNo, &ubDirection, NULL, FALSE, TRUE ); if ( sActionGridNo != -1 ) { - sAPCost = APBPConstants[AP_ATTACH_CAN]; + sAPCost = GetAPsToUseCan(pSoldier, sActionGridNo); + sAPCost += UIPlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints); if ( sActionGridNo != pSoldier->sGridNo ) @@ -4362,6 +4370,8 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) gfUIHandleShowMoveGrid = TRUE; gsUIHandleShowMoveGridLocation = sActionGridNo; } + + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } } else @@ -4373,7 +4383,7 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) else if ( uiFlags == MOVEUI_TARGET_REPAIR ) { // For repair, check if we are over a vehicle, then get gridnot to edge of that vehicle! - if ( IsRepairableStructAtGridNo( usMapPos, &ubMercID ) == 2 ) + if ( IsRepairableStructAtGridNo( usMapPos, &ubMercID ) == 2) { INT32 sNewGridNo; UINT8 ubDirection; @@ -4386,7 +4396,8 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) } } - sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, NULL, FALSE, TRUE ); + //shadooow: we need better function for this, it has odd results with vehicles as they occupy 6 tiles now + sActionGridNo = FindAdjacentGridEx(pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, TRUE, FALSE); if ( sActionGridNo == -1 ) { sActionGridNo = usMapPos; @@ -4401,11 +4412,14 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) gfUIHandleShowMoveGrid = TRUE; gsUIHandleShowMoveGridLocation = sActionGridNo; } + + //shadooow: this action is a total mess and needs to look at closely before adding turning cost into action cost prediction + //sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } else if ( uiFlags == MOVEUI_TARGET_REFUEL ) { // For repair, check if we are over a vehicle, then get gridnot to edge of that vehicle! - if ( IsRefuelableStructAtGridNo( usMapPos, &ubMercID ) == 2 ) + if ( IsRefuelableStructAtGridNo( usMapPos, &ubMercID ) ) { INT32 sNewGridNo; UINT8 ubDirection; @@ -4418,7 +4432,8 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) } } - sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, NULL, FALSE, TRUE ); + //shadooow: we need better function for this, it has odd results with vehicles as they occupy 6 tiles now + sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, TRUE, FALSE ); if ( sActionGridNo == -1 ) { sActionGridNo = usMapPos; @@ -4433,10 +4448,13 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) gfUIHandleShowMoveGrid = TRUE; gsUIHandleShowMoveGridLocation = sActionGridNo; } + + //shadooow: this action is a total mess and needs to look at closely before adding turning cost into action cost prediction + //sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } else if ( uiFlags == MOVEUI_TARGET_FORTIFICATION ) { - sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, NULL, FALSE, TRUE ); + sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, FALSE, FALSE ); if ( sActionGridNo == -1 ) { sActionGridNo = usMapPos; @@ -4450,46 +4468,67 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) gfUIHandleShowMoveGrid = TRUE; gsUIHandleShowMoveGridLocation = sActionGridNo; } + + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } else if ( uiFlags == MOVEUI_TARGET_HANDCUFF ) { - sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, NULL, FALSE, TRUE ); - if ( sActionGridNo == -1 ) + sActionGridNo = FindAdjacentGridEx(pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, TRUE, FALSE); + + if (!TileIsOutOfBounds(sActionGridNo)) { - sActionGridNo = usMapPos; + sAPCost = GetAPsToHandcuff(pSoldier, sAdjustedGridNo); + + if (sActionGridNo != pSoldier->sGridNo) + { + sAPCost += UIPlotPath(pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints); + gfUIHandleShowMoveGrid = TRUE; + gsUIHandleShowMoveGridLocation = sActionGridNo; + } + + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, usMapPos, gfPlotPathEndDirection); } + } + else if (uiFlags == MOVEUI_TARGET_CAMERA) + { + sActionGridNo = FindAdjacentGridEx(pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, TRUE, FALSE); - sAPCost = GetAPsToHandcuff( pSoldier, sActionGridNo ); - - sAPCost += UIPlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints); - - if ( sActionGridNo != pSoldier->sGridNo ) + if (!TileIsOutOfBounds(sActionGridNo)) { - gfUIHandleShowMoveGrid = TRUE; - gsUIHandleShowMoveGridLocation = sActionGridNo; + sAPCost = APBPConstants[AP_CAMERA]; + + if (sActionGridNo != pSoldier->sGridNo) + { + sAPCost += UIPlotPath(pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints); + gfUIHandleShowMoveGrid = TRUE; + gsUIHandleShowMoveGridLocation = sActionGridNo; + } + + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } } else if ( uiFlags == MOVEUI_TARGET_APPLYITEM ) { - sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, NULL, FALSE, TRUE ); - if ( sActionGridNo == -1 ) + sActionGridNo = FindAdjacentGridEx(pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, TRUE, FALSE); + + if (!TileIsOutOfBounds(sActionGridNo)) { - sActionGridNo = usMapPos; - } + sAPCost = GetAPsToApplyItem(pSoldier, sActionGridNo); - sAPCost = GetAPsToApplyItem( pSoldier, sActionGridNo ); + sAPCost += UIPlotPath(pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints); - sAPCost += UIPlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints); + if (sActionGridNo != pSoldier->sGridNo) + { + gfUIHandleShowMoveGrid = TRUE; + gsUIHandleShowMoveGridLocation = sActionGridNo; + } - if ( sActionGridNo != pSoldier->sGridNo ) - { - gfUIHandleShowMoveGrid = TRUE; - gsUIHandleShowMoveGridLocation = sActionGridNo; + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, usMapPos, gfPlotPathEndDirection); } } else if ( uiFlags == MOVEUI_TARGET_INTERACTIVEACTION ) { - sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, NULL, FALSE, TRUE ); + sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, FALSE, TRUE ); if ( sActionGridNo == -1 ) { sActionGridNo = usMapPos; @@ -4506,6 +4545,9 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) gfUIHandleShowMoveGrid = TRUE; gsUIHandleShowMoveGridLocation = sActionGridNo; } + + //shadooow: merc doesn't turn during this action right now, but once that change uncomment line below + //sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } else if ( uiFlags == MOVEUI_TARGET_MERCS ) { @@ -4544,7 +4586,9 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) gfUIHandleShowMoveGrid = TRUE; gsUIHandleShowMoveGridLocation = sActionGridNo; } - sAPCost += MinAPsToAttack(pSoldier, sAdjustedGridNo, TRUE, pSoldier->aiData.bShownAimTime, 0); + sAPCost += MinAPsToPunch(pSoldier, sAdjustedGridNo); + + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } } else if ( uiFlags == MOVEUI_TARGET_STEAL ) @@ -4586,6 +4630,8 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) gfUIHandleShowMoveGrid = TRUE; gsUIHandleShowMoveGridLocation = sActionGridNo; } + + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } } else if ( uiFlags == MOVEUI_TARGET_BOMB ) @@ -4605,22 +4651,18 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) { sActionGridNo = FindAdjacentGridEx( pSoldier, MercPtrs[ gusUIFullTargetID ]->sGridNo, &ubDirection, &sAdjustedGridNo, TRUE, FALSE ); - // Try again at another gridno... - if ( sActionGridNo == -1 ) + if (!TileIsOutOfBounds(sActionGridNo)) { - sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, TRUE, FALSE ); - if ( sActionGridNo == -1 ) + sAPCost += GetAPsToBeginFirstAid(pSoldier); + sAPCost += UIPlotPath(pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints); + if (sActionGridNo != pSoldier->sGridNo) { - sActionGridNo = sAdjustedGridNo; + gfUIHandleShowMoveGrid = TRUE; + gsUIHandleShowMoveGridLocation = sActionGridNo; } - } - sAPCost += GetAPsToBeginFirstAid( pSoldier ); - sAPCost += UIPlotPath( pSoldier, sActionGridNo, NO_COPYROUTE, fPlot, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints); - if ( sActionGridNo != pSoldier->sGridNo ) - { - gfUIHandleShowMoveGrid = TRUE; - gsUIHandleShowMoveGridLocation = sActionGridNo; + + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } } } @@ -4656,7 +4698,7 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) } else if ( uiFlags == MOVEUI_TARGET_BLOODBAG ) { - sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, NULL, FALSE, TRUE ); + sActionGridNo = FindAdjacentGridEx( pSoldier, usMapPos, &ubDirection, &sAdjustedGridNo, FALSE, TRUE ); if ( sActionGridNo == -1 ) { sActionGridNo = usMapPos; @@ -4671,6 +4713,8 @@ INT8 DrawUIMovementPath( SOLDIERTYPE *pSoldier, INT32 usMapPos, UINT32 uiFlags ) gfUIHandleShowMoveGrid = TRUE; gsUIHandleShowMoveGridLocation = sActionGridNo; } + + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, gfPlotPathEndDirection); } else { diff --git a/Tactical/Handle UI.h b/Tactical/Handle UI.h index 73002afe..8819f486 100644 --- a/Tactical/Handle UI.h +++ b/Tactical/Handle UI.h @@ -34,6 +34,7 @@ #define MOVEUI_TARGET_APPLYITEM 15 #define MOVEUI_TARGET_INTERACTIVEACTION 16 #define MOVEUI_TARGET_BLOODBAG 17 +#define MOVEUI_TARGET_CAMERA 18 #define MOVEUI_RETURN_ON_TARGET_MERC 1 diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index 3a713ee4..1aa146a6 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -5665,6 +5665,7 @@ INT32 FindAdjacentGridEx( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 *pubDirect if ( ( NewOKDestinationAndDirection( pSoldier, sSpot, ubDir, TRUE, pSoldier->pathing.bLevel ) > 0 ) && ( ( sDistance = PlotPath( pSoldier, sSpot, NO_COPYROUTE, NO_PLOT, TEMPORARY, (INT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints ) ) > 0 ) ) { + if (ubDir != gfPlotPathEndDirection) sDistance += 4;//shadooow: small hack to return adjacent GridNo with lowest AP cost if (sDistance < sClosest || sClosest == -1) { sClosest = sDistance; @@ -5745,6 +5746,7 @@ INT32 FindAdjacentGridEx( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 *pubDirect if ((NewOKDestinationAndDirection(pSoldier, sSpot, ubDir, TRUE, pSoldier->pathing.bLevel) > 0) && ((sDistance = PlotPath(pSoldier, sSpot, NO_COPYROUTE, NO_PLOT, TEMPORARY, (INT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints)) > 0)) { + if (ubDir != gfPlotPathEndDirection) sDistance += 4;//shadooow: small hack to return adjacent GridNo with lowest AP cost if (sDistance < sClosest || sClosest == -1) { sClosest = sDistance; diff --git a/Tactical/PATHAI.H b/Tactical/PATHAI.H index b904a323..2f0f949c 100644 --- a/Tactical/PATHAI.H +++ b/Tactical/PATHAI.H @@ -233,6 +233,7 @@ extern BOOLEAN gfNPCCircularDistLimit; extern BOOLEAN gfEstimatePath; extern BOOLEAN gfPathAroundObstacles; extern UINT8 gubGlobalPathFlags; +extern UINT8 gfPlotPathEndDirection; // Ian's terrain values for travelling speed/pathing purposes // Fixed by CJC March 4, 1998. Please do not change these unless familiar diff --git a/Tactical/PATHAI.cpp b/Tactical/PATHAI.cpp index 7f95ee4d..b798f49e 100644 --- a/Tactical/PATHAI.cpp +++ b/Tactical/PATHAI.cpp @@ -91,6 +91,7 @@ UINT8 gubBuildingInfoToSet; INT32 iMaxSkipListLevel = MAX_SKIPLIST_LEVEL; INT32 iMaxTrailTree = MAX_TRAIL_TREE; INT32 iMaxPathQ = MAX_PATHQ; +UINT8 gfPlotPathEndDirection; extern BOOLEAN gfGeneratingMapEdgepoints; @@ -4566,7 +4567,7 @@ INT32 PlotPath( SOLDIERTYPE *pSold, INT32 sDestGridNo, INT8 bCopyRoute, INT8 bPl sOldGrid = sTempGrid; sTempGrid = NewGridNo(sTempGrid, DirectionInc( (UINT8)guiPathingData[iCnt])); - + gfPlotPathEndDirection = GetDirectionToGridNoFromGridNo(sOldGrid, sTempGrid); // Get switch value... sSwitchValue = gubWorldMovementCosts[ sTempGrid ][ (INT8)guiPathingData[iCnt] ][ pSold->pathing.bLevel]; diff --git a/Tactical/Points.cpp b/Tactical/Points.cpp index f5966476..a1efce68 100644 --- a/Tactical/Points.cpp +++ b/Tactical/Points.cpp @@ -1949,15 +1949,16 @@ INT16 CalcTotalAPsToAttack( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTur else { // OK, in order to avoid path calculations here all the time... save and check if it's changed! - if (pSoldier->sWalkToAttackGridNo == sActionGridNo) + if (pSoldier->sWalkToAttackGridNo == sActionGridNo && pSoldier->sWalkToAttackMovementMode == (UINT8)pSoldier->usUIMovementMode) { sAPCost += (UINT8)(pSoldier->sWalkToAttackWalkToCost); } else { // Save for next time... - pSoldier->sWalkToAttackWalkToCost = PlotPath(pSoldier, sActionGridNo, NO_COPYROUTE, NO_PLOT, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints); - + pSoldier->sWalkToAttackMovementMode = (UINT8)pSoldier->usUIMovementMode; + pSoldier->sWalkToAttackWalkToCost = PlotPath(pSoldier, sActionGridNo, NO_COPYROUTE, NO_PLOT, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints); + pSoldier->sWalkToAttackEndDirection = gfPlotPathEndDirection; if (pSoldier->sWalkToAttackWalkToCost == 0) { return(99); @@ -1977,7 +1978,11 @@ INT16 CalcTotalAPsToAttack( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTur } // Add points to attack - sAPCost += MinAPsToPunch(pSoldier, sAdjustedGridNo, ubAddTurningCost); + sAPCost += MinAPsToPunch(pSoldier, sAdjustedGridNo); + + // Add points to turn around if needed + sAPCost += CalculateActionTurningCost(pSoldier, sActionGridNo, sAdjustedGridNo, pSoldier->sWalkToAttackEndDirection); + // Add aim time... sAPCost += (bAimTime*APBPConstants[AP_CLICK_AIM]); @@ -2015,32 +2020,10 @@ INT16 MinAPsToAttack(SOLDIERTYPE *pSoldier, INT32 sGridno, UINT8 ubAddTurningCos // LOOK IN BUDDY'S HAND TO DETERMINE WHAT TO DO HERE uiItemClass = Item[ undbarItem ].usItemClass; } -#if 0//dnl ch73 290913 - // bare fist or with brass knuckles - if ( !(pSoldier->inv[HANDPOS].exists()) || Item[pSoldier->inv[HANDPOS].usItem].brassknuckles ) - { - sAPCost = MinAPsToPunch( pSoldier, sGridno, ubAddTurningCost ); - } - else if ( uiItemClass & ( IC_PUNCH | IC_BLADE | IC_GUN | IC_LAUNCHER | IC_TENTACLES | IC_THROWING_KNIFE ) ) - { - sAPCost = MinAPsToShootOrStab( pSoldier, sGridno, bAimTime, ubAddTurningCost, ubForceRaiseGunCost ); - } - // thrown items - else if ( uiItemClass & ( IC_GRENADE | IC_THROWN ) ) - { - sAPCost = MinAPsToThrow( pSoldier, sGridno, ubAddTurningCost ); - } - // for exceptions - else - sAPCost = MinAPsToPunch( pSoldier, sGridno, ubAddTurningCost ); -#else if(uiItemClass & (IC_GUN | IC_LAUNCHER | IC_THROWING_KNIFE)) sAPCost = MinAPsToShootOrStab(pSoldier, sGridno, bAimTime, ubAddTurningCost, ubForceRaiseGunCost); else if(uiItemClass & (IC_GRENADE | IC_THROWN)) sAPCost = MinAPsToThrow(pSoldier, sGridno, ubAddTurningCost); - else - sAPCost = MinAPsToPunch(pSoldier, sGridno, ubAddTurningCost); -#endif return sAPCost; } @@ -2285,6 +2268,25 @@ void GetAPChargeForShootOrStabWRTGunRaises( SOLDIERTYPE *pSoldier, INT32 sGridNo (*pfChargeRaise ) = fAddingRaiseGunCost; } +UINT16 CalculateActionTurningCost(SOLDIERTYPE *pSoldier, INT32 sActionGridNo, INT32 sAdjustedGridNo, UINT8 ubDirection) +{ + UINT16 sAPCost = 0; + // if soldier is already at sActionGridNo, use current direction instead of calculated one + if (pSoldier->sGridNo == sActionGridNo) ubDirection = pSoldier->ubDirection; + + // Is it the same as direction we need? + if (ubDirection != GetDirectionToGridNoFromGridNo(sActionGridNo, sAdjustedGridNo)) + { + OBJECTTYPE *pObjUsed = pSoldier->GetUsedWeapon(&pSoldier->inv[HANDPOS]); + UINT16 usItem = pObjUsed->usItem; + if (gAnimControl[pSoldier->usAnimState].ubEndHeight == ANIM_PRONE) + sAPCost += CalculateTurningCost(pSoldier, usItem, TRUE, ANIM_CROUCH); + else + sAPCost += CalculateTurningCost(pSoldier, usItem, TRUE); + } + return sAPCost; +} + UINT16 CalculateTurningCost(SOLDIERTYPE *pSoldier, UINT16 usItem, BOOLEAN fAddingTurningCost, INT8 bDesiredHeight)//dnl ch72 190913 { UINT16 usTrueAnimState, usTurningCost = 0; @@ -2374,8 +2376,6 @@ INT16 MinAPsToShootOrStab(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 bAimTime, // Flugente: we need a second item in case we are using an underbarrel weapon. Not all checks should apply for that one, as aiming is still done with the main weapon usUBItem = pSoldier->GetUsedWeaponNumber(&pSoldier->inv[HANDPOS]); } - if(Item[usUBItem].usItemClass == IC_PUNCH || Item[usUBItem].usItemClass == IC_BLADE || Item[usUBItem].usItemClass == IC_TENTACLES)//dnl ch73 021013 punch and stub generally use identical logic so put all necessary stuff to MinAPsToPunch - return(MinAPsToPunch(pSoldier, sGridNo, ubAddTurningCost)); OBJECTTYPE* pObjUsed = pSoldier->GetUsedWeapon( &(pSoldier->inv[HANDPOS]) ); @@ -2639,7 +2639,7 @@ INT16 MinAPsToShootOrStab(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 bAimTime, return bAPCost; } -INT16 MinAPsToPunch(SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTurningCost)//dnl ch73 290913 +INT16 MinAPsToPunch(SOLDIERTYPE *pSoldier, INT32 sGridNo) { INT16 bAPCost = APBPConstants[AP_MIN_AIM_ATTACK]; @@ -2670,20 +2670,7 @@ INT16 MinAPsToPunch(SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTurningCost bAPCost += GetAPsToChangeStance(pSoldier, ANIM_STAND); } - if( ubAddTurningCost ) - { - // ATE: Use standing turn cost.... - UINT8 ubDirection = GetDirectionFromGridNo(sGridNo, pSoldier); - // Is it the same as he's facing? - if(ubDirection != pSoldier->ubDirection) - { - if(gAnimControl[pSoldier->usAnimState].ubEndHeight == ANIM_PRONE) - bAPCost += CalculateTurningCost(pSoldier, usItem, TRUE, ANIM_CROUCH); - else - bAPCost += CalculateTurningCost(pSoldier, usItem, TRUE); - } - } } return(bAPCost); @@ -4029,47 +4016,17 @@ INT16 GetBPsToStealItem( SOLDIERTYPE *pSoldier ) INT16 GetAPsToUseJar( SOLDIERTYPE *pSoldier, INT32 usMapPos ) { - INT16 sAPCost = 0; - - sAPCost = PlotPath( pSoldier, usMapPos, NO_COPYROUTE, NO_PLOT, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints ); - - // If point cost is zero, return 0 - if ( sAPCost != 0 ) - { - // ADD APS TO PICKUP - sAPCost += APBPConstants[AP_TAKE_BLOOD]; - } - - return sAPCost; - + return GetAPsToChangeStance(pSoldier, ANIM_CROUCH) + APBPConstants[AP_TAKE_BLOOD]; } INT16 GetAPsToUseCan( SOLDIERTYPE *pSoldier, INT32 usMapPos ) { - INT16 sAPCost = 0; - - sAPCost = PlotPath( pSoldier, usMapPos, NO_COPYROUTE, NO_PLOT, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints ); - - // If point cost is zero, return 0 - if ( sAPCost != 0 ) - { - // ADD APS TO PICKUP - sAPCost += APBPConstants[AP_ATTACH_CAN]; - } - - return sAPCost; - + return GetAPsToChangeStance(pSoldier, ANIM_CROUCH) + APBPConstants[AP_ATTACH_CAN]; } INT16 GetAPsToHandcuff( SOLDIERTYPE *pSoldier, INT32 usMapPos ) { - INT16 sAPCost = 0; - - sAPCost = PlotPath( pSoldier, usMapPos, NO_COPYROUTE, NO_PLOT, TEMPORARY, (UINT16)pSoldier->usUIMovementMode, NOT_STEALTH, FORWARD, pSoldier->bActionPoints ); - - sAPCost += APBPConstants[AP_HANDCUFF]; - - return sAPCost; + return GetAPsToChangeStance(pSoldier, ANIM_CROUCH) + APBPConstants[AP_HANDCUFF]; } INT16 GetAPsToApplyItem( SOLDIERTYPE *pSoldier, INT32 usMapPos ) diff --git a/Tactical/Points.h b/Tactical/Points.h index 52ccd3ab..0c79078d 100644 --- a/Tactical/Points.h +++ b/Tactical/Points.h @@ -295,6 +295,7 @@ INT16 MinAPsToAttack(SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTurningCos INT16 MinPtsToMove(SOLDIERTYPE *pSoldier); INT8 MinAPsToStartMovement( SOLDIERTYPE * pSoldier, UINT16 usMovementMode ); INT8 PtsToMoveDirection(SOLDIERTYPE *pSoldier, INT8 bDirection ); +UINT16 CalculateActionTurningCost(SOLDIERTYPE *pSoldier, INT32 sActionGridNo, INT32 sAdjustedGridNo, UINT8 ubDirection); UINT16 CalculateTurningCost(SOLDIERTYPE *pSoldier, UINT16 usItem, BOOLEAN fAddingTurningCost, INT8 bDesiredHeight=0);//dnl ch72 190913 UINT16 CalculateRaiseGunCost(SOLDIERTYPE *pSoldier, BOOLEAN fAddingRaiseGunCost, INT32 iTargetGridNum, INT16 bAimTime ); INT16 MinAPsToShootOrStab(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 bAimTime, UINT8 ubAddTurningCost, UINT8 ubForceRaiseGunCost = 0 ); @@ -303,7 +304,7 @@ void DeductAmmo( SOLDIERTYPE *pSoldier, INT8 bInvPos ); void DeductAmmo( SOLDIERTYPE *pSoldier, OBJECTTYPE* pObj ); UINT16 GetAPsToPickupItem( SOLDIERTYPE *pSoldier, INT32 usMapPos ); -INT16 MinAPsToPunch(SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTurningCost ); +INT16 MinAPsToPunch(SOLDIERTYPE *pSoldier, INT32 sGridNo); INT16 ApsToPunch( SOLDIERTYPE *pSoldier ); // SANDRO added this INT16 CalcTotalAPsToAttack( SOLDIERTYPE *pSoldier, INT32 sGridNo, UINT8 ubAddTurningCost, INT16 bAimTime ); INT16 CalcAPsToBurst( INT16 bBaseActionPoints, OBJECTTYPE * pObj, SOLDIERTYPE* pSoldier ); diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 8c72edbc..77b2b798 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -4116,6 +4116,21 @@ BOOLEAN SOLDIERTYPE::EVENT_InitNewSoldierAnim( UINT16 usNewState, UINT16 usStart DeductPoints( this, APBPConstants[AP_USE_REMOTE], 0, AFTERACTION_INTERRUPT ); break; + case REFUEL_VEHICLE: + + DeductPoints(this, APBPConstants[AP_REFUEL_VEHICLE], 0, AFTERACTION_INTERRUPT); + break; + + case GOTO_REPAIRMAN: + + DeductPoints(this, APBPConstants[AP_START_REPAIR], 0, AFTERACTION_INTERRUPT); + break; + + case TAKE_BLOOD_FROM_CORPSE: + + DeductPoints(this, APBPConstants[AP_TAKE_BLOOD], 0, AFTERACTION_INTERRUPT); + break; + //case PUNCH: //Deduct points for punching @@ -7723,7 +7738,7 @@ void EVENT_InternalSetSoldierDesiredDirection( SOLDIERTYPE *pSoldier, UINT8 ubNe if ( pSoldier->pathing.bDesiredDirection != pSoldier->ubDirection ) { - if ( (gAnimControl[usAnimState].uiFlags & (ANIM_BREATH | ANIM_OK_CHARGE_AP_FOR_TURN | ANIM_FIREREADY/* | ANIM_TURNING*/) || usForceAnimState != INVALID_ANIMATION) && !fInitalMove && !pSoldier->flags.fDontChargeTurningAPs )//dnl ch70 160913 //dnl ch73 290913 in some bright future when UIPlotPath will calculate turning cost then ANIM_TURNING should be turn on as this solve many problems when APs was not deducted during turnoff + if ( (gAnimControl[usAnimState].uiFlags & (ANIM_BREATH | ANIM_OK_CHARGE_AP_FOR_TURN | ANIM_FIREREADY | ANIM_TURNING) || usForceAnimState != INVALID_ANIMATION) && !fInitalMove && !pSoldier->flags.fDontChargeTurningAPs ) { // SANDRO: hey, we have a function for this around, why not to use it, hm? // silversurfer: we better don't do that. GetAPsToLook( ... ) will charge APs for getting to crouched/prone position @@ -22338,15 +22353,16 @@ void SOLDIERTYPE::EVENT_SoldierBeginRepair( INT32 sGridNo, UINT8 ubDirection ) this->EVENT_SetSoldierDirection(ubDirection); } - //BOOLEAN CutWireFence( INT16 sGridNo ) - - // SET TARGET GRIDNO - //this->sTargetGridNo = sGridNo; - // CHANGE TO ANIMATION this->EVENT_InitNewSoldierAnim( GOTO_REPAIRMAN, 0, FALSE ); // SET BUDDY'S ASSIGNMENT TO REPAIR... - + if (gTacticalStatus.uiFlags & INCOMBAT) + { + //this doesn't work during combat, so return + UnSetUIBusy(this->ubID); + return; + } + // Are we a SAM site? ( 3 == SAM ) if ( bRepairItem == 3 ) { @@ -22356,6 +22372,10 @@ void SOLDIERTYPE::EVENT_SoldierBeginRepair( INT32 sGridNo, UINT8 ubDirection ) { SetSoldierAssignment( this, REPAIR, FALSE, FALSE, ubID ); } + else if (bRepairItem == 1) // ( 1 == ROBOT ) + { + SetSoldierAssignment(this, REPAIR, FALSE, TRUE, -1); + } } } @@ -22378,11 +22398,6 @@ void SOLDIERTYPE::EVENT_SoldierBeginRefuel( INT32 sGridNo, UINT8 ubDirection ) this->EVENT_SetSoldierDirection(ubDirection); } - //BOOLEAN CutWireFence( INT16 sGridNo ) - - // SET TARGET GRIDNO - //this->sTargetGridNo = sGridNo; - // CHANGE TO ANIMATION this->EVENT_InitNewSoldierAnim( REFUEL_VEHICLE, 0, FALSE ); // SET BUDDY'S ASSIGNMENT TO REPAIR... @@ -22577,6 +22592,17 @@ void SOLDIERTYPE::EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection success = TRUE; } + // CHANGE DIRECTION AND GOTO ANIMATION NOW + if (this->ubDirection != ubDirection) + { + this->flags.uiStatusFlags |= SOLDIER_LOOK_NEXT_TURNSOLDIER;//shadooow: fix for vision not updating + this->EVENT_SetSoldierDesiredDirection(ubDirection); + this->EVENT_SetSoldierDirection(ubDirection); + } + + // CHANGE TO ANIMATION + this->EVENT_InitNewSoldierAnim(RELOAD_ROBOT, 0, FALSE); + if ( success ) { // arrest this guy @@ -22627,17 +22653,6 @@ void SOLDIERTYPE::EVENT_SoldierHandcuffPerson( INT32 sGridNo, UINT8 ubDirection } } - // CHANGE DIRECTION AND GOTO ANIMATION NOW - if (this->ubDirection != ubDirection) - { - this->flags.uiStatusFlags |= SOLDIER_LOOK_NEXT_TURNSOLDIER;//shadooow: fix for vision not updating - this->EVENT_SetSoldierDesiredDirection(ubDirection); - this->EVENT_SetSoldierDirection(ubDirection); - } - - // CHANGE TO ANIMATION - this->EVENT_InitNewSoldierAnim( RELOAD_ROBOT, 0, FALSE ); - // we gain a bit of experience... StatChange( this, STRAMT, 2, TRUE ); StatChange( this, DEXTAMT, 3, TRUE ); diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index 1c19fcff..7419fd27 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -1288,6 +1288,7 @@ public: UINT16 usAnimSurface; UINT16 sZLevel; + INT16 sWalkToAttackMovementMode;//shadooow: stores movement mode used in last pathing INT32 sWalkToAttackGridNo; INT16 sWalkToAttackWalkToCost; @@ -1297,6 +1298,7 @@ public: UINT16 *pForcedShade; INT8 bDisplayDamageCount; + UINT8 sWalkToAttackEndDirection;//shadooow: stores direction of merc at the destination grid INT16 sDamage; INT16 sDamageX; INT16 sDamageY; diff --git a/Tactical/Structure Wrap.cpp b/Tactical/Structure Wrap.cpp index c487c992..fde21cd5 100644 --- a/Tactical/Structure Wrap.cpp +++ b/Tactical/Structure Wrap.cpp @@ -536,7 +536,11 @@ BOOLEAN IsRepairableStructAtGridNo( INT32 sGridNo, UINT8 *pubID ) if ( ubMerc != NOBODY ) { - if ( MercPtrs[ ubMerc ]->flags.uiStatusFlags & SOLDIER_VEHICLE ) + if (MercPtrs[ubMerc]->flags.uiStatusFlags & SOLDIER_ROBOT) + { + return( 1 ); + } + else if ( MercPtrs[ ubMerc ]->flags.uiStatusFlags & SOLDIER_VEHICLE ) { return( 2 ); } diff --git a/Tactical/UI Cursors.cpp b/Tactical/UI Cursors.cpp index fc4510a5..e051037e 100644 --- a/Tactical/UI Cursors.cpp +++ b/Tactical/UI Cursors.cpp @@ -2207,7 +2207,7 @@ UINT8 HandleRemoteCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivat UINT8 HandleCameraCursor( SOLDIERTYPE *pSoldier, INT32 sGridNo, BOOLEAN fActivated, UINT32 uiCursorFlags ) { // DRAW PATH TO GUY - HandleUIMovementCursor( pSoldier, uiCursorFlags, sGridNo, MOVEUI_TARGET_HANDCUFF ); + HandleUIMovementCursor( pSoldier, uiCursorFlags, sGridNo, MOVEUI_TARGET_CAMERA ); // do we have handcuffs in our hand? if ( HasItemFlag( ( &( pSoldier->inv[HANDPOS] ) )->usItem, CAMERA ) && SoldierTo3DLocationLineOfSightTest( pSoldier, sGridNo, gsInterfaceLevel, 0, TRUE, CALC_FROM_WANTED_DIR, TRUE ) )