From b8c0036396b6c40fa8488b9f263322fc32dc9eb4 Mon Sep 17 00:00:00 2001 From: Flugente Date: Thu, 17 Mar 2016 21:45:10 +0000 Subject: [PATCH] - Fix: When targetting a tank, mercs always aim for the 'head'. This results in misses if one changes the tank's JSD to a lower silhouette. - Fix: crash during loading of a game, as a tanks animation required sounds which were missing due to vehicle list not yet bein initialised - Fix: soldier's damaged by a blast always receive at least 1 damage, even if damage calculation results in 0 - If vehicles destroy a wall, this can now bring down a building's roof git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8112 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/LOS.cpp | 5 ++++- Tactical/Overhead.cpp | 5 +++-- Tactical/Soldier Control.cpp | 4 +++- TileEngine/Explosion Control.cpp | 2 +- TileEngine/structure.cpp | 18 +++++++++++++++++- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp index d1147f55..6dccb372 100644 --- a/Tactical/LOS.cpp +++ b/Tactical/LOS.cpp @@ -2050,7 +2050,10 @@ BOOLEAN CalculateSoldierZPos( SOLDIERTYPE * pSoldier, UINT8 ubPosType, FLOAT * p else if ( TANK( pSoldier ) ) { // high up! - ubPosType = HEAD_TARGET_POS; + //ubPosType = HEAD_TARGET_POS; + + // Flugente: why would we try to hit the top of a vehicle? the middle is just fine (we would also miss on vehicles with a lower silhouette) + ubPosType = TORSO_TARGET_POS; } ubHeight = gAnimControl[ pSoldier->usAnimState ].ubEndHeight; diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index 0a9a8490..54e78836 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -10485,7 +10485,7 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue ) { enemysidestrength += pSoldier->GetSurrenderStrength(); - if ( pSoldier->ubProfile != NO_PROFILE || pSoldier->ubSoldierClass == SOLDIER_CLASS_TANK ) + if ( pSoldier->ubProfile != NO_PROFILE || TANK(pSoldier) ) fNoSurrender = TRUE; } } @@ -10497,7 +10497,7 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue ) { if( pSoldier->bActive && ( pSoldier->sSectorX == gWorldSectorX ) && ( pSoldier->sSectorY == gWorldSectorY ) && ( pSoldier->bSectorZ == gbWorldSectorZ) ) { - // if a civilian is not neutral and on the enemy side, add his strength to the team + // hostile civs with a profile cannot be captured, as stated above, the entire team cannot surrender if ( !pSoldier->aiData.bNeutral && pSoldier->bSide == 1 && zCivGroupName[pSoldier->ubCivilianGroup].fCanBeCaptured && pSoldier->ubProfile != NO_PROFILE ) fNoSurrender = TRUE; @@ -10505,6 +10505,7 @@ void PrisonerSurrenderMessageBoxCallBack( UINT8 ubExitValue ) if ( !pSoldier->CanBeCaptured() ) continue; + // if a civilian is not neutral and on the enemy side, add his strength to the team enemysidestrength += pSoldier->GetSurrenderStrength( ); } } diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 1411d2a8..4a20b372 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -20939,7 +20939,9 @@ void InternalPlaySoldierFootstepSound( SOLDIERTYPE * pSoldier ) { bVolume = HIGHVOLUME; } - PlaySoldierJA2Sample( pSoldier->ubID, pVehicleList[pSoldier->bVehicleID].iMoveSound, RATE_11025, SoundVolume( bVolume, pSoldier->sGridNo ), 1, SoundDir( pSoldier->sGridNo ), TRUE ); + + if ( pVehicleList ) + PlaySoldierJA2Sample( pSoldier->ubID, pVehicleList[pSoldier->bVehicleID].iMoveSound, RATE_11025, SoundVolume( bVolume, pSoldier->sGridNo ), 1, SoundDir( pSoldier->sGridNo ), TRUE ); } } diff --git a/TileEngine/Explosion Control.cpp b/TileEngine/Explosion Control.cpp index 0aaf2d34..3d6ee79f 100644 --- a/TileEngine/Explosion Control.cpp +++ b/TileEngine/Explosion Control.cpp @@ -1843,7 +1843,7 @@ BOOLEAN DamageSoldierFromBlast( UINT8 ubPerson, UINT8 ubOwner, INT32 sBombGridNo } } - sNewWoundAmt = max(1, sNewWoundAmt); + sNewWoundAmt = max(0, sNewWoundAmt); } ////////////////////////////////////////////////////////////////////////////////////// diff --git a/TileEngine/structure.cpp b/TileEngine/structure.cpp index 11ff0494..ece096df 100644 --- a/TileEngine/structure.cpp +++ b/TileEngine/structure.cpp @@ -1906,8 +1906,10 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, // max armour will be set by Player in .ini and checked before DamageStructure is called if ( ubReason == STRUCTURE_DAMAGE_VEHICLE_TRAUMA ) { + INT16 damage = 255; + BOOLEAN recompile = FALSE; - ExplosiveDamageGridNo( sGridNo, 255, 10, &recompile, FALSE, -1, FALSE, ubOwner, 0 ); + ExplosiveDamageGridNo( sGridNo, damage, 10, &recompile, FALSE, -1, FALSE, ubOwner, 0 ); //Since the structure is being damaged, set the map element that a structure is damaged gpWorldLevelData[ sGridNo ].uiFlags |= MAPELEMENT_STRUCTURE_DAMAGED; @@ -1917,6 +1919,20 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, { MercPtrs[ ubOwner ]->SoldierTakeDamage( 0, Random(max(0,(ubBaseArmour-10)/5))+max(0,(ubBaseArmour-10)/5), 0, TAKE_DAMAGE_STRUCTURE_EXPLOSION, NOBODY, MercPtrs[ ubOwner ]->sGridNo, 0, TRUE ); } + + // Flugente: if we destroyed a wall, the roof might get damaged too + // recompile = TRUE means that we destroyed something + if ( fWallHere && recompile ) + { + // lets not make it that extreme + damage = 100; + + HandleRoofDestruction( sGridNo, damage * 0.75f ); + HandleRoofDestruction( NewGridNo( sGridNo, DirectionInc( NORTH ) ), damage * 0.75f ); + HandleRoofDestruction( NewGridNo( sGridNo, DirectionInc( EAST ) ), damage * 0.75f ); + HandleRoofDestruction( NewGridNo( sGridNo, DirectionInc( WEST ) ), damage * 0.75f ); + HandleRoofDestruction( NewGridNo( sGridNo, DirectionInc( SOUTH ) ), damage * 0.75f ); + } } // Don't update damage HPs....