/******************************************************************************** ------------------------- Ultra 64 MARIO Brothers ------------------------- File : pathtatsumaki.s Description : Date : 1995. Author : H.yajima ********************************************************************************/ /*################*/ #ifdef ASSEMBLER /*################*/ /******************************************************************************** tornedo program ********************************************************************************/ /* gomi program */ e_tatsumaki_object: p_initialize(effect) p_setbit(flag,stf_moveON | stf_FspeedON ) p_softspritemodeON p_while p_program(s_tatsumaki_object) p_loop e_tornedo: p_initialize(player_friend) p_setbit(flag,stf_moveON | stf_playerangleON | stf_playerdistON | stf_alldispON ) p_setmovedata(30,-400,0,0,0,200,0,0) p_BGcheckYset p_save_nowpos p_while p_program(s_tornedo) p_loop /******************************************************************************** tatsumaki object ********************************************************************************/ /*################*/ #else /*################*/ /******************************************************************************** tornedo work ********************************************************************************/ static HitCheckRecord tatsumaki_hit = { OBJNAME_TORNEDO, 0,0,0,0, /* flag,ap,hp,coin */ 1500,4000, /* player attack hitarea */ 0,0, /* player damage hitarea */ }; #define TORNEDO_SCALETIME 60.0f /* tornedo demo scalling time */ #define tornedo_work0 (execstp->s[stw_work0].d) #define tornedo_timer (execstp->s[stw_work1].d) /******************************************************************************** tornedo animation program ********************************************************************************/ #define TORNEDO_enemyp0 -83 #define TORNEDO_enemyp1 11 #define TORNEDO_enemyp2 14 #define TORNEDO_enemyp3 1 static void tornedo_anime(float totalscale) { short angle_add; float scale; angle_add = TORNEDO_enemyp1 * 0x400; scale = 0.4*totalscale; execstp->map.scale[0] = ( (cos(tornedo_work0)+1.0) * 0.5 * 0.3 + 1.0 ) * scale; execstp->map.scale[1] = ((-cos(tornedo_work0)+1.0) * 0.5 * 0.5 + 0.5 ) * scale; execstp->map.scale[2] = ( (cos(tornedo_work0)+1.0) * 0.5 * 0.3 + 1.0 ) * scale; tornedo_work0 += 0x200; obj_speedF = TORNEDO_enemyp2; obj_animeangleY += angle_add; } /******************************************************************************** tornedo initial program ********************************************************************************/ static void tornedo_init(void) { if ( obj_process == 0 ){ s_hitON(); s_copy_initpos(); s_set_scale(0); tornedo_timer = 0; if ( obj_playerdist < 1500 ) obj_process++; obj_timer = 0; } else { objsound_level(NA_LSE2_SANDSTORM); tornedo_anime(obj_timer / TORNEDO_SCALETIME ); if ( obj_timer >= (int)TORNEDO_SCALETIME ) obj_mode = mode_tornedo_move; } } /******************************************************************************** tornedo move program ********************************************************************************/ static void tornedo_move(void) { float scope = obj_programselect*100; obj_returnangle = s_calc_returnangle(); /* set return angle */ objsound_level(NA_LSE2_SANDSTORM); if ( s_calc_playerscope() < scope && obj_process == 0 ){ obj_speedF = 20; s_chase_angleY(obj_targetangle,0x200); dbPrint("off ",0); if ( playerWorks[0].status == PS_SPINJUMP ) obj_process++; } else { obj_speedF = 20; s_chase_angleY(obj_returnangle,0x200); if ( s_calc_enemyscope() < 200 ) obj_mode = mode_tornedo_erase; } if ( obj_playerdist > 3000 ) obj_mode = mode_tornedo_erase; s_enemybgcheck(); if ( obj_movestatus & MOVESTAT_WALL ) obj_angleY = obj_wallangleY; s_enemymove(60); tornedo_anime(1.0); s_makeobj_nowpos(execstp,S_sand_dust,e_tatsumaki_object); } /******************************************************************************** erase tornedo ********************************************************************************/ static void tornedo_erase(void) { float scale = TORNEDO_SCALETIME-obj_timer; if ( scale >= 0 ){ tornedo_anime( scale / TORNEDO_SCALETIME); } else { s_hitOFF(); if ( s_calc_playerscope() > 2500 ) obj_mode = 0; if ( obj_timer > (int)(TORNEDO_SCALETIME)+ 300 ) obj_mode = 0; } } /******************************************************************************** tornedo main program ********************************************************************************/ static void *tornedo_modejmp[] = { tornedo_init, tornedo_move, tornedo_erase }; extern void s_tornedo(void) { s_set_hitparam(execstp,&tatsumaki_hit); /* Set HitCheck Param */ s_modejmp(tornedo_modejmp); obj_mail = 0; } /*=============================================================================== ===============================================================================*/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ /********************************************************************************/ #define motherobj_worldX (execstp->motherobj->s[stw_worldX].f) #define motherobj_worldY (execstp->motherobj->s[stw_worldY].f) #define motherobj_worldZ (execstp->motherobj->s[stw_worldZ].f) /******************************************************************************** --------------------------- tatsumaki object program --------------------------- ********************************************************************************/ extern void s_tatsumaki_object(void) { obj_angleY += 55 * 0x100; obj_speedF += 15; obj_worldY += 22; s_set_scale(1.0+Randomf()); if ( obj_timer == 0 ){ s_random_XZ_offset(execstp,100); obj_animeangleX = Randomd(); obj_animeangleY = Randomd(); } if ( obj_timer > 15 ) s_remove_obj(execstp); } /*################*/ #endif /*################*/ /*=============================================================================== end end end end end end end end ===============================================================================*/