sm64/data/iwa_path/effect.s
2022-12-04 22:27:02 -05:00

348 lines
9.1 KiB
ArmAsm

/********************************************************************************
-------------------------
Ultra 64 MARIO Brothers
-------------------------
Strategy
Feburary 31 1996 programed by Iwamoto Daiki
********************************************************************************/
/*################*/
#ifdef ASSEMBLER
/*################*/
/********************************************************************************
Effect Path Data
********************************************************************************/
/********************************************************************************/
/* Water Buble for Item */
/********************************************************************************/
e_item_buble:
p_initialize(effect)
p_setbit(flag,stf_moveON | stf_FspeedON | stf_YspeedON )
p_softspritemodeON
p_setbit(flag,stf_moveON)
p_animereset
p_program(s_item_buble_init)
p_setf_random(speedY,3,6)
p_setangle_random(angleY,0,0)
p_wait(1)
p_while
p_program(s_item_buble)
p_loop
/*-----------------------------------------------------------------------------*/
e_item_ripple:
p_initialize(effect)
p_setbit(flag,stf_moveON)
p_setf(animeangleX,0)
p_setf(animeangleY,0)
p_setf(animeangleZ,0)
p_animereset
p_program(s_item_ripple_init) /* PlayerRipple Initialize */
p_animeinc
p_wait(6)
p_while
p_program(s_item_ripple_main)
p_animeinc
p_do(6)
p_program(s_item_ripple_main)
p_next
p_loop
/*--------------------------------------------------------------------------------------------*/
e_bombfire:
p_initialize(plfire)
p_setbit(flag,stf_moveON | stf_playerdistON)
p_softspritemodeON
p_setobjname(DAMAGE)
p_setd(ap,2)
p_hitON
p_sethitbox2(150,150,150)
p_animereset
p_program(s_bom_fire_init)
p_while
p_program(s_bom_fire)
p_animeinc
p_loop
/*--------------------------------------------------------------------------------------------*/
e_bom_smoke:
p_initialize(effect)
p_setbit(flag,stf_moveON | stf_FspeedON | stf_YspeedON )
p_softspritemodeON
p_animereset
p_program(s_bomsmoke_init)
p_wait(1)
p_while
p_program(s_samplesmoke_main)
p_animeinc
p_loop
/*--------------------------------------------------------------------------------------------*/
e_iwa_smoke:
p_initialize(effect)
p_setbit(flag,stf_moveON | stf_FspeedON | stf_YspeedON )
p_softspritemodeON
p_animereset
p_wait(1)
p_while
p_program(s_samplesmoke_main)
p_animeinc
p_loop
/*------------------------------------------------------------------------------*/
e_fire_bubble:
p_initialize(option)
p_softspritemodeON
p_setbit(flag,stf_moveON)
p_program(s_fire_bubble_init)
p_addf_random(worldX,-50,100) /* Xposition Random */
p_addf_random(worldY,-50,100) /* Zposition Random */
p_addf_random(worldZ,-50,100) /* Zposition Random */
p_jsr(move_f_bubble) /* 1 Set */
p_wait(1)
p_while
p_jsr(move_f_bubble)
p_program(s_fire_bubble_event)
p_loop
move_f_bubble:
p_addf_random(worldX,-2,4)
p_addf_random(worldZ,-2,4)
p_rts
/*--------------------------------------------------------------------------------------------*/
e_reset:
p_initialize(option)
p_setbit(flag,stf_moveON)
p_while
p_program(s_reset_main)
p_loop
/*################*/
#else
/*################*/
/***************************************************************************************************
C Program
****************************************************************************************************/
/***************************************************************************************************
Water Buble Event
***************************************************************************************************/
extern void s_item_buble_init(void)
{
execstp->s[stw_worldX].f += Randomf()*30;
execstp->s[stw_worldY].f += Randomf()*30;
execstp->s[stw_worldZ].f += Randomf()*30;
}
extern void s_item_buble(void)
{
StrategyRecord *stratp;
float waterY = mcWaterCheck(execstp->s[stw_worldX].f,execstp->s[stw_worldZ].f);
float bgY = execstp->s[stw_worldY].f;
if ( bgY > waterY ){
if (stratfree.next != NULL) {
stratp = s_makeobj(execstp,0,S_rippleA,e_dropripple);
stratp->s[stw_worldX].f = execstp->s[stw_worldX].f;
stratp->s[stw_worldY].f = bgY + 5;
stratp->s[stw_worldZ].f = execstp->s[stw_worldZ].f;
}
execstp->status = 0; /* s_removeobj */ /* object remove */
}
}
/********************************************************************************/
/* item ripple */
/********************************************************************************/
extern void s_item_ripple_init(void)
{
execstp->s[stw_worldY].f = mcWaterCheck(execstp->s[stw_worldX].f,execstp->s[stw_worldZ].f);
}
extern void s_item_ripple_main(void)
{
ulong counter = frameCounter;
/*---- End Check ----*/
if ((counter & 0x00000f) == 0x00) {
execstp->status = 0; /* Shape Remove */
}
}
/***************************************************************************************************/
/***************************************************************************************************
Bomb Fire Event
***************************************************************************************************/
extern void s_bom_fire_init(void)
{
obj_remove_sound(NA_SE2_KIRAI); //SOUND
Viewshake(VS_SMALL);
execstp->s[stw_alpha].d = 255;
}
/***************************************************************************************************
Bomb Fire Event
***************************************************************************************************/
extern void s_bom_fire(void)
{
int i;
if (obj_timer == 9) {
if((mcWaterCheck(execstp->s[stw_worldX].f,execstp->s[stw_worldZ].f)) > execstp->s[stw_worldY].f) {
for (i=0; i<40; i++) s_makeobj_nowpos(execstp,S_waterdrop,e_fire_bubble);
}
else {
s_makeobj_nowpos(execstp,S_dust,e_bom_smoke);
}
execstp->status = 0; /* s_removeobj */ /* object remove */
}
(execstp->s[stw_alpha].d) -= 14;
s_set_scale((float)obj_timer/9+1.0);
}
/***************************************************************************************************
Bom Smoke Init
***************************************************************************************************/
extern void s_bomsmoke_init(void)
{
execstp->s[stw_worldY].f -= 300;
s_set_scale(10.0);
}
/***************************************************************************************************
Water Bomb Buble Init
***************************************************************************************************/
extern void s_fire_bubble_init(void)
{
stSetScale(execstp,2.0,2.0,1.0);
execstp->s[stw_work4].d = (int)(Randomf()*0x800)+0x800;
execstp->s[stw_work5].d = (int)(Randomf()*0x800)+0x800;
obj_timer = (int)(Randomf()*10);
obj_speedY = (int)(Randomf()*4)+4;
}
/***************************************************************************************************
Water Bomb Buble Event
***************************************************************************************************/
extern void s_fire_bubble_event(void)
{
float water = playerWorks[0].water;
/*------ scale Animation ---------*/
execstp->map.scale[0] = sin(execstp->s[stw_work2].d)*0.5+2.0;
execstp->s[stw_work2].d += execstp->s[stw_work4].d;
execstp->map.scale[1] = sin(execstp->s[stw_work3].d)*0.5+2.0;
execstp->s[stw_work3].d += execstp->s[stw_work5].d;
/*------ water check -----------*/
if ( execstp->s[stw_worldY].f > water ){
execstp->status = 0;
execstp->s[stw_worldY].f += 5;
s_makeobj_nowpos( execstp,S_rippleA,e_rippleA ); /* make water ripple */
}
if (obj_timer > FRAME*2) {
execstp->status = 0;
}
execstp->s[stw_worldY].f += execstp->s[stw_speedY].f;
obj_timer++;
}
/*================================================================================================*/
/* Obj Reset Event
/*
/*================================================================================================*/
/***************************************************************************************************
Reset
***************************************************************************************************/
extern void s_reset_main(void)
{
if (PlayerApproach(obj_worldX,obj_worldY,obj_worldZ,(execstp->s[stw_work1].f))==0) {
StrategyRecord* stp = s_makeobj_nowpos(execstp,(int)(execstp->s[stw_work0].d),(unsigned long*)(execstp->s[stw_work2].d));
stp->s[stw_actorcode].d = execstp->s[stw_actorcode].d;
execstp->status = 0;
}
}
/***************************************************************************************************
Reset
***************************************************************************************************/
extern void Obj_reset(int shape,unsigned long *pathpointer,int dist)
{
StrategyRecord* stp = s_makeobj_absolute(execstp,0,S_NULL,e_reset,obj_attX,obj_attY,obj_attZ,0,0,0);
// stp->s[stw_programselect].d = obj_programselect;
stp->s[stw_actorcode].d = execstp->s[stw_actorcode].d;
stp->s[stw_work0].d = shape;
stp->s[stw_work1].f = dist;
stp->s[stw_work2].d = (long)pathpointer;
}
/*################*/
#endif
/*################*/