mirror of
https://github.com/1dot13/source.git
synced 2026-09-02 14:36:06 +02:00
Added memory leak detection to "new" operator
Prevent merc in slot 0 from disappearing due to errant schedule. Still need to find and fix schedule though Prevent attempts to turn or climb roof when soldier collapsed Fix problems when mortar or RPG randomly assigned to a soldier but cannot be added for whatever reason Pathing favors beginning path on orthogonal and using as few turns as possible (mostly old behavior). Prevent interruptions when soldier climbs up, which can cause fall into building just below the target roof position Fix pauses due to soldiers hurt in previous turn Fix soldier path not reaching destination when thrown by explosion damage or heavy gunfire Restore pathing to cave and underground exits Fix too many AI ending up on the roofs git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@1588 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
@@ -282,7 +282,7 @@ BOOLEAN LoadEnemySoldiersFromTempFile()
|
||||
curr->pBasicPlacement->fPriorityExistance = TRUE;
|
||||
if( !curr->pDetailedPlacement )
|
||||
{ //need to upgrade the placement to detailed placement
|
||||
curr->pDetailedPlacement = new (MemAlloc( SIZEOF_SOLDIERCREATE_STRUCT )) SOLDIERCREATE_STRUCT; //(SOLDIERCREATE_STRUCT*)MemAlloc( SIZEOF_SOLDIERCREATE_STRUCT );
|
||||
curr->pDetailedPlacement = new SOLDIERCREATE_STRUCT; //(SOLDIERCREATE_STRUCT*)MemAlloc( SIZEOF_SOLDIERCREATE_STRUCT );
|
||||
}
|
||||
//now replace the map pristine placement info with the temp map file version..
|
||||
//memcpy( curr->pDetailedPlacement, &tempDetailedPlacement, SIZEOF_SOLDIERCREATE_STRUCT );
|
||||
@@ -475,7 +475,7 @@ BOOLEAN SaveEnemySoldiersToTempFile( INT16 sSectorX, INT16 sSectorY, INT8 bSecto
|
||||
{ //need to upgrade the placement to detailed placement
|
||||
curr->pBasicPlacement->fDetailedPlacement = TRUE;
|
||||
// WDS - Clean up inventory handling
|
||||
curr->pDetailedPlacement = new (MemAlloc( SIZEOF_SOLDIERCREATE_STRUCT )) SOLDIERCREATE_STRUCT; //(SOLDIERCREATE_STRUCT*)MemAlloc( SIZEOF_SOLDIERCREATE_STRUCT );
|
||||
curr->pDetailedPlacement = new SOLDIERCREATE_STRUCT; //(SOLDIERCREATE_STRUCT*)MemAlloc( SIZEOF_SOLDIERCREATE_STRUCT );
|
||||
//memset( curr->pDetailedPlacement, 0, SIZEOF_SOLDIERCREATE_STRUCT );
|
||||
curr->pDetailedPlacement->initialize();
|
||||
}
|
||||
@@ -1009,7 +1009,7 @@ BOOLEAN NewWayOfLoadingEnemySoldiersFromTempFile()
|
||||
curr->pBasicPlacement->fPriorityExistance = TRUE;
|
||||
if( !curr->pDetailedPlacement )
|
||||
{ //need to upgrade the placement to detailed placement
|
||||
curr->pDetailedPlacement = new (MemAlloc( SIZEOF_SOLDIERCREATE_STRUCT )) SOLDIERCREATE_STRUCT; //(SOLDIERCREATE_STRUCT*)MemAlloc( SIZEOF_SOLDIERCREATE_STRUCT );
|
||||
curr->pDetailedPlacement = new SOLDIERCREATE_STRUCT; //(SOLDIERCREATE_STRUCT*)MemAlloc( SIZEOF_SOLDIERCREATE_STRUCT );
|
||||
}
|
||||
//now replace the map pristine placement info with the temp map file version..
|
||||
//memcpy( curr->pDetailedPlacement, &tempDetailedPlacement, SIZEOF_SOLDIERCREATE_STRUCT );
|
||||
@@ -1582,7 +1582,7 @@ BOOLEAN NewWayOfSavingEnemyAndCivliansToTempFile( INT16 sSectorX, INT16 sSectorY
|
||||
{ //need to upgrade the placement to detailed placement
|
||||
curr->pBasicPlacement->fDetailedPlacement = TRUE;
|
||||
// WDS - Clean up inventory handling
|
||||
curr->pDetailedPlacement = new (MemAlloc( SIZEOF_SOLDIERCREATE_STRUCT )) SOLDIERCREATE_STRUCT;
|
||||
curr->pDetailedPlacement = new SOLDIERCREATE_STRUCT;
|
||||
curr->pDetailedPlacement->initialize();
|
||||
//memset( curr->pDetailedPlacement, 0, SIZEOF_SOLDIERCREATE_STRUCT );
|
||||
}
|
||||
|
||||
+14
-1
@@ -4626,6 +4626,18 @@ BOOLEAN MakeSoldierTurn( SOLDIERTYPE *pSoldier, INT16 sXPos, INT16 sYPos )
|
||||
INT16 sFacingDir, sAPCost, sAPCostToReady;
|
||||
UINT16 usAnimState;
|
||||
|
||||
// Make sure the merc is not collapsed!
|
||||
if (!IsValidStance(pSoldier, ANIM_CROUCH) )
|
||||
{
|
||||
if ( pSoldier->bCollapsed && pSoldier->bBreath < OKBREATH )
|
||||
{
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 4 ], pSoldier->name );
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
// Get direction from mouse pos
|
||||
sFacingDir = GetDirectionFromXY( sXPos, sYPos, pSoldier );
|
||||
|
||||
@@ -4730,7 +4742,8 @@ UINT32 UIHandleLCLook( UI_EVENT *pUIEvent )
|
||||
|
||||
if ( MakeSoldierTurn( pSoldier, sXPos, sYPos ) )
|
||||
{
|
||||
SetUIBusy( pSoldier->ubID );
|
||||
// 0verhaul: Why do we set UI busy for a single soldier but not for a group of selected soldiers?
|
||||
//SetUIBusy( pSoldier->ubID );
|
||||
}
|
||||
}
|
||||
return( GAME_SCREEN );
|
||||
|
||||
@@ -978,33 +978,50 @@ void ChooseGrenadesForSoldierCreateStruct( SOLDIERCREATE_STRUCT *pp, INT8 bGrena
|
||||
return;
|
||||
|
||||
// special mortar shell handling
|
||||
if (bGrenadeClass == MORTAR_GRENADE_CLASS && itemMortar > 0 )
|
||||
if (bGrenadeClass == MORTAR_GRENADE_CLASS)
|
||||
{
|
||||
usItem = PickARandomLaunchable ( itemMortar );
|
||||
if ( usItem > 0 )
|
||||
// 0verhaul: itemMortar can be 0 if the previous function
|
||||
// 1) failed to find a Mortar that the soldier would want to use (due to XML prefs)
|
||||
// 2) randomly chose not to supply a Mortar (always possible, even if choices exist).
|
||||
// Since we should not go beyond this point in the case where Mortar Rounds are desired,
|
||||
// return here in any case
|
||||
if (itemMortar > 0 )
|
||||
{
|
||||
CreateItems( usItem, (INT8) (80 + Random(21)), bGrenades, &Object );
|
||||
Object.fFlags |= OBJECT_UNDROPPABLE;
|
||||
PlaceObjectInSoldierCreateStruct( pp, &Object );
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// special rpg rocket handling
|
||||
if (bGrenadeClass == RPG_GRENADE_CLASS && itemRPG > 0 )
|
||||
{
|
||||
usItem = PickARandomLaunchable ( itemRPG );
|
||||
if ( usItem > 0 )
|
||||
{
|
||||
for ( int i = 0; i < bGrenades; i++ )
|
||||
usItem = PickARandomLaunchable ( itemMortar );
|
||||
if ( usItem > 0 )
|
||||
{
|
||||
CreateItem( usItem, (INT8) (70 + Random(31)), &Object );
|
||||
CreateItems( usItem, (INT8) (80 + Random(21)), bGrenades, &Object );
|
||||
Object.fFlags |= OBJECT_UNDROPPABLE;
|
||||
PlaceObjectInSoldierCreateStruct( pp, &Object );
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// special rpg rocket handling
|
||||
if (bGrenadeClass == RPG_GRENADE_CLASS)
|
||||
{
|
||||
// 0verhaul: itemRPG can be 0 if the previous function
|
||||
// 1) failed to find an RPG that the soldier would want to use (due to XML prefs)
|
||||
// 2) randomly chose not to supply an RPG (always possible, even if choices exist).
|
||||
// Since we should not go beyond this point in the case where RPG grenades are desired,
|
||||
// return here in any case
|
||||
if (itemRPG > 0 )
|
||||
{
|
||||
usItem = PickARandomLaunchable ( itemRPG );
|
||||
if ( usItem > 0 )
|
||||
{
|
||||
for ( int i = 0; i < bGrenades; i++ )
|
||||
{
|
||||
CreateItem( usItem, (INT8) (70 + Random(31)), &Object );
|
||||
Object.fFlags |= OBJECT_UNDROPPABLE;
|
||||
PlaceObjectInSoldierCreateStruct( pp, &Object );
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
Assert( bGrenadeClass <= 11 );
|
||||
|
||||
+12
-2
@@ -1096,7 +1096,16 @@ void AStarPathfinder::ExecuteAStarLogic()
|
||||
//movementG = (INT16) CalcG( &prevCost);
|
||||
//movementG = CalcAP( movementG, direction);
|
||||
|
||||
movementG = terrainCost * 100;
|
||||
//movementG = terrainCost * 100;
|
||||
movementG = terrainCost;
|
||||
// Favor continuing in the same direction by increasing the cost for changing direction
|
||||
int ParentParentNode = GetAStarParent( ParentNode);
|
||||
if ((ParentParentNode != -1 &&
|
||||
ParentNode - ParentParentNode != CurrentNode - ParentNode) ||
|
||||
(ParentParentNode == -1 && (direction & 1) ) )
|
||||
{
|
||||
movementG++;
|
||||
}
|
||||
|
||||
INT16 AStarG = baseGCost + movementG;
|
||||
//if the node is more costly in this path than in another open path, continue
|
||||
@@ -1629,7 +1638,7 @@ int AStarPathfinder::CalcH()
|
||||
|
||||
int x = abs(n1->x - n2->x);
|
||||
int y = abs(n1->y - n2->y);
|
||||
#if 0
|
||||
#if 1
|
||||
if (x >= y)
|
||||
{
|
||||
return this->travelcostDiag * y + this->travelcostOrth * (x-y);
|
||||
@@ -4703,3 +4712,4 @@ UINT8 DoorTravelCost( SOLDIERTYPE * pSoldier, INT32 iGridNo, UINT8 ubMovementCos
|
||||
return( InternalDoorTravelCost( pSoldier, iGridNo, ubMovementCost, fReturnPerceivedValue, piDoorGridNo, FALSE ) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -252,8 +252,11 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier )
|
||||
|
||||
// CODE: SPECIAL MOVE CLIMB UP ROOF EVENT
|
||||
|
||||
// re-enable sight
|
||||
gTacticalStatus.uiFlags &= (~DISALLOW_SIGHT);
|
||||
// Moved here because this represents "already on the roof", so breath collapses and interrupts should
|
||||
// keep the soldier on the roof where he belongs
|
||||
// Move merc up specific height
|
||||
SetSoldierHeight( pSoldier, (FLOAT)50 );
|
||||
|
||||
{
|
||||
INT16 sXPos, sYPos;
|
||||
|
||||
@@ -261,6 +264,10 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier )
|
||||
ConvertMapPosToWorldTileCenter( pSoldier->sTempNewGridNo, &sXPos, &sYPos );
|
||||
EVENT_SetSoldierPosition( pSoldier, (FLOAT)sXPos, (FLOAT)sYPos );
|
||||
}
|
||||
|
||||
// re-enable sight
|
||||
gTacticalStatus.uiFlags &= (~DISALLOW_SIGHT);
|
||||
|
||||
// Move two CC directions
|
||||
EVENT_SetSoldierDirection( pSoldier, gTwoCCDirection[ pSoldier->ubDirection ] );
|
||||
|
||||
@@ -273,9 +280,6 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier )
|
||||
usUIMovementMode = GetMoveStateBasedOnStance( pSoldier, gAnimControl[ pSoldier->usAnimState ].ubEndHeight );
|
||||
pSoldier->usUIMovementMode = usUIMovementMode;
|
||||
|
||||
// Move merc up specific height
|
||||
SetSoldierHeight( pSoldier, (FLOAT)50 );
|
||||
|
||||
// ATE: Change interface level.....
|
||||
// CJC: only if we are a player merc
|
||||
if (pSoldier->bTeam == gbPlayerNum)
|
||||
@@ -326,6 +330,9 @@ BOOLEAN AdjustToNextAnimationFrame( SOLDIERTYPE *pSoldier )
|
||||
// Move two C directions
|
||||
EVENT_SetSoldierDirection( pSoldier, gTwoCDirection[ pSoldier->ubDirection ] );
|
||||
|
||||
// Remove the roof marker
|
||||
HandlePlacingRoofMarker( pSoldier, pSoldier->sGridNo, FALSE, TRUE );
|
||||
|
||||
EVENT_SetSoldierDesiredDirection( pSoldier, pSoldier->ubDirection );
|
||||
// Adjust height
|
||||
SetSoldierHeight( pSoldier, (FLOAT)gClimbDownRoofStartDist[ pSoldier->ubBodyType ] );
|
||||
|
||||
@@ -3000,7 +3000,10 @@ void InternalSetSoldierHeight( SOLDIERTYPE *pSoldier, FLOAT dNewHeight, BOOLEAN
|
||||
return;
|
||||
}
|
||||
|
||||
if ( pSoldier->sHeightAdjustment > 0 )
|
||||
// 0verhaul: Changed this to half the wall height. During a climb up, a soldier's height increases to about 8, then falls
|
||||
// to near 0 before being set to 50 at the end. The animation offsets should probably be changed to make this unnecessary
|
||||
// but this is good enough to keep him from bouncing between level 1 and level 0 (and also triggering weird sight bugs).
|
||||
if ( pSoldier->sHeightAdjustment > 25 )
|
||||
{
|
||||
pSoldier->bLevel = SECOND_LEVEL;
|
||||
|
||||
@@ -6084,6 +6087,7 @@ void TurnSoldier( SOLDIERTYPE *pSoldier)
|
||||
else
|
||||
{
|
||||
pSoldier->uiStatusFlags &= (~SOLDIER_TURNINGFROMHIT );
|
||||
pSoldier->fGettingHit = FALSE;
|
||||
}
|
||||
}
|
||||
else if ( pSoldier->fGettingHit == 2 )
|
||||
@@ -6100,7 +6104,7 @@ void TurnSoldier( SOLDIERTYPE *pSoldier)
|
||||
//ReduceAttackBusyCount( );
|
||||
|
||||
//FREEUP GETTING HIT FLAG
|
||||
// pSoldier->fGettingHit = FALSE;
|
||||
pSoldier->fGettingHit = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11598,6 +11602,11 @@ void ChangeToFlybackAnimation( SOLDIERTYPE *pSoldier, UINT8 ubDirection )
|
||||
// Remove any previous actions
|
||||
pSoldier->ubPendingAction = NO_PENDING_ACTION;
|
||||
|
||||
// Since we're manually setting our path, we have to reset these @#$@# flags too. Otherwise we don't reach the
|
||||
// destination a lot of the time
|
||||
pSoldier->fPastXDest = 0;
|
||||
pSoldier->fPastYDest = 0;
|
||||
|
||||
// Set path....
|
||||
pSoldier->usPathDataSize = 0;
|
||||
pSoldier->usPathIndex = 0;
|
||||
@@ -11638,6 +11647,11 @@ void ChangeToFallbackAnimation( SOLDIERTYPE *pSoldier, UINT8 ubDirection )
|
||||
// Remove any previous actions
|
||||
pSoldier->ubPendingAction = NO_PENDING_ACTION;
|
||||
|
||||
// Since we're manually setting our path, we have to reset these @#$@# flags too. Otherwise we don't reach the
|
||||
// destination a lot of the time
|
||||
pSoldier->fPastXDest = 0;
|
||||
pSoldier->fPastYDest = 0;
|
||||
|
||||
// Set path....
|
||||
pSoldier->usPathDataSize = 0;
|
||||
pSoldier->usPathIndex = 0;
|
||||
|
||||
@@ -751,7 +751,7 @@ SOLDIERTYPE* TacticalCreateSoldier( SOLDIERCREATE_STRUCT *pCreateStruct, UINT8 *
|
||||
UINT8 ubSectorID;
|
||||
ubSectorID = GetAutoResolveSectorID();
|
||||
// WDS - Clean up inventory handling
|
||||
pSoldier = new (MemAlloc( SIZEOF_SOLDIERTYPE )) SOLDIERTYPE; //(SOLDIERTYPE*)MemAlloc( SIZEOF_SOLDIERTYPE );
|
||||
pSoldier = new SOLDIERTYPE; //(SOLDIERTYPE*)MemAlloc( SIZEOF_SOLDIERTYPE );
|
||||
if( !pSoldier )
|
||||
return NULL;
|
||||
//memcpy( pSoldier, &Soldier, SIZEOF_SOLDIERTYPE );
|
||||
@@ -2205,7 +2205,7 @@ SOLDIERTYPE* ReserveTacticalSoldierForAutoresolve( UINT8 ubSoldierClass )
|
||||
|
||||
// WDS - Clean up inventory handling
|
||||
//Allocate and copy the soldier
|
||||
pSoldier = new (MemAlloc( SIZEOF_SOLDIERTYPE )) SOLDIERTYPE; //(SOLDIERTYPE*)MemAlloc( SIZEOF_SOLDIERTYPE );
|
||||
pSoldier = new SOLDIERTYPE; //(SOLDIERTYPE*)MemAlloc( SIZEOF_SOLDIERTYPE );
|
||||
if( !pSoldier )
|
||||
return NULL;
|
||||
// memcpy( pSoldier, MercPtrs[ i ], SIZEOF_SOLDIERTYPE );
|
||||
@@ -2360,7 +2360,7 @@ SOLDIERTYPE* ReserveTacticalMilitiaSoldierForAutoresolve( UINT8 ubSoldierClass )
|
||||
|
||||
// WDS - Clean up inventory handling
|
||||
//Allocate and copy the soldier
|
||||
pSoldier = new (MemAlloc( SIZEOF_SOLDIERTYPE )) SOLDIERTYPE; //(SOLDIERTYPE*)MemAlloc( SIZEOF_SOLDIERTYPE );
|
||||
pSoldier = new SOLDIERTYPE; //(SOLDIERTYPE*)MemAlloc( SIZEOF_SOLDIERTYPE );
|
||||
if( !pSoldier )
|
||||
return NULL;
|
||||
// memcpy( pSoldier, MercPtrs[ i ], SIZEOF_SOLDIERTYPE );
|
||||
|
||||
+12
-22
@@ -516,6 +516,12 @@ BOOLEAN HandleNextTileWaiting( SOLDIERTYPE *pSoldier )
|
||||
{
|
||||
RESETTIMECOUNTER( pSoldier->NextTileCounter, NEXT_TILE_CHECK_DELAY );
|
||||
|
||||
// ATE: Allow path to exit grid!
|
||||
if ( pSoldier->ubWaitActionToDo == 1 && gubWaitingForAllMercsToExitCode == WAIT_FOR_MERCS_TO_WALK_TO_GRIDNO )
|
||||
{
|
||||
gfPlotPathToExitGrid = TRUE;
|
||||
}
|
||||
|
||||
// Get direction from gridno...
|
||||
bCauseDirection = (INT8)GetDirectionToGridNoFromGridNo( pSoldier->sGridNo, pSoldier->sDelayedMovementCauseGridNo );
|
||||
|
||||
@@ -534,6 +540,7 @@ BOOLEAN HandleNextTileWaiting( SOLDIERTYPE *pSoldier )
|
||||
SetFinalTile( pSoldier, pSoldier->sGridNo, TRUE );
|
||||
pSoldier->fDelayedMovement = FALSE;
|
||||
}
|
||||
gfPlotPathToExitGrid = FALSE;
|
||||
return( TRUE );
|
||||
}
|
||||
|
||||
@@ -595,15 +602,7 @@ BOOLEAN HandleNextTileWaiting( SOLDIERTYPE *pSoldier )
|
||||
sCheckGridNo = pSoldier->sFinalDestination;
|
||||
}
|
||||
|
||||
// Try another path to destination
|
||||
// ATE: Allow path to exit grid!
|
||||
if ( pSoldier->ubWaitActionToDo == 1 && gubWaitingForAllMercsToExitCode == WAIT_FOR_MERCS_TO_WALK_TO_GRIDNO )
|
||||
{
|
||||
gfPlotPathToExitGrid = TRUE;
|
||||
}
|
||||
|
||||
sCost = (INT16) FindBestPath( pSoldier, sCheckGridNo, pSoldier->bLevel, pSoldier->usUIMovementMode, NO_COPYROUTE, fFlags );
|
||||
gfPlotPathToExitGrid = FALSE;
|
||||
|
||||
// Can we get there
|
||||
if ( sCost > 0 )
|
||||
@@ -617,15 +616,8 @@ BOOLEAN HandleNextTileWaiting( SOLDIERTYPE *pSoldier )
|
||||
{
|
||||
// Try to path around everyone except dest person
|
||||
|
||||
if ( pSoldier->ubWaitActionToDo == 1 && gubWaitingForAllMercsToExitCode == WAIT_FOR_MERCS_TO_WALK_TO_GRIDNO )
|
||||
{
|
||||
gfPlotPathToExitGrid = TRUE;
|
||||
}
|
||||
|
||||
sCost = (INT16) FindBestPath( pSoldier, sCheckGridNo, pSoldier->bLevel, pSoldier->usUIMovementMode, NO_COPYROUTE, PATH_IGNORE_PERSON_AT_DEST );
|
||||
|
||||
gfPlotPathToExitGrid = FALSE;
|
||||
|
||||
// Is the next tile in this new path blocked too?
|
||||
sNewGridNo = NewGridNo( (UINT16)pSoldier->sGridNo, DirectionInc( (UINT8)guiPathingData[ 0 ] ) );
|
||||
|
||||
@@ -633,6 +625,7 @@ BOOLEAN HandleNextTileWaiting( SOLDIERTYPE *pSoldier )
|
||||
|
||||
// now working with a path which does not go through people
|
||||
pSoldier->ubDelayedMovementFlags &= (~DELAYED_MOVEMENT_FLAG_PATH_THROUGH_PEOPLE);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -646,12 +639,6 @@ BOOLEAN HandleNextTileWaiting( SOLDIERTYPE *pSoldier )
|
||||
// Are we clear?
|
||||
if ( bPathBlocked == MOVE_TILE_CLEAR )
|
||||
{
|
||||
// Go for it path!
|
||||
if ( pSoldier->ubWaitActionToDo == 1 && gubWaitingForAllMercsToExitCode == WAIT_FOR_MERCS_TO_WALK_TO_GRIDNO )
|
||||
{
|
||||
gfPlotPathToExitGrid = TRUE;
|
||||
}
|
||||
|
||||
//pSoldier->fDelayedMovement = FALSE;
|
||||
// ATE: THis will get set in EENT_GetNewSoldierPath....
|
||||
pSoldier->usActionData = sCheckGridNo;
|
||||
@@ -659,8 +646,8 @@ BOOLEAN HandleNextTileWaiting( SOLDIERTYPE *pSoldier )
|
||||
pSoldier->bPathStored = FALSE;
|
||||
|
||||
EVENT_GetNewSoldierPath( pSoldier, sCheckGridNo, pSoldier->usUIMovementMode );
|
||||
gfPlotPathToExitGrid = FALSE;
|
||||
|
||||
gfPlotPathToExitGrid = FALSE;
|
||||
return( TRUE );
|
||||
}
|
||||
}
|
||||
@@ -707,6 +694,7 @@ BOOLEAN HandleNextTileWaiting( SOLDIERTYPE *pSoldier )
|
||||
NPCReachedDestination( pSoldier, FALSE );
|
||||
pSoldier->bNextAction = AI_ACTION_WAIT;
|
||||
pSoldier->usNextActionData = 500;
|
||||
gfPlotPathToExitGrid = FALSE;
|
||||
return( TRUE );
|
||||
}
|
||||
}
|
||||
@@ -743,6 +731,8 @@ BOOLEAN HandleNextTileWaiting( SOLDIERTYPE *pSoldier )
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gfPlotPathToExitGrid = FALSE;
|
||||
return( TRUE );
|
||||
}
|
||||
|
||||
|
||||
@@ -250,7 +250,7 @@ void QueryTBLeftButton( UINT32 *puiNewEvent )
|
||||
SOLDIERTYPE *pSoldier;
|
||||
UINT16 usMapPos;
|
||||
static BOOLEAN fClickHoldIntercepted = FALSE;
|
||||
BOOLEAN fOnInterTile = FALSE;
|
||||
//BOOLEAN fOnInterTile = FALSE;
|
||||
static BOOLEAN fCanCheckForSpeechAdvance = FALSE;
|
||||
static INT16 sMoveClickGridNo = 0;
|
||||
|
||||
@@ -2347,6 +2347,17 @@ void GetKeyboardInput( UINT32 *puiNewEvent )
|
||||
BOOLEAN fNearLowerLevel;
|
||||
INT8 bDirection;
|
||||
|
||||
// Make sure the merc is not collapsed!
|
||||
if (!IsValidStance(pjSoldier, ANIM_CROUCH) )
|
||||
{
|
||||
if ( pjSoldier->bCollapsed && pjSoldier->bBreath < OKBREATH )
|
||||
{
|
||||
ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_UI_FEEDBACK, gzLateLocalizedString[ 4 ], pjSoldier->name );
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
GetMercClimbDirection( pjSoldier->ubID, &fNearLowerLevel, &fNearHeigherLevel );
|
||||
|
||||
if ( fNearLowerLevel )
|
||||
|
||||
Reference in New Issue
Block a user