Fix: dragging soldiers is frequently cancelled

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8855 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2020-07-09 20:46:41 +00:00
parent 1e66fe2ba7
commit 39d79a0bb4
2 changed files with 34 additions and 31 deletions
+33 -30
View File
@@ -9281,7 +9281,7 @@ void CalculateSoldierAniSpeed( SOLDIERTYPE *pSoldier, SOLDIERTYPE *pStatsSoldier
} }
// Flugente: drag people // Flugente: drag people
if (pSoldier->IsDraggingSomeone()) if ( pSoldier->IsDraggingSomeone( false ) )
{ {
pSoldier->sAniDelay = gItemSettings.fDragAPCostModifier * pSoldier->sAniDelay; pSoldier->sAniDelay = gItemSettings.fDragAPCostModifier * pSoldier->sAniDelay;
} }
@@ -11740,34 +11740,37 @@ void SOLDIERTYPE::MoveMerc( FLOAT dMovementChange, FLOAT dAngle, BOOLEAN fCheckR
{ {
SOLDIERTYPE* pSoldier = MercPtrs[this->usDragPersonID]; SOLDIERTYPE* pSoldier = MercPtrs[this->usDragPersonID];
// while it would be neat to take the opposite direction (which would make it look like we drag the other person by the legs), if ( pSoldier )
// this causes problems, as a prone person needs additional space for the legs. So just take the same direction
//pSoldier->ubDirection = (this->ubDirection + 4 ) % NUM_WORLD_DIRECTIONS;
pSoldier->ubDirection = this->ubDirection;
FLOAT dx = 0;
FLOAT dy = 0;
INT32 gridnotouse = pSoldier->sGridNo;
if ( sOldGridNo != this->sGridNo )
{ {
gridnotouse = sOldGridNo; // while it would be neat to take the opposite direction (which would make it look like we drag the other person by the legs),
// this causes problems, as a prone person needs additional space for the legs. So just take the same direction
//pSoldier->ubDirection = (this->ubDirection + 4 ) % NUM_WORLD_DIRECTIONS;
pSoldier->ubDirection = this->ubDirection;
FLOAT dx = 0;
FLOAT dy = 0;
INT32 gridnotouse = pSoldier->sGridNo;
if ( sOldGridNo != this->sGridNo )
{
gridnotouse = sOldGridNo;
}
else
{
INT16 this_base_x = 0;
INT16 this_base_y = 0;
ConvertMapPosToWorldTileCenter( this->sGridNo, &this_base_x, &this_base_y );
dx = this->dXPos - this_base_x;
dy = this->dYPos - this_base_y;
}
INT16 base_x = 0;
INT16 base_y = 0;
ConvertMapPosToWorldTileCenter( gridnotouse, &base_x, &base_y );
pSoldier->EVENT_InternalSetSoldierPosition( base_x + dx, base_y + dy, FALSE, FALSE, FALSE );
} }
else
{
INT16 this_base_x = 0;
INT16 this_base_y = 0;
ConvertMapPosToWorldTileCenter(this->sGridNo, &this_base_x, &this_base_y);
dx = this->dXPos - this_base_x;
dy = this->dYPos - this_base_y;
}
INT16 base_x = 0;
INT16 base_y = 0;
ConvertMapPosToWorldTileCenter( gridnotouse, &base_x, &base_y );
pSoldier->EVENT_InternalSetSoldierPosition( base_x + dx, base_y + dy, FALSE, FALSE, FALSE );
} }
else if ( this->sDragCorpseID >= 0 ) else if ( this->sDragCorpseID >= 0 )
{ {
@@ -20465,20 +20468,20 @@ BOOLEAN SOLDIERTYPE::CanDragCorpse( UINT16 usCorpseNum )
return FALSE; return FALSE;
} }
BOOLEAN SOLDIERTYPE::IsDraggingSomeone( ) BOOLEAN SOLDIERTYPE::IsDraggingSomeone( bool aStopIfConditionNotSatisfied )
{ {
if ( this->sDragCorpseID >= 0 ) if ( this->sDragCorpseID >= 0 )
{ {
if ( this->CanDragCorpse(this->sDragCorpseID) ) if ( this->CanDragCorpse(this->sDragCorpseID) )
return TRUE; return TRUE;
else else if ( aStopIfConditionNotSatisfied )
CancelDrag(); CancelDrag();
} }
else if ( this->usDragPersonID != NOBODY ) else if ( this->usDragPersonID != NOBODY )
{ {
if ( this->CanDragPerson(this->usDragPersonID) ) if ( this->CanDragPerson(this->usDragPersonID) )
return TRUE; return TRUE;
else else if ( aStopIfConditionNotSatisfied )
CancelDrag(); CancelDrag();
} }
+1 -1
View File
@@ -2015,7 +2015,7 @@ public:
BOOLEAN CanDragInPrinciple(); BOOLEAN CanDragInPrinciple();
BOOLEAN CanDragPerson( UINT16 usID ); BOOLEAN CanDragPerson( UINT16 usID );
BOOLEAN CanDragCorpse( UINT16 usCorpseNum ); BOOLEAN CanDragCorpse( UINT16 usCorpseNum );
BOOLEAN IsDraggingSomeone(); BOOLEAN IsDraggingSomeone(bool aStopIfConditionNotSatisfied = true);
void SetDragOrderPerson( UINT16 usID ); void SetDragOrderPerson( UINT16 usID );
void SetDragOrderCorpse( UINT32 usID ); void SetDragOrderCorpse( UINT32 usID );
void CancelDrag(); void CancelDrag();