#ifdef PRECOMPILEDHEADERS #include "TileEngine All.h" #else #include #include #include "wcheck.h" #include "stdlib.h" #include "debug.h" #include "soldier control.h" #include "weapons.h" #include "handle items.h" #include "worlddef.h" #include "worldman.h" #include "animation control.h" #include "tile animation.h" #include "handle items.h" #include "lighteffects.h" #include "message.h" #include "isometric utils.h" #include "renderworld.h" #include "explosion control.h" #include "Random.h" #include "lighting.h" #endif #include "SaveLoadGame.h" #define NUM_LIGHT_EFFECT_SLOTS 25 // GLOBAL FOR LIGHT LISTING LIGHTEFFECT gLightEffectData[ NUM_LIGHT_EFFECT_SLOTS ]; UINT32 guiNumLightEffects = 0; INT32 GetFreeLightEffect( void ); void RecountLightEffects( void ); INT32 GetFreeLightEffect( void ) { UINT32 uiCount; for(uiCount=0; uiCount < guiNumLightEffects; uiCount++) { if(( gLightEffectData[uiCount].fAllocated==FALSE ) ) return( (INT32)uiCount ); } if( guiNumLightEffects < NUM_LIGHT_EFFECT_SLOTS ) return( (INT32) guiNumLightEffects++ ); return( -1 ); } void RecountLightEffects( void ) { INT32 uiCount; for(uiCount=guiNumLightEffects-1; (uiCount >=0) ; uiCount--) { if( ( gLightEffectData[uiCount].fAllocated ) ) { guiNumLightEffects=(UINT32)(uiCount+1); break; } } } void UpdateLightingSprite( LIGHTEFFECT *pLight ) { CHAR8 LightName[20]; // Build light.... sprintf( LightName, "Light%d", pLight->bRadius ); // Delete old one if one exists... if( pLight->iLight!=(-1) ) { LightSpriteDestroy( pLight->iLight ); pLight->iLight = -1; } // Effect light..... if( ( pLight->iLight = LightSpriteCreate( LightName, 0 ) )==(-1)) { // Could not light! return; } LightSpritePower( pLight->iLight, TRUE ); // LightSpriteFake( pLight->iLight ); LightSpritePosition( pLight->iLight, (INT16)( CenterX( pLight->sGridNo ) / CELL_X_SIZE ), (INT16)( CenterY( pLight->sGridNo ) / CELL_Y_SIZE ) ); } INT32 NewLightEffect( INT16 sGridNo, UINT16 ubDuration, UINT8 ubStartRadius ) { LIGHTEFFECT *pLight; INT32 iLightIndex; if( ( iLightIndex = GetFreeLightEffect() )==(-1) ) return(-1); memset( &gLightEffectData[ iLightIndex ], 0, sizeof( LIGHTEFFECT ) ); pLight = &gLightEffectData[ iLightIndex ]; // Set some values... pLight->sGridNo = sGridNo; pLight->iLight = -1; pLight->uiTimeOfLastUpdate = GetWorldTotalSeconds( ); pLight->ubDuration = ubDuration; pLight->bRadius = ubStartRadius; pLight->bAge = 0; pLight->fAllocated = TRUE; UpdateLightingSprite( pLight ); // Handle sight here.... AllTeamsLookForAll( FALSE ); //Play the breaklight sound // PlayJA2Sample( BREAK_LIGHT_IGNITING, RATE_11025, SoundVolume( LOWVOLUME, sGridNo ), 1, SoundDir( sGridNo ) ); // MAdd: for some reason this crashes the game! return( pLight->iLight ); } void RemoveLightEffectFromTile( INT16 sGridNo ) { LIGHTEFFECT *pLight; UINT32 cnt; // Set to unallocated.... for ( cnt = 0; cnt < guiNumLightEffects; cnt++ ) { pLight = &gLightEffectData[ cnt ]; if ( pLight->fAllocated ) { if ( pLight->sGridNo == sGridNo ) { pLight->fAllocated = FALSE; // Remove light.... if( pLight->iLight != (-1) ) { LightSpriteDestroy( pLight->iLight ); } break; } } } } BOOLEAN IsLightEffectAtTile( INT16 sGridNo ) { LIGHTEFFECT *pLight; UINT32 cnt; // Set to unallocated.... for ( cnt = 0; cnt < guiNumLightEffects; cnt++ ) { pLight = &gLightEffectData[ cnt ]; if ( pLight->fAllocated ) { if ( pLight->sGridNo == sGridNo ) { return TRUE; } } } return FALSE; } void DecayLightEffects( UINT32 uiTime ) { LIGHTEFFECT *pLight; UINT32 cnt, cnt2; BOOLEAN fDelete = FALSE; UINT16 usNumUpdates = 1; // age all active tear gas clouds, deactivate those that are just dispersing for ( cnt = 0; cnt < guiNumLightEffects; cnt++ ) { pLight = &gLightEffectData[ cnt ]; fDelete = FALSE; if ( pLight->fAllocated ) { // ATE: Do this every so ofte, to acheive the effect we want... if ( ( uiTime - pLight->uiTimeOfLastUpdate ) > 10 ) { usNumUpdates = ( UINT16 ) ( ( uiTime - pLight->uiTimeOfLastUpdate ) / 10 ); pLight->uiTimeOfLastUpdate = uiTime; for ( cnt2 = 0; cnt2 < usNumUpdates; cnt2++ ) { pLight->bAge++; if ( pLight->ubDuration <= 0 ) fDelete = TRUE; // if this cloud 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 ) ) { pLight->bRadius--; } if ( pLight->bRadius == 0 ) { // Delete... fDelete = TRUE; break; } else { UpdateLightingSprite( pLight ); } } else { fDelete = TRUE; break; } } if ( fDelete ) { pLight->fAllocated = FALSE; if( pLight->iLight != (-1) ) { LightSpriteDestroy( pLight->iLight ); } } // Handle sight here.... AllTeamsLookForAll( FALSE ); } } } } BOOLEAN SaveLightEffectsToSaveGameFile( HWFILE hFile ) { /* UINT32 uiNumBytesWritten; UINT32 uiNumberOfLights=0; UINT32 uiCnt; //loop through and count the number of active slots for( uiCnt=0; uiCnt