sm64/data/p/pathgoalbar.p

260 lines
6.0 KiB
OpenEdge ABL

/********************************************************************************
-------------------------
Ultra 64 MARIO Brothers
-------------------------
File : pathgoalbar.s
Description :
Date : 1995.11.8
Author : H.yajima
********************************************************************************/
/*################*/
#ifdef ASSEMBLER
/*################*/
/*----------------------------------------------------------*/
/* goalbar main program */
/*----------------------------------------------------------*/
e_castle_goalbar:
e_goalbar_main:
p_initialize(moveBG)
p_setbit(flag,stf_moveON )
p_shapeDISABLE
p_addf(worldY,300)
p_save_nowpos
p_while
p_program(s_goalbar_main)
p_loop
/*----------------------------------------------------------*/
/* goalbar parts program */
/*----------------------------------------------------------*/
e_goalbar_move:
p_initialize(moveBG)
p_setbit( flag,stf_moveON | stf_YangleSAME)
p_setshapeinfo(lift_0_3_info)
p_while
p_program(s_goalbar_move)
p_program(stMainMoveBG)
p_loop
e_goalbar_updown:
p_initialize(moveBG)
p_setbit( flag,stf_moveON | stf_YangleSAME)
p_setshapeinfo(lift_0_3_info)
p_while
p_program(s_goalbar_updown)
p_program(stMainMoveBG)
p_loop
e_goalbar_stop:
p_initialize(moveBG)
p_setbit( flag,stf_moveON | stf_YangleSAME)
p_setshapeinfo(lift_0_3_info)
p_while
p_program(s_goalbar_stop)
p_program(stMainMoveBG)
p_loop
/*################*/
#else
/*################*/
#define goalbarmake_counter (execstp->s[stw_work0].d)
#define goalbarmake_startangle (execstp->s[stw_work1].d)
#define goalbarmake_addangle (execstp->s[stw_work2].d)
#define goalbarmake_radius (execstp->s[stw_work3].f)
#define goalbarmake_length (execstp->s[stw_work4].f)
#define goalbarmake_speed (execstp->s[stw_work5].f)
/********************************************************************************
-----------------
goalbar program
-----------------
*********************************************************************************/
enum {
GOALBAR_WAIT,
GOALBAR_MAKE,
GOALBAR_DISP,
GOALBAR_REMOVE
};
/********************************************************************************
work(6) speed
work(7) length
********************************************************************************/
extern void s_goalbar_stop(void)
{
if ( execstp->motherobj->s[stw_mode].d == GOALBAR_REMOVE ) s_remove_obj(execstp);
}
#define goalbar_updown_speed 5
#define goalbar_updown_height 700
extern void s_goalbar_updown(void)
{
switch(obj_mode){
case 0:
if ( player1stp->ride_strat == execstp ) obj_mode++;
break;
case 1:
objsound_level(NA_LSE2_MOVE);
if ( obj_timer > goalbar_updown_height/goalbar_updown_speed ){
obj_mode++;
} else {
obj_worldY += goalbar_updown_speed;
}
break;
case 2:
if ( obj_timer > 60 ) obj_mode++;
break;
case 3:
objsound_level(NA_LSE2_MOVE);
if ( obj_timer > goalbar_updown_height/goalbar_updown_speed ){
obj_mode = 0;
} else {
obj_worldY -= goalbar_updown_speed;
}
break;
}
if ( execstp->motherobj->s[stw_mode].d == GOALBAR_REMOVE ){
s_remove_obj(execstp);
}
}
extern void s_goalbar_move(void)
{
int time = execstp->s[stw_work7].f/execstp->s[stw_work6].f;
switch(obj_mode){
case 0:
if( obj_timer > time ) obj_mode++;
obj_speedF = -execstp->s[stw_work6].f;
break;
case 1:
if( obj_timer > time ) obj_mode=0;
obj_speedF = execstp->s[stw_work6].f;
break;
}
s_calcobj_speedF();
obj_worldX += obj_speedX;
obj_worldZ += obj_speedZ;
if ( execstp->motherobj->s[stw_mode].d == GOALBAR_REMOVE ) s_remove_obj(execstp);
}
/********************************************************************************
goalbar main program
********************************************************************************/
static void goalbar_makeobj(short No,Path *path)
{
short angle;
StrategyRecord *stratp;
stratp = s_makeobj_nowpos(execstp,No,path);
angle = goalbarmake_counter * goalbarmake_addangle + goalbarmake_startangle;
stratp->s[stw_angleY].d = angle;
stratp->s[stw_worldX].f += goalbarmake_radius * sin(angle);
stratp->s[stw_worldY].f += goalbarmake_counter * 100;
stratp->s[stw_worldZ].f += goalbarmake_radius * cos(angle);
stratp->s[stw_work7].f = goalbarmake_length;
stratp->s[stw_work6].f = goalbarmake_speed;
goalbarmake_counter++;
}
/********************************************************************************
goalbar main program
********************************************************************************/
extern void s_goalbar_make(void)
{
int ang = 8;
goalbarmake_counter = 0;
goalbarmake_startangle = 0;
goalbarmake_addangle = 0x2000;
goalbarmake_radius = 500+204;
goalbarmake_length = 380;
goalbarmake_speed = 3;
goalbar_makeobj(S_lift1 ,e_goalbar_stop);
goalbar_makeobj(S_lift1 ,e_goalbar_move);
goalbar_makeobj(S_lift1 ,e_goalbar_stop);
goalbar_makeobj(S_lift1 ,e_goalbar_move);
goalbar_makeobj(S_lift1 ,e_goalbar_stop);
goalbar_makeobj(S_lift1 ,e_goalbar_move);
goalbar_makeobj(S_lift1 ,e_goalbar_stop);
goalbar_makeobj(S_lift3 ,e_goalbar_updown);
}
/********************************************************************************
goalbar main program
********************************************************************************/
extern void s_goalbar_main(void)
{
float playerY = player1stp->s[stw_worldY].f;
obj_playerdist = s_distance_obj2obj(execstp,player1stp);
switch(obj_mode){
case GOALBAR_WAIT:
if ( playerY > ( obj_attY-1000 ) ) obj_mode++;
break;
case GOALBAR_MAKE:
s_goalbar_make(); obj_mode++;
break;
case GOALBAR_DISP:
if ( playerY < ( obj_attY-1000 ) ) obj_mode++;
break;
case GOALBAR_REMOVE:
obj_mode = 0;
break;
}
}
/*################*/
#endif
/*################*/
/*===============================================================================
end end end end end end end end
===============================================================================*/