//* procs.c - main game ICSAL procedure definitions //* System library headers #include //* Application headers #include "main.h" #include "icsal.h" //* //* Killed enemy control procedures start here //* //* Enemy component explosion (works for both 'x' and '+' directions) int enemyExplode[] = { END_play_sfx, SFX_ENEMY_EXPLODE1, 68, 1, 127, set_data_start, 4,6,6,4,4,2,2,2,2,2,0,2,0,2,0,0,2,0,0,0, //* Upward movement 0,0,0,-2,0,0,-2,0,-2,0,-2,-2,-2,-2,-2,-4,-4,-6,-6,-4, //* Downward movement 4,2,0,0,-2,-4, //* Landing bounce DATA_END, add_sprite_rotation_degree, 20, add_ctrl_accelXY, add_sprite_rgb, -5, -5, -5, add_ctrl_high_data, END_handle_sprite_over_wall, loop_while_data, END_kill_sprite }; //* Enemy body explosion int bodyBang[] = { set_sprite_rgb, 159, 159, 159, END_set_sprite_texture_u, 0, add_sprite_rgb, 32, 32, 32, END_set_sprite_texture_u, 32, add_sprite_rgb, 32, 32, 32, END_set_sprite_texture_u, 64, add_sprite_rgb, 32, 32, 32, END_set_sprite_texture_u, 96, //* Explosion flashpoint frame add_sprite_rgb, -32, -32, -32, //* Start reducing brightness END_set_sprite_texture_u, 128, add_sprite_rgb, -32, -32, -32, END_set_sprite_texture_u, 160, add_sprite_rgb, -32, -32, -32, END_set_sprite_texture_u, 192, add_sprite_rgb, -32, -32, -32, END_set_sprite_texture_u, 224, END_add_sprite_rgb, -32, -32, -32, //* Decelerate brightness fade-out END_add_sprite_rgb, -20, -20, -20, set_ctrl_locks, LOCK_NOFRAMES, //* Fade-out explosion nucleus/corona set_loop_start, 14, END_add_sprite_rgb, -5, -5, -5, repeat_loop, END_kill_sprite //* sprite rgb=5 before being killed }; //* int rainbowDeathR[] = { play_sfx, SFX_EVAP, 60, 1, 127, set_loop_start, 7, add_sprite_rgb, -2, 0, 0, //add_ctrl_high,2, END_add_ctrl_accelXY, repeat_loop, set_loop_start, 57, add_ctrl_high,1, END_add_sprite_rgb, -2, 0, 0, repeat_loop, END_kill_sprite }; int rainbowDeathG[] = { set_loop_start, 7, add_sprite_rgb, 0, -2, 0, //add_ctrl_high,1, END_add_ctrl_accelXY, repeat_loop, set_loop_start, 57, add_ctrl_high,1, END_add_sprite_rgb, 0, -2, 0, repeat_loop, END_kill_sprite }; int rainbowDeathB[] = { set_loop_start, 7, add_sprite_rgb, 0, 0, -2, //add_ctrl_high,4, END_add_ctrl_accelXY, repeat_loop, set_loop_start, 57, add_ctrl_high,1, END_add_sprite_rgb, 0, 0, -2, repeat_loop, END_kill_sprite }; //* Mine explosion component proc (works for all 16 directions) int mineExplode[] = { END_do_nothing, //* Note: delay loop is hand initialized by preset sprites repeat_loop, //* Note: amount of data items MUST be divisible by 4! set_data_start, 4,6,6,4,4,2,2,2,2,2,0,2, 0,2,0,0,2,0,0,0, //* Upward movement 0,0,0,-2,0,0,-2,0,-2,0,-2,-2,-2,-2,-2,-4,-4,-6,-6,-4, //* Downward movement 4,2,0,0,-2,-4,0,0, //* Landing bounce DATA_END, add_sprite_rgb, -5, -5, -5, // set_sprite_texture_u, 0, add_ctrl_accelXY, add_ctrl_high_data, END_handle_sprite_over_wall, add_sprite_rgb, -5, -5, -5, // add_sprite_texture_u, 8, add_ctrl_accelXY, add_ctrl_high_data, END_handle_sprite_over_wall, add_sprite_rgb, -5, -5, -5, // add_sprite_texture_u, 8, add_ctrl_accelXY, add_ctrl_high_data, END_handle_sprite_over_wall, add_sprite_rgb, -5, -5, -5, // add_sprite_texture_u, 8, add_ctrl_accelXY, add_ctrl_high_data, END_handle_sprite_over_wall, loop_while_data, END_kill_sprite }; //* //* HUD box control procs //* //* For OSD message HUD box int messHudBlank[] = { set_loop_start, 30, //* Wait for final dummy to disappear END_do_nothing, repeat_loop, set_loop_start, 50, //* Open blank HUD box END_add_sprite_width, 2, repeat_loop, END_proc }; //* To close OSD message HUD box int messHudClose[] = { set_loop_start, 50, //* Close blank HUD box END_add_sprite_width, -2, repeat_loop, END_proc }; //* For OSD message HUD text int messHudText[] = { set_loop_start, 30+50, //* Wait for box to open END_do_nothing, repeat_loop, set_loop_start, 16, //* Display text 1 char at a time play_sfx, SFX_GUN_NORMAL, 96, 0, 100, END_add_sprite_width, 6, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, repeat_loop, set_loop_start, INFINITE_LOOP, //* Flash message play_sfx, SFX_COMPUTER, 64, 0, 100, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, set_sprite_attr_display, A_DISPLAY_OFF, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, set_sprite_attr_display, A_DISPLAY_ON, repeat_loop, }; int rainbowDeathHUD[] = { set_data_start, 'R','A','I','N','B','O','W', 'D','E','A','T','H', DATA_END, REP_update_HUD_box, REP_close_HUD_box }; int fruitDropHUD[] = { set_data_start, 'F','R','U','I','T','-', 'D','R','O','P','S', DATA_END, REP_update_HUD_box, REP_close_HUD_box }; //* For range selection HUD int rangeHUD[] = { REP_update_range_HUD, REP_close_range_HUD }; //* Dummy ICSAL proc for PolyCart sprite (not animated) int cartShow[] = { set_ctrl_locks, 0x20000000, //* Update once every .5 sec approx set_loop_start, INFINITE_LOOP, END_do_nothing, repeat_loop }; //* Proc to eject a spent PolyCart int cartEject[] = { handle_sprite_over_wall, set_data_start, 4,6,6,4,4,2,2,2,2,2,0,2,0,2,0,0,2,0,0,0, //* Upward movement 0,0,0,-2,0,0,-2,0,-2,0,-2,-2,-2,-2,-2,-4,-4,-6,-6, //* Downward movement -8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8, //* Ensure enough data to reach floor! DATA_END, add_sprite_rotation_degree, 20, add_ctrl_accelXY, add_ctrl_high_data, if_floor_hit_expire, END_handle_sprite_over_wall, loop_while_data //* Note: should never get here! }; //* //* Baby control procedures //* //* For lost, wandering babies int babyWander[] = { set_loop_start, INFINITE_LOOP, END_move_lost_baby, repeat_loop }; //* For collected, following babies int babyFollow[] = { set_loop_start, INFINITE_LOOP, END_move_following_baby, repeat_loop }; //* For collected baby's heart int babyHeart[] = { set_data_start, 2,0, 2,2, //* Add .wx and .high data pairs DATA_END, add_ctrl_wx_data, add_ctrl_high_data, END_handle_heart_over_wall, loop_while_data, add_sprite_texture_u, 16, set_data_start, -2,2, -3,0, -4,1, -3,1, -1,2, DATA_END, add_ctrl_wx_data, add_ctrl_high_data, END_handle_heart_over_wall, loop_while_data, add_sprite_texture_u, 16, set_data_start, 0,1, 1,2, 3,1, 4,1, 5,0, 4,1, 3,2, 2,1, 1,3, DATA_END, add_ctrl_wx_data, add_ctrl_high_data, END_handle_heart_over_wall, loop_while_data, add_sprite_texture_u, 16, set_data_start, -1,3, -2,1, -3,2, -4,1, -5,0, -6,0, -5,2, -4,2, -3,2, -1,2, DATA_END, add_ctrl_wx_data, add_ctrl_high_data, END_handle_heart_over_wall, loop_while_data, set_data_start, 0,3, 1,2, 3,2, 4,2, 5,2, 6,0, DATA_END, add_ctrl_wx_data, add_ctrl_high_data, END_handle_heart_over_wall, loop_while_data, play_sfx, SFX_DADA, 60, 1, 127, set_sprite_rgb, 64, 64, 64, set_ctrl_shadStat, 0, set_ctrl_isLight, 1, add_sprite_texture_u, 16, add_sprite_mx, 8, add_sprite_my, 8, END_set_sprite_attr_all, (A_BRIGHT_ON + A_4BIT_CLUT + A_ROTATE_ON + A_TRATE_2 + A_TRANS_ON + A_DISPLAY_ON), set_loop_start, 32, add_sprite_rgb, -2, -2, -2, add_sprite_scale_x, 512, END_add_sprite_scale_y, 512, repeat_loop, END_kill_sprite }; //* For baby when hit by enemy int babyCry[] = { set_loop_start, 5, //* Baby sits up and pauses END_do_nothing, repeat_loop, set_loop_start, 2, //* Remove dummy from mouth END_add_sprite_texture_u, 32, END_do_nothing, repeat_loop, set_ctrl_locks, 0x40082020, //* Blink 3 times set_loop_start, 3, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, -32, repeat_loop, play_sfx, SFX_BABY_HOWL, 60, 1, 127, set_ctrl_locks, LOCK_2FRAMES, //* Cry eyes out! //set_loop_start, 20, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, play_sfx, SFX_BABY_HOWL, 60, 1, 100, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, play_sfx, SFX_BABY_HOWL, 60, 1, 100, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, play_sfx, SFX_BABY_HOWL, 60, 1, 100, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_set_sprite_texture_u, 128, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, //repeat_loop, set_ctrl_locks, LOCK_3FRAMES, //* Put dummy back in mouth END_set_sprite_texture_u, 64, END_do_nothing, END_add_sprite_texture_u, -32, END_do_nothing, END_add_sprite_texture_u, -32, END_do_nothing, END_run_baby_wander //* Resume wandering about... }; //* POW! flash for when milk bottle or blitter beans are collected int babyPowflash[] = { set_loop_start, 10, update_powflash_xy, END_set_sprite_texture_u, 0, END_update_powflash_xy, END_update_powflash_xy, update_powflash_xy, END_add_sprite_texture_u, 32, END_update_powflash_xy, END_update_powflash_xy, repeat_loop, set_sprite_texture_u, 0, set_sprite_attr_transparency, A_TRANS_ON, set_sprite_attr_rotation, A_ROTATE_ON, add_sprite_mx, 16, add_sprite_my, 16, set_sprite_scale_xy, ONE*2, ONE*2, play_sfx, SFX_LEV_SCREEN, 72, 1, 127, set_loop_start, 36, add_sprite_scale_x, -227, add_sprite_scale_y, -227, update_powflash_xy, END_add_sprite_rotation_degree, 10, repeat_loop, END_kill_sprite }; //* Moves baby/BB to centre of TV int gotoTV[] = { set_loop_start, INFINITE_LOOP, END_move_centre_tv, repeat_loop }; //* For wandering decoy BB int decoyWander[] = { set_loop_start, INFINITE_LOOP, END_move_decoy_boy, repeat_loop, REP_close_decoy_boy }; //* To kill a decoy BB int killDecoy[] = { REP_close_decoy_boy }; //* //* Enemy control procedures start here //* //* For the chasing monsters int enemyChase[] = { //* Initialization code reuse_last_data, END_set_ctrl_unintICSAL, 0, //* Allow collision interruptions set_ctrl_moveCount, 1, //* Triggers immediate movement set_loop_start, INFINITE_LOOP, add_ctrl_high_data, END_move_chasing_enemy, loop_repeat_data }; //* For monsters created with add_enemy int enemyEnter[] = { //* Initialization code set_data_start, //* Note: this .high data is used for the entire 1,0,0,1,0,1,0,0,0,0, //* life of the sprite. This ensures consistency -1,0,-1,0,0,-1,0,0,0,0, //* even when changing between different procs DATA_END, END_set_ctrl_unintICSAL, 1, //* Make uniniterruptible by collision detection //* Move forward set_loop_start, 100, add_ctrl_high_data, END_move_enemy, loop_repeat_data, set_ctrl_unintICSAL, 0, //* Allow collision interruptions reuse_last_data, //* Ensure data pointer is valid //* Now start chasing set_ctrl_moveCount, 1, //* Triggers immediate movement set_loop_start, INFINITE_LOOP, add_ctrl_high_data, END_move_chasing_enemy, loop_repeat_data }; //* For a chasing ufo int ufoChase[] = { //* Initialization code END_set_ctrl_unintICSAL, 0, //* Allow collision interruptions set_ctrl_moveCount, 1, //* Triggers immediate movement set_loop_start, INFINITE_LOOP, END_move_chasing_ufo, repeat_loop }; //* For a mine laying ufo int ufoLayMine[] = { set_ctrl_unintICSAL, 1, //* Make uniniterruptible by collision detection set_loop_start, INFINITE_LOOP, END_move_mining_ufo, repeat_loop }; //* For a shot, crashing ufo int ufoCrash[] = { play_sfx, SFX_LEV_SCREEN, 84, 0, 127, set_data_start, 4,6,6,4,4,2,2,2,2,2,0,2,0,2,0,0,2,0,0,0, //* Upward movement 0,0,0,-2,0,0,-2,0,-2,0,-2,-2,-2,-2,-2,-4,-4,-6,-6, //* Downward movement -8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8,-8, //* Ensure enough data to reach floor! DATA_END, add_sprite_rotation_degree, 10, add_ctrl_high_data, set_ctrl_isLight, 1, set_sprite_rgb, 128,128,0, get_sprite_clut_xy, TIM_MASKCLUT, END_update_ufo_crash, add_sprite_rotation_degree, 10, add_ctrl_high_data, set_ctrl_isLight, 0, get_sprite_clut_xy, TIM_UFO, END_update_ufo_crash, loop_while_data //* Note: should never get here! }; //* For UFO created with add_enemy int ufoEnter[] = { //* Initialization code END_set_ctrl_unintICSAL, 1, //* Make uniniterruptible by collision detection //* Move forward set_loop_start, 100, END_move_ufo, repeat_loop, set_ctrl_unintICSAL, 0, //* Allow collision interruptions //* Now start chasing/laying mines set_ctrl_moveCount, 1, //* Triggers immediate movement set_loop_start, INFINITE_LOOP, END_move_chasing_ufo, repeat_loop }; //* For when two monsters bump into each other etc. int enemyBump[] = { reuse_last_data, set_loop_start, 60, add_ctrl_high_data, END_move_enemy, loop_repeat_data, set_ctrl_unintICSAL, 0, reuse_last_data, set_ctrl_moveCount, 1, //* Triggers immediate movement set_loop_start, INFINITE_LOOP, add_ctrl_high_data, END_move_chasing_enemy, loop_repeat_data }; //* For when two ufo's bump into each other etc. int ufoBump[] = { set_loop_start, 60, END_move_ufo, repeat_loop, set_ctrl_unintICSAL, 0, set_ctrl_moveCount, 1, //* Triggers immediate movement set_loop_start, INFINITE_LOOP, END_move_chasing_ufo, repeat_loop }; //* For when monster gets splatted by fruit int enemySplat[] = { END_do_nothing, END_do_nothing, set_sprite_attr_display, A_DISPLAY_ON, set_ctrl_shadStat, 1, set_loop_start, 19, // Wait for falling fruit END_do_nothing, repeat_loop, play_sfx, SFX_SPLAT, 60, 1, 127, set_sprite_attr_rotation, A_ROTATE_ON, //* Enable scaling set_sprite_rotation_xy, 0, 31, END_add_sprite_scale_y, -256, //* Squash monster flat END_add_sprite_scale_y, -1280, END_add_sprite_scale_y, -1280, set_sprite_rotation_xy, 16, 16, //* Spread out splatted monster add_sprite_texture_u, 32, set_ctrl_bbYOff, 31, set_ctrl_bbH, 1, set_ctrl_shadStat, 0, add_ctrl_wy, 10, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, set_ctrl_locks, 0x00808080, add_sprite_scale_x, 256, END_add_sprite_scale_y, 256, END_add_sprite_texture_u, 32, //* Shrink splash puddle END_add_sprite_texture_u, 32, END_kill_sprite }; //* For when UFO gets splatted by fruit int ufoSplat[] = { //play_sfx, SFX_LEV_SCREEN, 84, 0, 127, set_loop_start, 21, // Wait for falling fruit END_update_ufo_fall, repeat_loop, play_sfx, SFX_SPLAT, 60, 1, 127, set_sprite_rotation_xy, 0, 31, END_add_sprite_scale_y, -256, //* Squash monster flat END_add_sprite_scale_y, -1280, END_add_sprite_scale_y, -1280, set_sprite_rotation_xy, 16, 16, //* Spread out splatted monster change_sprite_tim, TIM_FRUIT_SPLAT, 0, get_sprite_clut_xy, TIM_UFO_CLUT, add_sprite_texture_u, 32, set_ctrl_bbYOff, 31, set_ctrl_bbH, 1, set_ctrl_shadStat, 0, add_ctrl_wy, 10, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, set_ctrl_locks, 0x00808080, add_sprite_scale_x, 256, END_add_sprite_scale_y, 256, END_add_sprite_texture_u, 32, //* Shrink splash puddle END_add_sprite_texture_u, 32, END_kill_sprite }; //* For when monster first gets hit by fruit drop bullet int enemyFlash[] = { END_do_nothing, END_do_nothing, END_kill_sprite }; //* For falling fruit int fruitFall[] = { play_sfx, SFX_FALL, 60, 1, 127, set_loop_start, 24, //* Fruit falls from height of 240 END_add_ctrl_high, -10, repeat_loop, set_sprite_attr_rotation, A_ROTATE_ON, //* Enable 'squash' scaling on landing set_sprite_rotation_xy, 16, 31, add_sprite_scale_x, 512, //* Fruit squashes flat... END_add_sprite_scale_y, -512, add_sprite_scale_x, 512, END_add_sprite_scale_y, -512, add_sprite_scale_x, 512, END_add_sprite_scale_y, -512, add_sprite_scale_x, 512, END_add_sprite_scale_y, -512, add_sprite_scale_x, -512, //* Fruit returns to normal shape... END_add_sprite_scale_y, 512, add_sprite_scale_x, -512, END_add_sprite_scale_y, 512, add_sprite_scale_x, -512, END_add_sprite_scale_y, 512, add_sprite_scale_x, -512, END_add_sprite_scale_y, 512, set_ctrl_shadStat, 1, //* Shadow on now it has landed set_ctrl_ID, ID_PICKUP, //* Make fruit collectable set_ctrl_locks, 0x00800800, //* Slow down to shrink fruit add_sprite_scale_x, -256, END_add_sprite_scale_y, -256, add_sprite_scale_x, -256, END_add_sprite_scale_y, -256, add_ctrl_shadBase, 1, add_sprite_scale_x, -256, END_add_sprite_scale_y, -256, add_sprite_scale_x, -256, END_add_sprite_scale_y, -256, add_ctrl_shadBase, 1, add_sprite_scale_x, -256, END_add_sprite_scale_y, -256, add_sprite_scale_x, -256, END_add_sprite_scale_y, -256, add_ctrl_shadBase, 1, add_sprite_scale_x, -256, END_add_sprite_scale_y, -256, add_sprite_scale_x, -256, END_add_sprite_scale_y, -256, set_ctrl_ID, ID_SOFT_ICSAL, //* Fruit is no longer collectable set_ctrl_locks, LOCK_3FRAMES, set_ctrl_shadStat, 0, set_sprite_attr_rotation, A_ROTATE_OFF, set_sprite_rotation_xy, 0, 0, END_change_sprite_tim, TIM_FDROP_SPLASH, 0, //* 0 for no clut change set_loop_start, 3, //* Fruit burst animation END_add_sprite_texture_u, 32, repeat_loop, END_kill_sprite }; //* Splash when fruit is collected int fruitSplash[] = { set_loop_start, 3, END_add_sprite_texture_u, 32, repeat_loop, END_kill_sprite }; //* //* Bullet control procedures start here //* //* Wavey bullet path int wbulletPath[] = { handle_sprite_over_wall, //* (keep this first!) set_ctrl_shadStat, 0, //* Dont show bullet & shadow for first END_set_sprite_attr_display, A_DISPLAY_OFF, //* 2 updates to prevent interference END_do_nothing, //* with gun smoke 'flash' frame set_ctrl_shadStat, 1, set_sprite_attr_display, A_DISPLAY_ON, //* Turn bullet & shadow back on start_bullet_blur, set_data_start, -3,-1,0,0,1,3,6,9, 9,6,3,1,0,0,-1,-3,-6,-9,-9,-6, DATA_END, set_loop_start, RANGE_LOOP, update_bullet_blur, add_ctrl_accelXY, add_ctrl_high_data, END_handle_sprite_over_wall, loop_repeat_data, END_expire_bullet }; //* Rainbow Death firing proc int rainDeathFire[] = { END_handle_sprite_over_wall, //* (keep this first!) // set_ctrl_shadStat, 0, //* Dont show bullet & shadow for first // END_set_sprite_attr_display, A_DISPLAY_OFF, //* 2 updates to prevent interference //END_play_sfx, SFX_GUN_RAINBOW, 60, 1, 127, //* with gun smoke 'flash' frame // set_ctrl_shadStat, 1, // set_sprite_attr_display, A_DISPLAY_ON, //* Turn bullet & shadow back on start_bullet_blur, set_data_start, 7,3,2,0,0,-2,-3,-10, 10,3,2,0,0,-2,-3,-10, 10,3,2,0,0,-2,-3,-10, 10,3,2,0,0,-2,-3,-10, 10,3,2,0,0,-2,-3,-10, //10,8,6,5,3,2,1,1,0,0,0,0,-1,-1,-2,-3,-5,-6,-8,-10, //5,3,2,1,1,1,1,0,1,0,0,0, //0,0,-1,0,-1,-1,-1,-1,-2,-3,-5, //8,4,3,2,2,1,1,1,0,1,0,0, //0,-1,0,-1,-1,-1,-2,-2,-3,-4,-8, DATA_END, set_loop_start, RANGE_LOOP, update_bullet_blur, add_ctrl_accelXY, add_ctrl_high_data, END_handle_sprite_over_wall, loop_repeat_data, END_expire_bullet }; //* Zig-zag bullet path int zbulletPath[] = { handle_sprite_over_wall, //* (keep this first!) set_ctrl_shadStat, 0, //* Dont show bullet & shadow for first END_set_sprite_attr_display, A_DISPLAY_OFF, //* 2 updates to prevent interference END_do_nothing, //* with gun smoke 'flash' frame set_ctrl_shadStat, 1, set_sprite_attr_display, A_DISPLAY_ON, //* Turn bullet & shadow back on start_bullet_blur, set_data_start, 8,8,8,8,4,-4,-8,-8,-8,-8,-4,4, DATA_END, set_loop_start, RANGE_LOOP, update_bullet_blur, add_ctrl_accelXY, add_ctrl_high_data, END_handle_sprite_over_wall, loop_repeat_data, END_expire_bullet }; //* Normal, straight bullet path int bulletPath[] = { handle_sprite_over_wall, //* (keep this first!) set_ctrl_shadStat, 0, //* Dont show bullet & shadow for first END_set_sprite_attr_display, A_DISPLAY_OFF, //* 2 updates to prevent interference END_do_nothing, set_ctrl_shadStat, 1, set_sprite_attr_display, A_DISPLAY_ON, //* Turn bullet & shadow back on start_bullet_blur, set_loop_start, RANGE_LOOP, update_bullet_blur, add_ctrl_accelXY, END_handle_sprite_over_wall, repeat_loop, END_expire_bullet }; //* 'Fruit Drop' bullet path int fdropPath[] = { start_bullet_blur, set_data_start, 2,-2,-2,2, DATA_END, set_loop_start, RANGE_LOOP, update_bullet_blur, add_ctrl_accelXY, add_ctrl_high_data, END_handle_sprite_over_wall, loop_repeat_data, END_expire_bullet }; //* Flash/gun smoke when bullet is fired int gunSmoke[] = { //* Initialization code //set_sprite_rgb, 200, 200, 200, //set_ctrl_shadStat, 1, //* Reflection on //set_ctrl_isLight, 1, //* Initial 'flash' frame is light-source //set_sprite_texture_u, 0, //play_sfx, SFX_GUN_NORMAL, 60, 1, 127, //* with gun smoke 'flash' frame END_handle_shadow_over_wall, //* 'flash' reflection management //* Main procedure set_sprite_rgb, 64, 64, 64, set_ctrl_shadStat, 0, //* Shadow off set_ctrl_locks, LOCK_NOFRAMES, add_ctrl_high, 4, add_sprite_texture_u, 16, set_loop_start, 4, END_add_ctrl_high, 2, repeat_loop, add_sprite_texture_u, 16, set_loop_start, 4, END_add_ctrl_high, 2, repeat_loop, add_sprite_texture_u, 16, set_loop_start, 3, END_add_ctrl_high, 2, repeat_loop, add_sprite_texture_u, 16, set_loop_start, 3, END_add_ctrl_high, 1, repeat_loop, add_sprite_texture_u, 16, set_loop_start, 2, END_add_ctrl_high, 1, repeat_loop, add_sprite_texture_u, 16, set_loop_start, 2, END_add_ctrl_high, 1, repeat_loop, END_kill_sprite }; //* For orbiting ball sprite int orbitBall[] = { //* Note: the pointers to this raw data (wx,wy offset pairs) is //* hand initialized from collide.c 0,1, 0,2, 0,4, 0,6, 0,8, 0,10, 0,12, 0,14, 0,16, 0,18, //* Down -1,1, -4,2, -6,3, -9,5, -11,6, -14,7, -16,8, -19,10, -21,11, -23,12, //* Down-left -3,0, -6,0, -9,0, -12,0, -15,0, -18,0, -21,0, -24,0, -27,0, -30,0, //* Left -1,-1, -4,-2, -6,-3, -9,-5, -11,-6, -14,-7, -16,-8, -19,-10, -21,-11, -23,-12, //* Up-left 0,-1, 0,-2, 0,-4, 0,-6, 0,-8, 0,-10, 0,-12, 0,-14, 0,-16, 0,-18, //* Up 1,-1, 4,-2, 6,-3, 9,-5, 11,-6, 14,-7, 16,-8, 19,-10, 21,-11, 23,-12, //* Up-right 3,0, 6,0, 9,0, 12,0, 15,0, 18,0, 21,0, 24,0, 27,0, 30,0, //* Right 1,1, 4,2, 6,3, 9,5, 11,6, 14,7, 16,8, 19,10, 21,11, 23,12, //* Down-right //* First, move ball out to orbit radius set_loop_start, 10, update_orbit, //* First, centre ball on BB add_ctrl_wx_data, //* then add wx offset add_ctrl_wy_data, //* and xy offset END_handle_sprite_over_wall, //* See if ball/shadow has hit a wall repeat_loop, //* Flash moons set_loop_start, 10, update_orbit, add_ctrl_accelXY, set_ctrl_isLight, 1, set_sprite_rgb, 128,128,128, get_sprite_clut_xy, TIM_MASKCLUT, END_handle_sprite_over_wall, update_orbit, add_ctrl_accelXY, set_ctrl_isLight, 0, get_sprite_clut_xy, TIM_MOONBALL, END_handle_sprite_over_wall, repeat_loop, goto_orbit, //* Jump to correct place in main loop below //* Continually move ball in elliptical orbit around Blitter Boy... //* Note: the 'set_loop_start INFINITE_LOOP' that should be //* here is hand initialized from within goto_orbit set_ctrl_dir, DIR_UP_RIGHT, //* Needed for handle_sprite_over_wall set_data_start, 30,0, 30,-1, 30,-3, 29,-4, 29,-6, //* wx,wy offset pairs for 1st quadrant 28,-7, 27,-8, 26,-9, 25,-10, 24,-11, DATA_END, update_orbit, //* First, centre ball on BB add_ctrl_wx_data, //* then add wx offset add_ctrl_wy_data, //* and wy offset END_handle_sprite_over_wall, //* See if ball/shadow has hit a wall loop_while_data, set_ctrl_dir, DIR_UP_RIGHT, //* Needed for handle_sprite_over_wall set_data_start, 23,-12, 22,-13, 20,-14, 18,-15, 16,-15, //* wx,wy offset pairs for 1st quadrant 14,-16, 12,-17, 9,-17, 6,-18, 3,-18, DATA_END, update_orbit, //* First, centre ball on BB add_ctrl_wx_data, //* then add wx offset add_ctrl_wy_data, //* and wy offset END_handle_sprite_over_wall, //* See if ball/shadow has hit a wall loop_while_data, set_ctrl_dir, DIR_UP_LEFT, set_data_start, 0,-18, -3,-18, -6,-18, -9,-17, -12,-17, //* wx,wy offset pairs for 2nd quadrant -14,-16, -16,-15, -18,-15, -20,-14, -22,-13, DATA_END, update_orbit, add_ctrl_wx_data, add_ctrl_wy_data, END_handle_sprite_over_wall, loop_while_data, set_ctrl_dir, DIR_UP_LEFT, set_data_start, -23,-12, -24,-11, -25,-10, -26,-9, -27,-8, -28,-7, -29,-6, -29,-4, -30,-3, -30,-1, DATA_END, update_orbit, add_ctrl_wx_data, add_ctrl_wy_data, END_handle_sprite_over_wall, loop_while_data, set_ctrl_dir, DIR_DOWN_LEFT, set_data_start, -30,0, -30,1, -30,3, -29,4, -29,6, //* wx,wy offset pairs for 3rd quadrant -28,7, -27,8, -26,9, -25,10, -24,11, DATA_END, update_orbit, add_ctrl_wx_data, add_ctrl_wy_data, END_handle_sprite_over_wall, loop_while_data, set_ctrl_dir, DIR_DOWN_LEFT, set_data_start, -23,12, -22,13, -20,14, -18,15, -16,15, -14,16, -12,17, -9,17, -6,18, -3,18, DATA_END, update_orbit, add_ctrl_wx_data, add_ctrl_wy_data, END_handle_sprite_over_wall, loop_while_data, set_ctrl_dir, DIR_DOWN_RIGHT, set_data_start, 0,18, 3,18, 6,18, 9,17, 12,17, //* wx,wy offset pairs for 4th quadrant 14,16, 16,15, 18,15, 20,14, 22,13, DATA_END, update_orbit, add_ctrl_wx_data, add_ctrl_wy_data, END_handle_sprite_over_wall, loop_while_data, set_ctrl_dir, DIR_DOWN_RIGHT, set_data_start, 23,12, 24,11, 25,10, 26,9, 27,8, 28,7, 29,6, 29,4, 30,3, 30,1, DATA_END, update_orbit, add_ctrl_wx_data, add_ctrl_wy_data, END_handle_sprite_over_wall, loop_while_data, repeat_loop }; //* Gun build-up when Fruit Drop is fired int fdropBuildup[] = { update_fdrop_buildUp, 1, //* 1st build-up frame END_handle_shadow_over_wall, update_fdrop_buildUp, 1, END_handle_shadow_over_wall, update_fdrop_buildUp, 2, //* 2nd build-up frame END_handle_shadow_over_wall, update_fdrop_buildUp, 2, END_handle_shadow_over_wall, update_fdrop_buildUp, 3, //* 3rd build-up frame END_handle_shadow_over_wall, update_fdrop_buildUp, 3, END_handle_shadow_over_wall, update_fdrop_buildUp, 4, //* 4th (final) build-up frame END_handle_shadow_over_wall, update_fdrop_buildUp, 4, END_handle_shadow_over_wall, update_fdrop_buildUp, 0, //* Signal to create actual bullet sprite END_kill_sprite }; //* Procedure for when bullet hits wall or reaches end of range int bulletExpire[] = { set_loop_start, 7, END_add_sprite_texture_u, 16, repeat_loop, END_kill_sprite }; //* Blitter Boy's jump int boyJump[] = { play_sfx, SFX_GUN_RAINBOW, 48, 0, 127, set_data_start, 2,3,3,2,2,1,1,1,1,1,0,1,0,1,0,0,1,0,0,0, //* Upward movement 0,0,0,-1,0,0,-1,0,-1,0,-1,-1,-1,-1,-1,-2,-2,-3,-3,-2, //* Downward movement DATA_END, END_add_ctrl_high_data, loop_while_data, play_sfx, SFX_GUN_NORMAL, 96, 0, 127, set_data_start, 2,0,0,-2, //* Landing hop DATA_END, END_add_ctrl_high_data, loop_while_data, play_sfx, SFX_GUN_NORMAL, 96, 0, 80, check_landing_action, //* See if any actions were requested while in jump END_proc }; //* Procedure for when BB reaches TV centre at end of a level int boyLevEnd[] = { set_sprite_texture_u, 0, //* Centre BB on TV, facing down set_sprite_texture_v, 0, set_ctrl_wx, 241, set_ctrl_wy, 278, set_loop_start, 5*60, //* Wait while text displays END_do_nothing, repeat_loop, play_sfx, SFX_BONUS, 52, 0, 127, set_ctrl_frameCount, 1, //* Ensures immediate frame change set_ctrl_repsPerFrame, 2, //* in set_spin_frame set_data_start, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, //* Addition .high data 2,3,3,4,4,4,5,5,5,5,6,6,6,6,6, 7,7,7,7,7,7,8,8,8,8,8,8,8, DATA_END, set_spin_frame, END_add_ctrl_high_data, loop_while_data, END_beam }; //* Moves BB to TV when games is over int boyGameOver[] = { set_loop_start, INFINITE_LOOP, END_move_centre_tv, repeat_loop }; //* int turnOffTV[] = { REP_tv_off }; //* int turnOnTV[] = { REP_tv_on }; //* Spinning beam-up procedure for babies and Blitter Boy int beamMeUp[] = { play_sfx, SFX_BONUS, 52, 0, 127, set_ctrl_frameCount, 1, //* Ensures immediate frame change set_ctrl_repsPerFrame, 2, //* in set_spin_frame set_data_start, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 2,3,3,4,4,4,5,5,5,5,6,6,6,6,6, 7,7,7,7,7,7,8,8,8,8,8,8,8, DATA_END, set_spin_frame, END_add_ctrl_high_data, loop_while_data, END_beam }; //* Removes OSD dummy from display int dummyGo[] = { add_sprite_scale_x, 512*8, END_add_sprite_scale_y, 512*8, set_loop_start, 16, //add_sprite_rotation_degree, 10, add_sprite_scale_x, -512, END_add_sprite_scale_y, -512, repeat_loop, set_sprite_attr_display, A_DISPLAY_OFF, END_proc }; //* Flashes || on pause screen int flashPause[] = { set_loop_start, INFINITE_LOOP, END_add_sprite_width, -16, END_add_sprite_width, 16, repeat_loop }; //* Controls white noise fuzz sprites on pause screen int pauseFuzz[] = { set_data_start, // 1,-3,1,2,-1,-1,3,1,-2,-1, 2,-6,2,4,-2,-2,6,2,-4,-2, DATA_END, set_loop_start, INFINITE_LOOP, END_add_sprite_y_data, loop_repeat_data }; //* int coinSpin[] = { set_loop_start, INFINITE_LOOP, END_set_sprite_texture_u, 0, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, repeat_loop }; //* For coin sprite that emerges from exploded enemy int coinEnemy[] = { //* Note: coin has A_DISPLAY_OFF to start with set_loop_start, 12, //* Wait to display coin at right moment END_do_nothing, repeat_loop, set_sprite_attr_display, A_DISPLAY_ON, set_data_start, 4,6,6,4,4,2,2,2,2,2,0,2,0,2,0,0,2,0,0,0, //* Upward movement DATA_END, END_add_ctrl_high_data, loop_while_data, set_ctrl_shadStat, 1, set_data_start, 0,0,0,-2,0,0,-2,0,-2,0,-2,-2,-2,-2,-2,-4,-4,-6,-6,-4, //* Downward movement 4,2,0,0,-2,-4, //* Landing bounce DATA_END, END_add_ctrl_high_data, loop_while_data, set_ctrl_locks, LOCK_3FRAMES, set_loop_start, INFINITE_LOOP, END_set_sprite_texture_u, 0, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, repeat_loop }; //* For coin sprite that emerges from rainbow death enemy int coinEnemy2[] = { set_sprite_attr_display, A_DISPLAY_ON, set_ctrl_shadStat, 1, set_data_start, 4,6,6,4,4,2,2,2,2,2,0,2,0,2,0,0,2,0,0,0, //* Upward movement DATA_END, END_add_ctrl_high_data, loop_while_data, set_data_start, 0,0,0,-2,0,0,-2,0,-2,0,-2,-2,-2,-2,-2,-4,-4,-6,-6,-4, //* Downward movement 4,2,0,0,-2,-4, //* Landing bounce DATA_END, END_add_ctrl_high_data, loop_while_data, set_ctrl_locks, LOCK_3FRAMES, set_loop_start, INFINITE_LOOP, END_set_sprite_texture_u, 0, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, repeat_loop }; //* For flashing enemy mine //* Note: See add_mine in levman.c if altering this proc! int mineFlash[] = { set_loop_start, INFINITE_LOOP, END_set_sprite_texture_u, 0, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, add_ctrl_shadBase, -4, //* Change to large light reflection set_ctrl_isLight, 1, set_sprite_rgb, 128,128,128, END_add_sprite_texture_u, 16, add_ctrl_shadBase, 4, //* Change back to small shadow set_ctrl_isLight, 0, END_add_sprite_texture_u, -16, END_add_sprite_texture_u, -16, repeat_loop }; //* For piggy bonus int showBonus[] = { set_loop_start, 5, END_set_sprite_texture_u, 56, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, repeat_loop, set_ctrl_locks, LOCK_NOFRAMES, play_sfx, SFX_EVAP, 48, 0, 127, set_data_start, -1,0,-1,-2,-2,-3,-3,-4,-4,-5,-5, //* Slide out to left x coord data -6,-6,-7,-7,-8,-8,-9,-9,-10, -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -12,-12,-12,-12,-12,-12,-12,-16, -16,-16,-16,-16,-16,-16,-16,-16,-16,-16, DATA_END, add_ctrl_high, 4, END_add_ctrl_wx_data, loop_while_data, END_kill_sprite }; //* For bonus multiplier int showMulty[] = { set_loop_start, 5, END_set_sprite_texture_u, 56, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, END_add_sprite_texture_u, 32, repeat_loop, set_ctrl_locks, LOCK_NOFRAMES, set_data_start, 1,0,1,2,2,3,3,4,4,5,5, //* Slide out to right x coord data 6,6,7,7,8,8,9,9,10, 12,12,12,12,12,12,12,12,12,12, 12,12,12,12,12,12,12,16, 16,16,16,16,16,16,16,16,16,16, DATA_END, add_ctrl_high, -4, END_add_ctrl_wx_data, loop_while_data, END_kill_sprite }; //* For baby beam-up bonus int showBabyBonus[] = { set_loop_start, 5, add_ctrl_high, -1, END_set_sprite_texture_u, 56, END_add_ctrl_high, -1, END_add_ctrl_high, -1, END_add_ctrl_high, -1, add_ctrl_high, -1, END_add_sprite_texture_u, 32, END_add_ctrl_high, -1, END_add_ctrl_high, -1, END_add_ctrl_high, -1, add_ctrl_high, -1, END_add_sprite_texture_u, 32, END_add_ctrl_high, -1, END_add_ctrl_high, -1, END_add_ctrl_high, -1, add_ctrl_high, -1, END_add_sprite_texture_u, 32, END_add_ctrl_high, -1, END_add_ctrl_high, -1, END_add_ctrl_high, -1, repeat_loop, play_sfx, SFX_EVAP, 48, 0, 127, set_data_start, -1,0,-1,-2,-2,-3,-3,-4,-4,-5,-5, //* Slide out to left x coord data -6,-6,-7,-7,-8,-8,-9,-9,-10, -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -12,-12,-12,-12,-12,-12,-12,-16, -16,-16,-16,-16,-16,-16,-16,-16,-16,-16, DATA_END, add_ctrl_high, 8, END_add_ctrl_wx_data, loop_while_data, END_kill_sprite }; //* For baby beam-up bonus multiplier int showBabyMulty[] = { set_loop_start, 5, add_ctrl_high, -1, END_set_sprite_texture_u, 56, END_add_ctrl_high, -1, END_add_ctrl_high, -1, END_add_ctrl_high, -1, add_ctrl_high, -1, END_add_sprite_texture_u, 32, END_add_ctrl_high, -1, END_add_ctrl_high, -1, END_add_ctrl_high, -1, add_ctrl_high, -1, END_add_sprite_texture_u, 32, END_add_ctrl_high, -1, END_add_ctrl_high, -1, END_add_ctrl_high, -1, add_ctrl_high, -1, END_add_sprite_texture_u, 32, END_add_ctrl_high, -1, END_add_ctrl_high, -1, END_add_ctrl_high, -1, repeat_loop, set_ctrl_locks, LOCK_NOFRAMES, set_data_start, 1,0,1,2,2,3,3,4,4,5,5, //* Slide out to right x coord data 6,6,7,7,8,8,9,9,10, 12,12,12,12,12,12,12,12,12,12, 12,12,12,12,12,12,12,16, 16,16,16,16,16,16,16,16,16,16, DATA_END, add_ctrl_high, 8, END_add_ctrl_wx_data, loop_while_data, END_kill_sprite }; //* For fruit bonus and multiplier int showFRbonus[] = { play_sfx, SFX_SPIN_SCREEN, 72, 0, 127, set_loop_start, 32, add_ctrl_high, 2, add_sprite_rgb, -2, -2, -2, add_sprite_scale_x, 256, END_add_sprite_scale_y, 512, repeat_loop, END_kill_sprite }; //* Milk bottle pickup animation int animMilkbot[] = { set_loop_start, INFINITE_LOOP, set_ctrl_locks, 0x20000000, set_ctrl_high, 0, END_set_sprite_texture_u, 0, set_ctrl_locks, LOCK_5FRAMES, add_ctrl_high, 1, END_add_sprite_texture_u, 16, add_ctrl_high, 2, END_add_sprite_texture_u, 16, add_ctrl_high, -1, END_add_sprite_texture_u, 16, repeat_loop }; //* Blitter burger pickup animation int animBurger[] = { set_ctrl_locks, LOCK_5FRAMES, set_loop_start, INFINITE_LOOP, END_set_sprite_texture_u, 0, END_do_nothing, END_do_nothing, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_do_nothing, END_do_nothing, END_add_sprite_texture_u, -16, END_add_sprite_texture_u, -16, repeat_loop }; //* Piggy bank pickup animation int animPiggy[] = { set_ctrl_locks, LOCK_5FRAMES, set_loop_start, INFINITE_LOOP, END_set_sprite_texture_u, 0, END_do_nothing, END_do_nothing, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_do_nothing, END_add_sprite_texture_u, -16, END_add_sprite_texture_u, -16, repeat_loop }; //* Blitter Beans pickup animation int animBeans[] = { set_ctrl_locks, LOCK_5FRAMES, set_loop_start, INFINITE_LOOP, END_set_sprite_texture_u, 0, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_do_nothing, END_add_sprite_texture_u, -16, END_add_sprite_texture_u, -16, repeat_loop }; //* HoloBall pickup animation int animHoloBall[] = { set_data_start, 0,0,0,0, 1,0,0,1, 0,1,0,1, 1,0,1,0, 1,0,0,1, 0,0,0,0, -1,0,0,-1, 0,-1,0,-1, -1,0,-1,0, -1,0,0,-1, DATA_END, set_loop_start, INFINITE_LOOP, add_ctrl_high_data, END_set_sprite_texture_u, 0, END_add_sprite_texture_u, 16, add_ctrl_high_data, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, loop_repeat_data }; //* Battery pickup animation int animBattery[] = { set_ctrl_locks, 0x80808080, set_loop_start, INFINITE_LOOP, END_set_sprite_texture_u, 0, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, -16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, -16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, -16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, -16, END_add_sprite_texture_u, 16, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, repeat_loop }; //* Moon ring pickup animation int animOrbit[] = { set_ctrl_locks, LOCK_2FRAMES, set_data_start, 2,3,3,2,2,1,1,1,1,1,0,1,0,1,0,0,1,0,0,0, //* Upward movement 0,0,0,-1,0,0,-1,0,-1,0,-1,-1,-1,-1,-1,-2,-2,-3,-3,-2, //* Downward movement DATA_END, set_loop_start, INFINITE_LOOP, add_ctrl_high_data, END_set_sprite_texture_u, 0, add_ctrl_high_data, END_add_sprite_texture_u, 16, add_ctrl_high_data, END_add_sprite_texture_u, 16, add_ctrl_high_data, END_add_sprite_texture_u, 16, loop_repeat_data }; //* SURVIVE flag pickup animation int animFlag[] = { set_ctrl_locks, LOCK_5FRAMES, set_loop_start, INFINITE_LOOP, END_set_sprite_texture_u, 0, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, repeat_loop }; //* flag animation for debrief screen int animFlagD[] = { set_data_start, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, -31,31, DATA_END, set_loop_start, INFINITE_LOOP, reuse_last_data, set_sprite_texture_u, 0, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, repeat_loop }; //* Coin animation for level end screen int animCoinL[] = { END_do_nothing, //* Note: loop is hand initialized before calling! repeat_loop, set_data_start, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,-1, -39,39, DATA_END, //* First, fade-up scrolling coins set_loop_start, 4, add_sprite_rgb, 1, 1, 1, reuse_last_data, set_sprite_texture_u, 0, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, add_sprite_rgb, 1, 1, 1, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, repeat_loop, //* Scroll coins in infinite loop set_loop_start, INFINITE_LOOP, reuse_last_data, set_sprite_texture_u, 0, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_texture_u, 16, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, reuse_last_data, add_sprite_x_data, END_add_sprite_y_data, repeat_loop }; //* Full money bag animation int animMoneybag[] = { set_loop_start, 30, //* Flash for 1 second play_sfx, SFX_CART, 72, 0, 100, END_get_sprite_clut_xy, TIM_MASKCLUT, END_get_sprite_clut_xy, TIM_MONEYBAG, repeat_loop, play_sfx, SFX_BONUS, 76, 0, 127, reset_moneybag, END_proc }; //* Menu screen hand animation int animHand[] = { set_data_start, 0,0,0,0, 1,0,0,1, 0,1,0,1, 1,0,1,0, 1,0,0,1, 0,0,0,0, -1,0,0,-1, 0,-1,0,-1, -1,0,-1,0, -1,0,0,-1, DATA_END, set_loop_start, INFINITE_LOOP, END_add_sprite_x_data, loop_repeat_data }; //* //* Start of CentreText() sprite control procs //* //* LEVEL UP! text proc int textLevup[] = { END_do_nothing, //* Note: loop is hand initialized before calling! repeat_loop, set_data_start, //* Slide in from right x coord data -16,-12,-12,-12,-12,-12,-12,-12, //* Note: must add up to -320 -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_ctrl_wx_data, loop_while_data, set_loop_start, 5, set_data_start, 2,3,3,2,2,1,1,1,1,1,0,1,0,1,0,0,1,0,0,0, //* Upward movement 0,0,0,-1,0,0,-1,0,-1,0,-1,-1,-1,-1,-1,-2,-2,-3,-3,-2, //* Downward movement DATA_END, END_add_ctrl_high_data, loop_while_data, repeat_loop, END_proc }; //* AREA CLEARED text proc int textCleared[] = { END_do_nothing, //* Note: loop is hand initialized before calling! repeat_loop, set_data_start, //* Slide in from right x coord data -16,-12,-12,-12,-12,-12,-12,-12, //* Note: must add up to -320 -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_ctrl_wx_data, loop_while_data, END_proc }; //* Menu text entering from right int textOnMenuR[] = { set_loop_start, 60*2, END_do_nothing, //* Pause repeat_loop, set_data_start, //* Slide in from right x coord data -16,-12,-12,-12,-12,-12,-12,-12, //* Note: must add up to -320 -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_sprite_x_data, loop_while_data, END_proc }; //* Menu text entering from left int textOnMenuL[] = { set_loop_start, 60*2, END_do_nothing, //* Pause repeat_loop, set_data_start, //* Slide in from right x coord data 16,12,12,12,12,12,12,12, //* Note: must add up to -320 12,12,12,12,12,12,12,12,12,12, 10,9,9,8,8,7,7,6,6, 5,5,4,4,3,3,2,2,1,0,1, DATA_END, END_add_sprite_x_data, loop_while_data, END_proc }; //* For text entering from right int textFromR[] = { set_data_start, //* Slide in from right x coord data -16,-12,-12,-12,-12,-12,-12,-12, //* Note: must add up to -320 -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_sprite_x_data, loop_while_data, END_proc }; //* For text entering from left int textFromL[] = { set_data_start, //* Slide in from right x coord data 16,12,12,12,12,12,12,12, //* Note: must add up to -320 12,12,12,12,12,12,12,12,12,12, 10,9,9,8,8,7,7,6,6, 5,5,4,4,3,3,2,2,1,0,1, DATA_END, END_add_sprite_x_data, loop_while_data, END_proc }; //* For text entering from bottom int textSlideUp[] = { END_do_nothing, //* Note: loop is hand initialized before calling! repeat_loop, set_data_start, //* Slide in from bottom y coord data -8,-12, //* Note: must add up to -240 -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_sprite_y_data, loop_while_data, END_proc }; //* For text entering from right on high score screen int textOnHi[] = { END_do_nothing, //* Note: loop is hand initialized before calling! repeat_loop, set_data_start, //* Slide in from right x coord data -16,-12,-12,-12,-12,-12,-12,-12, //* Note: must add up to -320 -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_sprite_x_data, loop_while_data, set_loop_start, INFINITE_LOOP, END_add_sprite_rgb, 0,16,16, END_add_sprite_rgb, 0,16,16, END_add_sprite_rgb, 0,16,16, END_add_sprite_rgb, 0,16,16, END_add_sprite_rgb, 0,16,16, END_add_sprite_rgb, 0,16,16, END_add_sprite_rgb, 0,16,16, END_add_sprite_rgb, 0,16,16, END_add_sprite_rgb, 0,-16,-16, END_add_sprite_rgb, 0,-16,-16, END_add_sprite_rgb, 0,-16,-16, END_add_sprite_rgb, 0,-16,-16, END_add_sprite_rgb, 0,-16,-16, END_add_sprite_rgb, 0,-16,-16, END_add_sprite_rgb, 0,-16,-16, END_add_sprite_rgb, 0,-16,-16, repeat_loop }; //* For text on control screen int controlText[] = { END_do_nothing, //* Note: loop is hand initialized before calling! repeat_loop, set_data_start, //* Slide in from right x coord data -16,-12,-12,-12,-12,-12,-12,-12, //* Note: must add up to -320 -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_sprite_x_data, loop_while_data, END_proc }; //* GAME OVER! text proc int textGameOver[] = { set_data_start, //* Slide in from right x coord data -16,-12,-12,-12,-12,-12,-12,-12, //* Note: must add up to -320 -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_ctrl_wx_data, loop_while_data, END_do_nothing, //* Note: loop is hand initialized before calling! repeat_loop, set_loop_start, 5, set_data_start, 2,3,3,2,2,1,1,1,1,1,0,1,0,1,0,0,1,0,0,0, //* Upward movement 0,0,0,-1,0,0,-1,0,-1,0,-1,-1,-1,-1,-1,-2,-2,-3,-3,-2, //* Downward movement DATA_END, END_add_ctrl_high_data, loop_while_data, repeat_loop, END_proc }; //* GET READY! text proc int textGetReady[] = { set_data_start, //* Slide in from right x coord data -16,-12,-12,-12,-12,-12,-12,-12, //* Note: must add up to -320 -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_ctrl_wx_data, loop_while_data, set_loop_start, 3, //* Bounce 3 times set_data_start, 2,3,3,2,2,1,1,1,1,1,0,1,0,1,0,0,1,0,0,0, //* Upward movement 0,0,0,-1,0,0,-1,0,-1,0,-1,-1,-1,-1,-1,-2,-2,-3,-3,-2, //* Downward movement DATA_END, END_add_ctrl_high_data, loop_while_data, repeat_loop, set_data_start, -1,0,-1,-2,-2,-3,-3,-4,-4,-5,-5, //* Slide out to left x coord data -6,-6,-7,-7,-8,-8,-9,-9,-10, -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -12,-12,-12,-12,-12,-12,-12,-16, DATA_END, END_add_ctrl_wx_data, loop_while_data, END_kill_sprite }; //* LEVEL text proc int textLevel[] = { set_data_start, //* Slide in from right x coord data -16,-12,-12,-12,-12,-12,-12,-12, //* Note: must add up to -320 -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_ctrl_wx_data, loop_while_data, set_loop_start, 120, //* Wait END_do_nothing, repeat_loop, set_data_start, -1,0,-1,-2,-2,-3,-3,-4,-4,-5,-5, //* Slide out to left x coord data -6,-6,-7,-7,-8,-8,-9,-9,-10, -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -12,-12,-12,-12,-12,-12,-12,-16, DATA_END, END_add_ctrl_wx_data, loop_while_data, END_kill_sprite }; //* MISSION ABORTED text proc int textMissAb[] = { set_loop_start, 10, END_add_ctrl_high, -10, repeat_loop, set_data_start, 2,3,3,2,2,1,1,1,1,1,0,1,0,1,0,0,1,0,0,0, //* Upward movement 0,0,0,-1,0,0,-1,0,-1,0,-1,-1,-1,-1,-1,-2,-2,-3,-3,-2, //* Downward movement 2,0,0,-2, //* Landing hop DATA_END, END_add_ctrl_high_data, loop_while_data, END_proc }; //* GO! text proc int textGo[] = { set_loop_start, 60*3, END_do_nothing, repeat_loop, play_sfx, SFX_BUZZER, 60, 0, 127, set_ctrl_shadStat, 1, set_loop_start, 20, END_add_ctrl_high, -10, repeat_loop, set_data_start, 2,3,3,2,2,1,1,1,1,1,0,1,0,1,0,0,1,0,0,0, //* Upward movement 0,0,0,-1,0,0,-1,0,-1,0,-1,-1,-1,-1,-1,-2,-2,-3,-3,-2, //* Downward movement 2,0,0,-2, //* Landing hop DATA_END, END_add_ctrl_high_data, loop_while_data, set_loop_start, 90, END_add_ctrl_wy, 2, repeat_loop, END_kill_sprite }; //* For teletype text on debriefing screen int textType[] = { END_do_nothing, //* Note: loop is hand initialized before calling! repeat_loop, END_set_sprite_attr_display, A_DISPLAY_ON, //* Make char visible END_play_sfx, SFX_GUN_NORMAL, 96, 0, 127, END_proc }; //* //* Start of title screen ICSAL procedures //* //* For falling coins on title screen int coinFall[] = { set_loop_start, 10*60+30, END_do_nothing, repeat_loop, set_sprite_attr_display, A_DISPLAY_ON, //* Make coin visible set_loop_start, INFINITE_LOOP, END_update_coin_fall, repeat_loop }; //* For falling coins on title screen int coinFall2[] = { set_loop_start, 2*60+30, END_do_nothing, repeat_loop, set_loop_start, INFINITE_LOOP, END_update_coin_fall, repeat_loop }; //* For falling coins on control screen int coinFallC[] = { set_loop_start, INFINITE_LOOP, END_update_coin_fall, repeat_loop }; //* For falling coins on high score screen int coinFallH[] = { set_loop_start, 60, END_do_nothing, repeat_loop, set_loop_start, INFINITE_LOOP, END_update_coin_fall, repeat_loop }; //* For falling coins on enter high score screen int coinFallE[] = { set_loop_start, 120, END_do_nothing, repeat_loop, set_loop_start, INFINITE_LOOP, END_update_coin_fall, repeat_loop }; //* 'BLITTER BOY' title screen character control procedure int charFade[] = { set_sprite_attr_display, A_DISPLAY_ON, //* Make character visible set_data_start, 0,DATA_END, //* Infinite loop (data never used) set_sprite_rotation_degree, 0, set_sprite_rgb, 28, 28, 28, set_sprite_scale_xy, -4, -4, set_loop_start, 50, //* Scale up add_sprite_scale_x, 82, add_sprite_scale_y, 82, add_sprite_rotation_degree, -7, END_add_sprite_rgb, 2, 2, 2, repeat_loop, set_sprite_rotation_degree, 0, //* Final frame of full 360' rotation set_loop_start, 12*60-24, //* Wait. Note: this is EXACT timing END_do_nothing, //* to make charFade & textSlide proc repeat_loop, //* loops run at the same speed set_loop_start, 50, //* Scale down add_sprite_scale_x, -82, add_sprite_scale_y, -82, add_sprite_rotation_degree, 7, END_add_sprite_rgb, -2, -2, -2, repeat_loop, loop_while_data }; //* 'BLITTER BOY' menu screen character control procedure int charFade2[] = { set_sprite_attr_display, A_DISPLAY_ON, //* Make character visible set_sprite_rotation_degree, 0, set_sprite_rgb, 8, 8, 8, set_sprite_scale_xy, 6, 6, set_loop_start, 10, //* Scale up add_sprite_scale_x, 409, add_sprite_scale_y, 409, END_add_sprite_rgb, 12, 12, 12, repeat_loop, set_loop_start, 5, //* Over scale add_sprite_scale_x, 409, END_add_sprite_scale_y, 409, repeat_loop, play_sfx, SFX_ENEMY_EXPLODE1, 60, 0, 127, set_loop_start, 4, //* Scale down to normal add_sprite_rgb, -12, -12, -12, add_sprite_scale_x, -409, END_add_sprite_scale_y, -818, repeat_loop, set_sprite_height, 51, //* To get good char display! set_sprite_scale_xy, 4096, 2048, END_set_sprite_rgb, 68, 68, 68, set_ctrl_ID,0, //* Causes RGB priority! set_data_start, 0,DATA_END, //* Infinite loop (data never used) set_loop_start, 60, //* Scale up add_sprite_rgb, 1, 1, 1, add_sprite_scale_x, 25, END_add_sprite_scale_y, 25, repeat_loop, set_loop_start, 60, //* Scale down to normal add_sprite_rgb, -1, -1, -1, add_sprite_scale_x, -25, END_add_sprite_scale_y, -25, repeat_loop, loop_while_data }; //* To spin normal GREEN menu screen text sprites int menuSpin[] = { set_loop_start, 2, //* Scale up add_sprite_rgb, 56, 56, 56, END_add_sprite_scale_y, -2048, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 2, //* Scale up add_sprite_rgb, 0, 56, 0, END_add_sprite_scale_y, -2048, repeat_loop, set_loop_start, 2, //* Scale up add_sprite_rgb, 56, 56, 56, END_add_sprite_scale_y, 2048, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 2, //* Scale up add_sprite_rgb, 0, 56, 0, END_add_sprite_scale_y, 2048, repeat_loop, set_loop_start, 2, //* Scale up add_sprite_rgb, 56, 56, 56, END_add_sprite_scale_y, -2048, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 2, //* Scale up add_sprite_rgb, 0, 56, 0, END_add_sprite_scale_y, -2048, repeat_loop, set_loop_start, 2, //* Scale up add_sprite_rgb, 56, 56, 56, END_add_sprite_scale_y, 2048, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 2, //* Scale up add_sprite_rgb, 0, 56, 0, END_add_sprite_scale_y, 2048, repeat_loop, set_loop_start, 4, //* Scale up add_sprite_rgb, 28, 28, 28, END_add_sprite_scale_y, -1024, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 4, //* Scale up add_sprite_rgb, 0, 28, 0, END_add_sprite_scale_y, -1024, repeat_loop, set_loop_start, 4, //* Scale up add_sprite_rgb, 28, 28, 28, END_add_sprite_scale_y, 1024, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 4, //* Scale up add_sprite_rgb, 0, 28, 0, END_add_sprite_scale_y, 1024, repeat_loop, set_loop_start, 8, //* Scale up add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, -512, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 8, //* Scale up add_sprite_rgb, 0, 14, 0, END_add_sprite_scale_y, -512, repeat_loop, set_loop_start, 8, //* Scale up add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, 512, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 8, //* Scale up add_sprite_rgb, 0, 14, 0, END_add_sprite_scale_y, 512, repeat_loop, set_loop_start, 8, //* Scale up add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, -512, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 8, //* Scale up add_sprite_rgb, 0, 14, 0, END_add_sprite_scale_y, -512, repeat_loop, set_loop_start, 8, //* Scale up add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, 512, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 8, //* Scale up add_sprite_rgb, 0, 14, 0, END_add_sprite_scale_y, 512, repeat_loop, set_loop_start, 8, //* Scale up // END_do_nothing, // END_do_nothing, add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, -512, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 8, //* Scale up // END_do_nothing, END_do_nothing, add_sprite_rgb, 0, 14, 0, END_add_sprite_scale_y, -512, repeat_loop, set_loop_start, 8, //* Scale up // END_do_nothing, END_do_nothing, add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, 512, repeat_loop, set_sprite_rgb, 0,16,0, set_loop_start, 8, //* Scale up END_do_nothing, END_do_nothing, add_sprite_rgb, 0, 14, 0, END_add_sprite_scale_y, 512, repeat_loop, END_proc }; //* To spin BLUE pause screen text sprites int menuSpinB[] = { set_loop_start, 2, //* Scale up add_sprite_rgb, 56, 56, 56, END_add_sprite_scale_y, -2048, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 2, //* Scale up add_sprite_rgb, 0, 0, 56, END_add_sprite_scale_y, -2048, repeat_loop, set_loop_start, 2, //* Scale up add_sprite_rgb, 56, 56, 56, END_add_sprite_scale_y, 2048, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 2, //* Scale up add_sprite_rgb, 0, 0, 56, END_add_sprite_scale_y, 2048, repeat_loop, set_loop_start, 2, //* Scale up add_sprite_rgb, 56, 56, 56, END_add_sprite_scale_y, -2048, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 2, //* Scale up add_sprite_rgb, 0, 0, 56, END_add_sprite_scale_y, -2048, repeat_loop, set_loop_start, 2, //* Scale up add_sprite_rgb, 56, 56, 56, END_add_sprite_scale_y, 2048, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 2, //* Scale up add_sprite_rgb, 0, 0, 56, END_add_sprite_scale_y, 2048, repeat_loop, set_loop_start, 4, //* Scale up add_sprite_rgb, 28, 28, 28, END_add_sprite_scale_y, -1024, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 4, //* Scale up add_sprite_rgb, 0, 0, 28, END_add_sprite_scale_y, -1024, repeat_loop, set_loop_start, 4, //* Scale up add_sprite_rgb, 28, 28, 28, END_add_sprite_scale_y, 1024, repeat_loop, set_sprite_rgb, 0,28,16, set_loop_start, 4, //* Scale up add_sprite_rgb, 0, 0, 28, END_add_sprite_scale_y, 1024, repeat_loop, set_loop_start, 8, //* Scale up add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, -512, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 8, //* Scale up add_sprite_rgb, 0, 0, 14, END_add_sprite_scale_y, -512, repeat_loop, set_loop_start, 8, //* Scale up add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, 512, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 8, //* Scale up add_sprite_rgb, 0, 0, 14, END_add_sprite_scale_y, 512, repeat_loop, set_loop_start, 8, //* Scale up add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, -512, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 8, //* Scale up add_sprite_rgb, 0, 0, 14, END_add_sprite_scale_y, -512, repeat_loop, set_loop_start, 8, //* Scale up add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, 512, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 8, //* Scale up add_sprite_rgb, 0, 0, 14, END_add_sprite_scale_y, 512, repeat_loop, set_loop_start, 8, //* Scale up add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, -512, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 8, //* Scale up END_do_nothing, add_sprite_rgb, 0, 0, 14, END_add_sprite_scale_y, -512, repeat_loop, set_loop_start, 8, //* Scale up END_do_nothing, add_sprite_rgb, 14, 14, 14, END_add_sprite_scale_y, 512, repeat_loop, set_sprite_rgb, 0,0,16, set_loop_start, 8, //* Scale up END_do_nothing, END_do_nothing, add_sprite_rgb, 0, 0, 14, END_add_sprite_scale_y, 512, repeat_loop, END_proc }; //* Helmet lightning-bolt procedure int boltSpiral[] = { set_sprite_attr_display, A_DISPLAY_ON, //* Make bolt visible play_sfx, SFX_EVAP, 30, 0, 127, set_data_start, //* Lightning-bolt relative x,y coordinate pairs //* Start of loop 1 2,21, 5,21, 13,22, 13,16, 18,18, 34,19, 33,14, 31,5, 29,2, 28,-3, 24,-4, 29,-8, 26,-13, 24,-16, 17,-17, 13,-18, 9,-19, 6,-18, 2,-21, -2,-22, -9,-25, -17,-27, -21,-20, -24,-16, -24,-10, -24,-8, -22,-5, -17,-2, -18,-1, -23,2, -27,4, -30,9, -26,11, -20,16, -16,16, -11,17, -9,17, -3,15, -1,14, //* Start of loop 2 1,12, 6,20, 8,17, 11,15, 17,17, 19,14, 23,11, 24,8, 28,6, 28,1, 30,-3, 28,-6, 26,-9, 24,-13, 19,-13, 15,-15, 10,-16, 8,-18, 3,-15, 2,-12, -3,-11, -5,-13, -7,-15, -11,-13, -13,-11, -18,-11, -22,-11, -25,-7, -26,-3, -25, -1, -24,1, -25,5, -24,6, -20,9, -13,8, -14,10, -11,12, -9,12, -6,15, -2,17, //* Start of loop 3 2,12, 5,14, 8,12, 9,9, 10,10, 16,10, 17,8, 22,8, 25,5, 28,0, 23,0, 21,-3, 18,-4, 20,-8, 18,-10, 11,-9, 10,-9, 7,-10, 4,-13, 2,-13, -1,-10, -5,-11, -6,-13, -12,-13, -15,-11, -17,-10, -19,-8, -22,-6, -19,-2, -16,-1, -20,2, -20,4, -17,5, -14,7, -14,9, -9,9, -7,10, -5,8, -3,10, -1,9, //* Start of loop 4 2,8, 3,9, 7,11, 11,12, 11,8, 13,8, 15,5, 16,6, 18,2, 17,1, 16,0, 17,-2, 19,-5, 18,-7, 11,-9, 9,-7, 6,-7, 3,-7, 2,-7, 1,-7, 0,-7, -2,-7, -4,-8, -6,-9, -9,-7, -10,-7, -13,-7, -16,-4, -19,-4, -18,-1, -18,1, -16,3, -16,5, -15,6, -13,9, -8,8, -4,6, -4,6, -3,5, -2,6, 0,5, //* Start of loop 5 2,8, 4,6, 4,5, 6,4, 8,5, 11,5, 16,5, 19,3, 23,1, 23,-1, 15,-3, 14,-4, 11,-5, 9,-6, 6,-5, 4,-5, 3,-5, 2,-5, 0,-5, 0,-4, -2,-5, -4,-7, -7,-6, -9,-6, -11,-5, -14,-5, -15,-3, -14,-1, -15,-1, -14,1, -13,3, -12,3, -9,4, -7,5, -6,5, -4,4, -2,4, -2,5, 0,4, //* Start of loop 6 1,5, 1,5, 3,5, 5,5, 5,5, 7,4, 9,3, 11,3, 12,2, 14,1, 13,0, 12,-2, 12,-3, 12,-5, 10,-6, 5,-4, 5,-5, 3,-4, 2,-4, 1,-4, -1,-4, -2,-4, -3,-5, -4,-4, -7,-4, -8,-4, -9,-3, -10,-2, -9,-1, -10,0, -10,0, -10,1, -10,3, -9,3, -7,4, -6,4, -3,4, -2,3, -2,4, 0,4, 0,3, //* Start of loop 7 2,4, 2,4, 3,3, 4,4, 5,3, 6,3, 9,3, 10,1, 9,0, 10,0, 8,-1, 8,-3, 7,-3, 6,-3, 5,-3, 4,-4, 3,-3, 2,-4, 0,-3, 0,-3, -2,-4, -2,-4, -4,-4, -5,-3, -6,-3, -6,-2, -7,-2, -7,-1, -7,0, -8,0, -7,1, -7,3, -5,3, -5,3, -3,3, -3,4, -1,3, -1,3, -1,3, 0,3, //* Start of loop 8 1,3, 2,4, 3,3, 3,3, 5,3, 5,2, 4,1, 5,1, 5,0, 4,0, 6,-1, 5,-1, 5,-2, 4,-3, 3,-3, 3,-3, 2,-4, 1,-3, 0,-3, -1,-3, -1,-3, -2,-3, -2,-3, -3,-2, -3,-2, -4,-2, -4,-2, -7,-1, -7,0, -4,0, -4,1, -3,1, -3,2, -2,2, -2,2, -1,2, -1,3, -1,3, 0,2, //* Start of loop 9 0,3, 1,3, 1,3, 2,2, 3,2, 3,2, 3,1, 3,1, 4,1, 3,0, 3,0, 2,0, 2,-1, 2,-1, 2,-2, 2,-2, 1,-2, 0,-2, 0,-2, -1,-2, -1,-2, -2,-2, -2,-1, -2,-1, -2,0, -2,-1, -2,0, -2,0, -2,0, DATA_END, //add_sprite_rotation_degree, 1, add_sprite_scale_x, -30, add_sprite_scale_y, -30, add_sprite_x_data, END_add_sprite_y_data, loop_while_data, play_sfx, SFX_GUN_NORMAL, 70, 0, 127, END_proc }; //* Procedure to open/close helmet visor int visorMove[] = { play_sfx, SFX_EVAP, 70, 0, 127, set_loop_start, 11, //* Open visor END_add_sprite_y, -2, repeat_loop, set_loop_start, 2*60, //* Wait for winking to finish END_do_nothing, repeat_loop, play_sfx, SFX_EVAP, 70, 0, 127, set_loop_start, 11, //* Close visor END_add_sprite_y, 2, repeat_loop, END_proc }; //* Procedure to open helmet visor int visorOpen[] = { play_sfx, SFX_EVAP, 70, 0, 127, set_loop_start, 11, //* Open visor END_add_sprite_y, -2, repeat_loop, END_proc }; //* Procedure to show winking face int faceWink[] = { set_loop_start, 40, //* Wait for visor to open END_do_nothing, repeat_loop, play_sfx, SFX_GUN_RAINBOW, 70, 0, 127, END_set_sprite_attr_display, A_DISPLAY_ON, //* Show winking face set_loop_start, 1*60, //* Wait a short time END_do_nothing, repeat_loop, play_sfx, SFX_GUN_RAINBOW, 70, 0, 127, set_sprite_attr_display, A_DISPLAY_OFF, //* Stop winking END_proc }; //* Procedure to show blinking face int faceBlink[] = { set_loop_start, 40, //* Wait for visor to open END_do_nothing, repeat_loop, play_sfx, SFX_GUN_RAINBOW, 70, 0, 127, set_sprite_texture_u, 100, add_sprite_texture_v, -26, END_set_sprite_attr_display, A_DISPLAY_ON, //* Close eye set_loop_start, 60, //* Wait a short time END_do_nothing, repeat_loop, set_sprite_texture_u, 100, add_sprite_texture_v, 26, END_set_sprite_attr_display, A_DISPLAY_OFF, //* Open eye play_sfx, SFX_GUN_RAINBOW, 70, 0, 127, set_data_start, 0,DATA_END, set_loop_start, 40, //* Wait for visor to open END_do_nothing, repeat_loop, END_set_sprite_attr_display, A_DISPLAY_ON, //* Close eyes set_loop_start, 10, END_do_nothing, repeat_loop, set_sprite_attr_display, A_DISPLAY_OFF, //* Open eyes set_loop_start, 80, END_do_nothing, repeat_loop, END_set_sprite_attr_display, A_DISPLAY_ON, //* Close eyes set_loop_start, 6, END_do_nothing, repeat_loop, set_sprite_attr_display, A_DISPLAY_OFF, //* Open eyes set_loop_start, 20, END_do_nothing, repeat_loop, END_set_sprite_attr_display, A_DISPLAY_ON, //* Close eyes set_loop_start, 8, END_do_nothing, repeat_loop, set_sprite_attr_display, A_DISPLAY_OFF, //* Open eyes loop_while_data }; //* Procedure to slide text in/out of view int textSlide[] = { set_loop_start, INFINITE_LOOP, set_sprite_attr_display, A_DISPLAY_ON, //* Make character visible set_data_start, //* Slide in from right x coord data -16,-12,-12,-12,-12,-12,-12,-12, //* Note: must be 38 items and all -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, //* must add up to -320 -10,-9,-9,-8,-8,-7,-7,-6,-6, -5,-5,-4,-4,-3,-3,-2,-2,-1,0,-1, DATA_END, END_add_sprite_x_data, loop_while_data, END_set_ctrl_locks, 0x20000000, //* Slow ICSAL call to 1 every 30 vsyncs END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, set_ctrl_locks, 0xffffffff, //* ICSAL calls every vsync again set_data_start, -1,0,-1,-2,-2,-3,-3,-4,-4,-5,-5, //* Slide out to left x coord data -6,-6,-7,-7,-8,-8,-9,-9,-10, -12,-12,-12,-12,-12,-12,-12,-12,-12,-12, -12,-12,-12,-12,-12,-12,-12,-16, DATA_END, END_add_sprite_x_data, loop_while_data, add_sprite_x, 640, //* Reset x coord to right of screen set_sprite_attr_display, A_DISPLAY_OFF, //* Display off END_set_ctrl_locks, 0x20000000, //* Slow ICSAL call to 1 every 30 vsyncs END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, END_do_nothing, set_ctrl_locks, 0xffffffff, //* ICSAL calls every vsync again repeat_loop }; //* Procedure to alter VC logo int logoPly[] = { //set_sprite_rgb, 228, 228, 228, set_data_start, 0,DATA_END, //* Infinite loop (data never used) set_loop_start, 50, add_sprite_scale_y, 57, END_add_sprite_scale_x, -27, repeat_loop, END_do_nothing,//play_sfx, SFX_SPLAT, 40, 0, 127, END_do_nothing, set_loop_start, 50, add_sprite_scale_y, -57, END_add_sprite_scale_x, 27, repeat_loop, END_play_sfx, SFX_SPLAT, 36, 0, 127, END_do_nothing, loop_while_data }; //* Procedure to drop title screen helmet onto screen int helmetDrop[] = { set_data_start, 21, 25, 25, 25, 25, 25, //* Initial fall -20, -10, -8, -6, -3, -3, -2, -1, 0, -1, 0, 0, //* First bounce 0, 0, 1, 0, 1, 2, 3, 3, 6, 8, 10, 20, -8, -6, -3, -3, -2, -1, 0, -1, 0, 0, //* Second bounce 0, 1, 0, 1, 2, 3, 3, 6, 8, -3, -2, -1, 0, -1, 0, //* Third bounce 0, 1, 0, 1, 2, 3, -2, -1, 0, //* Fourth bounce 1, 2, DATA_END, END_add_sprite_y_data, loop_while_data, END_proc }; //* Procedure to drop title screen helmet onto screen int helmetDropSFX[] = { set_data_start, 21, 25, 25, 25, 25, 25, //* Initial fall DATA_END, END_add_sprite_y_data, loop_while_data, play_sfx, SFX_GUN_NORMAL, 60, 0, 127, set_data_start, -20, -10, -8, -6, -3, -3, -2, -1, 0, -1, 0, 0, //* First bounce 0, 0, 1, 0, 1, 2, 3, 3, 6, 8, 10, 20, DATA_END, END_add_sprite_y_data, loop_while_data, play_sfx, SFX_GUN_NORMAL, 60, 0, 100, set_data_start, -8, -6, -3, -3, -2, -1, 0, -1, 0, 0, //* Second bounce 0, 1, 0, 1, 2, 3, 3, 6, 8, DATA_END, END_add_sprite_y_data, loop_while_data, play_sfx, SFX_GUN_NORMAL, 60, 0, 64, set_data_start, -3, -2, -1, 0, -1, 0, //* Third bounce 0, 1, 0, 1, 2, 3, DATA_END, END_add_sprite_y_data, loop_while_data, play_sfx, SFX_GUN_NORMAL, 60, 0, 32, set_data_start, -2, -1, 0, //* Fourth bounce 1, 2, DATA_END, END_add_sprite_y_data, loop_while_data, play_sfx, SFX_GUN_NORMAL, 60, 0, 32, END_proc }; //* Procedure for falling helmet dust clouds int dustCloud[] = { set_sprite_attr_display, A_DISPLAY_ON, END_set_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_add_sprite_texture_u, 16, END_do_nothing, END_add_sprite_texture_u, 16, END_do_nothing, END_add_sprite_texture_u, 16, END_do_nothing, END_kill_sprite }; int helmetRock[] = { set_ctrl_locks, LOCK_2FRAMES, set_loop_start, INFINITE_LOOP, set_data_start, 2,4, 3,3, 4,1, 3,-1, 2,-2, 1,-2, 0,-2, 0,-1, -1,-1, -1,-1, -1,-1, -1,-1, -1,0, -2,0, -2,0, -2,1, -2,1, -2,2, -2,4, -3,3, -4,1, -3,-1, -2,-2, -1,-2, 0,-2, 0,-1, 1,-1, 1,-1, 1,-1, 1,-1, 1,0, 2,0, 2,0, 2,1, 2,1, 2,2, DATA_END, add_sprite_x_data, END_add_sprite_y_data, loop_while_data, repeat_loop };