4 #define ANI_TOPMOST_LEVEL 7
7 #define EXPLOSION_FLAG_USEABSPOS 0x00000001
8 #define EXPLOSION_FLAG_DISPLAYONLY 0x00000002
10 #define MIN_AMB_LEVEL_FOR_MERC_LIGHTS 9
11 #define ROOF_LEVEL_HEIGHT 50
13 #define WALL_HEIGHT 50
16 #define ANITILE_FORWARD 0x00000040
17 #define ANITILE_CACHEDTILE 0x00008000
18 #define ANITILE_NOZBLITTER 0x00040000
19 #define ANITILE_ALWAYS_TRANSLUCENT 0x00100000
20 #define ANITILE_EXPLOSION 0x20000000
23 typedef unsigned char BOOLEAN;
25 typedef signed char INT8;
26 typedef unsigned char UINT8;
27 typedef signed short INT16;
28 typedef unsigned short UINT16;
29 typedef signed int INT32;
30 typedef unsigned int UINT32;
33 typedef struct LEVELNODE LEVELNODE;
36 typedef struct TAG_anitile_params
38 UINT32 uiFlags; // flags struct
39 UINT8 ubLevelID; // Level ID for rendering layer
40 INT16 sStartFrame; // Start frame
41 INT16 sDelay; // Delay time
42 UINT16 usTileType; // Tile databse type ( optional )
43 UINT16 usTileIndex; // Tile database index ( optional )
44 INT16 sX; // World X ( optional )
45 INT16 sY; // World Y ( optional )
46 INT16 sZ; // World Z ( optional )
47 INT16 sGridNo; // World GridNo
49 LEVELNODE *pGivenLevelNode; // Levelnode for existing tile ( optional )
50 const char* zCachedFile; // Filename for cached tile name ( optional )
52 UINT8 ubOwner; // UBID for the owner
53 UINT8 ubKeyFrame1; // Key frame 1
54 UINT32 uiKeyFrame1Code; // Key frame code
55 UINT8 ubKeyFrame2; // Key frame 2
56 UINT32 uiKeyFrame2Code; // Key frame code
75 INT16 sX; // World X ( optional )
76 INT16 sY; // World Y ( optional )
77 INT16 sZ; // World Z ( optional )
78 INT16 sGridNo; // World GridNo
80 INT8 bLevel; // World level
87 EXPLOSION_PARAMS Params;
99 ANI_KEYFRAME_BEGIN_TRANSLUCENCY,
100 ANI_KEYFRAME_BEGIN_DAMAGE,
101 ANI_KEYFRAME_CHAIN_WATER_EXPLOSION,
102 ANI_KEYFRAME_DO_SOUND,
106 // SOUNDS ENUMERATION
179 CREATURE_BATTLECRY_1,
186 // ROCKET GUN COMPUTER VOICE...
194 // AIR RAID SOUNDS...
241 S_SMALL_ROCKET_LAUNCHER,
298 // CREATURE SOUNDS....
335 AUTORESOLVE_FINISHFX,
337 //Interface buttons, misc.
344 COMPUTER_SWITCH1_OUT,
361 ATTACH_CERAMIC_PLATES,
367 UNSTEALTHY_OUTSIDE_1,
368 UNSTEALTHY_OUTSIDE_2,
371 OPEN_DEFAULT_OPENABLE,
372 CLOSE_DEFAULT_OPENABLE,
391 DRINK_CANTEEN_FEMALE,
416 PICKING_SOMETHING_UP,
425 CREATURE_FALL_PART_2,
429 CROW_PECKING_AT_FLESH,
440 EXPLOSION_ALT_BLAST_1,
451 // TERRAIN ID VALUES.
485 CHAR8 sBlastSpeeds[] =
499 UINT8 ubDamageKeyFrame[NUM_EXP_TYPES] =
513 UINT32 uiExplosionSoundID[NUM_EXP_TYPES] =
517 EXPLOSION_BLAST_2, //LARGE
527 UINT8 ubTransKeyFrame[NUM_EXP_TYPES] =
541 CHAR8 zBlastFilenames[][70] =
544 "TILECACHE/zgrav_d.sti",
545 "TILECACHE/zgrav_c.sti",
546 "TILECACHE/zgrav_b.sti",
547 "TILECACHE/shckwave.sti",
548 "TILECACHE/wat_exp.sti",
549 "TILECACHE/tear_exp.sti",
550 "TILECACHE/tear_exp.sti",
551 "TILECACHE/must_exp.sti",
555 UINT8 ubAmbientLightLevel;
558 static void GenerateExplosionFromExplosionPointer(EXPLOSIONTYPE* pExplosion)
572 ANITILE_PARAMS AniParams;
574 // Assign param values
575 uiFlags = pExplosion->Params.uiFlags;
576 ubOwner = pExplosion->Params.ubOwner;
577 ubTypeID = pExplosion->Params.ubTypeID;
578 sX = pExplosion->Params.sX;
579 sY = pExplosion->Params.sY;
580 sZ = pExplosion->Params.sZ;
581 sGridNo = pExplosion->Params.sGridNo;
582 usItem = pExplosion->Params.usItem;
583 bLevel = pExplosion->Params.bLevel;
585 // If Z value given is 0 and bLevel > 0, make z heigher
586 if ( sZ == 0 && bLevel > 0 )
588 sZ = ROOF_LEVEL_HEIGHT;
591 pExplosion->iLightID = -1;
593 // OK, if we are over water.... use water explosion...
594 ubTerrainType = GetTerrainType( sGridNo );
597 memset( &AniParams, 0, sizeof( ANITILE_PARAMS ) );
599 AniParams.sGridNo = sGridNo;
600 AniParams.ubLevelID = ANI_TOPMOST_LEVEL;
601 AniParams.sDelay = sBlastSpeeds[ ubTypeID ];
602 AniParams.sStartFrame = pExplosion->sCurrentFrame;
603 AniParams.uiFlags = ANITILE_CACHEDTILE | ANITILE_FORWARD | ANITILE_EXPLOSION;
605 if ( ubTerrainType == LOW_WATER || ubTerrainType == MED_WATER || ubTerrainType == DEEP_WATER )
607 // Change type to water explosion...
608 ubTypeID = WATER_BLAST;
609 AniParams.uiFlags |= ANITILE_ALWAYS_TRANSLUCENT;
613 if ( sZ < WALL_HEIGHT )
615 AniParams.uiFlags |= ANITILE_NOZBLITTER;
618 if ( uiFlags & EXPLOSION_FLAG_USEABSPOS )
624 //AniParams.uiFlags |= ANITILE_USEABSOLUTEPOS;
627 AniParams.ubKeyFrame1 = ubTransKeyFrame[ ubTypeID ];
628 AniParams.uiKeyFrame1Code = ANI_KEYFRAME_BEGIN_TRANSLUCENCY;
630 if ( !( uiFlags & EXPLOSION_FLAG_DISPLAYONLY ) )
632 AniParams.ubKeyFrame2 = ubDamageKeyFrame[ ubTypeID ];
633 AniParams.uiKeyFrame2Code = ANI_KEYFRAME_BEGIN_DAMAGE;
635 AniParams.uiUserData = usItem;
636 AniParams.ubUserData2 = ubOwner;
637 AniParams.uiUserData3 = pExplosion->iID;
638 AniParams.zCachedFile = zBlastFilenames[ubTypeID];
639 CreateAnimationTile( &AniParams );
641 // set light source....
642 if ( pExplosion->iLightID == -1 )
644 // DO ONLY IF WE'RE AT A GOOD LEVEL
645 if ( ubAmbientLightLevel >= MIN_AMB_LEVEL_FOR_MERC_LIGHTS )
647 if( ( pExplosion->iLightID = LightSpriteCreate("L-R04.LHT", 0 ) ) != (-1) )
649 LightSpritePower( pExplosion->iLightID, TRUE );
651 LightSpritePosition( pExplosion->iLightID, (INT16)(sX/CELL_X_SIZE), (INT16)(sY/CELL_Y_SIZE) );
656 uiSoundID = uiExplosionSoundID[ ubTypeID ];
658 if ( uiSoundID == EXPLOSION_1 )
661 if ( Random( 2 ) == 0 )
663 uiSoundID = EXPLOSION_ALT_BLAST_1;
667 PlayJA2Sample(uiSoundID, SoundVolume(HIGHVOLUME, sGridNo), 1, SoundDir(sGridNo));
673 GenerateExplosionFromExplosionPointer(0);