From 6aa4e1e6c6b8bf69ed2b95f79776e873b3f684e3 Mon Sep 17 00:00:00 2001 From: Flugente Date: Sat, 25 Jul 2015 12:49:37 +0000 Subject: [PATCH] New background property: if is set, enemy CTH is modified if they fire on us while we are crouched against thick cover (size >= 2) in the direction of the shot. Backgrounds.xml tag was added in GameDir r2267. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7933 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- GameVersion.cpp | 18 ++++++------- Laptop/IMP Background.cpp | 2 ++ Tactical/Interface.h | 1 + Tactical/Soldier Control.cpp | 51 ++++++++++++++++++++++++++++++++++++ Tactical/Soldier Control.h | 3 +++ Tactical/Weapons.cpp | 18 +++++++++++++ Tactical/XML_Background.cpp | 6 +++++ Utils/_ChineseText.cpp | 1 + Utils/_DutchText.cpp | 1 + Utils/_EnglishText.cpp | 1 + Utils/_FrenchText.cpp | 1 + Utils/_GermanText.cpp | 1 + Utils/_ItalianText.cpp | 1 + Utils/_PolishText.cpp | 1 + Utils/_RussianText.cpp | 1 + 15 files changed, 98 insertions(+), 9 deletions(-) diff --git a/GameVersion.cpp b/GameVersion.cpp index cfbf2ca4..a54192a5 100644 --- a/GameVersion.cpp +++ b/GameVersion.cpp @@ -15,9 +15,9 @@ #ifdef JA2EDITOR #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Unfinished Business - Map Editor v1.13.7917 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Unfinished Business - Map Editor v1.13.7933 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.7917 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Map Editor v1.13.7933 (Development Build)" }; #endif // ------------------------------ @@ -27,11 +27,11 @@ //DEBUG BUILD VERSION #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Debug: Unfinished Business - v1.13.7917 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: Unfinished Business - v1.13.7933 (Development Build)" }; #elif defined (JA113DEMO) - CHAR16 zVersionLabel[256] = { L"Debug: JA2 Demo - v1.13.7917 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: JA2 Demo - v1.13.7933 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Debug: v1.13.7917 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Debug: v1.13.7933 (Development Build)" }; #endif #elif defined CRIPPLED_VERSION @@ -46,16 +46,16 @@ //RELEASE BUILD VERSION #ifdef JA2UB - CHAR16 zVersionLabel[256] = { L"Release Unfinished Business - v1.13.7917 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release Unfinished Business - v1.13.7933 (Development Build)" }; #elif defined (JA113DEMO) - CHAR16 zVersionLabel[256] = { L"Release JA2 Demo - v1.13.7917 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release JA2 Demo - v1.13.7933 (Development Build)" }; #else - CHAR16 zVersionLabel[256] = { L"Release v1.13.7917 (Development Build)" }; + CHAR16 zVersionLabel[256] = { L"Release v1.13.7933 (Development Build)" }; #endif #endif -CHAR8 czVersionNumber[16] = { "Build 15.07.14" }; //YY.MM.DD +CHAR8 czVersionNumber[16] = { "Build 15.07.25" }; //YY.MM.DD CHAR16 zTrackingNumber[16] = { L"Z" }; // SAVE_GAME_VERSION is defined in header, change it there diff --git a/Laptop/IMP Background.cpp b/Laptop/IMP Background.cpp index 3dd6246e..cc729654 100644 --- a/Laptop/IMP Background.cpp +++ b/Laptop/IMP Background.cpp @@ -512,7 +512,9 @@ void AssignBackgroundHelpText( UINT16 ubNumber, MOUSE_REGION* pMouseregion ) else swprintf( atStr, szBackgroundText_Value[strused + 1] ); + wcscat( apStr, L" " ); wcscat( apStr, atStr ); + wcscat( apStr, L"\n" ); // smoke has 2 texts, so extra increase of counter is needed ++strused; diff --git a/Tactical/Interface.h b/Tactical/Interface.h index d495fd09..c55b2bf6 100644 --- a/Tactical/Interface.h +++ b/Tactical/Interface.h @@ -194,6 +194,7 @@ enum { BG_DISLIKEBG, // dislike any other background that has the negative of this value set BG_SMOKERTYPE, // 0: doesnt care about smoking 1: will consume cigarettes, dislikes non-smokers 2: will refuse to smoke, dislikes smokers + BG_CROUCHEDDEFENSE, // lowers enemy cth if they fire at us while we are crouched against cover in the direction the shots come from BG_MAX, }; diff --git a/Tactical/Soldier Control.cpp b/Tactical/Soldier Control.cpp index 860a5e6a..4c42960a 100644 --- a/Tactical/Soldier Control.cpp +++ b/Tactical/Soldier Control.cpp @@ -19049,6 +19049,57 @@ FLOAT SOLDIERTYPE::GetBodyWeight() return 80.0f; } +// Flugente: are we crouched against cover from a specific direction? WARNING: This does not suffice to determine our cover! +BOOLEAN SOLDIERTYPE::IsCrouchedAgainstCoverFromDir( UINT8 aDirection ) +{ + // we must be active + if ( !bActive ) + return FALSE; + + // only valid directions, please + if ( aDirection >= NUM_WORLD_DIRECTIONS ) + return FALSE; + + // only possible if crouched + if ( gAnimControl[this->usAnimState].ubEndHeight != ANIM_CROUCH ) + return FALSE; + + // we must be in a sector + if ( !bInSector ) + return FALSE; + + // this is odd - invalid GridNo... + if ( TileIsOutOfBounds( this->sGridNo ) ) + return FALSE; + + // not in a car... + if ( this->flags.uiStatusFlags & (SOLDIER_DRIVER | SOLDIER_PASSENGER) ) + return FALSE; + + // we test whether we are crouched against cover in a specific direction, so determine the gridno to test + INT32 covergridno = NewGridNo( this->sGridNo, DirectionInc( aDirection ) ); + + // this is odd - invalid GridNo... + if ( TileIsOutOfBounds( covergridno ) ) + return FALSE; + + // people don't count + if ( WhoIsThere2( covergridno, this->pathing.bLevel ) != NOBODY ) + return FALSE; + + // if we can sit there, then it's obviously not dense enough to for us to cover againt it + if ( IsLocationSittable( covergridno, this->pathing.bLevel ) ) + return FALSE; + + INT8 adjacenttileheight = GetTallestStructureHeight( covergridno, this->pathing.bLevel ); + + if ( adjacenttileheight >= 2 ) + return TRUE; + + return FALSE; +} + + INT32 CheckBleeding( SOLDIERTYPE *pSoldier ) { INT8 bBandaged; //,savedOurTurn; diff --git a/Tactical/Soldier Control.h b/Tactical/Soldier Control.h index 855c5c5c..a704a71f 100644 --- a/Tactical/Soldier Control.h +++ b/Tactical/Soldier Control.h @@ -1910,6 +1910,9 @@ public: // Flugente: assumed character weight (without any items) FLOAT GetBodyWeight(); + + // Flugente: are we crouched against cover from a specific direction? WARNING: This does not suffice to determine our cover! + BOOLEAN IsCrouchedAgainstCoverFromDir( UINT8 aDirection ); ////////////////////////////////////////////////////////////////////////////// }; // SOLDIERTYPE; diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 59dbf540..bccfde6f 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -7255,6 +7255,15 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime, } } + // Flugente: backgrounds + if ( pTarget && pTarget->GetBackgroundValue( BG_CROUCHEDDEFENSE ) ) + { + if ( pTarget->IsCrouchedAgainstCoverFromDir( GetDirectionFromGridNo( pSoldier->sGridNo, pTarget ) ) ) + { + iChance += pTarget->GetBackgroundValue( BG_CROUCHEDDEFENSE ); + } + } + // Flugente: check for scope mode if ( Item[(&(pSoldier->inv[pSoldier->ubAttackingHand]))->usItem].usItemClass == IC_GUN && !pSoldier->IsValidAlternativeFireMode( ubAimTime, sGridNo ) ) { @@ -13023,6 +13032,15 @@ FLOAT CalcNewChanceToHitBaseTargetBonus(SOLDIERTYPE *pSoldier, SOLDIERTYPE *pTar // Target has high Agility or Experience and is therefore harder to hit FLOAT fTempPenalty = (FLOAT)__max((pTarget->stats.bExpLevel*10), pTarget->stats.bAgility); fBaseModifier += (fTempPenalty * gGameCTHConstants.BASE_AGILE_TARGET) / 100; + + // Flugente: backgrounds + if ( pTarget->GetBackgroundValue( BG_CROUCHEDDEFENSE ) ) + { + if ( pTarget->IsCrouchedAgainstCoverFromDir( GetDirectionFromGridNo( pSoldier->sGridNo, pTarget ) ) ) + { + fBaseModifier += pTarget->GetBackgroundValue( BG_CROUCHEDDEFENSE ); + } + } } // INVIS TARGET diff --git a/Tactical/XML_Background.cpp b/Tactical/XML_Background.cpp index f62245de..d213a0f4 100644 --- a/Tactical/XML_Background.cpp +++ b/Tactical/XML_Background.cpp @@ -131,6 +131,7 @@ backgroundStartElementHandle(void *userData, const XML_Char *name, const XML_Cha strcmp(name, "ambush_radius" ) == 0 || strcmp(name, "dislikebackground" ) == 0 || strcmp(name, "smoker" ) == 0 || + strcmp(name, "croucheddefense" ) == 0 || strcmp(name, "druguse") == 0 || strcmp(name, "xenophobic") == 0 || strcmp(name, "corruptionspread") == 0 || @@ -555,6 +556,11 @@ backgroundEndElementHandle(void *userData, const XML_Char *name) pData->curElement = ELEMENT; pData->curBackground.value[BG_SMOKERTYPE] = min( 2, max( 0, (INT16)atol( pData->szCharData ) ) ); } + else if ( strcmp( name, "croucheddefense" ) == 0 ) + { + pData->curElement = ELEMENT; + pData->curBackground.value[BG_CROUCHEDDEFENSE] = min( 30, max( -30, (INT16)atol( pData->szCharData ) ) ); + } else if(strcmp(name, "druguse") == 0) { pData->curElement = ELEMENT; diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index 5f9bca04..dacd62c3 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -8283,6 +8283,7 @@ STR16 szBackgroundText_Value[]= L" dislikes some other backgrounds\n", // TODO.Translate L"Smoker", L"Nonsmoker", + L" %s%d%% enemy CTH if crouched against thick cover in their direction\n", }; STR16 szBackgroundTitleText[] = diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index cb62658a..8c28f87b 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -8296,6 +8296,7 @@ STR16 szBackgroundText_Value[]= L" dislikes some other backgrounds\n", // TODO.Translate L"Smoker", L"Nonsmoker", + L" %s%d%% enemy CTH if crouched against thick cover in their direction\n", }; STR16 szBackgroundTitleText[] = // TODO.Translate diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 16c987a9..6cd0ef5c 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -8281,6 +8281,7 @@ STR16 szBackgroundText_Value[]= L" dislikes some other backgrounds\n", L"Smoker", L"Nonsmoker", + L" %s%d%% enemy CTH if crouched against thick cover in their direction\n", }; STR16 szBackgroundTitleText[] = diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index a0ea5fe1..97335db8 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -8282,6 +8282,7 @@ STR16 szBackgroundText_Value[]= L" dislikes some other backgrounds\n", // TODO.Translate L"Smoker", L"Nonsmoker", + L" %s%d%% enemy CTH if crouched against thick cover in their direction\n", }; STR16 szBackgroundTitleText[] = diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index 67d8cb49..024defd5 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -8113,6 +8113,7 @@ STR16 szBackgroundText_Value[]= L" dislikes some other backgrounds\n", // TODO.Translate L"Smoker", L"Nonsmoker", + L" %s%d%% enemy CTH if crouched against thick cover in their direction\n", }; STR16 szBackgroundTitleText[] = // TODO.Translate diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 530876d7..b6d7ca4c 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -8291,6 +8291,7 @@ STR16 szBackgroundText_Value[]= L" dislikes some other backgrounds\n", // TODO.Translate L"Smoker", L"Nonsmoker", + L" %s%d%% enemy CTH if crouched against thick cover in their direction\n", }; STR16 szBackgroundTitleText[] = // TODO.Translate diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index 5831f78e..1465d1bc 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -8308,6 +8308,7 @@ STR16 szBackgroundText_Value[]= L" dislikes some other backgrounds\n", // TODO.Translate L"Smoker", L"Nonsmoker", + L" %s%d%% enemy CTH if crouched against thick cover in their direction\n", }; STR16 szBackgroundTitleText[] = // TODO.Translate diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index bce758f0..6d184a9c 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -8281,6 +8281,7 @@ STR16 szBackgroundText_Value[]= L" dislikes some other backgrounds\n", // TODO.Translate L"Smoker", L"Nonsmoker", + L" %s%d%% enemy CTH if crouched against thick cover in their direction\n", }; STR16 szBackgroundTitleText[] =