From 90dabd20ad1a2fe3e7319a1ad6e3a2ab56d868db Mon Sep 17 00:00:00 2001 From: silversurfer Date: Sun, 13 Oct 2013 18:10:51 +0000 Subject: [PATCH] Bugfix for JaggZilla bug #515 When we fly to a sector with enemies and assign at least one of our passengers in the heli to a squad the game will remove everyone from the heli and start combat. This prevents the exploits that existed before where we could assign our men to anything in hostile sectors. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@6486 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Strategic/Assignments.cpp | 37 +++++++++++++++++++---------- Strategic/Map Screen Helicopter.cpp | 9 +++---- Strategic/Map Screen Helicopter.h | 3 ++- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/Strategic/Assignments.cpp b/Strategic/Assignments.cpp index 19cbecc58..b40b87c3e 100644 --- a/Strategic/Assignments.cpp +++ b/Strategic/Assignments.cpp @@ -608,6 +608,8 @@ static void CollectRepairableItems(SOLDIERTYPE* pRepairSoldier, SOLDIERTYPE* pSo extern BOOLEAN HandleSoldierDeath( SOLDIERTYPE *pSoldier , BOOLEAN *pfMadeCorpse ); +extern BOOLEAN CheckConditionsForBattle( GROUP *pGroup ); + void InitSectorsWithSoldiersList( void ) { // init list of sectors @@ -9506,21 +9508,31 @@ void SquadMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason ) */ pSoldier->bOldAssignment = pSoldier->bAssignment; - if( pSoldier->bOldAssignment == VEHICLE ) + // silversurfer: This guy was in the heli and gets out in a hostile sector. Everyone else get out of the heli and start combat! + if ( pSoldier->bOldAssignment == VEHICLE && pSoldier->iVehicleId == iHelicopterVehicleId && NumEnemiesInSector( pSoldier->sSectorX, pSoldier->sSectorY ) > 0 ) { - TakeSoldierOutOfVehicle( pSoldier ); + UINT8 ubGroupID = MoveAllInHelicopterToFootMovementGroup( iValue ); + CheckConditionsForBattle( GetGroup( ubGroupID ) ); } - - AddCharacterToSquad( pSoldier, ( INT8 )iValue ); - - if( pSoldier->bOldAssignment == VEHICLE ) + // old normal handling + else { - SetSoldierExitVehicleInsertionData( pSoldier, pSoldier->iVehicleId, pSoldier->ubGroupID ); - } - //Clear any desired squad assignments -- seeing the player has physically changed it! - pSoldier->ubNumTraversalsAllowedToMerge = 0; - pSoldier->ubDesiredSquadAssignment = NO_ASSIGNMENT; + if( pSoldier->bOldAssignment == VEHICLE ) + { + TakeSoldierOutOfVehicle( pSoldier ); + } + + AddCharacterToSquad( pSoldier, ( INT8 )iValue ); + + if( pSoldier->bOldAssignment == VEHICLE ) + { + SetSoldierExitVehicleInsertionData( pSoldier, pSoldier->iVehicleId, pSoldier->ubGroupID ); + } + + //Clear any desired squad assignments -- seeing the player has physically changed it! + pSoldier->ubNumTraversalsAllowedToMerge = 0; + pSoldier->ubDesiredSquadAssignment = NO_ASSIGNMENT; /* ARM: Squad menu is now disabled for anyone between sectors @@ -9536,7 +9548,8 @@ void SquadMenuBtnCallback( MOUSE_REGION * pRegion, INT32 iReason ) } */ - MakeSoldiersTacticalAnimationReflectAssignment( pSoldier ); + MakeSoldiersTacticalAnimationReflectAssignment( pSoldier ); + } } // stop displaying, leave diff --git a/Strategic/Map Screen Helicopter.cpp b/Strategic/Map Screen Helicopter.cpp index 6c45f600b..d13e3fae2 100644 --- a/Strategic/Map Screen Helicopter.cpp +++ b/Strategic/Map Screen Helicopter.cpp @@ -985,22 +985,23 @@ void SetUpHelicopterForPlayer( INT16 sX, INT16 sY , UINT8 SkyDrive, UINT8 Vehicl } -UINT8 MoveAllInHelicopterToFootMovementGroup( void ) +UINT8 MoveAllInHelicopterToFootMovementGroup( INT8 bNewSquad ) { // take everyone out of heli and add to movement group INT32 iCounter = 0; UINT8 ubGroupId = 0; SOLDIERTYPE *pSoldier; - INT8 bNewSquad; + //INT8 bNewSquad; BOOLEAN fAnyoneAboard = FALSE; BOOLEAN fSuccess; UINT8 ubInsertionCode = 0; BOOLEAN fInsertionCodeSet = FALSE; UINT16 usInsertionData = 0; - // put these guys on their own squad (we need to return their group ID, and can only return one, so they need a unique one - bNewSquad = GetFirstEmptySquad(); + // silversurfer: This function now accepts a preferred squad ID as parameter. If this squad is empty we will use it instead of the first empty squad. + if ( !SquadIsEmpty( bNewSquad ) ) + bNewSquad = GetFirstEmptySquad(); if ( bNewSquad == -1 ) { return( 0 ); diff --git a/Strategic/Map Screen Helicopter.h b/Strategic/Map Screen Helicopter.h index c51f9b5f1..452549799 100644 --- a/Strategic/Map Screen Helicopter.h +++ b/Strategic/Map Screen Helicopter.h @@ -261,7 +261,8 @@ INT16 GetNumUnSafeSectorsInPath( void ); BOOLEAN SoldierAboardAirborneHeli( SOLDIERTYPE *pSoldier ); -UINT8 MoveAllInHelicopterToFootMovementGroup( void ); +// silversurfer: now accepts a preferred squad ID +UINT8 MoveAllInHelicopterToFootMovementGroup( INT8 bNewSquad = 0 ); #endif \ No newline at end of file