From 69f4b2cf34deaa36e46a0270f4c78eeb2843cdca Mon Sep 17 00:00:00 2001 From: Flugente Date: Sat, 15 Mar 2014 17:54:04 +0000 Subject: [PATCH] - New feature: Ammotype flag AMMO_ANTIMATERIEL (4) gives bullets the ability to destroy walls and other structures. - Fix: SoldierToSoldierLineOfSightTest was called against NOBODY git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@7069 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/Bullets.h | 1 + Tactical/Interface Enhanced.cpp | 16 ++++++++++ Tactical/LOS.cpp | 22 ++++++++++++++ Tactical/Weapons.cpp | 33 ++++++++++++-------- Tactical/Weapons.h | 4 +-- TileEngine/structure.cpp | 53 ++++++++++++++++++++++----------- TileEngine/structure.h | 2 +- Utils/Text.h | 4 +-- Utils/_ChineseText.cpp | 2 ++ Utils/_DutchText.cpp | 2 ++ Utils/_EnglishText.cpp | 2 ++ Utils/_FrenchText.cpp | 2 ++ Utils/_GermanText.cpp | 2 ++ Utils/_ItalianText.cpp | 2 ++ Utils/_PolishText.cpp | 2 ++ Utils/_RussianText.cpp | 2 ++ Utils/_TaiwaneseText.cpp | 2 ++ 17 files changed, 118 insertions(+), 35 deletions(-) diff --git a/Tactical/Bullets.h b/Tactical/Bullets.h index 44c70a0f..9b30a120 100644 --- a/Tactical/Bullets.h +++ b/Tactical/Bullets.h @@ -16,6 +16,7 @@ #define BULLET_FLAG_BUCKSHOT 0x0040 #define BULLET_FLAG_FLAME 0x0080 #define BULLET_FLAG_TRACER 0x0100 +#define BULLET_FLAG_ANTIMATERIEL 0x0200 // Flugente: bullet can destroy structures //afp-start calculate line points between two point #define BULLET_TRACER_MAX_LENGTH 60 diff --git a/Tactical/Interface Enhanced.cpp b/Tactical/Interface Enhanced.cpp index bff82a46..7e95592b 100644 --- a/Tactical/Interface Enhanced.cpp +++ b/Tactical/Interface Enhanced.cpp @@ -2378,6 +2378,15 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + cnt ] ); cnt++; } + + ////////////////// ANTI-MATERIEL AMMO + if ( AmmoTypes[Magazine[Item[ gpItemDescObject->usItem ].ubClassIndex].ubAmmoType].ammoflag & AMMO_ANTIMATERIEL ) + { + swprintf( pStr, L"%s%s", szUDBGenSecondaryStatsTooltipText[ 37 ], szUDBGenSecondaryStatsExplanationsTooltipText[ 37 ]); + SetRegionFastHelpText( &(gUDBFasthelpRegions[ iFirstDataRegion + cnt ]), pStr ); + MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + cnt ] ); + cnt++; + } } if (Item[ gpItemDescObject->usItem ].usItemClass & IC_EXPLOSV) @@ -5724,6 +5733,13 @@ void DrawSecondaryStats( OBJECTTYPE * gpItemDescObject ) BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoSecondaryIcon, 4, gItemDescGenSecondaryRegions[cnt].sLeft+sOffsetX, gItemDescGenSecondaryRegions[cnt].sTop+sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL ); cnt++; } + + ////////////////// ANTI-MATERIEL AMMO + if ( AmmoTypes[Magazine[Item[ gpItemDescObject->usItem ].ubClassIndex].ubAmmoType].ammoflag & AMMO_ANTIMATERIEL ) + { + BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoSecondaryIcon, 36, gItemDescGenSecondaryRegions[cnt].sLeft+sOffsetX, gItemDescGenSecondaryRegions[cnt].sTop+sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL ); + cnt++; + } } if (Item[ gpItemDescObject->usItem ].usItemClass & (IC_EXPLOSV)) diff --git a/Tactical/LOS.cpp b/Tactical/LOS.cpp index efe4dbb7..397b8184 100644 --- a/Tactical/LOS.cpp +++ b/Tactical/LOS.cpp @@ -4442,6 +4442,10 @@ INT8 FireBulletGivenTargetNCTH( SOLDIERTYPE * pFirer, FLOAT dEndX, FLOAT dEndY, fTracer = TRUE; } + // Flugente: anti-materiel ammo + if ( AmmoTypes[(*pObjAttHand)[0]->data.gun.ubGunAmmoType].ammoflag & AMMO_ANTIMATERIEL ) + usBulletFlags |= BULLET_FLAG_ANTIMATERIEL; + ubImpact =(UINT8) GetDamage(&pFirer->inv[pFirer->ubAttackingHand]); //zilpin: Begin new code block for spread patterns, number of projectiles, impact adjustment, etc. { @@ -4922,6 +4926,10 @@ INT8 FireBulletGivenTarget( SOLDIERTYPE * pFirer, FLOAT dEndX, FLOAT dEndY, FLOA fTracer = TRUE; } + // Flugente: anti-materiel ammo + if ( AmmoTypes[ pFirer->inv[pFirer->ubAttackingHand][0]->data.gun.ubGunAmmoType ].ammoflag & AMMO_ANTIMATERIEL ) + usBulletFlags |= BULLET_FLAG_ANTIMATERIEL; + ubImpact =(UINT8) GetDamage(pObjAttHand); //zilpin: pellet spread patterns externalized in XML /* zilpin: The section below, including line comments, is the original adjustment made to multiple projectile stats. @@ -5573,6 +5581,10 @@ INT8 FireBulletGivenTargetTrapOnly( SOLDIERTYPE* pThrower, OBJECTTYPE* pObj, INT ubSpreadIndex = 2; } + // Flugente: anti-materiel ammo + if ( AmmoTypes[(*pObj)[0]->data.gun.ubGunAmmoType].ammoflag & AMMO_ANTIMATERIEL ) + usBulletFlags |= BULLET_FLAG_ANTIMATERIEL; + // no option to use fire bursts or autofire yet /*// HEADROCK HAM B2.5: Set tracer effect on/off for individual bullets in a Tracer Magazine, as part of the // New Tracer System. @@ -6872,6 +6884,16 @@ void MoveBullet( INT32 iBullet ) // play animation to indicate structure being hit BulletHitStructure( pBullet, pStructure->usStructureID, 1, pBullet->qCurrX, pBullet->qCurrY, pBullet->qCurrZ, FALSE ); gubLocalStructureNumTimesHit[iStructureLoop] = 1; + + // Flugente: anti-materiel rifles have to be handled slightly different - we have to remove the bullet after impact. + // Otherwise we might destroy a structure, but this function won't 'realize' it, leading to invalid memory access + if ( pBullet->usFlags & BULLET_FLAG_ANTIMATERIEL ) + { + // Moved here to keep ABC >0 as long as possible + RemoveBullet( iBullet ); + // ReduceAttackBusyCount( ); + return; + } } } } diff --git a/Tactical/Weapons.cpp b/Tactical/Weapons.cpp index 31770e46..14a903ae 100644 --- a/Tactical/Weapons.cpp +++ b/Tactical/Weapons.cpp @@ -728,7 +728,7 @@ weaponEndElementHandle(void *userData, const XML_Char *name) pData->curElement = WEAPON_ELEMENT_WEAPON; pData->curWeapon.HeavyGun = (BOOLEAN) atof(pData->szCharData); } - + pData->maxReadDepth--; } @@ -896,16 +896,16 @@ BOOLEAN WriteWeaponStats() FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].APsToReload); FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].swapClips ); FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].maxdistformessydeath); - FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].AutoPenalty); - FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].NoSemiAuto); + FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].AutoPenalty); + FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].NoSemiAuto); FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].ubAimLevels ); - FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].EasyUnjam); - FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].ubHandling); + FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].EasyUnjam); + FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].ubHandling); FilePrintf(hFile,"\t\t%4.2f\r\n", Weapon[cnt].usOverheatingJamThreshold); // Flugente FTW 1 FilePrintf(hFile,"\t\t%4.2f\r\n", Weapon[cnt].usOverheatingDamageThreshold); FilePrintf(hFile,"\t\t%4.2f\r\n", Weapon[cnt].usOverheatingSingleShotTemperature); - FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].HeavyGun); - + FilePrintf(hFile,"\t\t%d\r\n", Weapon[cnt].HeavyGun); + FilePrintf(hFile,"\t\r\n"); } @@ -4661,7 +4661,7 @@ void StructureHit( INT32 iBullet, UINT16 usWeaponIndex, INT16 bWeaponStatus, UIN { pStructure = FindStructureByID( sGridNo, usStructureID ); - DamageStructure( pStructure, (UINT8)iImpact, STRUCTURE_DAMAGE_GUNFIRE, sGridNo, sXPos, sYPos, ubAttackerID ); + DamageStructure( pStructure, (UINT8)iImpact, STRUCTURE_DAMAGE_GUNFIRE, sGridNo, sXPos, sYPos, ubAttackerID, pBullet->usFlags & BULLET_FLAG_ANTIMATERIEL ? pBullet->iImpact - pBullet->iImpactReduction : 0 ); } // HEADROCK HAM 5: Fragments are not fired from guns, so they need a special case. @@ -6784,21 +6784,28 @@ UINT32 CalcChanceToHitGun(SOLDIERTYPE *pSoldier, INT32 sGridNo, INT16 ubAimTime, sDistVis = pSoldier->GetMaxDistanceVisible(sGridNo, pSoldier->bTargetLevel, CALC_FROM_ALL_DIRS ) * CELL_X_SIZE; iScopeVisionRangeBonus = GetTotalVisionRangeBonus(pSoldier, bLightLevel); // not an actual range value, simply a modifier for range calculations + if (ubTargetID != NOBODY && pSoldier->aiData.bOppList[ubTargetID] == SEEN_CURRENTLY || gbPublicOpplist[pSoldier->bTeam][ubTargetID] == SEEN_CURRENTLY) iSightRange = SoldierToSoldierLineOfSightTest( pSoldier, MercPtrs[ubTargetID], TRUE, NO_DISTANCE_LIMIT, pSoldier->bAimShotLocation, false ); - if (iSightRange == 0) { // didn't do a bodypart-based test or can't see specific body part aimed at + + if (iSightRange == 0) + { + // didn't do a bodypart-based test or can't see specific body part aimed at iSightRange = SoldierTo3DLocationLineOfSightTest( pSoldier, sGridNo, pSoldier->bTargetLevel, pSoldier->bTargetCubeLevel, TRUE, NO_DISTANCE_LIMIT, false ); fCoverObscured = true; } - if (iSightRange == 0) { // Can't see the target but we still need to know what the sight range would be if we could so we can deal with cover penalties + + if (ubTargetID != NOBODY && iSightRange == 0 ) + { // Can't see the target but we still need to know what the sight range would be if we could so we can deal with cover penalties iSightRange = SoldierToSoldierLineOfSightTest( pSoldier, MercPtrs[ubTargetID], TRUE, NO_DISTANCE_LIMIT, pSoldier->bAimShotLocation, false, true ); fCantSeeTarget = true; fCoverObscured = false; } - gbForceWeaponReady = false; - gbForceWeaponNotReady = true; + + gbForceWeaponReady = false; + gbForceWeaponNotReady = true; sDistVisNoScope = pSoldier->GetMaxDistanceVisible(sGridNo, pSoldier->bTargetLevel, CALC_FROM_ALL_DIRS ) * CELL_X_SIZE; - gbForceWeaponNotReady = false; + gbForceWeaponNotReady = false; // Flugente: blind soldiers have sDistVisNoScope = 0... if ( sDistVisNoScope ) diff --git a/Tactical/Weapons.h b/Tactical/Weapons.h index b943c26d..2dc7ec9b 100644 --- a/Tactical/Weapons.h +++ b/Tactical/Weapons.h @@ -178,8 +178,8 @@ enum // flags used for various ammo properties (easier than adding 32 differently named variables). DO NOT CHANGE THEM, UNLESS YOU KNOW WHAT YOU ARE DOING!!! #define AMMO_NEUROTOXIN 0x00000001 //1 // this ammo adds the cyanide drug effect to its target, killing it in a few turns #define AMMO_BLIND 0x00000002 //2 // this ammo will blind if it hits the head -/*#define SHOVEL 0x00000004 //4 -#define CONCERTINA 0x00000008 //8 +#define AMMO_ANTIMATERIEL 0x00000004 //4 // this ammo is anti-materiel, bullets can destroy structures +/*#define CONCERTINA 0x00000008 //8 #define WATER_DRUM 0x00000010 //16 // water drums allow to refill canteens in the sector they are in #define MEAT_BLOODCAT 0x00000020 //32 // retrieve this by gutting a bloodcat diff --git a/TileEngine/structure.cpp b/TileEngine/structure.cpp index 1139bc8d..f8f92ddc 100644 --- a/TileEngine/structure.cpp +++ b/TileEngine/structure.cpp @@ -40,6 +40,7 @@ #include "Random.h" #include "Tile Animation.h" + #include "Explosion Control.h" // added by Flugente #endif #ifdef COUNT_PATHS @@ -1674,14 +1675,12 @@ BOOLEAN StructureDensity( STRUCTURE * pStructure, UINT8 * pubLevel0, UINT8 * pub return( TRUE ); } -BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, INT32 sGridNo, INT16 sX, INT16 sY, UINT8 ubOwner ) +BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, INT32 sGridNo, INT16 sX, INT16 sY, UINT8 ubOwner, INT32 sAntiMaterialImpact ) { // do damage to a structure; returns TRUE if the structure should be removed - STRUCTURE *pBase; - UINT8 ubArmour; - //LEVELNODE *pNode; - + UINT8 ubArmour; + CHECKF( pStructure ); if (pStructure->fFlags & STRUCTURE_PERSON || pStructure->fFlags & STRUCTURE_CORPSE) { @@ -1694,16 +1693,18 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, return( FALSE ); } + UINT8 ubBaseArmour = gubMaterialArmour[ pStructure->pDBStructureRef->pDBStructure->ubArmour ]; + // Account for armour! if (ubReason == STRUCTURE_DAMAGE_EXPLOSION) { if ( pStructure->fFlags & STRUCTURE_EXPLOSIVE ) { - ubArmour = gubMaterialArmour[ pStructure->pDBStructureRef->pDBStructure->ubArmour ] / 3; + ubArmour = ubBaseArmour / 3; } else { - ubArmour = gubMaterialArmour[ pStructure->pDBStructureRef->pDBStructure->ubArmour ] / 2; + ubArmour = ubBaseArmour / 2; } if (ubArmour > ubDamage) @@ -1753,19 +1754,37 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, } // Make hit sound.... - if ( pStructure->fFlags & STRUCTURE_CAVEWALL ) - { - PlayJA2Sample( S_VEG_IMPACT1, RATE_11025, SoundVolume( HIGHVOLUME, sGridNo ), 1, SoundDir( sGridNo ) ); - } - else - { - if ( guiMaterialHitSound[ pStructure->pDBStructureRef->pDBStructure->ubArmour ] != -1 ) + if ( pStructure->fFlags & STRUCTURE_CAVEWALL ) { - PlayJA2Sample( guiMaterialHitSound[ pStructure->pDBStructureRef->pDBStructure->ubArmour ], RATE_11025, SoundVolume( HIGHVOLUME, sGridNo ), 1, SoundDir( sGridNo ) ); + PlayJA2Sample( S_VEG_IMPACT1, RATE_11025, SoundVolume( HIGHVOLUME, sGridNo ), 1, SoundDir( sGridNo ) ); } - } + else + { + if ( guiMaterialHitSound[ pStructure->pDBStructureRef->pDBStructure->ubArmour ] != -1 ) + { + PlayJA2Sample( guiMaterialHitSound[ pStructure->pDBStructureRef->pDBStructure->ubArmour ], RATE_11025, SoundVolume( HIGHVOLUME, sGridNo ), 1, SoundDir( sGridNo ) ); + } + } + + // Flugente: anti-material rifles can damage and even destroy structures, but some structures remain indestructible (otherwise the player might gain access to inaccessible spots) + // the impact must be damaging enough, otherwise this won't have an effect + if ( ubBaseArmour < 75 && ubBaseArmour > 0 && sAntiMaterialImpact > ubBaseArmour * 5 / 12 ) + { + // we will run into this exact function again. In order to damage the object, we need to do damage of at least half the armour value + INT16 damage = ubBaseArmour / 2; + + // this is the damage we will cause. The higher our damage, the faster can we destroy a structure + damage += max(1, 2 * sAntiMaterialImpact / ubBaseArmour); + + BOOLEAN recompile = FALSE; + 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; + } + // Don't update damage HPs.... - return( TRUE ); + return TRUE; } // OK, LOOK FOR A SAM SITE, UPDATE.... diff --git a/TileEngine/structure.h b/TileEngine/structure.h index 68f16f75..fe1619f3 100644 --- a/TileEngine/structure.h +++ b/TileEngine/structure.h @@ -83,7 +83,7 @@ BOOLEAN AddZStripInfoToVObject( HVOBJECT hVObject, STRUCTURE_FILE_REF * pStructu // FUNCTIONS FOR DETERMINING STUFF THAT BLOCKS VIEW FOR TILE_bASED LOS INT8 GetBlockingStructureInfo( INT32 sGridNo, INT8 bDir, INT8 bNextDir, INT8 bLevel, INT8 *pStructHeight, STRUCTURE ** ppTallestStructure, BOOLEAN fWallsBlock ); -BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, INT32 sGridNo, INT16 sX, INT16 sY, UINT8 ubOwner ); +BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason, INT32 sGridNo, INT16 sX, INT16 sY, UINT8 ubOwner, INT32 sAntiMaterialImpact = 0 ); // Material armour type enumeration enum diff --git a/Utils/Text.h b/Utils/Text.h index 3deb1048..97d177d8 100644 --- a/Utils/Text.h +++ b/Utils/Text.h @@ -715,8 +715,8 @@ extern STR16 szUDBGenExplosiveStatsTooltipText[ 23 ]; // silversurfer Repair extern STR16 szUDBGenExplosiveStatsExplanationsTooltipText[ 23 ]; // silversurfer Repair Ease: 22->23 extern STR16 szUDBGenCommonStatsTooltipText[ 1 ]; // silversurfer new for items that don't fit the other categories extern STR16 szUDBGenCommonStatsExplanationsTooltipText[ 1 ]; // silversurfer new for items that don't fit the other categories -extern STR16 szUDBGenSecondaryStatsTooltipText[ 37 ]; // Flugente Food System: 26 -> 28 external feeding: 28->30 JMich_SkillsModifiers: 31 for Defusal kit - covert item: 31->32 silversurfer more tags: 32->37 -extern STR16 szUDBGenSecondaryStatsExplanationsTooltipText[ 37 ]; // Flugente Food System: 26 -> 28 external feeding: 28->30 JMich_SkillsModifiers: 31 for Defusal kit - covert item: 31->32 silversurfer more tags: 32->37 +extern STR16 szUDBGenSecondaryStatsTooltipText[]; // Flugente Food System: 26 -> 28 external feeding: 28->30 JMich_SkillsModifiers: 31 for Defusal kit - covert item: 31->32 silversurfer more tags: 32->37 +extern STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]; // Flugente Food System: 26 -> 28 external feeding: 28->30 JMich_SkillsModifiers: 31 for Defusal kit - covert item: 31->32 silversurfer more tags: 32->37 extern STR16 szUDBAdvStatsTooltipText[ 66 ]; // Flugente Overheating Weapons: 48->56 poison: 56->57 dirt: 57->58 food:58->64 silversurfer Best Laser Range:64->65 silversurfer PercentRecoilModifier: 66 extern STR16 szUDBAdvStatsExplanationsTooltipText[ 65 ]; // Flugente Overheating Weapons: 48->56 poison: 56->57 dirt: 57->58 food:58->64 silversurfer Best Laser Range:64->65 silversurfer PercentRecoilModifier: 65 extern STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[ 53 ]; // Flugente Overheating Weapons: 48->52 silversurfer Best Laser Range:64->65 silversurfer PercentRecoilModifier: 53 diff --git a/Utils/_ChineseText.cpp b/Utils/_ChineseText.cpp index f9cf977c..df3754ce 100644 --- a/Utils/_ChineseText.cpp +++ b/Utils/_ChineseText.cpp @@ -7564,6 +7564,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]= L"|水|中|下|沉", //L"|S|i|n|k|s", L"|双|手|操|作", //|T|w|o|-|H|a|n|d|e|d", L"|挡|住|准|心", //L"|B|l|o|c|k|s |I|r|o|n |S|i|g|h|t|s", + L"|A|n|t|i|-|M|a|t|e|r|i|a|l |A|m|m|o", // TODO.Translate }; STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= @@ -7605,6 +7606,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= L"\n \n这个物品掉在水中会下沉消失", //L"\n \nThis item sinks when put in water.", L"\n \n这个物品需要两只手一起操作使用", //L"\n \nThis item requires both hands to be used.", L"\n \n这个物品会挡住准心\n 你无法再使用准心瞄准", //L"\n \nThis item will block your iron sights\nso you cannot use them.", + L"\n \nThis ammo can destroy light walls\nand various other objects.", // TODO.Translate }; STR16 szUDBAdvStatsTooltipText[]= diff --git a/Utils/_DutchText.cpp b/Utils/_DutchText.cpp index ff222e99..9d10a473 100644 --- a/Utils/_DutchText.cpp +++ b/Utils/_DutchText.cpp @@ -7573,6 +7573,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]= L"|S|i|n|k|s", L"|T|w|o|-|H|a|n|d|e|d", L"|B|l|o|c|k|s |I|r|o|n |S|i|g|h|t|s", + L"|A|n|t|i|-|M|a|t|e|r|i|a|l |A|m|m|o", // TODO.Translate }; STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= @@ -7614,6 +7615,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= L"\n \nThis item sinks when put in water.", L"\n \nThis item requires both hands to be used.", L"\n \nThis item will block your iron sights\nso you cannot use them.", + L"\n \nThis ammo can destroy light walls\nand various other objects.", // TODO.Translate }; STR16 szUDBAdvStatsTooltipText[]= diff --git a/Utils/_EnglishText.cpp b/Utils/_EnglishText.cpp index 5d831cf6..eac782ee 100644 --- a/Utils/_EnglishText.cpp +++ b/Utils/_EnglishText.cpp @@ -7561,6 +7561,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]= L"|S|i|n|k|s", L"|T|w|o|-|H|a|n|d|e|d", L"|B|l|o|c|k|s |I|r|o|n |S|i|g|h|t|s", + L"|A|n|t|i|-|M|a|t|e|r|i|e|l |A|m|m|o", }; STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= @@ -7602,6 +7603,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= L"\n \nThis item sinks when put in water.", L"\n \nThis item requires both hands to be used.", L"\n \nThis item will block your iron sights\nso you cannot use them.", + L"\n \nThis ammo can destroy light walls\nand various other objects.", }; STR16 szUDBAdvStatsTooltipText[]= diff --git a/Utils/_FrenchText.cpp b/Utils/_FrenchText.cpp index 6376b405..2035fd1e 100644 --- a/Utils/_FrenchText.cpp +++ b/Utils/_FrenchText.cpp @@ -7560,6 +7560,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]= L"|N|e |f|l|o|t|t|e |p|a|s", L"|À |d|e|u|x |m|a|i|n|s", L"|B|l|o|q|u|e |l|e |v|i|s|e|u|r", + L"|A|n|t|i|-|M|a|t|e|r|i|a|l |A|m|m|o", // TODO.Translate }; STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= @@ -7601,6 +7602,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= L"\n \nCet objet coule dans l'eau.", L"\n \nCet objet exige les deux mains pour être utilisé.", L"\n \nCet Objet bloquera votre viseur\nde ce fait vous ne pouvez pas l'utiliser.", + L"\n \nThis ammo can destroy light walls\nand various other objects.", // TODO.Translate }; STR16 szUDBAdvStatsTooltipText[]= diff --git a/Utils/_GermanText.cpp b/Utils/_GermanText.cpp index d95e9116..fa7c548d 100644 --- a/Utils/_GermanText.cpp +++ b/Utils/_GermanText.cpp @@ -7387,6 +7387,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]= L"|S|i|n|k|s", L"|T|w|o|-|H|a|n|d|e|d", L"|B|l|o|c|k|s |I|r|o|n |S|i|g|h|t|s", + L"|A|n|t|i|-|M|a|t|e|r|i|a|l |A|m|m|o", // TODO.Translate }; STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= @@ -7428,6 +7429,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= L"\n \nDieser Gegenstand versinkt in Wasser.", L"\n \nDieser Gegenstand muß mit beiden Händen benutzt werden.", L"\n \nDieser Gegenstand verhindert die Verwendung von Kimme und Korn.", + L"\n \nThis ammo can destroy light walls\nand various other objects.", // TODO.Translate }; STR16 szUDBAdvStatsTooltipText[]= diff --git a/Utils/_ItalianText.cpp b/Utils/_ItalianText.cpp index 8012b393..6557d650 100644 --- a/Utils/_ItalianText.cpp +++ b/Utils/_ItalianText.cpp @@ -7564,6 +7564,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]= L"|S|i|n|k|s", L"|T|w|o|-|H|a|n|d|e|d", L"|B|l|o|c|k|s |I|r|o|n |S|i|g|h|t|s", + L"|A|n|t|i|-|M|a|t|e|r|i|a|l |A|m|m|o", // TODO.Translate }; STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= @@ -7605,6 +7606,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= L"\n \nThis item sinks when put in water.", L"\n \nThis item requires both hands to be used.", L"\n \nThis item will block your iron sights\nso you cannot use them.", + L"\n \nThis ammo can destroy light walls\nand various other objects.", // TODO.Translate }; STR16 szUDBAdvStatsTooltipText[]= diff --git a/Utils/_PolishText.cpp b/Utils/_PolishText.cpp index cb142589..841474d6 100644 --- a/Utils/_PolishText.cpp +++ b/Utils/_PolishText.cpp @@ -7581,6 +7581,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]= L"|S|i|n|k|s", L"|T|w|o|-|H|a|n|d|e|d", L"|B|l|o|c|k|s |I|r|o|n |S|i|g|h|t|s", + L"|A|n|t|i|-|M|a|t|e|r|i|a|l |A|m|m|o", // TODO.Translate }; STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= @@ -7622,6 +7623,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= L"\n \nThis item sinks when put in water.", L"\n \nThis item requires both hands to be used.", L"\n \nThis item will block your iron sights\nso you cannot use them.", + L"\n \nThis ammo can destroy light walls\nand various other objects.", // TODO.Translate }; STR16 szUDBAdvStatsTooltipText[]= diff --git a/Utils/_RussianText.cpp b/Utils/_RussianText.cpp index 51fe5d12..bfb4051b 100644 --- a/Utils/_RussianText.cpp +++ b/Utils/_RussianText.cpp @@ -7564,6 +7564,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]= L"|S|i|n|k|s", L"|T|w|o|-|H|a|n|d|e|d", L"|B|l|o|c|k|s |I|r|o|n |S|i|g|h|t|s", + L"|A|n|t|i|-|M|a|t|e|r|i|a|l |A|m|m|o", // TODO.Translate }; STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= @@ -7605,6 +7606,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= L"\n \nThis item sinks when put in water.", L"\n \nThis item requires both hands to be used.", L"\n \nThis item will block your iron sights\nso you cannot use them.", + L"\n \nThis ammo can destroy light walls\nand various other objects.", // TODO.Translate }; STR16 szUDBAdvStatsTooltipText[]= diff --git a/Utils/_TaiwaneseText.cpp b/Utils/_TaiwaneseText.cpp index f2c3145f..da9c167b 100644 --- a/Utils/_TaiwaneseText.cpp +++ b/Utils/_TaiwaneseText.cpp @@ -7573,6 +7573,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]= L"|S|i|n|k|s", L"|T|w|o|-|H|a|n|d|e|d", L"|B|l|o|c|k|s |I|r|o|n |S|i|g|h|t|s", + L"|A|n|t|i|-|M|a|t|e|r|i|a|l |A|m|m|o", // TODO.Translate }; STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= @@ -7614,6 +7615,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]= L"\n \nThis item sinks when put in water.", L"\n \nThis item requires both hands to be used.", L"\n \nThis item will block your iron sights\nso you cannot use them.", + L"\n \nThis ammo can destroy light walls\nand various other objects.", // TODO.Translate }; STR16 szUDBAdvStatsTooltipText[]=