493 lines
13 KiB
ArmAsm
493 lines
13 KiB
ArmAsm
/********************************************************************************
|
|
-------------------------
|
|
Ultra 64 MARIO Brothers
|
|
-------------------------
|
|
Stage8 MoveBg Strategy
|
|
|
|
Feburary 26 1996 programed by Iwamoto Daiki
|
|
********************************************************************************/
|
|
|
|
/*################*/
|
|
#ifdef ASSEMBLER
|
|
/*################*/
|
|
|
|
/********************************************************************************
|
|
Path Data
|
|
********************************************************************************/
|
|
|
|
/********************************************************************************
|
|
pyramid Pencil Path Data
|
|
********************************************************************************/
|
|
e_py_pencil:
|
|
p_initialize(moveBG)
|
|
p_setbit(flag,stf_moveON | stf_ALLangleSAME)
|
|
p_setshapeinfo(py_obj02_check_info)
|
|
p_program(s_pencil_init)
|
|
|
|
p_while
|
|
p_program(s_pencil_main)
|
|
p_program(stMainMoveBG)
|
|
p_loop
|
|
|
|
/********************************************************************************
|
|
pyramid Wall Path Data
|
|
********************************************************************************/
|
|
e_py_wall:
|
|
p_initialize(moveBG)
|
|
p_setbit(flag,stf_moveON | stf_ALLangleSAME)
|
|
p_setshapeinfo(py_obj03_check_info)
|
|
p_program(s_py_wall_init)
|
|
|
|
p_while
|
|
p_program(s_py_wall_main)
|
|
p_program(stMainMoveBG)
|
|
p_loop
|
|
|
|
|
|
/********************************************************************************
|
|
pyramid Gondola Path Data
|
|
********************************************************************************/
|
|
e_py_gondola:
|
|
p_initialize(moveBG)
|
|
p_setbit(flag,stf_moveON)
|
|
p_setshapeinfo(py_obj04_check_info)
|
|
p_save_nowpos
|
|
p_setf(erasedist,20000)
|
|
p_program(s_py_gondola_init)
|
|
|
|
p_while
|
|
p_program(s_py_gondola_main)
|
|
p_program(stMainMoveBG)
|
|
p_loop
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
|
|
e_py_gondola_dot:
|
|
p_initialize(option)
|
|
p_setbit(flag,stf_moveON)
|
|
p_softspritemodeON
|
|
|
|
p_while
|
|
p_program(s_gondola_dot_main)
|
|
p_loop
|
|
|
|
|
|
/********************************************************************************
|
|
Sabaku Pyramid Top Path Data
|
|
********************************************************************************/
|
|
e_sb_pytop:
|
|
p_initialize(moveBG)
|
|
p_setbit(flag,stf_moveON)
|
|
p_setshapeinfo(sa_mobj_01_c_info)
|
|
p_save_nowpos
|
|
p_setf(erasedist,20000)
|
|
p_program(s_sb_pytop_init)
|
|
|
|
p_while
|
|
p_program(s_sb_pytop_main)
|
|
p_program(stMainMoveBG)
|
|
p_loop
|
|
|
|
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
e_sb_py_hahen:
|
|
p_initialize(option)
|
|
p_setbit(flag,stf_moveON)
|
|
p_program(s_sb_py_hahen_init)
|
|
|
|
p_while
|
|
p_program(s_sb_py_hahen_main)
|
|
p_loop
|
|
|
|
/*---------------------------------------------------------------------------------*/
|
|
e_pytop_dummy:
|
|
p_initialize(item)
|
|
p_setbit(flag,stf_moveON)
|
|
p_sethitbox(50,50)
|
|
p_hitON
|
|
|
|
p_while
|
|
p_program(s_pytop_dummy_main)
|
|
p_loop
|
|
|
|
|
|
/*################*/
|
|
#else
|
|
/*################*/
|
|
|
|
|
|
/***************************************************************************************************
|
|
C Program
|
|
****************************************************************************************************/
|
|
|
|
|
|
/*==================================================================================================
|
|
Pyramid Pencil
|
|
====================================================================================================*/
|
|
#define pencil_count (execstp->s[stw_work0].d)
|
|
#define pencil_flag (execstp->s[stw_work1].d)
|
|
|
|
/***************************************************************************************************
|
|
Init
|
|
****************************************************************************************************/
|
|
extern void s_pencil_init()
|
|
{
|
|
obj_attY = obj_worldY;
|
|
pencil_count = 0;
|
|
pencil_flag = 0;
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Main
|
|
****************************************************************************************************/
|
|
extern void s_pencil_main()
|
|
{
|
|
float offsetY;
|
|
int wait;
|
|
|
|
if (pencil_count == -1) {
|
|
if (obj_timer == 0x20) { pencil_count = 0; obj_timer=0; }
|
|
else {
|
|
obj_speedZ = 0; obj_anglespeedX = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
wait = (10-pencil_count);
|
|
if (wait < 0) wait*=-1;
|
|
wait = wait - 6;
|
|
if (wait < 0) wait = 0;
|
|
|
|
if (obj_timer == (0x8 + wait)) {
|
|
obj_timer = 0;
|
|
pencil_count++;
|
|
|
|
if (pencil_count == 20) {
|
|
if (pencil_flag==0) pencil_flag = 1;
|
|
else pencil_flag = 0;
|
|
pencil_count = -1;
|
|
}
|
|
}
|
|
|
|
if (wait==4 || wait==3) wait = 4;
|
|
else if (wait==2 || wait==1) wait = 2;
|
|
else if (wait==0) wait = 1;
|
|
|
|
|
|
if (obj_timer < 0x08*wait) {
|
|
|
|
if (pencil_flag == 0){ obj_speedZ = 20/wait; obj_anglespeedX = 0x400/wait; }
|
|
else { obj_speedZ = -20/wait; obj_anglespeedX = -0x400/wait; }
|
|
|
|
obj_worldZ += obj_speedZ;
|
|
obj_angleX += obj_anglespeedX;
|
|
|
|
if (I_abs(obj_angleX & 0x1fff) < 0x320 && obj_anglespeedX != 0) {
|
|
objsound(NA_SE2_ROLLER_ROLL);
|
|
}
|
|
|
|
offsetY = sin(obj_angleX*(0x8000/0x2000))*23.;
|
|
if (offsetY < 0) offsetY *= -1;
|
|
obj_worldY = obj_attY + offsetY;
|
|
if (obj_timer == 0x08*wait-1) Viewshaking(VS_SMALL,obj_worldX,obj_worldY,obj_worldZ);
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
/*==================================================================================================
|
|
Pyramid Wall0
|
|
====================================================================================================*/
|
|
#define py_wall_TIME 100
|
|
#define py_wall_set (execstp->s[stw_programselect].d)
|
|
|
|
/***************************************************************************************************
|
|
Init
|
|
****************************************************************************************************/
|
|
extern void s_py_wall_init()
|
|
{
|
|
switch (py_wall_set) {
|
|
case 0: break;
|
|
case 1: obj_worldY -= 256;
|
|
obj_timer += 50;
|
|
break;
|
|
|
|
case 2: obj_worldY -= 512;
|
|
obj_mode = 1;
|
|
break;
|
|
}
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Main
|
|
****************************************************************************************************/
|
|
extern void s_py_wall_main()
|
|
{
|
|
switch (obj_mode) {
|
|
case 0: obj_speedY = -512./py_wall_TIME;
|
|
if (obj_timer == py_wall_TIME) obj_mode = 1;
|
|
break;
|
|
|
|
case 1: obj_speedY = +512./py_wall_TIME;
|
|
if (obj_timer == py_wall_TIME) obj_mode = 0;
|
|
break;
|
|
}
|
|
|
|
obj_worldY += obj_speedY;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*==================================================================================================
|
|
Pyramid Gondola
|
|
====================================================================================================*/
|
|
/***************************************************************************************************
|
|
Main
|
|
****************************************************************************************************/
|
|
extern void s_py_gondola_init()
|
|
{
|
|
int i;
|
|
|
|
for (i=0; i<10; i++) {
|
|
StrategyRecord* stratp = s_makeobj_nowpos(execstp,S_ironball_noshadow,e_py_gondola_dot);
|
|
stratp->s[stw_worldY].f = (4600 - 460*i);
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Main
|
|
****************************************************************************************************/
|
|
extern void s_py_gondola_main()
|
|
{
|
|
|
|
switch (obj_mode) {
|
|
case 0: if (player1stp->ride_strat == execstp) {
|
|
obj_mode = 1;
|
|
}
|
|
break;
|
|
|
|
case 1: obj_worldY = obj_attY - sin(obj_timer*0x1000)*10;
|
|
if (obj_timer == 8) {obj_mode = 2; }
|
|
break;
|
|
|
|
case 2: obj_speedY = -10;
|
|
obj_worldY += obj_speedY;
|
|
if (obj_worldY < 128) {
|
|
obj_worldY = 128;
|
|
obj_mode = 3;
|
|
}
|
|
break;
|
|
|
|
case 3: obj_worldY = 128 + sin(obj_timer*0x1000)*10;
|
|
if (obj_timer >= 8) {
|
|
obj_speedY = 0;
|
|
obj_worldY = 128;
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
/*==================================================================================================
|
|
Pyramid Gondola Dot
|
|
====================================================================================================*/
|
|
/***************************************************************************************************
|
|
Main
|
|
****************************************************************************************************/
|
|
extern void s_gondola_dot_main()
|
|
{
|
|
StrategyRecord* stratp;
|
|
|
|
s_set_scale(0.15);
|
|
|
|
stratp = (StrategyRecord*) s_find_obj(e_py_gondola);
|
|
|
|
if(stratp != 0) {
|
|
if (stratp->s[stw_mode].d != 0) {
|
|
execstp->status = 0;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*==================================================================================================
|
|
Pyramid Top
|
|
====================================================================================================*/
|
|
#define pytop_bombflag (execstp->s[stw_work0].d)
|
|
|
|
/***************************************************************************************************
|
|
Main
|
|
****************************************************************************************************/
|
|
extern void s_sb_pytop_init()
|
|
{
|
|
s_makeobj_absolute(execstp,0,S_NULL,e_pytop_dummy, 1789, 1024, 764,0,0,0);
|
|
s_makeobj_absolute(execstp,0,S_NULL,e_pytop_dummy, 1789, 896,-2579,0,0,0);
|
|
s_makeobj_absolute(execstp,0,S_NULL,e_pytop_dummy,-5883, 1024,-2579,0,0,0);
|
|
s_makeobj_absolute(execstp,0,S_NULL,e_pytop_dummy,-5883, 1024, 764,0,0,0);
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Pyramid Shake
|
|
****************************************************************************************************/
|
|
static void pytop_Shake(void)
|
|
{
|
|
StrategyRecord* stratp;
|
|
|
|
|
|
obj_worldX = obj_attX + sin(obj_timer*0x4000)*40;
|
|
|
|
if (obj_timer < FRAME*2) {
|
|
obj_worldY = obj_attY + I_abs(sin(obj_timer*0x2000)*10);
|
|
}
|
|
else {
|
|
obj_anglespeedY += 0x100;
|
|
if (obj_anglespeedY > 0x1800) {
|
|
obj_anglespeedY = 0x1800;
|
|
obj_speedY = 5;
|
|
}
|
|
obj_animeangleY += obj_anglespeedY;
|
|
obj_worldY += obj_speedY;
|
|
|
|
}
|
|
|
|
|
|
// Viewshaking(VS_SMALL,player_posX+2000,player_posY,player_posZ+2000);
|
|
|
|
if (obj_timer < FRAME*3 ) {
|
|
stratp = s_makeobj_nowpos(execstp,S_sankaku,e_sb_py_hahen);
|
|
stratp->s[stw_speedF].f = 20+(Randomf()*10);
|
|
stratp->s[stw_angleY].d = Randomd();
|
|
stratp->s[stw_work0].f = 0.8;
|
|
stratp->s[stw_gravity].f = 2 + Randomf();
|
|
}
|
|
|
|
if (obj_timer == FRAME*5) {
|
|
obj_mode = 2;
|
|
}
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Pyramid Bomb
|
|
****************************************************************************************************/
|
|
static void pytop_Bomb(void)
|
|
{
|
|
StrategyRecord* stratp;
|
|
short i;
|
|
|
|
s_burneffect(0,0,690);
|
|
|
|
for (i=0; i<30; i++) {
|
|
stratp = s_makeobj_nowpos(execstp,S_sankaku,e_sb_py_hahen);
|
|
stratp->s[stw_speedF].f = 80+(Randomf()*50);
|
|
stratp->s[stw_speedY].f = 20+(Randomf()*80);
|
|
stratp->s[stw_angleY].d = Randomd();
|
|
stratp->s[stw_work0].f = 3.;
|
|
stratp->s[stw_gravity].f = 5 + Randomf()*2;
|
|
}
|
|
|
|
|
|
execstp->status = 0;
|
|
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Main
|
|
****************************************************************************************************/
|
|
extern void s_sb_pytop_main()
|
|
{
|
|
|
|
switch (obj_mode) {
|
|
case 0: if (pytop_bombflag == 4) {
|
|
Na_NazoClearBgm();
|
|
obj_mode = 1;
|
|
}
|
|
break;
|
|
|
|
case 1: if ( obj_timer == 0 ) objsound(NA_SE2_PYRAMID_SHAKING);
|
|
pytop_Shake();
|
|
break;
|
|
|
|
case 2: if ( obj_timer == 0 ) obj_remove_sound(NA_SE2_PYRAMID_EXPLODE);
|
|
pytop_Bomb();
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
}
|
|
/*====================================================================================================*/
|
|
/***************************************************************************************************
|
|
Pyramid Top Hahen Init
|
|
****************************************************************************************************/
|
|
extern void s_sb_py_hahen_init()
|
|
{
|
|
execstp->s[stw_friction].f = 0.999;
|
|
execstp->s[stw_specificG].f = 2.0;
|
|
obj_animecounter = 3;
|
|
|
|
|
|
s_set_scale(execstp->s[stw_work0].f);
|
|
}
|
|
/***************************************************************************************************
|
|
Pyramid Top Hahen Main
|
|
****************************************************************************************************/
|
|
extern void s_sb_py_hahen_main()
|
|
{
|
|
|
|
ObjMoveEvent();
|
|
|
|
obj_animeangleY += 0x1000;
|
|
obj_animeangleX += 0x1000;
|
|
|
|
|
|
if (obj_timer == FRAME*2) {
|
|
execstp->status = 0;
|
|
|
|
}
|
|
|
|
}
|
|
/*====================================================================================================*/
|
|
/***************************************************************************************************
|
|
Pyramid Top Dummy Main
|
|
****************************************************************************************************/
|
|
extern void s_pytop_dummy_main()
|
|
{
|
|
|
|
s_hitON();
|
|
|
|
if ( s_hitcheck(execstp,player1stp)==1 ){
|
|
|
|
mother_work0++;
|
|
|
|
execstp->status = 0;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*################*/
|
|
#endif
|
|
/*################*/
|
|
|
|
|