/******************************************************************************** ------------------------- Ultra 64 MARIO Brothers ------------------------- Yoshi Strategy May 9 1996 programed by Iwamoto Daiki ********************************************************************************/ /*################*/ #ifdef ASSEMBLER /*################*/ /*============================================================================== Path Data ===============================================================================*/ e_yoshi: p_initialize(enemyA) p_setbit(flag,stf_moveON| stf_YangleSAME | stf_playerangleON) p_set_pointer(skelanime,yoshi_anime) p_setobjname(FRIEND) p_BGcheckYset p_sethitbox(160,150) p_set_skelanime_number(0) p_save_nowpos p_program(s_yoshi_init) p_while p_hitON p_program(s_yoshi_main) p_loop /*################*/ #else /*################*/ /*================================================================================================== C Program ===================================================================================================*/ #define yoshi_eyetimer (execstp->s[stw_work0].d) #define yoshi_mess_flag (execstp->s[stw_work1].d) #define yoshi_ral_flag (execstp->s[stw_work2].d) #define yoshi_tangle (execstp->s[stw_work3].d) short yoshi_rail[] = { 0, -5625, -1364, -5912, -1403, -4609, -1004, -5308, }; /*************************************************************************************************** Main ***************************************************************************************************/ extern void s_yoshi_init(void) { execstp->s[stw_gravity].f = 2.0; execstp->s[stw_friction].f = 0.9; execstp->s[stw_specificG].f = 1.3; execstp->s[stw_enemyinfo].d = ENEMYINFO_MESSAGE; if ((BuGetTotalStars(activePlayerNo-1) < 120)|| yoshi_destFlag == 1) { execstp->status = 0; } } /*************************************************************************************************** Main ***************************************************************************************************/ static void yoshi_WalkEvent(void) { short bg_flag; short anim_frame = execstp->map.skelanim.frame; obj_speedF = 10; bg_flag = ObjMoveEvent(); obj_angleY = s_chase_angle(obj_angleY,yoshi_tangle,0x500); if (ObjApproach(execstp,obj_attX,3174,obj_attZ,200)) { obj_mode = 0; } stSetSkelAnimeNumber(1); if (anim_frame == 0 || anim_frame == 15) objsound(NA_SE2_YOSSY_WALK); if (execstp->s[stw_mail].d == EMAIL_PLAYERHIT) obj_mode = 2; if (obj_worldY < 2100) { Obj_reset(S_yoshi,e_yoshi,3000); execstp->status = 0; } } /*************************************************************************************************** Main ***************************************************************************************************/ static void yoshi_WaitEvent(void) { short flag; short anim_frame = execstp->map.skelanim.frame; if (obj_timer > FRAME*3) { flag = (short) (Randomf()*3.99); if (flag == yoshi_ral_flag) return; else yoshi_ral_flag = flag; obj_attX = yoshi_rail[yoshi_ral_flag*2]; obj_attZ = yoshi_rail[yoshi_ral_flag*2+1]; yoshi_tangle = atan(obj_attZ - obj_worldZ,obj_attX - obj_worldX); obj_mode = 1; } stSetSkelAnimeNumber(0); if (execstp->s[stw_mail].d == EMAIL_PLAYERHIT) obj_mode = 2; if (camPlayerInfo[0].demostatus == DEMO_ENDING_B || camPlayerInfo[0].demostatus == DEMO_SAYONARA) { obj_mode = 10; obj_worldX = -1798; obj_worldY = 3174; obj_worldZ = -3644; } } /*************************************************************************************************** Main ***************************************************************************************************/ static void yoshi_MessageEvent(void) { if ((short) obj_angleY == (short) obj_targetangle) { stSetSkelAnimeNumber(0); if (CtrlPlayerDialog(DLOG_LOOKFRONT)==DLOG_RESULT_READY) { Mbitset( execstp->status,OBJECT_DEMOMOVEENTRY ); //kaijo only me if (cameraDemoStratMsgNum(CAM_DEMO_TALK,execstp,161) != 0) { Mbitclr( execstp->status,OBJECT_DEMOMOVEENTRY ); execstp->s[stw_mail].d = 0; obj_attX = yoshi_rail[2]; obj_attZ = yoshi_rail[2+1]; yoshi_tangle = atan(obj_attZ - obj_worldZ,obj_attX - obj_worldX); obj_mode = 5; } } } else { stSetSkelAnimeNumber(1); Na_NazoClearBgm(); obj_angleY = s_chase_angle(obj_angleY,obj_targetangle,0x500); } } /*************************************************************************************************** Main ***************************************************************************************************/ static void yoshi_GoHome(void) { short anim_frame = execstp->map.skelanim.frame; obj_speedF = 10; ObjMoveEvent(); stSetSkelAnimeNumber(1); if (obj_timer == 0) cameraDemoStrat(CAM_DEMO_LOOKOBJ,execstp); obj_angleY = s_chase_angle(obj_angleY,yoshi_tangle,0x500); if (ObjApproach(execstp,obj_attX,3174,obj_attZ,200)) { stSetSkelAnimeNumber(2); objsound(NA_SE2_YOSSY_JUMP); obj_speedF = 50; obj_speedY = 40; obj_angleY = degree(-90); obj_mode = 4; } if (anim_frame == 0 || anim_frame == 15) objsound(NA_SE2_YOSSY_WALK); } /*************************************************************************************************** Main ***************************************************************************************************/ static void yoshi_GoHome2(void) { s_stop_animeend(); ObjSpeedOn(execstp); obj_speedY -= 2.0; if (obj_worldY < 2100) { CtrlPlayerDialog(DLOG_DONE); demoseqcode = 1; //CAMERA DEMO END yoshi_destFlag = 1; execstp->status = 0; } } /*************************************************************************************************** Main ***************************************************************************************************/ static void yoshi_100up(void) { ulong counter = frameCounter; if (playerMeter.life == 100) { Na_FixSeFlagEntry(NA_SE2_ONEUP); buYosshiJump = 1; obj_mode = 3; return; } if ((counter & 0x03)==0) { Na_FixSeFlagEntry(NA_SYS_COUNTUP); (marioWorks->nlifes)++; } } /*************************************************************************************************** Main ***************************************************************************************************/ extern void s_yoshi_main(void) { switch (obj_mode) { case 0: yoshi_WaitEvent(); break; case 1: yoshi_WalkEvent(); break; case 2: yoshi_MessageEvent(); break; case 3: yoshi_GoHome(); break; case 4: yoshi_GoHome2(); break; case 5: yoshi_100up(); break; case 10: stSetSkelAnimeNumber(0); break; } ObjEyeEvent(&yoshi_eyetimer); } /*################*/ #endif /*################*/