- Fix: negative values for ExplosionSoundID or AltExplosionSoundID in ExplosionData.xml cause a game crash, even though negative values are intended

- armed vehicles always get the 'mounted' bonus for their guns
- removed unused code
- increased ASD starting resources

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8115 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2016-03-21 20:07:56 +00:00
parent 9e97538d89
commit be346d07ef
9 changed files with 37 additions and 95 deletions
+2 -2
View File
@@ -100,11 +100,11 @@ std::vector<ENEMY_HELI> gEnemyHeliVector;
void InitASD( ) void InitASD( )
{ {
gASDResource[ASD_MONEY] = 100000; gASDResource[ASD_MONEY] = 200000;
gASDResource[ASD_FUEL] = 0; gASDResource[ASD_FUEL] = 0;
gASDResource[ASD_HELI] = 0; gASDResource[ASD_HELI] = 0;
gASDResource[ASD_JEEP] = 2; gASDResource[ASD_JEEP] = 2;
gASDResource[ASD_TANK] = 0; gASDResource[ASD_TANK] = 2;
gASDResource_Ordered[ASD_MONEY] = 0; gASDResource_Ordered[ASD_MONEY] = 0;
gASDResource_Ordered[ASD_FUEL] = 0; gASDResource_Ordered[ASD_FUEL] = 0;
-6
View File
@@ -1156,12 +1156,6 @@ UINT32 UIHandleNewBadMerc( UI_EVENT *pUIEvent )
return( GAME_SCREEN ); return( GAME_SCREEN );
} }
// Flugente hack
/*if ( Water(usMapPos) )
pSoldier = TacticalCreateEnemyBoat( );
else
pSoldier = TacticalCreateEnemyJeep( );*/
usRandom = (UINT16)Random( 20 ); usRandom = (UINT16)Random( 20 );
if( usRandom < 5 ) if( usRandom < 5 )
pSoldier = TacticalCreateAdministrator(); pSoldier = TacticalCreateAdministrator();
+4
View File
@@ -14307,6 +14307,10 @@ BOOLEAN SOLDIERTYPE::IsWeaponMounted( void )
if ( TileIsOutOfBounds( this->sGridNo ) ) if ( TileIsOutOfBounds( this->sGridNo ) )
return(FALSE); return(FALSE);
// if we are a combat vehicle, our guns are always mounted
if ( ARMED_VEHICLE( this ) )
return TRUE;
// anv: passengers who can shoot can rest their guns // anv: passengers who can shoot can rest their guns
if ( this->flags.uiStatusFlags & (SOLDIER_DRIVER | SOLDIER_PASSENGER) ) if ( this->flags.uiStatusFlags & (SOLDIER_DRIVER | SOLDIER_PASSENGER) )
{ {
-38
View File
@@ -3170,44 +3170,6 @@ SOLDIERTYPE* TacticalCreateEnemyJeep( )
return(pSoldier); return(pSoldier);
} }
//USED BY STRATEGIC AI and AUTORESOLVE
// should to be succeeded by TacticalCreateArmyTroop/EliteEnemy and AddSoldierToVehicle
SOLDIERTYPE* TacticalCreateJeep()
{
BASIC_SOLDIERCREATE_STRUCT bp;
SOLDIERCREATE_STRUCT pp;
UINT8 ubID;
SOLDIERTYPE * pSoldier;
SOLDIERTYPE * pDriver;
if( guiCurrentScreen == AUTORESOLVE_SCREEN && !gfPersistantPBI )
{
pSoldier = ReserveTacticalSoldierForAutoresolve( SOLDIER_CLASS_ELITE );
if( pSoldier ) return pSoldier;
}
memset( &bp, 0, sizeof( BASIC_SOLDIERCREATE_STRUCT ) );
RandomizeRelativeLevel( &( bp.bRelativeAttributeLevel ), SOLDIER_CLASS_ELITE );
RandomizeRelativeLevel( &( bp.bRelativeEquipmentLevel ), SOLDIER_CLASS_ELITE );
bp.bTeam = CIV_TEAM;
bp.bOrders = STATIONARY;
bp.bAttitude = (INT8) Random( MAXATTITUDES );
bp.ubBodyType = JEEP;
bp.ubSoldierClass = SOLDIER_CLASS_NONE;
CreateDetailedPlacementGivenBasicPlacementInfo( &pp, &bp );
pp.ubProfile = 199;
pSoldier = TacticalCreateSoldier( &pp, &ubID );
if ( pSoldier )
{
// send soldier to centre of map, roughly
pSoldier->aiData.sNoiseGridno = (CENTRAL_GRIDNO + ( Random( CENTRAL_RADIUS * 2 + 1 ) - CENTRAL_RADIUS ) + ( Random( CENTRAL_RADIUS * 2 + 1 ) - CENTRAL_RADIUS ) * WORLD_COLS);
pSoldier->aiData.ubNoiseVolume = MAX_MISC_NOISE_DURATION;
}
return( pSoldier );
}
//USED BY STRATEGIC AI and AUTORESOLVE //USED BY STRATEGIC AI and AUTORESOLVE
SOLDIERTYPE* TacticalCreateZombie() SOLDIERTYPE* TacticalCreateZombie()
{ {
-1
View File
@@ -444,7 +444,6 @@ SOLDIERTYPE* TacticalCreateMilitia( UINT8 ubMilitiaClass, INT16 sX, INT16 sY );
SOLDIERTYPE* TacticalCreateCreature( INT8 bCreatureBodyType ); SOLDIERTYPE* TacticalCreateCreature( INT8 bCreatureBodyType );
SOLDIERTYPE* TacticalCreateEnemyTank(); SOLDIERTYPE* TacticalCreateEnemyTank();
SOLDIERTYPE* TacticalCreateEnemyJeep( ); SOLDIERTYPE* TacticalCreateEnemyJeep( );
SOLDIERTYPE* TacticalCreateJeep();
// Flugente: create an armed civilian // Flugente: create an armed civilian
SOLDIERTYPE* TacticalCreateArmedCivilian( UINT8 usSoldierClass = SOLDIER_CLASS_ARMY ); SOLDIERTYPE* TacticalCreateArmedCivilian( UINT8 usSoldierClass = SOLDIER_CLASS_ARMY );
-12
View File
@@ -9682,18 +9682,6 @@ INT32 BulletImpact( SOLDIERTYPE *pFirer, BULLET *pBullet, SOLDIERTYPE * pTarget,
ApplyDrugs_New( pTarget, ammoitem, 100 ); ApplyDrugs_New( pTarget, ammoitem, 100 );
} }
/*// Flugente: ammo can now add the lifedamage drug effect. This will kill the target in a few turns.
// this is intended to work on darts, but it is possible on any ammo
if ( AmmoTypes[ubAmmoType].ammoflag & AMMO_NEUROTOXIN )
{
pTarget->usSoldierFlagMask |= SOLDIER_DRUGGED;
ApplyDrugs_New( pTarget, ammoitem, 100 );
// Add lifedamage effects
pTarget->AddDrugValues( DRUG_TYPE_LIFEDAMAGE, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugEffect, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugTravelRate, Drug[DRUG_TYPE_LIFEDAMAGE].ubDrugSideEffect );
}
else */
if ( AmmoTypes[ubAmmoType].dart && sHitBy > 20 ) if ( AmmoTypes[ubAmmoType].dart && sHitBy > 20 )
{ {
if (pubSpecial) if (pubSpecial)
+23 -28
View File
@@ -483,7 +483,7 @@ void GenerateExplosionFromExplosionPointer( EXPLOSIONTYPE *pExplosion )
UINT16 usItem; UINT16 usItem;
UINT8 ubTerrainType; UINT8 ubTerrainType;
INT8 bLevel; INT8 bLevel;
UINT32 uiSoundID; INT32 sSoundID;
ANITILE_PARAMS AniParams; ANITILE_PARAMS AniParams;
@@ -568,36 +568,30 @@ void GenerateExplosionFromExplosionPointer( EXPLOSIONTYPE *pExplosion )
{ {
pExplosion->iLightID = LightSpriteCreate("FLSHBANG.LHT", 0 ); pExplosion->iLightID = LightSpriteCreate("FLSHBANG.LHT", 0 );
} }
else // generic light
// generic light // DO ONLY IF WE'RE AT A GOOD LEVEL
// DO ONLY IF WE'RE AT A GOOD LEVEL else if ( ubAmbientLightLevel >= MIN_AMB_LEVEL_FOR_MERC_LIGHTS )
if ( ubAmbientLightLevel >= MIN_AMB_LEVEL_FOR_MERC_LIGHTS ) {
{ pExplosion->iLightID = LightSpriteCreate("L-R04.LHT", 0 );
pExplosion->iLightID = LightSpriteCreate("L-R04.LHT", 0 ); }
}
if( pExplosion->iLightID != -1 ) if( pExplosion->iLightID != -1 )
{ {
LightSpritePower ( pExplosion->iLightID, TRUE ); LightSpritePower ( pExplosion->iLightID, TRUE );
LightSpriteRoofStatus( pExplosion->iLightID, pExplosion->Params.bLevel ); LightSpriteRoofStatus( pExplosion->iLightID, pExplosion->Params.bLevel );
LightSpritePosition ( pExplosion->iLightID, (INT16)(sX/CELL_X_SIZE), (INT16)(sY/CELL_Y_SIZE) ); LightSpritePosition ( pExplosion->iLightID, (INT16)(sX/CELL_X_SIZE), (INT16)(sY/CELL_Y_SIZE) );
} }
// Lesh: sound randomization // Lesh: sound randomization
uiSoundID = gExpAniData[ ubTypeID ].uiExplosionSoundID; sSoundID = gExpAniData[ubTypeID].sExplosionSoundID;
if ( gExpAniData[ ubTypeID ].uiAltExplosionSoundID != NO_ALT_SOUND ) // Randomize
{ if ( gExpAniData[ubTypeID].sAltExplosionSoundID > NO_ALT_SOUND && (Random( 2 ) || sSoundID < 0) )
// Randomize sSoundID = gExpAniData[ubTypeID].sAltExplosionSoundID;
if ( Random( 2 ) == 0 ) // Lesh: sound randomization ends
{
uiSoundID = gExpAniData[ ubTypeID ].uiAltExplosionSoundID;
}
}
// Lesh: sound randomization ends
PlayJA2Sample( uiSoundID, RATE_11025, SoundVolume( HIGHVOLUME, sGridNo ), 1, SoundDir( sGridNo ) );
if ( sSoundID > NO_ALT_SOUND )
PlayJA2Sample( sSoundID, RATE_11025, SoundVolume( HIGHVOLUME, sGridNo ), 1, SoundDir( sGridNo ) );
} }
@@ -1632,8 +1626,9 @@ BOOLEAN DamageSoldierFromBlast( UINT8 ubPerson, UINT8 ubOwner, INT32 sBombGridNo
sNewWoundAmt = (INT16)(((sNewWoundAmt * (100 + gSkillTraitValues.ubHWDamageBonusPercentForHW * NUM_SKILL_TRAITS( MercPtrs[ ubOwner ], HEAVY_WEAPONS_NT ))) / 100) + 0.5); // +15% sNewWoundAmt = (INT16)(((sNewWoundAmt * (100 + gSkillTraitValues.ubHWDamageBonusPercentForHW * NUM_SKILL_TRAITS( MercPtrs[ ubOwner ], HEAVY_WEAPONS_NT ))) / 100) + 0.5); // +15%
} }
} }
// adjust damage resistance of TANKS // adjust damage resistance of TANKS
if ( ARMED_VEHICLE( pSoldier ) && gGameOptions.fNewTraitSystem ) if ( TANK( pSoldier ) && gGameOptions.fNewTraitSystem )
{ {
sNewWoundAmt = (INT16)(sNewWoundAmt * (100 - gSkillTraitValues.bTanksDamageResistanceModifier) / 100); sNewWoundAmt = (INT16)(sNewWoundAmt * (100 - gSkillTraitValues.bTanksDamageResistanceModifier) / 100);
// another half of this for ordinary grenades // another half of this for ordinary grenades
+2 -2
View File
@@ -70,8 +70,8 @@ typedef struct
{ {
UINT8 ubTransKeyFrame; UINT8 ubTransKeyFrame;
UINT8 ubDamageKeyFrame; UINT8 ubDamageKeyFrame;
UINT32 uiExplosionSoundID; INT32 sExplosionSoundID;
UINT32 uiAltExplosionSoundID; INT32 sAltExplosionSoundID;
CHAR8 zBlastFilename[MAX_BLAST_FILENAME_LEN]; CHAR8 zBlastFilename[MAX_BLAST_FILENAME_LEN];
CHAR8 sBlastSpeed; CHAR8 sBlastSpeed;
} EXPLOSION_DATA; } EXPLOSION_DATA;
+4 -4
View File
@@ -119,12 +119,12 @@ explosionDataEndElementHandle(void *userData, const XML_Char *name)
else if(strcmp(name, "ExplosionSoundID") == 0) else if(strcmp(name, "ExplosionSoundID") == 0)
{ {
pData->curElement = ELEMENT; pData->curElement = ELEMENT;
pData->expData.uiExplosionSoundID = (UINT32) strtoul(pData->szCharData, NULL, 0); pData->expData.sExplosionSoundID = (INT32) strtoul(pData->szCharData, NULL, 0);
} }
else if(strcmp(name, "AltExplosionSoundID") == 0) else if(strcmp(name, "AltExplosionSoundID") == 0)
{ {
pData->curElement = ELEMENT; pData->curElement = ELEMENT;
pData->expData.uiAltExplosionSoundID = (UINT32) strtoul(pData->szCharData, NULL, 0); pData->expData.sAltExplosionSoundID = (INT32)strtoul( pData->szCharData, NULL, 0 );
} }
else if(strcmp(name, "BlastFilename") == 0) else if(strcmp(name, "BlastFilename") == 0)
{ {
@@ -230,8 +230,8 @@ BOOLEAN WriteExplosionDataStats()
FilePrintf(hFile,"\t\t<TransKeyFrame>%d</TransKeyFrame>\r\n", gExpAniData[cnt].ubTransKeyFrame); FilePrintf(hFile,"\t\t<TransKeyFrame>%d</TransKeyFrame>\r\n", gExpAniData[cnt].ubTransKeyFrame);
FilePrintf(hFile,"\t\t<DamageKeyFrame>%d</DamageKeyFrame>\r\n", gExpAniData[cnt].ubDamageKeyFrame); FilePrintf(hFile,"\t\t<DamageKeyFrame>%d</DamageKeyFrame>\r\n", gExpAniData[cnt].ubDamageKeyFrame);
FilePrintf(hFile,"\t\t<ExplosionSoundID>%d</ExplosionSoundID>\r\n", gExpAniData[cnt].uiExplosionSoundID); FilePrintf(hFile,"\t\t<ExplosionSoundID>%d</ExplosionSoundID>\r\n", gExpAniData[cnt].sExplosionSoundID );
FilePrintf(hFile,"\t\t<AltExplosionSoundID>%d</AltExplosionSoundID>\r\n", gExpAniData[cnt].uiAltExplosionSoundID); FilePrintf(hFile,"\t\t<AltExplosionSoundID>%d</AltExplosionSoundID>\r\n", gExpAniData[cnt].sAltExplosionSoundID );
FilePrintf(hFile,"\t\t<BlastFilename>%s</BlastFilename>\r\n", gExpAniData[cnt].zBlastFilename); FilePrintf(hFile,"\t\t<BlastFilename>%s</BlastFilename>\r\n", gExpAniData[cnt].zBlastFilename);
FilePrintf(hFile,"\t\t<BlastSpeed>%d</BlastSpeed>\r\n", gExpAniData[cnt].sBlastSpeed); FilePrintf(hFile,"\t\t<BlastSpeed>%d</BlastSpeed>\r\n", gExpAniData[cnt].sBlastSpeed);