/******************************************************************************** ------------------------- Ultra 64 MARIO Brothers ------------------------- File : pathmotos.s Description : Date : 1995.10.17 Author : H.yajima ********************************************************************************/ /******************************************************************************** Enemy motos Animation !! ********************************************************************************/ #define ANM_motos_basedata_A 0 #define ANM_motos_carry 1 #define ANM_motos_carry_run 2 #define ANM_motos_carry_start 3 #define ANM_motos_down_recover 4 #define ANM_motos_down_stop 5 #define ANM_motos_pitch 6 #define ANM_motos_safe_down 7 #define ANM_motos_wait 8 #define ANM_motos_walk 9 #define ANM_motos_end ANM_motos_walk+1 /*################*/ #ifdef ASSEMBLER /*################*/ e_motos: p_initialize(enemyA) p_setbit(flag,stf_moveON | stf_YangleSAME | stf_catchON | stf_playerdistON | stf_playerangleON ) p_set_pointer(skelanime,motos_anime) p_setd(objname,OBJNAME_TAKE) p_sethitbox(100,100) p_setmovedata(30,-400,-50,1000,1000,200,0,0) p_makeobj_child(S_NULL,e_motos_hand) p_hitON p_while p_program(s_motos) p_loop e_motos_hand: p_initialize(enemyA) p_setbit(flag,stf_moveON | stf_YangleSAME ) p_softspritemodeON p_while p_program(s_motos_hand) p_loop /*################*/ #else /*################*/ #define motos_work (execstp->s[stw_work0].d) /******************************************************************************** motos ********************************************************************************/ extern unsigned long MotosProc1(int code,MapNode *node, void *data) { if (code == MAP_CBACK_EXEC) { AffineMtx modelmtx; StrategyRecord *stp = (StrategyRecord *)hmsActiveShape; if ( stp->childobj != NULL ){ s_calc_skeleton_glbmtx(&modelmtx,(AffineMtx *)data,hmsActiveCamera->matrix); s_calc_skeleton_glbpos(modelmtx,stp->childobj); s_copy_worldXYZmappos(stp->childobj); } } return(0); } extern void s_motos_hand(void) { StrategyRecord *firep; execstp->s[stw_skeletonX].f = 100; execstp->s[stw_skeletonY].f = 0; execstp->s[stw_skeletonZ].f = 150; 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: player1stp->s[stw_mail].d |= PLAYERMAIL_CARRYMODE_OFF; playerWorks[0].velocity = 50; execstp->motherobj->s[stw_imm].d = 0; break; } #if 0 if (execstp->motherobj->s[stw_imm].d != 0){ execstp->motherobj->s[stw_imm].d = 0; firep = s_makeobj_nowpos(execstp,S_green_kame,e_enemyfire); firep->s[stw_speedF].f = 40; firep->s[stw_speedY].f = 20; firep->s[stw_angleY].d = execstp->motherobj->s[stw_angleY].d; } #endif } /******************************************************************************** Enemy AI Library ********************************************************************************/ static int s_ai_pitch(short angle,float dist) { if ( (s_chase_angleY(obj_targetangle,angle)) && (obj_playerdist < dist) ) return(1); else return(0); } /******************************************************************************** motos program ********************************************************************************/ /*------------------------------------------------------------------------------*/ /* ##### */ /* ##### wait */ /* ##### */ /*------------------------------------------------------------------------------*/ static void motos_wait(void) { obj_speedF = 0; obj_speedY = 0; s_set_skelanimeNo(ANM_motos_wait); if ( obj_playerdist < 500 ) obj_mode = mode_motos_player_search; } /*------------------------------------------------------------------------------*/ /* ##### */ /* ##### player search */ /* ##### */ /*------------------------------------------------------------------------------*/ static void motos_player_search(void) { s_set_skelanimeNo(ANM_motos_walk); obj_speedF = 2; s_chase_angleY(obj_targetangle,300); if ( execstp->s[stw_mail].d & EMAIL_CARRYMODE_ON ){ obj_mode = mode_motos_player_carry; execstp->s[stw_imm].d = 1; } } /*------------------------------------------------------------------------------*/ /* ##### */ /* ##### player carry */ /* ##### */ /*------------------------------------------------------------------------------*/ static void motos_player_carry(void) { s_set_skelanimeNo(ANM_motos_carry_start); if ( s_check_animeend() ) obj_mode = mode_motos_player_pitch; } /*------------------------------------------------------------------------------*/ /* ##### */ /* ##### search object */ /* ##### */ /*------------------------------------------------------------------------------*/ static void motos_player_pitch(void) { obj_speedF = 0; s_set_skelanimeNo(ANM_motos_pitch); if ( s_check_animenumber(14) ){ execstp->s[stw_imm].d = 2; /* nageru shyn kan */ execstp->hit_counter = 10; /* hit time wait!! */ } if ( s_check_animeend() ){ obj_mode = mode_motos_wait; Mbitclr(execstp->s[stw_mail].d,EMAIL_CARRYMODE_ON); } } /*------------------------------------------------------------------------------*/ /* carry start */ /*------------------------------------------------------------------------------*/ static void motos_carry_start(void) { s_set_skelanimeNo(ANM_motos_carry_start); if ( s_check_animeend() ){ if ( s_ai_pitch(0x200,500) ) obj_mode = mode_motos_pitch; else obj_mode = mode_motos_carry_run; } } /*------------------------------------------------------------------------------*/ /* carry run */ /*------------------------------------------------------------------------------*/ static void motos_carry_run(void) { obj_speedF = 5; s_set_skelanimeNo(ANM_motos_carry_run); if ( s_ai_pitch(0x200,500) ) obj_mode = mode_motos_pitch; else obj_mode = mode_motos_carry_run; } /*------------------------------------------------------------------------------*/ /* pitch */ /*------------------------------------------------------------------------------*/ static void motos_pitch(void) { obj_speedF = 0; s_set_skelanimeNo(ANM_motos_pitch); if ( s_check_animenumber(14) ){ execstp->s[stw_imm].d = 0; } if ( s_check_animeend() ) obj_mode = mode_motos_wait; } /*------------------------------------------------------------------------------*/ /* fly */ /*------------------------------------------------------------------------------*/ static void motos_fly(void) { s_set_skelanimeNo(ANM_motos_walk); if ( obj_movestatus & MOVESTAT_BGTOUCH ) obj_mode = mode_motos_wait; } /*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/ /*------------------------------------------------------------------------------*/ static void motos_main(void) { s_enemybgcheck(); /* monky bgcheck */ switch (obj_mode){ case mode_motos_wait: motos_wait(); break; case mode_motos_player_search: motos_player_search(); break; case mode_motos_player_carry: motos_player_carry(); break; case mode_motos_player_pitch: motos_player_pitch(); break; case mode_motos_carry_start: motos_carry_start(); break; case mode_motos_carry_run: motos_carry_run(); break; case mode_motos_pitch: motos_pitch(); break; case mode_motos_fly: motos_fly(); break; default: rmonpf(("Error objmode motos\n")); } s_enemymove(-78); /* monky moving */ } /******************************************************************************** C Program ********************************************************************************/ extern void s_motos(void) { float f,y; f = 5; y = 0; s_set_scale(2.0); Mbitset(execstp->s[stw_enemyinfo].d,ENEMYINFO_CARRY); switch(execstp->s[stw_actionmode].d){ case CHILEDMODE_NO_CATCH: motos_main(); break; case CHILEDMODE_CATCH: s_mode_catch(ANM_motos_walk,mode_motos_wait); break; case CHILEDMODE_THROW: s_mode_throw(f,y,mode_motos_fly); break; // case CHILEDMODE_DROP: s_mode_drop(); break; case CHILEDMODE_DROP: s_mode_throw(f,y,mode_motos_fly); break; } s_erase_shape(obj_playerdist,2000); } /*################*/ #endif /*################*/ /*=============================================================================== end end end end end end end end ===============================================================================*/