We can now use interactive actions to alter decals on walls, so it is possible to simulate taking off an object from the scenery and add it as an item.

For more info, see http://thepit.ja-galaxy-forum.com/index.php?t=msg&goto=363513&#msg_363513

Requires GameDir >= r2601

git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@9141 3b4a5df2-a311-0410-b5c6-a8a6f20db521
This commit is contained in:
Flugente
2021-07-13 19:50:49 +00:00
parent 174b870afe
commit 6cad680b02
17 changed files with 244 additions and 69 deletions
+27 -3
View File
@@ -2001,7 +2001,7 @@ BOOLEAN DishOutGasDamage( SOLDIERTYPE * pSoldier, EXPLOSIVETYPE * pExplosive, IN
}
}
else if ( pExplosive->ubType == EXPLOSV_SMOKE || pExplosive->ubType == EXPLOSV_SMOKE_DEBRIS )//dnl ch40 200909
else if ( pExplosive->ubType == EXPLOSV_SMOKE || pExplosive->ubType == EXPLOSV_SMOKE_DEBRIS | pExplosive->ubType == EXPLOSV_SMOKE_FIRERETARDANT )//dnl ch40 200909
{
// robots are unaffected by smoke
if( AM_A_ROBOT(pSoldier) )
@@ -2108,6 +2108,7 @@ BOOLEAN DishOutGasDamage( SOLDIERTYPE * pSoldier, EXPLOSIVETYPE * pExplosive, IN
break;
case EXPLOSV_SMOKE://dnl ch40 200909
case EXPLOSV_SMOKE_DEBRIS:
case EXPLOSV_SMOKE_FIRERETARDANT:
pSoldier->flags.fHitByGasFlags |= HIT_BY_SMOKEGAS;
break;
default:
@@ -2262,6 +2263,12 @@ BOOLEAN ExpAffect( INT32 sBombGridNo, INT32 sGridNo, UINT32 uiDist, UINT16 usIte
bSmokeEffectType = DEBRIS_SMOKE_EFFECT;
fBlastEffect = FALSE;
break;
case EXPLOSV_SMOKE_FIRERETARDANT:
fSmokeEffect = TRUE;
bSmokeEffectType = FIRERETARDANT_SMOKE_EFFECT;
fBlastEffect = FALSE;
break;
}
}
@@ -2464,6 +2471,15 @@ BOOLEAN ExpAffect( INT32 sBombGridNo, INT32 sGridNo, UINT32 uiDist, UINT16 usIte
}
else if ( fSmokeEffect )
{
// Flugente: if adding fire retardant, remove fire
if ( pExplosive->ubType == EXPLOSV_SMOKE_FIRERETARDANT )
{
if ( gpWorldLevelData[sGridNo].ubExtFlags[bLevel] & MAPELEMENT_EXT_BURNABLEGAS )
{
RemoveSmokeEffectFromTile( sGridNo, bLevel );
}
}
// If tear gar, determine turns to spread.....
if ( sSubsequent == ERASE_SPREAD_EFFECT )
{
@@ -2945,7 +2961,15 @@ void SpreadEffect( INT32 sGridNo, UINT8 ubRadius, UINT16 usItem, UINT8 ubOwner,
gfMPDebugOutputRandoms = true;
#endif
}
// Flugente: if tile has a fire retardant effect, don't create new fire
if ( Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_BURNABLEGAS )
{
if ( gpWorldLevelData[sGridNo].ubExtFlags[bLevel] & MAPELEMENT_EXT_FIRERETARDANT_SMOKE )
{
return;
}
}
INT32 uiNewSpot, uiTempSpot, uiBranchSpot, cnt, branchCnt;
INT32 uiTempRange, ubBranchRange;
@@ -2965,7 +2989,7 @@ void SpreadEffect( INT32 sGridNo, UINT8 ubRadius, UINT16 usItem, UINT8 ubOwner,
case EXPLOSV_CREATUREGAS:
case EXPLOSV_SIGNAL_SMOKE:
case EXPLOSV_SMOKE_DEBRIS:
case EXPLOSV_SMOKE_FIRERETARDANT:
fSmokeEffect = TRUE;
break;
}
+31 -47
View File
@@ -137,6 +137,10 @@ INT8 FromWorldFlagsToSmokeType( UINT16 ubWorldFlags )
{
return(DEBRIS_SMOKE_EFFECT);
}
else if ( ubWorldFlags & MAPELEMENT_EXT_FIRERETARDANT_SMOKE )
{
return FIRERETARDANT_SMOKE_EFFECT;
}
return(NO_SMOKE_EFFECT);
}
@@ -180,6 +184,10 @@ UINT16 FromSmokeTypeToWorldFlags( INT8 bType )
return(MAPELEMENT_EXT_DEBRIS_SMOKE);
break;
case FIRERETARDANT_SMOKE_EFFECT:
return MAPELEMENT_EXT_FIRERETARDANT_SMOKE;
break;
default:
return( 0 );
@@ -288,6 +296,10 @@ INT32 NewSmokeEffect( INT32 sGridNo, UINT16 usItem, INT8 bLevel, UINT8 ubOwner,
case EXPLOSV_SMOKE_DEBRIS:
bSmokeEffectType = DEBRIS_SMOKE_EFFECT;
break;
case EXPLOSV_SMOKE_FIRERETARDANT:
bSmokeEffectType = FIRERETARDANT_SMOKE_EFFECT;
break;
}
pSmoke->ubDuration = (UINT8)Explosive[ Item[ usItem ].ubClassIndex ].ubDuration;
@@ -395,6 +407,9 @@ INT32 NewSmokeEffect(INT32 sGridNo, UINT16 usItem, INT8 bLevel, UINT8 ubOwner, B
case EXPLOSV_SMOKE_DEBRIS:
bSmokeEffectType = DEBRIS_SMOKE_EFFECT;
break;
case EXPLOSV_SMOKE_FIRERETARDANT:
bSmokeEffectType = FIRERETARDANT_SMOKE_EFFECT;
break;
}
// sevenfm: use custom duration/radius
@@ -607,59 +622,19 @@ void AddSmokeEffectToTile( INT32 iSmokeEffectID, INT8 bType, INT32 sGridNo, INT8
break;
case CREATURE_SMOKE_EFFECT:
if ( !( gGameSettings.fOptions[ TOPTION_ANIMATE_SMOKE ] ) )
{
strcpy( AniParams.zCachedFile, "TILECACHE\\spit_gas.STI" );
}
else
{
if ( fDissipating )
{
strcpy( AniParams.zCachedFile, "TILECACHE\\spit_gas.STI" );
}
else
{
strcpy( AniParams.zCachedFile, "TILECACHE\\spit_gas.STI" );
}
}
strcpy( AniParams.zCachedFile, "TILECACHE\\spit_gas.STI" );
break;
case SIGNAL_SMOKE_EFFECT:
if ( !( gGameSettings.fOptions[ TOPTION_ANIMATE_SMOKE ] ) )
{
strcpy( AniParams.zCachedFile, "TILECACHE\\signal_gas.STI" );
}
else
{
if ( fDissipating )
{
strcpy( AniParams.zCachedFile, "TILECACHE\\signal_gas.STI" );
}
else
{
strcpy( AniParams.zCachedFile, "TILECACHE\\signal_gas.STI" );
}
}
strcpy( AniParams.zCachedFile, "TILECACHE\\signal_gas.STI" );
break;
case DEBRIS_SMOKE_EFFECT:
if ( !(gGameSettings.fOptions[TOPTION_ANIMATE_SMOKE]) )
{
strcpy( AniParams.zCachedFile, "TILECACHE\\debris_smoke.STI" );
}
else
{
if ( fDissipating )
{
strcpy( AniParams.zCachedFile, "TILECACHE\\debris_smoke.STI" );
}
else
{
strcpy( AniParams.zCachedFile, "TILECACHE\\debris_smoke.STI" );
}
}
strcpy( AniParams.zCachedFile, "TILECACHE\\debris_smoke.STI" );
break;
case FIRERETARDANT_SMOKE_EFFECT:
strcpy( AniParams.zCachedFile, "TILECACHE\\white_smoke.STI" );
break;
}
@@ -769,6 +744,15 @@ void DecaySmokeEffects( UINT32 uiTime )
}
}
// Flugente: if tile has a fire retardant effect, don't create new fire
if ( Explosive[Item[pSmoke->usItem].ubClassIndex].ubType == EXPLOSV_BURNABLEGAS )
{
if ( gpWorldLevelData[pSmoke->sGridNo].ubExtFlags[bLevel] & MAPELEMENT_EXT_FIRERETARDANT_SMOKE )
{
pSmoke->bAge = pSmoke->ubDuration + 1;
}
}
if ( fUpdate )
{
pSmoke->uiTimeOfLastUpdate = uiTime;
+1
View File
@@ -13,6 +13,7 @@ enum
BURNABLEGAS_SMOKE_EFFECT,
SIGNAL_SMOKE_EFFECT, // added by Flugente for artillery
DEBRIS_SMOKE_EFFECT, // added by Flugente for collapsing roofs
FIRERETARDANT_SMOKE_EFFECT, // added by Flugente for fire extinguishers
};
#define SMOKE_EFFECT_INDOORS 0x01
+12 -1
View File
@@ -560,8 +560,19 @@ void UpdateAniTiles( )
ubExpType = Explosive[ Item[ (UINT16)pNode->uiUserData ].ubClassIndex ].ubType;
// Flugente: if tile has a fire retardant effect, don't create new fire
if ( ubExpType == EXPLOSV_BURNABLEGAS )
{
if ( gpWorldLevelData[pNode->sGridNo].ubExtFlags[gExplosionData[pNode->uiUserData3].Params.bLevel] & MAPELEMENT_EXT_FIRERETARDANT_SMOKE )
{
// don't add fire
return;
}
}
if ( ubExpType == EXPLOSV_TEARGAS || ubExpType == EXPLOSV_MUSTGAS ||
ubExpType == EXPLOSV_SMOKE || ubExpType == EXPLOSV_BURNABLEGAS || ubExpType == EXPLOSV_SIGNAL_SMOKE || ubExpType == EXPLOSV_SMOKE_DEBRIS || ubExpType == EXPLOSV_CREATUREGAS)
ubExpType == EXPLOSV_SMOKE || ubExpType == EXPLOSV_BURNABLEGAS || ubExpType == EXPLOSV_SIGNAL_SMOKE || ubExpType == EXPLOSV_SMOKE_DEBRIS || ubExpType == EXPLOSV_CREATUREGAS ||
ubExpType == EXPLOSV_SMOKE_FIRERETARDANT )
{
// Do sound....
// PlayJA2Sample( AIR_ESCAPING_1, RATE_11025, SoundVolume( HIGHVOLUME, pNode->sGridNo ), 1, SoundDir( pNode->sGridNo ) );
+2 -1
View File
@@ -133,12 +133,13 @@ class SOLDIERTYPE;
#define MAPELEMENT_EXT_CLIMBPOINT 0x0200 //0x200
#define MAPELEMENT_EXT_SIGNAL_SMOKE 0x0400 //0x400 // added by Flugente
#define MAPELEMENT_EXT_DEBRIS_SMOKE 0x0800 //0x800 // added by Flugente
#define MAPELEMENT_EXT_FIRERETARDANT_SMOKE 0x1000 //0x800 // added by Flugente
#define FIRST_LEVEL 0
#define SECOND_LEVEL 1
//#define ANY_SMOKE_EFFECT ( MAPELEMENT_EXT_CREATUREGAS | MAPELEMENT_EXT_SMOKE | MAPELEMENT_EXT_TEARGAS | MAPELEMENT_EXT_MUSTARDGAS )
#define ANY_SMOKE_EFFECT ( MAPELEMENT_EXT_CREATUREGAS | MAPELEMENT_EXT_SMOKE | MAPELEMENT_EXT_TEARGAS | MAPELEMENT_EXT_MUSTARDGAS | MAPELEMENT_EXT_BURNABLEGAS | MAPELEMENT_EXT_SIGNAL_SMOKE | MAPELEMENT_EXT_DEBRIS_SMOKE )
#define ANY_SMOKE_EFFECT ( MAPELEMENT_EXT_CREATUREGAS | MAPELEMENT_EXT_SMOKE | MAPELEMENT_EXT_TEARGAS | MAPELEMENT_EXT_MUSTARDGAS | MAPELEMENT_EXT_BURNABLEGAS | MAPELEMENT_EXT_SIGNAL_SMOKE | MAPELEMENT_EXT_DEBRIS_SMOKE | MAPELEMENT_EXT_FIRERETARDANT_SMOKE )
// WDS - Clean up inventory handling