mirror of
https://github.com/1dot13/source.git
synced 2026-08-26 14:30:26 +02:00
- New feature: Ammotype flag AMMO_ANTIMATERIEL (<ammoflag>4</ammoflag>) 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
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
#define BULLET_FLAG_BUCKSHOT 0x0040
|
#define BULLET_FLAG_BUCKSHOT 0x0040
|
||||||
#define BULLET_FLAG_FLAME 0x0080
|
#define BULLET_FLAG_FLAME 0x0080
|
||||||
#define BULLET_FLAG_TRACER 0x0100
|
#define BULLET_FLAG_TRACER 0x0100
|
||||||
|
#define BULLET_FLAG_ANTIMATERIEL 0x0200 // Flugente: bullet can destroy structures
|
||||||
|
|
||||||
//afp-start calculate line points between two point
|
//afp-start calculate line points between two point
|
||||||
#define BULLET_TRACER_MAX_LENGTH 60
|
#define BULLET_TRACER_MAX_LENGTH 60
|
||||||
|
|||||||
@@ -2378,6 +2378,15 @@ void InternalInitEDBTooltipRegion( OBJECTTYPE * gpItemDescObject, UINT32 guiCurr
|
|||||||
MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + cnt ] );
|
MSYS_EnableRegion( &gUDBFasthelpRegions[ iFirstDataRegion + cnt ] );
|
||||||
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)
|
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 );
|
BltVideoObjectFromIndex( guiSAVEBUFFER, guiItemInfoSecondaryIcon, 4, gItemDescGenSecondaryRegions[cnt].sLeft+sOffsetX, gItemDescGenSecondaryRegions[cnt].sTop+sOffsetY, VO_BLT_SRCTRANSPARENCY, NULL );
|
||||||
cnt++;
|
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))
|
if (Item[ gpItemDescObject->usItem ].usItemClass & (IC_EXPLOSV))
|
||||||
|
|||||||
@@ -4442,6 +4442,10 @@ INT8 FireBulletGivenTargetNCTH( SOLDIERTYPE * pFirer, FLOAT dEndX, FLOAT dEndY,
|
|||||||
fTracer = TRUE;
|
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]);
|
ubImpact =(UINT8) GetDamage(&pFirer->inv[pFirer->ubAttackingHand]);
|
||||||
//zilpin: Begin new code block for spread patterns, number of projectiles, impact adjustment, etc.
|
//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;
|
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);
|
ubImpact =(UINT8) GetDamage(pObjAttHand);
|
||||||
//zilpin: pellet spread patterns externalized in XML
|
//zilpin: pellet spread patterns externalized in XML
|
||||||
/* zilpin: The section below, including line comments, is the original adjustment made to multiple projectile stats.
|
/* 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;
|
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
|
// 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
|
/*// HEADROCK HAM B2.5: Set tracer effect on/off for individual bullets in a Tracer Magazine, as part of the
|
||||||
// New Tracer System.
|
// New Tracer System.
|
||||||
@@ -6872,6 +6884,16 @@ void MoveBullet( INT32 iBullet )
|
|||||||
// play animation to indicate structure being hit
|
// play animation to indicate structure being hit
|
||||||
BulletHitStructure( pBullet, pStructure->usStructureID, 1, pBullet->qCurrX, pBullet->qCurrY, pBullet->qCurrZ, FALSE );
|
BulletHitStructure( pBullet, pStructure->usStructureID, 1, pBullet->qCurrX, pBullet->qCurrY, pBullet->qCurrZ, FALSE );
|
||||||
gubLocalStructureNumTimesHit[iStructureLoop] = 1;
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-11
@@ -896,15 +896,15 @@ BOOLEAN WriteWeaponStats()
|
|||||||
FilePrintf(hFile,"\t\t<APsToReload>%d</APsToReload>\r\n", Weapon[cnt].APsToReload);
|
FilePrintf(hFile,"\t\t<APsToReload>%d</APsToReload>\r\n", Weapon[cnt].APsToReload);
|
||||||
FilePrintf(hFile,"\t\t<SwapClips>%d</SwapClips>\r\n", Weapon[cnt].swapClips );
|
FilePrintf(hFile,"\t\t<SwapClips>%d</SwapClips>\r\n", Weapon[cnt].swapClips );
|
||||||
FilePrintf(hFile,"\t\t<MaxDistForMessyDeath>%d</MaxDistForMessyDeath>\r\n", Weapon[cnt].maxdistformessydeath);
|
FilePrintf(hFile,"\t\t<MaxDistForMessyDeath>%d</MaxDistForMessyDeath>\r\n", Weapon[cnt].maxdistformessydeath);
|
||||||
FilePrintf(hFile,"\t\t<AutoPenalty>%d</AutoPenalty>\r\n", Weapon[cnt].AutoPenalty);
|
FilePrintf(hFile,"\t\t<AutoPenalty>%d</AutoPenalty>\r\n", Weapon[cnt].AutoPenalty);
|
||||||
FilePrintf(hFile,"\t\t<NoSemiAuto>%d</NoSemiAuto>\r\n", Weapon[cnt].NoSemiAuto);
|
FilePrintf(hFile,"\t\t<NoSemiAuto>%d</NoSemiAuto>\r\n", Weapon[cnt].NoSemiAuto);
|
||||||
FilePrintf(hFile,"\t\t<ubAimLevels>%d</ubAimLevels>\r\n", Weapon[cnt].ubAimLevels );
|
FilePrintf(hFile,"\t\t<ubAimLevels>%d</ubAimLevels>\r\n", Weapon[cnt].ubAimLevels );
|
||||||
FilePrintf(hFile,"\t\t<EasyUnjam>%d</EasyUnjam>\r\n", Weapon[cnt].EasyUnjam);
|
FilePrintf(hFile,"\t\t<EasyUnjam>%d</EasyUnjam>\r\n", Weapon[cnt].EasyUnjam);
|
||||||
FilePrintf(hFile,"\t\t<Handling>%d</Handling>\r\n", Weapon[cnt].ubHandling);
|
FilePrintf(hFile,"\t\t<Handling>%d</Handling>\r\n", Weapon[cnt].ubHandling);
|
||||||
FilePrintf(hFile,"\t\t<usOverheatingJamThreshold>%4.2f</usOverheatingJamThreshold>\r\n", Weapon[cnt].usOverheatingJamThreshold); // Flugente FTW 1
|
FilePrintf(hFile,"\t\t<usOverheatingJamThreshold>%4.2f</usOverheatingJamThreshold>\r\n", Weapon[cnt].usOverheatingJamThreshold); // Flugente FTW 1
|
||||||
FilePrintf(hFile,"\t\t<usOverheatingDamageThreshold>%4.2f</usOverheatingDamageThreshold>\r\n", Weapon[cnt].usOverheatingDamageThreshold);
|
FilePrintf(hFile,"\t\t<usOverheatingDamageThreshold>%4.2f</usOverheatingDamageThreshold>\r\n", Weapon[cnt].usOverheatingDamageThreshold);
|
||||||
FilePrintf(hFile,"\t\t<usOverheatingSingleShotTemperature>%4.2f</usOverheatingSingleShotTemperature>\r\n", Weapon[cnt].usOverheatingSingleShotTemperature);
|
FilePrintf(hFile,"\t\t<usOverheatingSingleShotTemperature>%4.2f</usOverheatingSingleShotTemperature>\r\n", Weapon[cnt].usOverheatingSingleShotTemperature);
|
||||||
FilePrintf(hFile,"\t\t<HeavyGun>%d</HeavyGun>\r\n", Weapon[cnt].HeavyGun);
|
FilePrintf(hFile,"\t\t<HeavyGun>%d</HeavyGun>\r\n", Weapon[cnt].HeavyGun);
|
||||||
|
|
||||||
|
|
||||||
FilePrintf(hFile,"\t</WEAPON>\r\n");
|
FilePrintf(hFile,"\t</WEAPON>\r\n");
|
||||||
@@ -4661,7 +4661,7 @@ void StructureHit( INT32 iBullet, UINT16 usWeaponIndex, INT16 bWeaponStatus, UIN
|
|||||||
{
|
{
|
||||||
pStructure = FindStructureByID( sGridNo, usStructureID );
|
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.
|
// 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;
|
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
|
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)
|
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 );
|
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 );
|
iSightRange = SoldierTo3DLocationLineOfSightTest( pSoldier, sGridNo, pSoldier->bTargetLevel, pSoldier->bTargetCubeLevel, TRUE, NO_DISTANCE_LIMIT, false );
|
||||||
fCoverObscured = true;
|
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 );
|
iSightRange = SoldierToSoldierLineOfSightTest( pSoldier, MercPtrs[ubTargetID], TRUE, NO_DISTANCE_LIMIT, pSoldier->bAimShotLocation, false, true );
|
||||||
fCantSeeTarget = true;
|
fCantSeeTarget = true;
|
||||||
fCoverObscured = false;
|
fCoverObscured = false;
|
||||||
}
|
}
|
||||||
gbForceWeaponReady = false;
|
|
||||||
gbForceWeaponNotReady = true;
|
gbForceWeaponReady = false;
|
||||||
|
gbForceWeaponNotReady = true;
|
||||||
sDistVisNoScope = pSoldier->GetMaxDistanceVisible(sGridNo, pSoldier->bTargetLevel, CALC_FROM_ALL_DIRS ) * CELL_X_SIZE;
|
sDistVisNoScope = pSoldier->GetMaxDistanceVisible(sGridNo, pSoldier->bTargetLevel, CALC_FROM_ALL_DIRS ) * CELL_X_SIZE;
|
||||||
gbForceWeaponNotReady = false;
|
gbForceWeaponNotReady = false;
|
||||||
|
|
||||||
// Flugente: blind soldiers have sDistVisNoScope = 0...
|
// Flugente: blind soldiers have sDistVisNoScope = 0...
|
||||||
if ( sDistVisNoScope )
|
if ( sDistVisNoScope )
|
||||||
|
|||||||
+2
-2
@@ -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!!!
|
// 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_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 AMMO_BLIND 0x00000002 //2 // this ammo will blind if it hits the head
|
||||||
/*#define SHOVEL 0x00000004 //4
|
#define AMMO_ANTIMATERIEL 0x00000004 //4 // this ammo is anti-materiel, bullets can destroy structures
|
||||||
#define CONCERTINA 0x00000008 //8
|
/*#define CONCERTINA 0x00000008 //8
|
||||||
|
|
||||||
#define WATER_DRUM 0x00000010 //16 // water drums allow to refill canteens in the sector they are in
|
#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
|
#define MEAT_BLOODCAT 0x00000020 //32 // retrieve this by gutting a bloodcat
|
||||||
|
|||||||
+35
-16
@@ -40,6 +40,7 @@
|
|||||||
#include "Random.h"
|
#include "Random.h"
|
||||||
|
|
||||||
#include "Tile Animation.h"
|
#include "Tile Animation.h"
|
||||||
|
#include "Explosion Control.h" // added by Flugente
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef COUNT_PATHS
|
#ifdef COUNT_PATHS
|
||||||
@@ -1674,13 +1675,11 @@ BOOLEAN StructureDensity( STRUCTURE * pStructure, UINT8 * pubLevel0, UINT8 * pub
|
|||||||
return( TRUE );
|
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
|
// do damage to a structure; returns TRUE if the structure should be removed
|
||||||
|
|
||||||
STRUCTURE *pBase;
|
STRUCTURE *pBase;
|
||||||
UINT8 ubArmour;
|
UINT8 ubArmour;
|
||||||
//LEVELNODE *pNode;
|
|
||||||
|
|
||||||
CHECKF( pStructure );
|
CHECKF( pStructure );
|
||||||
if (pStructure->fFlags & STRUCTURE_PERSON || pStructure->fFlags & STRUCTURE_CORPSE)
|
if (pStructure->fFlags & STRUCTURE_PERSON || pStructure->fFlags & STRUCTURE_CORPSE)
|
||||||
@@ -1694,16 +1693,18 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason,
|
|||||||
return( FALSE );
|
return( FALSE );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
UINT8 ubBaseArmour = gubMaterialArmour[ pStructure->pDBStructureRef->pDBStructure->ubArmour ];
|
||||||
|
|
||||||
// Account for armour!
|
// Account for armour!
|
||||||
if (ubReason == STRUCTURE_DAMAGE_EXPLOSION)
|
if (ubReason == STRUCTURE_DAMAGE_EXPLOSION)
|
||||||
{
|
{
|
||||||
if ( pStructure->fFlags & STRUCTURE_EXPLOSIVE )
|
if ( pStructure->fFlags & STRUCTURE_EXPLOSIVE )
|
||||||
{
|
{
|
||||||
ubArmour = gubMaterialArmour[ pStructure->pDBStructureRef->pDBStructure->ubArmour ] / 3;
|
ubArmour = ubBaseArmour / 3;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ubArmour = gubMaterialArmour[ pStructure->pDBStructureRef->pDBStructure->ubArmour ] / 2;
|
ubArmour = ubBaseArmour / 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ubArmour > ubDamage)
|
if (ubArmour > ubDamage)
|
||||||
@@ -1753,19 +1754,37 @@ BOOLEAN DamageStructure( STRUCTURE * pStructure, UINT8 ubDamage, UINT8 ubReason,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Make hit sound....
|
// Make hit sound....
|
||||||
if ( pStructure->fFlags & STRUCTURE_CAVEWALL )
|
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 )
|
|
||||||
{
|
{
|
||||||
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....
|
// Don't update damage HPs....
|
||||||
return( TRUE );
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// OK, LOOK FOR A SAM SITE, UPDATE....
|
// OK, LOOK FOR A SAM SITE, UPDATE....
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ BOOLEAN AddZStripInfoToVObject( HVOBJECT hVObject, STRUCTURE_FILE_REF * pStructu
|
|||||||
// FUNCTIONS FOR DETERMINING STUFF THAT BLOCKS VIEW FOR TILE_bASED LOS
|
// 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 );
|
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
|
// Material armour type enumeration
|
||||||
enum
|
enum
|
||||||
|
|||||||
+2
-2
@@ -715,8 +715,8 @@ extern STR16 szUDBGenExplosiveStatsTooltipText[ 23 ]; // silversurfer Repair
|
|||||||
extern STR16 szUDBGenExplosiveStatsExplanationsTooltipText[ 23 ]; // silversurfer Repair Ease: 22->23
|
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 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 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 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[ 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[]; // 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 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 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
|
extern STR16 szUDBAdvStatsExplanationsTooltipTextForWeapons[ 53 ]; // Flugente Overheating Weapons: 48->52 silversurfer Best Laser Range:64->65 silversurfer PercentRecoilModifier: 53
|
||||||
|
|||||||
@@ -7564,6 +7564,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
|
|||||||
L"|水|中|下|沉", //L"|S|i|n|k|s",
|
L"|水|中|下|沉", //L"|S|i|n|k|s",
|
||||||
L"|双|手|操|作", //|T|w|o|-|H|a|n|d|e|d",
|
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"|挡|住|准|心", //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[]=
|
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 sinks when put in water.",
|
||||||
L"\n \n这个物品需要两只手一起操作使用", //L"\n \nThis item requires both hands to be used.",
|
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 \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[]=
|
STR16 szUDBAdvStatsTooltipText[]=
|
||||||
|
|||||||
@@ -7573,6 +7573,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
|
|||||||
L"|S|i|n|k|s",
|
L"|S|i|n|k|s",
|
||||||
L"|T|w|o|-|H|a|n|d|e|d",
|
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"|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[]=
|
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
||||||
@@ -7614,6 +7615,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
|||||||
L"\n \nThis item sinks when put in water.",
|
L"\n \nThis item sinks when put in water.",
|
||||||
L"\n \nThis item requires both hands to be used.",
|
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 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[]=
|
STR16 szUDBAdvStatsTooltipText[]=
|
||||||
|
|||||||
@@ -7561,6 +7561,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
|
|||||||
L"|S|i|n|k|s",
|
L"|S|i|n|k|s",
|
||||||
L"|T|w|o|-|H|a|n|d|e|d",
|
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"|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[]=
|
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
||||||
@@ -7602,6 +7603,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
|||||||
L"\n \nThis item sinks when put in water.",
|
L"\n \nThis item sinks when put in water.",
|
||||||
L"\n \nThis item requires both hands to be used.",
|
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 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[]=
|
STR16 szUDBAdvStatsTooltipText[]=
|
||||||
|
|||||||
@@ -7560,6 +7560,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
|
|||||||
L"|N|e |f|l|o|t|t|e |p|a|s",
|
L"|N|e |f|l|o|t|t|e |p|a|s",
|
||||||
L"|À |d|e|u|x |m|a|i|n|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"|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[]=
|
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
||||||
@@ -7601,6 +7602,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
|||||||
L"\n \nCet objet coule dans l'eau.",
|
L"\n \nCet objet coule dans l'eau.",
|
||||||
L"\n \nCet objet exige les deux mains pour être utilisé.",
|
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 \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[]=
|
STR16 szUDBAdvStatsTooltipText[]=
|
||||||
|
|||||||
@@ -7387,6 +7387,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
|
|||||||
L"|S|i|n|k|s",
|
L"|S|i|n|k|s",
|
||||||
L"|T|w|o|-|H|a|n|d|e|d",
|
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"|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[]=
|
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
||||||
@@ -7428,6 +7429,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
|||||||
L"\n \nDieser Gegenstand versinkt in Wasser.",
|
L"\n \nDieser Gegenstand versinkt in Wasser.",
|
||||||
L"\n \nDieser Gegenstand muß mit beiden Händen benutzt werden.",
|
L"\n \nDieser Gegenstand muß mit beiden Händen benutzt werden.",
|
||||||
L"\n \nDieser Gegenstand verhindert die Verwendung von Kimme und Korn.",
|
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[]=
|
STR16 szUDBAdvStatsTooltipText[]=
|
||||||
|
|||||||
@@ -7564,6 +7564,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
|
|||||||
L"|S|i|n|k|s",
|
L"|S|i|n|k|s",
|
||||||
L"|T|w|o|-|H|a|n|d|e|d",
|
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"|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[]=
|
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
||||||
@@ -7605,6 +7606,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
|||||||
L"\n \nThis item sinks when put in water.",
|
L"\n \nThis item sinks when put in water.",
|
||||||
L"\n \nThis item requires both hands to be used.",
|
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 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[]=
|
STR16 szUDBAdvStatsTooltipText[]=
|
||||||
|
|||||||
@@ -7581,6 +7581,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
|
|||||||
L"|S|i|n|k|s",
|
L"|S|i|n|k|s",
|
||||||
L"|T|w|o|-|H|a|n|d|e|d",
|
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"|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[]=
|
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
||||||
@@ -7622,6 +7623,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
|||||||
L"\n \nThis item sinks when put in water.",
|
L"\n \nThis item sinks when put in water.",
|
||||||
L"\n \nThis item requires both hands to be used.",
|
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 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[]=
|
STR16 szUDBAdvStatsTooltipText[]=
|
||||||
|
|||||||
@@ -7564,6 +7564,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
|
|||||||
L"|S|i|n|k|s",
|
L"|S|i|n|k|s",
|
||||||
L"|T|w|o|-|H|a|n|d|e|d",
|
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"|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[]=
|
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
||||||
@@ -7605,6 +7606,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
|||||||
L"\n \nThis item sinks when put in water.",
|
L"\n \nThis item sinks when put in water.",
|
||||||
L"\n \nThis item requires both hands to be used.",
|
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 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[]=
|
STR16 szUDBAdvStatsTooltipText[]=
|
||||||
|
|||||||
@@ -7573,6 +7573,7 @@ STR16 szUDBGenSecondaryStatsTooltipText[]=
|
|||||||
L"|S|i|n|k|s",
|
L"|S|i|n|k|s",
|
||||||
L"|T|w|o|-|H|a|n|d|e|d",
|
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"|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[]=
|
STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
||||||
@@ -7614,6 +7615,7 @@ STR16 szUDBGenSecondaryStatsExplanationsTooltipText[]=
|
|||||||
L"\n \nThis item sinks when put in water.",
|
L"\n \nThis item sinks when put in water.",
|
||||||
L"\n \nThis item requires both hands to be used.",
|
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 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[]=
|
STR16 szUDBAdvStatsTooltipText[]=
|
||||||
|
|||||||
Reference in New Issue
Block a user