304 lines
8.5 KiB
OpenEdge ABL
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
|
|
===============================================================================*/
|
|
|
|
|
|
|
|
|