diff --git a/GameVersion.cpp b/GameVersion.cpp index cfbf2ca41..a54192a50 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 3dd6246e3..cc729654f 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 d495fd097..c55b2bf68 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 860a5e6a7..4c42960a8 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 855c5c5c1..a704a71f8 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 59dbf540c..bccfde6f6 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 f62245de1..d213a0f49 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 5f9bca044..dacd62c3d 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 cb62658af..8c28f87b5 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 16c987a91..6cd0ef5c2 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 a0ea5fe1d..97335db8b 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 67d8cb491..024defd53 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 530876d74..b6d7ca4cf 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 5831f78e0..1465d1bce 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 bce758f08..6d184a9ca 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[] =