Files
gtav-src/script/dev_ng/shared/include/public/wizard_arcade_using.sch
T
2025-09-29 00:52:08 +02:00

5263 lines
190 KiB
XML
Executable File

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