/******************************************************************************** ------------------------- Ultra 64 MARIO Brothers ------------------------- File : pathhoriage.s Description : Date : 1995. Author : H.yajima ********************************************************************************/ #define ANM_horiage_run 0 #define ANM_horiage_throwup 1 #define ANM_horiage_back 2 /*################*/ #ifdef ASSEMBLER /*################*/ e_horiage: e_robo: p_initialize(enemyA) p_setbit( flag,stf_moveON | stf_YangleSAME | stf_playerdistON | stf_playerangleON | stf_catchON ) p_set_pointer(skelanime,omurobo_anime) p_set_skelanime_number(0) p_setmovedata(200,-400,-50,1000,1000,600,0,0) p_makeobj_child(S_NULL,e_robo_hand) p_setd(objname,OBJNAME_TAKE) p_setd(enemyinfo,ENEMYINFO_HORIAGE | ENEMYINFO_CARRY ) p_sethitbox(120,100) p_save_nowpos p_hitON p_while p_program(s_horiage) p_loop e_robo_hand: p_initialize(enemyA) p_setbit(flag,stf_moveON | stf_YangleSAME ) p_softspritemodeON p_while p_program(s_robo_hand) p_loop /*################*/ #else /*################*/ #define robo_speed (execstp->s[stw_work0].f) /******************************************************************************** robo hand ********************************************************************************/ extern void s_robo_hand(void) { StrategyRecord *firep; execstp->s[stw_skeletonX].f = 200; execstp->s[stw_skeletonY].f = -50; execstp->s[stw_skeletonZ].f = 0; obj_angleY = execstp->motherobj->s[stw_angleY].d; switch (execstp->motherobj->s[stw_imm].d ){ case 0: break; case 1: // s_copy_mapwork(player1stp,execstp); break; case 2: objsound(NA_SE3_THROWUP); player1stp->s[stw_mail].d |= PLAYERMAIL_CARRYMODE_OFF; playerWorks[0].velocity = -45; playerWorks[0].speed[1] = 95; execstp->motherobj->s[stw_imm].d = 0; break; } } /******************************************************************************** C Program ( horiage wait program ) ********************************************************************************/ #define HORIAGE_STARTWAIT 30 #define HORIAGE_WAITTIME 10 #define HORIAGE_ANIMETIME 12 #define ROBOSTOP_TIME 150 typedef struct { short timer; short anime; } TimeAnimeRecord; static TimeAnimeRecord horiage_data[] = { { HORIAGE_STARTWAIT ,0 }, { HORIAGE_STARTWAIT+HORIAGE_ANIMETIME*1 ,1 }, { HORIAGE_STARTWAIT+HORIAGE_ANIMETIME*1+HORIAGE_WAITTIME*1 ,0 }, { HORIAGE_STARTWAIT+HORIAGE_ANIMETIME*2+HORIAGE_WAITTIME*1 ,1 }, { HORIAGE_STARTWAIT+HORIAGE_ANIMETIME*2+HORIAGE_WAITTIME*2 ,0 }, { HORIAGE_STARTWAIT+HORIAGE_ANIMETIME*3+HORIAGE_WAITTIME*2 ,1 }, { HORIAGE_STARTWAIT+HORIAGE_ANIMETIME*3+HORIAGE_WAITTIME*3 ,0 }, { HORIAGE_STARTWAIT+HORIAGE_ANIMETIME*4+HORIAGE_WAITTIME*3 ,1 }, { HORIAGE_STARTWAIT+HORIAGE_ANIMETIME*4+HORIAGE_WAITTIME*4 ,0 }, { -1, 0 } }; static void horiage_wait(void) { int i = 0; obj_speedF = 0; s_wait_anime(); while(1){ if ( horiage_data[i].timer == -1 ){ obj_mode = mode_horiage_search; break; } if ( obj_timer < ( horiage_data[i].timer ) ){ s_set_skelanime_speed(ANM_horiage_back,(float)(horiage_data[i].anime) ); break; } i++; } } /******************************************************************************** C Program ( horiage wait program ) ********************************************************************************/ static void horiage_search(void) { float time; short chase_angle; if ( s_calc_playerscope() > 1000 ) obj_targetangle = s_calc_returnangle(); if ( obj_timer > ROBOSTOP_TIME ){ robo_speed = ( (38*4) - (( obj_timer - ROBOSTOP_TIME )*1)) / (38.0f*4); if ( robo_speed < 0.1 ){ robo_speed = 0.1; obj_mode = mode_horiage_wait; } } else { robo_speed = 1.0; } s_set_skelanime_speed(ANM_horiage_run,robo_speed); obj_speedF = (10) * robo_speed; chase_angle = 0x400 * robo_speed; obj_angleY = s_chase_angle(obj_angleY,obj_targetangle,chase_angle); } /******************************************************************************** C Program ( horiage pitch program ) ********************************************************************************/ static void horiage_pitch(void) { obj_speedF = 0; if ( obj_timer == 0 ) execstp->s[stw_imm].d = 2; /* nageru shyn kan */ if ( obj_timer == 1 ){ s_set_skelanime_speed(1,1.0); execstp->hit_counter = 20; /* hit time wait!! */ } if ( s_check_animeend() ) obj_mode = mode_horiage_wait; } /******************************************************************************** C Program ( horiage r program ) ********************************************************************************/ static void horiage_init(void) { s_copy_initpos(); if ( mcWaterCheck(obj_worldX,obj_worldZ) < obj_worldY && obj_playerdist < 4000 ){ s_hitON(); s_shape_disp(); obj_mode = mode_horiage_wait; } else { s_hitOFF(); s_shape_hide(); } } /******************************************************************************** C Program ( horiage pitch program ) ********************************************************************************/ static void *horiage_modejmp[] = { horiage_init, horiage_wait, horiage_search, horiage_pitch }; static void horiage_main(void) { s_enemybgcheck(); s_modejmp(horiage_modejmp); s_enemymove(-78); if ( obj_movestatus & MOVESTAT_WATER ) obj_animepositionY = -15; else obj_animepositionY = 0; if ( obj_speedF > 3 ) objsound_level(NA_LSE3_THROWUP_MOVE); if ( obj_mode != mode_horiage_init && obj_movestatus & MOVESTAT_WATER ){ obj_mode = mode_horiage_init; } if ( execstp->s[stw_mail].d & EMAIL_CARRYMODE_ON ){ execstp->s[stw_mail].d = 0; execstp->s[stw_imm].d = 1; obj_mode = mode_horiage_pitch; } } /******************************************************************************** C Program ( horiage pitch program ) ********************************************************************************/ extern void s_horiage(void) { s_set_scale(2.0); switch(execstp->s[stw_actionmode].d){ case CHILEDMODE_NO_CATCH: horiage_main(); break; case CHILEDMODE_CATCH: s_mode_catch(0,0); break; case CHILEDMODE_THROW: s_mode_drop(); break; case CHILEDMODE_DROP: s_mode_drop(); break; } obj_mail = 0; } /*################*/ #endif /*################*/ /*=============================================================================== end end end end end end end end ===============================================================================*/