sm64/data/p/pathdoor.p

304 lines
8.5 KiB
OpenEdge ABL

/********************************************************************************
-------------------------
Ultra 64 MARIO Brothers
-------------------------
File : pathdoor.s
Description : door program
Date : 1995.9.20
Author : H.yajima
********************************************************************************/
/********************************************************************************
-------------------------
Ultra 64 MARIO Brothers
-------------------------
File : pathdoor.s
Description : door program
Date : 1995.9.20
Author : H.yajima
********************************************************************************/
/********************************************************************************/
/* ANIMATION HEADER DEFINE door */
/********************************************************************************/
#define ANM_door_basedata 0
#define ANM_door_open1 1
#define ANM_door_open2 2
#define ANM_door_close1 3
#define ANM_door_close2 4
/*==============================================================================*/
/* END END */
/*==============================================================================*/
/********************************************************************************
--------------
Door Program
--------------
********************************************************************************/
/*################*/
#ifdef ASSEMBLER
/*################*/
/********************************************************************************/
/* --------------- */
/* skeleton door */
/* --------------- */
/********************************************************************************/
/*------------------------------------------------------------------------------*/
e_tripdoor:
p_initialize(moveBG)
p_setd(objname,OBJNAME_TRIPDOOR)
p_jmp(path_door_common)
/*------------------------------------------------------------------------------*/
e_door:
p_initialize(moveBG)
p_setd(objname,OBJNAME_DOOR)
path_door_common:
p_setbit( flag,stf_moveON | stf_YangleSAME | stf_alldispON | stf_playerdistON )
p_set_pointer(skelanime,door_anime)
p_set_skelanime_number(0)
p_setshapeinfo(hitdoor_info)
p_sethitbox(80,100)
p_hitON
p_setf(movebg_checkdist,1000)
p_save_nowpos
p_program(s_doorsystem_init)
p_while
p_program(s_normal_door)
p_loop
/*------------------------------------------------------------------------------*/
/*################*/
#else
/*################*/
/********************************************************************************/
/* --------------- */
/* skeleton door */
/* --------------- */
/********************************************************************************/
/********************************************************************************/
/* skeleton door */
/********************************************************************************/
#define DOOR_NORMAL 0
#define DOOR_OPEN1 1
#define DOOR_OPEN2 2
#define DOOR_CLOSE1 3
#define DOOR_CLOSE2 4
#define door_areatotal (execstp->s[stw_work0].d)
#define door_areanumber0 (execstp->s[stw_work1].d)
#define door_areanumber1 (execstp->s[stw_work2].d)
#define door_areanumber2 (execstp->s[stw_work3].d)
#define door_areanumber3 (execstp->s[stw_work4].d)
/********************************************************************************/
/* skeleton door */
/********************************************************************************/
static void door_openanime(int animeNo)
{
s_set_skelanimeNo(animeNo);
if ( s_check_animeend() ) obj_mode = DOOR_NORMAL;
}
/*------------------------------------------------------------------------------*/
/* */
/*------------------------------------------------------------------------------*/
static void s_set_democamera(void)
{
if ( execstp->pathname == (Path *)SegmentToVirtual(e_door) ){
camPlayerInfo[0].demostatus = DEMO_NORMALDOOR;
} else {
camPlayerInfo[0].demostatus = DEMO_TRIPDOOR;
}
camPlayerInfo[0].Stp = execstp;
}
/*------------------------------------------------------------------------------*/
/* normal door program */
/*------------------------------------------------------------------------------*/
typedef struct {
unsigned long door_bit;
unsigned long door_mode;
} DoorRecord;
DoorRecord doordata[] = {
{ EMAIL_DOORCLOSE_1,DOOR_CLOSE1 },
{ EMAIL_DOORCLOSE_2,DOOR_CLOSE2 },
{ EMAIL_DOOROPEN_1 ,DOOR_OPEN1 },
{ EMAIL_DOOROPEN_2 ,DOOR_OPEN2 },
{ -1,0 },
};
static unsigned long dooropen_sound[] = {
NA_SE2_OPENDOOR +NA_DOOR_WOOD,
NA_SE2_METALOPEN
};
static unsigned long doorclose_sound[] = {
NA_SE2_CLOSEDOOR+NA_DOOR_WOOD,
NA_SE2_METALCLOSE
};
static void door_opensound(void)
{
int i = s_check_shapename(S_door3);
if (obj_timer == 0){
objsound( dooropen_sound[i] );
Mbitset(strategy_mainflag,STRATMAIN_DOOROPEN);
}
if (obj_timer == 70){
objsound( doorclose_sound[i] );
}
}
static void door_closesound(void)
{
int i = s_check_shapename(S_door3);
if (obj_timer == 30) objsound( doorclose_sound[i] );
}
extern void s_normal_door(void)
{
int i=0;
while(doordata[i].door_bit != -1){
if ( s_mail_check(doordata[i].door_bit) ){
s_set_democamera();
s_set_newmode(doordata[i].door_mode);
}
i++;
}
switch (obj_mode){
case DOOR_NORMAL: s_set_skelanimeNo(ANM_door_basedata);
break;
case DOOR_OPEN1: door_openanime(ANM_door_open1);
door_opensound();
break;
case DOOR_OPEN2: door_openanime(ANM_door_open2);
door_opensound();
break;
case DOOR_CLOSE1: door_openanime(ANM_door_close1);
door_closesound();
break;
case DOOR_CLOSE2: door_openanime(ANM_door_close2);
door_closesound();
break;
}
if ( obj_mode == DOOR_NORMAL ) stMainMoveBG();
s_doorsystem_main();
}
/*------------------------------------------------------------------------------*/
/********************************************************************************/
/* */
/* door system initialize */
/* */
/********************************************************************************/
extern void s_doorsystem_init(void)
{
float nextX = obj_worldX;
float nextZ = obj_worldZ;
BGCheckData *bgcheck_data;
mcBGGroundCheck(nextX,obj_worldY,nextZ,&bgcheck_data);
if ( bgcheck_data != NULL ) door_areanumber0 = bgcheck_data->BGarea;
nextX = obj_worldX + sin(obj_angleY)*( 200);
nextZ = obj_worldZ + cos(obj_angleY)*( 200);
mcBGGroundCheck(nextX,obj_worldY,nextZ,&bgcheck_data);
if ( bgcheck_data != NULL ) door_areanumber1 = bgcheck_data->BGarea;
nextX = obj_worldX + sin(obj_angleY)*(-200);
nextZ = obj_worldZ + cos(obj_angleY)*(-200);
mcBGGroundCheck(nextX,obj_worldY,nextZ,&bgcheck_data);
if ( bgcheck_data != NULL ) door_areanumber2 = bgcheck_data->BGarea;
if ( ( 0 < door_areanumber0 ) && ( door_areanumber0 < AREA_COUNT_MAX ) ){
map_areaenemy[door_areanumber0][0] = door_areanumber1;
map_areaenemy[door_areanumber0][1] = door_areanumber2;
}
}
/********************************************************************************/
/* */
/* door system main */
/* */
/********************************************************************************/
extern void s_doorsystem_main(void)
{
int flag = 0;
if ( map_areacode != 0 ){
if ( map_areacode == door_areanumber0 ) flag = 1;
else if ( map_areacode == door_areanumber1 ) flag = 1;
else if ( map_areacode == door_areanumber2 ) flag = 1;
else if ( map_areaenemy[map_areacode][0] == door_areanumber1 ) flag = 1;
else if ( map_areaenemy[map_areacode][0] == door_areanumber2 ) flag = 1;
else if ( map_areaenemy[map_areacode][1] == door_areanumber1 ) flag = 1;
else if ( map_areaenemy[map_areacode][1] == door_areanumber2 ) flag = 1;
} else {
flag = 1;
}
if ( flag == 1 ){ MapEnable(&execstp->map); area_door++; } /* shape ON */
if ( flag == 0 ) MapDisable(&execstp->map); /* shape OFF */
execstp->s[stw_imm].d = flag; /* message */
}
/*################*/
#endif
/*################*/
/*===============================================================================
end end end end end end end end
===============================================================================*/