260 lines
6.0 KiB
OpenEdge ABL
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
|
|
===============================================================================*/
|
|
|