sm64/data/p/pathmonky.p

725 lines
18 KiB
OpenEdge ABL

/********************************************************************************
-------------------------
Ultra 64 MARIO Brothers
-------------------------
File : pathmonky.s
Description :
Date : 1995.9.14
Author : H.yajima
********************************************************************************/
/***************************************************************/
/* ANIMATION HEADER DEFINE monky */
/***************************************************************/
#define ANM_monky_F_run 0
#define ANM_monky_N_run 1
#define ANM_monky_base_data 2
#define ANM_monky_down 3
#define ANM_monky_excite 4
#define ANM_monky_hoping 5
#define ANM_monky_jump 6
#define ANM_monky_jump_end 7
#define ANM_monky_jump_start 8
#define ANM_monky_wait_A 9
#define ANM_monky_wait_B 10
#define ANM_monky_walk 11
#define ANM_monky_hold 12
/*=============================================================*/
/* END END */
/*=============================================================*/
/*################*/
#ifdef ASSEMBLER
/*################*/
e_monky:
p_initialize(enemyA)
e_monky_common:
p_setbit(flag,stf_moveON | stf_YangleSAME | stf_catchON | stf_playerdistON | stf_playerangleON )
p_setd(objname,OBJNAME_TAKE)
p_setd(enemyinfo,ENEMYINFO_FRIEND_ENEMY)
p_sethitbox(40,40)
p_hitON
p_BGcheckYset
p_set_pointer(skelanime,monky_anime)
p_set_skelanime_number(0)
p_setmovedata(30,-400,-50,0,0,200,0,0)
p_save_nowpos
p_program(s_monky_init)
p_while
p_program(s_monky)
p_loop
/*################*/
#else
/*################*/
/********************************************************************************
MONKY local work
********************************************************************************/
/*===== 2,3,4,5,6 (road program use) === */
#define monky_randomf (execstp->s[stw_work7].f)
#define monky_anime_timer (execstp->s[stw_work0].word[0])
#define monky_anime_repeat (execstp->s[stw_work0].word[1])
#define monky_turnangle (execstp->s[stw_work1].d)
#define monky_eventmode (execstp->s[stw_work8].word[0])
#define monky_eventtimer (execstp->s[stw_work8].word[1])
#define monky_timer (execstp->s[stw_work9].word[0])
#define monky_eventflag (execstp->s[stw_work9].word[1])
#define MONKYHAT 1
enum {
mev_setmessage,
mev_checkmessage,
mev_starsearch,
mev_hatcatch, /* hat catch */
mev_hathave, /* hat have */
mev_hatend, /* hat event end */
mev_wait, /* wait */
mev_stealentry
};
/********************************************************************************
********************************************************************************/
/********************************************************************************
********************************************************************************/
/********************************************************************************
********************************************************************************/
/********************************************************************************
********************************************************************************/
/********************************************************************************
********************************************************************************/
/********************************************************************************
********************************************************************************/
static void monky_overarea_check(void)
{
if ( obj_programselect == 1 ){
if ( s_enemy_areaout() ){
s_reset_posspeed();
obj_mode = mode_monky_wait;
} else if ( obj_movestatus & MOVESTAT_WATER ){
obj_mode = mode_monky_outarea_wait;
}
}
}
static int monky_hatsearch_check(void)
{
if ( obj_programselect == 1 ){
if ( PL_IsPlayerWearingRedHat(marioWorks) ) return(1); /* hatsearch check */
}
return(0);
}
/********************************************************************************
#######
MONKY monky head program
#######
********************************************************************************/
extern unsigned long MonkyHead(int code,MapNode *node, void *data)
{
if (code == MAP_CBACK_EXEC) {
AffineMtx modelmtx;
StrategyRecord *stp = (StrategyRecord *)hmsActiveShape;
if ( stp->childobj != NULL ){
s_calc_skeleton_glbmtx(&modelmtx,(AffineMtx *)data,hmsActiveCamera->matrix);
s_calc_skeleton_glbpos(modelmtx,stp->childobj);
s_copy_worldXYZmappos(stp->childobj);
// rmonpf(("hellow %f\n",stp->childobj->s[stw_worldY].f ));
}
}
return(0);
}
/********************************************************************************
#######
MONKY monky wait animation !!
#######
********************************************************************************/
static void monky_wait_animation(void)
{
obj_speedF = 0;
if ( obj_process == 0 ){
obj_process = Randomf()*4+1; /* random process */
monky_anime_timer = 0; /* timer */
monky_anime_repeat = Randomf()*4+2; /* repeat count */
}
switch (obj_process){
case 1:
s_set_skelanimeNo(ANM_monky_wait_A);
if ( s_check_animeend() ) obj_process = 0;
break;
case 2:
s_set_skelanimeNo(ANM_monky_excite);
if ( s_check_animeend() ) monky_anime_timer++;
if ( monky_anime_timer >= (monky_anime_repeat*2) ) obj_process = 0;
break;
case 3:
s_set_skelanimeNo(ANM_monky_hoping);
if ( s_check_animeend() ) monky_anime_timer++;
if ( monky_anime_timer >= monky_anime_repeat ) obj_process = 0;
break;
case 4:
s_set_skelanimeNo(ANM_monky_wait_B);
if ( s_check_animeend() ) obj_process = 0;
break;
}
}
/*------------------------------------------------------------------*/
/* normal wait */
/*------------------------------------------------------------------*/
static void monky_wait(void)
{
monky_wait_animation();
if ( monky_hatsearch_check() ){
if ( obj_playerdist > 700 && obj_playerdist < 1000 ) obj_mode = mode_monky_runaway;
else if ( obj_playerdist <= 700 && obj_playerdist > 200 ){
if ( s_calc_dangle(obj_targetangle,obj_angleY) > 0x1000 ) obj_mode = mode_monky_look_player;
}
} else {
if ( obj_playerdist < 300 ) obj_mode = mode_monky_runaway;
}
if ( monky_eventmode == mev_starsearch ) obj_mode = mode_monky_rail_demo;
/*----------------------------------------------------------------------*/
if ( monky_eventmode == mev_hatcatch ){
obj_angleY = (player1stp->s[stw_angleY].d+0x8000);
if ( s_next_bgcheck(50,150) ){
obj_mode = mode_monky_turnjump;
} else {
obj_angleY = (player1stp->s[stw_angleY].d+0x4000);
if ( s_next_bgcheck(50,150) ) obj_mode = mode_monky_turnjump;
else {
obj_angleY = (player1stp->s[stw_angleY].d-0x4000);
if ( s_next_bgcheck(50,150) ) obj_mode = mode_monky_turnjump;
}
}
monky_eventmode = mev_hathave;
}
/*----------------------------------------------------------------------*/
if ( obj_programselect == 1 ){
if ( obj_worldY < -1550 ) obj_mode = mode_monky_return;
}
}
/*------------------------------------------------------------------*/
/* monky return */
/*------------------------------------------------------------------*/
static void monky_return(void)
{
float dist;
s_set_skelanimeNo(ANM_monky_F_run);
obj_angleY = s_calc_returnangle();
obj_speedF = 10;
if ( obj_worldY > -1550 ) obj_mode = mode_monky_wait;
}
/*------------------------------------------------------------------*/
/* normal outarea */
/*------------------------------------------------------------------*/
static void monky_outarea_wait(void)
{
monky_wait_animation();
if ( s_enemy_areaout() ){
s_reset_posspeed();
obj_mode = mode_monky_wait;
}
}
/*------------------------------------------------------------------*/
/* stopwait */
/*------------------------------------------------------------------*/
static void monky_stopwait(void)
{
monky_wait_animation();
if ( obj_process == 3 ) s_chase_angleY(obj_targetangle,0x400);
}
/********************************************************************************
#######
MONKY look player
#######
********************************************************************************/
static void monky_look_player(void)
{
int sameflag;
if ( obj_timer == 0 ) obj_speedF = 2 + Randomf()*3;
s_set_skelanimeNo(ANM_monky_walk);
sameflag = s_chase_angleY(obj_targetangle,0x800);
if (sameflag) obj_mode = mode_monky_wait;
if ( monky_hatsearch_check() ){
if ( obj_playerdist > 500 ) obj_mode = mode_monky_runaway;
} else {
if ( obj_playerdist < 300 ) obj_mode = mode_monky_runaway;
}
}
/********************************************************************************
#######
MONKY runaway
#######
********************************************************************************/
static void monky_runaway(void)
{
int flag = 1;
short angle = obj_targetangle+0x8000;
if ( monky_hatsearch_check() ){
flag = 0;
angle = obj_targetangle;
}
if ( obj_timer == 0 ) monky_randomf = 350+Randomf()*100;
s_set_skelanimeNo(ANM_monky_F_run);
s_chase_angleY(angle,0x800);
s_chase_playerspeed(20.0,0.9);
if ( flag ){
if ( obj_playerdist > monky_randomf ) obj_mode = mode_monky_look_player;
} else {
if ( obj_playerdist < monky_randomf ) obj_mode = mode_monky_look_player;
}
if ( flag ){
if ( obj_playerdist < 200 ){
if ( ( obj_movestatus & MOVESTAT_WALL ) && ( s_check_playerslow(10) ) ){
obj_mode = mode_monky_turnjump;
obj_angleY = obj_wallangleY;
} else if ( ( obj_movestatus & MOVESTAT_GAKE ) && ( s_check_playerslow(10) ) ){
obj_mode = mode_monky_turnjump;
obj_angleY += 0x8000;
}
}
}
}
/********************************************************************************
<< turn jump >>
********************************************************************************/
static void monky_turnjump(void)
{
obj_speedF = 10;
s_hitOFF();
if ( obj_process == 0 ){
if ( obj_timer == 0 ){
s_set_jumpstart(45+Randomf()*10,ANM_monky_jump_start);
} else {
if ( obj_movestatus & ( MOVESTAT_STOP | MOVESTAT_BGBOUND ) ){
obj_process++;
obj_speedY = 0;
}
}
} else {
obj_speedF = 0;
s_set_skelanimeNo(ANM_monky_jump_end);
s_hitON();
if ( s_check_animeend() ){
obj_mode = mode_monky_runaway;
}
}
}
/********************************************************************************
##########################
MAINPROGRAM MONKY
##########################
********************************************************************************/
static short monky_rail[] = {
0,1011,2306,-285,
0,1151,2304,-510,
0,1723,1861,-964,
0,2082,1775,-1128,
0,2489,1717,-1141,
0,2662,1694,-1140,
0,2902,1536,-947,
0,2946,1536,-467,
0,2924,1536,72,
0,2908,1536,536,
0,2886,1536,783,
-1,
};
static void monky_rail_demo(void)
{
StrategyRecord *stp;
float dist = 0;
short angle = 0;
if ( ( stp = s_find_obj(e_monky_check)) != NULL ){
dist = s_distanceXZ_obj2obj(execstp,stp->motherobj);
angle = s_calc_targetangle(execstp,stp->motherobj);
}
s_hitOFF();
Mbitset(obj_mainflag,stf_alldispON);
switch(obj_process){
case 0:
s_set_skelanimeNo(ANM_monky_F_run);
road_root(execstp) = monky_rail;
if ( s_road_move(0) != -1 ){
obj_speedF = 10;
s_chase_angleY(road_angleY(execstp),0x400);
obj_worldY = obj_groundY;
} else {
obj_speedF = 0;
obj_process++;
}
break;
case 1:
s_set_skelanimeNo(ANM_monky_hoping);
s_chase_angleY(obj_targetangle,0x400);
if ( s_hitcheck_message_entry( 200, 30 ,0x7fff ) ){
obj_process++; /* Go Next Process */
} else {
break;
}
case 2:
s_set_skelanimeNo(ANM_monky_wait_B);
if ( s_call_talkdemo(DLOG_LOOKDOWN,ENEMYDEMO_LOOKPLAYER,CAM_DEMO_TALK,80) ) obj_process++;
break;
case 3:
s_set_skelanimeNo(ANM_monky_F_run);
if ( s_chase_angleY(angle,0x400)){
obj_speedF = 10;
obj_process++;
}
break;
case 4:
s_set_jumpstart(45+10,ANM_monky_jump_start);
obj_speedF = 10+26;
obj_process++;
break;
case 5:
if ( dist < 50 ) obj_speedF = 0;
if ( obj_movestatus & MOVESTAT_BGBOUND ){
Na_NazoClearBgm();
s_set_skelanimeNo(ANM_monky_hoping);
obj_process++;
monky_timer = 32;
stp->motherobj->s[stw_imm].d = 1;
obj_speedF = 0;
}
break;
case 6:
obj_angleY += 0x800;
monky_timer--;
if ( monky_timer < 0 ){
obj_process++;
stp->motherobj->s[stw_imm].d = 2;
}
break;
case 7:
if ( obj_worldY < -1300 ) s_remove_obj(execstp);
break;
}
}
/********************************************************************************
##########################
MAINPROGRAM MONKY
##########################
********************************************************************************/
static EnemySoundRecord monky_sound[] = {
{ 1,1,10,NA_SE3_MONKEYRUNNING }, /* ANM_monky_F_run 0 */
{ 0,0,0,0 }, /* ANM_monky_N_run 1 */
{ 0,0,0,0 }, /* ANM_monky_base_data 2 */
{ 0,0,0,0 }, /* ANM_monky_down 3 */
{ 1,0,-1,NA_SE3_MONKEYVOICE1 }, /* ANM_monky_excite 4 */
{ 1,0,-1,NA_SE3_MONKEYVOICE0 }, /* ANM_monky_hoping 5 */
{ 0,0,0,0 }, /* ANM_monky_jump 6 */
{ 0,0,0,0 }, /* ANM_monky_jump_end 7 */
{ 1,0,-1,NA_SE3_MONKEYVOICE0 }, /* ANM_monky_jump_start 8 */
{ 1,0,-1,NA_SE3_MONKEYSCRATCH }, /* ANM_monky_wait_A 9 */
{ 1,0,-1,NA_SE3_MONKEYVOICE2 }, /* ANM_monky_wait_B 10 */
{ 0,0,0,0 }, /* ANM_monky_walk 11 */
{ 0,0,0,0 }, /* ANM_monky_hold 12 */
};
static void *monky_modejmp[] = {
monky_wait,
monky_runaway,
monky_look_player,
monky_turnjump,
monky_rail_demo,
monky_outarea_wait,
monky_stopwait,
monky_return
};
static void s_monky_main(void)
{
int ang;
s_enemybgcheck();
s_modejmp(monky_modejmp);
if ( obj_mode == mode_monky_rail_demo || obj_mode == mode_monky_return ) ang = -88;
else ang = -20;
s_enemymove(ang);
monky_overarea_check();
if ( ( obj_movestatus & MOVESTAT_WATER ) == 0 ){
s_enemysound(monky_sound); /* monky sound */
}
}
/********************************************************************************
##########################
MAINPROGRAM MONKY
##########################
********************************************************************************/
static void s_eye_anime(void)
{
if ( ( frameCounter % 50 ) < 7 ) obj_animecounter = 1;
else obj_animecounter = 0;
}
/********************************************************************************
star event monky
********************************************************************************/
static void starevent_monky(void)
{
if ( obj_worldY - obj_attY > -100 ){
switch(monky_eventmode){
case mev_setmessage:
if ( CtrlPlayerDialog(DLOG_LOOKUP) == DLOG_RESULT_READY ){
CallMessageYesNo(79);
monky_eventmode = mev_checkmessage;
}
break;
case mev_checkmessage:
if ( messageAnsNo != 0 ){
CtrlPlayerDialog(DLOG_DONE);
if ( messageAnsNo == 1 ){
Mbitset(obj_enemyinfo,ENEMYINFO_CATCH_OFF_REQUEST);
monky_eventmode = mev_starsearch;
} else {
monky_eventmode = mev_wait;
monky_eventtimer = 60;
}
}
break;
case mev_starsearch:
break;
case mev_wait:
if ( monky_eventtimer-- < 0 ) monky_eventmode = 0;
break;
}
} else {
monky_eventmode = 0;
obj_timer = 0;
obj_mode = mode_monky_outarea_wait;
}
}
/********************************************************************************
hat event monky
********************************************************************************/
static void hatevent_monky(void)
{
switch(monky_eventmode){
/*---- hat steal mode -----*/
case mev_setmessage:
if ( PL_StealMariosHat(MONKEY_STEAL_HAT) ){
monky_eventmode = mev_stealentry;
Mbitset(monky_eventflag,MONKYHAT);
}
else {
// Mbitset(obj_enemyinfo,ENEMYINFO_CATCH_OFF_REQUEST);
}
break;
/* next */
case mev_stealentry:
if ( s_call_enemydemo(DLOG_LOOKUP,ENEMYDEMO_SETMESSAGE,100,0) ){
Mbitset(obj_enemyinfo,ENEMYINFO_CATCH_OFF_REQUEST);
monky_eventmode = mev_hatcatch;
}
break;
case mev_hatcatch:
break;
/*---- hat have mode -----*/
case mev_hathave:
if ( s_call_enemydemo(DLOG_LOOKUP,ENEMYDEMO_SETMESSAGE+ENEMYDEMO_DLOG_NOSTOP,101,0) ){
PL_ReturnMariosHat(); /* Hat Return */
CtrlPlayerDialog(DLOG_DONE);
Mbitclr(monky_eventflag,MONKYHAT);
monky_eventmode = mev_hatend;
}
break;
case mev_hatend:
monky_eventmode = 0;
obj_mode = 0;
break;
}
}
/********************************************************************************
Monky Main Program
********************************************************************************/
/********************************************************************************
monky initialize
********************************************************************************/
extern void s_monky_init(void)
{
if ( obj_programselect == 1 ){
if ( BuGetItemFlag() & BU_ITEM_MONKEYHAT ){
monky_eventmode = mev_hathave;
Mbitset(monky_eventflag,MONKYHAT);
}
}
}
/********************************************************************************
monky main program
********************************************************************************/
extern void s_monky(void)
{
switch(execstp->s[stw_actionmode].d){
case CHILEDMODE_NO_CATCH:
monky_eventtimer = 0;
s_monky_main();
break;
case CHILEDMODE_CATCH:
s_mode_catch(ANM_monky_hold,mode_monky_wait);
s_copy_worldXYZ(execstp,player1stp);
if ( obj_programselect == 1 ) hatevent_monky();
else starevent_monky();
break;
case CHILEDMODE_THROW:
case CHILEDMODE_DROP:
s_mode_drop();
break;
}
/* s_eye_anime(); */
if ( monky_eventflag & MONKYHAT ) obj_animecounter = 2;
else obj_animecounter = 0;
obj_mail = 0;
dbErrPrint("mode %d\n",obj_mode);
dbErrPrint("action %d\n",execstp->s[stw_actionmode].d);
}
/*################*/
#endif
/*################*/
/*===============================================================================
end end end end end end end end
===============================================================================*/