/******************************************************************************** ------------------------- Ultra 64 MARIO Brothers ------------------------- File : walker.s Description : Date : 1995. Author : H.yajima ********************************************************************************/ #define ANM_walker_F_walk 0 #define ANM_walker_walk 1 /*################*/ #ifdef ASSEMBLER /*################*/ e_walker: p_initialize(enemyA) p_setbit(flag,stf_moveON | stf_YangleSAME | stf_playerdistON ) p_set_pointer(skelanime,walker_anime) p_set_skelanime_number(0) p_setmovedata(80,-400,-50,0,0,200,0,0) p_save_nowpos p_program(s_areastage_init) p_while p_program(s_walker) p_loop e_wakidashi_kumo: p_initialize(control) p_setbit(flag,stf_moveON | stf_playerdistON ) p_while p_program(s_wakidashi_kumo) p_loop /*################*/ #else /*################*/ #define kumo_wakidashi_coin (execstp->s[stw_work0].d) #define kumo_pros (execstp->s[stw_work1].d) #define kumo_timer (execstp->s[stw_work2].d) /******************************************************************************** C Program (walker) ********************************************************************************/ extern int s_check_gakewall(long *angle) { if ( obj_movestatus & MOVESTAT_WALL ){ *angle = obj_wallangleY; return(1); /* set wallangle */ } else if ( obj_movestatus & MOVESTAT_GAKE ){ *angle = obj_angleY+0x8000; /* set gakeangle */ return(-1); } return(0); } static HitCheckRecord walker_hit = { OBJNAME_KURIBO, 0,1,1,3, /* flag,ap,hp,coin */ 130,70, /* player attack hitarea */ 90,60, /* player damage hitarea */ }; extern void s_walker(void) { int flag; float speed; s_enemybgcheck(); if ( obj_process != 0 && s_hit_remove_enemy(&walker_hit,NA_SE3_MOGURA_HIT,kumo_wakidashi_coin) ) obj_process = 3; if ( obj_process != 1 ){ kumo_pros = 0; } switch(obj_process){ case 0: if ( obj_movestatus & MOVESTAT_BGBOUND ) objsound(NA_SE3_BOUND_S); if ( obj_movestatus & ( MOVESTAT_BGBOUND + MOVESTAT_BGTOUCH ) ){ obj_attX = obj_worldX; obj_attY = obj_worldY; obj_attZ = obj_worldZ; obj_process++; } break; case 1: obj_speedF = 5; if ( s_calc_playerscope() > 1000 ) obj_targetangle = s_calc_returnangle(); else { if ( kumo_pros == 0 ){ kumo_timer = 0; obj_targetangle = s_calc_targetangle(execstp,player1stp); if ( s_calc_dangle(obj_targetangle,obj_angleY) < 0x800 ){ kumo_pros = 1; obj_speedY = 20; objsound(NA_SE3_KUMO_JUMP); } } else if ( kumo_pros == 1 ){ obj_speedF = 15; kumo_timer++; if ( kumo_timer > 50 ) kumo_pros = 0; } } if ( s_check_gakewall( &obj_targetangle ) ) obj_process = 2; s_chase_angleY(obj_targetangle,0x200 ); break; case 2: obj_speedF = 5; if ( (short)obj_angleY == (short)obj_targetangle ) obj_process = 1; if ( obj_worldY - obj_attY < -200 ){ s_remove_obj(execstp); } s_chase_angleY(obj_targetangle,0x400); break; case 3: Mbitclr(obj_mainflag,stf_YangleSAME); obj_speedF = -10; obj_speedY = 30; objsound(NA_SE3_KUMO_JUMP); obj_process++; break; case 4: obj_speedF = -10; if ( obj_movestatus & MOVESTAT_BGBOUND ){ obj_process++; obj_speedY = 0; kumo_timer = 0; Mbitset(obj_mainflag,stf_YangleSAME); obj_mail = 0; } break; case 5: obj_speedF = 2; kumo_timer++; if ( kumo_timer > 30 ) obj_process = 0; break; } if ( obj_speedF < 10 ) speed = 1.0; else speed = 3.0; s_set_skelanime_speed(0 ,speed); if ( obj_movestatus & MOVESTAT_GROUND ) s_anime_sound(1,23,NA_SE3_KUMO_WALK); if ( execstp->motherobj != execstp ){ if ( s_check_shapehide(execstp) ) s_remove_obj(execstp); if ( execstp->status == 0 ) execstp->motherobj->s[stw_imm].d = 1; } s_enemymove(-50); } /******************************************************************************** C Program (walker) ********************************************************************************/ extern void s_wakidashi_kumo(void) { StrategyRecord *stp; if (obj_mode == 0 ){ if ( obj_timer > 30 && 500 < obj_playerdist && obj_playerdist < 1500 ){ objsound(NA_SE3_KUMO_JUMP); stp = s_makeobj_nowpos(execstp,S_kumo,e_walker); stp->s[stw_work0].d = obj_work0; stp->s[stw_speedF].f = 30; stp->s[stw_speedY].f = 80; obj_mode++; obj_work0 = 1; } } else { if ( obj_imm != 0 ){ obj_imm = 0; obj_mode = 0; } } /* if ( cont1p->trigger & CONT_R ) { stp = s_makeobj_nowpos(execstp,S_kumo,e_walker); stp->s[stw_speedF].f = 20; stp->s[stw_speedY].f = 80; } */ } /*################*/ #endif /*################*/ /*=============================================================================== end end end end end end end end ===============================================================================*/