/******************************************************************************** ------------------------- Ultra 64 MARIO Brothers ------------------------- Kuramochi Strategy Feburary 31 1996 programed by Iwamoto Daiki ********************************************************************************/ /*################*/ #ifdef ASSEMBLER /*################*/ /******************************************************************************** Kuramochi Path Data ********************************************************************************/ e_kura_real: p_initialize(enemyA) p_setbit(flag,stf_moveON| stf_YangleSAME| stf_playerangleON) p_set_pointer(skelanime,kuramochi_anime) p_BGcheckYset p_save_nowpos p_hitOFF p_program(s_kuramochi_init) p_while p_program(s_kuramochi_main) p_loop e_kuramochi: p_initialize(item) p_setbit(flag,stf_moveON) p_setf(animepositionY,27) p_softspritemodeON p_sethitbox(110,100) p_hitON p_animereset p_while p_animeinc p_program(s_kura_coin_main) p_loop /*################*/ #else /*################*/ /*************************************************************************************************** C Program ***************************************************************************************************/ #define jump_flag (execstp->s[stw_work0].d) static HitCheckRecord kuramoti_hit = { OBJNAME_PUNCHATTACK, 0,2,1,0, /* flag,ap,hp,coin */ 120,60, /* player attack hitarea */ 100,50, /* player damage hitarea */ }; static HitCheckRecord kura_coin_hit = { OBJNAME_DAMAGE, 0,2,1,0, /* flag,ap,hp,coin */ 120,60, /* player attack hitarea */ 100,50, /* player damage hitarea */ }; /*************************************************************************************************** Initial ***************************************************************************************************/ extern void s_kuramochi_init(void) { execstp->s[stw_gravity].f = 3.0; execstp->s[stw_friction].f = 1.0; execstp->s[stw_specificG].f = 2.0; stSetSkelAnimeNumber(0); execstp->s[stw_alpha].d = 0; } /*************************************************************************************************** HitCheck ***************************************************************************************************/ static void kura_HitCheck(void) { s_set_hitparam(execstp,&kuramoti_hit); /* Set HitCheck Param */ if ( obj_mail & EMAIL_PLAYERHIT ){ if ( obj_mail & EMAIL_PLAYERDAMAGE ) { obj_angleY = obj_targetangle + 0x8000; obj_speedY = 30; } if ( obj_mail & EMAIL_PLAYERATTACK ) { obj_mode = 5; } Mbitclr(obj_mail,EMAIL_PLAYERHITALL); } } /*************************************************************************************************** Kuramochi Move ****************************************************************************************************/ static void kura_JumpEvent(char bgflag) { short anim_frame = execstp->map.skelanim.frame; switch (jump_flag) { case 1: stSetSkelAnimeNumber(1); if (anim_frame == 5) { obj_speedF = 20; obj_speedY = 40; } if (s_check_animeend() == 1) { jump_flag = 2; objsound(NA_SE2_FLOG_JUMP); } break; case 2: stSetSkelAnimeNumber(2); if ((bgflag & 0x01) == 0x01) { obj_speedF = 0; obj_speedY = 0; // jump_flag = 3; jump_flag = 0; } break; case 3: stSetSkelAnimeNumber(3); if (s_check_animeend() == 1) { jump_flag = 0; } break; case 4: stSetSkelAnimeNumber(4); obj_speedF = 10; if (obj_timer > FRAME*2) { jump_flag = 0; obj_speedF = 0; execstp->map.skelanim.frame = 0; } break; case 5: stSetSkelAnimeNumber(4); obj_speedF = 5; break; } //rmonpf(("%d .. frame %d \n",jump_flag,anim_frame)); } /*************************************************************************************************** Kuramochi Move ****************************************************************************************************/ static void kura_MoveEvent(void){ short bgflag; ShapeRandomAngle(execstp,obj_attX,obj_attY,obj_attZ,200); bgflag = ObjMoveEvent(); if ((bgflag & 0x09)==0x09 && jump_flag == 0) { if ((int)(Randomf()*6) == 1) { //Walk jump_flag = 4; obj_timer = 0; } else jump_flag = 1; } kura_JumpEvent(bgflag); kura_HitCheck(); if (PlayerApproach(obj_attX,obj_attY,obj_attZ,800)==0 && (bgflag & 0x09)==0x09) { obj_mode = 3; } } /*************************************************************************************************** Kuramochi Home ****************************************************************************************************/ static void kura_HomeEvent(void){ short bgflag; float dx = obj_attX - obj_worldX; float dz = obj_attZ - obj_worldZ; short targetAngleY = atan(dz,dx); execstp->s[stw_angleY].d = s_chase_angle(execstp->s[stw_angleY].d,targetAngleY,0x800); bgflag = ObjMoveEvent(); if ((bgflag & 0x09)==0x09 && jump_flag == 0) { jump_flag = 5; } kura_JumpEvent(bgflag); kura_HitCheck(); if (ObjApproach(execstp,obj_attX,obj_attY,obj_attZ,100)) { s_makeobj_nowpos(execstp,S_coin,e_kuramochi); objsound(NA_SE2_FLOG_APPEAR); stSetSkelAnimeNumber(0); obj_mode = 4; jump_flag = 0; } if (PlayerApproach(obj_attX,obj_attY,obj_attZ,800)==1) { obj_mode = 2; jump_flag = 0; } } /*************************************************************************************************** Kuramochi Sleep ****************************************************************************************************/ static void kura_SleepEvent(void){ obj_alpha -= 6; if (obj_alpha < 0 ) { obj_alpha = 0; execstp->status = 0; } } /*************************************************************************************************** Kuramochi Remove ****************************************************************************************************/ static void kura_RemoveEvent(void){ if (obj_timer == 1) { iwa_MakeCoin(execstp,5); obj_remove_sound(NA_SE2_FLOG_DOWN); // kura_coinPtr = s_makeobj_nowpos(execstp,S_bluecoin,e_escape_coin2); // kura_coinPtr->s[stw_angleY].d = obj_angleY; // kura_coinPtr->s[stw_speedF].f = 10; // kura_coinPtr->s[stw_speedY].f = 50; s_kemuri(); execstp->status = 0; } } /*************************************************************************************************** Main ****************************************************************************************************/ extern void s_kuramochi_main(){ switch(obj_mode) { case 0: case 1: obj_alpha += 12; if (obj_alpha > 255) { obj_alpha = 255; motherp->status = 0; obj_mode = 2; } break; case 2: kura_MoveEvent(); if (obj_timer > 30) s_hitON(); break; case 3: kura_HomeEvent(); break; case 4: kura_SleepEvent(); break; case 5: kura_RemoveEvent(); break; } } /*************************************************************************************************** Coin ****************************************************************************************************/ extern void s_kura_coin_main() { s_set_hitparam(execstp,&kura_coin_hit); /* Set HitCheck Param */ switch (obj_mode) { case 0: if (PlayerApproach(obj_worldX,obj_worldY,obj_worldZ,400)) { s_makeobj_nowpos(execstp,S_kuramochi,e_kura_real); objsound(NA_SE2_FLOG_APPEAR); obj_mode = 1; } break; case 1: break; } obj_mail = 0; } /*################*/ #endif /*################*/