/******************************************************************************** ------------------------- Ultra 64 MARIO Broth_wiers ------------------------- File : pathwind.s Description : Date : 1995. Author : H.yajima ********************************************************************************/ /*################*/ #ifdef ASSEMBLER /*################*/ e_wind_effect: p_initialize(effect) p_setbit(flag,stf_moveON ) p_softspritemodeON p_while p_program(s_wind_object) p_loop e_wind_object: p_initialize(player_friend) p_setbit(flag,stf_moveON ) p_softspritemodeON p_while p_program(s_wind_object) p_loop e_wind: p_initialize(option) p_setbit(flag,stf_moveON | stf_playerdistON | stf_playerangleON ) p_save_nowpos p_while p_program(s_wind) p_loop e_wind_ping: p_initialize(moveBG) p_setbit(flag,stf_moveON | stf_YangleSAME | stf_playerdistON | stf_playerangleON ) p_setshapeinfo(ping_info) p_set_pointer(skelanime,ping_anime) p_set_skelanime_number(0) p_setmovedata(0,-400,-50,0,0,200,0,0) p_set_scale(600) p_save_nowpos p_while p_program(s_wind_ping) p_program(stMainMoveBG) p_loop /*################*/ #else /*################*/ #define windping_dx(p) (p->s[stw_work3].f) /* dx */ #define windping_dz(p) (p->s[stw_work4].f) /* dz */ #define windping_pointer(p) (p->s[stw_work6].d) #define windping_timer(p) (p->s[stw_work7].d) /******************************************************************************** C Program (wind hitcheck program) ********************************************************************************/ #define wind_pointer (execstp->s[stw_work0].pointer) static HitCheckRecord wind_hit = { OBJNAME_WIND, 0,0,0,0, /* flag,ap,hp,coin */ 20,70, /* player attack hitarea */ 20,70, /* player damage hitarea */ }; extern void s_wind_object(void) { StrategyRecord *stp; float dist; float dx,dz,dr; s_set_hitparam(execstp,&wind_hit); if ( obj_timer == 0 ){ wind_pointer = (void *)s_find_obj(e_wind_ping); s_random_XYZ_offset(execstp,100); obj_speedF = 100*cos(obj_angleX); obj_speedY = -100*sin(obj_angleX); obj_angleY += s_random_f(obj_programselect * 500); obj_alpha = 100; } s_optionmove_F(); if(obj_timer > 15 ) s_remove_obj(execstp); stp = (StrategyRecord *)wind_pointer; if ( stp != NULL ){ dx = windping_dx(stp) - obj_worldX; dz = windping_dz(stp) - obj_worldZ; dist = sqrtf(dx*dx+dz*dz); if ( dist < 300 ){ s_remove_obj(execstp); s_hitOFF(); } } #if 0 if ( WallCheck(&obj_worldX,&obj_worldY,&obj_worldZ,50,200) ) s_remove_obj(execstp); #endif } /******************************************************************************** C Program (wind control program) ********************************************************************************/ extern void s_make_wind(int ysize,float scale,float x,float y,float z) { if ( frameCounter & 1 ){ s_makeobj_chain_scale(ysize,x,y,z,0.5, execstp,S_snowdust, e_wind_effect); s_makeobj_chain_scale(ysize,x,y,z,scale,execstp,S_NULL,e_wind_object); } else { s_makeobj_chain_scale(ysize,x,y,z,scale,execstp,S_hiteffect,e_wind_object); } s_makeobj_chain_scale(ysize,x,y,z,scale,execstp,S_NULL,e_wind_object); } extern void s_wind(void) { int flag = 0; short angle; float wpos[3]; if ( obj_timer == 0 ) obj_work0 = obj_angleY; if ( obj_process == 0 ){ obj_playerdist = 0; s_copy_f(wpos,&obj_worldX); s_set_world(execstp,1100,3328,1164); if ( s_hitcheck_message_entry(1000,30,0x7fff )) obj_process++; s_copy_f(&obj_worldX,wpos); } else if ( obj_process == 1 ){ if ( s_call_enemydemo(DLOG_LOOKUP,ENEMYDEMO_SETMESSAGE,153,0) ) obj_process++; } else { if ( obj_playerdist < 1500 && s_abs_f(player_worldY - obj_attY ) < 500 ){ if ( ((short)(angle = obj_targetangle - obj_work0)) > 0 ){ if ( angle < 0x1500 ) obj_angleY = obj_targetangle; else obj_angleY = obj_work0 + (0x1500); } else { if ( angle > -(0x1500) ) obj_angleY = obj_targetangle; else obj_angleY = obj_work0 - (0x1500); } s_make_wind(12,3,0,0,0); objsound_level(NA_LSE3_SNOWMAN_BREATH); } } } static int wind_ping_return(void) { obj_speedF = 0; s_set_skelanime_speed(0,1.0); obj_anglespeedY = 0x400; obj_angleY += obj_anglespeedY; if ( obj_timer == 31 ) return(1); else return(0); } typedef struct { int time; int animeNo; float speed; float anime; } WindPingRecord; static WindPingRecord wind_ping_data[] = { { 60, 0, 6, 1.0 }, { 30, 3, 0, 1.0 }, { 30, 0, 12, 2.0 }, { 30, 3, 0, 1.0 }, { 30, 0, -6, 1.0 }, { 30, 3, 0, 1.0 }, { -1, 0, 0, 0 }, }; extern void s_wind_ping(void) { float dx,dz; float dr = 100; obj_anglespeedY = 0; s_enemybgcheck(); switch(obj_mode){ case 0: if ( obj_timer == 0 ){ windping_pointer(execstp) = 0; windping_timer(execstp) = 0; } if ( windping_timer(execstp) < wind_ping_data[windping_pointer(execstp)].time ){ windping_timer(execstp)++; } else { windping_timer(execstp) = 0; windping_pointer(execstp)++; if ( wind_ping_data[windping_pointer(execstp)].time < 0 ){ windping_pointer(execstp) = 0; } } if ( obj_worldX < 300 ) obj_mode++; else { obj_speedF = wind_ping_data[windping_pointer(execstp)].speed ; s_set_skelanime_speed( wind_ping_data[windping_pointer(execstp)].animeNo, wind_ping_data[windping_pointer(execstp)].anime ); } break; case 1: if ( wind_ping_return() ) obj_mode++; break; case 2: obj_speedF = 12; s_set_skelanime_speed(0,2.0); if ( obj_worldX > 1700 ) obj_mode++; break; case 3: if ( wind_ping_return() ) obj_mode = 0; break; } s_enemymove(-78); if ( s_erase_height(1000) == 0 ) sound_pingwalk(1); /*================================== ping hitcheck program ==========================*/ dx = obj_worldX + 60 * sin( -0x2444 ); dz = obj_worldZ + 60 * cos( -0x2444 ); dx += dr * sin( -0x2444 + 0x4000 ); dz += dr * cos( -0x2444 + 0x4000 ); windping_dx(execstp) = dx; windping_dz(execstp) = dz; // dbErrPrint("x %d",(int)dx); // dbErrPrint("z %d",(int)dz); // dbErrPrint("r %d",(int)dr); /*===================================================================================*/ dbErrPrint("x %d",(int)obj_worldX); dbErrPrint("z %d",(int)obj_worldZ); } /*################*/ #endif /*################*/ /*=============================================================================== end end end end end end end end ===============================================================================*/