/******************************************************************************** ------------------------- Ultra 64 MARIO Brothers ------------------------- File : pathmonky.s Description : Date : 1995.9.14 Author : H.yajima ********************************************************************************/ /***************************************************************/ /* ANIMATION HEADER DEFINE monky */ /***************************************************************/ #define ANM_monky_F_run 0 #define ANM_monky_N_run 1 #define ANM_monky_base_data 2 #define ANM_monky_down 3 #define ANM_monky_excite 4 #define ANM_monky_hoping 5 #define ANM_monky_jump 6 #define ANM_monky_jump_end 7 #define ANM_monky_jump_start 8 #define ANM_monky_wait_A 9 #define ANM_monky_wait_B 10 #define ANM_monky_walk 11 #define ANM_monky_hold 12 /*=============================================================*/ /* END END */ /*=============================================================*/ /*################*/ #ifdef ASSEMBLER /*################*/ e_monky: p_initialize(enemyA) e_monky_common: p_setbit(flag,stf_moveON | stf_YangleSAME | stf_catchON | stf_playerdistON | stf_playerangleON ) p_setd(objname,OBJNAME_TAKE) p_setd(enemyinfo,ENEMYINFO_FRIEND_ENEMY) p_sethitbox(40,40) p_hitON p_BGcheckYset p_set_pointer(skelanime,monky_anime) p_set_skelanime_number(0) p_setmovedata(30,-400,-50,0,0,200,0,0) p_save_nowpos p_program(s_monky_init) p_while p_program(s_monky) p_loop /*################*/ #else /*################*/ /******************************************************************************** MONKY local work ********************************************************************************/ /*===== 2,3,4,5,6 (road program use) === */ #define monky_randomf (execstp->s[stw_work7].f) #define monky_anime_timer (execstp->s[stw_work0].word[0]) #define monky_anime_repeat (execstp->s[stw_work0].word[1]) #define monky_turnangle (execstp->s[stw_work1].d) #define monky_eventmode (execstp->s[stw_work8].word[0]) #define monky_eventtimer (execstp->s[stw_work8].word[1]) #define monky_timer (execstp->s[stw_work9].word[0]) #define monky_eventflag (execstp->s[stw_work9].word[1]) #define MONKYHAT 1 enum { mev_setmessage, mev_checkmessage, mev_starsearch, mev_hatcatch, /* hat catch */ mev_hathave, /* hat have */ mev_hatend, /* hat event end */ mev_wait, /* wait */ mev_stealentry }; /******************************************************************************** ********************************************************************************/ /******************************************************************************** ********************************************************************************/ /******************************************************************************** ********************************************************************************/ /******************************************************************************** ********************************************************************************/ /******************************************************************************** ********************************************************************************/ /******************************************************************************** ********************************************************************************/ static void monky_overarea_check(void) { if ( obj_programselect == 1 ){ if ( s_enemy_areaout() ){ s_reset_posspeed(); obj_mode = mode_monky_wait; } else if ( obj_movestatus & MOVESTAT_WATER ){ obj_mode = mode_monky_outarea_wait; } } } static int monky_hatsearch_check(void) { if ( obj_programselect == 1 ){ if ( PL_IsPlayerWearingRedHat(marioWorks) ) return(1); /* hatsearch check */ } return(0); } /******************************************************************************** ####### MONKY monky head program ####### ********************************************************************************/ extern unsigned long MonkyHead(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); // rmonpf(("hellow %f\n",stp->childobj->s[stw_worldY].f )); } } return(0); } /******************************************************************************** ####### MONKY monky wait animation !! ####### ********************************************************************************/ static void monky_wait_animation(void) { obj_speedF = 0; if ( obj_process == 0 ){ obj_process = Randomf()*4+1; /* random process */ monky_anime_timer = 0; /* timer */ monky_anime_repeat = Randomf()*4+2; /* repeat count */ } switch (obj_process){ case 1: s_set_skelanimeNo(ANM_monky_wait_A); if ( s_check_animeend() ) obj_process = 0; break; case 2: s_set_skelanimeNo(ANM_monky_excite); if ( s_check_animeend() ) monky_anime_timer++; if ( monky_anime_timer >= (monky_anime_repeat*2) ) obj_process = 0; break; case 3: s_set_skelanimeNo(ANM_monky_hoping); if ( s_check_animeend() ) monky_anime_timer++; if ( monky_anime_timer >= monky_anime_repeat ) obj_process = 0; break; case 4: s_set_skelanimeNo(ANM_monky_wait_B); if ( s_check_animeend() ) obj_process = 0; break; } } /*------------------------------------------------------------------*/ /* normal wait */ /*------------------------------------------------------------------*/ static void monky_wait(void) { monky_wait_animation(); if ( monky_hatsearch_check() ){ if ( obj_playerdist > 700 && obj_playerdist < 1000 ) obj_mode = mode_monky_runaway; else if ( obj_playerdist <= 700 && obj_playerdist > 200 ){ if ( s_calc_dangle(obj_targetangle,obj_angleY) > 0x1000 ) obj_mode = mode_monky_look_player; } } else { if ( obj_playerdist < 300 ) obj_mode = mode_monky_runaway; } if ( monky_eventmode == mev_starsearch ) obj_mode = mode_monky_rail_demo; /*----------------------------------------------------------------------*/ if ( monky_eventmode == mev_hatcatch ){ obj_angleY = (player1stp->s[stw_angleY].d+0x8000); if ( s_next_bgcheck(50,150) ){ obj_mode = mode_monky_turnjump; } else { obj_angleY = (player1stp->s[stw_angleY].d+0x4000); if ( s_next_bgcheck(50,150) ) obj_mode = mode_monky_turnjump; else { obj_angleY = (player1stp->s[stw_angleY].d-0x4000); if ( s_next_bgcheck(50,150) ) obj_mode = mode_monky_turnjump; } } monky_eventmode = mev_hathave; } /*----------------------------------------------------------------------*/ if ( obj_programselect == 1 ){ if ( obj_worldY < -1550 ) obj_mode = mode_monky_return; } } /*------------------------------------------------------------------*/ /* monky return */ /*------------------------------------------------------------------*/ static void monky_return(void) { float dist; s_set_skelanimeNo(ANM_monky_F_run); obj_angleY = s_calc_returnangle(); obj_speedF = 10; if ( obj_worldY > -1550 ) obj_mode = mode_monky_wait; } /*------------------------------------------------------------------*/ /* normal outarea */ /*------------------------------------------------------------------*/ static void monky_outarea_wait(void) { monky_wait_animation(); if ( s_enemy_areaout() ){ s_reset_posspeed(); obj_mode = mode_monky_wait; } } /*------------------------------------------------------------------*/ /* stopwait */ /*------------------------------------------------------------------*/ static void monky_stopwait(void) { monky_wait_animation(); if ( obj_process == 3 ) s_chase_angleY(obj_targetangle,0x400); } /******************************************************************************** ####### MONKY look player ####### ********************************************************************************/ static void monky_look_player(void) { int sameflag; if ( obj_timer == 0 ) obj_speedF = 2 + Randomf()*3; s_set_skelanimeNo(ANM_monky_walk); sameflag = s_chase_angleY(obj_targetangle,0x800); if (sameflag) obj_mode = mode_monky_wait; if ( monky_hatsearch_check() ){ if ( obj_playerdist > 500 ) obj_mode = mode_monky_runaway; } else { if ( obj_playerdist < 300 ) obj_mode = mode_monky_runaway; } } /******************************************************************************** ####### MONKY runaway ####### ********************************************************************************/ static void monky_runaway(void) { int flag = 1; short angle = obj_targetangle+0x8000; if ( monky_hatsearch_check() ){ flag = 0; angle = obj_targetangle; } if ( obj_timer == 0 ) monky_randomf = 350+Randomf()*100; s_set_skelanimeNo(ANM_monky_F_run); s_chase_angleY(angle,0x800); s_chase_playerspeed(20.0,0.9); if ( flag ){ if ( obj_playerdist > monky_randomf ) obj_mode = mode_monky_look_player; } else { if ( obj_playerdist < monky_randomf ) obj_mode = mode_monky_look_player; } if ( flag ){ if ( obj_playerdist < 200 ){ if ( ( obj_movestatus & MOVESTAT_WALL ) && ( s_check_playerslow(10) ) ){ obj_mode = mode_monky_turnjump; obj_angleY = obj_wallangleY; } else if ( ( obj_movestatus & MOVESTAT_GAKE ) && ( s_check_playerslow(10) ) ){ obj_mode = mode_monky_turnjump; obj_angleY += 0x8000; } } } } /******************************************************************************** << turn jump >> ********************************************************************************/ static void monky_turnjump(void) { obj_speedF = 10; s_hitOFF(); if ( obj_process == 0 ){ if ( obj_timer == 0 ){ s_set_jumpstart(45+Randomf()*10,ANM_monky_jump_start); } else { if ( obj_movestatus & ( MOVESTAT_STOP | MOVESTAT_BGBOUND ) ){ obj_process++; obj_speedY = 0; } } } else { obj_speedF = 0; s_set_skelanimeNo(ANM_monky_jump_end); s_hitON(); if ( s_check_animeend() ){ obj_mode = mode_monky_runaway; } } } /******************************************************************************** ########################## MAINPROGRAM MONKY ########################## ********************************************************************************/ static short monky_rail[] = { 0,1011,2306,-285, 0,1151,2304,-510, 0,1723,1861,-964, 0,2082,1775,-1128, 0,2489,1717,-1141, 0,2662,1694,-1140, 0,2902,1536,-947, 0,2946,1536,-467, 0,2924,1536,72, 0,2908,1536,536, 0,2886,1536,783, -1, }; static void monky_rail_demo(void) { StrategyRecord *stp; float dist = 0; short angle = 0; if ( ( stp = s_find_obj(e_monky_check)) != NULL ){ dist = s_distanceXZ_obj2obj(execstp,stp->motherobj); angle = s_calc_targetangle(execstp,stp->motherobj); } s_hitOFF(); Mbitset(obj_mainflag,stf_alldispON); switch(obj_process){ case 0: s_set_skelanimeNo(ANM_monky_F_run); road_root(execstp) = monky_rail; if ( s_road_move(0) != -1 ){ obj_speedF = 10; s_chase_angleY(road_angleY(execstp),0x400); obj_worldY = obj_groundY; } else { obj_speedF = 0; obj_process++; } break; case 1: s_set_skelanimeNo(ANM_monky_hoping); s_chase_angleY(obj_targetangle,0x400); if ( s_hitcheck_message_entry( 200, 30 ,0x7fff ) ){ obj_process++; /* Go Next Process */ } else { break; } case 2: s_set_skelanimeNo(ANM_monky_wait_B); if ( s_call_talkdemo(DLOG_LOOKDOWN,ENEMYDEMO_LOOKPLAYER,CAM_DEMO_TALK,80) ) obj_process++; break; case 3: s_set_skelanimeNo(ANM_monky_F_run); if ( s_chase_angleY(angle,0x400)){ obj_speedF = 10; obj_process++; } break; case 4: s_set_jumpstart(45+10,ANM_monky_jump_start); obj_speedF = 10+26; obj_process++; break; case 5: if ( dist < 50 ) obj_speedF = 0; if ( obj_movestatus & MOVESTAT_BGBOUND ){ Na_NazoClearBgm(); s_set_skelanimeNo(ANM_monky_hoping); obj_process++; monky_timer = 32; stp->motherobj->s[stw_imm].d = 1; obj_speedF = 0; } break; case 6: obj_angleY += 0x800; monky_timer--; if ( monky_timer < 0 ){ obj_process++; stp->motherobj->s[stw_imm].d = 2; } break; case 7: if ( obj_worldY < -1300 ) s_remove_obj(execstp); break; } } /******************************************************************************** ########################## MAINPROGRAM MONKY ########################## ********************************************************************************/ static EnemySoundRecord monky_sound[] = { { 1,1,10,NA_SE3_MONKEYRUNNING }, /* ANM_monky_F_run 0 */ { 0,0,0,0 }, /* ANM_monky_N_run 1 */ { 0,0,0,0 }, /* ANM_monky_base_data 2 */ { 0,0,0,0 }, /* ANM_monky_down 3 */ { 1,0,-1,NA_SE3_MONKEYVOICE1 }, /* ANM_monky_excite 4 */ { 1,0,-1,NA_SE3_MONKEYVOICE0 }, /* ANM_monky_hoping 5 */ { 0,0,0,0 }, /* ANM_monky_jump 6 */ { 0,0,0,0 }, /* ANM_monky_jump_end 7 */ { 1,0,-1,NA_SE3_MONKEYVOICE0 }, /* ANM_monky_jump_start 8 */ { 1,0,-1,NA_SE3_MONKEYSCRATCH }, /* ANM_monky_wait_A 9 */ { 1,0,-1,NA_SE3_MONKEYVOICE2 }, /* ANM_monky_wait_B 10 */ { 0,0,0,0 }, /* ANM_monky_walk 11 */ { 0,0,0,0 }, /* ANM_monky_hold 12 */ }; static void *monky_modejmp[] = { monky_wait, monky_runaway, monky_look_player, monky_turnjump, monky_rail_demo, monky_outarea_wait, monky_stopwait, monky_return }; static void s_monky_main(void) { int ang; s_enemybgcheck(); s_modejmp(monky_modejmp); if ( obj_mode == mode_monky_rail_demo || obj_mode == mode_monky_return ) ang = -88; else ang = -20; s_enemymove(ang); monky_overarea_check(); if ( ( obj_movestatus & MOVESTAT_WATER ) == 0 ){ s_enemysound(monky_sound); /* monky sound */ } } /******************************************************************************** ########################## MAINPROGRAM MONKY ########################## ********************************************************************************/ static void s_eye_anime(void) { if ( ( frameCounter % 50 ) < 7 ) obj_animecounter = 1; else obj_animecounter = 0; } /******************************************************************************** star event monky ********************************************************************************/ static void starevent_monky(void) { if ( obj_worldY - obj_attY > -100 ){ switch(monky_eventmode){ case mev_setmessage: if ( CtrlPlayerDialog(DLOG_LOOKUP) == DLOG_RESULT_READY ){ CallMessageYesNo(79); monky_eventmode = mev_checkmessage; } break; case mev_checkmessage: if ( messageAnsNo != 0 ){ CtrlPlayerDialog(DLOG_DONE); if ( messageAnsNo == 1 ){ Mbitset(obj_enemyinfo,ENEMYINFO_CATCH_OFF_REQUEST); monky_eventmode = mev_starsearch; } else { monky_eventmode = mev_wait; monky_eventtimer = 60; } } break; case mev_starsearch: break; case mev_wait: if ( monky_eventtimer-- < 0 ) monky_eventmode = 0; break; } } else { monky_eventmode = 0; obj_timer = 0; obj_mode = mode_monky_outarea_wait; } } /******************************************************************************** hat event monky ********************************************************************************/ static void hatevent_monky(void) { switch(monky_eventmode){ /*---- hat steal mode -----*/ case mev_setmessage: if ( PL_StealMariosHat(MONKEY_STEAL_HAT) ){ monky_eventmode = mev_stealentry; Mbitset(monky_eventflag,MONKYHAT); } else { // Mbitset(obj_enemyinfo,ENEMYINFO_CATCH_OFF_REQUEST); } break; /* next */ case mev_stealentry: if ( s_call_enemydemo(DLOG_LOOKUP,ENEMYDEMO_SETMESSAGE,100,0) ){ Mbitset(obj_enemyinfo,ENEMYINFO_CATCH_OFF_REQUEST); monky_eventmode = mev_hatcatch; } break; case mev_hatcatch: break; /*---- hat have mode -----*/ case mev_hathave: if ( s_call_enemydemo(DLOG_LOOKUP,ENEMYDEMO_SETMESSAGE+ENEMYDEMO_DLOG_NOSTOP,101,0) ){ PL_ReturnMariosHat(); /* Hat Return */ CtrlPlayerDialog(DLOG_DONE); Mbitclr(monky_eventflag,MONKYHAT); monky_eventmode = mev_hatend; } break; case mev_hatend: monky_eventmode = 0; obj_mode = 0; break; } } /******************************************************************************** Monky Main Program ********************************************************************************/ /******************************************************************************** monky initialize ********************************************************************************/ extern void s_monky_init(void) { if ( obj_programselect == 1 ){ if ( BuGetItemFlag() & BU_ITEM_MONKEYHAT ){ monky_eventmode = mev_hathave; Mbitset(monky_eventflag,MONKYHAT); } } } /******************************************************************************** monky main program ********************************************************************************/ extern void s_monky(void) { switch(execstp->s[stw_actionmode].d){ case CHILEDMODE_NO_CATCH: monky_eventtimer = 0; s_monky_main(); break; case CHILEDMODE_CATCH: s_mode_catch(ANM_monky_hold,mode_monky_wait); s_copy_worldXYZ(execstp,player1stp); if ( obj_programselect == 1 ) hatevent_monky(); else starevent_monky(); break; case CHILEDMODE_THROW: case CHILEDMODE_DROP: s_mode_drop(); break; } /* s_eye_anime(); */ if ( monky_eventflag & MONKYHAT ) obj_animecounter = 2; else obj_animecounter = 0; obj_mail = 0; dbErrPrint("mode %d\n",obj_mode); dbErrPrint("action %d\n",execstp->s[stw_actionmode].d); } /*################*/ #endif /*################*/ /*=============================================================================== end end end end end end end end ===============================================================================*/