From 3723ebfa4345dda88938fbed4ac2dd138e1b4787 Mon Sep 17 00:00:00 2001 From: silversurfer Date: Tue, 30 Oct 2018 14:16:51 +0000 Subject: [PATCH] Fix (by Sevenfm) - noise volume was capped so less important noises could be stored in the AI noise memory New feature - mercs can now also open doors from the side instead of the front git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8630 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameVersion.cpp | 4 ++-- Tactical/Handle UI.cpp | 45 ++++++++++++++++++++++++++++++++++++- Tactical/opplist.cpp | 50 +++++++++++++++++++++++++----------------- 3 files changed, 76 insertions(+), 23 deletions(-) diff --git a/GameVersion.cpp b/GameVersion.cpp index 0e591704..b5ef233a 100644 --- a/GameVersion.cpp +++ b/GameVersion.cpp @@ -55,8 +55,8 @@ #endif -CHAR8 czVersionNumber[16] = { "Build 18.16.10" }; //YY.MM.DD +CHAR8 czVersionNumber[16] = { "Build 18.30.10" }; //YY.MM.DD CHAR16 zTrackingNumber[16] = { L"Z" }; -CHAR16 zRevisionNumber[16] = { L"Revision 8629" }; +CHAR16 zRevisionNumber[16] = { L"Revision 8630" }; // SAVE_GAME_VERSION is defined in header, change it there diff --git a/Tactical/Handle UI.cpp b/Tactical/Handle UI.cpp index b1b59ed0..a16e5969 100644 --- a/Tactical/Handle UI.cpp +++ b/Tactical/Handle UI.cpp @@ -97,6 +97,7 @@ #include "Options Screen.h" #include "SaveLoadScreen.h" #include "Map Screen Interface.h" // added by Flugente for SquadNames +#include "Keys.h" // added by silversurfer for door handling from the side ////////////////////////////////////////////////////////////////////////////// // SANDRO - In this file, all APBPConstants[AP_CROUCH] and APBPConstants[AP_PRONE] were changed to GetAPsCrouch() and GetAPsProne() @@ -2181,8 +2182,50 @@ UINT32 UIHandleCMoveMerc( UI_EVENT *pUIEvent ) // Set dest gridno sDestGridNo = sActionGridNo; + // silversurfer: we allow opening unlocked doors from the side so our mercs are not turned into Swiss cheese, hopefully... + bool bSideOpenDoor = false; + + // sliding doors have only one action tile so if we want to be able to open them from both ends we need to allow 2 tiles max distance + if ( pStructure->fFlags & STRUCTURE_ANYDOOR && PythSpacesAway( pSoldier->sGridNo, sDestGridNo ) <= 2 ) + { + DOOR *pDoor = FindDoorInfoAtGridNo( FindDoorAtGridNoOrAdjacent( sIntTileGridNo ) ); + + // Simple doors without properties will not be found by FindDoorInfoAtGridNo. We only allow those and unlocked doors to be opened from the side. + if ( !pDoor || (pDoor && !pDoor->fLocked) ) + { + //make sure the merc is actually at the wall and next to the door + switch( pStructure->ubWallOrientation ) + { + // orientation NW - SE + case INSIDE_TOP_LEFT: + if ( (sDestGridNo - pSoldier->sGridNo == 1) || (pSoldier->sGridNo - sDestGridNo == 1) || + ( pStructure->fFlags & STRUCTURE_SLIDINGDOOR && sDestGridNo - pSoldier->sGridNo == 2) ) + bSideOpenDoor = true; + break; + // orientation SW - NE + case INSIDE_TOP_RIGHT: + if ( (sDestGridNo - pSoldier->sGridNo == WORLD_COLS) || (pSoldier->sGridNo - sDestGridNo == WORLD_COLS) || + ( pStructure->fFlags & STRUCTURE_SLIDINGDOOR && sDestGridNo - pSoldier->sGridNo == WORLD_COLS *2) ) + bSideOpenDoor = true; + break; + // orientation NW - SE + case OUTSIDE_TOP_LEFT: + if ( (sDestGridNo - pSoldier->sGridNo == 1) || (pSoldier->sGridNo - sDestGridNo == 1) || + ( pStructure->fFlags & STRUCTURE_SLIDINGDOOR && sDestGridNo - pSoldier->sGridNo == 2) ) + bSideOpenDoor = true; + break; + // orientation SW - NE + case OUTSIDE_TOP_RIGHT: + if ( (sDestGridNo - pSoldier->sGridNo == WORLD_COLS) || (pSoldier->sGridNo - sDestGridNo == WORLD_COLS) || + ( pStructure->fFlags & STRUCTURE_SLIDINGDOOR && sDestGridNo - pSoldier->sGridNo == WORLD_COLS *2) ) + bSideOpenDoor = true; + break; + } + } + } + // check if we are at this location - if ( pSoldier->sGridNo == sDestGridNo ) + if ( pSoldier->sGridNo == sDestGridNo || bSideOpenDoor ) { StartInteractiveObject( sIntTileGridNo, pStructure->usStructureID, pSoldier, ubDirection ); InteractWithInteractiveObject( pSoldier, pStructure, ubDirection ); diff --git a/Tactical/opplist.cpp b/Tactical/opplist.cpp index de202e64..659f1cb6 100644 --- a/Tactical/opplist.cpp +++ b/Tactical/opplist.cpp @@ -6412,6 +6412,9 @@ void HearNoise(SOLDIERTYPE *pSoldier, UINT8 ubNoiseMaker, INT32 sGridNo, INT8 bL } // DebugMsg( TOPIC_JA2, DBG_LEVEL_3, String( "%d hears noise from %d (%d/%d) volume %d", pSoldier->ubID, ubNoiseMaker, sGridNo, bLevel, ubVolume ) ); + // sevenfm: scale ubVolume to remember noise + UINT8 ubVolumeScaled = (UINT8)sqrt((float)ubVolume); + // "Turn head" towards the source of the noise and try to see what's there // don't use DistanceVisible here, but use maximum visibility distance @@ -6527,6 +6530,16 @@ void HearNoise(SOLDIERTYPE *pSoldier, UINT8 ubNoiseMaker, INT32 sGridNo, INT8 bL } } } + // sevenfm: remember noise even for seen opponents + if( pSoldier->flags.uiStatusFlags & SOLDIER_PC && ubVolumeScaled > pSoldier->aiData.ubNoiseVolume ) + { + // yes it is, so remember this noise INSTEAD (old noise is forgotten) + pSoldier->aiData.sNoiseGridno = sGridNo; + pSoldier->bNoiseLevel = bLevel; + + // no matter how loud noise was, don't remember it for more than 12 turns! + pSoldier->aiData.ubNoiseVolume = min(ubVolumeScaled, MAX_MISC_NOISE_DURATION); + } } else // noise maker still can't be seen @@ -6552,21 +6565,14 @@ void HearNoise(SOLDIERTYPE *pSoldier, UINT8 ubNoiseMaker, INT32 sGridNo, INT8 bL // ubnoisemaker, leaving the 'seen' flag FALSE. See ProcessNoise(). // CJC: set the noise gridno for the soldier, if appropriate - this is what is looked at by the AI! - if (ubVolume >= pSoldier->aiData.ubNoiseVolume) + if (ubVolumeScaled >= pSoldier->aiData.ubNoiseVolume) { // yes it is, so remember this noise INSTEAD (old noise is forgotten) pSoldier->aiData.sNoiseGridno = sGridNo; pSoldier->bNoiseLevel = bLevel; - // no matter how loud noise was, don't remember it for than 12 turns! - if (ubVolume < MAX_MISC_NOISE_DURATION) - { - pSoldier->aiData.ubNoiseVolume = ubVolume; - } - else - { - pSoldier->aiData.ubNoiseVolume = MAX_MISC_NOISE_DURATION; - } + // no matter how loud noise was, don't remember it for more than 12 turns! + pSoldier->aiData.ubNoiseVolume = min(ubVolumeScaled, MAX_MISC_NOISE_DURATION); SetNewSituation( pSoldier ); // force a fresh AI decision to be made } @@ -6667,21 +6673,14 @@ void HearNoise(SOLDIERTYPE *pSoldier, UINT8 ubNoiseMaker, INT32 sGridNo, INT8 bL { // check if the effective volume of this new noise is greater than or at // least equal to the volume of the currently noticed noise stored - if (ubVolume >= pSoldier->aiData.ubNoiseVolume) + if (ubVolumeScaled >= pSoldier->aiData.ubNoiseVolume) { // yes it is, so remember this noise INSTEAD (old noise is forgotten) pSoldier->aiData.sNoiseGridno = sGridNo; pSoldier->bNoiseLevel = bLevel; - // no matter how loud noise was, don't remember it for than 12 turns! - if (ubVolume < MAX_MISC_NOISE_DURATION) - { - pSoldier->aiData.ubNoiseVolume = ubVolume; - } - else - { - pSoldier->aiData.ubNoiseVolume = MAX_MISC_NOISE_DURATION; - } + // no matter how loud noise was, don't remember it for more than 12 turns! + pSoldier->aiData.ubNoiseVolume = min(ubVolumeScaled, MAX_MISC_NOISE_DURATION); SetNewSituation( pSoldier ); // force a fresh AI decision to be made } @@ -6690,6 +6689,17 @@ void HearNoise(SOLDIERTYPE *pSoldier, UINT8 ubNoiseMaker, INT32 sGridNo, INT8 bL // if listener sees the source of the noise, AND it's either a grenade, // or it's a rock that he watched land (didn't need to turn) { + // sevenfm: allow player mercs to hear all noises + if ( pSoldier->flags.uiStatusFlags & SOLDIER_PC && ubVolumeScaled > pSoldier->aiData.ubNoiseVolume) + { + // yes it is, so remember this noise INSTEAD (old noise is forgotten) + pSoldier->aiData.sNoiseGridno = sGridNo; + pSoldier->bNoiseLevel = bLevel; + + // no matter how loud noise was, don't remember it for more than 12 turns! + pSoldier->aiData.ubNoiseVolume = min(ubVolumeScaled, MAX_MISC_NOISE_DURATION); + } + SetNewSituation( pSoldier ); // re-evaluate situation // if status is only GREEN or YELLOW