From 73cbc27ea479ec1f8e05ca04798bc609348fff39 Mon Sep 17 00:00:00 2001 From: Sevenfm Date: Thu, 20 Feb 2020 12:28:55 +0000 Subject: [PATCH] Play sound when dragging something (Sounds\Misc\DragBody1.ogg .. DragBodyN.ogg). Mercs always make movement noise when dragging. Stop dragging if another merc starts dragging this merc/body. Stop dragging if dragged merc gets up from collapsed state. Stop dragging when changing stance/cowering under suppression. Fixed grenade pin sound for signal smoke. CalcBestShot: if new opponent is dying and best opponent is ok, ignore new opponent. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8759 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/Overhead.cpp | 6 ++++ Tactical/Soldier Control.cpp | 64 ++++++++++++++++++++++++++++++++++-- Tactical/Soldier Control.h | 2 ++ Tactical/opplist.cpp | 6 ++++ TacticalAI/Attacks.cpp | 13 +++++--- 5 files changed, 85 insertions(+), 6 deletions(-) diff --git a/Tactical/Overhead.cpp b/Tactical/Overhead.cpp index c834a025..b4e499fb 100644 --- a/Tactical/Overhead.cpp +++ b/Tactical/Overhead.cpp @@ -2760,6 +2760,9 @@ BOOLEAN HandleAtNewGridNo( SOLDIERTYPE *pSoldier, BOOLEAN *pfKeepMoving ) PROFILLUA_ubDirectiono = pSoldier->ubDirection; PROFILLUA_bTeam = pSoldier->bTeam; + // sevenfm: reached new spot, enabled dragging sound + pSoldier->usSoldierFlagMask2 &= ~SOLDIER_DRAG_SOUND; + // ATE; Handle bad guys, as they fade, to cancel it if // too long... // ONLY if fading IN! @@ -8825,6 +8828,9 @@ void HandleSuppressionFire( UINT8 ubTargetedMerc, UINT8 ubCausedAttacker ) pSoldier->bScopeMode = USE_BEST_SCOPE; } + // sevenfm: stop dragging when changing stance/cowering under suppression + pSoldier->CancelDrag(); + DebugMsg(TOPIC_JA2,DBG_LEVEL_3,String("HandleSuppressionFire: change stance")); pSoldier->ChangeSoldierStance( ubNewStance ); diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index d40c3326..daa4fefd 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -3037,7 +3037,7 @@ BOOLEAN SOLDIERTYPE::EVENT_InitNewSoldierAnim( UINT16 usNewState, UINT16 usStart else if (Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_SMOKE || Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_TEARGAS || Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_MUSTGAS || - Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_SMOKE) + Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_SIGNAL_SMOKE) { if (fDelay) sprintf(zFilename, "sounds\\grenade\\grenade_gas_delay.ogg"); @@ -9967,6 +9967,17 @@ void SOLDIERTYPE::BeginSoldierGetup( void ) { // get up you hoser! + // sevenfm: if someone is dragging this soldier, cancel drag + SOLDIERTYPE *pSoldier; + for (UINT32 uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++) + { + pSoldier = MercPtrs[uiLoop]; + if (pSoldier && pSoldier->usDragPersonID == this->ubID) + { + pSoldier->CancelDrag(); + } + } + this->bCollapsed = FALSE; this->bTurnsCollapsed = 0; @@ -11451,7 +11462,7 @@ InternalpSoldier->GivingSoldierCancelServices(, FALSE ); } */ - +INT16 gsDragSoundNum = -1; void SOLDIERTYPE::MoveMerc( FLOAT dMovementChange, FLOAT dAngle, BOOLEAN fCheckRange ) { @@ -11577,6 +11588,33 @@ void SOLDIERTYPE::MoveMerc( FLOAT dMovementChange, FLOAT dAngle, BOOLEAN fCheckR // Flugente: drag people if ( currentlydragging ) { + // sevenfm: play sound while dragging + if (!(this->usSoldierFlagMask2 & SOLDIER_DRAG_SOUND)) + { + CHAR8 zFilename[512]; + // prepare drag sound + if (gsDragSoundNum < 0) + { + gsDragSoundNum = 0; + do + { + gsDragSoundNum++; + sprintf(zFilename, "Sounds\\Misc\\DragBody%d.ogg", gsDragSoundNum); + } while (FileExists(zFilename)); + gsDragSoundNum--; + } + if (gsDragSoundNum > 0) + { + sprintf(zFilename, "Sounds\\Misc\\DragBody%d.ogg", Random(gsDragSoundNum) + 1); + if (FileExists(zFilename)) + { + PlayJA2SampleFromFile(zFilename, RATE_11025, SoundVolume(MIDVOLUME, this->sGridNo), 1, SoundDir(this->sGridNo)); + } + + this->usSoldierFlagMask2 |= SOLDIER_DRAG_SOUND; + } + } + if ( this->usDragPersonID != NOBODY ) { SOLDIERTYPE* pSoldier = MercPtrs[this->usDragPersonID]; @@ -20096,6 +20134,17 @@ void SOLDIERTYPE::SetDragOrderPerson( UINT16 usID ) { if ( CanDragPerson( usID ) ) { + // sevenfm: if someone is dragging this soldier, cancel drag + SOLDIERTYPE *pSoldier; + for (UINT32 uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++) + { + pSoldier = MercPtrs[uiLoop]; + if (pSoldier && pSoldier->usDragPersonID == usID) + { + pSoldier->CancelDrag(); + } + } + CancelDrag(); this->usDragPersonID = usID; @@ -20106,6 +20155,17 @@ void SOLDIERTYPE::SetDragOrderCorpse( UINT32 usID ) { if ( CanDragCorpse( usID ) ) { + // sevenfm: if someone is dragging this corpse, cancel drag + SOLDIERTYPE *pSoldier; + for (UINT32 uiLoop = 0; uiLoop < guiNumMercSlots; uiLoop++) + { + pSoldier = MercPtrs[uiLoop]; + if (pSoldier && pSoldier->sDragCorpseID == usID) + { + pSoldier->CancelDrag(); + } + } + CancelDrag(); this->sDragCorpseID = usID; diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index 44aef80c..7a16ffb4 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -424,6 +424,8 @@ enum #define SOLDIER_MERC_POW_LOCATIONKNOWN 0x00020000 // we are a POW, but the player has discovered our location #define SOLDIER_SURGERY_BOOSTED 0x00040000 // we are a boosted performing surgery (e.g. by using up a blood bag) +#define SOLDIER_DRAG_SOUND 0x00080000 // played sound when started dragging + #define SOLDIER_INTERROGATE_ALL 0x000001F8 // all interrogation flags // ---------------------------------------------------------------- diff --git a/Tactical/opplist.cpp b/Tactical/opplist.cpp index 0568357b..6a49c4fd 100644 --- a/Tactical/opplist.cpp +++ b/Tactical/opplist.cpp @@ -5497,6 +5497,12 @@ UINT8 MovementNoise(SOLDIERTYPE *pSoldier) } } + // sevenfm: if dragging something, add dragging sound volume + if(pSoldier->IsDraggingSomeone()) + { + sVolume = max(sVolume, MAX_MOVEMENT_NOISE / 2 + Random(MAX_MOVEMENT_NOISE) + bGroundVolumeModifier); + } + sVolume = max(0, sVolume); sVolume = min(255, sVolume); diff --git a/TacticalAI/Attacks.cpp b/TacticalAI/Attacks.cpp index ecee12d5..9249048d 100644 --- a/TacticalAI/Attacks.cpp +++ b/TacticalAI/Attacks.cpp @@ -712,10 +712,15 @@ void CalcBestShot(SOLDIERTYPE *pSoldier, ATTACKTYPE *pBestShot, BOOLEAN shootUns continue; // next opponent } } - //dnl ch62 180813 ignore firing into dying targets - // sevenfm: disabled because of problems with AI - //if((pOpponent->bCollapsed || pOpponent->bBreathCollapsed) && pOpponent->stats.bLife < OKLIFE/* && !(pSoldier->aiData.bAttitude == AGGRESSIVE && Random(100) < 20)*/) - //continue; + + // sevenfm: if new opponent is dying and best opponent is ok, ignore new opponent + if (pBestShot->ubOpponent != NOBODY && + Menptr[pBestShot->ubOpponent].stats.bLife >= OKLIFE && + pOpponent->stats.bLife < OKLIFE) + { + //DebugShot(pSoldier, String("new opponent is dying, best opponent is ok - skip")); + continue; + } // OOOF! That was a lot of work! But we've got a new best target! pBestShot->ubPossible = TRUE;