From 5b8f91912f0917d66276dbcb94e924f7bb3370ed Mon Sep 17 00:00:00 2001 From: Sevenfm Date: Tue, 3 Mar 2020 17:48:43 +0000 Subject: [PATCH] First decay light effects and then decay smoke effects, because fire can create light. Dynamic creation of light effects for fire and signal smoke (ADD_LIGHT_AFTER_EXPLOSION option). Fixed/improved code to decay light effects so that ubDuration works correctly. Note: tag is not used for light effects as they cannot spread, light is always created with and can only decay later. Improved code to decay smoke effects. git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@8767 3b4a5df2-a311-0410-b5c6-a8a6f20db521 --- Tactical/Tactical Turns.cpp | 5 ++--- Tactical/TeamTurns.cpp | 2 +- TileEngine/Explosion Control.cpp | 19 ++++++++++++++----- TileEngine/LightEffects.cpp | 15 +++++++++------ TileEngine/SmokeEffects.cpp | 2 +- 5 files changed, 27 insertions(+), 16 deletions(-) diff --git a/Tactical/Tactical Turns.cpp b/Tactical/Tactical Turns.cpp index 56c07535..3be55649 100644 --- a/Tactical/Tactical Turns.cpp +++ b/Tactical/Tactical Turns.cpp @@ -181,10 +181,9 @@ void HandleTacticalEndTurn( ) } DecayBombTimers( ); - - DecaySmokeEffects( uiTime ); - + DecayLightEffects( uiTime ); + DecaySmokeEffects( uiTime ); // Decay smells //DecaySmells(); diff --git a/Tactical/TeamTurns.cpp b/Tactical/TeamTurns.cpp index 3696aa06..1821b419 100644 --- a/Tactical/TeamTurns.cpp +++ b/Tactical/TeamTurns.cpp @@ -460,8 +460,8 @@ void EndTurnEvents( void ) // decay bomb timers and maybe set some off! DecayBombTimers(); - DecaySmokeEffects( GetWorldTotalSeconds( ) ); DecayLightEffects( GetWorldTotalSeconds( ) ); + DecaySmokeEffects( GetWorldTotalSeconds( ) ); SOLDIERTYPE* pSoldier = NULL; UINT32 cnt = gTacticalStatus.Team[ gbPlayerNum ].bFirstID; diff --git a/TileEngine/Explosion Control.cpp b/TileEngine/Explosion Control.cpp index 93bcfe88..9c818526 100644 --- a/TileEngine/Explosion Control.cpp +++ b/TileEngine/Explosion Control.cpp @@ -415,15 +415,15 @@ void InternalIgniteExplosion( UINT8 ubOwner, INT16 sX, INT16 sY, INT16 sZ, INT32 } // sevenfm: add light for fire and signal effects - if (gGameExternalOptions.bAddLightAfterExplosion && + /*if (gGameExternalOptions.bAddLightAfterExplosion && ((gubEnvLightValue >= NORMAL_LIGHTLEVEL_NIGHT - 3) || gbWorldSectorZ) && (Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_BURNABLEGAS || Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_SIGNAL_SMOKE) && bLevel == 0 && !Water(sGridNo, bLevel)) { // add light - NewLightEffect(sGridNo, (UINT8)Explosive[Item[usItem].ubClassIndex].ubDuration + 2, (UINT8)Explosive[Item[usItem].ubClassIndex].ubRadius + 1); - } + NewLightEffect(sGridNo, (UINT8)Explosive[Item[usItem].ubClassIndex].ubDuration + Explosive[Item[usItem].ubClassIndex].ubRadius - Explosive[Item[usItem].ubClassIndex].ubStartRadius, (UINT8)Explosive[Item[usItem].ubClassIndex].ubRadius + 1); + }*/ } @@ -2980,6 +2980,17 @@ void SpreadEffect( INT32 sGridNo, UINT8 ubRadius, UINT16 usItem, UINT8 ubOwner, fSmokeEffect = TRUE; break; } + + // sevenfm: create light effect for fire and signal smoke + if (gGameExternalOptions.bAddLightAfterExplosion && + fSubsequent != ERASE_SPREAD_EFFECT && + ((gubEnvLightValue >= NORMAL_LIGHTLEVEL_NIGHT - 3) || gbWorldSectorZ) && + (Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_BURNABLEGAS || Explosive[Item[usItem].ubClassIndex].ubType == EXPLOSV_SIGNAL_SMOKE) && + bLevel == 0 && + !Water(sGridNo, bLevel)) + { + NewLightEffect(sGridNo, 1, ubRadius); + } /*if(is_networked) { ScreenMsg( FONT_LTBLUE, MSG_MPSYSTEM, L"explosives not coded in MP"); @@ -3000,7 +3011,6 @@ void SpreadEffect( INT32 sGridNo, UINT8 ubRadius, UINT16 usItem, UINT8 ubOwner, fRecompileMovement = TRUE; } - for (ubDir = NORTH; ubDir <= NORTHWEST; ubDir++ ) { uiTempSpot = sGridNo; @@ -3176,7 +3186,6 @@ void SpreadEffect( INT32 sGridNo, UINT8 ubRadius, UINT16 usItem, UINT8 ubOwner, if ( fSubsequent != BLOOD_SPREAD_EFFECT ) { MakeNoise( NOBODY, sGridNo, bLevel, gpWorldLevelData[sGridNo].ubTerrainID, (UINT8)Explosive[ Item [ usItem ].ubClassIndex ].ubVolume, NOISE_EXPLOSION ); - } gfMPDebugOutputRandoms = false; diff --git a/TileEngine/LightEffects.cpp b/TileEngine/LightEffects.cpp index 599acb25..66cf05ac 100644 --- a/TileEngine/LightEffects.cpp +++ b/TileEngine/LightEffects.cpp @@ -212,7 +212,7 @@ void DecayLightEffects( UINT32 uiTime ) BOOLEAN fAnyUpdate = FALSE; UINT16 usNumUpdates = 1; - // age all active tear gas clouds, deactivate those that are just dispersing + // age all active light effects, deactivate those that are just dispersing for ( cnt = 0; cnt < guiNumLightEffects; ++cnt ) { pLight = &gLightEffectData[ cnt ]; @@ -229,8 +229,8 @@ void DecayLightEffects( UINT32 uiTime ) { fUpdate = TRUE; } - // ATE: Do this every so ofte, to acheive the effect we want... - else if ( (uiTime - pLight->uiTimeOfLastUpdate) > 10 ) + // ATE: Do this every so often, to achieve the effect we want... + else if ( (uiTime - pLight->uiTimeOfLastUpdate) >= 10 ) { fUpdate = TRUE; usNumUpdates = (UINT16)((uiTime - pLight->uiTimeOfLastUpdate) / 10); @@ -247,14 +247,17 @@ void DecayLightEffects( UINT32 uiTime ) if ( pLight->ubDuration <= 0 ) fDelete = TRUE; - // if this cloud remains effective (duration not reached) + // if this light remains effective (duration not reached) if ( pLight->bAge < pLight->ubDuration) { // calculate the new cloud radius - // cloud expands by 1 every turn outdoors, and every other turn indoors - if ( ( pLight->bAge % 2 ) ) + /*if ( ( pLight->bAge % 2 ) ) { --pLight->bRadius; + }*/ + if (pLight->ubDuration - pLight->bAge < pLight->bRadius) + { + pLight->bRadius--; } if ( pLight->bRadius == 0 ) diff --git a/TileEngine/SmokeEffects.cpp b/TileEngine/SmokeEffects.cpp index 0a563dcc..adc00671 100644 --- a/TileEngine/SmokeEffects.cpp +++ b/TileEngine/SmokeEffects.cpp @@ -763,7 +763,7 @@ void DecaySmokeEffects( UINT32 uiTime ) else { // ATE: Do this every so ofte, to acheive the effect we want... - if ( ( uiTime - pSmoke->uiTimeOfLastUpdate ) > 10 ) + if ( ( uiTime - pSmoke->uiTimeOfLastUpdate ) >= 10 ) { fUpdate = TRUE; usNumUpdates = ( UINT16 ) ( ( uiTime - pSmoke->uiTimeOfLastUpdate ) / 10 );