Testcase for bug in register allocator: esp gets assigned to a node. This was not...
[libfirm] / ir / be / test / fehler39.c
1 #include <string.h>
2
3
4 #define ANI_TOPMOST_LEVEL               7
5 #define CELL_X_SIZE                    10
6 #define CELL_Y_SIZE                    10
7 #define EXPLOSION_FLAG_USEABSPOS      0x00000001
8 #define EXPLOSION_FLAG_DISPLAYONLY    0x00000002
9 #define HIGHVOLUME                    127
10 #define MIN_AMB_LEVEL_FOR_MERC_LIGHTS   9
11 #define ROOF_LEVEL_HEIGHT              50
12 #define TRUE                            1
13 #define WALL_HEIGHT                    50
14
15
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
21
22
23 typedef unsigned char  BOOLEAN;
24 typedef          char  CHAR8;
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;
31
32
33 typedef struct LEVELNODE LEVELNODE;
34
35
36 typedef struct TAG_anitile_params
37 {
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
48
49         LEVELNODE                                                                               *pGivenLevelNode;                       // Levelnode for existing tile ( optional )
50         const char* zCachedFile; // Filename for cached tile name ( optional )
51
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
57
58         UINT32                                                                                  uiUserData;
59         UINT8                                                                                           ubUserData2;
60         UINT32                                                                                  uiUserData3;
61
62 } ANITILE_PARAMS;
63
64
65 // Explosion Data
66 typedef struct
67 {
68         UINT32                                                                                  uiFlags;
69
70         UINT8                                                                                           ubOwner;
71         UINT8                                                                                           ubTypeID;
72
73         UINT16                                                                                  usItem;
74
75         INT16                                                                                           sX;                                                                             // World X ( optional )
76         INT16                                                                                           sY;                                                                             // World Y ( optional )
77         INT16                                                                                           sZ;                                                                             // World Z ( optional )
78         INT16                                                                                           sGridNo;                                                        // World GridNo
79         BOOLEAN                                                                                 fLocate;
80         INT8                                                                                            bLevel;                                                         // World level
81         UINT8                                                                                           ubUnsed[1];
82 } EXPLOSION_PARAMS;
83
84
85 typedef struct
86 {
87         EXPLOSION_PARAMS                Params;
88         BOOLEAN                                                 fAllocated;
89         INT16                                                           sCurrentFrame;
90         INT32                                                           iID;
91         INT32                                                           iLightID;
92         UINT8                                                           ubUnsed[2];
93 } EXPLOSIONTYPE;
94
95
96 enum
97 {
98         ANI_KEYFRAME_NO_CODE,
99         ANI_KEYFRAME_BEGIN_TRANSLUCENCY,
100         ANI_KEYFRAME_BEGIN_DAMAGE,
101         ANI_KEYFRAME_CHAIN_WATER_EXPLOSION,
102   ANI_KEYFRAME_DO_SOUND,
103 } KeyFrameEnums;
104
105
106 // SOUNDS ENUMERATION
107 enum SoundDefines
108 {
109         MISS_1 = 0,
110         MISS_2,
111         MISS_3,
112         MISS_4,
113         MISS_5,
114         MISS_6,
115         MISS_7,
116         MISS_8,
117         MISS_G1,
118         MISS_G2,
119         MISS_KNIFE,
120         FALL_1,
121         FALL_2,
122         FALL_TO_GROUND_1,
123         FALL_TO_GROUND_2,
124         FALL_TO_GROUND_3,
125         HEAVY_FALL_1,
126         BODY_SPLAT_1,
127         GLASS_SHATTER1,
128         GLASS_SHATTER2,
129         DROPEN_1,
130         DROPEN_2,
131         DROPEN_3,
132         DRCLOSE_1,
133         DRCLOSE_2,
134         UNLOCK_DOOR_1,
135         KICKIN_DOOR,
136         BREAK_LOCK,
137         PICKING_LOCK,
138
139         GARAGE_DOOR_OPEN,
140         GARAGE_DOOR_CLOSE,
141         ELEVATOR_DOOR_OPEN,
142         ELEVATOR_DOOR_CLOSE,
143         HITECH_DOOR_OPEN,
144         HITECH_DOOR_CLOSE,
145         CURTAINS_OPEN,
146         CURTAINS_CLOSE,
147         METAL_DOOR_OPEN,
148         METAL_DOOR_CLOSE,
149
150         WALK_LEFT_OUT,
151         WALK_RIGHT_OUT,
152         WALK_LEFT_OUT2,
153         WALK_RIGHT_OUT2,
154         WALK_LEFT_IN,
155         WALK_RIGHT_IN,
156         WALK_LEFT_IN2,
157         WALK_RIGHT_IN2,
158         WALK_LEFT_ROAD,
159         WALK_RIGHT_ROAD,
160         WALK_LEFT_ROAD2,
161         WALK_RIGHT_ROAD2,
162         CRAWL_1,
163         CRAWL_2,
164         CRAWL_3,
165         CRAWL_4,
166         TARG_REFINE_BEEP,
167         ENDTURN_1,
168         HEADCR_1,
169         DOORCR_1,
170         HEADSPLAT_1,
171         BODY_EXPLODE_1,
172         EXPLOSION_1,
173         CROW_EXPLODE_1,
174         SMALL_EXPLODE_1,
175         HELI_1,
176         BULLET_IMPACT_1,
177         BULLET_IMPACT_2,
178         BULLET_IMPACT_3,
179         CREATURE_BATTLECRY_1,
180         ENTER_WATER_1,
181         ENTER_DEEP_WATER_1,
182
183         COW_HIT_SND,
184         COW_DIE_SND,
185
186         // ROCKET GUN COMPUTER VOICE...
187         RG_ID_IMPRINTED,
188         RG_ID_INVALID,
189         RG_TARGET_SELECTED,
190
191         // CAVE COLLAPSE
192         CAVE_COLLAPSE,
193
194         // AIR RAID SOUNDS...
195         S_RAID_WHISTLE,
196         S_RAID_AMBIENT,
197         S_RAID_DIVE,
198         S_RAID_TB_DIVE,
199         S_RAID_TB_BOMB,
200
201         // VEHICLE SOUNDS
202         S_VECH1_MOVE,
203         S_VECH1_ON,
204         S_VECH1_OFF,
205         S_VECH1_INTO,
206
207         S_DRYFIRE1,
208
209         // IMPACT SOUNDS
210         S_WOOD_IMPACT1,
211         S_WOOD_IMPACT2,
212         S_WOOD_IMPACT3,
213         S_PORCELAIN_IMPACT1,
214         S_RUBBER_IMPACT1,
215         S_STONE_IMPACT1,
216         S_WATER_IMPACT1,
217         S_VEG_IMPACT1,
218         S_METAL_IMPACT1,
219         S_METAL_IMPACT2,
220         S_METAL_IMPACT3,
221
222         S_SLAP_IMPACT,
223
224         // WEAPON RELOAD
225         S_RELOAD_REVOLVER,
226         S_RELOAD_PISTOL,
227         S_RELOAD_SMG,
228         S_RELOAD_RIFLE,
229         S_RELOAD_SHOTGUN,
230         S_RELOAD_LMG,
231
232         // WEAPON LOCKNLOAD
233         S_LNL_REVOLVER,
234         S_LNL_PISTOL,
235         S_LNL_SMG,
236         S_LNL_RIFLE,
237         S_LNL_SHOTGUN,
238         S_LNL_LMG,
239
240         //WEAPON SHOT SOUNDS
241         S_SMALL_ROCKET_LAUNCHER,
242         S_GLAUNCHER,
243         S_UNDER_GLAUNCHER,
244         S_ROCKET_LAUNCHER,
245         S_MORTAR_SHOT,
246         S_GLOCK17,
247         S_GLOCK18,
248         S_BERETTA92,
249         S_BERETTA93,
250         S_SWSPECIAL,
251         S_BARRACUDA,
252         S_DESERTEAGLE,
253         S_M1911,
254         S_MP5K,
255         S_MAC10,
256         S_THOMPSON,
257         S_COMMANDO,
258         S_MP53,
259         S_AKSU74,
260         S_P90,
261         S_TYPE85,
262         S_SKS,
263         S_DRAGUNOV,
264         S_M24,
265         S_AUG,
266         S_G41,
267         S_RUGERMINI,
268         S_C7,
269         S_FAMAS,
270         S_AK74,
271         S_AKM,
272         S_M14,
273         S_FNFAL,
274         S_G3A3,
275         S_G11,
276         S_M870,
277         S_SPAS,
278         S_CAWS,
279         S_FNMINI,
280         S_RPK74,
281         S_21E,
282         S_THROWKNIFE,
283         S_TANK_CANNON,
284         S_BURSTTYPE1,
285   S_AUTOMAG,
286
287         S_SILENCER_1,
288         S_SILENCER_2,
289
290         // SWOOSHES.
291         SWOOSH_1,
292         SWOOSH_2,
293         SWOOSH_3,
294         SWOOSH_4,
295         SWOOSH_5,
296         SWOOSH_6,
297
298         // CREATURE SOUNDS....
299         ACR_FALL_1,
300         ACR_STEP_1,
301         ACR_STEP_2,
302         ACR_SWIPE,
303         ACR_EATFLESH,
304         ACR_CRIPPLED,
305         ACR_DIE_PART1,
306         ACR_DIE_PART2,
307         ACR_LUNGE,
308         ACR_SMELL_THREAT,
309         ACR_SMEEL_PREY,
310         ACR_SPIT,
311         //BABY
312         BCR_DYING,
313         BCR_DRAGGING,
314         BCR_SHRIEK,
315         BCR_SPITTING,
316         // LARVAE
317         LCR_MOVEMENT,
318         LCR_RUPTURE,
319         // QUEEN
320         LQ_SHRIEK,
321         LQ_DYING,
322         LQ_ENRAGED_ATTACK,
323         LQ_RUPTURING,
324         LQ_CRIPPLED,
325         LQ_SMELLS_THREAT,
326         LQ_WHIP_ATTACK,
327
328         THROW_IMPACT_1,
329         THROW_IMPACT_2,
330
331         IDLE_SCRATCH,
332         IDLE_ARMPIT,
333         IDLE_BACKCRACK,
334
335         AUTORESOLVE_FINISHFX,
336
337         //Interface buttons, misc.
338         EMAIL_ALERT,
339         ENTERING_TEXT,
340         REMOVING_TEXT,
341         COMPUTER_BEEP2_IN,
342         COMPUTER_BEEP2_OUT,
343         COMPUTER_SWITCH1_IN,
344         COMPUTER_SWITCH1_OUT,
345         VSM_SWITCH1_IN,
346         VSM_SWITCH1_OUT,
347         VSM_SWITCH2_IN,
348         VSM_SWITCH2_OUT,
349         SM_SWITCH1_IN,
350         SM_SWITCH1_OUT,
351         SM_SWITCH2_IN,
352         SM_SWITCH2_OUT,
353         SM_SWITCH3_IN,
354         SM_SWITCH3_OUT,
355         BIG_SWITCH3_IN,
356         BIG_SWITCH3_OUT,
357         KLAXON_ALARM,
358         BOXING_BELL,
359         HELI_CRASH,
360         ATTACH_TO_GUN,
361         ATTACH_CERAMIC_PLATES,
362         ATTACH_DETONATOR,
363
364         GRAB_ROOF,
365         LAND_ON_ROOF,
366
367         UNSTEALTHY_OUTSIDE_1,
368         UNSTEALTHY_OUTSIDE_2,
369         UNSTEALTHY_INSIDE_1,
370
371         OPEN_DEFAULT_OPENABLE,
372         CLOSE_DEFAULT_OPENABLE,
373
374         FIRE_ON_MERC,
375         GLASS_CRACK,
376         SPIT_RICOCHET,
377
378         BLOODCAT_HIT_1,
379         BLOODCAT_DIE_1,
380         SLAP_1,
381
382         ROBOT_BEEP,
383         DOOR_ELECTRICITY,
384         SWIM_1,
385         SWIM_2,
386         KEY_FAILURE,
387         TARGET_OUT_OF_RANGE,
388   OPEN_STATUE,
389   USE_STATUE_REMOTE,
390   USE_WIRE_CUTTERS,
391   DRINK_CANTEEN_FEMALE,
392   BLOODCAT_ATTACK,
393   BLOODCAT_ROAR,
394   ROBOT_GREETING,
395   ROBOT_DEATH,
396   GAS_EXPLODE_1,
397   AIR_ESCAPING_1,
398
399   OPEN_DRAWER,
400   CLOSE_DRAWER,
401   OPEN_LOCKER,
402   CLOSE_LOCKER,
403   OPEN_WOODEN_BOX,
404   CLOSE_WOODEN_BOX,
405   ROBOT_STOP,
406
407         WATER_WALK1_IN,
408         WATER_WALK1_OUT,
409         WATER_WALK2_IN,
410         WATER_WALK2_OUT,
411
412   PRONE_UP_SOUND,
413   PRONE_DOWN_SOUND,
414   KNEEL_UP_SOUND,
415   KNEEL_DOWN_SOUND,
416   PICKING_SOMETHING_UP,
417
418   COW_FALL,
419
420   BLOODCAT_GROWL_1,
421   BLOODCAT_GROWL_2,
422   BLOODCAT_GROWL_3,
423   BLOODCAT_GROWL_4,
424   CREATURE_GAS_NOISE,
425   CREATURE_FALL_PART_2,
426   CREATURE_DISSOLVE_1,
427   QUEEN_AMBIENT_NOISE,
428   CREATURE_FALL,
429   CROW_PECKING_AT_FLESH,
430   CROW_FLYING_AWAY,
431   SLAP_2,
432   MORTAR_START,
433   MORTAR_WHISTLE,
434   MORTAR_LOAD,
435
436   TURRET_MOVE,
437   TURRET_STOP,
438   COW_FALL_2,
439   KNIFE_IMPACT,
440   EXPLOSION_ALT_BLAST_1,
441   EXPLOSION_BLAST_2,
442   DRINK_CANTEEN_MALE,
443   USE_X_RAY_MACHINE,
444   CATCH_OBJECT,
445   FENCE_OPEN,
446
447         NUM_SAMPLES
448 };
449
450
451 // TERRAIN ID VALUES.
452 enum
453 {
454         NO_TERRAIN,
455         FLAT_GROUND,
456         FLAT_FLOOR,
457         PAVED_ROAD,
458         DIRT_ROAD,
459         LOW_GRASS,
460         HIGH_GRASS,
461         TRAIN_TRACKS,
462         LOW_WATER,
463         MED_WATER,
464         DEEP_WATER,
465         NUM_TERRAIN_TYPES
466 };
467
468
469 enum
470 {
471         NO_BLAST,
472         BLAST_1,
473         BLAST_2,
474         BLAST_3,
475         STUN_BLAST,
476         WATER_BLAST,
477   TARGAS_EXP,
478   SMOKE_EXP,
479   MUSTARD_EXP,
480
481         NUM_EXP_TYPES
482 };
483
484
485 CHAR8 sBlastSpeeds[] =
486 {
487         0,
488         80,
489         80,
490         80,
491         20,
492         80,
493         80,
494         80,
495         80,
496 };
497
498
499 UINT8 ubDamageKeyFrame[NUM_EXP_TYPES] =
500 {
501         0,
502         3,
503         5,
504         5,
505         5,
506         18,
507         18,
508         18,
509         18,
510 };
511
512
513 UINT32 uiExplosionSoundID[NUM_EXP_TYPES] =
514 {
515         EXPLOSION_1,
516         EXPLOSION_1,
517         EXPLOSION_BLAST_2,  //LARGE
518         EXPLOSION_BLAST_2,
519         EXPLOSION_1,
520         AIR_ESCAPING_1,
521         AIR_ESCAPING_1,
522         AIR_ESCAPING_1,
523         AIR_ESCAPING_1,
524 };
525
526
527 UINT8 ubTransKeyFrame[NUM_EXP_TYPES] =
528 {
529         0,
530         17,
531         28,
532         24,
533         1,
534         1,
535         1,
536         1,
537         1,
538 };
539
540
541 CHAR8   zBlastFilenames[][70] =
542 {
543         "",
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",
552 };
553
554
555 UINT8 ubAmbientLightLevel;
556
557
558 static void GenerateExplosionFromExplosionPointer(EXPLOSIONTYPE* pExplosion)
559 {
560         UINT32          uiFlags;
561         UINT8                   ubOwner;
562         UINT8                   ubTypeID;
563         INT16                   sX;
564         INT16                   sY;
565         INT16                   sZ;
566         INT16                   sGridNo;
567         UINT16          usItem;
568         UINT8                   ubTerrainType;
569         INT8                    bLevel;
570   UINT32    uiSoundID;
571
572         ANITILE_PARAMS  AniParams;
573
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;
584
585   // If Z value given is 0 and bLevel > 0, make z heigher
586   if ( sZ == 0 && bLevel > 0 )
587   {
588     sZ = ROOF_LEVEL_HEIGHT;
589   }
590
591         pExplosion->iLightID = -1;
592
593         // OK, if we are over water.... use water explosion...
594         ubTerrainType = GetTerrainType( sGridNo );
595
596         // Setup explosion!
597         memset( &AniParams, 0, sizeof( ANITILE_PARAMS ) );
598
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;
604
605         if ( ubTerrainType == LOW_WATER || ubTerrainType == MED_WATER || ubTerrainType == DEEP_WATER )
606         {
607                 // Change type to water explosion...
608                 ubTypeID = WATER_BLAST;
609                 AniParams.uiFlags                                               |= ANITILE_ALWAYS_TRANSLUCENT;
610         }
611
612
613         if ( sZ < WALL_HEIGHT )
614         {
615                 AniParams.uiFlags |= ANITILE_NOZBLITTER;
616         }
617
618         if ( uiFlags & EXPLOSION_FLAG_USEABSPOS )
619         {
620                 AniParams.sX                                                                    = sX;
621                 AniParams.sY                                                                    = sY;
622                 AniParams.sZ                                                                    = sZ;
623
624                 //AniParams.uiFlags                                                     |= ANITILE_USEABSOLUTEPOS;
625         }
626
627         AniParams.ubKeyFrame1                                   = ubTransKeyFrame[ ubTypeID ];
628         AniParams.uiKeyFrame1Code                       = ANI_KEYFRAME_BEGIN_TRANSLUCENCY;
629
630         if ( !( uiFlags & EXPLOSION_FLAG_DISPLAYONLY ) )
631         {
632                 AniParams.ubKeyFrame2                                   = ubDamageKeyFrame[ ubTypeID ];
633                 AniParams.uiKeyFrame2Code                       = ANI_KEYFRAME_BEGIN_DAMAGE;
634         }
635         AniParams.uiUserData                                    = usItem;
636         AniParams.ubUserData2                                   = ubOwner;
637         AniParams.uiUserData3                                   = pExplosion->iID;
638         AniParams.zCachedFile = zBlastFilenames[ubTypeID];
639         CreateAnimationTile( &AniParams );
640
641         //  set light source....
642         if ( pExplosion->iLightID == -1 )
643         {
644                 // DO ONLY IF WE'RE AT A GOOD LEVEL
645                 if ( ubAmbientLightLevel >= MIN_AMB_LEVEL_FOR_MERC_LIGHTS )
646                 {
647                         if( ( pExplosion->iLightID = LightSpriteCreate("L-R04.LHT", 0 ) ) != (-1) )
648                         {
649                                 LightSpritePower( pExplosion->iLightID, TRUE );
650
651                                 LightSpritePosition( pExplosion->iLightID, (INT16)(sX/CELL_X_SIZE), (INT16)(sY/CELL_Y_SIZE) );
652                         }
653                 }
654         }
655
656   uiSoundID = uiExplosionSoundID[ ubTypeID ];
657
658   if ( uiSoundID == EXPLOSION_1 )
659   {
660       // Randomize
661      if ( Random( 2 ) == 0 )
662      {
663       uiSoundID = EXPLOSION_ALT_BLAST_1;
664      }
665   }
666
667         PlayJA2Sample(uiSoundID, SoundVolume(HIGHVOLUME, sGridNo), 1, SoundDir(sGridNo));
668 }
669
670
671 void f(void)
672 {
673         GenerateExplosionFromExplosionPointer(0);
674 }
675
676
677 int main(void)
678 {
679         return 0;
680 }