USING "arcade_cabinet_minigame_common.sch" USING "arcade_games_postfx.sch" USING "arcade_games_sound.sch" USING "arcade_games_leaderboard.sch" USING "arcade_games_help_text.sch" USING "arcade_games_help_text_flow.sch" USING "degenatron_games_animation.sch" CONST_FLOAT cfGAME_SCREEN_WIDTH 1300.0//1264.0 CONST_FLOAT cfGAME_SCREEN_HEIGHT 940.0 CONST_FLOAT cfTWS_DEFAULT_ANIM_FRAME_TIME 33.0 //30 FPS CONST_FLOAT cfTWS_FAST_ANIM_FRAME_TIME 66.0 // 15 FPS CONST_FLOAT cfTWS_SLOW_ANIM_FRAME_TIME 88.0 //10 FPS 109 CONST_FLOAT cfTWS_RESCALE_FACTOR 2.0 CONST_FLOAT cfTWS_PLAYER_IDLE_WIDTH 128.0 CONST_FLOAT cfTWS_PLAYER_IDLE_HEIGHT 168.0 CONST_FLOAT cfTWS_PLAYER_2_IDLE_WIDTH 136.0 CONST_FLOAT cfTWS_PLAYER_2_IDLE_HEIGHT 196.0 CONST_FLOAT cfTWS_PLAYER_3_IDLE_WIDTH 184.0 CONST_FLOAT cfTWS_PLAYER_3_IDLE_HEIGHT 208.0 CONST_FLOAT cfTWS_PLAYER_WALK_WIDTH 104.0 CONST_FLOAT cfTWS_PLAYER_WALK_HEIGHT 180.0 CONST_FLOAT cfTWS_PLAYER_2_WALK_WIDTH 144.0 CONST_FLOAT cfTWS_PLAYER_2_WALK_HEIGHT 200.0 CONST_FLOAT cfTWS_PLAYER_3_WALK_WIDTH 188.0 CONST_FLOAT cfTWS_PLAYER_3_WALK_HEIGHT 208.0 CONST_FLOAT cfTWS_PLAYER_JUMP_WIDTH 108.0 CONST_FLOAT cfTWS_PLAYER_JUMP_HEIGHT 208.0 CONST_FLOAT cfTWS_PLAYER_2_JUMP_WIDTH 144.0 CONST_FLOAT cfTWS_PLAYER_2_JUMP_HEIGHT 228.0 CONST_FLOAT cfTWS_PLAYER_3_JUMP_WIDTH 184.0 CONST_FLOAT cfTWS_PLAYER_3_JUMP_HEIGHT 232.0 CONST_FLOAT cfTWS_PLAYER_JUMP_HOLE_WIDTH 132.0 CONST_FLOAT cfTWS_PLAYER_JUMP_HOLE_HEIGHT 184.0 CONST_FLOAT cfTWS_PLAYER_ATTACK_WIDTH 232.0 CONST_FLOAT cfTWS_PLAYER_ATTACK_HEIGHT 168.0 CONST_FLOAT cfTWS_PLAYER_2_ATTACK_WIDTH 224.0 CONST_FLOAT cfTWS_PLAYER_2_ATTACK_HEIGHT 196.0 CONST_FLOAT cfTWS_PLAYER_3_ATTACK_WIDTH 240.0 CONST_FLOAT cfTWS_PLAYER_3_ATTACK_HEIGHT 252.0 CONST_FLOAT cfTWS_PLAYER_ATTACK_LOW_WIDTH 132.0 CONST_FLOAT cfTWS_PLAYER_ATTACK_LOW_HEIGHT 176.0 CONST_FLOAT cfTWS_PLAYER_2_ATTACK_LOW_WIDTH 184.0 CONST_FLOAT cfTWS_PLAYER_2_ATTACK_LOW_HEIGHT 192.0 CONST_FLOAT cfTWS_PLAYER_3_ATTACK_LOW_WIDTH 168.0 CONST_FLOAT cfTWS_PLAYER_3_ATTACK_LOW_HEIGHT 212.0 CONST_FLOAT cfTWS_PLAYER_CHARGE_WIDTH 196.0 CONST_FLOAT cfTWS_PLAYER_CHARGE_HEIGHT 168.0 CONST_FLOAT cfTWS_PLAYER_2_CHARGE_WIDTH 168.0 CONST_FLOAT cfTWS_PLAYER_2_CHARGE_HEIGHT 184.0 CONST_FLOAT cfTWS_PLAYER_3_CHARGE_WIDTH 212.0 CONST_FLOAT cfTWS_PLAYER_3_CHARGE_HEIGHT 204.0 CONST_FLOAT cfTWS_PLAYER_JUMP_ATTACK_WIDTH 140.0 CONST_FLOAT cfTWS_PLAYER_JUMP_ATTACK_HEIGHT 188.0 CONST_FLOAT cfTWS_PLAYER_2_JUMP_ATTACK_WIDTH 176.0 CONST_FLOAT cfTWS_PLAYER_2_JUMP_ATTACK_HEIGHT 200.0 CONST_FLOAT cfTWS_PLAYER_3_JUMP_ATTACK_WIDTH 204.0 CONST_FLOAT cfTWS_PLAYER_3_JUMP_ATTACK_HEIGHT 268.0 CONST_FLOAT cfTWS_PLAYER_HURT_FALL_1_WIDTH 172.0 CONST_FLOAT cfTWS_PLAYER_HURT_FALL_1_HEIGHT 172.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_FALL_1_WIDTH 204.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_FALL_1_HEIGHT 192.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_FALL_1_WIDTH 228.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_FALL_1_HEIGHT 208.0 CONST_FLOAT cfTWS_PLAYER_HURT_FALL_2_WIDTH 172.0 CONST_FLOAT cfTWS_PLAYER_HURT_FALL_2_HEIGHT 172.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_FALL_2_WIDTH 204.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_FALL_2_HEIGHT 192.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_FALL_2_WIDTH 228.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_FALL_2_HEIGHT 208.0 CONST_FLOAT cfTWS_PLAYER_HURT_FLAT_WIDTH 172.0 CONST_FLOAT cfTWS_PLAYER_HURT_FLAT_HEIGHT 172.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_FLAT_WIDTH 204.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_FLAT_HEIGHT 192.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_FLAT_WIDTH 228.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_FLAT_HEIGHT 208.0 CONST_FLOAT cfTWS_PLAYER_HURT_GETUP_1_WIDTH 172.0 CONST_FLOAT cfTWS_PLAYER_HURT_GETUP_1_HEIGHT 172.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_GETUP_1_WIDTH 204.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_GETUP_1_HEIGHT 192.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_GETUP_1_WIDTH 228.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_GETUP_1_HEIGHT 208.0 CONST_FLOAT cfTWS_PLAYER_HURT_GETUP_2_WIDTH 172.0 CONST_FLOAT cfTWS_PLAYER_HURT_GETUP_2_HEIGHT 172.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_GETUP_2_WIDTH 204.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_GETUP_2_HEIGHT 192.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_GETUP_2_WIDTH 228.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_GETUP_2_HEIGHT 208.0 CONST_FLOAT cfTWS_PLAYER_HURT_GETUP_3_WIDTH 172.0 CONST_FLOAT cfTWS_PLAYER_HURT_GETUP_3_HEIGHT 172.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_GETUP_3_WIDTH 204.0 CONST_FLOAT cfTWS_PLAYER_2_HURT_GETUP_3_HEIGHT 192.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_GETUP_3_WIDTH 228.0 CONST_FLOAT cfTWS_PLAYER_3_HURT_GETUP_3_HEIGHT 208.0 CONST_FLOAT cfTWS_PLAYER_EVOLVING_WIDTH 124.0 CONST_FLOAT cfTWS_PLAYER_EVOLVING_HEIGHT 240.0 CONST_FLOAT cfTWS_PLAYER_2_EVOLVING_WIDTH 144.0 CONST_FLOAT cfTWS_PLAYER_2_EVOLVING_HEIGHT 260.0 CONST_FLOAT cfTWS_PLAYER_3_EVOLVING_WIDTH 204.0 CONST_FLOAT cfTWS_PLAYER_3_EVOLVING_HEIGHT 304.0 CONST_FLOAT cfTWS_BRUTE_IDLE_WIDTH 152.0 CONST_FLOAT cfTWS_BRUTE_IDLE_HEIGHT 264.0 CONST_FLOAT cfTWS_BRUTE_WALK_WIDTH 156.0 CONST_FLOAT cfTWS_BRUTE_WALK_HEIGHT 264.0 CONST_FLOAT cfTWS_BRUTE_ATTACK_WIDTH 304.0 CONST_FLOAT cfTWS_BRUTE_ATTACK_HEIGHT 264.0 CONST_FLOAT cfTWS_BRUTE_FALL_WIDTH 236.0 CONST_FLOAT cfTWS_BRUTE_FALL_HEIGHT 272.0 CONST_FLOAT cfTWS_BRUTE_FLAT_WIDTH 236.0 CONST_FLOAT cfTWS_BRUTE_FLAT_HEIGHT 272.0 CONST_FLOAT cfTWS_BRUTE_GETTINGUP1_WIDTH 236.0 CONST_FLOAT cfTWS_BRUTE_GETTINGUP1_HEIGHT 272.0 CONST_FLOAT cfTWS_BRUTE_GETTINGUP2_WIDTH 236.0 CONST_FLOAT cfTWS_BRUTE_GETTINGUP2_HEIGHT 272.0 CONST_FLOAT cfTWS_BRUTE_STUN_WIDTH 236.0 CONST_FLOAT cfTWS_BRUTE_STUN_HEIGHT 272.0 CONST_FLOAT cfTWS_BRUTE_AXE_IDLE_WIDTH 152.0 CONST_FLOAT cfTWS_BRUTE_AXE_IDLE_HEIGHT 216.0 CONST_FLOAT cfTWS_BRUTE_AXE_WALK_WIDTH 152.0 CONST_FLOAT cfTWS_BRUTE_AXE_WALK_HEIGHT 216.0 CONST_FLOAT cfTWS_BRUTE_AXE_ATTACK_WIDTH 304.0 CONST_FLOAT cfTWS_BRUTE_AXE_ATTACK_HEIGHT 264.0 CONST_FLOAT cfTWS_BRUTE_AXE_FALL_WIDTH 236.0 CONST_FLOAT cfTWS_BRUTE_AXE_FALL_HEIGHT 220.0 CONST_FLOAT cfTWS_BRUTE_AXE_STUN_WIDTH 236.0 CONST_FLOAT cfTWS_BRUTE_AXE_STUN_HEIGHT 220.0 CONST_FLOAT cfTWS_GRUNT_IDLE_WIDTH 100.0 CONST_FLOAT cfTWS_GRUNT_IDLE_HEIGHT 176.0 CONST_FLOAT cfTWS_GRUNT_WALK_WIDTH 124.0 CONST_FLOAT cfTWS_GRUNT_WALK_HEIGHT 212.0 CONST_FLOAT cfTWS_GRUNT_ATTACK_WIDTH 160.0 CONST_FLOAT cfTWS_GRUNT_ATTACK_HEIGHT 192.0 CONST_FLOAT cfTWS_GRUNT_FALL_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_FALL_HEIGHT 208.0 CONST_FLOAT cfTWS_GRUNT_FLAT_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_FLAT_HEIGHT 208.0 CONST_FLOAT cfTWS_GRUNT_GETTINGUP1_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_GETTINGUP1_HEIGHT 208.0 CONST_FLOAT cfTWS_GRUNT_GETTINGUP2_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_GETTINGUP2_HEIGHT 208.0 CONST_FLOAT cfTWS_GRUNT_STUN_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_STUN_HEIGHT 208.0 CONST_FLOAT cfTWS_GRUNT_SWORD_IDLE_WIDTH 152.0 CONST_FLOAT cfTWS_GRUNT_SWORD_IDLE_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_SWORD_WALK_WIDTH 152.0 CONST_FLOAT cfTWS_GRUNT_SWORD_WALK_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_SWORD_ATTACK_WIDTH 244.0 CONST_FLOAT cfTWS_GRUNT_SWORD_ATTACK_HEIGHT 248.0 CONST_FLOAT cfTWS_GRUNT_SWORD_FALL_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_SWORD_FALL_HEIGHT 192.0 CONST_FLOAT cfTWS_GRUNT_SWORD_STUN_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_SWORD_STUN_HEIGHT 192.0 CONST_FLOAT cfTWS_GRUNT_FIRESWORD_IDLE_WIDTH 152.0 CONST_FLOAT cfTWS_GRUNT_FIRESWORD_IDLE_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_FIRESWORD_WALK_WIDTH 152.0 CONST_FLOAT cfTWS_GRUNT_FIRESWORD_WALK_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_FIRESWORD_ATTACK_WIDTH 244.0 CONST_FLOAT cfTWS_GRUNT_FIRESWORD_ATTACK_HEIGHT 248.0 CONST_FLOAT cfTWS_GRUNT_FIRESWORD_FALL_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_FIRESWORD_FALL_HEIGHT 192.0 CONST_FLOAT cfTWS_GRUNT_FIRESWORD_STUN_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_FIRESWORD_STUN_HEIGHT 192.0 CONST_FLOAT cfTWS_GRUNT_SPEAR_IDLE_WIDTH 184.0 CONST_FLOAT cfTWS_GRUNT_SPEAR_IDLE_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_SPEAR_WALK_WIDTH 184.0 CONST_FLOAT cfTWS_GRUNT_SPEAR_WALK_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_SPEAR_ATTACK_WIDTH 252.0 CONST_FLOAT cfTWS_GRUNT_SPEAR_ATTACK_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_SPEAR_FALL_WIDTH 232.0 CONST_FLOAT cfTWS_GRUNT_SPEAR_FALL_HEIGHT 192.0 CONST_FLOAT cfTWS_GRUNT_SPEAR_STUN_WIDTH 232.0 CONST_FLOAT cfTWS_GRUNT_SPEAR_STUN_HEIGHT 192.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_IDLE_WIDTH 160.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_IDLE_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_WALK_WIDTH 168.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_WALK_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_ATTACK_WIDTH 168.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_ATTACK_HEIGHT 196.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_FALL_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_FALL_HEIGHT 192.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_STUN_WIDTH 208.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_STUN_HEIGHT 192.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_ARROW_WIDTH 72.0 CONST_FLOAT cfTWS_GRUNT_CROSSBOW_ARROW_HEIGHT 12.0 CONST_FLOAT cfTWS_GRUNT_CASTER_IDLE_WIDTH 88.0 CONST_FLOAT cfTWS_GRUNT_CASTER_IDLE_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_CASTER_WALK_WIDTH 88.0 CONST_FLOAT cfTWS_GRUNT_CASTER_WALK_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_CASTER_ATTACK_WIDTH 96.0 CONST_FLOAT cfTWS_GRUNT_CASTER_ATTACK_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_CASTER_DEATH_WIDTH 88.0 CONST_FLOAT cfTWS_GRUNT_CASTER_DEATH_HEIGHT 200.0 CONST_FLOAT cfTWS_GRUNT_CASTER_FIREBALL_WIDTH 88.0 CONST_FLOAT cfTWS_GRUNT_CASTER_FIREBALL_HEIGHT 32.0 CONST_FLOAT cfTWS_BOSS_SPIDER_IDLE_WIDTH 444.0 CONST_FLOAT cfTWS_BOSS_SPIDER_IDLE_HEIGHT 220.0 CONST_FLOAT cfTWS_BOSS_SPIDER_ATTACK_WIDTH 444.0 CONST_FLOAT cfTWS_BOSS_SPIDER_ATTACK_HEIGHT 276.0 CONST_FLOAT cfTWS_BOSS_SPIDER_SPIT_WIDTH 404.0 CONST_FLOAT cfTWS_BOSS_SPIDER_SPIT_HEIGHT 220.0 CONST_FLOAT cfTWS_BOSS_SPIDER_STUN_WIDTH 444.0 CONST_FLOAT cfTWS_BOSS_SPIDER_STUN_HEIGHT 312.0 CONST_FLOAT cfTWS_BOSS_SPIDER_DEAD_WIDTH 452.0 CONST_FLOAT cfTWS_BOSS_SPIDER_DEAD_HEIGHT 184.0 CONST_FLOAT cfTWS_BOSS_SPIDER_GLIDE_WIDTH 444.0 CONST_FLOAT cfTWS_BOSS_SPIDER_GLIDE_HEIGHT 312.0 CONST_FLOAT cfTWS_BOSS_AMAZON_IDLE_WIDTH 220.0 CONST_FLOAT cfTWS_BOSS_AMAZON_IDLE_HEIGHT 208.0 CONST_FLOAT cfTWS_BOSS_AMAZON_HURT_WIDTH 232.0 CONST_FLOAT cfTWS_BOSS_AMAZON_HURT_HEIGHT 212.0 CONST_FLOAT cfTWS_BOSS_AMAZON_ATTACK_WIDTH 308.0 CONST_FLOAT cfTWS_BOSS_AMAZON_ATTACK_HEIGHT 208.0 CONST_FLOAT cfTWS_BOSS_AMAZON_WALK_WIDTH 208.0 CONST_FLOAT cfTWS_BOSS_AMAZON_WALK_HEIGHT 232.0 CONST_FLOAT cfTWS_BOSS_AMAZON_ATTACK_JUMP_WIDTH 184.0 CONST_FLOAT cfTWS_BOSS_AMAZON_ATTACK_JUMP_HEIGHT 212.0 CONST_FLOAT cfTWS_BOSS_AMAZON_JUMP_WIDTH 220.0 CONST_FLOAT cfTWS_BOSS_AMAZON_JUMP_HEIGHT 248.0 CONST_FLOAT cfTWS_BOSS_AMAZON_JUMP_LAND_WIDTH 220.0 CONST_FLOAT cfTWS_BOSS_AMAZON_JUMP_LAND_HEIGHT 180.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_IDLE_WIDTH 124.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_IDLE_HEIGHT 280.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_1_WIDTH 124.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_1_HEIGHT 278.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_2_WIDTH 144.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_2_HEIGHT 224.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_3_WIDTH 120.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_3_HEIGHT 224.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_4_WIDTH 120.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_4_HEIGHT 208.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_5_WIDTH 116.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_5_HEIGHT 188.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_6_WIDTH 124.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_6_HEIGHT 192.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_7_WIDTH 172.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_7_HEIGHT 172.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_8_WIDTH 192.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DYING_8_HEIGHT 132.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_HURT_WIDTH 144.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_HURT_HEIGHT 284.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_KNEE_WIDTH 152.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_KNEE_HEIGHT 280.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DEAD_WIDTH 192.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_DEAD_HEIGHT 108.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_SLAM_WIDTH 168.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_SLAM_HEIGHT 296.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_SLASH_WIDTH 248.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_SLASH_HEIGHT 336.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_WALK_WIDTH 128.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_WALK_HEIGHT 280.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_COD_WIDTH 200.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_COD_HEIGHT 140.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_SWORD_WIDTH 112.0 CONST_FLOAT cfTWS_BOSS_KNIGHT_SWORD_HEIGHT 136.0 CONST_FLOAT cfTWS_BAT_IDLE_WIDTH 36.0 CONST_FLOAT cfTWS_BAT_IDLE_HEIGHT 88.0 CONST_FLOAT cfTWS_BAT_FLY_WIDTH 100.0 CONST_FLOAT cfTWS_BAT_FLY_HEIGHT 144.0 CONST_FLOAT cfTWS_BAT_DIE_WIDTH 88.0 CONST_FLOAT cfTWS_BAT_DIE_HEIGHT 76.0 CONST_FLOAT cfTWS_BOULDER_WALK_WIDTH 68.0 CONST_FLOAT cfTWS_BOULDER_WALK_HEIGHT 132.0 CONST_FLOAT cfTWS_SLIME_IDLE_WIDTH 136.0 CONST_FLOAT cfTWS_SLIME_IDLE_HEIGHT 128.0 CONST_FLOAT cfTWS_SLIME_WALK_WIDTH 136.0 CONST_FLOAT cfTWS_SLIME_WALK_HEIGHT 128.0 CONST_FLOAT cfTWS_SLIME_STUN_WIDTH 112.0 CONST_FLOAT cfTWS_SLIME_STUN_HEIGHT 128.0 CONST_FLOAT cfTWS_SLIME_DIE_WIDTH 152.0 CONST_FLOAT cfTWS_SLIME_DIE_HEIGHT 128.0 CONST_FLOAT cfTWS_SNAKE_IDLE_WIDTH 292.0 CONST_FLOAT cfTWS_SNAKE_IDLE_HEIGHT 72.0 CONST_FLOAT cfTWS_SNAKE_DIE_WIDTH 292.0 CONST_FLOAT cfTWS_SNAKE_DIE_HEIGHT 92.0 CONST_FLOAT cfTWS_FAIRY_IDLE_WIDTH 80.0 CONST_FLOAT cfTWS_FAIRY_IDLE_HEIGHT 128.0 CONST_FLOAT cfTWS_FAIRY_ATTACK_WIDTH 108.0 CONST_FLOAT cfTWS_FAIRY_ATTACK_HEIGHT 128.0 CONST_FLOAT cfTWS_FAIRY_DIE_WIDTH 108.0 CONST_FLOAT cfTWS_FAIRY_DIE_HEIGHT 128.0 CONST_FLOAT cfTWS_SPIDER_IDLE_WIDTH 148.0 CONST_FLOAT cfTWS_SPIDER_IDLE_HEIGHT 136.0 CONST_FLOAT cfTWS_SPIDER_WALK_WIDTH 148.0 CONST_FLOAT cfTWS_SPIDER_WALK_HEIGHT 136.0 CONST_FLOAT cfTWS_SPIDER_STUN_DEAD_WIDTH 184.0 CONST_FLOAT cfTWS_SPIDER_STUN_DEAD_HEIGHT 136.0 CONST_FLOAT cfTWS_SPIDER_WEB_WIDTH 156.0 CONST_FLOAT cfTWS_SPIDER_WEB_HEIGHT 136.0 CONST_FLOAT cfTWS_WEB_WIDTH 8.0 CONST_FLOAT cfTWS_WEB_HEIGHT 16.0 CONST_FLOAT cfTWS_LEPRECHAUN_IDLE_WIDTH 92.0 CONST_FLOAT cfTWS_LEPRECHAUN_IDLE_HEIGHT 112.0 CONST_FLOAT cfTWS_LEPRECHAUN_WALK_WIDTH 92.0 CONST_FLOAT cfTWS_LEPRECHAUN_WALK_HEIGHT 168.0 CONST_FLOAT cfTWS_LEPRECHAUN_HURT_WIDTH 100.0 CONST_FLOAT cfTWS_LEPRECHAUN_HURT_HEIGHT 92.0 CONST_FLOAT cfTWS_LEPRECHAUN_DEAD_WIDTH 80.0 CONST_FLOAT cfTWS_LEPRECHAUN_DEAD_HEIGHT 88.0 CONST_FLOAT cfTWS_LEPRECHAUN_SPAWN_WIDTH 92.0 CONST_FLOAT cfTWS_LEPRECHAUN_SPAWN_HEIGHT 180.0 CONST_FLOAT cfTWS_LEPRECHAUN_ATTACK_WIDTH 92.0 CONST_FLOAT cfTWS_LEPRECHAUN_ATTACK_HEIGHT 240.0 CONST_FLOAT cfTWS_LEPRECHAUN_COINS_WIDTH 180.0 CONST_FLOAT cfTWS_LEPRECHAUN_COINS_HEIGHT 164.0 CONST_FLOAT cfTWS_WIZARD_GEN_WIDTH 188.0 CONST_FLOAT cfTWS_WIZARD_GEN_HEIGHT 220.0 CONST_FLOAT cfTWS_WIZARD_DIE_WIDTH 252.0 CONST_FLOAT cfTWS_WIZARD_DIE_HEIGHT 272.0 CONST_FLOAT cfTWS_WIZARD_STUN_WIDTH 168.0 CONST_FLOAT cfTWS_WIZARD_STUN_HEIGHT 220.0 CONST_FLOAT cfTWS_NPC_TWINS_WIDTH 76.0 CONST_FLOAT cfTWS_NPC_TWINS_HEIGHT 264.0 CONST_FLOAT cfTWS_NPC_TWINS_X 400.0 CONST_FLOAT cfTWS_NPC_TWINS_Y 350.0 CONST_FLOAT cfTWS_NPC_VILLAGER_WIDTH 96.0 CONST_FLOAT cfTWS_NPC_VILLAGER_HEIGHT 184.0 CONST_FLOAT cfTWS_ITEM_HP_SMA_WIDTH 20.0 CONST_FLOAT cfTWS_ITEM_HP_SMA_HEIGHT 28.0 CONST_FLOAT cfTWS_ITEM_HP_MED_WIDTH 32.0 CONST_FLOAT cfTWS_ITEM_HP_MED_HEIGHT 48.0 CONST_FLOAT cfTWS_ITEM_HP_LAR_WIDTH 36.0 CONST_FLOAT cfTWS_ITEM_HP_LAR_HEIGHT 100.0 CONST_FLOAT cfTWS_ITEM_GOLD_1_WIDTH 48.0 CONST_FLOAT cfTWS_ITEM_GOLD_1_HEIGHT 48.0 CONST_FLOAT cfTWS_ITEM_GOLD_2_WIDTH 56.0 CONST_FLOAT cfTWS_ITEM_GOLD_2_HEIGHT 60.0 CONST_FLOAT cfTWS_ITEM_GOLD_3_WIDTH 48.0 CONST_FLOAT cfTWS_ITEM_GOLD_3_HEIGHT 56.0 CONST_FLOAT cfTWS_ITEM_GOLD_4_WIDTH 36.0 CONST_FLOAT cfTWS_ITEM_GOLD_4_HEIGHT 36.0 CONST_FLOAT cfTWS_ITEM_1UP_WIDTH 36.0 CONST_FLOAT cfTWS_ITEM_1UP_HEIGHT 68.0 CONST_FLOAT cfTWS_SC_BRIDGE_WIDTH 1232.0 CONST_FLOAT cfTWS_SC_BRIDGE_HEIGHT 448.0 CONST_FLOAT cfTWS_SC_BRIDGE_OFFSET 702.0 CONST_FLOAT cfTWS_TRAP_STALAGTITE_WIDTH 32.0 CONST_FLOAT cfTWS_TRAP_STALAGTITE_HEIGHT 120.0 CONST_FLOAT cfTWS_TRAP_HOLE_WIDTH 132.0 CONST_FLOAT cfTWS_TRAP_HOLE_HEIGHT 40.0 CONST_FLOAT cfTWS_TRAP_SPEAR_WIDTH 28.0 CONST_FLOAT cfTWS_TRAP_SPEAR_HEIGHT 160.0 CONST_FLOAT cfTWS_FG_INTRO_1_WIDTH 168.0 CONST_FLOAT cfTWS_FG_INTRO_1_HEIGHT 480.0 CONST_FLOAT cfTWS_FG_COL1_WIDTH 232.0 CONST_FLOAT cfTWS_FG_COL1_HEIGHT 480.0 CONST_FLOAT cfTWS_FG_COL2_WIDTH 128.0 CONST_FLOAT cfTWS_FG_COL2_HEIGHT 480.0 CONST_FLOAT cfTWS_FG_STALAGMITE1_WIDTH 148.0 CONST_FLOAT cfTWS_FG_STALAGMITE1_HEIGHT 160.0 CONST_FLOAT cfTWS_FG_STALAGMITE2_WIDTH 80.0 CONST_FLOAT cfTWS_FG_STALAGMITE2_HEIGHT 116.0 CONST_FLOAT cfTWS_FG_STALAGMITE3_WIDTH 64.0 CONST_FLOAT cfTWS_FG_STALAGMITE3_HEIGHT 80.0 CONST_FLOAT cfTWS_FG_BOSS_WIDTH 1556.0 CONST_FLOAT cfTWS_FG_BOSS_HEIGHT 248.0 CONST_FLOAT cfTWS_FG_SWAMP_GRASS_WIDTH 320.0 CONST_FLOAT cfTWS_FG_SWAMP_GRASS_HEIGHT 72.0 CONST_FLOAT cfTWS_FG_PIKES_WIDTH 120.0 CONST_FLOAT cfTWS_FG_PIKES_HEIGHT 172.0 CONST_FLOAT cfTWS_FG_ROOT_WIDTH 320.0 CONST_FLOAT cfTWS_FG_ROOT_HEIGHT 104.0 CONST_FLOAT cfTWS_FG_VINES_1_WIDTH 204.0 CONST_FLOAT cfTWS_FG_VINES_1_HEIGHT 216.0 CONST_FLOAT cfTWS_FG_VINES_2_WIDTH 176.0 CONST_FLOAT cfTWS_FG_VINES_2_HEIGHT 216.0 CONST_FLOAT cfTWS_FG_VINES_3_WIDTH 152.0 CONST_FLOAT cfTWS_FG_VINES_3_HEIGHT 216.0 CONST_FLOAT cfTWS_FG_INTRO_3_WIDTH 77.0 CONST_FLOAT cfTWS_FG_INTRO_3_HEIGHT 328.0 CONST_FLOAT cfTWS_FG_GARGOYLE_1_WIDTH 128.0 CONST_FLOAT cfTWS_FG_GARGOYLE_1_HEIGHT 168.0 CONST_FLOAT cfTWS_FG_GARGOYLE_2_WIDTH 128.0 CONST_FLOAT cfTWS_FG_GARGOYLE_2_HEIGHT 168.0 CONST_FLOAT cfTWS_FG_CASTLE_COLUMN_WIDTH 128.0 CONST_FLOAT cfTWS_FG_CASTLE_COLUMN_HEIGHT 480.0 CONST_FLOAT cfTWS_FG_CANDLES_1_WIDTH 128.0 CONST_FLOAT cfTWS_FG_CANDLES_1_HEIGHT 140.0 CONST_FLOAT cfTWS_FG_CANDLES_2_WIDTH 128.0 CONST_FLOAT cfTWS_FG_CANDLES_2_HEIGHT 164.0 CONST_FLOAT cfTWS_FG_FOREST_SHORT_GRASS_WIDTH 306.0 CONST_FLOAT cfTWS_FG_FOREST_SHORT_GRASS_HEIGHT 98.0 CONST_FLOAT cfTWS_FG_FOREST_TALL_GRASS_WIDTH 306.0 CONST_FLOAT cfTWS_FG_FOREST_TALL_GRASS_HEIGHT 134.0 CONST_FLOAT cfTWS_FX_ITEM_WIDTH 40.0 CONST_FLOAT cfTWS_FX_ITEM_HEIGHT 60.0 CONST_FLOAT cfTWS_FX_SHADOW_SMALL_WIDTH 28.0 CONST_FLOAT cfTWS_FX_SHADOW_SMALL_HEIGHT 16.0 CONST_FLOAT cfTWS_FX_SHADOW_MED_WIDTH 56.0 CONST_FLOAT cfTWS_FX_SHADOW_MED_HEIGHT 20.0 CONST_FLOAT cfTWS_FX_SHADOW_LARGE_WIDTH 96.0 CONST_FLOAT cfTWS_FX_SHADOW_LARGE_HEIGHT 20.0 CONST_FLOAT cfTWS_FX_SHADOW_AMAZON_WIDTH 180.0 CONST_FLOAT cfTWS_FX_SHADOW_EXTRA_LARGE_WIDTH 288.0 CONST_FLOAT cfTWS_FX_SHADOW_EXTRA_LARGE_HEIGHT 60.0 CONST_FLOAT cfTWS_FX_SWORD_LIGHTNING_WIDTH 48.0 CONST_FLOAT cfTWS_FX_SWORD_LIGHTNING_HEIGHT 320.0 CONST_FLOAT cfTWS_FX_SUPERATTACK_WIDTH 92.0 CONST_FLOAT cfTWS_FX_SUPERATTACK_HEIGHT 160.0 CONST_FLOAT cfTWS_FX_VENOM_HIT_WIDTH 100.0 CONST_FLOAT cfTWS_FX_VENOM_HIT_HEIGHT 100.0 CONST_FLOAT cfTWS_FX_LARGE_HIT_WIDTH 80.0 CONST_FLOAT cfTWS_FX_LARGE_HIT_HEIGHT 80.0 CONST_FLOAT cfTWS_FX_SMALL_HIT_WIDTH 48.0 CONST_FLOAT cfTWS_FX_SMALL_HIT_HEIGHT 48.0 CONST_FLOAT cfTWS_FX_RIPPED_CLOTHES_HEIGHT 112.0 CONST_FLOAT cfTWS_FX_RIPPED_CLOTHES_WIDTH 96.0 CONST_FLOAT cfTWS_FX_BOSS_SPIDER_SPIT_WIDTH 120.0 CONST_FLOAT cfTWS_FX_BOSS_SPIDER_SPIT_HEIGHT 132.0 CONST_FLOAT cfTWS_FX_BOSS_SPIDER_VENOM_WIDTH 208.0 CONST_FLOAT cfTWS_FX_BOSS_SPIDER_VENOM_HEIGHT 68.0 CONST_FLOAT cfTWS_FX_WIZARD_PILLAR_WIDTH 100.0 CONST_FLOAT cfTWS_FX_WIZARD_PILLAR_HEIGHT 492.0 CONST_FLOAT cfTWS_FX_WIZARD_FIRE_WIDTH 64.0 CONST_FLOAT cfTWS_FX_WIZARD_FIRE_HEIGHT 192.0 CONST_FLOAT cfTWS_FX_KNIGHT_SWORD_WIDTH 64.0 CONST_FLOAT cfTWS_FX_KNIGHT_SWORD_HEIGHT 88.0 CONST_FLOAT cfTWS_FX_HELP_WIDTH 64.0 CONST_FLOAT cfTWS_FX_HELP_HEIGHT 48.0 CONST_FLOAT cfTWS_FX_GROG_WIDTH 152.0 CONST_FLOAT cfTWS_FX_GROG_HEIGHT 152.0 CONST_FLOAT cfTWS_FX_ARROW_HEIGHT_TO_GROUND 272.0 CONST_FLOAT cfTWS_HUD_PORTRAIT_WIDTH 56.0 CONST_FLOAT cfTWS_HUD_PORTRAIT_HEIGHT 64.0 CONST_FLOAT cfTWS_HUD_METER_WIDTH 176.0 CONST_FLOAT cfTWS_HUD_METER_HEIGHT 60.0 CONST_FLOAT cfTWS_HUD_BAR_WIDTH 132.0 CONST_FLOAT cfTWS_HUD_BAR_HEIGHT 12.0 CONST_FLOAT cfTWS_HUD_BOSS_METER_WIDTH 324.0 CONST_FLOAT cfTWS_HUD_BOSS_METER_HEIGHT 24.0 CONST_FLOAT cfTWS_HUD_BOSS_BAR_WIDTH 260.0 CONST_FLOAT cfTWS_HUD_BOSS_BAR_HEIGHT 12.0 CONST_FLOAT cfTWS_HUD_TIME_WIDTH 64.0 CONST_FLOAT cfTWS_HUD_TIME_HEIGHT 24.0 CONST_FLOAT cfTWS_HUD_BIG_NUMBER_WIDTH 28.0 CONST_FLOAT cfTWS_HUD_BIG_NUMBER_HEIGHT 36.0 CONST_FLOAT cfTWS_HUD_SMALL_NUMBER_WIDTH 16.0 CONST_FLOAT cfTWS_HUD_SMALL_NUMBER_HEIGHT 20.0 CONST_FLOAT cfTWS_HUD_HI_WIDTH 36.0 CONST_FLOAT cfTWS_HUD_HI_HEIGHT 20.0 CONST_FLOAT cfTWS_HUD_CREDITS_WIDTH 88.0 CONST_FLOAT cfTWS_HUD_CREDITS_HEIGHT 24.0 CONST_FLOAT cfTWS_HUD_MIGHTY_WIDTH 224.0 CONST_FLOAT cfTWS_HUD_MIGHTY_HEIGHT 48.0 CONST_FLOAT cfTWS_HUD_START_WIDTH 324.0 CONST_FLOAT cfTWS_HUD_START_HEIGHT 48.0 CONST_FLOAT cfTWS_HUD_GAMEOVER_WIDTH 360.0 CONST_FLOAT cfTWS_HUD_GAMEOVER_HEIGHT 64.0 CONST_FLOAT cfTWS_HUD_END_WIDTH 328.0 CONST_FLOAT cfTWS_HUD_END_HEIGHT 48.0 CONST_FLOAT cfTWS_HUD_GO_ARROW_WIDTH 328.0 CONST_FLOAT cfTWS_HUD_GO_ARROW_HEIGHT 152.0 CONST_FLOAT cfTWS_HUD_DIALOGUE_FRAME_WIDTH 396.0 CONST_FLOAT cfTWS_HUD_DIALOGUE_FRAME_HEIGHT 84.0 CONST_FLOAT cfTWS_HUD_TITLE_OPTION_WIDTH 228.0 CONST_FLOAT cfTWS_HUD_TITLE_OPTION_HEIGHT 28.0 CONST_FLOAT cfTWS_HUD_TITLE_ARROWS_WIDTH 228.0 CONST_FLOAT cfTWS_HUD_TITLE_ARROWS_HEIGHT 28.0 CONST_FLOAT cfTWS_HUD_SCORE_WIDTH 32.0 CONST_FLOAT cfTWS_HUD_SCORE_HEIGHT 44.0 CONST_FLOAT cfTWS_HUD_PORTRAIT_X 100.0 CONST_FLOAT cfTWS_HUD_PORTRAIT_Y 80.0 CONST_FLOAT cfTWS_HUD_METER_X 335.0 CONST_FLOAT cfTWS_HUD_METER_Y 76.0 CONST_FLOAT cfTWS_HUD_SCORE_X 730.0 CONST_FLOAT cfTWS_HUD_SCORE_Y 107.0 CONST_FLOAT cfTWS_HUD_HI_SCORE_X 1425.0 CONST_FLOAT cfTWS_HUD_HI_SCORE_Y 112.0 CONST_FLOAT cfTWS_HUD_BOSS_METER_X 140.0 CONST_FLOAT cfTWS_HUD_BOSS_METER_Y 98.0 CONST_FLOAT cfTWS_HUD_BOSS_HP_X 327.0 CONST_FLOAT cfTWS_HUD_BOSS_HP_Y 100.0 CONST_FLOAT cfTWS_HUD_HP_X 305.0 CONST_FLOAT cfTWS_HUD_HP_Y 76.0 CONST_FLOAT cfTWS_HUD_MP_X 305.0 CONST_FLOAT cfTWS_HUD_MP_Y 115.0 CONST_FLOAT cfTWS_HUD_SCORE_FINAL_WIDTH 160.0 CONST_FLOAT cfTWS_HUD_SCORE_FINAL_HEIGHT 40.0 CONST_FLOAT cfTWS_HUD_HEALTH_SCORE_X 840.0 CONST_FLOAT cfTWS_HUD_HEALTH_SCORE_Y 515.0 CONST_FLOAT cfTWS_HUD_HEALTH_SCORE_NUMBER_X 1100.0 CONST_FLOAT cfTWS_HUD_HEALTH_SCORE_NUMBER_Y 515.0 CONST_FLOAT cfTWS_HUD_LIVES_SCORE_X 840.0 CONST_FLOAT cfTWS_HUD_LIVES_SCORE_Y 590.0 CONST_FLOAT cfTWS_HUD_LIVES_SCORE_NUMBER_X 1100.0 CONST_FLOAT cfTWS_HUD_LIVES_SCORE_NUMBER_Y 590.0 CONST_FLOAT cfTWS_HUD_TOTAL_SCORE_X 840.0 CONST_FLOAT cfTWS_HUD_TOTAL_SCORE_Y 710.0 CONST_FLOAT cfTWS_HUD_TOTAL_SCORE_NUMBER_X 1100.0 CONST_FLOAT cfTWS_HUD_TOTAL_SCORE_NUMBER_Y 710.0 CONST_FLOAT cfTWS_HUD_TIME_X 0.0 CONST_FLOAT cfTWS_HUD_TIME_Y 40.0 CONST_FLOAT cfTWS_HUD_TIME_NUMBER_1_X -20.0 CONST_FLOAT cfTWS_HUD_TIME_NUMBER_2_X 20.0 CONST_FLOAT cfTWS_HUD_TIME_NUMBER_1_Y 105.0 CONST_FLOAT cfTWS_HUD_LIFES_NUMBER_1_X 490.0 CONST_FLOAT cfTWS_HUD_LIFES_NUMBER_1_Y 76.0 CONST_FLOAT cfTWS_HUD_LEVEL_NUMBER_1_X 524.0 CONST_FLOAT cfTWS_HUD_LEVEL_NUMBER_1_Y 115.0 CONST_FLOAT cfTWS_HUD_HI_X -340.0 CONST_FLOAT cfTWS_HUD_HI_Y 43.0 CONST_INT ciTWS_FX_ITEM_ANIM_FRAMES 4 CONST_INT ciTWS_FX_SWORD_LIGHTNING_ANIM_FRAMES 2 CONST_INT ciTWS_FX_FIREBALL_ANIM_FRAMES 2 CONST_INT ciTWS_FX_COINS_ANIM_FRAMES 6 CONST_INT ciTWS_FX_SUPERATTACK_EXPLOSION_ANIM_FRAMES 5 CONST_INT ciTWS_FX_HIT_ANIM_FRAMES 3 CONST_INT ciTWS_FX_HIT_VENOM_ANIM_FRAMES 4 CONST_INT ciTWS_FX_BOSS_SPIDER_SPIT_ANIM_FRAMES 4 CONST_INT ciTWS_FX_BOSS_SPIDER_VENOM_ANIM_FRAMES 4 CONST_INT ciTWS_FX_WIZARD_PILLAR_ANIM_FRAMES 14 CONST_INT ciTWS_FX_WIZARD_PILLAR_DAMAGE_ANIM_FRAMES 4 CONST_INT ciTWS_FX_WIZARD_FIRE_ANIM_FRAMES 8 CONST_INT ciTWS_FX_KNIGHT_SWORD_ANIM_FRAMES 6 CONST_INT ciTWS_FX_KNIGHT_SWORD_DROP_ANIM_FRAMES 3 CONST_INT ciTWS_FX_KNIGHT_COD_DROP_ANIM_FRAMES 9 CONST_INT ciTWS_ENEMY_EXTRA_LONG_ATTACK_ANIM_FRAMES 16 CONST_INT ciTWS_ENEMY_LONG_ATTACK_ANIM_FRAMES 10 CONST_INT ciTWS_ENEMY_ATTACK_ANIM_FRAMES 8 CONST_INT ciTWS_ENEMY_SHORT_ATTACK_ANIM_FRAMES 5 CONST_INT ciTWS_ENEMY_WALK_ANIM_FRAMES 8 CONST_INT ciTWS_ENEMY_FLY_ANIM_FRAMES 4 CONST_INT ciTWS_ENEMY_GETTINGUP_ANIM_FRAMES 2 CONST_INT ciTWS_ENEMY_IDLE_ANIM_FRAMES 4 CONST_INT ciTWS_ENEMY_SNAKE_IDLE_ANIM_FRAMES 5 CONST_INT ciTWS_BOSS_SPIDER_SPIT_ANIM_FRAMES 4 CONST_INT ciTWS_BOSS_SPIDER_ATTACK_LOAD_ANIM_FRAMES 5 CONST_INT ciTWS_BOSS_SPIDER_ATTACK_ANIM_FRAMES 10 CONST_INT ciTWS_BOSS_SPIDER_DYING_ANIM_FRAMES 4 CONST_INT ciTWS_ENEMY_LEPRECHAUN_WALK_ANIM_FRAMES 6 CONST_INT ciTWS_ENEMY_BOULDER_WALK_ANIM_FRAMES 6 CONST_INT ciTWS_ENEMY_LEPRECHAUN_SPAWN_ANIM_FRAMES 9 CONST_INT ciTWS_ENEMY_LEPRECHAUN_DYING_ANIM_FRAMES 6 CONST_INT ciTWS_ENEMY_CASTER_DYING_ANIM_FRAMES 8 CONST_INT ciTWS_ENEMY_SLIME_JUMPING_ANIM_FRAME 5 CONST_INT ciTWS_ENEMY_BOSS_KNIGHT_HURT_ANIM_FRAMES 5 CONST_INT ciTWS_ENEMY_BOSS_KNIGHT_SLAM_ANIM_FRAMES 12 CONST_INT ciTWS_TRAP_SPEAR_ANIM_FRAMES 4 CONST_INT ciTWS_WALK_ANIM_FRAMES 10 CONST_INT ciTWS_GRUNT_WALK_ANIM_FRAMES 8 CONST_INT ciTWS_IDLE_ANIM_FRAMES 4 CONST_INT ciTWS_JUMP_ANIM_FRAMES 6 CONST_INT ciTWS_FALL_HOLE_ANIM_FRAMES 3 CONST_INT ciTWS_JUMP_KICK_ANIM_FRAMES 3 CONST_INT ciTWS_JUMP_KICK_EXTENDED_ANIM_FRAMES 5 CONST_INT ciTWS_JUMP_END_ANIM_FRAMES 2 CONST_INT ciTWS_GETTING_UP_ANIM_FRAMES 3 CONST_INT ciTWS_GETTING_UP_EXTENDED_ANIM_FRAMES 4 CONST_INT ciTWS_ATTACK_SIMPLE_ANIM_FRAMES 4 CONST_INT ciTWS_FINAL_ATTACK_ANIM_FRAMES 9 CONST_INT ciTWS_ATTACK_ANIM_FRAMES 12 CONST_INT ciTWS_ATTACK_EXTENDED_ANIM_FRAMES 16 CONST_INT ciTWS_DOUBLE_ATTACK_START_FRAME 8 CONST_INT ciTWS_DOUBLE_ATTACK_EXTENDED_FRAME 10 CONST_INT ciTWS_DASH_ANIM_FRAMES 5 CONST_INT ciTWS_DASH_START_ANIM_FRAME 2 CONST_INT ciTWS_EVOLVING_ANIM_FRAMES 4 CONST_INT ciTWS_EVOLVING_CHEST_ANIM_FRAMES 9 CONST_INT ciTWS_DIALOGUE_FRAME_ANIM_FRAMES 4 CONST_INT ciTWS_WIZARD_TELEPORT_ANIM_FRAMES 6 CONST_INT ciTWS_WIZARD_DYING_ANIM_FRAMES 4 CONST_INT ciTWS_WIZARD_DEATH_FLASH_ANIM_FRAMES 14 CONST_INT ciTWS_WIZARD_DEATH_ANIM_FRAMES 17 CONST_INT ciTWS_SLIME_DEATH_ANIM_FRAMES 5 CONST_INT ciTWS_KNIGHT_STAND_ANIM_FRAMES 10 CONST_INT ciTWS_MAX_ENEMIES 58 CONST_INT ciTWS_MAX_NPCS 1 CONST_INT ciTWS_MAX_ITEMS 20 CONST_INT ciTWS_MAX_BACKGROUND_TILES 18 CONST_INT ciTWS_MAX_FOREGROUND_TILES 20 CONST_INT ciTWS_MAX_TRAPS 22 CONST_INT ciTWS_MAX_FX 38 CONST_INT ciTWS_MAX_HUD_ELEMENTS 5 CONST_INT ciTWS_MAX_LOCKED_BATTLES 3 CONST_INT ciTWS_MAX_DRAW_CALLS ciTWS_MAX_ENEMIES + ciTWS_MAX_NPCS + ciTWS_MAX_ITEMS + ciTWS_MAX_TRAPS + ciTWS_MAX_FX CONST_INT ciTWS_MAX_SOUNDS 10 CONST_INT ciTWS_ROTATE_PLAYER_DELAY 150 CONST_INT ciTWS_ENEMIES_STUN_TIME 400 CONST_INT ciTWS_INVINCIBLE_AFTER_HIT_TIME 1000 CONST_INT ciTWS_MAGIC_COLUMN_INTRO_TIME 200 CONST_INT ciTWS_BOSS_ATTACK_TIME 3000 CONST_INT ciTWS_BATTLE_ENEMY_SPAWN_TIME 2000 CONST_INT ciTWS_BATTLE_SECURITY_TIME_LIMIT 10000 CONST_INT ciTWS_HOLD_TO_QUIT_TIME 1000 CONST_FLOAT cfTWS_ENEMY_HIT_OFFSET 3.0 CONST_FLOAT cfTWS_BACKGROUND_TILE_WIDTH 1300.0 CONST_FLOAT cfTWS_BACKGROUND_TILE_HEIGHT 960.0 CONST_FLOAT cfTWS_BACKGROUND_BOSS_TILE_WIDTH 1488.0 CONST_FLOAT cfTWS_ANIMATED_BACKGROUND_TILE_WIDTH 102.0 CONST_FLOAT cfTWS_MENU_BACKGROUND_TILE_WIDTH 2912.0 CONST_FLOAT cfIAP_CONTROLLER_AXIS_THRESHOLD_MOD 1.0 CONST_INT ciTWS_ANIMATED_BACKGROUND_TILES 14 CONST_INT ciTWS_ANIMATED_BACKGROUND_FRAMES 16 CONST_INT ciTWS_MENU_OPTIONS_BEGIN_FRAME 0 CONST_INT ciTWS_MENU_OPTIONS_LEADERBOARD_FRAME 5 CONST_INT ciTWS_MENU_OPTIONS_GROG_FRAME 10 CONST_INT ciTWS_TITLE_ANIM_STRIKE_FRAMES 4 CONST_INT ciTWS_TITLE_ANIM_FINAL_FRAMES 8 CONST_INT ciTWS_TITLE_ANIM_PAUSE_FRAMES 20 CONST_INT ciTWS_CUTSCENE_SHOT_TIME 2000 CONST_INT ciTWS_INTRO_CUTSCENE_SHOTS 7 CONST_INT ciTWS_OUTRO_CUTSCENE_SHOTS 4 CONST_INT ciTWS_GRAVITY -5000 CONST_INT ciTWS_JUMP_ACCELERATION 1550 CONST_FLOAT cfTWS_VERTICAL_MOVEMENT_PLAYER 250.0 CONST_FLOAT cfTWS_HORIZONTAL_MOVEMENT_PLAYER 500.0 CONST_FLOAT cfTWS_VERTICAL_MOVEMENT_ENEMY 250.0 CONST_FLOAT cfTWS_HORIZONTAL_MOVEMENT_ENEMY 500.0 CONST_FLOAT cfTWS_VERTICAL_MOVEMENT_STALACTITES 750.0 ENUM TWS_ARCADE_CLIENT_STATE TWS_ARCADE_CLIENT_STATE_INIT = 0, TWS_ARCADE_CLIENT_STATE_REQUESTING_ASSETS, TWS_ARCADE_CLIENT_STATE_FIB_WARNING, TWS_ARCADE_CLIENT_STATE_PIXTRO_LOGO, TWS_ARCADE_CLIENT_STATE_INIT_MENU, TWS_ARCADE_CLIENT_STATE_TITLE_ANIM, TWS_ARCADE_CLIENT_STATE_TITLE_SCREEN, TWS_ARCADE_CLIENT_STATE_MAP_SCREEN, TWS_ARCADE_CLIENT_STATE_INIT_LEVEL, TWS_ARCADE_CLIENT_STATE_INTRO_CUTSCENE, TWS_ARCADE_CLIENT_STATE_PLAYING, TWS_ARCADE_CLIENT_STATE_OUTRO_CUTSCENE, TWS_ARCADE_CLIENT_STATE_LEADERBOARD, TWS_ARCADE_CLIENT_STATE_CLEANUP ENDENUM ENUM TWS_LEVEL_STAGE TWS_LEVEL_DEAD = -1, TWS_LEVEL_PLAYING = 0, TWS_LEVEL_DIALOGUE_PRE_FIGHT, TWS_LEVEL_BOSS_FIGHT, TWS_LEVEL_LEADERBOARD, TWS_LEVEL_FINAL_DIALOGUE, TWS_LEVEL_DIALOGUE_POST_FIGHT, TWS_LEVEL_FADING, TWS_LEVEL_COMPLETE ENDENUM ENUM TWS_GROG_ENCOUNTER TWS_LOCK_SCREEN = 0, TWS_GROG_DESCENDS, TWS_THOG_DIALOGUE_1, TWS_GROG_LEAVES, TWS_BOSS_APPEARS, TWS_THOG_DIALOGUE_3, TWS_FIGHT_START ENDENUM ENUM TWS_TITLE_ANIM TWS_TITLE_ANIM_STRIKE_1 = 0, TWS_TITLE_ANIM_STRIKE_1_PAUSE, TWS_TITLE_ANIM_STRIKE_2, TWS_TITLE_ANIM_STRIKE_2_PAUSE, TWS_TITLE_ANIM_FINAL_STRIKE ENDENUM ENUM TWS_PIXTRO_LOGO_STATE TWS_PIXTRO_START = 0, TWS_PIXTRO_PLAYING, TWS_PIXTRO_FINISHED ENDENUM ENUM TWS_FIB_WARNING_STATE TWS_FIB_FADEIN = 0, TWS_FIB_DISPLAY, TWS_FIB_FADEOUT ENDENUM ENUM TWS_TITLE_STAGE TWS_TITLE_PRESS_START = 0, TWS_TITLE_SELECT_OPTION, TWS_TITLE_OPTION_BLINKING, TWS_TITLE_FADE ENDENUM ENUM TWS_CUTSCENE_STAGE TWS_CUTSCENE_PAUSE = -1, TWS_CUTSCENE_FADE_IN = 0, TWS_CUTSCENE_PLAYING, TWS_CUTSCENE_FADE_OUT ENDENUM ENUM TWS_MENU_OPTION TWS_MENU_BEGIN_ADVENTURE = 0, TWS_MENU_LEADERBOARD, TWS_MENU_GROG_MODE, TWS_MAX_MENU_OPTIONS ENDENUM ENUM TWS_CHALLENGE_BIT TWS_CHALLENGE_BIT_NONE = 0, TWS_CHALLENGE_BIT_FEELIN_GROGGY = 1, TWS_CHALLENGE_BIT_PLATINUM_SWORD_BRONZE = 2, TWS_CHALLENGE_BIT_PLATINUM_SWORD_SILVER = 3, TWS_CHALLENGE_BIT_PLATINUM_SWORD_GOLD = 4, TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM = 5, TWS_CHALLENGE_BIT_COIN_PURSE_BRONZE = 6, TWS_CHALLENGE_BIT_COIN_PURSE_SILVER = 7, TWS_CHALLENGE_BIT_COIN_PURSE_GOLD = 8, TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM = 9 ENDENUM ENUM TWS_PLAYER_STATE TWS_INTRO = 0, TWS_IDLE, TWS_WALK, TWS_ATTACK, TWS_ATTACK_DOUBLE, TWS_ATTACK_LOW, TWS_CHARGE, TWS_SUPERATTACK, TWS_JUMP_START, TWS_JUMP_ASCEND, TWS_JUMP_CREST, TWS_JUMP_DESCEND, TWS_JUMP_END, TWS_JUMP_ATTACK, TWS_JUMP_ATTACK_DESCEND, TWS_FALL, TWS_FALL_HIGH, TWS_FALL_2, TWS_FALL_INFINITE, TWS_FALL_HOLE_1, TWS_FALL_HOLE_2, TWS_STUN, TWS_FLAT, TWS_GETTING_UP, TWS_EVOLVING, TWS_EVOLVING_2, TWS_EVOLVING_3, TWS_EVOLVING_4, TWS_EVOLVING_5, TWS_EVOLVING_6, TWS_DEAD ENDENUM ENUM TWS_ENEMY_STATE TWS_ENEMY_IDLE = 0, TWS_ENEMY_WALK, TWS_ENEMY_ATTACK, TWS_ENEMY_ATTACK_LOAD, TWS_ENEMY_ATTACK_WAIT, TWS_ENEMY_ATTACK_HIT, TWS_ENEMY_SPECIAL_ATTACK, TWS_ENEMY_SPECIAL_ATTACK_2, TWS_ENEMY_SPECIAL_ATTACK_3, TWS_ENEMY_FALL, TWS_ENEMY_FLAT, TWS_ENEMY_GETTING_UP, TWS_ENEMY_STUN, TWS_ENEMY_GLIDE_DOWN, TWS_ENEMY_LANDING, TWS_ENEMY_GO_UP, TWS_ENEMY_FALL_OVER_1, TWS_ENEMY_FALL_OVER_2, TWS_ENEMY_SPIT_1, TWS_ENEMY_SPIT_2, TWS_ENEMY_SPIT_3, TWS_ENEMY_TELEPORT_IN, TWS_ENEMY_TELEPORTING, TWS_ENEMY_TELEPORT_OUT, TWS_ENEMY_EXPLODING, TWS_ENEMY_DYING, TWS_ENEMY_DYING_1, TWS_ENEMY_DYING_2, TWS_ENEMY_DYING_3, TWS_ENEMY_DYING_4, TWS_ENEMY_DYING_5, TWS_ENEMY_DYING_6, TWS_ENEMY_DYING_7, TWS_ENEMY_DYING_8, TWS_ENEMY_DEAD, TWS_ENEMY_INACTIVE, TWS_ENEMY_INVISIBLE ENDENUM ENUM TWS_NPC_TYPE TWS_NPC_WOMAN = 0, TWS_NPC_TWINS, TWS_NPC_VILLAGER ENDENUM ENUM TWS_ENEMY_TYPE TWS_ENEMY_BRUTE = 0, TWS_ENEMY_GRUNT, TWS_ENEMY_BAT, TWS_ENEMY_SPIDER, TWS_ENEMY_SLIME, TWS_ENEMY_SNAKE, TWS_ENEMY_GRUNT_SWORD, TWS_ENEMY_GRUNT_SPEAR, TWS_ENEMY_GRUNT_FIRESWORD, TWS_ENEMY_GRUNT_FIRESPEAR, TWS_ENEMY_GRUNT_CROSSBOW, TWS_ENEMY_GRUNT_CASTER, TWS_ENEMY_FAIRY, TWS_ENEMY_BRUTE_AXE, TWS_ENEMY_LEPRECHAUN, TWS_ENEMY_BOULDER, TWS_ENEMY_KNIGHT, TWS_ENEMY_BOSS_SPIDER, TWS_ENEMY_BOSS_AMAZON, TWS_ENEMY_BOSS_KNIGHT, TWS_ENEMY_FAKE_WIZARD, TWS_ENEMY_DIALOGUE_WIZARD, TWS_ENEMY_BOSS_WIZARD ENDENUM ENUM TWS_ITEM_TYPE TWS_ITEM_GOLD_1 = 0, TWS_ITEM_GOLD_2, TWS_ITEM_GOLD_3, TWS_ITEM_GOLD_4, TWS_ITEM_HP_SMA, TWS_ITEM_HP_MED, TWS_ITEM_MP_SMA, TWS_ITEM_MP_MED, TWS_ITEM_HP_LAR, TWS_ITEM_MP_LAR, TWS_ITEM_1UP, TWS_ITEM_NONE ENDENUM ENUM TWS_FX_TYPE TWS_FX_SWORD_LIGHTNING = 0, TWS_FX_SUPERATTACK_EXPLOSION, TWS_FX_SMALL_HIT, TWS_FX_LARGE_HIT, TWS_FX_VENOM_HIT, TWS_FX_BLOOD_HIT, TWS_FX_CLOTHES, TWS_FX_BOSS_SPIDER_SPIT, TWS_FX_VENOM_PUDDLE, TWS_FX_MAGIC_COLUMN, TWS_FX_MAGIC_FIRE, TWS_FX_ARROW_LEFT, TWS_FX_ARROW_RIGHT, TWS_FX_FIREBALL_LEFT, TWS_FX_FIREBALL_RIGHT, TWS_FX_COINS_LEFT, TWS_FX_COINS_RIGHT, TWS_FX_SWORD, TWS_FX_SWORD_DROP, TWS_FX_COD_DROP, TWS_FX_PICKUP, TWS_FX_HELP, TWS_FX_TRAP_SPEAR, TWS_FX_GROG_BUBBLE ENDENUM ENUM TWS_HUD_TYPE TWS_HUD_START = 0, TWS_HUD_GO_ARROW = 1, TWS_HUD_DIALOGUE_FRAME = 2, TWS_HUD_GAMEOVER = 3, TWS_HUD_END = 4 ENDENUM ENUM TWS_BACKGROUND_TILE_TYPE TWS_FBG_TL_FOREST_1 = 0, TWS_FBG_TL_FOREST_2, TWS_FBG_TL_SWAMP, TWS_FBG_TL_CAVES, TWS_BG_TL_1_INTRO, TWS_BG_TL_1_BASE, TWS_BG_TL_1_CAVE, TWS_BG_TL_1_CLIFF, TWS_BG_TL_1_SPIDER, TWS_BG_TL_1_BOSS, TWS_BG_TL_1_GEN_1, TWS_BG_TL_1_GEN_2, TWS_BG_TL_2_INTRO, TWS_BG_TL_2_BIG_TREE, TWS_BG_TL_2_TREES, TWS_BG_TL_2_DEAD_BODIES, TWS_BG_TL_2_BOSS, TWS_BG_TL_2_GEN_1, TWS_BG_TL_2_GEN_2, TWS_BG_TL_2_GEN_3, TWS_BG_TL_3_INTRO, TWS_BG_TL_3_WINDOWS_OPEN, TWS_BG_TL_3_STATUES, TWS_BG_TL_3_BIG_WINDOW, TWS_BG_TL_3_DOOR_STAIRS, TWS_BG_TL_3_OUTRO, TWS_BG_TL_3_GEN_1, TWS_BG_TL_3_GEN_2, TWS_BG_TL_3_FINAL, TWS_BG_TL_4_INTRO_NPC, TWS_BG_TL_4_INTRO, TWS_BG_TL_4_BIG_TREE, TWS_BG_TL_4_BIG_MUSHROOM, TWS_BG_TL_4_OPEN_BACK, TWS_BG_TL_4_TREES, TWS_BG_TL_4_BOSS, TWS_BG_TL_4_GEN_1, TWS_BG_TL_4_GEN_2, TWS_BG_TL_4_GEN_3 ENDENUM ENUM TWS_FOREGROUND_TILE_TYPE TWS_FG_TL_1_INTRO = 0, TWS_FG_TL_1_COL1, TWS_FG_TL_1_COL2, TWS_FG_TL_1_STALAGMITE1, TWS_FG_TL_1_STALAGMITE2, TWS_FG_TL_1_STALAGMITE3, TWS_FG_TL_1_BOSS, TWS_FG_TL_2_GRASS, TWS_FG_TL_2_PIKE, TWS_FG_TL_2_ROOT, TWS_FG_TL_2_VINES_1, TWS_FG_TL_2_VINES_2, TWS_FG_TL_2_VINES_3, TWS_FG_TL_3_INTRO, TWS_FG_TL_3_GARGOYLE_1, TWS_FG_TL_3_GARGOYLE_2, TWS_FG_TL_3_COLUMN, TWS_FG_TL_3_CANDLES_1, TWS_FG_TL_3_CANDLES_2, TWS_FG_TL_4_BLUE_FLOWERS, TWS_FG_TL_4_YELLOW_FLOWERS, TWS_FG_TL_4_MUSHROOMS, TWS_FG_TL_4_SHORT_GRASS, TWS_FG_TL_4_TALL_GRASS ENDENUM ENUM TWS_SCENERY_ELEMENT_TYPE TWS_SC_NONE = 0, TWS_SC_BRIDGE ENDENUM ENUM TWS_TRAP_TYPE TWS_TRAP_FALL = 0, TWS_TRAP_STALAGTITE, TWS_TRAP_HOLE ENDENUM ENUM TWS_LEVEL TWS_FOREST_INTRO = 0, TWS_FOREST = 1, TWS_SWAMP = 2, TWS_CAVES = 3, TWS_CASTLE = 4, TWS_CASTLE_OUTRO = 5, TWS_MAX_LEVELS = 6 ENDENUM ENUM TWS_ENTITY_TYPE TWS_ENTITY_DEFAULT = 0, TWS_ENTITY_ENEMY, TWS_ENTITY_FX, TWS_ENTITY_ITEM, TWS_ENTITY_NPC, TWS_ENTITY_TRAP, TWS_ENTITY_PLAYER ENDENUM ENUM TWS_TEXT_HELP TWS_TH_MOVE = 0, TWS_TH_ATTACK, TWS_TH_JUMP, TWS_TH_DASH, TWS_TH_JUMP_ATTACK, TWS_TH_MAGIC, TWS_TH_EVOLUTION, TWS_TH_MAX ENDENUM #IF IS_DEBUG_BUILD FUNC STRING TWS_DEBUG_GET_TWS_ARCADE_CLIENT_STATE_AS_STRING(TWS_ARCADE_CLIENT_STATE eValue) SWITCH eValue CASE TWS_ARCADE_CLIENT_STATE_INIT RETURN "TWS_ARCADE_CLIENT_STATE_INIT" CASE TWS_ARCADE_CLIENT_STATE_REQUESTING_ASSETS RETURN "TWS_ARCADE_CLIENT_STATE_REQUESTING_ASSETS" CASE TWS_ARCADE_CLIENT_STATE_FIB_WARNING RETURN "TWS_ARCADE_CLIENT_STATE_FIB_WARNING" CASE TWS_ARCADE_CLIENT_STATE_PIXTRO_LOGO RETURN "TWS_ARCADE_CLIENT_STATE_PIXTRO_LOGO" CASE TWS_ARCADE_CLIENT_STATE_MAP_SCREEN RETURN "TWS_ARCADE_CLIENT_STATE_MAP_SCREEN" CASE TWS_ARCADE_CLIENT_STATE_TITLE_ANIM RETURN "TWS_ARCADE_CLIENT_STATE_TITLE_ANIM" CASE TWS_ARCADE_CLIENT_STATE_TITLE_SCREEN RETURN "TWS_ARCADE_CLIENT_STATE_TITLE_SCREEN" CASE TWS_ARCADE_CLIENT_STATE_INIT_LEVEL RETURN "TWS_ARCADE_CLIENT_STATE_INIT_LEVEL" CASE TWS_ARCADE_CLIENT_STATE_PLAYING RETURN "TWS_ARCADE_CLIENT_STATE_PLAYING" CASE TWS_ARCADE_CLIENT_STATE_CLEANUP RETURN "TWS_ARCADE_CLIENT_STATE_CLEANUP" ENDSWITCH RETURN "INVALID TWS_ARCADE_CLIENT_STATE" ENDFUNC #ENDIF STRUCT TWS_DRAW_CALL INT iIndex TWS_ENTITY_TYPE eType FLOAT fZIndex ENDSTRUCT STRUCT TWS_CUTSCENE_DATA BOOL bShouldCutscenePlay = FALSE INT iSpriteCutsceneAnimFrame INT iMaxCutsceneFrame = 0 TEXT_LABEL_23 sCutsceneName TWS_TITLE_ANIM eTitleCutsceneStage = TWS_TITLE_ANIM_STRIKE_1 TWS_CUTSCENE_STAGE eGameplayCutsceneStage = TWS_CUTSCENE_PAUSE ENDSTRUCT STRUCT TWS_LOCKED_BATTLE BOOL bActive = FALSE BOOL bSpawnEnemies = TRUE INT iTile = -1 INT iEnemies = 0 INT iEnemySize = 0 INT iSpawnTime = ciTWS_BATTLE_ENEMY_SPAWN_TIME ENDSTRUCT STRUCT TWS_ARCADE_DATA #IF IS_DEBUG_BUILD WIDGET_GROUP_ID widgetGroup BOOL bDebugCreatedWidgets BOOL bInfiniteMagic INT iReloadLevel = 0 BOOL bShouldReloadLevel = FALSE BOOL bChallengeCompleted[4] #ENDIF BOOL bFadingOut = FALSE BOOL bDisplayingDialogue = FALSE BOOL bIsHardCoreMode = FALSE BOOL bNormalModeIsCompleted = FALSE BOOL bMenuOptionMovingToRight = FALSE BOOL bHUDIsHidden = FALSE BOOL bLockedScreen = FALSE BOOL bExitingLockedScreen = FALSE BOOL bShowedTextHelp[TWS_TH_MAX] INT iCurrentDialogue = -1 INT iLastDialogue = -1 INT iAnimatedBackgroundSpriteAnim = 0 INT iMenuOptionSpriteAnim = 0 INT iGlobalDefaultUpdateFrames INT iGlobalDefaultFrameTimeCounter INT iBossEnemyIndex = 0 INT iCurrentLockedBattle INT iNumberOfEnemiesSpawnedInBattle = 0 INT iNumberOfEnemiesKilledInBattle = 0 INT iBattleTimer INT iGameTimer INT iHelpTextTimer INT iQuitTime = -HIGHEST_INT INT iLivesPoints INT iHealthPoints INT iChallengesBitsetForTelemetry FLOAT fMenuBackgroundPosX[2] FLOAT fLockedScreenPos BINK_MOVIE_ID bmIDPixtroIntro TWS_LEVEL eCurrentLevel = TWS_FOREST_INTRO TWS_GROG_ENCOUNTER eGrogEncounterState = TWS_GROG_DESCENDS TWS_FIB_WARNING_STATE eFIBState = TWS_FIB_FADEIN TWS_PIXTRO_LOGO_STATE ePixtroState = TWS_PIXTRO_START TWS_TITLE_STAGE eTitleStage = TWS_TITLE_PRESS_START TWS_LEVEL_STAGE eLevelStage = TWS_LEVEL_PLAYING TWS_LOCKED_BATTLE sLockedBattles[ciTWS_MAX_LOCKED_BATTLES] TWS_MENU_OPTION eCurrentMenuOption = TWS_MENU_BEGIN_ADVENTURE TWS_CUTSCENE_DATA sCutsceneData TWS_DRAW_CALL sDrawCalls[ciTWS_MAX_DRAW_CALLS] ARCADE_GAMES_SOUND eSound[ciTWS_MAX_SOUNDS] TWS_ARCADE_CLIENT_STATE eClientState RGBA_COLOUR_STRUCT rgbaBlack RGBA_COLOUR_STRUCT rgbaFade RGBA_COLOUR_STRUCT rgbaSprite RGBA_COLOUR_STRUCT rgbaBlackTransparent STRUCT_ARCADE_CABINET sTelemetry TWS_CHALLENGE_BIT eChallengeFlags ARCADE_CABINET_ANIM_EVENT_STRUCT sWizardAnimEvent ENDSTRUCT STRUCT TWS_FX_DATA BOOL bActive = FALSE INT iSpriteBlastAnimFrame INT iSlowFrameTimeCounter INT iSlowUpdateFrames INT iTimer = 0 FLOAT fZIndex = 0.0 TWS_FX_TYPE eType = TWS_FX_SWORD_LIGHTNING VECTOR_2D vSpritePos VECTOR_2D vSpriteSize ENDSTRUCT STRUCT TWS_HUD_DATA BOOL bActive = FALSE BOOL bRendering = FALSE BOOL bPlayedSoundAttacked = FALSE INT iSpriteBlastAnimFrame INT iSlowFrameTimeCounter INT iSlowUpdateFrames TWS_HUD_TYPE eType = TWS_HUD_START VECTOR_2D vSpritePos ENDSTRUCT STRUCT TWS_PLAYER_DATA BOOL bIsMoving BOOL bIsAttacking BOOL bAttackIsDouble BOOL bAttackIsLow BOOL bIsCharging BOOL bIsUsingMagic BOOL bIsJumping BOOL bIsHit BOOL bIsFalling BOOL bIsCameraShakeActive BOOL bIsInvincible BOOL bIsEvolving BOOL bFacingLeft BOOL bIsMovingToCenter BOOL bIsMovingOutOfScreen BOOL bIsMovingLeft INT iDefaultFrameTimeCounter INT iDefaultUpdateFrames INT iSlowFrameTimeCounter INT iSlowUpdateFrames INT iSpriteAnimFrame = 0 INT iStunTime = 0 INT iLastCharge = 0 INT iTimeSinceLastAttack = 0 INT iSuperAttackStage = 0 INT iLevel = 1 INT iLifes = 3 INT iScore = 0 INT iHighestScore = 0 INT iTreasures = 0 FLOAT fJumpAcceleration = 0.0 FLOAT fHealth = 1.0 FLOAT fMagic = 0.0 FLOAT fShadowXOffset = 0.0 TWS_PLAYER_STATE ePlayerState = TWS_INTRO VECTOR_2D vSpritePos VECTOR_2D vSpriteOffset VECTOR_2D vSpriteSize VECTOR_2D vInitialJumpPos ENDSTRUCT STRUCT TWS_ENEMY_DATA BOOL bIsActive BOOL bIsMoving BOOL bIsAttacking BOOL bIsHit BOOL bIsFalling BOOL bIsBattleEnemy INT iDefaultFrameTimeCounter INT iDefaultUpdateFrames INT iSlowFrameTimeCounter INT iSlowUpdateFrames INT iSpriteAnimFrame = 0 INT iAttackFrame = 0 INT iTimer = 0 INT iEnemySize = 1 INT iNumberOfAttacksInARow = 0 FLOAT fHealth = 1.0 FLOAT fProgressToTarget = 0.0 TWS_ENEMY_TYPE eEnemyType = TWS_ENEMY_BRUTE TWS_ENEMY_STATE eEnemyState = TWS_IDLE TWS_ENEMY_STATE eNextState = TWS_IDLE VECTOR_2D vTargetPos VECTOR_2D vInitialPos VECTOR_2D vSpritePos VECTOR_2D vSpriteSize VECTOR_2D vSpriteOffset VECTOR_2D vShadowOffset ENDSTRUCT STRUCT TWS_NPC_DATA BOOL bIsActive INT iNPCSize = 1 FLOAT fHealth = 1.0 TWS_NPC_TYPE eNPCType = TWS_NPC_VILLAGER VECTOR_2D vSpritePos VECTOR_2D vSpriteSize ENDSTRUCT STRUCT TWS_ITEM_DATA BOOL bIsHit BOOL bIsActive BOOL bFalling INT iDefaultFrameTimeCounter INT iDefaultUpdateFrames INT iSlowFrameTimeCounter INT iSlowUpdateFrames INT iSpriteAnimFrame = 0 TWS_ITEM_TYPE eItemType VECTOR_2D vSpritePos VECTOR_2D vSpriteFallPos VECTOR_2D vSpriteSize ENDSTRUCT STRUCT TWS_BACKGROUND_TILE FLOAT fSpritePos FLOAT fSpriteWidth TWS_BACKGROUND_TILE_TYPE eType ENDSTRUCT STRUCT TWS_FOREGROUND_TILE TWS_FOREGROUND_TILE_TYPE eType VECTOR_2D vSpritePos VECTOR_2D vSpriteSize ENDSTRUCT STRUCT TWS_TRAP BOOL bIsActive = FALSE BOOL bIsWorking = TRUE TWS_TRAP_TYPE eType VECTOR_2D vSpritePos VECTOR_2D vSpritePos2 VECTOR_2D vSpriteSize ENDSTRUCT TWS_ARCADE_DATA sTWSData TWS_PLAYER_DATA sPlayerData TWS_ENEMY_DATA sEnemyData[ciTWS_MAX_ENEMIES] TWS_NPC_DATA sNPCData[ciTWS_MAX_NPCS] TWS_ITEM_DATA sItemData[ciTWS_MAX_ITEMS] TWS_FX_DATA sFXData[ciTWS_MAX_FX] TWS_HUD_DATA sHUDData[ciTWS_MAX_HUD_ELEMENTS] TWS_BACKGROUND_TILE sFarBackgroundTilesData[ciTWS_MAX_BACKGROUND_TILES] TWS_BACKGROUND_TILE sBackgroundTilesData[ciTWS_MAX_BACKGROUND_TILES] TWS_FOREGROUND_TILE sForegroundTilesData[ciTWS_MAX_FOREGROUND_TILES] TWS_TRAP sTrapsData[ciTWS_MAX_TRAPS] INT iCurrentEnemyToAdd = 0 INT iCurrentNPCToAdd = 0 INT iCurrentItemToAdd = 0 INT iCurrentHUDItemToAdd = 0 INT iCurrentFarBackgroundTileToAdd = 0 INT iCurrentBackgroundTileToAdd = 0 INT iCurrentForegroundTileToAdd = 0 INT iCurrentTrapToAdd = 0 PROC TWS_INIT_COLOUR_STRUCTS() INIT_RGBA_STRUCT(sTWSData.rgbaBlack, 0, 0, 0, 255) INIT_RGBA_STRUCT(sTWSData.rgbaFade, 0, 0, 0, 255) INIT_RGBA_STRUCT(sTWSData.rgbaSprite, 255, 255, 255, 255) INIT_RGBA_STRUCT(sTWSData.rgbaBlackTransparent, 255, 255, 255, 100) ENDPROC FUNC STRING TWS_CHALLENGE_BIT_TO_STRING(TWS_CHALLENGE_BIT eEnum) SWITCH eEnum CASE TWS_CHALLENGE_BIT_NONE RETURN "TWS_CHALLENGE_BIT_NONE" CASE TWS_CHALLENGE_BIT_FEELIN_GROGGY RETURN "TWS_CHALLENGE_BIT_FEELIN_GROGGY" CASE TWS_CHALLENGE_BIT_PLATINUM_SWORD_BRONZE RETURN "TWS_CHALLENGE_BIT_PLATINUM_SWORD_BRONZE" CASE TWS_CHALLENGE_BIT_PLATINUM_SWORD_SILVER RETURN "TWS_CHALLENGE_BIT_PLATINUM_SWORD_SILVER" CASE TWS_CHALLENGE_BIT_PLATINUM_SWORD_GOLD RETURN "TWS_CHALLENGE_BIT_PLATINUM_SWORD_GOLD" CASE TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM RETURN "TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM" CASE TWS_CHALLENGE_BIT_COIN_PURSE_BRONZE RETURN "TWS_CHALLENGE_BIT_COIN_PURSE_BRONZE" CASE TWS_CHALLENGE_BIT_COIN_PURSE_SILVER RETURN "TWS_CHALLENGE_BIT_COIN_PURSE_SILVER" CASE TWS_CHALLENGE_BIT_COIN_PURSE_GOLD RETURN "TWS_CHALLENGE_BIT_COIN_PURSE_GOLD" CASE TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM RETURN "TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM" ENDSWITCH RETURN "INVALID CHALLENGE" ENDFUNC PROC TWS_RESET_CHALLENGES() sTWSData.eChallengeFlags = TWS_CHALLENGE_BIT_NONE sTWSData.iChallengesBitsetForTelemetry = 0 SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_WIZHARD, FALSE) SET_MP_INT_CHARACTER_AWARD(MP_AWARD_BATSWORD, 0) SET_MP_INT_CHARACTER_AWARD(MP_AWARD_COINPURSE, 0) ENDPROC PROC TWS_SET_CHALLENGE_COMPLETED(TWS_CHALLENGE_BIT eBit) IF NOT IS_BITMASK_ENUM_AS_ENUM_SET(sTWSData.eChallengeFlags, eBit) CPRINTLN(DEBUG_MINIGAME, "TWS_SET_CHALLENGE_COMPLETED:", TWS_CHALLENGE_BIT_TO_STRING(eBit)) SET_BITMASK_ENUM_AS_ENUM(sTWSData.eChallengeFlags, eBit) SWITCH (eBit) CASE TWS_CHALLENGE_BIT_FEELIN_GROGGY SET_MP_BOOL_CHARACTER_AWARD(MP_AWARD_WIZHARD, TRUE) BREAK CASE TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM SET_MP_INT_CHARACTER_AWARD(MP_AWARD_BATSWORD, g_sMptunables.iARCADE_PLAT_SWORD_PLATINUM_SCORE) BREAK CASE TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM SET_MP_INT_CHARACTER_AWARD(MP_AWARD_COINPURSE, g_sMptunables.iARCADE_COIN_PURSE_PLATINUM_SCORE) BREAK ENDSWITCH ENDIF ENDPROC PROC TWS_SET_CHALLENGE_VALUE(TWS_CHALLENGE_BIT eBit, INT value) CDEBUG1LN(DEBUG_MINIGAME, "TWS_SET_CHALLENGE_VALUE:", TWS_CHALLENGE_BIT_TO_STRING(eBit)," value ",value) SWITCH (eBit) CASE TWS_CHALLENGE_BIT_FEELIN_GROGGY TWS_SET_CHALLENGE_COMPLETED(TWS_CHALLENGE_BIT_FEELIN_GROGGY) SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_FEELIN_GROGGY)) ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_WIZARDS_GROGGY) BREAK CASE TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM IF value >= g_sMptunables.iARCADE_PLAT_SWORD_PLATINUM_SCORE TWS_SET_CHALLENGE_COMPLETED(TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM) SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM)) ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_WIZARDS_SWORD_PLATINUM) ELSE INT iCurrent iCurrent = GET_MP_INT_CHARACTER_AWARD(MP_AWARD_BATSWORD) IF iCurrent < value SET_MP_INT_CHARACTER_AWARD(MP_AWARD_BATSWORD,value) IF value >= g_sMptunables.iARCADE_PLAT_SWORD_GOLD_SCORE SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_GOLD)) ELIF value >= g_sMptunables.iARCADE_PLAT_SWORD_SILVER_SCORE SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_SILVER)) ELIF value >= g_sMptunables.iARCADE_PLAT_SWORD_BRONZE_SCORE SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_PLATINUM_SWORD_BRONZE)) ENDIF ENDIF ENDIF BREAK CASE TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM IF value >= g_sMptunables.iARCADE_COIN_PURSE_PLATINUM_SCORE TWS_SET_CHALLENGE_COMPLETED(TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM) SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM)) ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_WIZARDS_COIN_PURSE) ELSE INT iCurrent iCurrent = GET_MP_INT_CHARACTER_AWARD(MP_AWARD_COINPURSE) IF iCurrent < value SET_MP_INT_CHARACTER_AWARD(MP_AWARD_COINPURSE,value) IF value >= g_sMptunables.iARCADE_COIN_PURSE_GOLD_SCORE SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_GOLD)) ELIF value >= g_sMptunables.iARCADE_COIN_PURSE_SILVER_SCORE SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_SILVER)) ELIF value >= g_sMptunables.iARCADE_COIN_PURSE_BRONZE_SCORE SET_BIT(sTWSData.iChallengesBitsetForTelemetry, ENUM_TO_INT(TWS_CHALLENGE_BIT_COIN_PURSE_BRONZE)) ENDIF ENDIF ENDIF BREAK ENDSWITCH IF IS_BITMASK_ENUM_AS_ENUM_SET(sTWSData.eChallengeFlags,TWS_CHALLENGE_BIT_FEELIN_GROGGY) AND IS_BITMASK_ENUM_AS_ENUM_SET(sTWSData.eChallengeFlags,TWS_CHALLENGE_BIT_PLATINUM_SWORD_PLATINUM) AND IS_BITMASK_ENUM_AS_ENUM_SET(sTWSData.eChallengeFlags,TWS_CHALLENGE_BIT_COIN_PURSE_PLATINUM) ARCADE_CABINET_FLOW_NOTIFICATIONS_SET_SHOW_TSHIRT_HELP(ARCADE_GAME_TSHIRTS_WIZARDS_COMPLETE_ALL) ENDIF ENDPROC FUNC INT TWS_GET_NEXT_EMPTY_SLOT_FOR_SOUND(ARCADE_GAMES_SOUND eItem) INT i FOR i = 0 TO ciTWS_MAX_SOUNDS-1 IF sTWSData.eSound[i] = ARCADE_GAMES_SOUND_END OR sTWSData.eSound[i] = eItem CDEBUG2LN(DEBUG_MINIGAME, "Creating Sound in slot ", i, " (Free slot)") RETURN i ENDIF ENDFOR FOR i = 0 TO ciTWS_MAX_SOUNDS-1 IF ARCADE_GAMES_SOUND_HAS_FINISHED(sTWSData.eSound[i]) ARCADE_GAMES_SOUND_RELEASE(sTWSData.eSound[i]) CDEBUG2LN(DEBUG_MINIGAME, "Creating Sound in slot ", i, " (Releasing finished sound)") RETURN i ENDIF ENDFOR CERRORLN(DEBUG_MINIGAME, "TWS - Error: ran out of sound slots!") RETURN 0 ENDFUNC PROC TWS_RELEASE_FINISHED_SOUNDS() INT i FOR i = 0 TO ciTWS_MAX_SOUNDS-1 IF sTWSData.eSound[i] != ARCADE_GAMES_SOUND_END AND ARCADE_GAMES_SOUND_HAS_FINISHED(sTWSData.eSound[i]) ARCADE_GAMES_SOUND_RELEASE(sTWSData.eSound[i]) sTWSData.eSound[i] = ARCADE_GAMES_SOUND_END CDEBUG2LN(DEBUG_MINIGAME, "Releasing sound ", i, " (Finished sound)") ENDIF ENDFOR ENDPROC FUNC INT TWS_GET_NEXT_EMPTY_SLOT_FOR_DRAW_CALL() INT i FOR i = 0 TO ciTWS_MAX_DRAW_CALLS-1 IF sTWSData.sDrawCalls[i].eType = TWS_ENTITY_DEFAULT CDEBUG2LN(DEBUG_MINIGAME, "Creating Entity Draw Call in slot ", i, " (Free slot)") RETURN i ENDIF ENDFOR FOR i = 0 TO ciTWS_MAX_DRAW_CALLS-1 IF sTWSData.sDrawCalls[i].eType = TWS_ENTITY_FX CDEBUG2LN(DEBUG_MINIGAME, "Creating Entity Draw Call in slot ", i, " (Had to use an FX slot)") RETURN i ENDIF ENDFOR CERRORLN(DEBUG_MINIGAME, "TWS - Error: ran out of draw call slots!") RETURN 0 ENDFUNC FUNC INT TWS_GET_NUMBER_OF_EMPTY_SLOTS_FOR_ENEMY() INT i, iSum FOR i = 0 TO ciTWS_MAX_ENEMIES-1 IF NOT sEnemyData[i].bIsActive iSum ++ ENDIF ENDFOR CDEBUG1LN(DEBUG_MINIGAME, "TWS - There are ",iSum, " free slots!") RETURN iSum ENDFUNC FUNC INT TWS_GET_NEXT_EMPTY_SLOT_FOR_ENEMY() TWS_GET_NUMBER_OF_EMPTY_SLOTS_FOR_ENEMY() INT i FOR i = 0 TO ciTWS_MAX_ENEMIES-1 IF NOT sEnemyData[i].bIsActive CDEBUG2LN(DEBUG_MINIGAME, "Creating Enemy Call in slot ", i, " (Free slot)") RETURN i ENDIF ENDFOR CERRORLN(DEBUG_MINIGAME, "TWS - Error: ran out of enemy slots!") RETURN -1 ENDFUNC FUNC INT TWS_GET_NEXT_EMPTY_SLOT_FOR_ITEM() INT i FOR i = 0 TO ciTWS_MAX_ITEMS-1 IF NOT sItemData[i].bIsActive CDEBUG2LN(DEBUG_MINIGAME, "Creating Item in slot ", i, " (Free slot)") RETURN i ENDIF ENDFOR CERRORLN(DEBUG_MINIGAME, "TWS - Error: ran out of item slots!") RETURN -1 ENDFUNC FUNC FLOAT TWS_GET_OFFSET_TO_PLAYER(FLOAT fMultiplier = 1.0, FLOAT fBlockedOffset = 0.0, FLOAT fLockAt = 0.0, FLOAT fTileWidth = cfBASE_SCREEN_WIDTH, FLOAT fOffset = 0.0) IF (sPlayerData.ePlayerState = TWS_INTRO AND sTWSData.eLevelStage < TWS_LEVEL_BOSS_FIGHT) OR sPlayerData.vSpritePos.x <= fTileWidth/2 RETURN fLockAt ELSE IF sTWSData.bLockedScreen RETURN -sTWSData.fLockedScreenPos*fMultiplier + fTileWidth/2 + fOffset ELIF fBlockedOffset != 0.0 RETURN -fBlockedOffset*fMultiplier + fTileWidth/2 ELIF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT AND sPlayerData.iLifes > 0 RETURN cfBASE_SCREEN_WIDTH/2 -sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos*fMultiplier ELSE RETURN -sPlayerData.vSpritePos.x*fMultiplier + fTileWidth/2 + fOffset ENDIF ENDIF ENDFUNC FUNC FLOAT TWS_GET_SOUND_POSITION_FOR_ENEMY(INT iIndex) FLOAT fEnemyPosX // Calculate X IF sPlayerData.vSpritePos.x >= sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos OR sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT fEnemyPosX = sEnemyData[iIndex].vSpritePos.x + TWS_GET_OFFSET_TO_PLAYER(1.0, sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + 50) ELSE fEnemyPosX = sEnemyData[iIndex].vSpritePos.x + TWS_GET_OFFSET_TO_PLAYER() ENDIF IF fEnemyPosX < 0 RETURN 0.0 ELIF fEnemyPosX > cfBASE_SCREEN_WIDTH RETURN 1.0 ELSE RETURN fEnemyPosX / cfBASE_SCREEN_WIDTH ENDIF ENDFUNC FUNC FLOAT TWS_GET_SOUND_POSITION_FOR_FX(INT iIndex) FLOAT fFXPosX // Calculate X IF sPlayerData.vSpritePos.x >= sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos OR sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT fFXPosX = sFXData[iIndex].vSpritePos.x + TWS_GET_OFFSET_TO_PLAYER(1.0, sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + 50) ELSE fFXPosX = sFXData[iIndex].vSpritePos.x + TWS_GET_OFFSET_TO_PLAYER() ENDIF IF fFXPosX < 0 RETURN 0.0 ELIF fFXPosX > cfBASE_SCREEN_WIDTH RETURN 1.0 ELSE RETURN fFXPosX / cfBASE_SCREEN_WIDTH ENDIF ENDFUNC PROC TWS_ARCADE_GAMES_SOUND_PLAY(ARCADE_GAMES_SOUND eItem) sTWSData.eSound[TWS_GET_NEXT_EMPTY_SLOT_FOR_SOUND(eItem)] = eItem ARCADE_GAMES_SOUND_PLAY(eItem) ENDPROC PROC TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(ARCADE_GAMES_SOUND eItem, FLOAT fPosition) TWS_ARCADE_GAMES_SOUND_PLAY(eItem) ARCADE_GAMES_SOUND_SET_VARIABLE(eItem, "Screen_Position", fPosition) ENDPROC PROC TWS_ARCADE_GAMES_SOUND_PLAY_FOR_PLAYER_LEVEL(ARCADE_GAMES_SOUND eItem, INT iLevel) IF iLevel > 1 SWITCH eItem CASE ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_WALK_LOOP ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_WALK_LOOP ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_BOSS_FINAL IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_BOSS_FINAL ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_BOSS_FINAL ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_DASH_SWIPE IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_DASH_SWIPE ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_DASH_SWIPE ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_DASH_HIT IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_DASH_HIT ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_DASH_HIT ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_LONG_SWIPE IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_LONG_SWIPE ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_LONG_SWIPE ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_LONG_HIT IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_LONG_HIT ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_LONG_HIT ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_SHORT_SWIPE IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_SHORT_SWIPE ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_SHORT_SWIPE ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_SHORT_HIT IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_SHORT_HIT ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_SHORT_HIT ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_KICK_SWIPE IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_KICK_SWIPE ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_KICK_SWIPE ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_KICK_HIT IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_KICK_HIT ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_KICK_HIT ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_JUMP_KICK_SWIPE IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_JUMP_KICK_SWIPE ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_JUMP_KICK_SWIPE ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_ATTACK_JUMP_KICK_HIT IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_ATTACK_JUMP_KICK_HIT ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_ATTACK_JUMP_KICK_HIT ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_JUMP_LAND IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_JUMP_LAND ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_JUMP_LAND ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_BODYFALL IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_BODYFALL ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_BODYFALL ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_LEVEL_UP_SCREEN IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_LEVEL_UP_SCREEN ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_LEVEL_UP_SCREEN ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_LEVEL_UP_IG IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_LEVEL_UP_IG ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_LEVEL_UP_IG ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_LEVEL_UP_SWORD IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_LEVEL_UP_SWORD ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_LEVEL_UP_SWORD ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_MAGIC_DRAW_SWORD IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_MAGIC_DRAW_SWORD ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_MAGIC_DRAW_SWORD ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_MAGIC_NUKE_CAST IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_MAGIC_NUKE_CAST ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_MAGIC_NUKE_CAST ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_MAGIC_NUKE_SMALL_BLAST IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_MAGIC_NUKE_SMALL_BLAST ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_MAGIC_NUKE_SMALL_BLAST ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_WEAPON_DEFLECT_ARROW IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_WEAPON_DEFLECT_ARROW ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_WEAPON_DEFLECT_ARROW ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_WEAPON_DEFLECT_FIREBALL IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_WEAPON_DEFLECT_FIREBALL ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_WEAPON_DEFLECT_FIREBALL ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_HIT_BY_ENEMY IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_HIT_BY_ENEMY ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_HIT_BY_ENEMY ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MELEE IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_VOCAL_MELEE ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_VOCAL_MELEE ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_HURT IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_VOCAL_HURT ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_VOCAL_HURT ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_JUMP IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_VOCAL_JUMP ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_VOCAL_JUMP ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_KNOCKED_DOWN IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_VOCAL_KNOCKED_DOWN ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_VOCAL_KNOCKED_DOWN ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_DEATH IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_VOCAL_DEATH ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_VOCAL_DEATH ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_FALL_TO_DEATH IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_VOCAL_FALL_TO_DEATH ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_VOCAL_FALL_TO_DEATH ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_MAGIC_SCREEN_NUKE IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_VOCAL_MAGIC_SCREEN_NUKE ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_VOCAL_MAGIC_SCREEN_NUKE ENDIF BREAK CASE ARCADE_GAMES_SOUND_TWR_PLAYER_VOCAL_LEVEL_UP IF iLevel = 2 eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_2_VOCAL_LEVEL_UP ELSE eItem = ARCADE_GAMES_SOUND_TWR_PLAYER_3_VOCAL_LEVEL_UP ENDIF BREAK ENDSWITCH ENDIF TWS_ARCADE_GAMES_SOUND_PLAY(eItem) ENDPROC FUNC ARCADE_GAMES_SOUND TWS_GET_AGGRO_SOUND_FOR_ENEMY(TWS_ENEMY_TYPE eType) SWITCH eType CASE TWS_ENEMY_BAT RETURN ARCADE_GAMES_SOUND_TWR_BAT_AGGRO CASE TWS_ENEMY_GRUNT RETURN ARCADE_GAMES_SOUND_TWR_UNICORN_AGGRO CASE TWS_ENEMY_GRUNT_SWORD RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_SWORD_AGGRO CASE TWS_ENEMY_GRUNT_SPEAR RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_SPEAR_AGGRO CASE TWS_ENEMY_GRUNT_FIRESPEAR RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_FIRESPEAR_AGGRO CASE TWS_ENEMY_GRUNT_FIRESWORD RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_FIRESWORD_AGGRO CASE TWS_ENEMY_GRUNT_CASTER RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_CASTER_AGGRO CASE TWS_ENEMY_GRUNT_CROSSBOW RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_CROSSBOW_AGGRO CASE TWS_ENEMY_BRUTE RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_AGGRO CASE TWS_ENEMY_BRUTE_AXE RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_AXE_AGGRO CASE TWS_ENEMY_SPIDER RETURN ARCADE_GAMES_SOUND_TWR_SPIDER_AGGRO CASE TWS_ENEMY_SNAKE RETURN ARCADE_GAMES_SOUND_TWR_SNAKE_AGGRO CASE TWS_ENEMY_SLIME RETURN ARCADE_GAMES_SOUND_TWR_SLIME_AGGRO CASE TWS_ENEMY_LEPRECHAUN RETURN ARCADE_GAMES_SOUND_TWR_LEPRECHAUN_AGGRO CASE TWS_ENEMY_BOSS_SPIDER RETURN ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_AGGRO CASE TWS_ENEMY_BOSS_AMAZON RETURN ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_AGGRO CASE TWS_ENEMY_BOSS_KNIGHT CASE TWS_ENEMY_KNIGHT RETURN ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_AGGRO CASE TWS_ENEMY_FAIRY RETURN ARCADE_GAMES_SOUND_TWR_FAIRY_AGGRO ENDSWITCH RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_AGGRO ENDFUNC FUNC ARCADE_GAMES_SOUND TWS_GET_PAIN_SOUND_FOR_ENEMY(TWS_ENEMY_TYPE eType) SWITCH eType CASE TWS_ENEMY_BAT RETURN ARCADE_GAMES_SOUND_TWR_BAT_PAIN CASE TWS_ENEMY_GRUNT RETURN ARCADE_GAMES_SOUND_TWR_UNICORN_PAIN CASE TWS_ENEMY_GRUNT_SWORD RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_SWORD_PAIN CASE TWS_ENEMY_GRUNT_SPEAR RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_SPEAR_PAIN CASE TWS_ENEMY_GRUNT_FIRESPEAR RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_FIRESPEAR_PAIN CASE TWS_ENEMY_GRUNT_FIRESWORD RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_FIRESWORD_PAIN CASE TWS_ENEMY_GRUNT_CASTER RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_CASTER_PAIN CASE TWS_ENEMY_GRUNT_CROSSBOW RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_CROSSBOW_PAIN CASE TWS_ENEMY_BRUTE RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_PAIN CASE TWS_ENEMY_BRUTE_AXE RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_AXE_PAIN CASE TWS_ENEMY_SPIDER RETURN ARCADE_GAMES_SOUND_TWR_SPIDER_PAIN CASE TWS_ENEMY_SLIME RETURN ARCADE_GAMES_SOUND_TWR_SLIME_PAIN CASE TWS_ENEMY_LEPRECHAUN RETURN ARCADE_GAMES_SOUND_TWR_LEPRECHAUN_PAIN CASE TWS_ENEMY_BOSS_SPIDER RETURN ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_PAIN CASE TWS_ENEMY_BOSS_AMAZON RETURN ARCADE_GAMES_SOUND_TWR_BOSS_AMAZON_PAIN CASE TWS_ENEMY_BOSS_KNIGHT CASE TWS_ENEMY_KNIGHT RETURN ARCADE_GAMES_SOUND_TWR_BOSS_DARKKNIGHT_PAIN CASE TWS_ENEMY_FAIRY RETURN ARCADE_GAMES_SOUND_TWR_FAIRY_PAIN ENDSWITCH RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_PAIN ENDFUNC FUNC ARCADE_GAMES_SOUND TWS_GET_ATTACK_SOUND_FOR_ENEMY(TWS_ENEMY_TYPE eType) SWITCH eType CASE TWS_ENEMY_BAT RETURN ARCADE_GAMES_SOUND_TWR_BAT_ATTACK CASE TWS_ENEMY_GRUNT RETURN ARCADE_GAMES_SOUND_TWR_UNICORN_ATTACK CASE TWS_ENEMY_GRUNT_SWORD RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_SWORD_ATTACK CASE TWS_ENEMY_GRUNT_SPEAR RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_SPEAR_ATTACK CASE TWS_ENEMY_GRUNT_FIRESPEAR RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_FIRESPEAR_ATTACK CASE TWS_ENEMY_GRUNT_FIRESWORD RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_FIRESWORD_ATTACK CASE TWS_ENEMY_GRUNT_CASTER RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_CASTER_ATTACK CASE TWS_ENEMY_GRUNT_CROSSBOW RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_CROSSBOW_ATTACK CASE TWS_ENEMY_BRUTE RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_ATTACK CASE TWS_ENEMY_BRUTE_AXE RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_AXE_ATTACK CASE TWS_ENEMY_SPIDER RETURN ARCADE_GAMES_SOUND_TWR_SPIDER_ATTACK CASE TWS_ENEMY_SLIME RETURN ARCADE_GAMES_SOUND_TWR_SLIME_ATTACK CASE TWS_ENEMY_LEPRECHAUN RETURN ARCADE_GAMES_SOUND_TWR_LEPRECHAUN_COIN_ATTACK CASE TWS_ENEMY_FAIRY RETURN ARCADE_GAMES_SOUND_TWR_FAIRY_ATTACK ENDSWITCH RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_ATTACK ENDFUNC FUNC ARCADE_GAMES_SOUND TWS_GET_DEATH_SOUND_FOR_ENEMY(TWS_ENEMY_TYPE eType) SWITCH eType CASE TWS_ENEMY_BAT RETURN ARCADE_GAMES_SOUND_TWR_BAT_DEATH CASE TWS_ENEMY_GRUNT RETURN ARCADE_GAMES_SOUND_TWR_UNICORN_DEATH CASE TWS_ENEMY_GRUNT_SWORD RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_SWORD_DEATH CASE TWS_ENEMY_GRUNT_SPEAR RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_SPEAR_DEATH CASE TWS_ENEMY_GRUNT_FIRESPEAR RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_FIRESPEAR_DEATH CASE TWS_ENEMY_GRUNT_FIRESWORD RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_FIRESWORD_DEATH CASE TWS_ENEMY_GRUNT_CASTER RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_CASTER_DEATH CASE TWS_ENEMY_GRUNT_CROSSBOW RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_CROSSBOW_DEATH CASE TWS_ENEMY_BRUTE RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_DEATH CASE TWS_ENEMY_BRUTE_AXE RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_AXE_DEATH CASE TWS_ENEMY_SPIDER RETURN ARCADE_GAMES_SOUND_TWR_SPIDER_DEATH CASE TWS_ENEMY_SNAKE RETURN ARCADE_GAMES_SOUND_TWR_SNAKE_DEATH CASE TWS_ENEMY_SLIME RETURN ARCADE_GAMES_SOUND_TWR_SLIME_DEATH CASE TWS_ENEMY_LEPRECHAUN RETURN ARCADE_GAMES_SOUND_TWR_LEPRECHAUN_DEATH CASE TWS_ENEMY_FAIRY RETURN ARCADE_GAMES_SOUND_TWR_FAIRY_DEATH ENDSWITCH RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_DEATH ENDFUNC FUNC ARCADE_GAMES_SOUND TWS_GET_BODYFALL_SOUND_FOR_ENEMY(TWS_ENEMY_TYPE eType) SWITCH eType CASE TWS_ENEMY_BAT RETURN ARCADE_GAMES_SOUND_TWR_BAT_BODYFALL // CASE TWS_ENEMY_GRUNT // RETURN ARCADE_GAMES_SOUND_TWR_UNICORN_BODYFALL CASE TWS_ENEMY_GRUNT_SWORD RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_SWORD_BODYFALL CASE TWS_ENEMY_GRUNT_SPEAR RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_SPEAR_BODYFALL CASE TWS_ENEMY_GRUNT_FIRESPEAR RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_FIRESPEAR_BODYFALL CASE TWS_ENEMY_GRUNT_FIRESWORD RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_FIRESWORD_BODYFALL CASE TWS_ENEMY_GRUNT_CASTER RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_CASTER_BODYFALL CASE TWS_ENEMY_GRUNT_CROSSBOW RETURN ARCADE_GAMES_SOUND_TWR_GRUNT_CROSSBOW_BODYFALL CASE TWS_ENEMY_BRUTE RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_BODYFALL CASE TWS_ENEMY_BRUTE_AXE RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_AXE_BODYFALL CASE TWS_ENEMY_SPIDER RETURN ARCADE_GAMES_SOUND_TWR_SPIDER_BODYFALL CASE TWS_ENEMY_LEPRECHAUN RETURN ARCADE_GAMES_SOUND_TWR_LEPRECHAUN_BODYFALL CASE TWS_ENEMY_FAIRY RETURN ARCADE_GAMES_SOUND_TWR_FAIRY_BODYFALL ENDSWITCH RETURN ARCADE_GAMES_SOUND_TWR_BRUTE_BODYFALL ENDFUNC FUNC INT GET_NEXT_FX_INDEX() INT i, iNextEmptySlot = -1 FOR i = 0 TO ciTWS_MAX_FX -1 IF sFXData[i].bActive = FALSE iNextEmptySlot = i ENDIF ENDFOR IF iNextEmptySlot = -1 iNextEmptySlot = 1 ENDIF RETURN iNextEmptySlot ENDFUNC PROC TWS_CREATE_FX(VECTOR_2D vPos, TWS_FX_TYPE eType, FLOAT fZOffset = 0.0) INT iNextEmptySlot = GET_NEXT_FX_INDEX() INT iNextEmptyDrawCallSlot = TWS_GET_NEXT_EMPTY_SLOT_FOR_DRAW_CALL() IF iNextEmptyDrawCallSlot = -1 EXIT ENDIF sFXData[iNextEmptySlot].vSpritePos = vPos sFXData[iNextEmptySlot].eType = eType sFXData[iNextEmptySlot].iTimer = GET_GAME_TIMER() sFXData[iNextEmptySlot].bActive = TRUE sFXData[iNextEmptySlot].iSpriteBlastAnimFrame = 0 sFXData[iNextEmptySlot].fZIndex = 0.0 SWITCH sFXData[iNextEmptySlot].eType CASE TWS_FX_SWORD_LIGHTNING sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_SWORD_LIGHTNING_WIDTH, cfTWS_FX_SWORD_LIGHTNING_HEIGHT) BREAK CASE TWS_FX_SUPERATTACK_EXPLOSION sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_SUPERATTACK_WIDTH, cfTWS_FX_SUPERATTACK_HEIGHT) BREAK CASE TWS_FX_MAGIC_COLUMN sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_WIZARD_PILLAR_WIDTH, cfTWS_FX_WIZARD_PILLAR_HEIGHT) BREAK CASE TWS_FX_MAGIC_FIRE sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_WIZARD_FIRE_WIDTH, cfTWS_FX_WIZARD_FIRE_HEIGHT) BREAK CASE TWS_FX_SWORD sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_KNIGHT_SWORD_WIDTH, cfTWS_FX_KNIGHT_SWORD_HEIGHT) BREAK CASE TWS_FX_SWORD_DROP sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_SWORD_WIDTH, cfTWS_BOSS_KNIGHT_SWORD_HEIGHT) BREAK CASE TWS_FX_HELP sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_HELP_WIDTH, cfTWS_FX_HELP_HEIGHT) sFXData[iNextEmptySlot].fZIndex = -50.0 BREAK CASE TWS_FX_COD_DROP sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_COD_WIDTH, cfTWS_BOSS_KNIGHT_COD_HEIGHT) BREAK CASE TWS_FX_SMALL_HIT sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_SMALL_HIT_WIDTH, cfTWS_FX_SMALL_HIT_HEIGHT) BREAK CASE TWS_FX_LARGE_HIT sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_LARGE_HIT_WIDTH, cfTWS_FX_LARGE_HIT_HEIGHT) BREAK CASE TWS_FX_VENOM_HIT sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_VENOM_HIT_WIDTH, cfTWS_FX_VENOM_HIT_HEIGHT) BREAK CASE TWS_FX_BLOOD_HIT sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_VENOM_HIT_WIDTH, cfTWS_FX_VENOM_HIT_HEIGHT) BREAK CASE TWS_FX_CLOTHES sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_RIPPED_CLOTHES_WIDTH, cfTWS_FX_RIPPED_CLOTHES_HEIGHT) BREAK CASE TWS_FX_BOSS_SPIDER_SPIT sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_BOSS_SPIDER_SPIT_WIDTH, cfTWS_FX_BOSS_SPIDER_SPIT_HEIGHT) BREAK CASE TWS_FX_ARROW_LEFT CASE TWS_FX_ARROW_RIGHT sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(-cfTWS_GRUNT_CROSSBOW_ARROW_WIDTH, cfTWS_GRUNT_CROSSBOW_ARROW_HEIGHT) BREAK CASE TWS_FX_FIREBALL_LEFT CASE TWS_FX_FIREBALL_RIGHT sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(-cfTWS_GRUNT_CASTER_FIREBALL_WIDTH, cfTWS_GRUNT_CASTER_FIREBALL_HEIGHT) BREAK CASE TWS_FX_COINS_LEFT CASE TWS_FX_COINS_RIGHT sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(-cfTWS_LEPRECHAUN_COINS_WIDTH, cfTWS_LEPRECHAUN_COINS_HEIGHT) BREAK CASE TWS_FX_TRAP_SPEAR sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_TRAP_SPEAR_WIDTH, cfTWS_TRAP_SPEAR_HEIGHT) BREAK CASE TWS_FX_VENOM_PUDDLE sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_BOSS_SPIDER_VENOM_WIDTH, cfTWS_FX_BOSS_SPIDER_VENOM_HEIGHT) sFXData[iNextEmptySlot].fZIndex = -50.0 BREAK CASE TWS_FX_GROG_BUBBLE sFXData[iNextEmptySlot].vSpriteSize = INIT_VECTOR_2D(cfTWS_FX_GROG_WIDTH, cfTWS_FX_GROG_HEIGHT) BREAK ENDSWITCH sTWSData.sDrawCalls[iNextEmptyDrawCallSlot].eType = TWS_ENTITY_FX sTWSData.sDrawCalls[iNextEmptyDrawCallSlot].iIndex = iNextEmptySlot IF fZOffset != 0.0 sFXData[iNextEmptySlot].fZIndex = fZOffset ELSE sTWSData.sDrawCalls[iNextEmptyDrawCallSlot].fZIndex = sFXData[iNextEmptySlot].vSpritePos.Y + sFXData[iNextEmptySlot].vSpriteSize.y ENDIF ENDPROC PROC TWS_INIT_PLAYERS() INT iCurrentDrawCallToAdd = TWS_GET_NEXT_EMPTY_SLOT_FOR_DRAW_CALL() sPlayerData.vSpritePos = INIT_VECTOR_2D(-100.0 , cfBASE_SCREEN_HEIGHT/5*3) sPlayerData.vSpriteSize = INIT_VECTOR_2D(cfTWS_PLAYER_WALK_WIDTH, cfTWS_PLAYER_WALK_HEIGHT) sTWSData.sDrawCalls[iCurrentDrawCallToAdd].eType = TWS_ENTITY_PLAYER sTWSData.sDrawCalls[iCurrentDrawCallToAdd].iIndex = 0 sTWSData.sDrawCalls[iCurrentDrawCallToAdd].fZIndex = sPlayerData.vSpritePos.Y + sPlayerData.vSpriteSize.y ENDPROC // HUD PROC TWS_ADD_HUD_ITEM_TO_LIST(VECTOR_2D vPos, TWS_HUD_TYPE eType, BOOL bActive = TRUE) sHUDData[iCurrentHUDItemToAdd].vSpritePos = vPos sHUDData[iCurrentHUDItemToAdd].eType = eType sHUDData[iCurrentHUDItemToAdd].bActive = bActive sHUDData[iCurrentHUDItemToAdd].bRendering = FALSE sHUDData[iCurrentHUDItemToAdd].bPlayedSoundAttacked = FALSE sHUDData[iCurrentHUDItemToAdd].iSpriteBlastAnimFrame = 0 iCurrentHUDItemToAdd++ ENDPROC PROC TWS_INIT_HUD_ITEMS() TWS_ADD_HUD_ITEM_TO_LIST(INIT_VECTOR_2D(-100, cfBASE_SCREEN_HEIGHT/2), TWS_HUD_START) TWS_ADD_HUD_ITEM_TO_LIST(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/12*9, cfBASE_SCREEN_HEIGHT/2), TWS_HUD_GO_ARROW) TWS_ADD_HUD_ITEM_TO_LIST(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/2, cfBASE_SCREEN_HEIGHT/10*8), TWS_HUD_DIALOGUE_FRAME, FALSE) TWS_ADD_HUD_ITEM_TO_LIST(INIT_VECTOR_2D(-100, cfBASE_SCREEN_HEIGHT/2), TWS_HUD_GAMEOVER, FALSE) TWS_ADD_HUD_ITEM_TO_LIST(INIT_VECTOR_2D(-100, cfBASE_SCREEN_HEIGHT/3), TWS_HUD_END, FALSE) ENDPROC // Items PROC TWS_ADD_ITEM_TO_LIST(VECTOR_2D vPos, TWS_ITEM_TYPE eType, BOOL bFalling = FALSE) IF eType = TWS_ITEM_NONE EXIT ENDIF iCurrentItemToAdd = TWS_GET_NEXT_EMPTY_SLOT_FOR_ITEM() IF iCurrentItemToAdd = -1 CERRORLN(DEBUG_MINIGAME, "Error: could not create item from enemy. Array is full!") EXIT ENDIF INT iCurrentDrawCallToAdd = TWS_GET_NEXT_EMPTY_SLOT_FOR_DRAW_CALL() sItemData[iCurrentItemToAdd].bIsHit = FALSE sItemData[iCurrentItemToAdd].bIsActive = TRUE sItemData[iCurrentItemToAdd].iSpriteAnimFrame = 0 IF bFalling sItemData[iCurrentItemToAdd].vSpritePos = INIT_VECTOR_2D(vPos.x, vPos.Y - 600) sItemData[iCurrentItemToAdd].vSpriteFallPos = vPos sItemData[iCurrentItemToAdd].bFalling = TRUE sItemData[iCurrentItemToAdd].eItemType = eType IF NOT sTWSData.bLockedScreen INT i FOR i = 0 TO ciTWS_MAX_TRAPS -1 IF sTrapsData[i].bIsActive AND sTrapsData[i].eType = TWS_TRAP_FALL IF vPos.y > sTrapsData[i].vSpritePos.Y AND vPos.x > (sTrapsData[i].vSpritePos.x - sTrapsData[i].vSpriteSize.x) AND vPos.x < (sTrapsData[i].vSpritePos.x + sTrapsData[i].vSpriteSize.x) sItemData[iCurrentItemToAdd].vSpriteFallPos.y += cfGAME_SCREEN_HEIGHT ENDIF ENDIF ENDFOR ENDIF ELSE sItemData[iCurrentItemToAdd].vSpritePos = vPos sItemData[iCurrentItemToAdd].eItemType = eType ENDIF SWITCH sItemData[iCurrentItemToAdd].eItemType CASE TWS_ITEM_HP_SMA sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_HP_SMA_WIDTH, cfTWS_ITEM_HP_SMA_HEIGHT) BREAK CASE TWS_ITEM_HP_MED sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_HP_MED_WIDTH, cfTWS_ITEM_HP_MED_HEIGHT) BREAK CASE TWS_ITEM_HP_LAR sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_HP_LAR_WIDTH, cfTWS_ITEM_HP_LAR_HEIGHT) BREAK CASE TWS_ITEM_MP_SMA sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_HP_SMA_WIDTH, cfTWS_ITEM_HP_SMA_HEIGHT) BREAK CASE TWS_ITEM_MP_MED sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_HP_MED_WIDTH, cfTWS_ITEM_HP_MED_HEIGHT) BREAK CASE TWS_ITEM_MP_LAR sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_HP_LAR_WIDTH, cfTWS_ITEM_HP_LAR_HEIGHT) BREAK CASE TWS_ITEM_GOLD_1 sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_GOLD_1_WIDTH, cfTWS_ITEM_GOLD_1_HEIGHT) BREAK CASE TWS_ITEM_GOLD_2 sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_GOLD_2_WIDTH, cfTWS_ITEM_GOLD_2_HEIGHT) BREAK CASE TWS_ITEM_GOLD_3 sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_GOLD_3_WIDTH, cfTWS_ITEM_GOLD_3_HEIGHT) BREAK CASE TWS_ITEM_GOLD_4 sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_GOLD_4_WIDTH, cfTWS_ITEM_GOLD_4_HEIGHT) BREAK CASE TWS_ITEM_1UP sItemData[iCurrentItemToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_ITEM_1UP_WIDTH, cfTWS_ITEM_1UP_HEIGHT) BREAK ENDSWITCH sTWSData.sDrawCalls[iCurrentDrawCallToAdd].eType = TWS_ENTITY_ITEM sTWSData.sDrawCalls[iCurrentDrawCallToAdd].iIndex = iCurrentItemToAdd sTWSData.sDrawCalls[iCurrentDrawCallToAdd].fZIndex = vPos.Y + sItemData[iCurrentItemToAdd].vSpriteSize.Y ENDPROC PROC TWS_INIT_ITEMS() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(2600, 650), TWS_ITEM_MP_MED) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(5200, 730), TWS_ITEM_HP_MED) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(7100, 730), TWS_ITEM_MP_MED) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(11000, 700), TWS_ITEM_HP_SMA) BREAK CASE TWS_SWAMP TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(2600, 650), TWS_ITEM_MP_MED) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(5200, 730), TWS_ITEM_1UP) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(7100, 730), TWS_ITEM_HP_MED) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(11000, 700), TWS_ITEM_MP_SMA) BREAK CASE TWS_CAVES TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(2600, 650), TWS_ITEM_MP_MED) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(5200, 730), TWS_ITEM_1UP) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(7100, 730), TWS_ITEM_HP_MED) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(11000, 700), TWS_ITEM_MP_SMA) BREAK CASE TWS_CASTLE TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(2600, 650), TWS_ITEM_MP_MED) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(5200, 730), TWS_ITEM_1UP) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(7100, 730), TWS_ITEM_HP_MED) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(11000, 700), TWS_ITEM_MP_SMA) BREAK ENDSWITCH ENDPROC PROC TWS_ADD_TRAP_TO_LIST(VECTOR_2D vPos, VECTOR_2D vSize, TWS_TRAP_TYPE eType) INT iCurrentDrawCallToAdd = TWS_GET_NEXT_EMPTY_SLOT_FOR_DRAW_CALL() sTrapsData[iCurrentTrapToAdd].bIsActive = TRUE sTrapsData[iCurrentTrapToAdd].bIsWorking = TRUE sTrapsData[iCurrentTrapToAdd].vSpritePos = vPos sTrapsData[iCurrentTrapToAdd].vSpriteSize = vSize IF eType = TWS_TRAP_STALAGTITE sTrapsData[iCurrentTrapToAdd].vSpritePos2 = INIT_VECTOR_2D(vPos.X, vPos.Y - 700.0) ENDIF sTrapsData[iCurrentTrapToAdd].eType = eType sTWSData.sDrawCalls[iCurrentDrawCallToAdd].eType = TWS_ENTITY_TRAP sTWSData.sDrawCalls[iCurrentDrawCallToAdd].iIndex = iCurrentTrapToAdd sTWSData.sDrawCalls[iCurrentDrawCallToAdd].fZIndex = vPos.Y + sTrapsData[iCurrentTrapToAdd].vSpriteSize.y IF eType = TWS_TRAP_HOLE sTWSData.sDrawCalls[iCurrentDrawCallToAdd].fZIndex = 0 ENDIF iCurrentTrapToAdd ++ ENDPROC PROC TWS_INIT_TRAPS() SWITCH sTWSData.eCurrentLevel CASE TWS_CAVES TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(1950, 925), INIT_VECTOR_2D(cfTWS_TRAP_HOLE_WIDTH, cfTWS_TRAP_HOLE_HEIGHT), TWS_TRAP_HOLE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(2500, 820), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(2650, 860), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(3000, 700), INIT_VECTOR_2D(cfTWS_TRAP_HOLE_WIDTH, cfTWS_TRAP_HOLE_HEIGHT), TWS_TRAP_HOLE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(3650, 950), INIT_VECTOR_2D(cfTWS_TRAP_HOLE_WIDTH, cfTWS_TRAP_HOLE_HEIGHT), TWS_TRAP_HOLE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(4100, 750), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(6150, 648), INIT_VECTOR_2D(550, 320), TWS_TRAP_FALL) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(7300, 830), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(7850, 700), INIT_VECTOR_2D(cfTWS_TRAP_HOLE_WIDTH, cfTWS_TRAP_HOLE_HEIGHT), TWS_TRAP_HOLE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(8300, 1150), INIT_VECTOR_2D(cfTWS_TRAP_HOLE_WIDTH, cfTWS_TRAP_HOLE_HEIGHT), TWS_TRAP_HOLE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(8500, 900), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(8600, 800), INIT_VECTOR_2D(cfTWS_TRAP_HOLE_WIDTH, cfTWS_TRAP_HOLE_HEIGHT), TWS_TRAP_HOLE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(8800, 850), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(9300, 850), INIT_VECTOR_2D(cfTWS_TRAP_HOLE_WIDTH, cfTWS_TRAP_HOLE_HEIGHT), TWS_TRAP_HOLE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(9700, 750), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(10100, 850), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(11500, 648), INIT_VECTOR_2D(550, 320), TWS_TRAP_FALL) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(12500, 700), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(12900, 850), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(13700, 850), INIT_VECTOR_2D(cfTWS_TRAP_STALAGTITE_WIDTH, cfTWS_TRAP_STALAGTITE_HEIGHT), TWS_TRAP_STALAGTITE) TWS_ADD_TRAP_TO_LIST(INIT_VECTOR_2D(15700, 750), INIT_VECTOR_2D(cfTWS_TRAP_HOLE_WIDTH, cfTWS_TRAP_HOLE_HEIGHT), TWS_TRAP_HOLE) BREAK CASE TWS_CASTLE TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 530), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 605), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 680), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 755), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 830), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.9, 530), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.82, 605), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.75, 680), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.68, 755), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 830), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.9, 540), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.85, 590), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.8, 640), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.75, 690), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.70, 740), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.65, 790), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 840), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.35, 530), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.35, 605), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.35, 680), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.35, 755), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.35, 830), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 530), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.68, 605), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.75, 680), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.82, 755), TWS_FX_TRAP_SPEAR) TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.9, 830), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 540), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.12, 590), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.14, 640), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.16, 690), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.18, 740), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, 790), TWS_FX_TRAP_SPEAR) // TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.22, 840), TWS_FX_TRAP_SPEAR) BREAK ENDSWITCH ENDPROC // Enemies PROC TWS_ADD_NPC_TO_LIST(VECTOR_2D vPos, TWS_NPC_TYPE eType) INT iCurrentDrawCallToAdd = TWS_GET_NEXT_EMPTY_SLOT_FOR_DRAW_CALL() sNPCData[iCurrentNPCToAdd].bIsActive = TRUE sNPCData[iCurrentNPCToAdd].vSpritePos = vPos sNPCData[iCurrentNPCToAdd].eNPCType = eType sNPCData[iCurrentNPCToAdd].fHealth = 1.0 SWITCH sNPCData[iCurrentNPCToAdd].eNPCType CASE TWS_NPC_TWINS CASE TWS_NPC_WOMAN sNPCData[iCurrentNPCToAdd].fHealth = 0.4 sNPCData[iCurrentNPCToAdd].iNPCSize = 1 sNPCData[iCurrentNPCToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_NPC_TWINS_WIDTH, cfTWS_NPC_TWINS_HEIGHT) TWS_CREATE_FX(INIT_VECTOR_2D(vPos.x + 75, vPos.y - 150), TWS_FX_HELP, 0) BREAK CASE TWS_NPC_VILLAGER sNPCData[iCurrentNPCToAdd].fHealth = 0.4 sNPCData[iCurrentNPCToAdd].iNPCSize = 1 sNPCData[iCurrentNPCToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_NPC_VILLAGER_WIDTH, cfTWS_NPC_VILLAGER_HEIGHT) BREAK ENDSWITCH sTWSData.sDrawCalls[iCurrentDrawCallToAdd].eType = TWS_ENTITY_NPC sTWSData.sDrawCalls[iCurrentDrawCallToAdd].iIndex = iCurrentNPCToAdd sTWSData.sDrawCalls[iCurrentDrawCallToAdd].fZIndex = vPos.Y + sNPCData[iCurrentNPCToAdd].vSpriteSize.y SWITCH sNPCData[iCurrentNPCToAdd].eNPCType CASE TWS_NPC_TWINS CASE TWS_NPC_WOMAN TWS_CREATE_FX(INIT_VECTOR_2D(vPos.x + 60, vPos.y - 125), TWS_FX_HELP, 0) BREAK CASE TWS_NPC_VILLAGER TWS_CREATE_FX(INIT_VECTOR_2D(vPos.x + 125, vPos.y - 175), TWS_FX_HELP, 0) BREAK ENDSWITCH iCurrentNPCToAdd++ ENDPROC PROC TWS_INIT_NPCS() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST_INTRO TWS_ADD_NPC_TO_LIST(INIT_VECTOR_2D(cfBASE_SCREEN_WIDTH/3*2, cfBASE_SCREEN_HEIGHT/2), TWS_NPC_VILLAGER) BREAK CASE TWS_FOREST TWS_ADD_NPC_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos+530, cfBASE_SCREEN_HEIGHT/5*2), TWS_NPC_WOMAN) BREAK CASE TWS_SWAMP TWS_ADD_NPC_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + 500, cfBASE_SCREEN_HEIGHT/5*2), TWS_NPC_TWINS) BREAK CASE TWS_CAVES TWS_CREATE_FX(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + 500, cfBASE_SCREEN_HEIGHT/5*1), TWS_FX_HELP, 0) BREAK ENDSWITCH ENDPROC PROC TWS_INIT_LOCKED_BATTLES() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST sTWSData.sLockedBattles[0].iTile = 4 sTWSData.sLockedBattles[0].iEnemies = 8 sTWSData.sLockedBattles[0].iEnemySize = 0 sTWSData.sLockedBattles[0].bSpawnEnemies = TRUE sTWSData.sLockedBattles[1].iTile = 7 sTWSData.sLockedBattles[1].iEnemies = 6 sTWSData.sLockedBattles[1].iEnemySize = 1 sTWSData.sLockedBattles[1].bSpawnEnemies = TRUE sTWSData.sLockedBattles[2].iTile = 10 sTWSData.sLockedBattles[2].iEnemies = 10 sTWSData.sLockedBattles[2].iEnemySize = 2 sTWSData.sLockedBattles[2].bSpawnEnemies = TRUE BREAK CASE TWS_SWAMP sTWSData.sLockedBattles[0].iTile = 4 sTWSData.sLockedBattles[0].iEnemies = 8 sTWSData.sLockedBattles[0].iEnemySize = 0 sTWSData.sLockedBattles[0].bSpawnEnemies = TRUE sTWSData.sLockedBattles[1].iTile = 7 sTWSData.sLockedBattles[1].iEnemies = 6 sTWSData.sLockedBattles[1].iEnemySize = 1 sTWSData.sLockedBattles[1].bSpawnEnemies = TRUE sTWSData.sLockedBattles[2].iTile = 11 sTWSData.sLockedBattles[2].iEnemies = 10 sTWSData.sLockedBattles[2].iEnemySize = 2 sTWSData.sLockedBattles[2].bSpawnEnemies = TRUE BREAK CASE TWS_CAVES sTWSData.sLockedBattles[0].iTile = 4 sTWSData.sLockedBattles[0].iEnemies = 5 sTWSData.sLockedBattles[0].iEnemySize = 1 sTWSData.sLockedBattles[0].bSpawnEnemies = TRUE sTWSData.sLockedBattles[1].iTile = 9 sTWSData.sLockedBattles[1].iEnemies = 1 sTWSData.sLockedBattles[1].iEnemySize = 0 sTWSData.sLockedBattles[1].bSpawnEnemies = FALSE sTWSData.sLockedBattles[2].iTile = 12 sTWSData.sLockedBattles[2].iEnemies = 5 sTWSData.sLockedBattles[2].iEnemySize = 1 sTWSData.sLockedBattles[2].bSpawnEnemies = TRUE BREAK CASE TWS_CASTLE sTWSData.sLockedBattles[0].iTile = 4 sTWSData.sLockedBattles[0].iEnemies = 8 sTWSData.sLockedBattles[0].iEnemySize = 2 sTWSData.sLockedBattles[0].iSpawnTime = 3000 sTWSData.sLockedBattles[0].bSpawnEnemies = TRUE sTWSData.sLockedBattles[1].iTile = 8 sTWSData.sLockedBattles[1].iEnemies = 20 sTWSData.sLockedBattles[1].iEnemySize = 1 sTWSData.sLockedBattles[1].iSpawnTime = 800 sTWSData.sLockedBattles[1].bSpawnEnemies = TRUE sTWSData.sLockedBattles[2].iTile = 13 sTWSData.sLockedBattles[2].iEnemies = 8 sTWSData.sLockedBattles[2].iEnemySize = 3 sTWSData.sLockedBattles[2].iSpawnTime = 3000 sTWSData.sLockedBattles[2].bSpawnEnemies = TRUE BREAK ENDSWITCH ENDPROC // Enemies FUNC FLOAT TWS_GET_ENEMY_SHADOW_X_OFFSET(INT iIndex, BOOL bFacingRight = FALSE) IF bFacingRight RETURN - sEnemyData[iIndex].vShadowOffset.x ELSE RETURN sEnemyData[iIndex].vShadowOffset.x ENDIF ENDFUNC FUNC FLOAT TWS_GET_ENEMY_SHADOW_Y_POSITION(TWS_ENEMY_TYPE eType) FLOAT fEnemyHeight = 0.0 SWITCH eType CASE TWS_ENEMY_BRUTE fEnemyHeight = cfTWS_BRUTE_IDLE_HEIGHT - 20.0 BREAK CASE TWS_ENEMY_BRUTE_AXE fEnemyHeight = cfTWS_BRUTE_AXE_IDLE_HEIGHT - 20.0 BREAK CASE TWS_ENEMY_GRUNT fEnemyHeight = cfTWS_GRUNT_IDLE_HEIGHT BREAK CASE TWS_ENEMY_GRUNT_SWORD fEnemyHeight = cfTWS_GRUNT_SWORD_IDLE_HEIGHT - 10.0 BREAK CASE TWS_ENEMY_GRUNT_FIRESWORD fEnemyHeight = cfTWS_GRUNT_FIRESWORD_IDLE_HEIGHT - 10.0 BREAK CASE TWS_ENEMY_GRUNT_FIRESPEAR CASE TWS_ENEMY_GRUNT_SPEAR fEnemyHeight = cfTWS_GRUNT_SPEAR_IDLE_HEIGHT - 10.0 BREAK CASE TWS_ENEMY_GRUNT_CROSSBOW fEnemyHeight = cfTWS_GRUNT_CROSSBOW_IDLE_HEIGHT - 10.0 BREAK CASE TWS_ENEMY_GRUNT_CASTER fEnemyHeight = cfTWS_GRUNT_CASTER_IDLE_HEIGHT - 10.0 BREAK CASE TWS_ENEMY_BAT fEnemyHeight = cfTWS_BAT_IDLE_HEIGHT BREAK CASE TWS_ENEMY_SLIME fEnemyHeight = cfTWS_SLIME_IDLE_HEIGHT BREAK CASE TWS_ENEMY_SNAKE fEnemyHeight = cfTWS_SNAKE_IDLE_HEIGHT BREAK CASE TWS_ENEMY_BOULDER fEnemyHeight = cfTWS_BOULDER_WALK_HEIGHT BREAK CASE TWS_ENEMY_FAIRY fEnemyHeight = cfTWS_FAIRY_IDLE_HEIGHT BREAK CASE TWS_ENEMY_SPIDER fEnemyHeight = cfTWS_SPIDER_IDLE_HEIGHT - 10.0 BREAK CASE TWS_ENEMY_LEPRECHAUN fEnemyHeight = cfTWS_LEPRECHAUN_IDLE_HEIGHT BREAK CASE TWS_ENEMY_BOSS_KNIGHT CASE TWS_ENEMY_KNIGHT fEnemyHeight = cfTWS_BOSS_KNIGHT_IDLE_HEIGHT - 10.0 BREAK CASE TWS_ENEMY_BOSS_AMAZON fEnemyHeight = cfTWS_BOSS_AMAZON_IDLE_HEIGHT BREAK CASE TWS_ENEMY_BOSS_SPIDER fEnemyHeight = cfTWS_BOSS_SPIDER_IDLE_HEIGHT BREAK CASE TWS_ENEMY_BOSS_WIZARD CASE TWS_ENEMY_FAKE_WIZARD fEnemyHeight = cfTWS_WIZARD_GEN_HEIGHT BREAK ENDSWITCH RETURN fEnemyHeight ENDFUNC PROC TWS_SET_ENEMY_STATE(INT iEnemy, TWS_ENEMY_STATE eState) CDEBUG2LN(DEBUG_MINIGAME, "[TWS_ARCADE] [GD] Enemy ",iEnemy," changing from state ",sEnemyData[iEnemy].eEnemyState," to state ",eState) sEnemyData[iEnemy].eEnemyState = eState sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0,0.0) SWITCH sEnemyData[iEnemy].eEnemyType CASE TWS_ENEMY_BRUTE SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_IDLE_WIDTH, cfTWS_BRUTE_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_WALK_WIDTH, cfTWS_BRUTE_WALK_HEIGHT) BREAK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_ATTACK_WIDTH, cfTWS_BRUTE_ATTACK_HEIGHT) BREAK CASE TWS_ENEMY_FALL sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_FALL_WIDTH, cfTWS_BRUTE_FALL_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(40.0,-20.0) BREAK CASE TWS_ENEMY_FLAT sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_FLAT_WIDTH, cfTWS_BRUTE_FLAT_HEIGHT) BREAK CASE TWS_ENEMY_GETTING_UP sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_GETTINGUP1_WIDTH, cfTWS_BRUTE_GETTINGUP1_HEIGHT) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_STUN_WIDTH, cfTWS_BRUTE_STUN_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(100.0,-16.0) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_BRUTE_AXE SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_AXE_IDLE_WIDTH, cfTWS_BRUTE_AXE_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_AXE_WALK_WIDTH, cfTWS_BRUTE_AXE_WALK_HEIGHT) BREAK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_AXE_ATTACK_WIDTH, cfTWS_BRUTE_AXE_ATTACK_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(-16.0,-50.0) BREAK CASE TWS_ENEMY_FALL CASE TWS_ENEMY_FLAT CASE TWS_ENEMY_GETTING_UP sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_AXE_FALL_WIDTH, cfTWS_BRUTE_AXE_FALL_HEIGHT) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_AXE_STUN_WIDTH, cfTWS_BRUTE_AXE_STUN_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(70.0,4.0) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_GRUNT SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_IDLE_WIDTH, cfTWS_GRUNT_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_WALK_WIDTH, cfTWS_GRUNT_WALK_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(-6.0, -34.0) BREAK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_ATTACK_WIDTH, cfTWS_GRUNT_ATTACK_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(-52.0, -16.0) BREAK CASE TWS_ENEMY_FALL sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_FALL_WIDTH, cfTWS_GRUNT_FALL_HEIGHT) BREAK CASE TWS_ENEMY_FLAT sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_FLAT_WIDTH, cfTWS_GRUNT_FLAT_HEIGHT) BREAK CASE TWS_ENEMY_GETTING_UP sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_GETTINGUP1_WIDTH, cfTWS_GRUNT_GETTINGUP1_HEIGHT) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_STUN_WIDTH, cfTWS_GRUNT_STUN_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(100.0, -22.0) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_GRUNT_SWORD SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SWORD_IDLE_WIDTH, cfTWS_GRUNT_SWORD_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SWORD_WALK_WIDTH, cfTWS_GRUNT_SWORD_WALK_HEIGHT) BREAK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SWORD_ATTACK_WIDTH, cfTWS_GRUNT_SWORD_ATTACK_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0, -50) BREAK CASE TWS_ENEMY_FALL CASE TWS_ENEMY_FLAT CASE TWS_ENEMY_GETTING_UP sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SWORD_FALL_WIDTH, cfTWS_GRUNT_SWORD_FALL_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0, 50) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SWORD_STUN_WIDTH, cfTWS_GRUNT_SWORD_STUN_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(10.0, 40) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_GRUNT_FIRESWORD SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_FIRESWORD_IDLE_WIDTH, cfTWS_GRUNT_FIRESWORD_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_FIRESWORD_WALK_WIDTH, cfTWS_GRUNT_FIRESWORD_WALK_HEIGHT) BREAK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_FIRESWORD_ATTACK_WIDTH, cfTWS_GRUNT_FIRESWORD_ATTACK_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(-4.0,-48.0) BREAK CASE TWS_ENEMY_FALL sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_FIRESWORD_FALL_WIDTH, cfTWS_GRUNT_FIRESWORD_FALL_HEIGHT) BREAK CASE TWS_ENEMY_FLAT sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_FIRESWORD_FALL_WIDTH, cfTWS_GRUNT_FIRESWORD_FALL_WIDTH) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0, 45.0) BREAK CASE TWS_ENEMY_GETTING_UP sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_FIRESWORD_FALL_WIDTH, cfTWS_GRUNT_FIRESWORD_FALL_WIDTH) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_FIRESWORD_STUN_WIDTH, cfTWS_GRUNT_FIRESWORD_STUN_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(56.0, 40.0) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_GRUNT_FIRESPEAR CASE TWS_ENEMY_GRUNT_SPEAR SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SPEAR_IDLE_WIDTH, cfTWS_GRUNT_SPEAR_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SPEAR_WALK_WIDTH, cfTWS_GRUNT_SPEAR_WALK_HEIGHT) BREAK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SPEAR_ATTACK_WIDTH, cfTWS_GRUNT_SPEAR_ATTACK_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(-30.0,0.0) BREAK CASE TWS_ENEMY_FALL CASE TWS_ENEMY_FLAT CASE TWS_ENEMY_GETTING_UP sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SPEAR_FALL_WIDTH, cfTWS_GRUNT_SPEAR_FALL_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0, 45.0) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SPEAR_STUN_WIDTH, cfTWS_GRUNT_SPEAR_STUN_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(40.0,40.0) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_GRUNT_CROSSBOW SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_CROSSBOW_IDLE_WIDTH, cfTWS_GRUNT_CROSSBOW_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_CROSSBOW_WALK_WIDTH, cfTWS_GRUNT_CROSSBOW_WALK_HEIGHT) BREAK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_CROSSBOW_ATTACK_WIDTH, cfTWS_GRUNT_CROSSBOW_ATTACK_HEIGHT) BREAK CASE TWS_ENEMY_FALL CASE TWS_ENEMY_FLAT CASE TWS_ENEMY_GETTING_UP sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_CROSSBOW_FALL_WIDTH, cfTWS_GRUNT_CROSSBOW_FALL_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0, 50) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_CROSSBOW_STUN_WIDTH, cfTWS_GRUNT_CROSSBOW_STUN_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(50.0,45.0) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_GRUNT_CASTER SWITCH eState CASE TWS_ENEMY_IDLE CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_CASTER_IDLE_WIDTH, cfTWS_GRUNT_CASTER_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_CASTER_ATTACK_WIDTH, cfTWS_GRUNT_CASTER_ATTACK_HEIGHT) BREAK CASE TWS_ENEMY_STUN CASE TWS_ENEMY_DYING sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_CASTER_DEATH_WIDTH, cfTWS_GRUNT_CASTER_DEATH_HEIGHT) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_BAT SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BAT_IDLE_WIDTH, cfTWS_BAT_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BAT_FLY_WIDTH, cfTWS_BAT_FLY_HEIGHT) BREAK CASE TWS_ENEMY_GLIDE_DOWN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BAT_FLY_WIDTH, cfTWS_BAT_FLY_HEIGHT) BREAK CASE TWS_ENEMY_STUN CASE TWS_ENEMY_DEAD sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BAT_DIE_WIDTH, cfTWS_BAT_DIE_HEIGHT) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_SLIME SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SLIME_IDLE_WIDTH, cfTWS_SLIME_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SLIME_WALK_WIDTH, cfTWS_SLIME_WALK_HEIGHT) BREAK CASE TWS_ENEMY_GLIDE_DOWN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SLIME_WALK_WIDTH, cfTWS_SLIME_WALK_HEIGHT) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SLIME_STUN_WIDTH, cfTWS_SLIME_STUN_HEIGHT) BREAK CASE TWS_ENEMY_DYING CASE TWS_ENEMY_DEAD sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SLIME_DIE_WIDTH, cfTWS_SLIME_DIE_HEIGHT) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_SNAKE SWITCH eState CASE TWS_ENEMY_IDLE CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SNAKE_IDLE_WIDTH, cfTWS_SNAKE_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_DYING CASE TWS_ENEMY_DEAD sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SNAKE_DIE_WIDTH, cfTWS_SNAKE_DIE_HEIGHT) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_BOULDER SWITCH eState CASE TWS_ENEMY_IDLE CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOULDER_WALK_WIDTH, cfTWS_BOULDER_WALK_HEIGHT) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_FAIRY SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_FAIRY_IDLE_WIDTH, cfTWS_FAIRY_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_FAIRY_ATTACK_WIDTH, cfTWS_FAIRY_ATTACK_HEIGHT) BREAK CASE TWS_ENEMY_STUN CASE TWS_ENEMY_DEAD sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_FAIRY_DIE_WIDTH, cfTWS_FAIRY_DIE_HEIGHT) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_SPIDER SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SPIDER_IDLE_WIDTH, cfTWS_SPIDER_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SPIDER_WALK_WIDTH, cfTWS_SPIDER_WALK_HEIGHT) BREAK CASE TWS_ENEMY_GLIDE_DOWN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SPIDER_WEB_WIDTH, cfTWS_SPIDER_WEB_HEIGHT) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_SPIDER_STUN_DEAD_WIDTH, cfTWS_SPIDER_STUN_DEAD_HEIGHT) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_LEPRECHAUN SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_LEPRECHAUN_IDLE_WIDTH, cfTWS_LEPRECHAUN_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_LEPRECHAUN_WALK_WIDTH, cfTWS_LEPRECHAUN_WALK_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0, -56.0) BREAK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_LEPRECHAUN_ATTACK_WIDTH, cfTWS_LEPRECHAUN_ATTACK_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0,-120.0) BREAK CASE TWS_ENEMY_FALL sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_LEPRECHAUN_HURT_WIDTH, cfTWS_LEPRECHAUN_HURT_HEIGHT) BREAK CASE TWS_ENEMY_DYING sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_LEPRECHAUN_DEAD_WIDTH, cfTWS_LEPRECHAUN_DEAD_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0,16.0) BREAK CASE TWS_ENEMY_GO_UP sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_LEPRECHAUN_SPAWN_WIDTH, cfTWS_LEPRECHAUN_SPAWN_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0,-64.0) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_BOSS_KNIGHT CASE TWS_ENEMY_KNIGHT SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_IDLE_WIDTH, cfTWS_BOSS_KNIGHT_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_INACTIVE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_KNEE_WIDTH, cfTWS_BOSS_KNIGHT_KNEE_HEIGHT) BREAK CASE TWS_ENEMY_DYING_1 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_DYING_1_WIDTH, cfTWS_BOSS_KNIGHT_DYING_1_HEIGHT) BREAK CASE TWS_ENEMY_DYING_2 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_DYING_2_WIDTH, cfTWS_BOSS_KNIGHT_DYING_2_HEIGHT) BREAK CASE TWS_ENEMY_DYING_3 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_DYING_3_WIDTH, cfTWS_BOSS_KNIGHT_DYING_3_HEIGHT) BREAK CASE TWS_ENEMY_DYING_4 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_DYING_4_WIDTH, cfTWS_BOSS_KNIGHT_DYING_4_HEIGHT) BREAK CASE TWS_ENEMY_DYING_5 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_DYING_5_WIDTH, cfTWS_BOSS_KNIGHT_DYING_5_HEIGHT) BREAK CASE TWS_ENEMY_DYING_6 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_DYING_6_WIDTH, cfTWS_BOSS_KNIGHT_DYING_6_HEIGHT) BREAK CASE TWS_ENEMY_DYING_7 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_DYING_7_WIDTH, cfTWS_BOSS_KNIGHT_DYING_7_HEIGHT) BREAK CASE TWS_ENEMY_DYING_8 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_DYING_8_WIDTH, cfTWS_BOSS_KNIGHT_DYING_8_HEIGHT) BREAK CASE TWS_ENEMY_DEAD sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_DEAD_WIDTH, cfTWS_BOSS_KNIGHT_DEAD_HEIGHT) BREAK CASE TWS_ENEMY_STUN CASE TWS_ENEMY_FALL CASE TWS_ENEMY_GETTING_UP sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_HURT_WIDTH, cfTWS_BOSS_KNIGHT_HURT_HEIGHT) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_WALK_WIDTH, cfTWS_BOSS_KNIGHT_WALK_HEIGHT) BREAK CASE TWS_ENEMY_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_SLASH_WIDTH, cfTWS_BOSS_KNIGHT_SLASH_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(-60.0,-56.0) BREAK CASE TWS_ENEMY_SPECIAL_ATTACK CASE TWS_ENEMY_SPECIAL_ATTACK_2 CASE TWS_ENEMY_SPECIAL_ATTACK_3 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_SLAM_WIDTH, cfTWS_BOSS_KNIGHT_SLAM_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(-44.0, 10.0) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_BOSS_AMAZON SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_AMAZON_IDLE_WIDTH, cfTWS_BOSS_AMAZON_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_STUN CASE TWS_ENEMY_FALL sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_AMAZON_HURT_WIDTH, cfTWS_BOSS_AMAZON_HURT_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(54.0, -6.0) BREAK CASE TWS_ENEMY_FLAT CASE TWS_ENEMY_DEAD sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_AMAZON_HURT_WIDTH, cfTWS_BOSS_AMAZON_HURT_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0, 32.0) BREAK CASE TWS_ENEMY_WALK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_AMAZON_WALK_WIDTH, cfTWS_BOSS_AMAZON_WALK_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0, -24.0) BREAK CASE TWS_ENEMY_GO_UP CASE TWS_ENEMY_FALL_OVER_1 CASE TWS_ENEMY_TELEPORT_IN CASE TWS_ENEMY_TELEPORT_OUT sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_AMAZON_JUMP_WIDTH, cfTWS_BOSS_AMAZON_JUMP_HEIGHT) BREAK CASE TWS_ENEMY_LANDING sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_AMAZON_JUMP_LAND_WIDTH, cfTWS_BOSS_AMAZON_JUMP_LAND_HEIGHT) sEnemyData[iEnemy].vSpriteOffset = INIT_VECTOR_2D(0.0, 28.0) BREAK CASE TWS_ENEMY_ATTACK_LOAD CASE TWS_ENEMY_ATTACK_WAIT CASE TWS_ENEMY_ATTACK_HIT CASE TWS_ENEMY_SPECIAL_ATTACK_2 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_AMAZON_ATTACK_WIDTH, cfTWS_BOSS_AMAZON_ATTACK_HEIGHT) BREAK CASE TWS_ENEMY_SPECIAL_ATTACK sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_AMAZON_ATTACK_JUMP_WIDTH, cfTWS_BOSS_AMAZON_ATTACK_JUMP_HEIGHT) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_BOSS_SPIDER SWITCH eState CASE TWS_ENEMY_IDLE sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_SPIDER_IDLE_WIDTH, cfTWS_BOSS_SPIDER_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_ATTACK CASE TWS_ENEMY_ATTACK_LOAD CASE TWS_ENEMY_ATTACK_WAIT CASE TWS_ENEMY_ATTACK_HIT sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_SPIDER_ATTACK_WIDTH, cfTWS_BOSS_SPIDER_ATTACK_HEIGHT) BREAK CASE TWS_ENEMY_SPIT_1 CASE TWS_ENEMY_SPIT_2 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_SPIDER_SPIT_WIDTH, cfTWS_BOSS_SPIDER_SPIT_HEIGHT) BREAK CASE TWS_ENEMY_DEAD CASE TWS_ENEMY_DYING sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_SPIDER_DEAD_WIDTH, cfTWS_BOSS_SPIDER_DEAD_HEIGHT) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_SPIDER_STUN_WIDTH, cfTWS_BOSS_SPIDER_STUN_HEIGHT) BREAK CASE TWS_ENEMY_GLIDE_DOWN CASE TWS_ENEMY_GO_UP CASE TWS_ENEMY_FALL_OVER_1 CASE TWS_ENEMY_FALL_OVER_2 CASE TWS_ENEMY_LANDING sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_SPIDER_GLIDE_WIDTH, cfTWS_BOSS_SPIDER_GLIDE_HEIGHT) BREAK ENDSWITCH BREAK CASE TWS_ENEMY_BOSS_WIZARD CASE TWS_ENEMY_FAKE_WIZARD SWITCH eState CASE TWS_ENEMY_IDLE CASE TWS_ENEMY_TELEPORT_IN CASE TWS_ENEMY_TELEPORT_OUT CASE TWS_ENEMY_SPECIAL_ATTACK CASE TWS_ENEMY_SPECIAL_ATTACK_2 sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_WIZARD_GEN_WIDTH, cfTWS_WIZARD_GEN_HEIGHT) BREAK CASE TWS_ENEMY_STUN sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_WIZARD_STUN_WIDTH, cfTWS_WIZARD_STUN_HEIGHT) BREAK CASE TWS_ENEMY_EXPLODING CASE TWS_ENEMY_DYING sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(cfTWS_WIZARD_DIE_WIDTH, cfTWS_WIZARD_DIE_HEIGHT) BREAK CASE TWS_ENEMY_DEAD sEnemyData[iEnemy].vSpriteSize = INIT_VECTOR_2D(0, 0) BREAK ENDSWITCH BREAK ENDSWITCH ENDPROC FUNC BOOL TWS_ADD_ENEMY_TO_LIST(VECTOR_2D vPos, TWS_ENEMY_TYPE eType, BOOL bIsBattleEnemy = FALSE) iCurrentEnemyToAdd = TWS_GET_NEXT_EMPTY_SLOT_FOR_ENEMY() IF iCurrentEnemyToAdd = -1 CERRORLN(DEBUG_MINIGAME, "Error: could not spawn enemy. Array is full!") RETURN FALSE ENDIF INT iCurrentDrawCallToAdd = TWS_GET_NEXT_EMPTY_SLOT_FOR_DRAW_CALL() sEnemyData[iCurrentEnemyToAdd].bIsActive = TRUE sEnemyData[iCurrentEnemyToAdd].bIsAttacking = FALSE sEnemyData[iCurrentEnemyToAdd].bIsHit = FALSE sEnemyData[iCurrentEnemyToAdd].bIsMoving = FALSE sEnemyData[iCurrentEnemyToAdd].vSpritePos = vPos sEnemyData[iCurrentEnemyToAdd].vInitialPos = vPos sEnemyData[iCurrentEnemyToAdd].vTargetPos = vPos sEnemyData[iCurrentEnemyToAdd].eEnemyType = eType sEnemyData[iCurrentEnemyToAdd].fHealth = 1.0 sEnemyData[iCurrentEnemyToAdd].iSpriteAnimFrame = 0 sEnemyData[iCurrentEnemyToAdd].iNumberOfAttacksInARow = 0 sEnemyData[iCurrentEnemyToAdd].iTimer = GET_GAME_TIMER() sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_IDLE sEnemyData[iCurrentEnemyToAdd].eNextState = TWS_ENEMY_IDLE SWITCH sEnemyData[iCurrentEnemyToAdd].eEnemyType // FOREST CASE TWS_ENEMY_BOSS_KNIGHT sEnemyData[iCurrentEnemyToAdd].fHealth = 1.0 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 6 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_KNEE_WIDTH, cfTWS_BOSS_KNIGHT_KNEE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INACTIVE sTWSData.iBossEnemyIndex = iCurrentEnemyToAdd BREAK CASE TWS_ENEMY_GRUNT_SWORD sEnemyData[iCurrentEnemyToAdd].fHealth = 0.3 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 5 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SWORD_IDLE_WIDTH, cfTWS_GRUNT_SWORD_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.x = 40.0 BREAK CASE TWS_ENEMY_GRUNT_CROSSBOW sEnemyData[iCurrentEnemyToAdd].fHealth = 0.1 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 6 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_CROSSBOW_IDLE_WIDTH, cfTWS_GRUNT_CROSSBOW_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.x = 40.0 BREAK CASE TWS_ENEMY_GRUNT_SPEAR sEnemyData[iCurrentEnemyToAdd].fHealth = 0.3 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 4 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SPEAR_IDLE_WIDTH, cfTWS_GRUNT_SPEAR_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.x = 40.0 BREAK CASE TWS_ENEMY_FAIRY sEnemyData[iCurrentEnemyToAdd].fHealth = 0.2 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 0 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 3 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FAIRY_IDLE_WIDTH, cfTWS_FAIRY_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.y = cfBASE_SCREEN_HEIGHT/3*2 BREAK CASE TWS_ENEMY_LEPRECHAUN sEnemyData[iCurrentEnemyToAdd].fHealth = 0.1 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 0 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 11 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_LEPRECHAUN_IDLE_WIDTH, cfTWS_LEPRECHAUN_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INVISIBLE BREAK // SWAMP CASE TWS_ENEMY_BOSS_AMAZON sEnemyData[iCurrentEnemyToAdd].fHealth = 1.0 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 2 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 6 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_AMAZON_IDLE_WIDTH, cfTWS_BOSS_AMAZON_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INACTIVE sTWSData.iBossEnemyIndex = iCurrentEnemyToAdd BREAK CASE TWS_ENEMY_BRUTE_AXE sEnemyData[iCurrentEnemyToAdd].fHealth = 0.8 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 6 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_AXE_IDLE_WIDTH, cfTWS_BRUTE_AXE_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.x = 10.0 BREAK CASE TWS_ENEMY_SLIME sEnemyData[iCurrentEnemyToAdd].fHealth = 0.1 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 0 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 1 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_SLIME_IDLE_WIDTH, cfTWS_SLIME_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INVISIBLE sEnemyData[iCurrentEnemyToAdd].vShadowOffset.y = -1.0 BREAK CASE TWS_ENEMY_SNAKE sEnemyData[iCurrentEnemyToAdd].fHealth = 0.1 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 0 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 1 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_SNAKE_IDLE_WIDTH, cfTWS_SNAKE_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.y = -1.0 BREAK // CAVES CASE TWS_ENEMY_BOSS_SPIDER sEnemyData[iCurrentEnemyToAdd].fHealth = 1.0 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 3 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 6 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_SPIDER_IDLE_WIDTH, cfTWS_BOSS_SPIDER_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INACTIVE sTWSData.iBossEnemyIndex = iCurrentEnemyToAdd BREAK CASE TWS_ENEMY_GRUNT sEnemyData[iCurrentEnemyToAdd].fHealth = 0.6 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 5 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_IDLE_WIDTH, cfTWS_GRUNT_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.x = 30.0 BREAK CASE TWS_ENEMY_BRUTE sEnemyData[iCurrentEnemyToAdd].fHealth = 1.0 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 6 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_BRUTE_IDLE_WIDTH, cfTWS_BRUTE_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.x = 10.0 BREAK CASE TWS_ENEMY_KNIGHT sEnemyData[iCurrentEnemyToAdd].fHealth = 1.6 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 6 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOSS_KNIGHT_KNEE_WIDTH, cfTWS_BOSS_KNIGHT_KNEE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INACTIVE BREAK CASE TWS_ENEMY_BAT sEnemyData[iCurrentEnemyToAdd].fHealth = 0.1 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 0 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 1 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_BAT_IDLE_WIDTH, cfTWS_BAT_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.y = cfBASE_SCREEN_HEIGHT/3*2 - cfTWS_BAT_FLY_HEIGHT BREAK CASE TWS_ENEMY_SPIDER sEnemyData[iCurrentEnemyToAdd].fHealth = 0.3 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 1 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_SPIDER_WEB_WIDTH, cfTWS_SPIDER_WEB_HEIGHT) sEnemyData[iCurrentEnemyToAdd].iTimer = GET_GAME_TIMER() sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INACTIVE sEnemyData[iCurrentEnemyToAdd].vShadowOffset.y = cfBASE_SCREEN_HEIGHT/2 + cfTWS_SPIDER_WEB_HEIGHT sEnemyData[iCurrentEnemyToAdd].vShadowOffset.x = -10.0 BREAK // CASTLE CASE TWS_ENEMY_BOSS_WIZARD sEnemyData[iCurrentEnemyToAdd].fHealth = 1.0 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 3 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 9 sEnemyData[iCurrentEnemyToAdd].vShadowOffset.y = -1.0 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_WIZARD_GEN_WIDTH, cfTWS_WIZARD_GEN_HEIGHT) sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INACTIVE sTWSData.iBossEnemyIndex = iCurrentEnemyToAdd BREAK CASE TWS_ENEMY_FAKE_WIZARD sEnemyData[iCurrentEnemyToAdd].fHealth = 0.1 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 3 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 9 sEnemyData[iCurrentEnemyToAdd].vShadowOffset.y = -1.0 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_WIZARD_GEN_WIDTH, cfTWS_WIZARD_GEN_HEIGHT) sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INACTIVE BREAK CASE TWS_ENEMY_DIALOGUE_WIZARD sEnemyData[iCurrentEnemyToAdd].fHealth = 0.1 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 3 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 9 sEnemyData[iCurrentEnemyToAdd].vShadowOffset.y = -1.0 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_WIZARD_GEN_WIDTH, cfTWS_WIZARD_GEN_HEIGHT) sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INACTIVE BREAK CASE TWS_ENEMY_GRUNT_FIRESWORD sEnemyData[iCurrentEnemyToAdd].fHealth = 1.2 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 5 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_FIRESWORD_IDLE_WIDTH, cfTWS_GRUNT_FIRESWORD_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.x = 40.0 BREAK CASE TWS_ENEMY_GRUNT_FIRESPEAR sEnemyData[iCurrentEnemyToAdd].fHealth = 1.2 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 4 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_SPEAR_IDLE_WIDTH, cfTWS_GRUNT_SPEAR_IDLE_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.x = 40.0 BREAK CASE TWS_ENEMY_GRUNT_CASTER sEnemyData[iCurrentEnemyToAdd].fHealth = 0.1 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 1 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 6 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_GRUNT_CASTER_IDLE_WIDTH, cfTWS_GRUNT_CASTER_IDLE_HEIGHT) BREAK CASE TWS_ENEMY_BOULDER sEnemyData[iCurrentEnemyToAdd].fHealth = 10.0 sEnemyData[iCurrentEnemyToAdd].iEnemySize = 0 sEnemyData[iCurrentEnemyToAdd].iAttackFrame = 1 sEnemyData[iCurrentEnemyToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_BOULDER_WALK_WIDTH, cfTWS_BOULDER_WALK_HEIGHT) sEnemyData[iCurrentEnemyToAdd].vShadowOffset.y = -1.0 sEnemyData[iCurrentEnemyToAdd].eEnemyState = TWS_ENEMY_INVISIBLE BREAK ENDSWITCH IF bIsBattleEnemy sEnemyData[iCurrentEnemyToAdd].vTargetPos = sPlayerData.vSpritePos sEnemyData[iCurrentEnemyToAdd].bIsBattleEnemy = TRUE IF sEnemyData[iCurrentEnemyToAdd].eEnemyType != TWS_ENEMY_BAT AND sEnemyData[iCurrentEnemyToAdd].eEnemyType != TWS_ENEMY_SPIDER AND sEnemyData[iCurrentEnemyToAdd].eEnemyType != TWS_ENEMY_KNIGHT AND sEnemyData[iCurrentEnemyToAdd].eEnemyType != TWS_ENEMY_LEPRECHAUN AND sEnemyData[iCurrentEnemyToAdd].eEnemyType != TWS_ENEMY_SLIME TWS_SET_ENEMY_STATE(iCurrentEnemyToAdd, TWS_ENEMY_WALK) TWS_ARCADE_GAMES_SOUND_PLAY_AT_POSITION(TWS_GET_AGGRO_SOUND_FOR_ENEMY(eType), TWS_GET_SOUND_POSITION_FOR_ENEMY(iCurrentEnemyToAdd)) ENDIF IF sEnemyData[iCurrentEnemyToAdd].eEnemyType = TWS_ENEMY_GRUNT_CROSSBOW OR sEnemyData[iCurrentEnemyToAdd].eEnemyType = TWS_ENEMY_GRUNT_CASTER IF sEnemyData[iCurrentEnemyToAdd].vSpritePos.x > sTWSData.fLockedScreenPos sEnemyData[iCurrentEnemyToAdd].vTargetPos = INIT_VECTOR_2D(sTWSData.fLockedScreenPos + 300, sPlayerData.vSpritePos.y) ELSE sEnemyData[iCurrentEnemyToAdd].vTargetPos = INIT_VECTOR_2D(sTWSData.fLockedScreenPos - 300, sPlayerData.vSpritePos.y) ENDIF ENDIF ENDIF sTWSData.sDrawCalls[iCurrentDrawCallToAdd].eType = TWS_ENTITY_ENEMY sTWSData.sDrawCalls[iCurrentDrawCallToAdd].iIndex = iCurrentEnemyToAdd sTWSData.sDrawCalls[iCurrentDrawCallToAdd].fZIndex = vPos.Y + sEnemyData[iCurrentEnemyToAdd].vSpriteSize.y RETURN TRUE ENDFUNC PROC TWS_INIT_ENEMIES() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[0].fSpritePos + cfGAME_SCREEN_WIDTH*0.55, 680), TWS_ENEMY_LEPRECHAUN) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[0].fSpritePos + cfGAME_SCREEN_WIDTH*0.75, 750), TWS_ENEMY_LEPRECHAUN) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, -50), TWS_ENEMY_FAIRY) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.55, -50), TWS_ENEMY_FAIRY) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[2].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 550), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[2].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 700), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[2].fSpritePos + cfGAME_SCREEN_WIDTH*0.55, 700), TWS_ENEMY_LEPRECHAUN) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.55, 580), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.7, 750), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.9, 850), TWS_ENEMY_FAIRY) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.85, 650), TWS_ENEMY_FAIRY) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 800), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, 700), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.55, 700), TWS_ENEMY_LEPRECHAUN) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.78, 800), TWS_ENEMY_LEPRECHAUN) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.9, 800), TWS_ENEMY_LEPRECHAUN) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, -50), TWS_ENEMY_FAIRY) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.7, -50), TWS_ENEMY_FAIRY) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.8, -50), TWS_ENEMY_FAIRY) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.95, 580), TWS_ENEMY_GRUNT_CROSSBOW) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.8, 660), TWS_ENEMY_GRUNT_CROSSBOW) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[8].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 550), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[8].fSpritePos + cfGAME_SCREEN_WIDTH*0.45, 700), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[8].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 550), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[8].fSpritePos + cfGAME_SCREEN_WIDTH*0.7, 750), TWS_ENEMY_GRUNT_CROSSBOW) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 550), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.63, 600), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.60, 650), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.63, 700), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[10].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, 800), TWS_ENEMY_GRUNT_CROSSBOW) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[10].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 550), TWS_ENEMY_GRUNT_CROSSBOW) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, 550), TWS_ENEMY_BOSS_KNIGHT) BREAK CASE TWS_SWAMP TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[0].fSpritePos + cfGAME_SCREEN_WIDTH*0.75, 580), TWS_ENEMY_SNAKE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[0].fSpritePos + cfGAME_SCREEN_WIDTH*0.95, 650), TWS_ENEMY_SNAKE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[0].fSpritePos + cfGAME_SCREEN_WIDTH*0.75, 850), TWS_ENEMY_SNAKE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 550), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 700), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[2].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, -50), TWS_ENEMY_SLIME) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[2].fSpritePos + cfGAME_SCREEN_WIDTH*0.8, -150), TWS_ENEMY_SLIME) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.0, -150), TWS_ENEMY_SLIME) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, -150), TWS_ENEMY_SLIME) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.55, 580), TWS_ENEMY_BRUTE_AXE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.7, 750), TWS_ENEMY_BRUTE_AXE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.9, 850), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.85, 650), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.3, 800), TWS_ENEMY_SNAKE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, 700), TWS_ENEMY_SNAKE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.55, 600), TWS_ENEMY_BRUTE_AXE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.78, 700), TWS_ENEMY_BRUTE_AXE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, 700), TWS_ENEMY_SNAKE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.7, 600), TWS_ENEMY_SNAKE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.8, 750), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.95, 580), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.8, 660), TWS_ENEMY_SLIME) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[8].fSpritePos + cfGAME_SCREEN_WIDTH*0.5, 550), TWS_ENEMY_GRUNT_CROSSBOW) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[8].fSpritePos + cfGAME_SCREEN_WIDTH*0.65, 700), TWS_ENEMY_GRUNT_CROSSBOW) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[8].fSpritePos + cfGAME_SCREEN_WIDTH*0.9, 550), TWS_ENEMY_SLIME) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[8].fSpritePos + cfGAME_SCREEN_WIDTH*1.0, 750), TWS_ENEMY_GRUNT_SPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 525), TWS_ENEMY_BRUTE_AXE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.63, 600), TWS_ENEMY_BRUTE_AXE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.60, 725), TWS_ENEMY_BRUTE_AXE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.63, 850), TWS_ENEMY_BRUTE_AXE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[10].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, 800), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[10].fSpritePos + cfGAME_SCREEN_WIDTH*0.5, 550), TWS_ENEMY_GRUNT_SWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.63,800), TWS_ENEMY_SNAKE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.60,650), TWS_ENEMY_SNAKE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, 690), TWS_ENEMY_BOSS_AMAZON) BREAK CASE TWS_CAVES TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH + 450, 150), TWS_ENEMY_BAT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH + 1050, 660), TWS_ENEMY_GRUNT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*2 + 450, 150), TWS_ENEMY_BAT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*2 + 700, 660), TWS_ENEMY_GRUNT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*3 + 850, 560), TWS_ENEMY_GRUNT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*3 + 450, 150), TWS_ENEMY_BAT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*3 + 750, 180), TWS_ENEMY_BAT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*5 + 550, -50), TWS_ENEMY_SPIDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*5 + 850, -50), TWS_ENEMY_SPIDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*6 + 550, -50), TWS_ENEMY_SPIDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*6 + 1050, 560), TWS_ENEMY_GRUNT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*7 + 550, -50), TWS_ENEMY_SPIDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*7 + 850, -50), TWS_ENEMY_SPIDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*7 + 250, 560), TWS_ENEMY_BRUTE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*8 + 450, 100), TWS_ENEMY_BAT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*8 + 550, 80), TWS_ENEMY_BAT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*9 + 1350, 660), TWS_ENEMY_KNIGHT, TRUE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*10 + 1150, 660), TWS_ENEMY_BRUTE) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*10 + 1100, 80), TWS_ENEMY_BAT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*10 + 1050, -50), TWS_ENEMY_SPIDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*11 + 750, 560), TWS_ENEMY_GRUNT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*11 + 950, 660), TWS_ENEMY_GRUNT) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(cfGAME_SCREEN_WIDTH*11 + 950, -50), TWS_ENEMY_SPIDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos, -300), TWS_ENEMY_BOSS_SPIDER) BREAK CASE TWS_CASTLE TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[0].fSpritePos + cfGAME_SCREEN_WIDTH*0.75, 580), TWS_ENEMY_GRUNT_FIRESWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[0].fSpritePos + cfGAME_SCREEN_WIDTH*0.65, 650), TWS_ENEMY_GRUNT_FIRESWORD) // Spades here TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.95, 680), TWS_ENEMY_GRUNT_FIRESPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[1].fSpritePos + cfGAME_SCREEN_WIDTH*0.85, 750), TWS_ENEMY_GRUNT_FIRESPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 600), TWS_ENEMY_GRUNT_CASTER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, 700), TWS_ENEMY_GRUNT_CASTER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 800), TWS_ENEMY_GRUNT_CASTER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 550), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.71, 600), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.82, 660), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*0.94, 560), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[3].fSpritePos + cfGAME_SCREEN_WIDTH*1.06, 560), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 650), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.71, 700), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.82, 760), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*0.94, 660), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[5].fSpritePos + cfGAME_SCREEN_WIDTH*1.06, 660), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 700), TWS_ENEMY_GRUNT_FIRESPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.15, 600), TWS_ENEMY_GRUNT_FIRESPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[6].fSpritePos + cfGAME_SCREEN_WIDTH*0.2 , 700), TWS_ENEMY_GRUNT_FIRESPEAR) // Spades here TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[7].fSpritePos + cfGAME_SCREEN_WIDTH*0.8, 700), TWS_ENEMY_GRUNT_CASTER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[7].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 600), TWS_ENEMY_GRUNT_CASTER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[7].fSpritePos + cfGAME_SCREEN_WIDTH*0.8, 750), TWS_ENEMY_GRUNT_CASTER) // Spades here TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.9, 550), TWS_ENEMY_GRUNT_FIRESWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.8, 650), TWS_ENEMY_GRUNT_FIRESPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[9].fSpritePos + cfGAME_SCREEN_WIDTH*0.9, 750), TWS_ENEMY_GRUNT_FIRESWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[10].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 550), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[10].fSpritePos + cfGAME_SCREEN_WIDTH*0.62, 650), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[10].fSpritePos + cfGAME_SCREEN_WIDTH*0.58, 750), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[10].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 850), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 800), TWS_ENEMY_GRUNT_FIRESWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, 550), TWS_ENEMY_GRUNT_FIRESWORD) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.6, 850), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.71, 800), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.82, 860), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*0.94, 860), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[11].fSpritePos + cfGAME_SCREEN_WIDTH*1.06, 860), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[12].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, 550), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[12].fSpritePos + cfGAME_SCREEN_WIDTH*0.22, 650), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[12].fSpritePos + cfGAME_SCREEN_WIDTH*0.18, 750), TWS_ENEMY_BOULDER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[12].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, 850), TWS_ENEMY_BOULDER) // Spades here TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[12].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 550), TWS_ENEMY_GRUNT_FIRESPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[12].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 610), TWS_ENEMY_GRUNT_FIRESPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[12].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 670), TWS_ENEMY_GRUNT_FIRESPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[12].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 730), TWS_ENEMY_GRUNT_FIRESPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[12].fSpritePos + cfGAME_SCREEN_WIDTH*0.1, 790), TWS_ENEMY_GRUNT_FIRESPEAR) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[13].fSpritePos + cfGAME_SCREEN_WIDTH*0.15, 800), TWS_ENEMY_GRUNT_CASTER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(sBackgroundTilesData[13].fSpritePos + cfGAME_SCREEN_WIDTH*0.2, 550), TWS_ENEMY_GRUNT_CASTER) TWS_ADD_ENEMY_TO_LIST(INIT_VECTOR_2D(-5000, -5000), TWS_ENEMY_BOSS_WIZARD) BREAK ENDSWITCH ENDPROC // Far Background PROC TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_BACKGROUND_TILE_TYPE eType) sFarBackgroundTilesData[iCurrentFarBackgroundTileToAdd].eType = eType sFarBackgroundTilesData[iCurrentFarBackgroundTileToAdd].fSpriteWidth = cfBASE_SCREEN_WIDTH IF iCurrentFarBackgroundTileToAdd > 0 sFarBackgroundTilesData[iCurrentFarBackgroundTileToAdd].fSpritePos = sFarBackgroundTilesData[iCurrentFarBackgroundTileToAdd-1].fSpritePos + sFarBackgroundTilesData[iCurrentFarBackgroundTileToAdd-1].fSpriteWidth/2 + sFarBackgroundTilesData[iCurrentFarBackgroundTileToAdd].fSpriteWidth/2 ELSE sFarBackgroundTilesData[iCurrentFarBackgroundTileToAdd].fSpritePos = cfBASE_SCREEN_WIDTH/2 ENDIF iCurrentFarBackgroundTileToAdd++ ENDPROC // Far Background PROC TWS_INIT_FAR_BACKGROUND() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_FOREST_1) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_FOREST_2) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_FOREST_1) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_FOREST_1) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_FOREST_1) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_FOREST_1) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_FOREST_1) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_FOREST_1) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_FOREST_1) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_FOREST_1) BREAK CASE TWS_SWAMP TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_SWAMP) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_SWAMP) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_SWAMP) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_SWAMP) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_SWAMP) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_SWAMP) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_SWAMP) BREAK CASE TWS_CAVES TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) TWS_ADD_FAR_BACKGROUND_TILE_TO_LIST(TWS_FBG_TL_CAVES) BREAK ENDSWITCH ENDPROC // Background PROC TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BACKGROUND_TILE_TYPE eType) sBackgroundTilesData[iCurrentBackgroundTileToAdd].eType = eType SWITCH sBackgroundTilesData[iCurrentBackgroundTileToAdd].eType CASE TWS_BG_TL_1_INTRO CASE TWS_BG_TL_1_BASE CASE TWS_BG_TL_1_CAVE CASE TWS_BG_TL_1_CLIFF CASE TWS_BG_TL_1_SPIDER CASE TWS_BG_TL_2_INTRO CASE TWS_BG_TL_2_BIG_TREE CASE TWS_BG_TL_2_TREES CASE TWS_BG_TL_2_DEAD_BODIES CASE TWS_BG_TL_3_INTRO CASE TWS_BG_TL_3_BIG_WINDOW CASE TWS_BG_TL_3_WINDOWS_OPEN CASE TWS_BG_TL_3_STATUES CASE TWS_BG_TL_3_DOOR_STAIRS CASE TWS_BG_TL_3_OUTRO CASE TWS_BG_TL_4_INTRO CASE TWS_BG_TL_4_INTRO_NPC CASE TWS_BG_TL_4_BIG_TREE CASE TWS_BG_TL_4_BIG_MUSHROOM CASE TWS_BG_TL_4_OPEN_BACK CASE TWS_BG_TL_4_TREES sBackgroundTilesData[iCurrentBackgroundTileToAdd].fSpriteWidth = cfTWS_BACKGROUND_TILE_WIDTH BREAK CASE TWS_BG_TL_1_BOSS CASE TWS_BG_TL_2_BOSS CASE TWS_BG_TL_4_BOSS CASE TWS_BG_TL_3_FINAL sBackgroundTilesData[iCurrentBackgroundTileToAdd].fSpriteWidth = cfTWS_BACKGROUND_BOSS_TILE_WIDTH BREAK CASE TWS_BG_TL_1_GEN_1 CASE TWS_BG_TL_1_GEN_2 CASE TWS_BG_TL_2_GEN_1 CASE TWS_BG_TL_2_GEN_2 CASE TWS_BG_TL_2_GEN_3 CASE TWS_BG_TL_3_GEN_1 CASE TWS_BG_TL_3_GEN_2 CASE TWS_BG_TL_4_GEN_1 CASE TWS_BG_TL_4_GEN_2 CASE TWS_BG_TL_4_GEN_3 sBackgroundTilesData[iCurrentBackgroundTileToAdd].fSpriteWidth = cfTWS_BACKGROUND_TILE_WIDTH/2 BREAK ENDSWITCH IF iCurrentBackgroundTileToAdd > 0 sBackgroundTilesData[iCurrentBackgroundTileToAdd].fSpritePos = sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpriteWidth/2 + sBackgroundTilesData[iCurrentBackgroundTileToAdd].fSpriteWidth/2 IF sBackgroundTilesData[iCurrentBackgroundTileToAdd].eType = TWS_BG_TL_1_BOSS OR sBackgroundTilesData[iCurrentBackgroundTileToAdd].eType = TWS_BG_TL_2_BOSS sBackgroundTilesData[iCurrentBackgroundTileToAdd].fSpritePos -= 209 ENDIF ELSE sBackgroundTilesData[iCurrentBackgroundTileToAdd].fSpritePos = cfBASE_SCREEN_WIDTH/2 ENDIF iCurrentBackgroundTileToAdd++ ENDPROC PROC TWS_INIT_BACKGROUND() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST_INTRO TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_INTRO_NPC) BREAK CASE TWS_FOREST TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_INTRO) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_BIG_MUSHROOM) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_GEN_1) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_GEN_2) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_OPEN_BACK) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_GEN_3) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_TREES) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_BIG_TREE) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_OPEN_BACK) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_TREES) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_BIG_MUSHROOM) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_4_BOSS) BREAK CASE TWS_SWAMP TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_INTRO) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_GEN_1) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_BIG_TREE) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_GEN_2) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_DEAD_BODIES) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_GEN_3) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_BIG_TREE) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_GEN_1) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_GEN_2) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_DEAD_BODIES) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_GEN_3) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_TREES) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_2_BOSS) BREAK CASE TWS_CAVES TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_INTRO) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_BASE) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_CAVE) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_BASE) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_CLIFF) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_SPIDER) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_BASE) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_CAVE) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_CLIFF) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_SPIDER) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_BASE) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_CAVE) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_1_BOSS) BREAK CASE TWS_CASTLE TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_INTRO) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_WINDOWS_OPEN) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_GEN_1) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_BIG_WINDOW) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_GEN_2) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_DOOR_STAIRS) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_GEN_2) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_STATUES) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_WINDOWS_OPEN) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_GEN_1) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_BIG_WINDOW) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_DOOR_STAIRS) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_STATUES) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_WINDOWS_OPEN) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_OUTRO) TWS_ADD_BACKGROUND_TILE_TO_LIST(TWS_BG_TL_3_FINAL) BREAK ENDSWITCH ENDPROC // Foreground PROC TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FOREGROUND_TILE_TYPE eType, VECTOR_2D vPos) sForegroundTilesData[iCurrentForegroundTileToAdd].eType = eType sForegroundTilesData[iCurrentForegroundTileToAdd].vSpritePos = vPos SWITCH sForegroundTilesData[iCurrentForegroundTileToAdd].eType CASE TWS_FG_TL_1_INTRO sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_INTRO_1_WIDTH, cfTWS_FG_INTRO_1_HEIGHT) BREAK CASE TWS_FG_TL_1_COL1 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_COL1_WIDTH, cfTWS_FG_COL1_HEIGHT) BREAK CASE TWS_FG_TL_1_COL2 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_COL2_WIDTH, cfTWS_FG_COL2_HEIGHT) BREAK CASE TWS_FG_TL_1_STALAGMITE1 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_STALAGMITE1_WIDTH, cfTWS_FG_STALAGMITE1_HEIGHT) BREAK CASE TWS_FG_TL_1_STALAGMITE2 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_STALAGMITE2_WIDTH, cfTWS_FG_STALAGMITE2_HEIGHT) BREAK CASE TWS_FG_TL_1_STALAGMITE3 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_STALAGMITE3_WIDTH, cfTWS_FG_STALAGMITE3_HEIGHT) BREAK CASE TWS_FG_TL_1_BOSS sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_BOSS_WIDTH, cfTWS_FG_BOSS_HEIGHT) BREAK CASE TWS_FG_TL_2_GRASS sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_SWAMP_GRASS_WIDTH, cfTWS_FG_SWAMP_GRASS_WIDTH) BREAK CASE TWS_FG_TL_2_PIKE sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_PIKES_WIDTH, cfTWS_FG_PIKES_HEIGHT) BREAK CASE TWS_FG_TL_2_ROOT sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_ROOT_WIDTH, cfTWS_FG_ROOT_HEIGHT) BREAK CASE TWS_FG_TL_2_VINES_1 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_VINES_1_WIDTH, cfTWS_FG_VINES_1_HEIGHT) BREAK CASE TWS_FG_TL_2_VINES_2 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_VINES_2_WIDTH, cfTWS_FG_VINES_2_HEIGHT) BREAK CASE TWS_FG_TL_2_VINES_3 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_VINES_3_WIDTH, cfTWS_FG_VINES_3_HEIGHT) BREAK CASE TWS_FG_TL_3_INTRO sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_INTRO_3_WIDTH, cfTWS_FG_INTRO_3_HEIGHT) BREAK CASE TWS_FG_TL_3_GARGOYLE_1 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_GARGOYLE_1_WIDTH, cfTWS_FG_GARGOYLE_1_HEIGHT) BREAK CASE TWS_FG_TL_3_GARGOYLE_2 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_GARGOYLE_2_WIDTH, cfTWS_FG_GARGOYLE_2_HEIGHT) BREAK CASE TWS_FG_TL_3_COLUMN sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_CASTLE_COLUMN_WIDTH, cfTWS_FG_CASTLE_COLUMN_HEIGHT) BREAK CASE TWS_FG_TL_3_CANDLES_1 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_CANDLES_1_WIDTH, cfTWS_FG_CANDLES_1_HEIGHT) BREAK CASE TWS_FG_TL_3_CANDLES_2 sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_CANDLES_2_WIDTH, cfTWS_FG_CANDLES_2_HEIGHT) BREAK CASE TWS_FG_TL_4_BLUE_FLOWERS CASE TWS_FG_TL_4_YELLOW_FLOWERS CASE TWS_FG_TL_4_MUSHROOMS CASE TWS_FG_TL_4_SHORT_GRASS sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_FOREST_SHORT_GRASS_WIDTH, cfTWS_FG_FOREST_SHORT_GRASS_HEIGHT) BREAK CASE TWS_FG_TL_4_TALL_GRASS sForegroundTilesData[iCurrentForegroundTileToAdd].vSpriteSize = INIT_VECTOR_2D(cfTWS_FG_FOREST_TALL_GRASS_WIDTH, cfTWS_FG_FOREST_TALL_GRASS_HEIGHT) BREAK ENDSWITCH iCurrentForegroundTileToAdd++ ENDPROC PROC TWS_INIT_FOREGROUND() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_BLUE_FLOWERS, INIT_VECTOR_2D(2800, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_YELLOW_FLOWERS, INIT_VECTOR_2D(3500, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_SHORT_GRASS, INIT_VECTOR_2D(3500, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_SHORT_GRASS, INIT_VECTOR_2D(4600, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_BLUE_FLOWERS, INIT_VECTOR_2D(5200,910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_SHORT_GRASS, INIT_VECTOR_2D(6400, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_SHORT_GRASS, INIT_VECTOR_2D(8100, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_BLUE_FLOWERS, INIT_VECTOR_2D(8900,910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_SHORT_GRASS, INIT_VECTOR_2D(10000, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_MUSHROOMS, INIT_VECTOR_2D(12000,910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_BLUE_FLOWERS, INIT_VECTOR_2D(13400,910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_SHORT_GRASS, INIT_VECTOR_2D(15000, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_YELLOW_FLOWERS, INIT_VECTOR_2D(16200, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_4_SHORT_GRASS, INIT_VECTOR_2D(18150, 910)) BREAK CASE TWS_SWAMP TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_VINES_1, INIT_VECTOR_2D(2800, 250)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_VINES_2, INIT_VECTOR_2D(3500, 250)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_ROOT, INIT_VECTOR_2D(3500, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_PIKE, INIT_VECTOR_2D(4600, 960)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_VINES_2, INIT_VECTOR_2D(5200,250)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_ROOT, INIT_VECTOR_2D(6400, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_GRASS, INIT_VECTOR_2D(8100, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_VINES_3, INIT_VECTOR_2D(8900,250)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_PIKE, INIT_VECTOR_2D(10000, 960)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_VINES_3, INIT_VECTOR_2D(12000,250)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_VINES_1, INIT_VECTOR_2D(13400,250)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_GRASS, INIT_VECTOR_2D(15000, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_ROOT, INIT_VECTOR_2D(16200, 910)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_2_VINES_2, INIT_VECTOR_2D(18000, 250)) BREAK CASE TWS_CAVES TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL1, INIT_VECTOR_2D(2800,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL2, INIT_VECTOR_2D(3500,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_STALAGMITE1, INIT_VECTOR_2D(3500,cfBASE_SCREEN_HEIGHT)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL1, INIT_VECTOR_2D(4600,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_STALAGMITE2, INIT_VECTOR_2D(5200,cfBASE_SCREEN_HEIGHT)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL2, INIT_VECTOR_2D(6400,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL1, INIT_VECTOR_2D(8100,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL2, INIT_VECTOR_2D(8900,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_STALAGMITE1, INIT_VECTOR_2D(12000,cfBASE_SCREEN_HEIGHT)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL2, INIT_VECTOR_2D(13600,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_STALAGMITE3, INIT_VECTOR_2D(15000,cfBASE_SCREEN_HEIGHT)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL1, INIT_VECTOR_2D(16200,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL2, INIT_VECTOR_2D(18000,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_STALAGMITE2, INIT_VECTOR_2D(22200,cfBASE_SCREEN_HEIGHT)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL2, INIT_VECTOR_2D(24000,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL1, INIT_VECTOR_2D(26000,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL2, INIT_VECTOR_2D(27000,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL1, INIT_VECTOR_2D(28500,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_1_COL1, INIT_VECTOR_2D(32000,cfBASE_SCREEN_HEIGHT/2)) BREAK CASE TWS_CASTLE TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_INTRO, INIT_VECTOR_2D(194, 694)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_COLUMN, INIT_VECTOR_2D(3500, cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_CANDLES_1, INIT_VECTOR_2D(3500, 860)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_COLUMN, INIT_VECTOR_2D(4600, cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_GARGOYLE_1, INIT_VECTOR_2D(5200,820)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_COLUMN, INIT_VECTOR_2D(6400, cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_CANDLES_2, INIT_VECTOR_2D(8100, 860)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_COLUMN, INIT_VECTOR_2D(8900,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_GARGOYLE_2, INIT_VECTOR_2D(10000, 820)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_COLUMN, INIT_VECTOR_2D(12000,cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_CANDLES_1, INIT_VECTOR_2D(13400,860)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_COLUMN, INIT_VECTOR_2D(15000, cfBASE_SCREEN_HEIGHT/2)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_GARGOYLE_1, INIT_VECTOR_2D(16200, 820)) TWS_ADD_FOREGROUND_TILE_TO_LIST(TWS_FG_TL_3_COLUMN, INIT_VECTOR_2D(18000, cfBASE_SCREEN_HEIGHT/2)) BREAK ENDSWITCH ENDPROC PROC TWS_INIT_PLAY_VARIABLES() sTWSData.eLevelStage = TWS_LEVEL_PLAYING ENDPROC FUNC BOOL IS_LEVEL_UNLOCKED(TWS_LEVEL eLevel) SWITCH eLevel CASE TWS_FOREST CASE TWS_SWAMP CASE TWS_CAVES CASE TWS_CASTLE RETURN TRUE ENDSWITCH RETURN FALSE ENDFUNC PROC TWS_INIT_LEVEL_VARIABLES() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST_INTRO sTWSData.sCutsceneData.bShouldCutscenePlay = TRUE sTWSData.sCutsceneData.sCutsceneName = "story_intro" sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame = 0 sTWSData.sCutsceneData.iMaxCutsceneFrame = ciTWS_INTRO_CUTSCENE_SHOTS sTWSData.rgbaFade.iA = 255 sTWSData.bHUDIsHidden = TRUE BREAK CASE TWS_FOREST sTWSData.sCutsceneData.bShouldCutscenePlay = FALSE BREAK CASE TWS_SWAMP sTWSData.sCutsceneData.bShouldCutscenePlay = FALSE BREAK CASE TWS_CAVES sTWSData.sCutsceneData.bShouldCutscenePlay = FALSE BREAK CASE TWS_CASTLE sTWSData.sCutsceneData.sCutsceneName = "story_end" sTWSData.sCutsceneData.iSpriteCutsceneAnimFrame = 0 sTWSData.sCutsceneData.iMaxCutsceneFrame = ciTWS_OUTRO_CUTSCENE_SHOTS sTWSData.sCutsceneData.bShouldCutscenePlay = FALSE BREAK CASE TWS_CASTLE_OUTRO sTWSData.sCutsceneData.bShouldCutscenePlay = FALSE BREAK ENDSWITCH sTWSData.iGameTimer = GET_GAME_TIMER() sTWSData.bFadingOut = TRUE sTWSData.sTelemetry.level = (BOOL_TO_INT(sTWSData.bIsHardCoreMode)*4) + ENUM_TO_INT(sTWSData.eCurrentLevel) ENDPROC PROC TWS_RESET_ITEM_VARIABLES(INT iIndex) sItemData[iIndex].bIsActive = FALSE sItemData[iIndex].bFalling = FALSE sItemData[iIndex].bIsHit = FALSE sItemData[iIndex].eItemType = TWS_ITEM_HP_SMA sItemData[iIndex].vSpriteFallPos = INIT_VECTOR_2D(0.0,0.0) sItemData[iIndex].vSpritePos = INIT_VECTOR_2D(0.0,0.0) ENDPROC PROC TWS_RESET_ENEMY_VARIABLES(INT iIndex) sEnemyData[iIndex].bIsActive = FALSE sEnemyData[iIndex].bIsMoving = FALSE sEnemyData[iIndex].bIsAttacking = FALSE sEnemyData[iIndex].bIsHit = FALSE sEnemyData[iIndex].bIsFalling = FALSE sEnemyData[iIndex].bIsBattleEnemy = FALSE sEnemyData[iIndex].fHealth = 1.0 sEnemyData[iIndex].fProgressToTarget = 0.0 sEnemyData[iIndex].vShadowOffset.y = 0.0 sEnemyData[iIndex].vSpritePos = INIT_VECTOR_2D(0.0,0.0) sEnemyData[iIndex].vInitialPos = sEnemyData[iIndex].vSpritePos sEnemyData[iIndex].vTargetPos = sEnemyData[iIndex].vSpritePos CPRINTLN(DEBUG_MINIGAME, "Resetting enemy variables: ", iIndex) TWS_GET_NUMBER_OF_EMPTY_SLOTS_FOR_ENEMY() ENDPROC PROC TWS_RESET_PLAYER_VARIABLES(BOOL bFullReset = FALSE) sPlayerData.bIsMovingOutOfScreen = FALSE sPlayerData.bIsMovingToCenter = FALSE sPlayerData.bAttackIsDouble = FALSE sPlayerData.bIsUsingMagic = FALSE sPlayerData.bIsAttacking = FALSE sPlayerData.bIsCharging = FALSE sPlayerData.bIsEvolving = FALSE sPlayerData.bFacingLeft = FALSE sPlayerData.bIsFalling = FALSE sPlayerData.bIsMoving = FALSE sPlayerData.bIsHit = FALSE IF bFullReset sPlayerData.ePlayerState = TWS_INTRO sPlayerData.fHealth = 1.0 sPlayerData.fMagic = 0.0 sPlayerData.iLevel = 1 sPlayerData.iLastCharge = GET_GAME_TIMER() sPlayerData.bIsCameraShakeActive = FALSE ENDIF ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP) ENDPROC PROC TWS_RESET_PLAYER_SCORE() sPlayerData.iScore = 0 sPlayerData.iTreasures = 0 sPlayerData.iLifes = 3 ENDPROC PROC TWS_KILL_ALL_ENEMIES(BOOL bIncludeBoss = FALSE)//FLOAT fRange = 682.0) INT i FOR i = 0 TO ciTWS_MAX_ENEMIES -1 IF NOT bIncludeBoss AND sTWSData.iBossEnemyIndex != i sEnemyData[i].fHealth = 0.0 sEnemyData[i].bIsHit = TRUE ENDIF ENDFOR ENDPROC PROC TWS_RESET_BOSS_FIGHT() // TWS_KILL_ALL_ENEMIES() // sEnemyData[sTWSData.iBossEnemyIndex].fHealth = 1.0 sEnemyData[sTWSData.iBossEnemyIndex].bIsHit = FALSE // sEnemyData[sTWSData.iBossEnemyIndex].eEnemyState = TWS_ENEMY_INACTIVE // SWITCH sTWSData.eCurrentLevel // CASE TWS_FOREST // sEnemyData[sTWSData.iBossEnemyIndex].vSpritePos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, 550) // BREAK // CASE TWS_SWAMP // sEnemyData[sTWSData.iBossEnemyIndex].vSpritePos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + cfGAME_SCREEN_WIDTH*0.4, 690) // BREAK // CASE TWS_CAVES // sEnemyData[sTWSData.iBossEnemyIndex].vSpritePos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos, -300) // BREAK // CASE TWS_CASTLE // sEnemyData[sTWSData.iBossEnemyIndex].vSpritePos = INIT_VECTOR_2D(sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos, cfBASE_SCREEN_HEIGHT/3) // BREAK // ENDSWITCH ENDPROC PROC TWS_CLEANUP_VARIABLES() TWS_RESET_PLAYER_VARIABLES(TRUE) sTWSData.bFadingOut = FALSE sTWSData.bHUDIsHidden = FALSE sTWSData.eLevelStage = TWS_LEVEL_PLAYING INT i FOR i = 0 TO ciTWS_MAX_LOCKED_BATTLES -1 sTWSData.sLockedBattles[i].bActive = TRUE sTWSData.sLockedBattles[i].iEnemies = 0 sTWSData.sLockedBattles[i].iEnemySize = 0 sTWSData.sLockedBattles[1].bSpawnEnemies = TRUE ENDFOR FOR i = 0 TO ciTWS_MAX_ENEMIES -1 TWS_RESET_ENEMY_VARIABLES(i) ENDFOR iCurrentEnemyToAdd = 0 FOR i = 0 TO ciTWS_MAX_NPCS - 1 sNPCData[i].bIsActive = FALSE ENDFOR iCurrentNPCToAdd = 0 FOR i = 0 TO ciTWS_MAX_ITEMS - 1 sItemData[i].bIsActive = FALSE ENDFOR iCurrentItemToAdd = 0 iCurrentFarBackgroundTileToAdd = 0 iCurrentForegroundTileToAdd = 0 iCurrentBackgroundTileToAdd = 0 FOR i = 0 TO ciTWS_MAX_TRAPS - 1 sTrapsData[i].bIsActive = FALSE sTrapsData[i].bIsWorking = FALSE sTrapsData[i].eType = TWS_TRAP_FALL ENDFOR iCurrentTrapToAdd = 0 FOR i = 0 TO ciTWS_MAX_HUD_ELEMENTS - 1 sHUDData[i].bActive = FALSE sHUDData[i].bRendering = FALSE sHUDData[i].bPlayedSoundAttacked = FALSE ENDFOR iCurrentHUDItemToAdd = 0 FOR i = 0 TO ciTWS_MAX_FX - 1 sFXData[i].bActive = FALSE ENDFOR FOR i = 0 TO ciTWS_MAX_DRAW_CALLS-1 sTWSData.sDrawCalls[i].eType = TWS_ENTITY_DEFAULT sTWSData.sDrawCalls[i].iIndex = 0 sTWSData.sDrawCalls[i].fZIndex = -999 ENDFOR ENDPROC PROC TWS_INIT_NORMAL_MODE() TWS_RESET_PLAYER_SCORE() sTWSData.bIsHardCoreMode = FALSE sTWSData.eCurrentLevel = TWS_FOREST_INTRO ENDPROC PROC TWS_INIT_HARDCORE_MODE() TWS_RESET_PLAYER_SCORE() sTWSData.bIsHardCoreMode = TRUE sTWSData.eCurrentLevel = TWS_FOREST ENDPROC FUNC BOOL TWS_ARE_ENEMIES_IN_RANGE(FLOAT fRange = 682.0) INT i FOR i = 0 TO ciTWS_MAX_ENEMIES -1 IF sEnemyData[i].bIsActive AND sEnemyData[i].fHealth > 0.0 AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < fRange RETURN TRUE ENDIF ENDFOR RETURN FALSE ENDFUNC FUNC BOOL TWS_HAS_PLAYER_COMPLETED_NORMAL_MODE() RETURN sTWSData.bNormalModeIsCompleted ENDFUNC PROC TWS_FADE_OUT() sTWSData.bFadingOut = TRUE ENDPROC PROC TWS_FADE_IN(BOOL bFromBlack = FALSE) IF bFromBlack sTWSData.rgbaFade.iA = 255 ENDIF sTWSData.bFadingOut = FALSE ENDPROC FUNC BOOL TWS_IS_SCREEN_FADING_OUT() RETURN sTWSData.bFadingOut AND sTWSData.rgbaFade.iA < 255 ENDFUNC FUNC BOOL TWS_IS_SCREEN_FADING_IN() RETURN !sTWSData.bFadingOut AND sTWSData.rgbaFade.iA > 0 ENDFUNC FUNC BOOL TWS_IS_SCREEN_FADED_OUT() RETURN sTWSData.rgbaFade.iA >= 255 ENDFUNC FUNC BOOL TWS_IS_SCREEN_FADED_IN() RETURN sTWSData.rgbaFade.iA <= 0 ENDFUNC PROC TWS_ACTIVATE_CAMERA_SHAKE(BOOL bActivate) IF bActivate SET_CONTROL_SHAKE(FRONTEND_CONTROL, 100, 20) ENDIF sPlayerData.bIsCameraShakeActive = bActivate ENDPROC FUNC BOOL TWS_IS_CAMERA_SHAKE_ACTIVE() RETURN sPlayerData.bIsCameraShakeActive ENDFUNC FUNC VECTOR_2D TWS_GET_KNIGHT_DEATH_OFFSET(TWS_ENEMY_STATE eState) SWITCH eState CASE TWS_ENEMY_DYING_1 RETURN INIT_VECTOR_2D(0.0,0.0) CASE TWS_ENEMY_DYING_2 RETURN INIT_VECTOR_2D(0.0,28.0) CASE TWS_ENEMY_DYING_3 RETURN INIT_VECTOR_2D(0.0,28.0) CASE TWS_ENEMY_DYING_4 RETURN INIT_VECTOR_2D(25.0,38.0) CASE TWS_ENEMY_DYING_5 RETURN INIT_VECTOR_2D(26.0,43.0) CASE TWS_ENEMY_DYING_6 RETURN INIT_VECTOR_2D(40.0,42.0) CASE TWS_ENEMY_DYING_7 RETURN INIT_VECTOR_2D(86.0,53.0) CASE TWS_ENEMY_DYING_8 RETURN INIT_VECTOR_2D(122.0,74.0) CASE TWS_ENEMY_DEAD RETURN INIT_VECTOR_2D(132.0,98.0) ENDSWITCH RETURN INIT_VECTOR_2D(0.0,0.0) ENDFUNC FUNC BOOL TWS_IS_ENEMY_OF_TYPE_ON_SCREEN(TWS_ENEMY_TYPE eType) INT i FOR i = 0 TO ciTWS_MAX_ENEMIES-1 IF sEnemyData[i].bIsActive AND sEnemyData[i].eEnemyType = eType AND ABSF(sEnemyData[i].vSpritePos.X - sPlayerData.vSpritePos.x) < cfBASE_SCREEN_WIDTH/2 AND sEnemyData[i].eEnemyState != TWS_ENEMY_INVISIBLE RETURN TRUE ENDIF ENDFOR RETURN FALSE ENDFUNC FUNC BOOL TWS_IS_ANY_ENEMY_ON_SCREEN(BOOL bIsLockedScreen = FALSE) INT i IF bIsLockedScreen FOR i = 0 TO ciTWS_MAX_ENEMIES-1 IF sEnemyData[i].bIsActive AND ABSF(sEnemyData[i].vSpritePos.X - sTWSData.fLockedScreenPos) <= cfGAME_SCREEN_WIDTH/2 AND sEnemyData[i].eEnemyState != TWS_ENEMY_INVISIBLE RETURN TRUE ENDIF ENDFOR ELSE FOR i = 0 TO ciTWS_MAX_ENEMIES-1 IF sEnemyData[i].bIsActive AND ABSF(sEnemyData[i].vSpritePos.X - sPlayerData.vSpritePos.x) < cfGAME_SCREEN_WIDTH/2 AND sEnemyData[i].eEnemyState != TWS_ENEMY_INVISIBLE RETURN TRUE ENDIF ENDFOR ENDIF RETURN FALSE ENDFUNC FUNC BOOL TWS_IS_ENEMY_ON_SCREEN(INT i) RETURN sEnemyData[i].bIsActive AND ABSF(sEnemyData[i].vSpritePos.X - sPlayerData.vSpritePos.x) < cfBASE_SCREEN_WIDTH/2 AND sEnemyData[i].eEnemyState != TWS_ENEMY_INVISIBLE ENDFUNC FUNC BOOL TWS_IS_FX_ON_SCREEN(INT i) RETURN sEnemyData[i].bIsActive AND ABSF(sFXData[i].vSpritePos.X - sPlayerData.vSpritePos.x) < cfBASE_SCREEN_WIDTH/2 AND sFXData[i].bActive = TRUE ENDFUNC FUNC INT TWS_GET_CLOSEST_ENEMY() INT i, iEnemy = 0 FLOAT fClosestDistance = 99999.0 FOR i = 0 TO ciTWS_MAX_ENEMIES-1 IF sEnemyData[i].bIsActive AND VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) < fClosestDistance AND (sPlayerData.bFacingLeft AND sEnemyData[i].vSpritePos.x < sPlayerData.vSpritePos.x OR !sPlayerData.bFacingLeft AND sEnemyData[i].vSpritePos.x >= sPlayerData.vSpritePos.x) fClosestDistance = VECTOR_2D_DIST(sEnemyData[i].vSpritePos, sPlayerData.vSpritePos) iEnemy = i ENDIF ENDFOR RETURN iEnemy ENDFUNC FUNC BOOL TWS_HAS_BOSS_BATTLE_FINISHED() IF sEnemyData[sTWSData.iBossEnemyIndex].fHealth <= 0.0 AND sTWSData.eLevelStage = TWS_LEVEL_BOSS_FIGHT OR sTWSData.eLevelStage > TWS_LEVEL_BOSS_FIGHT RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL TWS_CAN_PLAYER_BE_HURT(BOOL bAllowDuringAttack = FALSE) IF bAllowDuringAttack IF sPlayerData.bIsFalling OR sPlayerData.bIsHit OR sPlayerData.bIsInvincible OR sPlayerData.bIsEvolving OR sPlayerData.bIsUsingMagic RETURN FALSE ENDIF ELSE IF sPlayerData.bIsAttacking OR sPlayerData.bIsCharging OR sPlayerData.bIsFalling OR sPlayerData.bIsHit OR sPlayerData.bIsInvincible OR sPlayerData.bIsEvolving OR sPlayerData.bIsUsingMagic RETURN FALSE ENDIF ENDIF RETURN TRUE ENDFUNC FUNC STRING TWS_ENEMY_TYPE_TO_STRING(TWS_ENEMY_TYPE eType) SWITCH eType CASE TWS_ENEMY_FAIRY RETURN "TWS_ENEMY_FAIRY" CASE TWS_ENEMY_SLIME RETURN "TWS_ENEMY_SLIME" CASE TWS_ENEMY_SPIDER RETURN "TWS_ENEMY_SPIDER" CASE TWS_ENEMY_BAT RETURN "TWS_ENEMY_BAT" CASE TWS_ENEMY_FAKE_WIZARD RETURN "TWS_ENEMY_FAKE_WIZARD" CASE TWS_ENEMY_GRUNT_CASTER RETURN "TWS_ENEMY_GRUNT_CASTER" CASE TWS_ENEMY_LEPRECHAUN RETURN "TWS_ENEMY_LEPRECHAUN" CASE TWS_ENEMY_BRUTE RETURN "TWS_ENEMY_BRUTE" CASE TWS_ENEMY_BOULDER RETURN "TWS_ENEMY_BOULDER" CASE TWS_ENEMY_BOSS_AMAZON RETURN "TWS_ENEMY_BOSS_AMAZON" CASE TWS_ENEMY_GRUNT RETURN "TWS_ENEMY_GRUNT" CASE TWS_ENEMY_SNAKE RETURN "TWS_ENEMY_SNAKE" CASE TWS_ENEMY_GRUNT_CROSSBOW RETURN "TWS_ENEMY_GRUNT_CROSSBOW" CASE TWS_ENEMY_GRUNT_SWORD RETURN "TWS_ENEMY_GRUNT_SWORD" CASE TWS_ENEMY_GRUNT_SPEAR RETURN "TWS_ENEMY_GRUNT_SPEAR" CASE TWS_ENEMY_GRUNT_FIRESPEAR RETURN "TWS_ENEMY_GRUNT_FIRESPEAR" CASE TWS_ENEMY_GRUNT_FIRESWORD RETURN "TWS_ENEMY_GRUNT_FIRESWORD" CASE TWS_ENEMY_KNIGHT RETURN "TWS_ENEMY_KNIGHT" CASE TWS_ENEMY_BRUTE_AXE RETURN "TWS_ENEMY_BRUTE_AXE" CASE TWS_ENEMY_BOSS_SPIDER RETURN "TWS_ENEMY_BOSS_SPIDER" CASE TWS_ENEMY_BOSS_WIZARD RETURN "TWS_ENEMY_BOSS_WIZARD" DEFAULT RETURN "UNKNOWN" ENDSWITCH ENDFUNC FUNC TWS_FX_TYPE TWS_GET_FX_HIT(BOOL bIsPlayer = TRUE, INT iIndex = 0) IF bIsPlayer SWITCH sEnemyData[iIndex].iEnemySize CASE 0 IF sPlayerData.iLevel < 3 RETURN TWS_FX_SMALL_HIT ELSE RETURN TWS_FX_LARGE_HIT ENDIF BREAK CASE 1 RETURN TWS_FX_LARGE_HIT CASE 2 RETURN TWS_FX_BLOOD_HIT CASE 3 RETURN TWS_FX_VENOM_HIT ENDSWITCH ELSE SWITCH sEnemyData[iIndex].eEnemyType CASE TWS_ENEMY_FAIRY CASE TWS_ENEMY_SLIME CASE TWS_ENEMY_SPIDER CASE TWS_ENEMY_BAT CASE TWS_ENEMY_FAKE_WIZARD CASE TWS_ENEMY_GRUNT_CASTER CASE TWS_ENEMY_LEPRECHAUN IF sPlayerData.iLevel < 3 RETURN TWS_FX_SMALL_HIT ELSE RETURN TWS_FX_LARGE_HIT ENDIF BREAK CASE TWS_ENEMY_BRUTE CASE TWS_ENEMY_BOULDER CASE TWS_ENEMY_BOSS_AMAZON CASE TWS_ENEMY_GRUNT RETURN TWS_FX_LARGE_HIT CASE TWS_ENEMY_SNAKE CASE TWS_ENEMY_GRUNT_CROSSBOW CASE TWS_ENEMY_GRUNT_SWORD CASE TWS_ENEMY_GRUNT_SPEAR CASE TWS_ENEMY_GRUNT_FIRESPEAR CASE TWS_ENEMY_GRUNT_FIRESWORD CASE TWS_ENEMY_KNIGHT CASE TWS_ENEMY_BRUTE_AXE CASE TWS_ENEMY_BOSS_KNIGHT RETURN TWS_FX_BLOOD_HIT CASE TWS_ENEMY_BOSS_SPIDER CASE TWS_ENEMY_BOSS_WIZARD RETURN TWS_FX_VENOM_HIT DEFAULT RETURN TWS_FX_LARGE_HIT ENDSWITCH ENDIF RETURN TWS_FX_SMALL_HIT ENDFUNC FUNC BOOL TWS_ENEMY_CAUSES_DAMAGE_ON_MOVEMENT(INT i) SWITCH sEnemyData[i].eEnemyType CASE TWS_ENEMY_SPIDER CASE TWS_ENEMY_BAT CASE TWS_ENEMY_FAIRY CASE TWS_ENEMY_SLIME CASE TWS_ENEMY_SNAKE CASE TWS_ENEMY_BOULDER RETURN TRUE DEFAULT RETURN FALSE ENDSWITCH ENDFUNC FUNC BOOL TWS_IS_ENEMY_SMALL(INT i) SWITCH sEnemyData[i].eEnemyType CASE TWS_ENEMY_SPIDER CASE TWS_ENEMY_SLIME CASE TWS_ENEMY_SNAKE RETURN TRUE DEFAULT RETURN FALSE ENDSWITCH ENDFUNC FUNC BOOL TWS_IS_NPC_CUTSCENE_LEVEL() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST_INTRO RETURN TRUE DEFAULT RETURN FALSE ENDSWITCH ENDFUNC FUNC BOOL TWS_SHOULD_DISPLAY_MAP_IN_THIS_LEVEL() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST_INTRO CASE TWS_CASTLE_OUTRO RETURN FALSE CASE TWS_FOREST CASE TWS_SWAMP CASE TWS_CAVES CASE TWS_CASTLE RETURN TRUE ENDSWITCH RETURN TRUE ENDFUNC FUNC STRING TWS_GET_MAP_SCREEN_TEXTURE() SWITCH sTWSData.eCurrentLevel CASE TWS_FOREST_INTRO CASE TWS_CASTLE_OUTRO RETURN "" CASE TWS_FOREST RETURN "world_map1" CASE TWS_SWAMP RETURN "world_map2" CASE TWS_CAVES RETURN "world_map3" CASE TWS_CASTLE RETURN "world_map4" ENDSWITCH RETURN "" ENDFUNC FUNC BOOL TWS_ENEMY_ATTACKS_WITH_PROJECTILE(INT i) SWITCH sEnemyData[i].eEnemyType CASE TWS_ENEMY_GRUNT_CASTER CASE TWS_ENEMY_GRUNT_CROSSBOW CASE TWS_ENEMY_LEPRECHAUN RETURN TRUE DEFAULT RETURN FALSE ENDSWITCH ENDFUNC FUNC BOOL TWS_SHOULD_ENEMY_BE_DRAWN(INT i) RETURN ABSF(sEnemyData[i].vSpritePos.X - sPlayerData.vSpritePos.x) < cfBASE_SCREEN_WIDTH AND sEnemyData[i].eEnemyState != TWS_ENEMY_INVISIBLE ENDFUNC FUNC BOOL TWS_IS_PLAYER_ON_CAMERA() RETURN sPlayerData.vSpritePos.x < (sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpritePos + sBackgroundTilesData[iCurrentBackgroundTileToAdd-1].fSpriteWidth + sPlayerData.vSpriteSize.x) ENDFUNC PROC TWS_CLEAN_UP_MOVIE(BINK_MOVIE_ID bmID) IF (bmID != NULL) STOP_BINK_MOVIE(bmID) RELEASE_BINK_MOVIE(bmID) ENDIF ENDPROC /// PURPOSE: /// Sets the bink movie asset for the video and starts playback PROC TWS_START_MOVIE(BINK_MOVIE_ID &bmID, STRING movieName) CDEBUG1LN(DEBUG_MINIGAME, "[Wizards Ruin] DG_START_MOVIE - Starting movie") bmID = SET_BINK_MOVIE(movieName) IF (bmID = NULL) CERRORLN(DEBUG_MINIGAME, "[Wizards Ruin] - Movie:", movieName, " does not exist") ENDIF PLAY_BINK_MOVIE(bmID) SET_BINK_SHOULD_SKIP(bmID, TRUE) SET_BINK_MOVIE_AUDIO_FRONTEND(bmID, TRUE) ENDPROC PROC TWS_REMOVE_DRAW_CALL(TWS_ENTITY_TYPE eType, INT iIndex) INT i FOR i = 0 TO ciTWS_MAX_DRAW_CALLS-1 IF sTWSData.sDrawCalls[i].eType = eType AND sTWSData.sDrawCalls[i].iIndex = iIndex sTWSData.sDrawCalls[i].eType = TWS_ENTITY_DEFAULT sTWSData.sDrawCalls[i].iIndex = 0 sTWSData.sDrawCalls[i].fZIndex = -999 CDEBUG2LN(DEBUG_MINIGAME, "TWS - Removing draw call for item ", iIndex, " of type ", ENUM_TO_INT(eType)) ENDIF ENDFOR ENDPROC PROC TWS_SWAP_DRAW_CALLS(INT iIndex1, INT iIndex2) INT iTMPIndex = sTWSData.sDrawCalls[iIndex2].iIndex TWS_ENTITY_TYPE eTMPType = sTWSData.sDrawCalls[iIndex2].eType FLOAT iTmpZIndex = sTWSData.sDrawCalls[iIndex2].fZIndex sTWSData.sDrawCalls[iIndex2].iIndex = sTWSData.sDrawCalls[iIndex1].iIndex sTWSData.sDrawCalls[iIndex2].eType = sTWSData.sDrawCalls[iIndex1].eType sTWSData.sDrawCalls[iIndex2].fZIndex = sTWSData.sDrawCalls[iIndex1].fZIndex sTWSData.sDrawCalls[iIndex1].iIndex = iTMPIndex sTWSData.sDrawCalls[iIndex1].eType = eTMPType sTWSData.sDrawCalls[iIndex1].fZIndex = iTmpZIndex ENDPROC FUNC INT TWS_PARTITION_QUICK_SORT(TWS_DRAW_CALL &sArray[], INT iLowIndex, INT iHighIndex) FLOAT fPivot = sArray[iHighIndex].fZIndex INT j, i = iLowIndex - 1 FOR j = iLowIndex TO iHighIndex - 1 IF sArray[j].fZIndex < fPivot i++ TWS_SWAP_DRAW_CALLS(i, j) ENDIF ENDFOR TWS_SWAP_DRAW_CALLS(i, iHighIndex) RETURN i+1 ENDFUNC PROC TWS_QUICK_SORT_ENTITIES(TWS_DRAW_CALL &sArray[], INT iLowIndex, INT iHighIndex) INT pi IF sArray[iLowIndex].fZIndex < sArray[iHighIndex].fZIndex pi = TWS_PARTITION_QUICK_SORT(sArray, iLowIndex, iHighIndex) TWS_QUICK_SORT_ENTITIES(sArray, iLowIndex, pi -1) TWS_QUICK_SORT_ENTITIES(sArray, pi +1, iHighIndex) ENDIF ENDPROC PROC TWS_UPDATE_Z_INDEXES() INT i FOR i = 0 TO ciTWS_MAX_DRAW_CALLS-1 SWITCH sTWSData.sDrawCalls[i].eType CASE TWS_ENTITY_ENEMY IF sEnemyData[sTWSData.sDrawCalls[i].iIndex].eEnemyType = TWS_ENEMY_BOSS_SPIDER sTWSData.sDrawCalls[i].fZIndex = sEnemyData[sTWSData.sDrawCalls[i].iIndex].vSpritePos.y + sEnemyData[sTWSData.sDrawCalls[i].iIndex].vSpriteSize.y/2 + sEnemyData[sTWSData.sDrawCalls[i].iIndex].vSpriteOffset.y ELSE sTWSData.sDrawCalls[i].fZIndex = sEnemyData[sTWSData.sDrawCalls[i].iIndex].vSpritePos.y + sEnemyData[sTWSData.sDrawCalls[i].iIndex].vSpriteSize.y + sEnemyData[sTWSData.sDrawCalls[i].iIndex].vSpriteOffset.y ENDIF BREAK CASE TWS_ENTITY_PLAYER IF sPlayerData.bIsJumping sTWSData.sDrawCalls[i].fZIndex = sPlayerData.vInitialJumpPos.y + sPlayerData.vSpriteSize.y + sEnemyData[sTWSData.sDrawCalls[i].iIndex].vSpriteOffset.y ELSE sTWSData.sDrawCalls[i].fZIndex = sPlayerData.vSpritePos.y + sPlayerData.vSpriteSize.y + sEnemyData[sTWSData.sDrawCalls[i].iIndex].vSpriteOffset.y ENDIF BREAK CASE TWS_ENTITY_FX IF sFXData[sTWSData.sDrawCalls[i].iIndex].fZIndex != 0.0 sTWSData.sDrawCalls[i].fZIndex = sFXData[sTWSData.sDrawCalls[i].iIndex].fZIndex ELSE sTWSData.sDrawCalls[i].fZIndex = sFXData[sTWSData.sDrawCalls[i].iIndex].vSpritePos.y + sFXData[sTWSData.sDrawCalls[i].iIndex].vSpriteSize.y ENDIF BREAK CASE TWS_ENTITY_TRAP IF sTrapsData[sTWSData.sDrawCalls[i].iIndex].eType = TWS_TRAP_HOLE OR sTrapsData[sTWSData.sDrawCalls[i].iIndex].eType = TWS_TRAP_STALAGTITE sTWSData.sDrawCalls[i].fZIndex = 0.0 ELSE sTWSData.sDrawCalls[i].fZIndex = sTrapsData[sTWSData.sDrawCalls[i].iIndex].vSpritePos.y + sTrapsData[sTWSData.sDrawCalls[i].iIndex].vSpriteSize.y ENDIF BREAK CASE TWS_ENTITY_ITEM sTWSData.sDrawCalls[i].fZIndex = sItemData[sTWSData.sDrawCalls[i].iIndex].vSpritePos.y + sItemData[sTWSData.sDrawCalls[i].iIndex].vSpriteSize.y BREAK CASE TWS_ENTITY_NPC sTWSData.sDrawCalls[i].fZIndex = - 100 BREAK ENDSWITCH ENDFOR ENDPROC PROC TWS_STOP_ALL_SOUND_LOOPS() ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_PLAYER_WALK_LOOP) ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_BOSS_SPIDER_CLIMB_LOOP) ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_FOREST) ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_SWAMP) ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_CAVES) ARCADE_GAMES_SOUND_STOP(ARCADE_GAMES_SOUND_TWR_AMBIENCE_LOOP_CASTLE) ENDPROC FUNC BOOL TWS_IS_PLAYER_USING_MAGIC() IF IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT) OR NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL) AND IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RUP) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL TWS_IS_ENEMY_HIT_OR_DEAD(INT i) IF sEnemyData[i].bIsHit OR sEnemyData[i].fHealth <= 0.0 RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL TWS_IS_ANY_ACCEPT_BUTTON_PRESSED() IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_SELECT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_RRIGHT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SCRIPT_SELECT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT) OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_SELECT) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL TWS_IS_CANCEL_BUTTON_PRESSED() IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC FLOAT TWS_GET_Z_WIDTH_FOR_ENEMY_TYPE(TWS_ENEMY_TYPE eType) SWITCH eType CASE TWS_ENEMY_BOSS_SPIDER RETURN 250.0 CASE TWS_ENEMY_BOSS_KNIGHT CASE TWS_ENEMY_KNIGHT CASE TWS_ENEMY_BRUTE_AXE CASE TWS_ENEMY_BRUTE RETURN 200.0 CASE TWS_ENEMY_LEPRECHAUN CASE TWS_ENEMY_FAIRY CASE TWS_ENEMY_GRUNT CASE TWS_ENEMY_GRUNT_SWORD CASE TWS_ENEMY_GRUNT_SPEAR CASE TWS_ENEMY_GRUNT_FIRESPEAR CASE TWS_ENEMY_GRUNT_FIRESWORD CASE TWS_ENEMY_GRUNT_CASTER CASE TWS_ENEMY_GRUNT_CROSSBOW CASE TWS_ENEMY_BAT RETURN 150.0 CASE TWS_ENEMY_SLIME CASE TWS_ENEMY_SPIDER CASE TWS_ENEMY_SNAKE RETURN 120.0 CASE TWS_ENEMY_BOSS_AMAZON RETURN 100.0 CASE TWS_ENEMY_BOULDER RETURN 50.0 ENDSWITCH RETURN 150.0 ENDFUNC PROC TWS_SPAWN_FALLING_ITEMS(VECTOR_2D vPos, TWS_ENEMY_TYPE eType) TWS_ITEM_TYPE eReward = TWS_ITEM_NONE INT iPoints = (4 - sPlayerData.iLevel) + BOOL_TO_INT(sTWSData.bIsHardCoreMode) SWITCH eType CASE TWS_ENEMY_FAIRY CASE TWS_ENEMY_BAT CASE TWS_ENEMY_LEPRECHAUN iPoints += 1 BREAK CASE TWS_ENEMY_SLIME CASE TWS_ENEMY_GRUNT_CROSSBOW CASE TWS_ENEMY_GRUNT_CASTER CASE TWS_ENEMY_GRUNT_SWORD CASE TWS_ENEMY_GRUNT_SPEAR CASE TWS_ENEMY_SNAKE CASE TWS_ENEMY_SPIDER iPoints += 2 BREAK CASE TWS_ENEMY_BRUTE_AXE CASE TWS_ENEMY_BRUTE CASE TWS_ENEMY_GRUNT iPoints += 3 BREAK CASE TWS_ENEMY_BOULDER CASE TWS_ENEMY_KNIGHT CASE TWS_ENEMY_GRUNT_FIRESPEAR CASE TWS_ENEMY_GRUNT_FIRESWORD iPoints += 4 BREAK CASE TWS_ENEMY_FAKE_WIZARD iPoints -= 4 BREAK ENDSWITCH IF iPoints >= 7 CPRINTLN(DEBUG_MINIGAME, "TWS - Spawning falling treasure: Gem. Points: ", iPoints) eReward = TWS_ITEM_GOLD_4 ELIF iPoints = 6 CPRINTLN(DEBUG_MINIGAME, "TWS - Spawning falling treasure: Goblet. Points: ", iPoints) eReward = TWS_ITEM_GOLD_3 ELIF iPoints = 5 CPRINTLN(DEBUG_MINIGAME, "TWS - Spawning falling treasure: Coin Pile. Points: ", iPoints) eReward = TWS_ITEM_GOLD_2 ELIF iPoints > 3 CPRINTLN(DEBUG_MINIGAME, "TWS - Spawning falling treasure: Coin Purse. Points: ", iPoints) eReward = TWS_ITEM_GOLD_1 ELSE CPRINTLN(DEBUG_MINIGAME, "TWS - Not spawning any treasure. Points: ", iPoints) ENDIF // TREASURE IF sTWSData.bLockedScreen AND sTWSData.eCurrentLevel = TWS_CAVES IF sPlayerData.bIsJumping vPos.y = sPlayerData.vInitialJumpPos.y + sPlayerData.vSpriteSize.y/2 ELSE vPos.y = sPlayerData.vSpritePos.y + sPlayerData.vSpriteSize.y/2 ENDIF IF (sPlayerData.iLifes > 1 AND GET_RANDOM_INT_IN_RANGE(0, 100) < 5) OR (sTWSData.eLevelStage = TWS_LEVEL_BOSS_FIGHT AND sPlayerData.fHealth <= 0.6 AND sPlayerData.iLifes = 1 AND GET_RANDOM_INT_IN_RANGE(0, 100) < 25) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(vPos.x + GET_RANDOM_FLOAT_IN_RANGE(-50.0, 50.0), vPos.y), eReward, TRUE) ENDIF TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(vPos.x + GET_RANDOM_FLOAT_IN_RANGE(-50.0, 50.0), vPos.y), eReward, TRUE) ELSE IF (sPlayerData.iLifes > 1 AND GET_RANDOM_INT_IN_RANGE(0, 100) < 5) OR (sTWSData.eLevelStage = TWS_LEVEL_BOSS_FIGHT AND sPlayerData.fHealth <= 0.6 AND sPlayerData.iLifes = 1 AND GET_RANDOM_INT_IN_RANGE(0, 100) < 25) TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(vPos.x + GET_RANDOM_FLOAT_IN_RANGE(-50.0, 50.0), vPos.y + GET_RANDOM_FLOAT_IN_RANGE(-50.0, 50.0)), eReward, TRUE) ENDIF TWS_ADD_ITEM_TO_LIST(INIT_VECTOR_2D(vPos.x + GET_RANDOM_FLOAT_IN_RANGE(-50.0, 50.0), vPos.y + GET_RANDOM_FLOAT_IN_RANGE(-50.0, 50.0)), eReward, TRUE) ENDIF // HEALTH AND MAGIC IF sTWSData.eLevelStage >= TWS_LEVEL_BOSS_FIGHT IF sPlayerData.fHealth < 0.5 IF GET_RANDOM_INT_IN_RANGE(0, 10) < 2 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_HP_SMA, TRUE) ENDIF ELIF sPlayerData.fHealth >= 0.5 IF GET_RANDOM_INT_IN_RANGE(0, 10) < 2 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_MP_SMA, TRUE) ENDIF ENDIF ELSE IF sPlayerData.fHealth < 0.25 IF GET_RANDOM_INT_IN_RANGE(0, 100) < 5 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_HP_LAR, TRUE) ELIF GET_RANDOM_INT_IN_RANGE(0, 100) < 35 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_HP_MED, TRUE) ELIF GET_RANDOM_INT_IN_RANGE(0, 100) < 40 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_MP_LAR, TRUE) ENDIF ELIF sPlayerData.fHealth < 0.5 IF GET_RANDOM_INT_IN_RANGE(0, 100) < 5 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_HP_MED, TRUE) ELIF GET_RANDOM_INT_IN_RANGE(0, 100) < 35 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_HP_SMA, TRUE) ELIF GET_RANDOM_INT_IN_RANGE(0, 100) < 40 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_MP_MED, TRUE) ENDIF ELIF sPlayerData.fHealth < 0.75 IF GET_RANDOM_INT_IN_RANGE(0, 100) < 5 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_MP_MED, TRUE) ELIF GET_RANDOM_INT_IN_RANGE(0, 100) < 25 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_MP_SMA, TRUE) ELIF GET_RANDOM_INT_IN_RANGE(0, 100) < 30 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_HP_SMA, TRUE) ENDIF ELSE IF GET_RANDOM_INT_IN_RANGE(0, 100) < 5 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_MP_SMA, TRUE) ELIF GET_RANDOM_INT_IN_RANGE(0, 100) < 15 TWS_ADD_ITEM_TO_LIST(vPos, TWS_ITEM_MP_SMA, TRUE) ENDIF ENDIF ENDIF ENDPROC FUNC INT TWS_GET_SCORE_BONUS_FOR_ENEMY_TYPE(TWS_ENEMY_TYPE eType) SWITCH eType CASE TWS_ENEMY_FAIRY CASE TWS_ENEMY_SLIME CASE TWS_ENEMY_SNAKE CASE TWS_ENEMY_SPIDER CASE TWS_ENEMY_BAT CASE TWS_ENEMY_FAKE_WIZARD RETURN 40 CASE TWS_ENEMY_GRUNT_CROSSBOW CASE TWS_ENEMY_GRUNT CASE TWS_ENEMY_GRUNT_SWORD CASE TWS_ENEMY_GRUNT_SPEAR CASE TWS_ENEMY_GRUNT_FIRESPEAR CASE TWS_ENEMY_GRUNT_FIRESWORD CASE TWS_ENEMY_GRUNT_CASTER CASE TWS_ENEMY_LEPRECHAUN RETURN 90 CASE TWS_ENEMY_KNIGHT CASE TWS_ENEMY_BRUTE_AXE CASE TWS_ENEMY_BRUTE RETURN 190 CASE TWS_ENEMY_BOULDER CASE TWS_ENEMY_BOSS_SPIDER CASE TWS_ENEMY_BOSS_KNIGHT CASE TWS_ENEMY_BOSS_AMAZON CASE TWS_ENEMY_BOSS_WIZARD RETURN 1000 ENDSWITCH RETURN 90 ENDFUNC FUNC INT TWS_GET_SCORE_BONUS_FOR_GOLD_TYPE(TWS_ITEM_TYPE eType) SWITCH eType CASE TWS_ITEM_GOLD_1 RETURN 1000 CASE TWS_ITEM_GOLD_2 RETURN 2000 CASE TWS_ITEM_GOLD_3 RETURN 4000 CASE TWS_ITEM_GOLD_4 RETURN 5000 ENDSWITCH RETURN 400 ENDFUNC FUNC FLOAT TWS_GET_PLAYER_SHADOW_X_OFFSET() IF sPlayerData.bFacingLeft RETURN - sPlayerData.fShadowXOffset ELSE RETURN sPlayerData.fShadowXOffset ENDIF ENDFUNC PROC TWS_MOVE_ENEMY(INT iEnemy, FLOAT fMoveIfHigherThan, FLOAT fSpeedRate = 1.0) IF VECTOR_2D_DIST(sEnemyData[iEnemy].vSpritePos, INIT_VECTOR_2D(sEnemyData[iEnemy].vSpritePos.x, sEnemyData[iEnemy].vTargetPos.Y)) > fMoveIfHigherThan AND sEnemyData[iEnemy].vTargetPos.y < sEnemyData[iEnemy].vSpritePos.y sEnemyData[iEnemy].vSpritePos.y = sEnemyData[iEnemy].vSpritePos.y -@ cfTWS_VERTICAL_MOVEMENT_ENEMY*fSpeedRate ELIF VECTOR_2D_DIST(sEnemyData[iEnemy].vSpritePos, INIT_VECTOR_2D(sEnemyData[iEnemy].vSpritePos.x, sEnemyData[iEnemy].vTargetPos.Y)) > fMoveIfHigherThan AND sEnemyData[iEnemy].vTargetPos.Y > sEnemyData[iEnemy].vSpritePos.Y sEnemyData[iEnemy].vSpritePos.y = sEnemyData[iEnemy].vSpritePos.y +@ cfTWS_VERTICAL_MOVEMENT_ENEMY*fSpeedRate ELIF VECTOR_2D_DIST(sEnemyData[iEnemy].vSpritePos, INIT_VECTOR_2D(sEnemyData[iEnemy].vTargetPos.x, sEnemyData[iEnemy].vSpritePos.Y)) > fMoveIfHigherThan AND sEnemyData[iEnemy].vTargetPos.X < sEnemyData[iEnemy].vSpritePos.X sEnemyData[iEnemy].vSpritePos.x = sEnemyData[iEnemy].vSpritePos.x -@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*fSpeedRate ELIF VECTOR_2D_DIST(sEnemyData[iEnemy].vSpritePos, INIT_VECTOR_2D(sEnemyData[iEnemy].vTargetPos.x, sEnemyData[iEnemy].vSpritePos.Y)) > fMoveIfHigherThan AND sEnemyData[iEnemy].vTargetPos.X > sEnemyData[iEnemy].vSpritePos.X sEnemyData[iEnemy].vSpritePos.x = sEnemyData[iEnemy].vSpritePos.x +@ cfTWS_HORIZONTAL_MOVEMENT_ENEMY*fSpeedRate ENDIF ENDPROC PROC TWS_ADD_SCORE_FOR_KILL(TWS_ENEMY_TYPE eEnemyType) sTWSData.sTelemetry.kills ++ sPlayerData.iScore += (TWS_GET_SCORE_BONUS_FOR_ENEMY_TYPE(eEnemyType) + 10*ENUM_TO_INT(sTWSData.eCurrentLevel)) + (30 - 10*sPlayerData.iLevel) IF sPlayerData.iScore > sPlayerData.iHighestScore sPlayerData.iHighestScore = sPlayerData.iScore ENDIF ENDPROC /// PURPOSE: /// Draws the movie and returns true when the intro movie has completed FUNC BOOL TWS_DRAW_MOVIE(BINK_MOVIE_ID bmID, FLOAT fRatioWidth, FLOAT fRatioHeight) DRAW_BINK_MOVIE(bmID, cfSCREEN_CENTER, cfSCREEN_CENTER, fRatioWidth, fRatioHeight, 0.0, 255, 255, 255, 255) IF GET_BINK_MOVIE_TIME(bmID) >= 99.0 CDEBUG1LN(DEBUG_MINIGAME, "[Wizards Ruin] DG_DRAW_MOVIE - Stopping and releasing movie") STOP_BINK_MOVIE(bmID) RELEASE_BINK_MOVIE(bmID) RETURN TRUE ENDIF RETURN FALSE ENDFUNC