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

203 lines
4.8 KiB
ArmAsm

/********************************************************************************
-------------------------
Ultra 64 MARIO Brothers
-------------------------
Victory Star Strategy
Feburary 31 1996 programed by Iwamoto Daiki
********************************************************************************/
/*################*/
#ifdef ASSEMBLER
/*################*/
/********************************************************************************
Victory Star Path Data
********************************************************************************/
e_V_star:
p_initialize(item)
p_setbit(flag,stf_moveON )
p_program(s_V_star_init)
p_while
p_program(s_V_star_event)
p_loop
/*------------------------------------------------------------*/
e_V_starspark:
p_initialize(effect)
p_softspritemodeON
p_setbit(flag,stf_moveON)
p_setf(animepositionY,100/4)
p_animereset
p_while
p_animeinc
p_program(s_V_starspark)
p_loop
/*------------------------------------------------------------*/
e_V_stardust:
p_initialize(option)
p_softspritemodeON
p_setbit(flag,stf_moveON)
p_animereset
p_while
p_program(s_V_stardust)
p_loop
/*################*/
#else
/*################*/
/***************************************************************************************************
C Program
****************************************************************************************************/
#define v_star_radius (execstp->s[stw_work5].d)
#define star_shape (execstp->s[stw_work0].d)
#define VER2 1
#define I_STAR 0
#define I_KEY 1
/***************************************************************************************************
Victory Star Init
***************************************************************************************************/
extern void s_V_star_init(void)
{
obj_attX = player_posX;
obj_worldY = player_posY + 30;
obj_attZ = player_posZ;
execstp->s[stw_angleY].d = player_angleY + 0x8000;
v_star_radius = 100;
#if VER2
if (activeStageNo == 30 || activeStageNo == 33) {
execstp->map.shape = stageShapes[S_kopakey]; //Change Shape Koppa Clear
obj_animeangleX = 0;
obj_animeangleZ = 0xc000;
s_set_scale(0.1);
star_shape = I_KEY;
}
else {
execstp->map.shape = stageShapes[S_polystar]; //Change Shape
obj_animeangleX = 0;
obj_animeangleZ = 0;
s_set_scale(0.4);
star_shape = I_STAR;
}
#else
execstp->map.shape = stageShapes[S_polystar]; //Change Shape
obj_animeangleX = 0;
obj_animeangleZ = 0;
s_set_scale(0.4);
star_shape = I_STAR;
#endif
}
/***************************************************************************************************
Victory Star Rotation
***************************************************************************************************/
static void StarRotation(void)
{
execstp->s[stw_worldX].f = obj_attX + sin(obj_angleY)*(v_star_radius/2);
execstp->s[stw_worldZ].f = obj_attZ + cos(obj_angleY)*(v_star_radius/2);
execstp->s[stw_worldY].f += 5;
obj_animeangleY += 0x1000;
obj_angleY += 0x2000;
if (obj_timer == 40) {
obj_mode = 1;
}
if (obj_timer < 35) {
s_makeobj_nowpos(execstp,S_spark,e_V_starspark);
v_star_radius++;
}
else {
v_star_radius -= 20;
}
}
/***************************************************************************************************
Victory Star Scale
***************************************************************************************************/
static void StarScaleUp(void)
{
if (obj_timer < 10) {
if (star_shape == I_STAR) s_set_scale((float)(obj_timer)/10.);
else s_set_scale((float)(obj_timer)/30.);
obj_animeangleY += 0x1000;
}
else {
obj_animeangleY = player_angleY;
}
if (obj_timer == 59) {
execstp->status = 0;
}
}
/***************************************************************************************************
Victory Star Event
***************************************************************************************************/
extern void s_V_star_event(void)
{
switch (obj_mode) {
case 0: StarRotation(); break;
case 1: StarScaleUp(); break;
}
}
/***************************************************************************************************
Victory Star Spark
***************************************************************************************************/
extern void s_V_starspark(void)
{
execstp->s[stw_worldY].f -= 15;
if (obj_timer == 12) execstp->status = 0;
}
/***************************************************************************************************
Victory Star Dust
***************************************************************************************************/
extern void s_V_stardust(void)
{
s_burneffect(0,10,30);
execstp->status = 0;
}
/*################*/
#endif
/*################*/