This is a sub-page of Mega Man Legends.
In the Japanese PlayStation and PSP versions, some uncompiled code can be found in ST1E.BIN:
Translation#
eve19.c#
32 id);
extern uint32 Sce_flag_test(uint32 id);
/*------------------------------------------------------------------*/
/* sound.c */
extern void Sound_call(uint16 req_no, sint32 pos_xy, sint32 pos_z);
/*------------------------------------------------------------------*/
/* moji.c */
extern uint32 MojiTaskExec2(sint32 task_no,uint32 mess_no);
extern uint32 Moji_flag;
/*==================================================================*/
/* Prototypes */
/*==================================================================*/
static void eve19_main(EVE_WORK *evp);
static void eve19_end(EVE_WORK *evp);
/*------------------------------------------------------------------*/
static void eve19_main_area_00(EVE_WORK *evp);
static void eve19_main_area_01(EVE_WORK *evp);
static void eve19_main_area_02(EVE_WORK *evp);
//static void eve19_main_area_03(EVE_WORK *evp);
static void eve19_main_area_05(EVE_WORK *evp);
static void eve19_main_area_06(EVE_WORK *evp);
static void eve19_main_area_09(EVE_WORK *evp);
static void eve19_main_dummy(EVE_WORK *evp);
/*------------------------------------------------------------------*/
static sint32 check_block(EVE_WORK *evp, CHECK_BLOCK *cbp);
static sint32 check_swing_camera(EVE_WORK *evp);
/*==================================================================*/
/* Tables */
/*==================================================================*/
static void (*eve19_move_tbl[])(EVE_WORK *evp) = {
eve19_main,
eve19_end,
};
/*------------------------------------------------------------------*/
static void (*eve19_main_tbl[])(EVE_WORK *evp) = {
eve19_main_area_00,
eve19_main_area_01,
eve19_main_area_02,
// eve19_main_area_03,
eve19_main_dummy,
eve19_main_dummy,
eve19_main_area_05,
eve19_main_area_06,
eve19_main_dummy,
eve19_main_dummy,
eve19_main_area_09,
};
/*==================================================================*/
/* */
/* Program */
/* */
/*==================================================================*/
void StXX_eve19_move(EVE_WORK *evp)
{
eve19_move_tbl[evp->routine_0](evp);
}
/*------------------------------------------------------------------*/
/* R0_MAIN : 制御 */
/*------------------------------------------------------------------*/
static void eve19_main(EVE_WORK *evp)
{
eve19_main_tbl[evp->type](evp);
}
/*------------------------------------------------------------------*/
/* R0_END : 終了 */
/*------------------------------------------------------------------*/
static void eve19_end(EVE_WORK *evp)
{
Close_EVE_WORK(evp);
}
/*------------------------------------------------------------------*/
/* AREA 00 : 地下第7層 起動装置 */
/* メッセージ 01 「コマンドを入力~」 */
/*------------------------------------------------------------------*/
static void eve19_main_area_00(EVE_WORK *evp)
{
switch(evp->routine_1){
/* 終了チェック */
case 0:
if(Sce_flag_test(OPEN_SUB_GATE_FLAG)){
evp->routine_0 = R0_END;
}
else{
evp->routine_1++;
}
break;
/* メッセージ0起動チェック */
case 1:
if(eve19_check_flag & FLG_OPEN_SUB){
evp->routine_1++;
}
break;
/* メッセージ起動 */
case 2:
if(!(Moji_flag & MOJI_TASK0_ON)){
MojiTaskExec2(0, MES_OPEN_SUB_0);
eve19_check_flag &= ~FLG_OPEN_SUB;
Player_work[0].status_flag |= PL_STATUS_CONTROL_OFF;
evp->routine_1++;
}
break;
/* メッセージの継続・終了チェック */
case 3:
if(!(Moji_flag & MOJI_TASK0_ON)){
if(Sce_flag_test(OPEN_SUB_GATE_FLAG)){
Sound_call(SE_MAIN_CHIKA_YURE, 0, 0);
evp->routine_1++;
evp->routine_2 = 0;
evp->eve_free[0] = 0;
}
else{
Player_work[0].status_flag &= ~PL_STATUS_CONTROL_OFF;
evp->routine_1 = 1;
}
}
break;
/* カメラの振動 */
case 4:
if(check_swing_camera(evp)){
Sound_call(SE_MAIN_CHIKA_YURE_STOP, 0, 0);
evp->routine_1++;
}
break;
/* メッセージ起動 */
case 5:
if(!(Moji_flag & MOJI_TASK0_ON)){
st1a_console_flag = 1;
MojiTaskExec2(0, MES_OPEN_SUB_1);
evp->routine_1++;
}
break;
/* メッセージの終了チェック */
case 6:
if(!(Moji_flag & MOJI_TASK0_ON)){
Player_work[0].status_flag &= ~PL_STATUS_CONTROL_OFF;
evp->routine_0 = R0_END;
}
break;
}
}
/*------------------------------------------------------------------*/
/* AREA 01 : 地下第8層 生命維持装置ルーム */
/* デモ 43 ジュノ復活登場デモ */
/*------------------------------------------------------------------*/
static void eve19_main_area_01(EVE_WORK *evp)
{
CHECK_BLOCK check_block_data = {0xfe, 0xfe, 0x04, 0x01};
if(Sce_flag_test(JUNO_ENTER_DEMO_FLAG)){
eve19_check_flag |= FLG_EXE_EV43;
evp->routine_0 = R0_END;
return;
}
if(check_block(evp, &check_block_data)){
Sce_flag_on(JUNO_BOX_CHECK_FLAG);
eve19_check_flag |= FLG_EXE_EV43;
evp->routine_0 = R0_END;
}
}
/*------------------------------------------------------------------*/
/* AREA 02 : 地下第8層 ディフレクタールーム */
/* メッセージ 27「すさまじいエネルギー~」 */
/* メッセージ 28「何か大きな力で~」 */
/*------------------------------------------------------------------*/
static void eve19_main_area_02(EVE_WORK *evp)
{
CHECK_BLOCK check_block_data = {0x0a, 0xfa, 0x03, 0x01};
switch(evp->routine_1){
/* チェック */
case 0:
if(Sce_flag_test(ST1A_DIFFRACTER_FLAG)){
evp->routine_0 = R0_END;
return;
}
if(check_block(evp, &check_block_data)){
evp->routine_1++;
}
break;
/* メッセージ起動準備 */
case 1:
if(!(Moji_flag & MOJI_TASK0_ON)){
if(check_block(evp, &check_block_data)){
evp->routine_1++;
}
else{
evp->routine_1 = 0;
}
}
break;
/* メッセージの起動 */
case 2:
MojiTaskExec2(0, MES_B8F);
Player_work[0].status_flag |= PL_STATUS_CONTROL_OFF;
Sce_flag_on(ST1A_DIFFRACTER_FLAG);
evp->routine_1++;
break;
/* メッセージの終了チェック */
case 3:
if(!(Moji_flag & MOJI_TASK0_ON)){
Player_work[0].status_flag &= (~PL_STATUS_CONTROL_OFF);
evp->routine_0 = R0_END;
}
break;
}
}
///*------------------------------------------------------------------*/
///* AREA 03 : 地下第7層 回廊 */
///* メッセージ 10「ロック、街の方がさわがしいの~」 */
///*------------------------------------------------------------------*/
//static void eve19_main_area_03(EVE_WORK *evp)
//{
// CHECK_BLOCK check_block_data = {0x01, 0xda, 0x01, 0x01};
// PL_WORK *pp = &Player_work[0];
//
// switch(evp->routine_1){
// /* チェック */
// case 0:
// if(eve19_check_flag & FLG_MES_B7F){
// evp->routine_0 = R0_END;
// return;
// }
// if( check_block(evp, &check_block_data) &&
// Sce_flag_test(OPEN_SUB_GATE_FLAG)){
// evp->routine_1++;
// }
// break;
//
// /* メッセージ起動準備 */
// case 1:
// if(!(Moji_flag & MOJI_TASK0_ON)){
// if(check_block(evp, &check_block_data)){
// evp->routine_1++;
// }
// else{
// evp->routine_1 = 0;
// }
// }
// break;
//
// /* メッセージの起動 */
// case 2:
// MojiTaskExec2(0, MES_B7F);
// pp->status_flag |= PL_STATUS_CONTROL_OFF;
// eve19_check_flag |= FLG_MES_B7F;
// evp->routine_1++;
// break;
//
// /* メッセージの終了チェック */
// case 3:
// if(!(Moji_flag & MOJI_TASK0_ON)){
// pp->status_flag &= (~PL_STATUS_CONTROL_OFF);
// evp->routine_0 = R0_END;
// }
// break;
// }
//}
/*------------------------------------------------------------------*/
/* AREA 05 : 地下第5層 回廊 */
/* メッセージ 06「ノイズが入る…そろそろ~」 */
/*------------------------------------------------------------------*/
static void eve19_main_area_05(EVE_WORK *evp)
{
CHECK_BLOCK check_block_data = {0xfb, 0xea, 0x01, 0x01};
switch(evp->routine_1){
/* チェック */
case 0:
if( (eve19_check_flag & FLG_MES_B5F) ||
Sce_flag_test(OPEN_SUB_GATE_FLAG)){
eve19_check_flag |= FLG_MES_B5F;
evp->routine_0 = R0_END;
return;
}
if(check_block(evp, &check_block_data)){
evp->routine_1++;
}
break;
/* メッセージ起動準備 */
case 1:
if(!(Moji_flag & MOJI_TASK4_ON)){
if(check_block(evp, &check_block_data)){
evp->routine_1++;
}
else{
evp->routine_1 = 0;
}
}
break;
/* メッセージの起動 */
case 2:
MojiTaskExec2(4, MES_B5F);
eve19_check_flag |= FLG_MES_B5F;
evp->routine_1++;
break;
/* メッセージの終了チェック */
case 3:
if(!(Moji_flag & MOJI_TASK4_ON)){
evp->routine_0 = R0_END;
}
break;
}
}
/*------------------------------------------------------------------*/
/* AREA 06 : 地下第3層 回廊 */
/* メッセージ 08「らせん状になってるみたいね~」 */
/*------------------------------------------------------------------*/
static void eve19_main_area_06(EVE_WORK *evp)
{
CHECK_BLOCK check_block_data = {0x01, 0xfa, 0x01, 0x01};
switch(evp->routine_1){
/* チェック */
case 0:
if( (eve19_check_flag & FLG_MES_B3F) ||
Sce_flag_test(OPEN_SUB_GATE_FLAG)){
eve19_check_flag |= FLG_MES_B3F;
evp->routine_0 = R0_END;
return;
}
if(check_block(evp, &check_block_data)){
evp->routine_1++;
}
break;
/* メッセージ起動準備 */
case 1:
if(!(Moji_flag & MOJI_TASK4_ON)){
if(check_block(evp, &check_block_data)){
evp->routine_1++;
}
else{
evp->routine_1 = 0;
}
}
break;
/* メッセージの起動 */
case 2:
MojiTaskExec2(4, MES_B3F);
eve19_check_flag |= FLG_MES_B3F;
evp->routine_1++;
break;
/* メッセージの終了チェック */
case 3:
if(!(Moji_flag & MOJI_TASK4_ON)){
evp->routine_0 = R0_END;
}
break;
}
}
/*------------------------------------------------------------------*/
/* AREA 09 : 地下第1層 回廊 */
/* メッセージ 07「なにかイヤな感じがする~」 */
/*------------------------------------------------------------------*/
static void eve19_main_area_09(EVE_WORK *evp)
{
CHECK_BLOCK check_block_data = {0xfb, 0x24, 0x01, 0x01};
switch(evp->routine_1){
/* チェック */
case 0:
if(eve19_check_flag & FLG_MES_B1F){
evp->routine_0 = R0_END;
return;
}
else if(Sce_flag_test(OPEN_SUB_GATE_FLAG)){
eve19_check_flag |= (FLG_MES_B1F | FLG_MES_B7F);
evp->routine_0 = R0_END;
return;
}
if(check_block(evp, &check_block_data)){
evp->routine_1++;
}
break;
/* メッセージ起動準備 */
case 1:
if(!(Moji_flag & MOJI_TASK4_ON)){
if(check_block(evp, &check_block_data)){
evp->routine_1++;
}
else{
evp->routine_1 = 0;
}
}
break;
/* メッセージの起動 */
case 2:
MojiTaskExec2(4, MES_B1F);
eve19_check_flag |= FLG_MES_B1F;
evp->routine_1++;
break;
/* メッセージの終了チェック */
case 3:
if(!(Moji_flag & MOJI_TASK4_ON)){
evp->routine_0 = R0_END;
}
break;
}
}
/*------------------------------------------------------------------*/
/* DUMMY */
/*------------------------------------------------------------------*/
static void eve19_main_dummy(EVE_WORK *evp)
{
evp->routine_0 = R0_END;
}
/*------------------------------------------------------------------*/
/* プレイヤーのいるブロックのチェック */
/*------------------------------------------------------------------*/
static sint32 check_block(EVE_WORK *evp, CHECK_BLOCK *cbp)
{
if( ((uint16)((sint8)(Player_work[0].pos.vx >> 9) - cbp->x) < (uint16)cbp->dx) &&
((uint16)((sint8)(Player_work[0].pos.vz >> 9) - cbp->z) < (uint16)cbp->dz)){
return(1);
}
else{
return(0);
}
}
/*------------------------------------------------------------------*/
/* カメラ振動のチェック */
/*------------------------------------------------------------------*/
static sint32 check_swing_camera(EVE_WORK *evp)
{
sint32 ret = 0;
switch(evp->routine_2){
case 0:
Swing_Camera2(4, 512, 1024, &Player_work[0].pos);
evp->routine_2++;
break;
case 1:
if(Camera_work.routine_3 == 0){
if(evp->eve_free[0] >= 90){
ret = 1;
}
else{
evp->routine_2 = 0;
}
}
break;
}
evp->eve_free[0]++;
return(ret);
}
/*==================================================================*/
/* "eve19.c" End of File */
/*==================================================================*/
Some Programming#
#define R1_STOP2 7 /* ルーチン1 No. 停止2 */
#define R1_DEAD 8 /* ルーチン1 No. 破壊 */
#define R1_STOP_ATTACK 9 /* ルーチン1 No. 停止攻撃 */
#define R1_TOUCH 10 /* ルーチン1 No. 受け渡し */
#define R2_ES_WALK 0 /* ルーチン2 No. 逃げ走行 */
#define R2_AT_WALK 1 /* ルーチン2 No. 攻撃走行 */
#define R2_ST_WALK 2 /* ルーチン2 No. 停止走行 */
#define R2_ES_ATTACK 0 /* ルーチン2 No. 逃げ攻撃 */
#define R2_AT_ATTACK 1 /* ルーチン2 No. 攻撃攻撃 */
#define R2_ST_ATTACK 2 /* ルーチン2 No. 停止攻撃 */
#define SEQ_WAIT 0x00 /* シーケンス No. 待機 */
#define SEQ_WALK 0x01 /* シーケンス No. 走行 */
#define SEQ_SPIN 0x03 /* シーケンス No. スリップ(ダッシュ) */
#define SEQ_DASH 0x04 /* シーケンス No. 加速 */
#define SEQ_SLOW 0x05 /* シーケンス No. 減速ブレーキ */
#define SEQ_STOP 0x06 /* シーケンス No. 停止→待機 */
#define SEQ_RIGHT 0x08 /* シーケンス No. 右回転 */
#define SEQ_RIGHT_RET 0x09 /* シーケンス No. 右回転戻り */
#define SEQ_LEFT 0x0a /* シーケンス No. 左回転 */
#define SEQ_LEFT_RET 0x0b /* シーケンス No. 左回転戻り */
#define SEQ_OUT 0x0d /* シーケンス No. 破壊 */
#define SPD_ES_WALK (0x260) /* スピード:ランダム 逃げ走行 */
#define SPD_AT_WALK (0x200) /* スピード:ランダム 攻撃走行 */
#define SPD_ST_WALK (0x1a0) /* スピード:ランダム 守り走行 */
//#define SPD_AT_WALK (0x140) /* スピード:ランダム 攻撃走行 */
//#define SPD_ST_WALK (0x100) /* スピード:ランダム 守り走行 */
#define ADD_ES_WALK (0x020) /* スピード:ランダム 逃げ走行 */
#define ADD_AT_WALK (0x020) /* スピード:ランダム 攻撃走行 */
#define ADD_ST_WALK (0x020) /* スピード:ランダム 守り走行 */
#define DIR_FLY (256) /* 角度:吹っ飛び */
#define DIR_ES_TURN (24) /* 角度:逃げ */
#define DIR_AT_TURN (24) /* 角度:攻撃 */
#define DIR_ST_TURN (24) /* 角度:守り */
#define DIST_ATTACK (((512)*(512))>>1)
/* 距離:攻撃射程範囲 */
#define DIST_CURVE (((1024)*(1024))<<1)
/* 距離:減速範囲 */
#define DIST_STOP_ATTACK (((1536)*(1536))>>1)
/* 距離:停止攻撃射程範囲 */
#define DIST_TOUCH (((2048)*(2048))<<1)
/* 距離:受け渡し範囲 */
#define FLG_END (1 << 0) /* フラグ:行動終了 */
#define FLG_DAMAGE (1 << 1) /* フラグ:ダメージ許可 */
#define FLG_DAMAGE2 (1 << 2) /* フラグ:ダメージ */
#define FLG_ATARI (1 << 3) /* フラグ:あたりセット */
#define FLG_SEARCH (1 << 4) /* フラグ:索敵 */
#define FLG_ATTACK (1 << 5) /* フラグ:攻撃中 */
#define FLG_TURN_CK (1 << 6) /* フラグ:切り替えし */
#define FLG_TOUCH (1 << 7) /* フラグ:受け渡し */
#define FLG_TAIYA (1 << 8) /* フラグ:タイヤ 回転 */
#define FLG_TYPE2 (1 << 9) /* フラグ:待機型 */
#define HEIGHT_WALK (16) /* 移動できる高さ */
#define em1c_set_move(a,b,c)\
ep->routine_1 = a,\
ep->routine_2 = b,\
ep->routine_3 = c;
typedef struct{
sint16 id;
sint16 flag;
sint16 x,z;
sint16 w,h;
sint8 next[5];
uint8 pad1;
uint16 pad2;
} MOVE_TBL;
typedef struct{
uint16 flag; /* フラグ */
uint16 rand; /* 乱数 */
sint16 timer; /* 行動 タイマ */
sint16 timer2; /* 行動 タイマ2 */
uint16 damage; /* ダメージ量 */
sint16 damage_cnt; /* ダメージカウンタ */
SVECTOR at_pos; /* 当たり用 */
uint32 at_code[2]; /* 当たり用コード */
SVECTOR at_svec; /* 当たり用相手ポジション */
uint32 search[4]; /* プレイヤー探索用 */
EM_WORK *sub_ep; /* 子ワーク アドレス */
MOVE_TBL *mp; /* 目的地ワーク アドレス */
MOVE_TBL *old_mp; /* 目的地ワーク アドレス */
SVECTOR svec; /* 目的地座標 */
sint8 motion; /**/
sint8 old_id; /**/
sint8 dir; /**/
sint8 old_dir; /**/
sint16 ang_y; /**/
sint16 turn_x; /**/
uint16 next_flag; /**/
sint16 search_timer; /**/
sint32 life;
} ZAKO_WORK;
#define FREE_NO (EM_PARTS_MAX - 4)
#define ZAKO (*(ZAKO_WORK*)&ep->parts_mat[FREE_NO])
/*==================================================================*/
/* Work */
/*==================================================================*/
/* routine 0 */
static void (*em1c_move00_tbl[])(EM_WORK *ep) = {
em1c_move_init, /* 初期化 */
em1c_move_main, /* 通常攻撃 */
em1c_move_erase, /* 消去 */
NULL,
em1c_move_type2, /* 待機型 */
em1c_move_opening, /* デバッグ */
em1c_move_type2, /* 待機型 */
};
/* routine 1 */
static void (*em1c_move01_tbl[])(EM_WORK *ep) = {
em1c_move_wait, /* 待機 */
em1c_move_walk, /* 歩行 */
em1c_move_attack, /* 攻撃 */
em1c_move_curve, /* カーブ */
em1c_move_curve2, /* カーブ2 */
em1c_move_start, /* 発進 */
em1c_move_stop, /* 停止 */
em1c_move_stop2, /* 停止2 */
em1c_move_dead, /* 破壊 */
em1c_move_stop_attack, /* 停止攻撃 */
em1c_move_touch, /* 受け渡し */
};
/* routine 2 */
static void (*em1c_walk_tbl[])(EM_WORK *ep) = {
em1c_es_walk, /* 逃げ走行 */
em1c_at_walk, /* 攻撃走行 */
em1c_st_walk, /* 守り走行 */
};
static void (*em1c_attack_tbl[])(EM_WORK *ep) = {
em1c_es_attack, /* 逃げ攻撃 */
NULL, /* 攻撃攻撃 */
em1c_st_attack, /* 守り攻撃 */
};
static ADJ_AREA em1c_adjust_size = { -20, 20, -20, 20, -20, 0 };
static MOVE_TBL em1c_00_move_tbl[14] = {
{-1},
{-1},
{-1},
{ 3,0, 1536, 8192,1024,1024,{ 5,-1,-1, 6,-1}},
{-1},
{ 5,0, 1536, -512,1024,1024,{-1,-1, 3,13,-1}},
{ 6,0, 4608, 8192,1024,1024,{ 7, 3,-1,11,-1}},
{ 7,0, 4608, 2560,1024,1024,{-1,-1, 6,12,-1}},
{-1},
{-1},
{-1},
{11,0, 6656, 8192,1024,1024,{12, 6,-1,-1,-1}},
{12,0, 6656, 2560,1024,1024,{13, 7,11,-1,-1}},
{13,0, 6656, -512,1024,1024,{-1, 5,12,-1,-1}},
};
static MOVE_TBL em1c_01_move_tbl[14] = {
{ 0,0,-5120, 8192,1024,1024,{ 1,-1,-1, 3,-1}},
{ 1,0,-5120, 4096,1024,1024,{ 2,-1, 0, 4,-1}},
{ 2,0,-5120, -512,1024,1024,{-1,-1, 1, 5,-1}},
{ 3,0, 512, 8192,1024,1024,{ 4, 0,-1,-1,-1}},
{ 4,0, 512, 4096,1024,1024,{ 5, 1, 3,-1,-1}},
{ 5,0, 512, -512,1024,1024,{-1, 2, 4,-1,-1}},
{-1},
{-1},
{-1},
{-1},
{-1},
{-1},
{-1},
{-1},
};
static MOVE_TBL em1c_02_move_tbl[14] = {
{ 0,0,-5632, 8704,1024,1024,{ 2,-1,-1, 3,-1}},
{-1},
{ 2,0,-5632,-1024,1024,1024,{-1,-1, 0, 5,-1}},
{ 3,0, 1024, 8704,1024,1024,{ 5, 0,-1,11,-1}},
{-1},
{ 5,0, 1024,-1024,1024,1024,{-1, 2, 3,13,-1}},
{-1},
{-1},
{-1},
{-1},
{-1},
{11,0, 7168, 8704,1024,1024,{13, 3,-1,-1,-1}},
{-1},
{13,0, 7168,-1024,1024,1024,{-1, 5,11,-1,-1}},
};
static MOVE_TBL *em1c_move_tbl[] = {
em1c_00_move_tbl,
em1c_01_move_tbl,
em1c_02_move_tbl,
};
static sint16 spd_tbl[3] = {
SPD_ES_WALK,SPD_AT_WALK,SPD_ST_WALK
};
static sint16 add_tbl[3] = {
ADD_ES_WALK,ADD_AT_WALK,ADD_ST_WALK
};
static sint16 dir_tbl[3] = {
DIR_ES_TURN,DIR_AT_TURN,DIR_ST_TURN
};
/*==================================================================*/
/* Program : routine 0 */
/*==================================================================*/
/*------------------------------------------------------------------*/
/* 関数名:StXX_em1c_move */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの起動ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
void StXX_em1c_move(EM_WORK *ep)
{
ZAKO_WORK *zako;
#if EM1C_DEBUG_PRINT
PL_WORK *pwp = &Player_work[0];
uint32 proc;
static uint8 stat[][8] = {"INIT","MAIN","ERASE","DEMO"};
sint32 cnt;
// SVECTOR svec[6];
if( ep->work_3 & WORK3_FLG_DEBUG ) proc = VSync(1);
#endif
if( ep->routine_0 == R0_INIT ){
em1c_move00_tbl[ep->routine_0](ep);
}
/* 汎用ワーク */
zako = &ZAKO;
#if EM1C_DEBUG_PRINT
if( ep->work_3 & WORK3_FLG_DEBUG ){
if( ep->routine_0 == R0_MOVE ) {
if( ((uint8)ep->type > 0x03) ){
PRINT_PAGE(6);
Print(XYC( 16, 120,2),"BUG!!");
}
if( zako->mp->id == -1 ){
PRINT_PAGE(6);
Print(XYC( 16, 128,2),"BUG!!");
}
switch( ep->type ){
case 0:
if( ((uint32)zako->mp < (uint32)&em1c_00_move_tbl[ 0]) ||
((uint32)zako->mp > (uint32)&em1c_00_move_tbl[13]) ){
PRINT_PAGE(6);
Print(XYC( 16, 136,2),"BUG_A!!");
}
break;
case 1:
if( ((uint32)zako->mp < (uint32)&em1c_01_move_tbl[ 0]) ||
((uint32)zako->mp > (uint32)&em1c_01_move_tbl[13]) ){
PRINT_PAGE(6);
Print(XYC( 16, 144,2),"BUG_B!!");
}
break;
case 2:
if( ((uint32)zako->mp < (uint32)&em1c_02_move_tbl[ 0]) ||
((uint32)zako->mp > (uint32)&em1c_02_move_tbl[13]) ){
PRINT_PAGE(6);
Print(XYC( 16, 152,2),"BUG_C!!");
}
break;
}
}
}
#endif
/* 表示中のシーケンスナンバー退避 */
ep->seq_old = ep->seq_no;
/* ポジション退避 */
ep->old = ep->pos;
ep->old_l = ep->pos_l;
ep->ang_old = ep->ang;
/* 輝度設定 */
ep->size.pad = 0x4210;
/* 乱数 */
zako->rand = rand();
/* テーブル ジャンプ */
em1c_move00_tbl[ep->routine_0](ep);
if(ep->seq_old != ep->seq_no) /* 敵キャラセット */
EM_Char_Set2((MODEL_WORK*)ep,ep->seq_no,zako->motion);
else /* シーケンス送り */
EM_Char_Move2((MODEL_WORK*)ep);
zako->motion = 0;
/* タイヤを回転 */
if( zako->flag & FLG_TAIYA )
zako->turn_x = (zako->turn_x + (-ep->spd.vx >> 2)) & 0x0fff;
else
zako->turn_x = (zako->turn_x + (ep->spd.vx >> 2)) & 0x0fff;
(((SVECTOR*)Unfold_buff_ptr1) + 3)->vx = zako->turn_x;
(((SVECTOR*)Unfold_buff_ptr1) + 5)->vx = zako->turn_x << 1;
EM_World_Pos_Calc(ep);
// cnt = 0;
// while(cnt < 6){
// svec[cnt] = *(((SVECTOR*)Unfold_buff_ptr1) + cnt);
// cnt++;
// }
/* 影をつける */
if( ep->be_flag & TRANS )
Model_Shadow_Trans((MODEL_WORK*)ep,128,512,1);
if( (ep->be_flag & MOVE) && (zako->flag & FLG_ATARI) ){
/* 当たりの設定 */
zako->at_pos = ep->parts_posl[0];
zako->at_pos.vy -= 64;
Set_Atari(&zako->at_pos,200,ATARI_1,ATARI_ENEMY,
ep->work_id,(uint32*)&zako->at_code[0],
AT_ENEMY | CANCEL_ENEMY | CANCEL_PLAYER1 | zako->damage,
POS_INFO_ON,AT_FLAG_OFF);
}
/* 子 */
// EM1A_MOVE(zako->sub_ep);
#if EM1C_DEBUG_PRINT
if( ep->work_3 & WORK3_FLG_DEBUG ){
PRINT_PAGE(6);
Print(XYC(16,80,0),"ENEMY1C %s /%d.%d.%d.%d/%d,%d/%d",
&stat[ep->routine_0][0],
ep->routine_0,ep->routine_1,ep->routine_2,ep->routine_3,
zako->mp->id,zako->old_mp->id,VSync(1) - proc);
Print(XYC( 16, 88,0)," x:%6d dx:%4u",ep->pos.vx,ep->ang.vx);
Print(XYC( 16, 96,0)," y:%6d dy:%4u",ep->pos.vy,ep->ang.vy);
Print(XYC( 16,104,0)," z:%6d dz:%4u",ep->pos.vz,ep->ang.vz);
Print(XYC(168, 88,0),"x:%6d ax:%4u",ep->spd.vx,ep->add.vx);
Print(XYC(168, 96,0),"y:%6d ay:%4u",ep->spd.vy,ep->add.vy);
Print(XYC(168,104,0),"z:%6d az:%4u",ep->spd.vz,ep->add.vz);
if(Angle_ck(&ep->pos_l,ep->ang.vy,1024,&pwp->pos_l,pwp->ang.vy,2048)){
Print(XYC(168,40,0),"FLAG:%x",zako->flag);
Print(XYC(168,48,0),"RAND:%u",zako->rand);
Print(XYC(168,56,0),"LIFE:%d/%d",ep->life,ep->life_max);
Print(XYC(168,64,0),"AT :%08x",zako->at_code[0]);
}else{
Print(XYC(168,40,2),"FLAG:%x",zako->flag);
Print(XYC(168,48,2),"RAND:%u",zako->rand);
Print(XYC(168,56,2),"LIFE:%d/%d",ep->life,ep->life_max);
Print(XYC(168,64,2),"AT :%08x",zako->at_code[0]);
}
Print(XYC(16,128,0),"TIME:%d/%d",zako->search_timer,Mixer_touch_timer);
if( Joy1.trg & JOY_RR ){
// em1c_set_move(R1_WAIT,0,0);
// em1c_set_move(R1_WALK,0,0);
// em1c_set_move(R1_STOP,0,0);
// em1c_set_move(R1_START,0,0);
// em1c_set_move(R1_DEAD,0,0);
// zako->at_code[0] |= (AT_EFFECT | 0xfff);
}
if( Joy2.trg & JOY_RR ){
ep->life = ep->life_old = ep->life_max;
}
}
#endif
zako->at_code[0] = 0;
};
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_init */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの初期化ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
static void em1c_move_init(EM_WORK *ep)
{
ZAKO_WORK *zako;
static uint8 tbl[][3] = {{6,0,5},{3,1,0},{3,3,3}};
/* 汎用ワーク */
zako = &ZAKO;
/* 基本 ルーチン設定 */
if( ep->type & 0x20 ){
ep->routine_0 = R0_TYPE3;
ep->routine_1 = R1_WAIT;
zako->flag = FLG_ATARI;
}else if( ep->type & 0x40 ){
ep->routine_0 = R0_TYPE2;
ep->routine_1 = R1_WAIT;
zako->flag = (FLG_TYPE2 | FLG_ATARI);
}else{
if( !(ep->type & 0x80) ){
ep->routine_0 = R0_MOVE;
ep->routine_1 = R1_START;
zako->flag = FLG_ATARI;
}else{
ep->routine_0 = R0_OPENING;
ep->routine_1 = R1_WAIT;
zako->flag = 0;
}
}
*((uint16*)&ep->routine_2) = 0;
/* 胴体 */
if( (zako->sub_ep = (EM_WORK*)Open_EM_WORK()) != NULL ){
zako->sub_ep->be_flag = MOVE;
zako->sub_ep->id = 0x1a;
zako->sub_ep->type = ep->type;
*((uint32 *)&zako->sub_ep->routine_0) = 0;
*((uint32 *)&zako->sub_ep->work_0) = *((uint32 *)&ep->work_0);
zako->sub_ep->pos_l.vx = ep->parts_posl[0].vx << 16;
zako->sub_ep->pos_l.vy = ep->parts_posl[0].vy << 16;
zako->sub_ep->pos_l.vz = ep->parts_posl[0].vz << 16;
zako->sub_ep->pos = ep->parts_posl[0];
zako->sub_ep->work_1 = ep->work_id;
}else{
Close_EM_WORK(ep);
return;
}
/* 回転角など */
ep->be_flag |= TRANS;
ep->type &= 0x1f;
ep->ang.vx = 0;
ep->ang.vy = ((ep->work_0 & 0x0f) << 9) & 0x0fff;
ep->ang.vz = 0;
*((uint32*)&ep->dir_x) = 0;
if( !(zako->flag & FLG_TYPE2) ){
ep->spd.vx = spd_tbl[ep->type];
ep->add.vx = add_tbl[ep->type];
ep->dir_y = dir_tbl[ep->type];
}
/* 登場向きを消す */
ep->work_0 &= 0xf0;
/* 体力 */
ep->life_old = ep->life_max = ep->life = (*(&em_tbl[ep->id]->free_0 + ep->type) << 5);
/* スクロール補正データアドレス設定 */
ep->adj_size_adrs = &em1c_adjust_size;
ep->sp_act_data_adrs = NULL;
/* 高さ情報取得 */
ep->pos.vy = Scr_height_check((MODEL_WORK*)ep);
ep->pos_l.vy = ep->pos.vy << 16;
/* 輝度設定 */
ep->size.pad = 0x4210;
/* モデルのリンク情報など */
Model_work_init((MODEL_WORK*)ep,(uint8*)&ep->type);
/* モデルの拡大率:512は標準 */
*((uint32*)&ep->size.vx) = 0x02000200;
*((uint32*)&ep->size.vz) = 0x00000200;
/* ミキサー君 ワークの初期化 */
zako->flag |= (FLG_DAMAGE|FLG_DAMAGE2/*|FLG_ATARI*/);
*((uint32*)&zako->timer) = 0;
*((uint32*)&zako->damage) = 0;
zako->at_code[0] = 0;
zako->at_code[1] = 0;
Search_Player_Init(&zako->search[0],em_tbl[ep->id]->free_5,-512);
if( !(zako->flag & FLG_TYPE2) ){
zako->mp = &(em1c_move_tbl[ep->type])[tbl[0][ep->type]];
zako->old_mp = &(em1c_move_tbl[ep->type])[tbl[2][ep->type]];
zako->old_id = 3;
zako->svec.vx = zako->mp->x;
zako->svec.vy = 0;
zako->svec.vz = zako->mp->z;
zako->dir = tbl[1][ep->type];
/**/
Mixer_ptr[ep->type] = zako->sub_ep;
Mixer_ptr2[ep->type] = ep;
Mixer_flag = Dbl_buff_idx;
// Mixer_touch_timer = 300;
Mixer_touch_timer = 0;
if( ep->type == 0x02 ){
if( (Mixer_key = (SHL_WORK*)Open_SHL_WORK()) != NULL ){
Mixer_key->be_flag = MOVE;
Mixer_key->id = 0x0d;
Mixer_key->type = 0x00;
// Mixer_ptr[rand() % 0x03]->work_3 |= WORK3_FLG_KEY;
Mixer_ptr[0x01]->work_3 |= WORK3_FLG_KEY;
// }else{
//どうしよう…。
}
}
}
zako->ang_y = 0;
zako->turn_x = 0;
zako->motion = 0;
zako->search_timer = 0;
zako->life = 320;
zako->next_flag = 0;
zako->old_dir = 0;
// if( ep->routine_0 == R0_TYPE3 ){
// Open_Boss_Gauge((BOSS_WORK*)ep,0,ep->type * 20,0x60 | 0x00);
// }
/* 敵セット・待機モーションセット */
EM_Char_Set((MODEL_WORK*)ep,SEQ_WAIT,0);
}
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_main */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの通常行動ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
static void em1c_move_main(EM_WORK *ep)
{
static uint8 touch_tbl[] = {0,1,0,2,1,2};
static EM_WORK *mp,*mp2,*mp3,*mp4;
ZAKO_WORK *zako;
sint32 px,pz,cnt;
zako = &ZAKO;
/* 各ミキサー の距離 and 受け渡しチェック */
#if 1
if( !(Mixer_touch_flag) ){
if( Mixer_flag != Dbl_buff_idx ){
if( Mixer_touch_timer ){
Mixer_touch_timer--;
}else{
cnt = 0;
while( cnt < 3 ){
mp = Mixer_ptr[touch_tbl[(cnt << 1)]];
mp2 = Mixer_ptr[touch_tbl[(cnt << 1) + 1]];
px = mp->pos.vx - mp2->pos.vx;
pz = mp->pos.vz - mp2->pos.vz;
Mixer_dist[cnt] = (px * px) + (pz * pz);
cnt++;
}
cnt = 0;
while( cnt < 3 ){
if( Mixer_dist[cnt] < DIST_TOUCH ){
mp = Mixer_ptr[touch_tbl[(cnt << 1)]];
mp2 = Mixer_ptr[touch_tbl[(cnt << 1) + 1]];
mp3 = Mixer_ptr2[touch_tbl[(cnt << 1)]];
mp4 = Mixer_ptr2[touch_tbl[(cnt << 1) + 1]];
if( !((mp->work_3 | mp2->work_3) & WORK3_FLG_KEY) ){
goto next;
}
if( !(mp->work_2 & (WORK2_FLG_NO_TOUCH|WORK2_FLG_DEAD|WORK2_FLG_NO_TOUCH2))&&
!(mp2->work_2 & (WORK2_FLG_NO_TOUCH|WORK2_FLG_DEAD|WORK2_FLG_NO_TOUCH2))){
mp->work_1 = touch_tbl[(cnt << 1) + 1];
mp->work_2 |= WORK2_FLG_TOUCH;
if( mp->work_3 & WORK3_FLG_KEY ){
mp->work_2 |= WORK2_FLG_NO_DEATH;
mp->routine_1 = ROUTINE_THROW;
mp3->routine_1 = R1_TOUCH;
}else{
mp->routine_1 = ROUTINE_TOUCH;
mp3->routine_1 = R1_TOUCH;
}
*((uint16*)&mp->routine_2) = 0;
*((uint16*)&mp3->routine_2) = 0;
mp2->work_1 = touch_tbl[(cnt << 1)];
mp2->work_2 |= WORK2_FLG_TOUCH;
if( mp2->work_3 & WORK3_FLG_KEY ){
mp2->work_2 |= WORK2_FLG_NO_DEATH;
mp2->routine_1 = ROUTINE_THROW;
mp4->routine_1 = R1_TOUCH;
}else{
mp2->routine_1 = ROUTINE_TOUCH;
mp4->routine_1 = R1_TOUCH;
}
*((uint16*)&mp2->routine_2) = 0;
*((uint16*)&mp4->routine_2) = 0;
Mixer_touch_flag = 1;
break;
}
}
next: cnt++;
}
}
Mixer_flag = Dbl_buff_idx;
}
}
#endif
/* 索敵 */
if( Search_Player(&zako->search[0],ep) )
zako->flag |= FLG_SEARCH;
else
zako->flag &= (~FLG_SEARCH);
/* ダメージチェック */
if( zako->flag & FLG_DAMAGE ) em1c_ck_atari(ep);
/* テーブル ジャンプ */
em1c_move01_tbl[ep->routine_1](ep);
/* 次行動決定 */
if( zako->flag & FLG_END ){
switch( ep->routine_1 ){
case R1_WALK:
{
static uint8 tbl[] = {R1_STOP,0,R1_STOP_ATTACK};
ep->routine_1 = tbl[ep->type];
}
break;
case R1_STOP_ATTACK:
if( Angle_ck(&ep->pos_l,ep->ang.vy,1024,&Player_work[0].pos_l,Player_work[0].ang.vy,2048) ){
em1c_change(ep);
}else{
zako->flag &= (~FLG_ATTACK);
}
ep->routine_1 = R1_START;
break;
case R1_CURVE:
ep->routine_1 = R1_WALK;
break;
case R1_CURVE2:
ep->routine_1 = R1_ATTACK;
break;
case R1_START:
if( zako->flag & FLG_ATTACK ){
ep->routine_1 = R1_ATTACK;
}else{
ep->routine_1 = R1_WALK;
}
break;
case R1_TOUCH:
zako->flag &= (~FLG_TOUCH);
case R1_STOP:
case R1_STOP2:
ep->routine_1 = R1_START;
break;
default:
ep->routine_1 = R1_WAIT;
}
*((uint16*)&ep->routine_2) = 0;
zako->flag &= (~FLG_END);
}
/* ダメージカウンタ */
if( zako->damage_cnt ) zako->damage_cnt--;
/* 索敵 カウンタ */
if( zako->search_timer ) zako->search_timer--;
#if EM1C_DEBUG_PRINT
#endif
}
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_opening */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの通常行動ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
static void em1c_move_opening(EM_WORK *ep)
{
ZAKO_WORK *zako;
zako = &ZAKO;
/* 索敵 */
if( Search_Player(&zako->search[0],ep) )
zako->flag |= FLG_SEARCH;
else
zako->flag &= (~FLG_SEARCH);
/* ダメージチェック */
if( zako->flag & FLG_DAMAGE ) em1c_ck_atari(ep);
/* テーブル ジャンプ */
em1c_move01_tbl[ep->routine_1](ep);
/* 次行動決定 */
if( zako->flag & FLG_END ){
switch( ep->routine_1 ){
default:
ep->routine_1 = R1_WAIT;
}
*((uint16*)&ep->routine_2) = 0;
zako->flag &= (~FLG_END);
}
/* ダメージカウンタ */
if( zako->damage_cnt ) zako->damage_cnt--;
/* 索敵 カウンタ */
if( zako->search_timer ) zako->search_timer--;
}
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_type2 */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1C待機型ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
static void em1c_move_type2(EM_WORK *ep)
{
ZAKO_WORK *zako;
zako = &ZAKO;
/* 索敵 */
if( Search_Player(&zako->search[0],ep) )
zako->flag |= FLG_SEARCH;
else
zako->flag &= (~FLG_SEARCH);
/* ダメージチェック */
if( zako->flag & FLG_DAMAGE ) em1c_ck_atari2(ep);
/* テーブル ジャンプ */
em1c_move01_tbl[ep->routine_1](ep);
/* 次行動決定 */
if( zako->flag & FLG_END ){
switch( ep->routine_1 ){
default:
ep->routine_1 = R1_WAIT;
}
*((uint16*)&ep->routine_2) = 0;
zako->flag &= (~FLG_END);
}
/* ダメージカウンタ */
if( zako->damage_cnt ) zako->damage_cnt--;
/* 索敵 カウンタ */
if( zako->search_timer ) zako->search_timer--;
}
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_erase */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの強制破壊ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
static void em1c_move_erase(EM_WORK *ep)
{
ZAKO_WORK *zako;
zako = &ZAKO;
/* 消滅 */
Close_EM_WORK(ep);
zako->sub_ep->routine_0 = 2;
((uint32 (*)())(((uint32 **)Enemy_move_ptr)[zako->sub_ep->id])[zako->sub_ep->id2])(zako->sub_ep);
// (*((uint32(**)())Enemy_move_ptr)[zako->sub_ep->id])(zako->sub_ep);
if( zako->sub_ep->work_3 & WORK3_FLG_KEY ){
Close_SHL_WORK(Mixer_key);
}
#if EM1C_DEBUG_PRINT
#endif
}
/*==================================================================*/
/* Program : routine 1 */
/*==================================================================*/
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_wait */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの待機ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
static void em1c_move_wait(EM_WORK *ep)
{
ZAKO_WORK *zako;
zako = &ZAKO;
switch( ep->routine_2 ){
case 0:
ep->routine_2 = 1;
ep->seq_no = SEQ_WAIT;
ep->spd.vx = 0;
zako->timer = 60;
zako->damage = 0x00;
zako->flag &= (~FLG_TAIYA);
case 1:
if( --zako->timer < 0 )
zako->flag |= FLG_END;
}
#if EM1C_DEBUG_PRINT
if( ep->work_3 & WORK3_FLG_DEBUG ){
PRINT_PAGE(6);
Print(XYC(16,120,0),"STAT:WAIT:%d",zako->timer);
}
#endif
}
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_walk */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの歩行ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
static void em1c_move_walk(EM_WORK *ep)
{
ZAKO_WORK *zako;
zako = &ZAKO;
ep->routine_2 = ep->type;
/* テーブル ジャンプ */
em1c_walk_tbl[ep->routine_2](ep);
#if EM1C_DEBUG_PRINT
#endif
}
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_attack */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの攻撃ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
static void em1c_move_attack(EM_WORK *ep)
{
ZAKO_WORK *zako;
zako = &ZAKO;
ep->routine_2 = ep->type;
/* テーブル ジャンプ */
em1c_attack_tbl[ep->routine_2](ep);
#if EM1C_DEBUG_PRINT
#endif
}
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_curve */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの進路変更ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
static void em1c_move_curve(EM_WORK *ep)
{
ZAKO_WORK *zako;
sint32 px,pz;
sint16 dir,ang;
zako = &ZAKO;
switch( ep->routine_2 ){
case 0:
ep->routine_2 = 1;
zako->damage = 0x00;
zako->flag &= (~FLG_TAIYA);
case 1: /* 減速 */
/* 分岐範囲 */
px = ep->pos.vx - (zako->old_mp->x - (zako->old_mp->w >> 1));
pz = ep->pos.vz - (zako->old_mp->z - (zako->old_mp->h >> 1));
if( ((uint32)px < zako->old_mp->w) && ((uint32)pz < zako->old_mp->h) ){
ep->routine_2 = 2;
// if( Muku(&ep->pos,&zako->svec,ep->ang.vy,2048) > 0 )
// ep->seq_no = SEQ_RIGHT;
// else
// ep->seq_no = SEQ_LEFT;
}else{
/* 移動 */
if( (spd_tbl[0] >> 1) < ep->spd.vx ) ep->spd.vx -= ep->add.vx;
Obj_pos_set((MODEL_WORK*)ep,ep->spd.vx,0,0);
break;
}
case 2:
ang = Calc_degree2(&ep->pos,&zako->svec);
if( ((ep->ang.vy - ang + 512) & 0x0fff) < (512 << 1) ){
// ep->seq_no = ep->seq_old + 1;
ep->routine_2 = 3;
// zako->motion = (9 - ep->frame_no);
}
case 3: /* 回転 */
dir = Muku(&ep->pos,&zako->svec,ep->ang.vy,ep->dir_y);
ep->ang.vy = (ep->ang.vy + dir) & 0x0fff;
/* 移動 */
// if( spd_tbl[ep->type] > ep->spd.vx ) ep->spd.vx += ep->add.vx;
Obj_pos_set((MODEL_WORK*)ep,ep->spd.vx,0,0);
if( dir == 0 ){
zako->flag |= FLG_END;
zako->sub_ep->work_2 &= (~WORK2_FLG_NO_TOUCH);
}
}
#if EM1C_DEBUG_PRINT
if( ep->work_3 & WORK3_FLG_DEBUG ){
PRINT_PAGE(6);
Print(XYC(16,120,0),"STAT:CURVE:%d/%d",zako->timer,ep->seq_no);
{
sint32 dis;
px = ep->pos.vx - zako->old_mp->x;
pz = ep->pos.vz - zako->old_mp->z;
dis = SquareRoot0((px * px) + (pz * pz));
Print(XYC(16,136,3),"%ld",dis);
}
}
#endif
}
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_curve2 */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの進路変更ルーチン */
/* 備 考:ミキサー君 */
/*------------------------------------------------------------------*/
static void em1c_move_curve2(EM_WORK *ep)
{
ZAKO_WORK *zako;
sint32 px,pz;
sint16 dir;
zako = &ZAKO;
switch( ep->routine_2 ){
case 0:
ep->routine_2 = 1;
zako->damage = 0x00;
zako->flag |= FLG_TAIYA;
case 1: /* 減速 */
/* 分岐範囲 */
px = ep->pos.vx - (zako->old_mp->x - (zako->old_mp->w >> 1));
pz = ep->pos.vz - (zako->old_mp->z - (zako->old_mp->h >> 1));
if( ((uint32)px < zako->old_mp->w) && ((uint32)pz < zako->old_mp->h) ){
ep->routine_2 = 2;
}else{
/* 移動 */
if( (spd_tbl[0] >> 1) < ep->spd.vx ) ep->spd.vx -= ep->add.vx;
Obj_pos_set((MODEL_WORK*)ep,-ep->spd.vx,0,0);
break;
}
case 2: /* 回転 */
dir = Muku(&ep->pos,&zako->svec,(ep->ang.vy + 2048) & 0x0fff,ep->dir_y);
ep->ang.vy = (ep->ang.vy + dir) & 0x0fff;
/* 移動 */
Obj_pos_set((MODEL_WORK*)ep,-ep->spd.vx,0,0);
if( dir == 0 ){
zako->flag |= FLG_END;
zako->sub_ep->work_2 &= (~WORK2_FLG_NO_TOUCH);
}
}
#if EM1C_DEBUG_PRINT
if( ep->work_3 & WORK3_FLG_DEBUG ){
PRINT_PAGE(6);
Print(XYC(16,120,0),"STAT:CURVE2:%d/%d",zako->timer,ep->seq_no);
{
sint32 dis;
px = ep->pos.vx - zako->old_mp->x;
pz = ep->pos.vz - zako->old_mp->z;
dis = SquareRoot0((px * px) + (pz * pz));
Print(XYC(16,136,3),"%ld",dis);
}
}
#endif
}
/*------------------------------------------------------------------*/
/* 関数名:em1c_move_start */
/* 引き数:敵ワークのポインタ */
/* 戻り値:なし */
/* 機 能:EM1Cの発進ルーチン */
/* 備 考:ミキサー君 */
sub_scrn.c#
(subp->rb_parts_no_2 != pp->rb_parts_equip_data[2]) ){
Pl00_shot_enable_off( pp );
Pl00_shot_enable_on( pp );
if( subp->weapon_no != pp->weapon_right_no )
Obj_work_flag_change( WORK_PL_SHL, WORK_KILL );
}
return( 1 );
}
/*==================================================================*/
static sint32 sub_screen_cancel_check( void )
{
uint32 joy_trg;
joy_trg = Joy1.trg;
if( (joy_trg & (JOY_CANCEL | JOY_ST)) ){
Sound_call( SE_CANCEL, 1, 0 );
MojiTaskKill();
Game_logo_kill( -1 );
Cd_read_comb( EXIT_SUB_BIN );
return( 1 );
} else {
return( 0 );
}
}
/*==================================================================*/
static void sub_screen_shift_check( SUB_SCREEN_WORK *subp )
{
uint32 joy_trg;
joy_trg = Joy1.trg;
if( joy_trg & (JOY_L1 | JOY_R1) ){
Sound_call( SE_DECISION, 1, 0 );
MojiTaskKill();
Game_logo_kill( -1 );
if( joy_trg & JOY_L1 ){
if( (--subp->routine_0) < 0x02 ) subp->routine_0 = 0x06;
} else {
if( (++subp->routine_0) > 0x06 ) subp->routine_0 = 0x02;
}
subp->routine_1 = 0;
*(uint16 *)&subp->routine_2 = 0;
}
}
/*==================================================================*/
void Sub_screen_sort_attack( void )
{
sint32 d0, d1;
uint8 sort_src, sort_dist;
PL_WORK *pp;
pp = &Player_work[0];
for( d0 = 0; d0 < 0x1f; d0++ ){
for( d1 = 0; d1 < 0x1f - d0; d1++ ){
if( !(sort_dist = pp->rb_parts_sort_data[d1 + 1]) ) continue;
if( (!(sort_src = pp->rb_parts_sort_data[d1])) ||
(Rock_buster_parts_tbl[sort_src - 1].attack_level <
Rock_buster_parts_tbl[sort_dist - 1].attack_level) )
sub_screen_sort_sub( pp, d1, d1 + 1 );
}
}
}
/*==================================================================*/
void Sub_screen_sort_energy( void )
{
sint32 d0, d1;
uint8 sort_src, sort_dist;
PL_WORK *pp;
pp = &Player_work[0];
for( d0 = 0; d0 < 0x1f; d0++ ){
for( d1 = 0; d1 < 0x1f - d0; d1++ ){
if( !(sort_dist = pp->rb_parts_sort_data[d1 + 1]) ) continue;
if( (!(sort_src = pp->rb_parts_sort_data[d1])) ||
(Rock_buster_parts_tbl[sort_src - 1].bullet_level <
Rock_buster_parts_tbl[sort_dist - 1].bullet_level) )
sub_screen_sort_sub( pp, d1, d1 + 1 );
}
}
}
/*==================================================================*/
void Sub_screen_sort_range( void )
{
sint32 d0, d1;
uint8 sort_src, sort_dist;
PL_WORK *pp;
pp = &Player_work[0];
for( d0 = 0; d0 < 0x1f; d0++ ){
for( d1 = 0; d1 < 0x1f - d0; d1++ ){
if( !(sort_dist = pp->rb_parts_sort_data[d1 + 1]) ) continue;
if( (!(sort_src = pp->rb_parts_sort_data[d1])) ||
(Rock_buster_parts_tbl[sort_src - 1].dist_level <
Rock_buster_parts_tbl[sort_dist - 1].dist_level) )
sub_screen_sort_sub( pp, d1, d1 + 1 );
}
}
}
/*==================================================================*/
void Sub_screen_sort_rapid( void )
{
sint32 d0, d1;
uint8 sort_src, sort_dist;
PL_WORK *pp;
pp = &Player_work[0];
for( d0 = 0; d0 < 0x1f; d0++ ){
for( d1 = 0; d1 < 0x1f - d0; d1++ ){
if( !(sort_dist = pp->rb_parts_sort_data[d1 + 1]) ) continue;
if( (!(sort_src = pp->rb_parts_sort_data[d1])) ||
(Rock_buster_parts_tbl[sort_src - 1].repeat_level <
Rock_buster_parts_tbl[sort_dist - 1].repeat_level) )
sub_screen_sort_sub( pp, d1, d1 + 1 );
}
}
}
/*==================================================================*/
static void sub_screen_sort_sub( PL_WORK *pp, sint32 d0, sint32 d1 )
{
uint8 sort_buff;
sort_buff = pp->rb_parts_sort_data[d0];
pp->rb_parts_sort_data[d0] = pp->rb_parts_sort_data[d1];
pp->rb_parts_sort_data[d1] = sort_buff;
}
/*==================================================================*/
void Sub_screen_rb_parts_set( void )
{
sint32 d0, d1, d2;
PL_WORK *pp;
pp = &Player_work[0];
if( Sce_flag_test(PL_KEY_ITEM_06) ) d0 = 3; else d0 = 2;
pp->weapon_data[1].attack_level = 0x00;
pp->weapon_data[1].bullet_level = 0x00;
pp->weapon_data[1].dist_level = 0x00;
pp->weapon_data[1].repeat_level = 0x00;
for( d1 = 0; d1 < d0; d1++ ){
if( !(d2 = pp->rb_parts_equip_data[d1]) ) continue;
pp->weapon_data[1].attack_level +=
Rock_buster_parts_tbl[d2 - 1].attack_level;
pp->weapon_data[1].bullet_level +=
Rock_buster_parts_tbl[d2 - 1].bullet_level;
pp->weapon_data[1].dist_level +=
Rock_buster_parts_tbl[d2 - 1].dist_level;
pp->weapon_data[1].repeat_level +=
Rock_buster_parts_tbl[d2 - 1].repeat_level;
}
if( pp->weapon_data[1].attack_level > 0x07 )
pp->weapon_data[1].attack_level = 0x07;
if( pp->weapon_data[1].bullet_level > 0x07 )
pp->weapon_data[1].bullet_level = 0x07;
if( pp->weapon_data[1].dist_level > 0x07 )
pp->weapon_data[1].dist_level = 0x07;
if( pp->weapon_data[1].repeat_level > 0x07 )
pp->weapon_data[1].repeat_level = 0x07;
}
/*==================================================================*/
static void sub_screen_rb_parts_calc( SUB_SCREEN_WORK *subp )
{
sint32 d0, d1, d2;
PL_WORK *pp;
pp = &Player_work[0];
if( Sce_flag_test(PL_KEY_ITEM_06) ) d0 = 3; else d0 = 2;
subp->attack_end_0 = subp->attack_end_1 = 0x00;
subp->bullet_end_0 = subp->bullet_end_1 = 0x00;
subp->dist_end_0 = subp->dist_end_1 = 0x00;
subp->repeat_end_0 = subp->repeat_end_1 = 0x00;
if( Moji_flag & MOJI_TASK0_ON ){
for( d1 = 0; d1 < d0; d1++ ){
if( !(d2 = pp->rb_parts_equip_data[d1]) ) continue;
sub_screen_rb_parts_calc_sub00( subp, d2 - 1 );
sub_screen_rb_parts_calc_sub01( subp, d2 - 1 );
}
} else {
if( Moji_flag3 & MOJI3_PARTS_TASK ){
for( d1 = 0; d1 < d0; d1++ ){
if( (d2 = pp->rb_parts_equip_data[d1]) )
sub_screen_rb_parts_calc_sub00( subp, d2 - 1 );
if( d1 == GET_SELECT_NO(1) ) continue;
if( d2 ) sub_screen_rb_parts_calc_sub01( subp, d2 - 1 );
}
} else {
for( d1 = 0; d1 < d0; d1++ ){
// if( (d1 != GET_SELECT_NO(1)) &&
// (d2 = pp->rb_parts_equip_data[d1]) )
if( (d2 = pp->rb_parts_equip_data[d1]) )
sub_screen_rb_parts_calc_sub00( subp, d2 - 1 );
if( d1 == GET_SELECT_NO(1) ) d2 = GET_PARTS_NO(1);
if( d2 ) sub_screen_rb_parts_calc_sub01( subp, d2 - 1 );
}
}
}
}
/*------------------------------------------------------------------*/
static void sub_screen_rb_parts_calc_sub00( SUB_SCREEN_WORK *subp,
sint32 d0 )
{
subp->attack_end_0 += Rock_buster_parts_tbl[d0].attack_level * 0x0a;
subp->bullet_end_0 += Rock_buster_parts_tbl[d0].bullet_level * 0x0a;
subp->dist_end_0 += Rock_buster_parts_tbl[d0].dist_level * 0x0a;
subp->repeat_end_0 += Rock_buster_parts_tbl[d0].repeat_level * 0x0a;
if( subp->attack_end_0 > (0x07 * 0x0a) ) subp->attack_end_0 = 0x07 * 0x0a;
if( subp->bullet_end_0 > (0x07 * 0x0a) ) subp->bullet_end_0 = 0x07 * 0x0a;
if( subp->dist_end_0 > (0x07 * 0x0a) ) subp->dist_end_0 = 0x07 * 0x0a;
if( subp->repeat_end_0 > (0x04 * 0x0a) ) subp->repeat_end_0 = 0x04 * 0x0a;
}
/*------------------------------------------------------------------*/
static void sub_screen_rb_parts_calc_sub01( SUB_SCREEN_WORK *subp,
sint32 d0 )
{
subp->attack_end_1 += Rock_buster_parts_tbl[d0].attack_level * 0x0a;
subp->bullet_end_1 += Rock_buster_parts_tbl[d0].bullet_level * 0x0a;
subp->dist_end_1 += Rock_buster_parts_tbl[d0].dist_level * 0x0a;
subp->repeat_end_1 += Rock_buster_parts_tbl[d0].repeat_level * 0x0a;
if( subp->attack_end_1 > (0x07 * 0x0a) ) subp->attack_end_1 = 0x07 * 0x0a;
if( subp->bullet_end_1 > (0x07 * 0x0a) ) subp->bullet_end_1 = 0x07 * 0x0a;
if( subp->dist_end_1 > (0x07 * 0x0a) ) subp->dist_end_1 = 0x07 * 0x0a;
if( subp->repeat_end_1 > (0x04 * 0x0a) ) subp->repeat_end_1 = 0x04 * 0x0a;
}
/*==================================================================*/
static void sub_screen_status_calc( SUB_SCREEN_WORK *subp, sint32 d0 )
{
PL_WORK *pp;
pp = &Player_work[0];
if( d0 < 0 ){
subp->attack_end_0 = subp->attack_infi_0 = 0x00;
subp->bullet_end_0 = subp->bullet_infi_0 = 0x00;
subp->dist_end_0 = subp->dist_infi_0 = 0x00;
subp->repeat_end_0 = subp->repeat_infi_0 = 0x00;
subp->special_end_0 = subp->special_infi_0 = 0x00;
} else {
subp->attack_end_0 =
g_tbl[w_tbl[d0]].attack[pp->weapon_data[d0].attack_level];
subp->bullet_end_0 =
g_tbl[w_tbl[d0]].energy[pp->weapon_data[d0].bullet_level];
subp->dist_end_0 =
g_tbl[w_tbl[d0]].range[pp->weapon_data[d0].dist_level];
subp->repeat_end_0 =
g_tbl[w_tbl[d0]].rapid[pp->weapon_data[d0].repeat_level];
subp->special_end_0 =
g_tbl[w_tbl[d0]].special[pp->weapon_data[d0].sp_perform];
if( subp->attack_end_0 == 0xff ){
subp->attack_end_0 = 88;
subp->attack_infi_0 = 1;
} else {
subp->attack_infi_0 = 0;
}
if( subp->bullet_end_0 == 0xff ){
subp->bullet_end_0 = 88;
subp->bullet_infi_0 = 1;
} else {
subp->bullet_infi_0 = 0;
}
if( subp->dist_end_0 == 0xff ){
subp->dist_end_0 = 88;
subp->dist_infi_0 = 1;
} else {
subp->dist_infi_0 = 0;
}
if( subp->repeat_end_0 == 0xff ){
subp->repeat_end_0 = 88;
subp->repeat_infi_0 = 1;
} else {
subp->repeat_infi_0 = 0;
}
if( subp->special_end_0 == 0xff ){
subp->special_end_0 = 88;
subp->special_infi_0 = 1;
} else {
subp->special_infi_0 = 0;
}
}
}
/*==================================================================*/
void Sub_screen_gauge_set( sint32 x0, sint32 y0, sint32 power, sint32 flag )
{
POLY_FT4 *ft4_buff_ptr1, *ft4_buff_ptr2;
ft4_buff_ptr1 = ft4_buff_ptr2 = Map_prim_ptr;
*(uint32 *)ft4_buff_ptr2 =
((uint32)(ft4_buff_ptr2 + 1) & 0x00ffffff) | 0x09000000;
*(uint32 *)&ft4_buff_ptr2->r0 = 0x2c808080;
ft4_buff_ptr2->x0 = ft4_buff_ptr2->x2 = x0;
ft4_buff_ptr2->x1 = ft4_buff_ptr2->x3 = x0 + power + 0x06;
ft4_buff_ptr2->y0 = ft4_buff_ptr2->y1 = y0 + flag * 0x02;
ft4_buff_ptr2->y2 = ft4_buff_ptr2->y3 = y0 + flag * 0x02 + 0x05;
ft4_buff_ptr2->tpage = 0x0c;
ft4_buff_ptr2->clut = 0xfa0c>>2;
*(uint16 *)&ft4_buff_ptr2->u0 = 0x60 | ((0x90 + flag * 0x08)<<8);
*(uint16 *)&ft4_buff_ptr2->u1 = 0x61 | ((0x90 + flag * 0x08)<<8);
*(uint16 *)&ft4_buff_ptr2->u2 = 0x60 | ((0x95 + flag * 0x08)<<8);
*(uint16 *)&ft4_buff_ptr2->u3 = 0x61 | ((0x95 + flag * 0x08)<<8);
ft4_buff_ptr2++;
*(uint32 *)ft4_buff_ptr2 =
((uint32)(ft4_buff_ptr2 + 1) & 0x00ffffff) | 0x09000000;
*(uint32 *)&ft4_buff_ptr2->r0 = 0x2c808080;
ft4_buff_ptr2->x0 = ft4_buff_ptr2->x2 = x0 + power + 0x06;
ft4_buff_ptr2->x1 = ft4_buff_ptr2->x3 = x0 + power + 0x0a;
ft4_buff_ptr2->y0 = ft4_buff_ptr2->y1 = y0 + flag * 0x02;
ft4_buff_ptr2->y2 = ft4_buff_ptr2->y3 = y0 + flag * 0x02 + 0x05;
ft4_buff_ptr2->tpage = 0x0c;
ft4_buff_ptr2->clut = 0xfa0c>>2;
*(uint16 *)&ft4_buff_ptr2->u0 = 0x6f | ((0x90 + flag * 0x08)<<8);
*(uint16 *)&ft4_buff_ptr2->u1 = 0x73 | ((0x90 + flag * 0x08)<<8);
*(uint16 *)&ft4_buff_ptr2->u2 = 0x6f | ((0x95 + flag * 0x08)<<8);
*(uint16 *)&ft4_buff_ptr2->u3 = 0x73 | ((0x95 + flag * 0x08)<<8);
ft4_buff_ptr2++;
if( (!flag) && (((y0 != 0x46) && (power == 0x0a * 7)) ||
((y0 == 0x46) && (power == 0x0a * 4))) ){
*(uint32 *)ft4_buff_ptr2 =
((uint32)(ft4_buff_ptr2 + 1) & 0x00ffffff) | 0x04000000;
*(uint32 *)&ft4_buff_ptr2->r0 = 0x64808080;
((SPRT *)ft4_buff_ptr2)->x0 = x0 + 0x0a + (power == 0x0a * 7) * 0x0e;
((SPRT *)ft4_buff_ptr2)->y0 = y0;
*(uint32 *)&(((SPRT *)ft4_buff_ptr2)->u0) =
0x28 | (0xf0<<8) | ((0xfa08>>2)<<16);
*(uint32 *)&(((SPRT *)ft4_buff_ptr2)->w) = 0x00060018;
ft4_buff_ptr2++;
}
addPrims( &Disp_env_ptr->ot[2], ft4_buff_ptr1, ft4_buff_ptr2 - 1 );
Map_prim_ptr = (POLY_FT4 *)ft4_buff_ptr2;
}
/*------------------------------------------------------------------*/
void Sub_screen_gauge_set2( sint32 x0, sint32 y0,
sint32 power, sint32 infi )
{
POLY_FT4 *ft4_buff_ptr1, *ft4_buff_ptr2;
ft4_buff_ptr1 = ft4_buff_ptr2 = Map_prim_ptr;
*(uint32 *)ft4_buff_ptr2 =
((uint32)(ft4_buff_ptr2 + 1) & 0x00ffffff) | 0x09000000;
*(uint32 *)&ft4_buff_ptr2->r0 = 0x2c808080;
ft4_buff_ptr2->x0 = ft4_buff_ptr2->x2 = x0;
ft4_buff_ptr2->x1 = ft4_buff_ptr2->x3 = x0 + power;
ft4_buff_ptr2->y0 = ft4_buff_ptr2->y1 = y0;
ft4_buff_ptr2->y2 = ft4_buff_ptr2->y3 = y0 + 0x08;
ft4_buff_ptr2->tpage = 0x0c;
ft4_buff_ptr2->clut = 0xfa0c>>2;
*(uint16 *)&ft4_buff_ptr2->u0 = 0x48 | (0x90<<8);
*(uint16 *)&ft4_buff_ptr2->u1 = 0x49 | (0x90<<8);
*(uint16 *)&ft4_buff_ptr2->u2 = 0x48 | (0x98<<8);
*(uint16 *)&ft4_buff_ptr2->u3 = 0x49 | (0x98<<8);
ft4_buff_ptr2++;
*(uint32 *)ft4_buff_ptr2 =
((uint32)(ft4_buff_ptr2 + 1) & 0x00ffffff) | 0x09000000;
*(uint32 *)&ft4_buff_ptr2->r0 = 0x2c808080;
ft4_buff_ptr2->x0 = ft4_buff_ptr2->x2 = x0 + power;
ft4_buff_ptr2->x1 = ft4_buff_ptr2->x3 = x0 + power + 0x04;
ft4_buff_ptr2->y0 = ft4_buff_ptr2->y1 = y0;
ft4_buff_ptr2->y2 = ft4_buff_ptr2->y3 = y0 + 0x08;
ft4_buff_ptr2->tpage = 0x0c;
ft4_buff_ptr2->clut = 0xfa0c>>2;
*(uint16 *)&ft4_buff_ptr2->u0 = 0x4c | (0x90<<8);
*(uint16 *)&ft4_buff_ptr2->u1 = 0x50 | (0x90<<8);
*(uint16 *)&ft4_buff_ptr2->u2 = 0x4c | (0x98<<8);
*(uint16 *)&ft4_buff_ptr2->u3 = 0x50 | (0x98<<8);
ft4_buff_ptr2++;
if( (infi) && (power == 88) ){
*(uint32 *)ft4_buff_ptr2 =
((uint32)(ft4_buff_ptr2 + 1) & 0x00ffffff) | 0x04000000;
*(uint32 *)&ft4_buff_ptr2->r0 = 0x64808080;
((SPRT *)ft4_buff_ptr2)->x0 = x0 + 0x18;
((SPRT *)ft4_buff_ptr2)->y0 = y0;
*(uint32 *)&(((SPRT *)ft4_buff_ptr2)->u0) =
0x28 | (0xf8<<8) | ((0xfa08>>2)<<16);
*(uint32 *)&(((SPRT *)ft4_buff_ptr2)->w) = 0x00080028;
ft4_buff_ptr2++;
}
addPrims( &Disp_env_ptr->ot[2], ft4_buff_ptr1, ft4_buff_ptr2 - 1 );
Map_prim_ptr = (POLY_FT4 *)ft4_buff_ptr2;
}
/*==================================================================*/
void Sub_screen_basic_param_set( void )
{
sint32 d0, d1, d2;
sint32 x0;
SPRT *sprt_buff_ptr1, *sprt_buff_ptr2;
d0 = (Player_work[0].life_max - 0x01)>>4;
d1 = Player_work[0].life;
sprt_buff_ptr1 = sprt_buff_ptr2 = (SPRT *)Map_prim_ptr;
((DR_MODE *)sprt_buff_ptr2)->tag = 0x02000000;
((DR_MODE *)sprt_buff_ptr2)->code[0] = 0xe1000000 | 0x0d;
/* テクスチャナンバー */
((DR_MODE *)sprt_buff_ptr2)->code[1] = 0x00000000;
*((uint32 *)sprt_buff_ptr2) =
((uint32)(sprt_buff_ptr2 + 1) & 0x00ffffff) | 0x02000000;
sprt_buff_ptr2++;
for( x0 = 0; x0 <= d0; x0++ ){
*(uint32 *)sprt_buff_ptr2 =
((uint32)(sprt_buff_ptr2 + 1) & 0x00ffffff) | 0x04000000;
*(uint32 *)&sprt_buff_ptr2->r0 = 0x64808080;
*(uint32 *)&sprt_buff_ptr2->x0 = (x0 * 0x05 + 0x31) | (0x24<<16);
*(uint32 *)&sprt_buff_ptr2->w = 0x00080008;
if( d1 > x0 * 0x10 ){
if( ((d1 - 0x10) > x0 * 0x10) || (!(d1 % 0x10)) )
d2 = (0xf9d4<<14) | 0xb870;
else
d2 = (0xf9d4<<14) | 0xb878;
} else {
d2 = (0xf9d4<<14) | 0xb880;
}
*(uint32 *)&sprt_buff_ptr2->u0 = d2;
sprt_buff_ptr2++;
}
sprt_buff_ptr2 = Sub_screen_basic_param_set_sub( sprt_buff_ptr2,
0x00a4 | 0x24<<16, Game_work.metal_stock, 0x06 | (0x03<<8) );
sprt_buff_ptr2 = Sub_screen_basic_param_set_sub( sprt_buff_ptr2,
0x0106 | 0x24<<16, Game_work.play_time / (30 * 60 * 60),
0x02 | (0x00<<8) );
sprt_buff_ptr2 = Sub_screen_basic_param_set_sub( sprt_buff_ptr2,
0x011a | 0x24<<16, Game_work.play_time / (30 * 60) % 60,
0x02 | (0x00<<8) );
addPrims( &Disp_env_ptr->ot[2], sprt_buff_ptr1, sprt_buff_ptr2 - 1 );
Map_prim_ptr = (POLY_FT4 *)sprt_buff_ptr2;
}
/*==================================================================*/
SPRT *Sub_screen_basic_param_set_sub( SPRT *ptr, uint32 pos,
sint32 num, sint32 flag )
{
sint32 d0, d1;
for( d0 = (flag & 0xff) - 1; d0 >= 0x00; d0-- ){
d1 = num % 10;
if( ((d0 == (flag & 0xff) - 1) && (!(flag & 0x0200))) ||
(num) || (!(flag & 0x0100)) ){
*(uint32 *)ptr = ((uint32)(ptr + 1) & 0x00ffffff) | 0x04000000;
*(uint32 *)&ptr->r0 = 0x64808080;
*(uint32 *)&ptr->x0 = d0 * 0x07 + pos;
*(uint32 *)&ptr->w = 0x00080008;
*(uint32 *)&ptr->u0 = (d1 * 0x08 + 0x60) | (0xb0<<8) |
(0xf9d4<<14);
ptr++;
}
num /= 10;
}
return( ptr );
}
/*==================================================================*/
void Sub_screen_status_param_set( sint32 d0 )
{
sint32 d1, d2;
sint32 x0;
PL_WORK *pp;
SPRT *sprt_buff_ptr1, *sprt_buff_ptr2;
pp = &Player_work[0];
sprt_buff_ptr1 = sprt_buff_ptr2 = (SPRT *)Map_prim_ptr;
d1 = pp->weapon_data[d0].bullet_left;
if( (d2 = Player_weapon_bullet_calc(pp, d0)) < 0x7fff ){
((DR_MODE *)sprt_buff_ptr2)->tag = 0x02000000;
((DR_MODE *)sprt_buff_ptr2)->code[0] = 0xe1000000 | 0x0c;
/* テクスチャナンバー */
((DR_MODE *)sprt_buff_ptr2)->code[1] = 0x00000000;
*((uint32 *)sprt_buff_ptr2) =
((uint32)(sprt_buff_ptr2 + 1) & 0x00ffffff) | 0x02000000;
sprt_buff_ptr2++;
*(uint32 *)sprt_buff_ptr2 =
((uint32)(sprt_buff_ptr2 + 1) & 0x00ffffff) | 0x04000000;
*(uint32 *)&sprt_buff_ptr2->r0 = 0x64808080;
*(uint32 *)&sprt_buff_ptr2->x0 = 0x008c00d1;
*(uint32 *)&sprt_buff_ptr2->w = 0x00080006;
*(uint32 *)&sprt_buff_ptr2->u0 = 0x40 | (0xf0<<8) | (0xfa08<<14);
sprt_buff_ptr2++;
sprt_buff_ptr2 = Sub_screen_status_param_set_sub( sprt_buff_ptr2,
0x00b4 | 0x8c<<16, d1, 0x04 | (0x00<<8) );
sprt_buff_ptr2 = Sub_screen_status_param_set_sub( sprt_buff_ptr2,
0x00d8 | 0x8c<<16, d2, 0x04 | (0x00<<8) );
addPrims( &Disp_env_ptr->ot[2], sprt_buff_ptr1, sprt_buff_ptr2 - 1 );
Map_prim_ptr = (POLY_FT4 *)sprt_buff_ptr2;
}
}
/*==================================================================*/
SPRT *Sub_screen_status_param_set_sub( SPRT *ptr, uint32 pos,
sint32 num, sint32 flag )
{
sint32 d0, d1;
for( d0 = (flag & 0xff) - 1; d0 >= 0x00; d0-- ){
d1 = num % 10;
if( ((d0 == (flag & 0xff) - 1) && (!(flag & 0x0200))) ||
(num) || (!(flag & 0x0100)) ){
*(uint32 *)ptr = ((uint32)(ptr + 1) & 0x00ffffff) | 0x04000000;
*(uint32 *)&ptr->r0 = 0x64808080;
*(uint32 *)&ptr->x0 = d0 * 0x07 + pos;
*(uint32 *)&ptr->w = 0x00080006;
*(uint32 *)&ptr->u0 = (d1 * 0x08) | (0xc0<<8) | (0xfa08<<14);
ptr++;
}
num /= 10;
}
return( ptr );
}
/*==================================================================*/
void Sub_screen_back_ground_set( void )
{
sint32 x0, y0;
SPRT *sprt_buff_ptr1, *sprt_buff_ptr2;
sprt_buff_ptr1 = sprt_buff_ptr2 = (SPRT *)Map_prim_ptr;
((DR_MODE *)sprt_buff_ptr2)->tag = 0x02000000;
((DR_MODE *)sprt_buff_ptr2)->code[0] = 0xe1000000 | 0x0d;
/* テクスチャナンバー */
((DR_MODE *)sprt_buff_ptr2)->code[1] = 0x00000000;
*((uint32 *)sprt_buff_ptr2) =
((uint32)(sprt_buff_ptr2 + 1) & 0x00ffffff) | 0x02000000;
sprt_buff_ptr2++;
for( y0 = 0; y0 <= 0x04; y0++ ){
for( x0 = 0; x0 <= 0x06; x0++ ){
*(uint32 *)sprt_buff_ptr2 =
((uint32)(sprt_buff_ptr2 + 1) & 0x00ffffff) | 0x04000000;
*(uint32 *)&sprt_buff_ptr2->r0 = 0x64808080;
*(uint32 *)&sprt_buff_ptr2->x0 =
(((x0 - 1) * 0x40 + (System_timer & 0x3f)) & 0xffff) |
(((y0 - 1) * 0x40 + (System_timer & 0x3f))<<16);
*(uint32 *)&sprt_buff_ptr2->u0 = (0xf9dc<<14) | 0x88c0;
*(uint32 *)&sprt_buff_ptr2->w = 0x00400040;
sprt_buff_ptr2++;
}
}
addPrims( &Disp_env_ptr->ot[7], sprt_buff_ptr1, sprt_buff_ptr2 - 1 );
Map_prim_ptr = (POLY_FT4 *)sprt_buff_ptr2;
}
/*==================================================================*/
void Sub_screen_sound_reinit( PL_WORK *pp )
{
if( (pp->routine_1 == PL_R1_SUPER_DASH) && (pp->routine_2 == 4) ){
Sound_call( SE_ROCKMAN_ROLLER_GO, 0, 0 );
}
if( (pp->shot_status_flag & PL_SHOT_ON_FLAG) ){
if( (pp->shot_status_flag & PL_SHOT_ON_FLAG) == PL_SHOT_ON_R ){
if( (pp->weapon_right_no == 0x04) && (pp->shot_rno_0 == 2) )
Sound_call2(SE_ROCKMAN_DRILL, &pp->parts_posl[4]);
if( (pp->weapon_right_no == 0x07) && (pp->shot_rno_0 == 2) )
Sound_call2(SE_ROCKMAN_VACUUM_00, &pp->parts_posl[4]);
if( (pp->weapon_right_no == 0x0c) && (pp->shot_rno_0 == 2) )
Sound_call2(SE_ROCKMAN_SHEILD, &pp->parts_posl[4]);
if( (pp->weapon_right_no == 0x0d) && (pp->shot_rno_0 == 2) )
Sound_call2(SE_ROCKMAN_LASER, &pp->parts_posl[4]);
}
}
}
/*==================================================================*/
/*==================================================================*/
void Map_screen_init( void )
{
*(uint32 *)&Map_screen_work.routine_0 = 0x00000000;
*(uint32 *)&Map_screen_work.type = 0x00000000;
if( Game_work.sce_no < 0x09 )
Map_screen_work.type = 0;
else
Map_screen_work.type = 1;
}
/*==================================================================*/
sint32 Map_screen_task( void )
{
uint32 joy_trg;
MAP_SCREEN_WORK *mp;
joy_trg = Joy1.trg;
mp = &Map_screen_work;
switch( mp->routine_0 ){
case 0:
map_cursor_set();
map_screen_set();
/* スタートボタンはキャンセル優先 */
if( joy_trg & (JOY_SE | JOY_ST | JOY_CANCEL) ){
Sound_call( SE_CANCEL, 1, 0 );
return( 1 );
}
if( ((joy_trg & (JOY_R1 | JOY_LR | JOY_DECISION)) == 0) !=
((joy_trg & (JOY_L1 | JOY_LL)) == 0) ){
if( joy_trg & (JOY_L1 | JOY_LL) ){
if( (--mp->type2) < 0 ) mp->type2 = (mp->type > 0) + 1;
} else {
if( (++mp->type2) > (mp->type > 0) + 1 ) mp->type2 = 0;
}
Sound_call( SE_DECISION, 1, 0 );
mp->routine_0++;
break;
}
break;
case 1:
if( !mp->type )
Cd_read_comb( map_a_file_code[mp->type2] );
else
Cd_read_comb( map_b_file_code[mp->type2] );
mp->routine_0++;
break;
case 2:
if( !Cd_read_sync2() ) mp->routine_0 = 0;
break;
}
return( 0 );
}
/*==================================================================*/
/* Game Map Screen Set */
/*==================================================================*/
static void map_screen_set( void )
{
POLY_FT4 *ft4_buff_ptr;
ft4_buff_ptr = Map_prim_ptr++;
*(uint32 *)ft4_buff_ptr = 0x09000000;
*(uint32 *)&ft4_buff_ptr->r0 = 0x2c808080;
ft4_buff_ptr->x0 = ft4_buff_ptr->x2 = 32;
ft4_buff_ptr->x1 = ft4_buff_ptr->x3 = 287;
ft4_buff_ptr->y0 = ft4_buff_ptr->y1 = 0;
ft4_buff_ptr->y2 = ft4_buff_ptr->y3 = 240;
ft4_buff_ptr->tpage = (0x0c) | (0x01<<7);
ft4_buff_ptr->clut = (0xfa00>>2);
*(uint16 *)&ft4_buff_ptr->u0 = 0x00 | (0x00<<8);
*(uint16 *)&ft4_buff_ptr->u1 = 0xff | (0x00<<8);
*(uint16 *)&ft4_buff_ptr->u2 = 0x00 | (0xf0<<8);
*(uint16 *)&ft4_buff_ptr->u3 = 0xff | (0xf0<<8);
AddPrim( &Disp_env_ptr->ot[2], ft4_buff_ptr );
}
/*==================================================================*/
static void map_cursor_set( void )
{
sint32 d0, d1;
sint32 x0, y0;
GAME_WORK *gp;
POLY_FT4 *ft4_buff_ptr;
gp = &Game_work;
switch( gp->stage_no ){
case 0x17:
case 0x1d:
return;
case 0x03:
case 0x1b:
if( gp->area_no < 0x03 )
d0 = gp->area_no;
else
d0 = 0x03;
break;
case 0x0f:
d0 = 0x06;
break;
case 0x13:
d0 = 0x0a;
break;
case 0x1c:
d0 = 0x08;
break;
default:
d0 = gp->stage_no;
break;
}
x0 = map_cursor_pos[d0].vx + 0x20;
y0 = map_cursor_pos[d0].vy;
d1 = (System_timer & 0x07) * 0x10;
ft4_buff_ptr = Map_prim_ptr++;
*(uint32 *)ft4_buff_ptr = 0x09000000;
*(uint32 *)&ft4_buff_ptr->r0 = 0x2c808080;
ft4_buff_ptr->x0 = ft4_buff_ptr->x2 = x0 - 0x08;
ft4_buff_ptr->x1 = ft4_buff_ptr->x3 = x0 + 0x07;
ft4_buff_ptr->y0 = ft4_buff_ptr->y1 = y0 - 0x08;
ft4_buff_ptr->y2 = ft4_buff_ptr->y3 = y0 + 0x07;
ft4_buff_ptr->tpage = (0x0c) | (0x01<<7);
ft4_buff_ptr->clut = (0xfa00>>2);
*(uint16 *)&ft4_buff_ptr->u0 = (d1 + 0x00) | (0xf0<<8);
*(uint16 *)&ft4_buff_ptr->u1 = (d1 + 0x0f) | (0xf0<<8);
*(uint16 *)&ft4_buff_ptr->u2 = (d1 + 0x00) | (0xff<<8);
*(uint16 *)&ft4_buff_ptr->u3 = (d1 + 0x0f) | (0xff<<8);
AddPrim( &Disp_env_ptr->ot[2], ft4_buff_ptr );
}
/*==================================================================*/
/* "sub_scrn.c" End of File */
/*==================================================================*/
EM09_49.C#
c0f_move_init ズと輝度の設定 */
*(uint32 *)&wk_p->size.vz = 0x42100200;
EM_Char_Set(wk_p,0x01,0);
wk_p->routine_0++;
}
Obj_pos_adj_round(&wk_p->pos_l,&wk_p->pos);
EM_Char_Move(wk_p);
if(wk_p->be_flag & TRANS){
Model_Shadow_Trans(wk_p,50,683,0);
}
}
/*--------------------------------------------------------------*/
/* 警部 */
/*--------------------------------------------------------------*/
void StXX_em26_49_move(EM_WORK *wk_p)
{
if(wk_p->routine_0 == 0){
Model_work_init(wk_p,0);
*(uint32 *)&wk_p->size.vx = 0x02000200; /* サイズと輝度の設定 */
*(uint32 *)&wk_p->size.vz = 0x42100200;
EM_Char_Set(wk_p,0x01,0);
wk_p->routine_0++;
}
Obj_pos_adj_round(&wk_p->pos_l,&wk_p->pos);
EM_Char_Move(wk_p);
if(wk_p->be_flag & TRANS){
Model_Shadow_Trans(wk_p,50,683,0);
}
}
/*--------------------------------------------------------------*/
/* TVレポーター */
/*--------------------------------------------------------------*/
void StXX_em2d_49_move(EM_WORK *wk_p)
{
if(wk_p->routine_0 == 0){
Model_work_init(wk_p,0);
*(uint32 *)&wk_p->size.vx = 0x02000200; /* サイズと輝度の設定 */
*(uint32 *)&wk_p->size.vz = 0x42100200;
wk_p->routine_0++;
}
if(wk_p->routine_1 == 0){
switch(wk_p->routine_2){
case 0:
EM_Char_Set(wk_p,0x00,0);
wk_p->routine_2++;
break;
case 1:
break;
default:
break;
}
} else {
switch(wk_p->routine_2){
case 0:
EM_Char_Set(wk_p,0x01,0);
wk_p->routine_2++;
break;
case 1:
break;
default:
break;
}
}
Obj_pos_adj_round(&wk_p->pos_l,&wk_p->pos);
EM_Char_Move(wk_p);
if(wk_p->be_flag & TRANS){
Model_Shadow_Trans(wk_p,50,683,0);
}
}
/*--------------------------------------------------------------*/
/* おねえさん */
/*--------------------------------------------------------------*/
void StXX_em34_49_move(EM_WORK *wk_p)
{
if(wk_p->routine_0 == 0){
Model_work_init(wk_p,0);
*(uint32 *)&wk_p->size.vx = 0x02000200; /* サイズと輝度の設定 */
*(uint32 *)&wk_p->size.vz = 0x42100200;
EM_Char_Set(wk_p,0x01,0);
wk_p->routine_0++;
}
Obj_pos_adj_round(&wk_p->pos_l,&wk_p->pos);
EM_Char_Move(wk_p);
if(wk_p->be_flag & TRANS){
Model_Shadow_Trans(wk_p,50,683,0);
}
}
/*--------------------------------------------------------------*/
/* ワイリー */
/*--------------------------------------------------------------*/
void StXX_em38_49_move(EM_WORK *wk_p)
{
if(wk_p->routine_0 == 0){
Model_work_init(wk_p,0);
*(uint32 *)&wk_p->size.vx = 0x02000200; /* サイズと輝度の設定 */
*(uint32 *)&wk_p->size.vz = 0x42100200;
EM_Char_Set(wk_p,0x01,0);
wk_p->routine_0++;
}
Obj_pos_adj_round(&wk_p->pos_l,&wk_p->pos);
EM_Char_Move(wk_p);
if(wk_p->be_flag & TRANS){
Model_Shadow_Trans(wk_p,50,683,0);
}
}
/*--------------------------------------------------------------*/
/* カメラマン */
/*--------------------------------------------------------------*/
void StXX_em5c_49_move(EM_WORK *wk_p)
{
if(wk_p->routine_0 == 0){
Model_work_init(wk_p,0);
*(uint32 *)&wk_p->size.vx = 0x02000200; /* サイズと輝度の設定 */
*(uint32 *)&wk_p->size.vz = 0x42100200;
wk_p->routine_0++;
}
if(wk_p->routine_1 == 0){
switch(wk_p->routine_2){
case 0:
EM_Char_Set(wk_p,0x00,0);
wk_p->routine_2++;
break;
case 1:
break;
default:
break;
}
} else {
switch(wk_p->routine_2){
case 0:
EM_Char_Set(wk_p,0x01,0);
wk_p->routine_2++;
break;
case 1:
break;
default:
break;
}
}
Obj_pos_adj_round(&wk_p->pos_l,&wk_p->pos);
EM_Char_Move(wk_p);
if(wk_p->be_flag & TRANS){
Model_Shadow_Trans(wk_p,50,683,0);
}
}
/*--------------------------------------------------------------*/
/* 雲 */
/*--------------------------------------------------------------*/
typedef struct {
VECTOR pos; /* 位置 */
sint16 ctr; /* カウンター */
sint16 a; /* 進む方向 */
sint16 spd; /* 進む速度 */
sint16 pad;
} SHL38_FREE;
SHL_WORK *StXX_set_shl38(SVECTOR *vp,sint16 a,sint16 spd,uint8 type)
{
SHL_WORK *sp;
SHL38_FREE *fp;
sp = (SHL_WORK *)0x00000000;
if((sp = (SHL_WORK *)Open_SHL_WORK())){
sp->be_flag |= MOVE;
sp->id = 0x38;
sp->type = type;
fp = (SHL38_FREE *)&sp->free[0];
*(uint32 *)&fp->pos.vx = *(uint32 *)&vp->vx;
*(uint32 *)&fp->pos.vz = *(uint32 *)&vp->vz;
fp->ctr = 0;
fp->a = a;
fp->spd = spd;
}
return(sp);
}
void StXX_shl38_move(SHL_WORK *wk_p)
{
VECTOR vec;
SHL38_FREE *fp;
if(wk_p->routine_0 == 0){
wk_p->be_flag |= (TRANS | MODEL);
Model_work_init(wk_p,&wk_p->type);
wk_p->efc.model.rgbc = 0x00808080;
wk_p->routine_1++;
}
fp = (SHL38_FREE *)&wk_p->free[0];
fp->ctr += fp->spd;
wk_p->pos_l.vx = (fp->pos.vx << 16) + ((fp->ctr * rsin(fp->a)) << 4);
wk_p->pos_l.vz = (fp->pos.vz << 16) + ((fp->ctr * rcos(fp->a)) << 4);
wk_p->pos_l.vy = fp->pos.vy << 16;
wk_p->efc.model.sv.vx = wk_p->pos.vx = wk_p->pos_l.vx >> 16;
wk_p->efc.model.sv.vz = wk_p->pos.vz = wk_p->pos_l.vz >> 16;
wk_p->efc.model.sv.vy = wk_p->pos.vy = wk_p->pos_l.vy >> 16;
E_MATRIX(wk_p->efc.model.m); /* マトリックスの初期化 */
vec.vx = vec.vy = vec.vz = 4096;
ScaleMatrix(&wk_p->efc.model.m,&vec);
}
/*==============================================================*/
/* 'EM09_49.C' End of File */
/*==============================================================*/
(Source: koolaidman)