/******************************************************************************** ------------------------- 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 ===============================================================================*/