A vertical shoot-'em-up game that's considered to be a predecessor to Ikaruga.
Regional Differences#
The ST-V version, when using a non-Japanese BIOS, has quite different behavior than the Japanese version. These changes have never been present in any other version of the game.
- Practice stage removed
- Boss introductions removed
- Button 3 completely disabled
- Button 1+2 together uses the sword
- Button 2 shoots shot C
- Shot C additionally shoots directly behind the player
- Shot C bombs-on-screen limit is 8 instead of 5 (It actually literally compares to a double-precision floating point 7.5, but that just ends up being effectively 8)
Source Code#
Large amounts of uncompiled source code can be found throughout the ST-V version's ROM. These addresses are assuming the ROM has been pre-concatenated.
0xC8800
This is part of the source code for the boss Golets.
eam[]={
0x2000,
0x2400,
0x2800,
0x2c00,
0x3000,
};
/*-----------------------------------------------------------------*/
static void rain_beam(ENM_WK *x){
/*-----------------------------------------------------------------*/
if(shot_kill_chk((COMM_OBJ *)x,1)){
;
}else{
if(x->sp==0){
x->s8w1--;
x->mw.zoomx += 0x800;
if(x->s8w1<=0){
x->sp++;
x->s8w1 = 16;
if(x->s8w0){
x->mw.angz = x->s16w0;
}else{
x->mw.angz = get_ang(x, get_play0(&x->mw));
}
x->dx = 0;
x->dy = 0;
// x->s32w0 = fixmuls(sin32(x->mw.angz),+0x2c00);
// x->s32w1 = fixmuls(cos32(x->mw.angz),-0x2c00);
x->s32w0 = fixmuls(sin32(x->mw.angz),+LV5_rain_beam[LV5]);
x->s32w1 = fixmuls(cos32(x->mw.angz),-LV5_rain_beam[LV5]);
}
x->dx += x->s32w0;
x->dy += x->s32w1;
}else{
if(x->s8w1>0){
x->s8w1--;
x->dx += x->s32w0;
x->dy += x->s32w1;
x->mw.zoomx -= 0x800;
x->mw.zoomy -= 0x180;
}
}
x->mw.x += x->dx;
x->mw.y += x->dy;
}
x->mw.anm_no = rain_beam_anm[gtimer&3];
}
/*-----------------------------------------------------------------*/
static void rain_beam_set(DELIVERY_WK *dw, BOS12_WK *ms){
/*-----------------------------------------------------------------*/
ENM_WK *x;
x = obj_set(ENM_OBJ_AREA,obj_size(sizeof(ENM_WK)),shot);
if(x == NULL) return;
mw_init(&x->mw);
aw_init(&x->aw);
ENM_WK_init(x);
x->mw.obj_no = ms->mw.obj_no;
x->mw.dousa_func = rain_beam;
x->mw.sys_fg = KILL_TAMA|SPR_NO_CUT_FG;
x->mw.x = ms->rain_pos[X];
x->mw.y = ms->rain_pos[Y];
x->mw.z = 0;
x->mw.pri_ofs = PRI_INU;
x->mw.anm_no = A_MARU1;
x->mw.char_no = CHAR_EFT;
x->aw.atari_tbl_adr = at_rain_beam;
x->aw.nakama = NAKAMA_ENM;
x->aw.zoku = ZOKU_TAMA;
x->s8w0 = dw->par; /* Shoot Type */
x->s8w1 = 16; /* Speed Down Flame */
x->mw.angz = dw->Ds16w0; /* 1st angZ */
x->s16w0 = dw->Ds16w1; /* 2nd angZ */
x->dx = fixmuls(sin32(x->mw.angz),x->s8w1*+dw->Ds16w2*DEC/0x10);
x->dy = fixmuls(cos32(x->mw.angz),x->s8w1*-dw->Ds16w2*DEC/0x10);
x->s32w0 = x->dx/-0x10;
x->s32w1 = x->dy/-0x10;
x->mw.zoomx = 0x1000;
x->mw.zoomy = 0x8000;
if(x->s8w0){
x->mw.color_b = char_tbl[CHAR_EFT].color + COL_YRED;
}else{
x->mw.color_b = char_tbl[CHAR_EFT].color + COL_YELLOW;
}
x->mw.color_m = x->mw.color_b;
}
/*============================================*/
/* ------------------------------------------ */
/* Bakurai Touka */
/* ------------------------------------------ */
/*============================================*/
static ATARI_TBL at_baku[]={
{ (ATFG_ATTACK | ATFG_TBL_END), AT_NML,+0x00,+0x00,0x10,0x10, },
};
extern void eft_moon(EFTC_OBJ *x);
/*-----------------------------------------------------------------*/
static void moon2(EFTC_OBJ *x){
/*-----------------------------------------------------------------*/
eft_moon(x);
x->mw.y -= SC_DY;
}
/*-----------------------------------------------------------------*/
static void baku(ENM_WK *x){
/*-----------------------------------------------------------------*/
EFTC_OBJ *p;
DELIVERY_WK dw;
if(x->sp==0){
x->dy += 0x0e00;
x->s32w0 += 0x0b00;
if(x->mw.z > 0){
x->sp++;
x->mw.sys_fg = KILL_TAMA;
x->dy = -SC_DY;
x->s32w0 = 0;
x->s32w1 = +0x1000;
x->mw.zoomx = 0x2000;
x->mw.anm_no = A_MARU0;
x->mw.char_no = CHAR_EFT;
x->mw.color_m =
x->mw.color_b = char_tbl[CHAR_EFT].color + COL_YRED;
dw.x = x->mw.x;
dw.y = x->mw.y;
dw.z = x->mw.z;
dw.Ds32w0 = +0x14000;
p = eft_moon_set(&dw);
if(p){
p->mw.dousa_func = moon2;
}
se_set(SE02_BAKU2_2,x->mw.x);
}else{
if(x->mw.z < -0x30*DEC){
x->mw.anm_no = A_SONI_BAKURAI01_A;
}
if(x->mw.z < -0x28*DEC){
x->mw.anm_no = A_SONI_BAKURAI02_A;
}
if(x->mw.z < -0x20*DEC){
x->mw.anm_no = A_SONI_BAKURAI03_A;
}
if(x->mw.z < -0x18*DEC){
x->mw.anm_no = A_SONI_BAKURAI04_A;
}else{
x->mw.anm_no = A_SONI_BAKURAI05_A;
}
x->mw.anm_no += gtimer&1;
}
}else{
x->mw.anm_no = rain_beam_anm[gtimer&3];
x->mw.angz = RAND;
x->s32w1 -= 0x080;
x->mw.zoomx += x->s32w1;
x->mw.zoomy = x->mw.zoomx;
if(x->s32w0<0&&x->mw.zoomx<0x3000){
x->mw.sys_fg = (KILL_TAMA|ATARI_OFF_FG);
}
x->mw.sys_fg &= -(X_FLP|Y_FLP)-1;
x->mw.sys_fg |= RAND&(X_FLP|Y_FLP);
}
x->mw.y += x->dy;
x->mw.z += x->s32w0;
if(x->sp && (range_chk(&x->mw)||x->mw.zoomx<0)){
x->mode = OBJ_M_KIE;
}
}
/*-----------------------------------------------------------------*/
static void baku_set(DELIVERY_WK *dw){
/*-----------------------------------------------------------------*/
ENM_WK *x;
x = obj_set(ENM_OBJ_AREA,obj_size(sizeof(ENM_WK)),shot);
if(x == NULL) return;
mw_init(&x->mw);
aw_init(&x->aw);
ENM_WK_init(x);
x->mw.obj_no = dw->Dobj_no;
x->mw.dousa_func = baku;
x->mw.sys_fg = (KILL_TAMA|ATARI_OFF_FG);
x->mw.x = dw->x;
x->mw.y = dw->y;
x->mw.z = dw->z;
x->dy = -0x00000;
x->mw.pri_ofs = PRI_SHOT;
x->mw.anm_no = A_SONI_BAKURAI01_A;
x->mw.char_no = CHAR_SONIC_E;
x->mw.color_m =
x->mw.color_b = char_tbl[CHAR_SONIC_E].color + COL_SONIC_EFT;
x->aw.atari_tbl_adr = at_baku;
x->aw.nakama = NAKAMA_ENM;
x->aw.zoku = ZOKU_TAMA;
return;
}
/*============================================*/
/* ------------------------------------------ */
/* SHUTTER VELM */
/* ------------------------------------------ */
/*============================================*/
extern void enm00_dead(COMM_OBJ *);
extern ATARI_TBL at_enm00_0[];
#define ENM00_0_LIFE (SHOT_PW_VALCAN*2) /* VELM */
/*=================================================================*/
static void bos12_enm00(ENM_WK *x){
/*=================================================================*/
if(x->mw.y > +0x80*DEC){
x->mode = OBJ_M_KIE;
return;
}
if(x->aw.life <= 0){
enm00_dead((COMM_OBJ *) x);
x->mode = OBJ_M_KIE;
}else{
x->mw.anm_no = (x->mw.anm_no+1)&0x1f;
x->mw.y -= SC_DY;
}
}
/*=================================================================*/
static void bos12_enm00_set(DELIVERY_WK *dw){
/*=================================================================*/
s8 i;
ENM_WK *x;
i = ENM_OBJ_get();
if(i == DUMMY_OBJ) return;
x = obj_set(ENM_OBJ_AREA,obj_size(sizeof(ENM_WK)),enm);
if(x == NULL) return;
mw_init(&x->mw);
aw_init(&x->aw);
ENM_WK_init(x);
x->mw.dousa_func = bos12_enm00;
x->mw.sys_fg = KILL_TAMA|Y_FLP;
x->mw.obj_no = i;
obj_x[x->mw.obj_no] = x;
x->mw.char_no = CHAR_VELM;
x->mw.anm_no = 0;
x->aw.atari_tbl_adr = at_enm00_0;
x->aw.life = ENM00_0_LIFE;
x->mw.color_m = char_tbl[CHAR_VELM].color + ZOKU_YELLOW*0x10;
x->mw.color_b = x->mw.color_m;
x->aw.nakama = NAKAMA_ENM;
x->aw.zoku = ZOKU_YELLOW;
x->mw.x = dw->x;
x->mw.y = dw->y;
x->mw.z = 0;
}
/*============================================*/
/* ------------------------------------------ */
/* SHUTTER */
/* ------------------------------------------ */
/*============================================*/
/*=================================================================*/
static ATARI_TBL at_shut0[]={
/*=================================================================*/
{(ATFG_ATTACK ), AT_BODY,+0x34,+0x00,0x22,0x03,},
{(ATFG_DAMAGE | ATFG_TBL_END), DM_NML, +0x34,+0x00,0x28,0x04,},
};
/*=================================================================*/
static ATARI_TBL at_shut1[]={
/*=================================================================*/
{(ATFG_ATTACK ), AT_BODY,-0x34,+0x00,0x22,0x03,},
{(ATFG_DAMAGE | ATFG_TBL_END), DM_NML, -0x34,+0x00,0x28,0x04,},
};
/*=================================================================*/
static void shutout(ENM_WK *x){
/*=================================================================*/
if(gtimer&1){
x->aw.atari_tbl_adr = at_shut0;
}else{
x->aw.atari_tbl_adr = at_shut1;
}
x->mw.y -= SC_DY;
if(x->mw.y>(+0x80*DEC+(+0x10*DEC/2))){
x->mode = OBJ_M_KIE;
}
}
/*=================================================================*/
static void shutout_disp(MAIN_WK *mw){
/*=================================================================*/
ENM_WK *x;
MAIN_WK m;
x = (ENM_WK *)((u32)mw-0x10);
mw_init(&m);
m.char_no = CHAR_SONIC_E;
m.anm_no = A_STAGE2_KABE;
m.pri_ofs = PRI_ENM;
m.color_m = 0x2000+char_tbl[CHAR_SONIC_E].color+COL_STAGE2_KABE;
m.y = x->mw.y;
m.z = 0;
m.x = x->mw.x-0x34*DEC;
spr_put(&m);
m.x = x->mw.x+0x34*DEC;
spr_put(&m);
}
/*=================================================================*/
static void shutout_set(s32 XP, s32 YP, BOS12_WK *ms, u8 FG){
/*=================================================================*/
s8 i;
ENM_WK *p;
DELIVERY_WK dw;
/*--------------------------------------------------------*/
i = ENM_OBJ_get();
if(i == DUMMY_OBJ) return;
p = obj_set(ENM_OBJ_AREA,obj_size(sizeof(ENM_WK)),enm);
if(p == NULL) return;
/*--------------------------------------------------------*/
mw_init(&p->mw);
aw_init(&p->aw);
ENM_WK_init(p);
p->mw.dousa_func = shutout;
p->mw.sys_fg = (MODEL_DISP_FG|MODEL_FUNC_CALL_FG
|ATARI_MUTEKI_FG|ATARI_STEALTH_FG|KILL_TAMA);
p->mw.poly_adr = shutout_disp;
p->mw.obj_no = i;
obj_x[p->mw.obj_no] = p;
p->aw.atari_tbl_adr = at_shut0;
p->aw.life = 10;
p->aw.nakama = NAKAMA_KABE;
p->aw.zoku = ZOKU_NORMAL;
p->mw.x = XP+(ms->scr_shut*16*DEC);
p->mw.y = YP;
if(RAND&0x10){
if(ms->scr_shut>-2){
ms->scr_shut--;
}else{
ms->scr_shut++;
}
}else{
if(ms->scr_shut<+2){
ms->scr_shut++;
}else{
ms->scr_shut--;
}
}
if(FG && ms->zibaku==0){
dw.x = p->mw.x;
dw.y = p->mw.y;
bos12_enm00_set(&dw);
}
}
/*============================================================================*/
/* ------------------------------------------ */
/* Sub Routines */
/* ------------------------------------------ */
/*============================================================================*/
/*=================================================================*/
static BOS12_WK *get_letsGO(BOS12_WK *x){
/*=================================================================*/
return obj_x[x->LG_no];
}
/*============================================================================*/
/* ------------------------------------------ */
/* Steps Init */
/* ------------------------------------------ */
/*============================================================================*/
/*=================================================================*/
static void IDEON_SWORD_init(BOS12_WK *x){
/*=================================================================*/
x->sp = s_IDEON_SWORD;
x->runYpos = (+0x40+0x20)*DEC;
x->s16w0 = 45;
x->s32w0 = 0;
x->s32w1 = 0;
x->s32w2 = DEC;
x->s32w3 = DEC;
}
/*============================================================================*/
/* ------------------------------------------ */
/* Steps Main (SONIC) */
/* ------------------------------------------ */
/*============================================================================*/
#if EDIT
#include "ang_edt.c"
#include "mot_edt.c"
/*=================================================================*/
static void TEST(BOS12_WK *x){
/*=================================================================*/
// s16 *p;
ang_edit(&x->mw);
mot_edit(&x->sw,&x->ew);
#if 0
/* Hit3D Posi Edit */
if(spad[PAD_1P].trig & PAD_L){
x->p0_posi_num--;
if(x->p0_posi_num<0){
x->p0_posi_num = p0_suu-1;
}
}
if(spad[PAD_1P].trig & PAD_R){
x->p0_posi_num++;
if(x->p0_posi_num>p0_suu-1){
x->p0_posi_num = 0;
}
}
if(spad[PAD_1P].trig & PAD_UP){
x->p0_menu--;
if(x->p0_menu<0){
x->p0_menu = 0;
}
}
if(spad[PAD_1P].trig & PAD_DOWN){
x->p0_menu++;
if(x->p0_menu>3){
x->p0_menu = 3;
}
}
p = &p0_posi_data[4 * x->p0_posi_num];
if(spad[PAD_1P].data & PAD_A){
if(spad[PAD_1P].data & PAD_LEFT){
*(p+x->p0_menu) -= 1;
}
if(spad[PAD_1P].data & PAD_RIGHT){
*(p+x->p0_menu) += 1;
}
}else{
if(spad[PAD_1P].trig & PAD_LEFT){
*(p+x->p0_menu) -= 1;
}
if(spad[PAD_1P].trig & PAD_RIGHT){
*(p+x->p0_menu) += 1;
}
}
if(x->p0_menu == 3){
*(p+x->p0_menu) &= 3;
}
num_set16(+0x80*DEC,+0x30*DEC,0,x->p0_posi_num);
if(!(x->p0_menu==0 && gtimer&1)){
num_set16(+0x80*DEC,+0x40*DEC,0,*(p+X));
}
if(!(x->p0_menu==1 && gtimer&1)){
num_set16(+0x80*DEC,+0x48*DEC,0,*(p+Y));
}
if(!(x->p0_menu==2 && gtimer&1)){
num_set16(+0x80*DEC,+0x50*DEC,0,*(p+Z));
}
if(!(x->p0_menu==3 && gtimer&1)){
num_set16(+0x80*DEC,+0x60*DEC,0,*(p+3));
}
#endif
}
#endif
/*=================================================================*/
/*=================================================================*/
/*=================================================================*/
#if SCR_DBG
static void test_hit_set(s32 XP, s32 YP);
#endif
/*=================================================================*/
static void RUN_se(BOS12_WK *x, s32 se_Xpos){
/*=================================================================*/
if(x->runXpos != se_Xpos){
se_set(SE02_BURNER2_2,x->mw.x);
}
}
/*=================================================================*/
static void set_run_rain_beam(BOS12_WK *x){
/*=================================================================*/
DELIVERY_WK dw;
if(LV5<2){
return;
}
se_set(SE_T_SHOT1,x->mw.x);
dw.par = 0x0000; /* Type */
dw.Ds16w2 = 0x0007; /* 1st Speed */
dw.Ds16w0 = 0xe000; /* 1st angZ */
rain_beam_set(&dw,x);
dw.Ds16w0 = 0x2000; /* 1st angZ */
rain_beam_set(&dw,x);
dw.Ds16w0 = 0xc000; /* 1st angZ */
rain_beam_set(&dw,x);
dw.Ds16w0 = 0x4000; /* 1st angZ */
rain_beam_set(&dw,x);
dw.Ds16w0 = 0xa000; /* 1st angZ */
rain_beam_set(&dw,x);
dw.Ds16w0 = 0x6000; /* 1st angZ */
rain_beam_set(&dw,x);
}
/*=================================================================*/
static void SCROLL(BOS12_WK *x){
/*=================================================================*/
s8 i,suu,set;
u16 dat;
s32 s32w0;
FIXED XpYp[XY];
u8 FG;
#if SCR_DBG
s16 BGX;
#endif
DELIVERY_WK dw;
/*-------------------------------------*/
/* Boss Moved Command */
/*-------------------------------------*/
for(i=0; i<2; i++){
x->scr_y[i] += SC_DY;
if(x->scr_y[i] < -0x80*DEC){
/*-------------------------------------*/
#if SCR_DBG
BGX = SCROLL_BG[(x->scr_step*2)+0];
if(BGX!=BG_END){
test_hit_set(BGX*DEC,(-0x80-0xc0)*DEC);
}
BGX = SCROLL_BG[(x->scr_step*2)+1];
if(BGX!=BG_END){
test_hit_set(BGX*DEC,(-0x80-0xc0)*DEC);
}
#endif
/*-------------------------------------*/
x->scr_step++;
dat = SCROLL_proc[x->scr_step];
if(dat==SC_loop){
x->zibaku++;
x->scr_step = 0;
dat = SCROLL_proc[0];
}
x->scr_p[i] = dat&0xf;
x->scr_y[i] += 0x80*2*DEC;
/*---------------------*/
/* Change Running Root */
/*---------------------*/
if(BACK_RUN_CHK){
get_play_posi(x, 0, &XpYp[0]);
if(XpYp[X]>0){
x->scr_rand[i] = -1;
}else{
x->scr_rand[i] = +1;
}
if(LV5<3){
x->scr_rand[i] = 0-x->scr_rand[i];
}
}else{
if(RAND&0x10){
x->scr_rand[i] = -1;
}else{
x->scr_rand[i] = +1;
}
}
/*-----------------*/
/* Scroll Objs Set */
/*-----------------*/
suu = 0;
yaji_set(x,dat&0xf00);
dat &= 0xff;
switch(dat){
case SC_ZERO + ESET_SHUTOUT_SEL:
if(x->mw.x>0){
s32w0 = -0x78*DEC;
}else{
s32w0 = +0x78*DEC;
}
for(; suu<3; suu++){
shutout_set(s32w0,
(-0x80-0x94-(suu*0x2c))*DEC,x,1);
}
x->scr_p[i] = SC_ZERO;
break;
case SC_CENT + ESET_SHUTOUT_ENM6:
case SC_CENT + ESET_SHUTOUT_START6:
case SC_CENT + ESET_SHUTOUT_START:
set_run_rain_beam(x);
x->scr_shut = x->scr_rand[i];
if(dat==SC_CENT+ESET_SHUTOUT_ENM6 ){
FG = 1;
}else{
FG = 0;
}
if(dat==SC_CENT+ESET_SHUTOUT_START6
|| dat==SC_CENT+ESET_SHUTOUT_ENM6 ){
set = 6;
}else{
set = 3;
}
for(; suu<set; suu++){
shutout_set(x->scr_rand[i]*-0x78*DEC,
(-0x80-0x94-(suu*0x2c))*DEC,x,FG);
}
x->scr_p[i] = SC_CENT;
break;
case SC_CENT2 + ESET_SHUTOUT_START:
set_run_rain_beam(x);
x->scr_shut = x->scr_rand[i];
for(; suu<3; suu++){
shutout_set(x->scr_rand[i]*-0x78*DEC,
(-0x80-0x94-0x80-(suu*0x2c))*DEC,x,0);
}
x->scr_p[i] = SC_CENT2;
break;
case SC_ZERO + ESET_GO_SET:
x->fg ^= 1;
x->scr_p[i] = SC_ZERO;
break;
case SC_ZERO + ESET_FIGHT:
x->fg ^= 2;
x->btimer = 0;
x->scr_p[i] = SC_ZERO;
x->IDEON_X_fg = 30;
break;
}
}
}
/*-------------------------------------*/
/* Command Trans ??? */
/*-------------------------------------*/
for(i=0; i<2; i++){
if(x->scr_rand[i] && -x->scr_y[i]>=(x->mw.y-0x10*DEC)){
x->scr_command = x->scr_p[i];
switch(x->scr_command){
case SC_ZERO:
/*--------------*/
/* 2way Missile */
/*--------------*/
if(((x->sp==s_WAIT && x->runYpos>0)
&& (x->IDEON_X==0||(x->IDEON_X!=0&&i)))
|| (x->sp==s_IDEON_SWORD
&& x->p1_fg&fg_brk&&x->p2_fg&fg_brk)){
dw.x = x->rain_pos[X];
dw.y = x->rain_pos[Y];
dw.z = 0;
dw.Ds32w3 = 0x1c000; /* Speed */
dw.Ds16w1 = 40; /* Homing Flame */
dw.Ds16w3 = 0x2000; /* Re_Ang_Mode (64) */
dw.Ds16w0 = x->mw.angz;
dw.Ds16w4 = dw.Ds16w0+0x0e00; /* First Dir */
eshot03_set_cstm(&dw);
dw.Ds16w4 = dw.Ds16w0-0x0e00; /* First Dir */
eshot03_set_cstm(&dw);
}
break;
case SC_SIDE:
RUN_se(x,0);
x->runsgt = 0x20;
x->runXpos = 0;
x->runHundle = 0x50;
break;
case SC_SIDE2:
RUN_se(x,0);
x->runsgt = 0x80;
x->runXpos = 0;
x->runHundle = 0x18;
break;
case SC_CENT2:
RUN_se(x,0x78*DEC*x->scr_rand[i]);
x->runsgt = 0x80;
x->runXpos = 0x78*DEC*x->scr_rand[i];
x->runHundle = 0x18;
break;
case SC_CENT:
RUN_se(x,0x78*DEC*x->scr_rand[i]);
x->runsgt = 0x20;
x->runXpos = 0x78*DEC*x->scr_rand[i];
x->runHundle = 0x50;
break;
case SC_LFT2:
RUN_se(x,+0x78*DEC);
x->runsgt = 0x60;
x->runXpos = +0x78*DEC;
x->runHundle = 0x38;
break;
case SC_RGT2:
RUN_se(x,-0x78*DEC);
x->runsgt = 0x60;
x->runXpos = -0x78*DEC;
x->runHundle = 0x38;
break;
case SC_BACK_TURN:
if(BACK_RUN_CHK){
IDEON_SWORD_init(x);
}else{
x->sp = s_BACK_TURN;
x->runspd = -SC_DY+DEC+0x8000;
x->runHundle = 0x40;
x->s32w0 = 0;
x->s32w1 = 0;
se_set(SE02_KAITEN2_2,x->mw.x);
M_hit_off(x);
}
break;
}
x->scr_rand[i] = 0;
}
}
x->runZ = atan(x->runXpos-x->mw.x, (x->mw.y-x->runsgt*DEC)-x->mw.y);
x->mw.y -= SC_DY;
}
/*=================================================================*/
static void RUN_rot(BOS12_WK *x){
/*=================================================================*/
rot_sub(&x->angZspd,&x->angZssp,x->mw.angz,x->runZ,
0x2000,8,x->runHundle);
rot_sub(&x->angYspd,&x->angYssp,x->mw.angy,-x->mw.angz,
0x4000,0x10,0x060);
}
/*=================================================================*/
static void RUN_sub(BOS12_WK *x){
/*=================================================================*/
x->dx = fixmuls(sin32(x->mw.angz),-SC_DY+DEC);
if(x->mw.y<x->runYpos+get_rand(0x10000)){
x->runspd = comps32(x->runspd,-SC_DY-0x10000,0x8000);
x->dy = -fixmuls(cos32(x->mw.angz),x->runspd);
}else{
x->runspd = comps32(x->runspd,-SC_DY+0xe000, 0x7000);
x->dy = -fixmuls(cos32(x->mw.angz),x->runspd);
}
}
/*=================================================================*/
static void DEMO(BOS12_WK *x){
/*=================================================================*/
x->angYspd = comps32(x->angYspd, 0x800,0x20);
x->angYssp = (x->mw.y/DEC)*-0x20;
x->mw.x = (sin32(x->mw.angy+0x8000+x->angYssp)*((-x->mw.y/(DEC*2))-0x20));
x->mw.z = (cos32(x->mw.angy+0x8000+x->angYssp)*-0x20)-0x40*DEC;
x->dy = -0x20000;
if(x->mw.y<0){
x->sp++;
x->mw.angx = 0;
x->mw.angz = 0;
if(x->LG_fg==0){
M_hit_on(x);
x->dx = -0x38000;
}else{
x->dx = +0x40000;
}
}
}
/*=================================================================*/
static void DEMO_1(BOS12_WK *x){
/*=================================================================*/
if(x->LG_fg==0){
x->dy += 0x0a00;
x->dx += 0x1400;
x->angYspd -= 0x2d;
x->dz += 0x0696;
if(x->dx>0 && x->mw.x>-0x30*DEC){
x->sp++;
x->angYssp = x->angYspd*2;
}
}else{
x->angZspd -= 0x4;
x->dx -= 0x4000;
x->dy -= 0x0800;
x->angYspd += 0x30;
x->dz -= 0x0100;
if(x->mw.y<-0x120*DEC){
x->sp = m_Wait;
x->mw.sys_fg = (SPR_DISP_CUT|ATARI_OFF_FG);
x->dx = 0;
x->dy = 0;
x->dz = 0;
}
}
}
/*=================================================================*/
static void DEMO_2(BOS12_WK *x){
/*=================================================================*/
RUN_rot(x);
x->dx = comps32(x->dx, 0, 0x1234);
x->dz = comps32(x->dz, 0, 0x1000);
x->dy -= 0x700;
if(x->dz==0){
x->sp = s_WAIT;
x->dy = 0;
x->mw.z = 0x10*DEC;
}
}
static u8 LV5_kirai[]={
40,
30,
20,
17,
14,
};
/*=================================================================*/
static void WAIT(BOS12_WK *x){
/*=================================================================*/
PLAY_OBJ *pw;
DELIVERY_WK dw;
// rot_sub(&x->angXspd,&x->angXssp,x->mw.angx,0,
// 0x1800,0x10,0x040);
SCROLL(x);
/*------------------*/
/* Running Position */
/*------------------*/
if(BACK_RUN_CHK){
x->runYpos = (+0x48+0x20)*DEC;
}else{
x->runYpos = (-0x3c+0x20)*DEC;
}
/*----------------*/
/* Running Attack */
/*----------------*/
dw.Dobj_no = x->mw.obj_no;
if(x->fg&2){
x->IDEON_X = comps32(x->IDEON_X,16,2);
if(x->IDEON_X == 14){
se_set(SE02_METAL2_2,x->mw.x);
}
/*--------------*/
/* Search Laser */
/*--------------*/
if(x->IDEON_X==16 && x->btimer>40){
x->runZ = 0;
pw = get_play0(&x->mw);
dw.Ds32w0 = x->mw.x - pw->mw.x;
if(dw.Ds32w0 > +0x0c*DEC){
x->mw.x -= 0x2000;
}
if(dw.Ds32w0 < -0x0c*DEC){
x->mw.x += 0x2000;
}
if(x->mw.x > +0x40*DEC){
if(x->mw.x > (+0x78*DEC)+(0x10*DEC)){
x->mw.x =(+0x78*DEC)+(0x10*DEC);
}
if(x->mw.x < (+0x78*DEC)-(0x10*DEC)){
x->mw.x =(+0x78*DEC)-(0x10*DEC);
}
}else{
if(x->mw.x < -0x40*DEC){
if(x->mw.x < (-0x78*DEC)-(0x10*DEC)){
x->mw.x =(-0x78*DEC)-(0x10*DEC);
}
if(x->mw.x > (-0x78*DEC)+(0x10*DEC)){
x->mw.x =(-0x78*DEC)+(0x10*DEC);
}
}else{
if(x->mw.x > (+0x00*DEC)+(0x14*DEC)){
x->mw.x =(+0x00*DEC)+(0x14*DEC);
}
if(x->mw.x < (+0x00*DEC)-(0x14*DEC)){
x->mw.x =(+0x00*DEC)-(0x14*DEC);
}
}
}
if(rest(x->btimer,WAIT_rain_tym[LV5])==0){
se_set(SE_T_SHOT1,x->mw.x);
dw.par = 0x0000; /* Type */
dw.Ds16w2 = 0x0007; /* 1st Speed */
if(x->mw.y>0 || x->p6_fg&fg_brk || x->p4_fg&fg_brk){
dw.Ds16w0 = 0xd000; /* 1st angZ */
rain_beam_set(&dw,x);
}
if(x->mw.y>0 || x->p5_fg&fg_brk || x->p3_fg&fg_brk){
dw.Ds16w0 = 0x3000; /* 1st angZ */
rain_beam_set(&dw,x);
}
}
/*-------------*/
/* Armd Vulcan */
/*-------------*/
if(x->mw.y<0 && rest(x->btimer,25)==0){
if(rest(x->btimer,25*2)==0){
if((x->p5_fg&fg_brk)==0){
dw.x = x->vul_L_pos[X];
dw.y = x->vul_L_pos[Y];
wall_set(&dw);
}
}else{
if((x->p6_fg&fg_brk)==0){
dw.x = x->vul_R_pos[X];
dw.y = x->vul_R_pos[Y];
wall_set(&dw);
}
}
}
/*----------------*/
/* Wing Laser */
/*----------------*/
if(x->mw.y<0 && x->btimer==45){
if((x->p3_fg&fg_brk)==0){
wing_laser_set(x,0);
}
if((x->p4_fg&fg_brk)==0){
wing_laser_set(x,1);
}
}
/*----------------*/
/* Destroyed Mine */
/*----------------*/
if(x->p3_fg&fg_brk && x->p4_fg&fg_brk
&& x->p5_fg&fg_brk && x->p6_fg&fg_brk
&& x->mw.y<0 && rest(x->btimer,LV5_kirai[LV5])==0){
se_set(SE02_T_SHOT2_1,x->mw.x);
dw.x = x->rain_pos[X];
dw.y = x->rain_pos[Y];
dw.z = 0;
dw.Ds16w0 = 0x8000+get_rand(0x0800);
dw.Ds32w1 = 0x10000; /* Main MAX SPEED */
dw.Ds16w1 = dw.Ds16w0; /* First Seeta */
#if 0
dw.Ds16w6 = 3; /* Attack Type */
#endif
dw.Ds16w6 = 0; /* Attack Type */
dw.Ds32w2 = 0x20000; /* First SPEED */
eshot06_set_cstm(&dw);
}
}
}else{
if(x->IDEON_X_fg){
x->IDEON_X_fg--;
}else{
x->IDEON_X = comps32(x->IDEON_X,0,2);
if(x->IDEON_X == 2){
se_set(SE02_METAL2_2,x->mw.x);
}
}
#if 0
/*------------*/
/* Back Laser */
/*------------*/
if(x->runYpos>0 && (gtimer&0xf)==0){
se_set(SE_E_SHOT1,x->mw.x);
dw.x = x->rain_pos[X];
dw.y = x->rain_pos[Y];
dw.z = 0;
dw.Ds16w0 = x->mw.angz;
dw.Ds16w1 = 0x10; /* Speed Up Flame */
dw.Ds16w2 = 0x01; /* Color Type */
eshot08_set_cstm(&dw);
}
#endif
}
RUN_rot(x);
RUN_sub(x);
}
/*=================================================================*/
static void BACK_TURN(BOS12_WK *x){
/*=================================================================*/
SCROLL(x);
RUN_rot(x);
x->s32w1 = comps32(x->s32w1,0x300,0x08);
x->mw.angx += x->s32w1;
#if 0
if(x->mw.x<0){
x->mw.angy -= x->s32w1/2;
}else{
x->mw.angy += x->s32w1/2;
}
#endif
x->s32w0 += x->s32w1;
x->mw.z =(cos32(x->mw.angx)*+0x40)-0x40*DEC+0x10*DEC;
if(x->s32w0>DEC){
x->mw.z = +0x10*DEC;
x->mw.angx = 0;
x->angXspd = 0;
IDEON_SWORD_init(x);
}
x->runspd = comps32(x->runspd,-SC_DY-(0x30000),0x0900);
x->dy = -fixmuls(cos32(x->mw.angz),x->runspd);
}
/*=================================================================*/
static void IDEON_SWORD(BOS12_WK *x){
/*=================================================================*/
PLAY_OBJ *p;
DELIVERY_WK dw;
SCROLL(x);
RUN_rot(x);
RUN_sub(x);
x->s16w0++;
if(x->s16w0>(80*10)){
x->sp = s_WAIT;
}
x->IDEON_X = comps32(x->IDEON_X,0xb,1);
if(x->IDEON_X == 0xa){
se_set(SE02_METAL2_2,x->mw.x);
M_hit_on(x);
}
p = get_play0(&x->mw);
if(p->mw.y>0){
x->runYpos = comps32(x->runYpos,(+0x40+0x20)*DEC+p->mw.y/4,0x8000);
}else{
x->runYpos = comps32(x->runYpos,(+0x40+0x20)*DEC, 0x8000);
}
/*---------------*/
/* Rain Beam Set */
/*---------------*/
if(x->s16w0>80*2
&& x->s16w0<80*(10-1) && rest(x->s16w0,IDEON_SWORD_rain_tym[LV5])==0){
dw.par = 0x0000; /* Type */
dw.Ds16w2 = 0x0007; /* 1st Speed */
if(rest(x->s16w0,IDEON_SWORD_rain_tym[LV5]*2)==0){
dw.Ds16w0 = 0xd000; /* 1st angZ */
}else{
dw.Ds16w0 = 0x3000; /* 1st angZ */
}
rain_beam_set(&dw,x);
se_set(SE_T_SHOT1,x->mw.x);
}
/*-------------*/
/* IDEON Sword */
/*-------------*/
if(x->s16w0<80*(10-1) && rest(x->s16w0,80)==0){
if(rest(x->s16w0, 80*2)==0){
if((x->p1_fg & fg_brk)==0){
x->IDEON_L_sp = 1;
x->s32w0 = 0;
x->s32w2 = 0x8000;
x->s16w2 = +0xc00; /* zoomx 1st spd */
x->s16w4 = +0xc00; /* zoomy 1st spd */
tame_set(&x->p1_fg, fg_brk, &x->IDEON_L_pos[X], &x->mw.angz,
COL_RRED);
}
}else{
if((x->p2_fg & fg_brk)==0){
x->IDEON_R_sp = 1;
x->s32w1 = 0;
x->s32w3 = 0x8000;
x->s16w3 = +0xc00; /* zoomx 1st spd */
x->s16w5 = +0xc00; /* zoomy 1st spd */
tame_set(&x->p2_fg, fg_brk, &x->IDEON_R_pos[X], &x->mw.angz,
COL_RRED);
}
}
}
if(x->IDEON_L_sp){
if(x->p1_fg & fg_brk || x->s32w0<0){
x->IDEON_L_sp=0;
}else{
x->IDEON_L_sp++;
if(x->IDEON_L_sp==40){
se_set(SE02_SHOTL2_2,x->IDEON_L_pos[X]);
IDEON_S_set(&x->IDEON_L_sp, &x->IDEON_L_pos[X], &x->s32w0);
IDEON_S_eft_set(&x->IDEON_L_pos[X], COL_RRED, x->mw.angz);
x->s32w2 = 0x0000;
}
if(x->IDEON_L_sp>=40){
x->s32w0 += x->s16w2;
x->s16w2 -= IDEON_SWORD_zoomx[LV5];
x->s32w2 += x->s16w4;
if(x->s16w4>0){
x->s16w4 -= 0x48; /* Zoomy Speed */
}
}
}
}
if(x->IDEON_R_sp){
if(x->p2_fg & fg_brk || x->s32w1<0){
x->IDEON_R_sp=0;
}else{
x->IDEON_R_sp++;
if(x->IDEON_R_sp==40){
se_set(SE02_SHOTL2_2,x->IDEON_R_pos[X]);
IDEON_S_set(&x->IDEON_R_sp, &x->IDEON_R_pos[X], &x->s32w1);
IDEON_S_eft_set(&x->IDEON_R_pos[X], COL_RRED, x->mw.angz);
x->s32w3 = 0x0000;
}
if(x->IDEON_R_sp>=40){
x->s32w1 += x->s16w3;
x->s16w3 -= IDEON_SWORD_zoomx[LV5];
x->s32w3 += x->s16w5;
if(x->s16w5>0){
x->s16w5 -= 0x48; /* Zoomy Speed */
}
}
}
}
}
/*=================================================================*/
static void DEAD(BOS12_WK *x){
/*=================================================================*/
if(x->btimer > 120){
x->sp = s_DEAD_WAIT;
x->rep = report_set(100);
#if DBG_FG
x->STG_SCORE0 = play_data[0].befor_stg_score;
x->STG_SCORE1 = play_data[1].befor_stg_score;
#endif
SCR_NextSection();
}
}
/*=================================================================*/
static void DEAD_WAIT(BOS12_WK *x){
/*=================================================================*/
BOS12_WK *ms;
EFT_OBJ *rep;
rep = x->rep;
if(rep->mode >= OBJ_M_KIE){
x->mode = OBJ_M_KIE;
area_no--;
#if DBG_FG
play_data[0].befor_stg_score = x->STG_SCORE0;
play_data[1].befor_stg_score = x->STG_SCORE1;
#endif
ms = get_letsGO(x);
ms->fg |= 2;
}
}
/*============================================================================*/
/* ------------------------------------------ */
/* Steps Main (MUGNUM) */
/* ------------------------------------------ */
/*============================================================================*/
/*=================================================================*/
static void M_hit_on(BOS12_WK *x){
/*=================================================================*/
x->p0_fg &= -fg_hit-1;
x->p1_fg &= -fg_hit-1;
x->p2_fg &= -fg_hit-1;
x->p3_fg &= -fg_hit-1;
x->p4_fg &= -fg_hit-1;
x->p5_fg &= -fg_hit-1;
x->p6_fg &= -fg_hit-1;
}
/*=================================================================*/
static void M_hit_off(BOS12_WK *x){
/*=================================================================*/
x->p0_fg |= fg_hit;
x->p1_fg |= fg_hit;
x->p2_fg |= fg_hit;
x->p3_fg |= fg_hit;
x->p4_fg |= fg_hit;
x->p5_fg |= fg_hit;
x->p6_fg |= fg_hit;
}
/*=================================================================*/
static void Wait(BOS12_WK *x){
/*=================================================================*/
BOS12_WK *ms;
ms = get_letsGO(x);
if(x->fg&2){
x->sp = m_Figt_Wait;
x->s32w0 = 0;
return;
}
if(ms->fg & 1){
x->sp = m_Dual;
x->mw.x = -ms->mw.x;
x->mw.y = -0xe0*DEC;
x->mw.z = -0x30*DEC;
x->dx = -ms->dx;
x->dy = ms->dy;
x->dz = 0;
x->angYspd = 0;
x->mw.sys_fg = (MODEL_DISP_FG|MODEL_FUNC_CALL_FG|ATARI_OFF_FG);
}
}
/*=================================================================*/
static void Dual(BOS12_WK *x){
/*=================================================================*/
BOS12_WK *ms;
DELIVERY_WK dw;
ms = get_letsGO(x);
x->dx = -ms->dx;
x->dy = ms->dy;
if((ms->fg&1)==0||x->fg&1){
x->sp = m_Rtrn;
x->dy = -0x0e000;
}
x->mw.y = comps32(x->mw.y,-0x50*DEC,DEC);
x->mw.angz = -ms->mw.angz/4;
x->mw.angy = -ms->mw.angy;
x->mw.y -= SC_DY;
if(x->mw.y > -0x60*DEC && abs(x->mw.x) > 0x30*DEC
&& rest(x->btimer,14)==0){
dw.Dobj_no = x->mw.obj_no;
dw.x = x->mw.x+get_rand(0x10*DEC);
dw.y = x->mw.y+0x10*DEC;
dw.z = x->mw.z;
baku_set(&dw);
}
}
/*=================================================================*/
static void Rtrn(BOS12_WK *x){
/*=================================================================*/
x->runZ = 0;
rot_sub(&x->angZspd,&x->angZssp,x->mw.angz,0,
0x2000,8,0x10);
if(x->mw.x>0){
x->dx += 0x0400;
x->angYspd -= 0x030;
}else{
x->dx -= 0x0400;
x->angYspd += 0x030;
}
x->dy -= 0x1c00;
if(x->mw.y<-0x0f0*DEC){
x->sp = m_Wait;
x->dx = 0;
x->dy = 0;
x->mw.sys_fg = (SPR_DISP_CUT|ATARI_OFF_FG);
}
x->mw.y -= SC_DY;
}
/*=================================================================*/
static void Figt_Wait(BOS12_WK *x){
/*=================================================================*/
x->s32w0--;
if(x->s32w0<0){
se_set(SE02_APPEAR2_2_2,x->mw.x);
x->sp = m_Demo;
x->mw.sys_fg = (MODEL_DISP_FG|MODEL_FUNC_CALL_FG|ATARI_OFF_FG);
x->mw.angz = 0;
x->mw.angy = 0;
x->mw.angx = 0;
x->angZspd = 0;
x->angZssp = 0;
x->angYspd = 0;
x->angYssp = 0;
x->mw.x = -0x50*DEC+(-0xfff71f10);
x->mw.y = -0xe0*DEC;
x->mw.z = -0x70*DEC;
x->dy = +0x50000;
x->dx = +0x10000;
x->fg |= 0x80;
bar_set(P0_LIFE);
}
}
/*=================================================================*/
static void Demo(BOS12_WK *x){
/*=================================================================*/
x->mw.angx = div(x->mw.z-0x20*DEC,+0x280);
x->mw.angy = -x->dx;
x->mw.angz = x->dx/2;
if(x->mw.z>=+0x20*DEC){
se_set(SE02_SET2_2_2,x->mw.x);
x->sp = m_Demo_Wait;
x->proc_wait = 120;
SSSS_Anime_Set(&x->sw, BOS12_TRNS1);
M_hit_on(x);
x->dx = 0;
x->dy = 0;
x->mw.z = +0x20*DEC;
x->mw.angz = 0;
x->mw.angy = 0;
x->mw.angx = 0;
}else{
x->dx = comps32(x->dx,0,0x01d0);
x->dy -= 0x0e00;
x->mw.z += 0x10000;
}
}
/*=================================================================*/
static void Demo_Wait(BOS12_WK *x){
/*=================================================================*/
x->mw.y -= 0x3000;
x->IDEON_X = comps32(x->IDEON_X,-3,1);
if(x->sw.S_fg & ssss_end){
x->sp = m_Figt;
}
}
/*============================================================================*/
/* ------------------------------------------ */
/* Main Proc */
/* ------------------------------------------ */
/*============================================================================*/
enum{
BS_RAIN,
BS_VULCAN,
BS_MSHOT,
BS_METEO,
LOOP,
BS_END
};
/*=================================================================*/
static u8 proc_data[]={
/*=================================================================*/
BS_RAIN,
BS_VULCAN,
BS_MSHOT,
BS_METEO,
/*-------------------*/
LOOP,
};
/*=================================================================*/
static void main_proc(BOS12_WK *x){
/*=================================================================*/
u8 dt0;
DELIVERY_WK dw;
if(x->proc_wait){
return;
}
dt0 = proc_data[x->proc_step];
if(LOOP == dt0){
x->proc_step = 0;
dt0 = proc_data[x->proc_step];
x->zibaku++;
}
x->proc_step++;
switch(dt0){
case BS_RAIN:
x->proc_wait = 120;
x->s16w0 = 0;
break;
case BS_VULCAN:
x->sp = m_Vulc_Wait;
x->proc_wait = 120;
x->s16w0 = 0;
x->s32w0 = 0;
SSSS_Anime_Set(&x->sw, BOS12_Vulc_Set);
break;
case BS_METEO:
x->sp = m_Meto;
x->proc_wait = 120;
x->s16w0 = 0;
SSSS_Anime_Set(&x->sw, BOS12_Meto_Set);
break;
case BS_MSHOT:
x->sp = m_Msht;
x->proc_wait = 120;
x->s16w0 = -4;
dw.ix = (void *)x;
if((x->p4_fg&fg_brk)==0 && (x->fg & 0x8000)==0){
dw.x = x->wng_R_pos[X];
dw.y = x->wng_R_pos[Y];
dw.Ds16w0 = -0x0001;
search_set(&dw);
}
if((x->p3_fg&fg_brk)==0 && (x->fg & 0x4000)==0){
dw.x = x->wng_L_pos[X];
dw.y = x->wng_L_pos[Y];
dw.Ds16w0 = +0x0001;
search_set(&dw);
}
break;
}
}
/*=================================================================*/
static void Move(BOS12_WK *x){
/*=================================================================*/
if(x->mw.y<-0x50*DEC){
x->dy = comps32(x->dy,+0x08000,0x4000);
}else{
x->dy = comps32(x->dy,-0x08000,0x6000);
}
if(x->sp==m_Msht&&
((x->IDEON_L_sp&&x->IDEON_L_sp<64)||(x->IDEON_R_sp&&x->IDEON_R_sp<64))){
rot_sub(&x->angZspd,&x->angZssp,x->mw.angz,
x->IDEON_X_sv,
0x0400,0x14,0x02);
}else{
rot_sub(&x->angZspd,&x->angZssp,x->mw.angz,
get_ang(x, get_play0(&x->mw))+0x8000,
0x0480,0x14,0x02);
}
x->mw.x = sin32(x->mw.angz+0x8000)*0x30;
}
/*=================================================================*/
static void Figt(BOS12_WK *x){
/*=================================================================*/
PLAY_OBJ *pw;
DELIVERY_WK dw;
x->mw.z = comps32(x->mw.z,+0x20*DEC, 0x4000);
Move(x);
x->proc_wait = comps32(x->proc_wait,0,1);
if(x->sw.S_fg & ssss_end){
SSSS_Anime_Set(&x->sw, BOS12_Wait);
}
main_proc(x);
if(x->sp == m_Figt){
x->s16w0++;
if(rest(x->s16w0,18)==0){
dw.par = 0x0001; /* Type Red */
pw = get_play0(&x->mw);
if(pw->mw.y<x->mw.y){
dw.Ds16w1 = x->mw.angz;
}else{
dw.Ds16w1 = 0x8000+x->mw.angz;
}
dw.Ds16w2 = 0x0006/*+rest(x->s16w0,18*8)/18*/; /* 1st Speed */
dw.Ds16w3 = (rest(x->s16w0,18*16)/18)*0x1000;
dw.Ds16w0 = -dw.Ds16w3+0x4000+0x8000+x->mw.angz; /* 1st angZ */
rain_beam_set(&dw,x);
dw.Ds16w0 = +dw.Ds16w3+0xc000+0x8000+x->mw.angz; /* 1st angZ */
rain_beam_set(&dw,x);
se_set(SE02_T_SHOT2_2F2,x->mw.x);
}
}
}
/*=================================================================*/
static void Vulc_Wait(BOS12_WK *x){
/*=================================================================*/
Move(x);
if(x->sw.S_fg & ssss_end){
x->sp = m_Vulc;
SSSS_Anime_Set(&x->sw, BOS12_Vulc);
}
}
/*=================================================================*/
static void Vulc(BOS12_WK *x){
/*=================================================================*/
DELIVERY_WK dw;
Move(x);
x->s16w0++;
if((x->p5_fg & fg_brk && x->p6_fg & fg_brk)
|| x->s16w0>80*(10)){
x->sp = m_Figt;
SSSS_Anime_Set(&x->sw, BOS12_Wait);
return;
}
/*---------------*/
/* Arms Vulcan */
/*---------------*/
if(rest(x->s16w0,vulc_tym[LV5])==0){
dw.Dobj_no = x->mw.obj_no;
if((x->p5_fg&fg_brk)==0){
dw.x = x->vul_L_pos[X];
dw.y = x->vul_L_pos[Y];
dw.Ds16w0 = 0x8000+x->mw.angz+(0xc000+LamANGZ);
se_set(SE02_T_SHOT2_2F1, dw.x);
if(rest(x->s16w0,vulc_tym[LV5]*2)==0){
dw.Ds16w0 += 0x700;
vul_set(&dw);
dw.Ds16w0 -= 0x700*2;
vul_set(&dw);
}else{
vul_set(&dw);
}
}
if((x->p6_fg&fg_brk)==0){
dw.x = x->vul_R_pos[X];
dw.y = x->vul_R_pos[Y];
dw.Ds16w0 = 0x8000+x->mw.angz-(0xc000+RamANGZ);
se_set(SE02_T_SHOT2_2F1, dw.x);
if(rest(x->s16w0,vulc_tym[LV5]*2)!=0){
dw.Ds16w0 += 0x700;
vul_set(&dw);
dw.Ds16w0 -= 0x700*2;
vul_set(&dw);
}else{
vul_set(&dw);
}
}
}
/*---------------*/
/* Rain Beam Set */
/*---------------*/
if(x->sw.S_fg & ssss_loop){
x->s32w0 = 0;
}
dw.par = 0x0000; /* Type */
if((x->s32w0 == 0
|| x->s32w0 == 15)
){
dw.Ds16w2 = 0x0006; /* 1st Speed */
dw.Ds16w0 = 0x3000+0x8000+x->mw.angz; /* 1st angZ */
rain_beam_set(&dw,x);
dw.Ds16w0 = 0xd000+0x8000+x->mw.angz; /* 1st angZ */
rain_beam_set(&dw,x);
se_set(SE_T_SHOT1,x->mw.x);
}
if((x->s32w0 == 5
|| x->s32w0 == 20)
&& LV5>1){
dw.Ds16w2 = 0x000a; /* 1st Speed */
dw.Ds16w0 = 0x4000+0x8000+x->mw.angz; /* 1st angZ */
rain_beam_set(&dw,x);
dw.Ds16w0 = 0xc000+0x8000+x->mw.angz; /* 1st angZ */
rain_beam_set(&dw,x);
se_set(SE_T_SHOT1,x->mw.x);
}
if((x->s32w0 == 10
|| x->s32w0 == 25)
&& LV5>0){
dw.Ds16w2 = 0x0006; /* 1st Speed */
dw.Ds16w0 = 0x5000+0x8000+x->mw.angz; /* 1st angZ */
rain_beam_set(&dw,x);
dw.Ds16w0 = 0xb000+0x8000+x->mw.angz; /* 1st angZ */
rain_beam_set(&dw,x);
se_set(SE_T_SHOT1,x->mw.x);
}
x->s32w0++;
}
/*=================================================================*/
static void Meto(BOS12_WK *x){
/*=================================================================*/
DELIVERY_WK dw;
x->mw.z = comps32(x->mw.z, 0x0c*DEC, 0x4000);
if(x->sw.S_fg & ssss_end){
SSSS_Anime_Set(&x->sw, BOS12_Meto);
}
Move(x);
x->s16w0++;
if(x->s16w0>80*(10)){
x->sp = m_Figt;
SSSS_Anime_Set(&x->sw, BOS12_Wait);
return;
}
if(x->p1_fg&fg_brk
&& x->p2_fg&fg_brk
&& x->p5_fg&fg_brk
&& x->p6_fg&fg_brk){
dw.Ds16w0 = 1;
}else{
dw.Ds16w0 = 0;
}
if(x->mw.z==0xc*DEC && rest(x->s16w0,meteo_tym[LV5]+dw.Ds16w0)==0){
dw.Dobj_no = x->mw.obj_no;
dw.x = x->rain_pos[X];
dw.y = x->rain_pos[Y];
dw.ang = x->mw.angz;
dw.Ds16w0 = (gtimer&8)/8;
meteo_set(&dw);
}
}
/*=================================================================*/
static void Msht(BOS12_WK *x){
/*=================================================================*/
PLAY_OBJ *pw;
Move(x);
pw = get_play0(&x->mw);
if((abs(tang_dist_get(x->mw.angz+0x8000
,get_ang(x,pw)))<0x1c00)
||(x->IDEON_L_sp&&x->IDEON_L_sp<40)||(x->IDEON_R_sp&&x->IDEON_R_sp<40)
||x->s16w0>=80*4){
x->s16w0++;
}
if(((x->p1_fg & fg_brk && x->p2_fg & fg_brk)
|| x->s16w0>80*(6) || pw->mw.y<x->mw.y)
&& x->IDEON_L_sp==0&&x->IDEON_R_sp==0){
x->sp = m_Figt;
return;
}
if(x->s16w0<80*(6-1) && rest(x->s16w0,80)==0){
if(rest(x->s16w0, 80*2)==0){
if((x->p1_fg & fg_brk)==0){
x->IDEON_L_sp = 1;
x->IDEON_X_sv = x->mw.angz;
x->s32w0 = 0;
x->s32w2 = 0x8000;
x->s16w2 = +0xc00; /* zoomx 1st spd */
x->s16w4 = +0xc00; /* zoomy 1st spd */
tame_set(&x->p1_fg, fg_brk, &x->IDEON_L_pos[X], &x->mw.angz,
COL_RBLUE);
SSSS_Anime_Set(&x->sw, BOS12_MshtL);
}
}else{
if((x->p2_fg & fg_brk)==0){
x->IDEON_R_sp = 1;
x->IDEON_X_sv = x->mw.angz;
x->s32w1 = 0;
x->s32w3 = 0x8000;
x->s16w3 = +0xc00; /* zoomx 1st spd */
x->s16w5 = +0xc00; /* zoomy 1st spd */
tame_set(&x->p2_fg, fg_brk, &x->IDEON_R_pos[X], &x->mw.angz,
COL_RBLUE);
SSSS_Anime_Set(&x->sw, BOS12_MshtR);
}
}
}
if(x->IDEON_L_sp){
if(x->p1_fg & fg_brk || x->s32w0<0){
x->IDEON_L_sp=0;
}else{
x->IDEON_L_sp++;
if(x->IDEON_L_sp==40){
se_set(SE02_SHOTL2_2,x->IDEON_L_pos[X]);
IDEON_S_set(&x->IDEON_L_sp, &x->IDEON_L_pos[X], &x->s32w0);
IDEON_S_eft_set(&x->IDEON_L_pos[X], COL_RBLUE, x->mw.angz);
x->s32w2 = 0x0000;
x->angZspd = -0x180;
x->angZssp = -0x040;
}
if(x->IDEON_L_sp>=40){
x->s32w0 += x->s16w2;
x->s16w2 -= IDEON_SWORD_zoomx[LV5];
x->s32w2 += x->s16w4;
if(x->s16w4>0){
x->s16w4 -= 0x48; /* Zoomy Speed */
}
}
}
}
if(x->IDEON_R_sp){
if(x->p2_fg & fg_brk || x->s32w1<0){
x->IDEON_R_sp=0;
}else{
x->IDEON_R_sp++;
if(x->IDEON_R_sp==40){
se_set(SE02_SHOTL2_2,x->IDEON_R_pos[X]);
IDEON_S_set(&x->IDEON_R_sp, &x->IDEON_R_pos[X], &x->s32w1);
IDEON_S_eft_set(&x->IDEON_R_pos[X], COL_RBLUE, x->mw.angz);
x->s32w3 = 0x0000;
x->angZspd = +0x180;
x->angZssp = +0x040;
}
if(x->IDEON_R_sp>=40){
x->s32w1 += x->s16w3;
x->s16w3 -= IDEON_SWORD_zoomx[LV5];
x->s32w3 += x->s16w5;
if(x->s16w5>0){
x->s16w5 -= 0x48; /* Zoomy Speed */
}
}
}
}
}
/*=================================================================*/
static void Dead(BOS12_WK *x){
/*=================================================================*/
DELIVERY_WK dw;
x->angXspd = comps32(x->angXspd, -0x0c00, 0x08);
x->angZspd = comps32(x->angZspd, +0x0200, 0x01);
x->dx = comps32(x->dx, 0, 0x1000);
x->dy = comps32(x->dy, 0, 0x1000);
if(x->btimer==60){
dw.x = x->mw.x;
dw.y = x->mw.y;
dw.z = x->mw.z;
dw.ix= x;
bbom_set(&dw);
}
x->mw.z += x->dz;
x->dz = comps32(x->dz, +0x30000, 0x80);
if(x->btimer > 60+150){
x->mode = OBJ_M_KIE;
}
}
/*============================================================================*/
/* ------------------------------------------ */
/* Main Proc */
/* ------------------------------------------ */
/*============================================================================*/
/*=================================================================*/
static void (*step_tbl[])(BOS12_WK *x)={
/*=================================================================*/
#if EDIT
TEST,
#endif
/*- SONIC ----------------------------*/
DEMO,
DEMO_1,
DEMO_2,
WAIT,
BACK_TURN,
IDEON_SWORD,
DEAD,
DEAD_WAIT,
/*- MUGNUM ----------------------------*/
DEMO,
DEMO_1,
Wait,
Dual,
Rtrn,
Figt_Wait,
Demo,
Demo_Wait,
Figt,
Vulc_Wait,
Vulc,
Meto,
Msht,
Dead,
};
/*=================================================================*/
void bos12(BOS12_WK *x){
/*=================================================================*/
u16 sp;
s8 ZIBAKU_SUU;
BOS12_WK *ms;
DELIVERY_WK dw;
#if MUTEKI_FG
x->p0_life = P0_LIFE;
#endif
/*-----------------------------------------*/
ms = get_letsGO(x);
if(x->LG_fg==0){
sp = s_DEAD;
ZIBAKU_SUU = RT_zibaku_suu;
#if GO_START
x->zibaku = 100;
#endif
}else{
sp = m_Dead;
ZIBAKU_SUU = GO_zibaku_suu;
}
if(x->fg&0x80){
bar_life(x->p0_life);
}
if(x->sp<sp && (x->p0_life <= 0 || x->zibaku>ZIBAKU_SUU)){
/*---------------------------------*/
x->mw.sys_fg = (SPR_DISP_CUT|ATARI_OFF_FG);
if(x->LG_fg==0){
ms->fg = 1;
SCR_NextSection();
}
/*---------------------------------*/
dw.x = x->mw.x;
dw.y = x->mw.y;
dw.z = x->mw.z;
eft_boms_set(&dw);
/*---------------------------------*/
x->sp = sp;
boss_dead_sub();
x->p0_fg |= (fg_brk|fg_off);
x->btimer = 0;
/*---------------------------------*/
/* Rate Bonus Calc */
BOS_RATE = 0;
if(x->p0_life <= 0){
BOS_POINT = POINT;
BOS_RATE += P0_RATE;
}else{
BOS_POINT = 0;
}
if(x->p1_life <= 0){
BOS_RATE += P1_RATE;
}
if(x->p2_life <= 0){
BOS_RATE += P2_RATE;
}
if(x->p3_life <= 0){
BOS_RATE += P3_RATE;
}
if(x->p4_life <= 0){
BOS_RATE += P4_RATE;
}
if(x->p5_life <= 0){
BOS_RATE += P5_RATE;
}
if(x->p6_life <= 0){
BOS_RATE += P6_RATE;
}
/*---------------------------------*/
x->p0_life = 0;
x->p1_life = 0;
x->p2_life = 0;
x->p3_life = 0;
x->p4_life = 0;
x->p5_life = 0;
x->p6_life = 0;
}
/*-----------------------------------------*/
if(x->p1_brk_sp==0 && x->p1_life <= 0){
x->p1_brk_sp++;
x->p1_fg |= fg_brk;
}
if(x->p2_brk_sp==0 && x->p2_life <= 0){
x->p2_brk_sp++;
x->p2_fg |= fg_brk;
}
if(x->p3_brk_sp==0 && x->p3_life <= 0){
x->p3_brk_sp++;
x->p3_fg |= fg_brk;
}
if(x->p4_brk_sp==0 && x->p4_life <= 0){
x->p4_brk_sp++;
x->p4_fg |= fg_brk;
}
if(x->p5_brk_sp==0 && x->p5_life <= 0){
x->p5_brk_sp++;
x->p5_fg |= fg_brk;
}
if(x->p6_brk_sp==0 && x->p6_life <= 0){
x->p6_brk_sp++;
x->p6_fg |= fg_brk;
}
/*-----------------------------------------*/
/* Main Proc */
(*step_tbl[x->sp])(x);
SSSS_Anime(&x->sw);
x->mw.x += x->dx;
x->mw.y += x->dy;
x->mw.z += x->dz;
x->mw.angx += x->angXspd;
x->mw.angy += x->angYspd;
x->mw.angz += x->angZspd;
/*-----------------------------------------*/
/* Parts Break Proc */
if(x->p1_brk_sp && (x->p1_brk_sp-1 < p1_suu)){
if(boss_brk_sub(&x->p1_posi[(x->p1_brk_sp-1)*XYZ], 8, 4)){
x->p1_brk_sp++;
}
}
if(x->p2_brk_sp && (x->p2_brk_sp-1 < p2_suu)){
if(boss_brk_sub(&x->p2_posi[(x->p2_brk_sp-1)*XYZ], 8, 4)){
x->p2_brk_sp++;
}
}
if(x->p3_brk_sp && (x->p3_brk_sp-1 < p3_suu)){
if(boss_brk_sub(&x->p3_posi[(x->p3_brk_sp-1)*XYZ], 8, 4)){
x->p3_brk_sp++;
}
}
if(x->p4_brk_sp && (x->p4_brk_sp-1 < p4_suu)){
if(boss_brk_sub(&x->p4_posi[(x->p4_brk_sp-1)*XYZ], 8, 4)){
x->p4_brk_sp++;
}
}
if(x->p5_brk_sp && (x->p5_brk_sp-1 < p5_suu)){
if(boss_brk_sub(&x->p5_posi[(x->p5_brk_sp-1)*XYZ], 8, 4)){
x->p5_brk_sp++;
}
}
if(x->p6_brk_sp && (x->p6_brk_sp-1 < p6_suu)){
if(boss_brk_sub(&x->p6_posi[(x->p6_brk_sp-1)*XYZ], 8, 4)){
x->p6_brk_sp++;
}
}
x->btimer++;
x->fg &= -0xc000-1; /* For Side Bits Comunication */
}
/*============================================================================*/
/* ------------------------------------------ */
/* Polygon Disp */
/* ------------------------------------------ */
/*============================================================================*/
#if SCR_DBG
/*=================================================================*/
static void test_hit(ENM_WK *x){
/*=================================================================*/
x->mw.y -= SC_DY;
if(x->mw.y>(+0x80*DEC+(+0x80*DEC/2))){
x->mode = OBJ_M_KIE;
}
}
/*=================================================================*/
static void test_hit_disp(MAIN_WK *mw){
/*=================================================================*/
ENM_WK *x;
MAIN_WK m;
s16 pos[4][XY];
x = (ENM_WK *)((u32)mw-0x10);
mw_init(&m);
m.sys_fg = POLYGON_DISP_FG;
m.poly_adr = pos;
m.pri_ofs = PRI_ENM;
m.color_m = char_tbl[CHAR_EFT].color+COL_YRED+8;
m.x = x->mw.x;
m.y = x->mw.y;
m.z = 0;
pos[0][X] = -0x40;
pos[0][Y] = -0x40;
pos[1][X] = +0x40;
pos[1][Y] = -0x40;
pos[2][X] = +0x40;
pos[2][Y] = +0x40;
pos[3][X] = -0x40;
pos[3][Y] = +0x40;
spr_put(&m);
}
/*=================================================================*/
static ATARI_TBL at_test[]={
/*=================================================================*/
{(ATFG_ATTACK ), AT_BODY,+0x00,+0x00,0x40,0x40,},
{(ATFG_DAMAGE | ATFG_TBL_END), DM_NML, +0x00,+0x00,0x40,0x40,},
};
/*=================================================================*/
static void test_hit_set(s32 XP, s32 YP){
/*=================================================================*/
s8 i;
ENM_WK *p;
/*--------------------------------------------------------*/
i = ENM_OBJ_get();
if(i == DUMMY_OBJ) return;
p = obj_set(ENM_OBJ_AREA,obj_size(sizeof(ENM_WK)),enm);
if(p == NULL) return;
/*--------------------------------------------------------*/
mw_init(&p->mw);
aw_init(&p->aw);
ENM_WK_init(p);
p->mw.dousa_func = test_hit;
p->mw.sys_fg |= (MODEL_DISP_FG|MODEL_FUNC_CALL_FG);
p->mw.sys_fg |= (ATARI_MUTEKI_FG|ATARI_STEALTH_FG);
p->mw.poly_adr = test_hit_disp;
p->mw.obj_no = i;
obj_x[p->mw.obj_no] = p;
p->aw.atari_tbl_adr = at_test;
p->aw.life = 10;
p->aw.nakama = NAKAMA_KABE;
p->aw.zoku = ZOKU_NORMAL;
p->mw.x = XP;
p->mw.y = YP;
}
#endif
/*=================================================================*/
static void bos12_disp(MAIN_WK *mw){
/*=================================================================*/
BOS12_WK *x;
u16 i,*fg,LG;
s16 *p;
s32 s32w0,ofsX;
MAIN_WK b;
FIXED IDE_L_pos[XYZ*4];
FIXED IDE_R_pos[XYZ*4];
#if SCR_DBG
MAIN_WK m;
s16 pos[4][XY];
#endif
/*----------------------------------------------------------------------------*/
x = (BOS12_WK *)((u32)mw-0x10);
/*----------------------------------------------------------------------------*/
if(x->LG_fg){
LG = 0;
ofsX = 0;
}else{
LG = M_MAGNUM_BREST_R;
ofsX = x->IDEON_X*DEC;
}
/*----------------------------------------------------------------------------*/
/* Scroll Debug */
/*----------------------------------------------------------------------------*/
#if SCR_DBG
mw_init(&m);
m.sys_fg = POLYLINE_DISP_FG;
m.poly_adr = pos;
m.pri_ofs = PRI_SYS;
m.color_m = char_tbl[CHAR_EFT].color+COL_YRED;
m.x = 0;
m.z = 0;
pos[0][X] = -0x80;
pos[0][Y] = 0;
pos[1][X] = +0x80;
pos[1][Y] = 0;
pos[2][X] = +0x80;
pos[2][Y] = 0;
pos[3][X] = -0x80;
pos[3][Y] = 0;
m.y = -x->scr_y[0];
spr_put(&m);
m.y = -x->scr_y[1];
spr_put(&m);
#endif
/*----------------------------------------------------------------------------*/
/* Damage Flag Proc */
/*----------------------------------------------------------------------------*/
fg = &x->p0_fg;
for(i=0; i<((8-2)+1); i++,fg++){
if(*(fg) & fg_dmg_on)
*(fg) &= -(fg_dmg_on + fg_dmg)-1;
if(*(fg) & fg_dmg)
*(fg) |= fg_dmg_on;
}
/*----------------------------------------------------------------------------*/
/* Ideon Sword */
/*----------------------------------------------------------------------------*/
if(x->IDEON_L_sp || x->IDEON_R_sp){
if(v_timer&7){
if(x->LG_fg){
i = COL_RBLUE;
}else{
i = COL_RRED;
}
}else{
if(x->LG_fg){
i = COL_BLUE2;
}else{
i = COL_YRED;
}
}
model_col_set(CHAR_MEFT,M_EFFECT_HADOUHOU,
char_tbl[CHAR_EFT].color + i);
}
/*----------------------------------------------------------------------------*/
/* Master Body */
/*----------------------------------------------------------------------------*/
slPushMatrix(); /* PUSH 0 */
slTranslate(x->mw.x,x->mw.y,x->mw.z);
slPushMatrix(); /* PUSH */
slRotZ(x->mw.angz);
slRotX(x->mw.angx+MasANGZ);
slRotY(x->mw.angy+MasANGY);
slTranslate(0,-0x20*DEC,-0x10*DEC);
p = &p0_posi_data[0]; /* Basic XYZ Data */
for(i=0; i<p0_suu*3; p+=4,i+=3){
slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
&x->p0_posi[i]); /* Trans XYZ Data */
}
if((x->p0_fg & fg_off)==0){
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_BODY+LG][x->p0_fg&fg_dmg]);
slCalcPoint(0,0,0,&x->rain_pos[X]);
}
/*----------------------------------------------------------------------------*/
/* Breat Parts L */
/*----------------------------------------------------------------------------*/
slPushMatrix(); /* PUSH 1 */
slTranslate(+0x010*DEC+x->IDEON_X*DEC,+0x000*DEC+(LwgPOSX*0x020),
+0x000*DEC+(LwgPOSX*0x040));
slPushMatrix(); /* PUSH 2 */
slRotX(BstANGX);
slRotY(BstANGY);
slTranslate(+0x000*DEC,-0x010*DEC,+0x000*DEC);
p = &p1_posi_data[0];
for(i=0; i<p1_suu*3; p+=4,i+=3){
slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
&x->p1_posi[i]);
}
if((x->p1_fg & fg_off)==0){
if((x->p1_fg & fg_brk)==0){
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_BREST_L+LG][x->p1_fg&fg_dmg]);
}else{
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_BREST_L_DMG+LG][0]);
}
/*-------------*/
/* Ideon Sword */
/*-------------*/
if(x->IDEON_L_sp){
slPushMatrix(); /* PUSH */
slRotY(v_timer*-0x0830);
slScale(x->s32w0,x->s32w2,x->s32w0);
slTranslate(+0x000*DEC,-0x00c*DEC,+0x000*DEC);
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_MEFT].header_adr)
->pdata_tbl[M_EFFECT_HADOUHOU][0]);
if(gtimer&1&&x->IDEON_L_sp>40){
s32w0 = -(0x14+0x1c)*DEC;
}else{
s32w0 = -0x14*DEC;
}
for(i=0; i<4; i++){
slCalcPoint(0,(i*-0x1c*2*DEC)+s32w0,0,&x->IDEON_L_pos[i*XYZ]);
}
for(i=0; i<4; i++){
slCalcPoint(0,-abs(get_rand(x->s32w2*0x160)),0,&IDE_L_pos[i*XYZ]);
}
slPopMatrix(); /* POP */
}
}
slPopMatrix(); /* PUSH 2 */
slPopMatrix(); /* PUSH 1 */
/*----------------------------------------------------------------------------*/
/* Breat Parts R */
/*----------------------------------------------------------------------------*/
slPushMatrix(); /* PUSH 3 */
slTranslate(-0x010*DEC-(x->IDEON_X*DEC),+0x000*DEC+(LwgPOSX*0x020),
+0x000*DEC+(LwgPOSX*0x040));
slPushMatrix(); /* PUSH 4 */
slRotX(BstANGX);
slRotY(-BstANGY);
slTranslate(+0x000*DEC,-0x010*DEC,+0x000*DEC);
p = &p2_posi_data[0];
for(i=0; i<p2_suu*3; p+=4,i+=3){
slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
&x->p2_posi[i]);
}
if((x->p2_fg & fg_off)==0){
if((x->p2_fg & fg_brk)==0){
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_BREST_R+LG][x->p2_fg&fg_dmg]);
}else{
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_BREST_R_DMG+LG][0]);
}
/*-------------*/
/* Ideon Sword */
/*-------------*/
if(x->IDEON_R_sp){
slPushMatrix(); /* PUSH */
slRotY(v_timer*+0x0830);
slScale(x->s32w1,x->s32w3,x->s32w1);
slTranslate(+0x000*DEC,-0x00c*DEC,+0x000*DEC);
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_MEFT].header_adr)
->pdata_tbl[M_EFFECT_HADOUHOU][0]);
if(gtimer&1&&x->IDEON_R_sp>40){
s32w0 = -(0x14+0x1c)*DEC;
}else{
s32w0 = -0x14*DEC;
}
for(i=0; i<4; i++){
slCalcPoint(0,(i*-0x1c*2*DEC)+s32w0,0,&x->IDEON_R_pos[i*XYZ]);
}
for(i=0; i<4; i++){
slCalcPoint(0,-abs(get_rand(x->s32w3*0x160)),0,&IDE_R_pos[i*XYZ]);
}
slPopMatrix(); /* POP */
}
}
slPopMatrix(); /* PUSH 4 */
slPopMatrix(); /* PUSH 3 */
/*----------------------------------------------------------------------------*/
/* Wings Parts L */
/*----------------------------------------------------------------------------*/
slPushMatrix(); /* PUSH 5 */
slTranslate(+0x010*DEC+(LwgPOSX*0x100)+ofsX,
+0x008*DEC-(LwgPOSX*0x060),+0x000*DEC);
slPushMatrix(); /* PUSH 6 */
slTranslate(+0x000*DEC,+0x000*DEC,+0x000*DEC);
slRotZ(LwgANGZ);
slRotY(LwgANGY);
p = &p3_posi_data[0];
for(i=0; i<p3_suu*3; p+=4,i+=3){
slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
&x->p3_posi[i]);
}
if((x->p3_fg & fg_off)==0){
if((x->p3_fg & fg_brk)==0){
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_KATA_L+LG][x->p3_fg&fg_dmg]);
slCalcPoint(+0x8*DEC,+0x40*DEC,0,&x->wng_L_pos[X]);
/*--------------------------------------------------------------*/
/* Omake Wing */
/*--------------------------------------------------------------*/
slPushMatrix();
slTranslate(+0x014*DEC,+0x030*DEC,+0x008*DEC);
if(x->mw.angy>0){
slRotY(x->mw.angy);
}
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_HANE_L+LG][x->p3_fg&fg_dmg]);
slPopMatrix();
}else{
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_KATA_L_DMG+LG][0]);
}
}
/*------------------------------------------------------------------------*/
/* Arm Parts L */
/*------------------------------------------------------------------------*/
slPushMatrix(); /* PUSH 7 */
slTranslate(-0x004*DEC+(LamPOSX*0x040)-ofsX,
+0x00e*DEC+(LamPOSX*0x100),+0x000*DEC);
slPushMatrix(); /* PUSH 8 */
slRotZ(LamANGZ);
slRotX(LamANGX);
slTranslate(-0x000*DEC,+0x00a*DEC,0x000*DEC);
p = &p5_posi_data[0];
for(i=0; i<p5_suu*3; p+=4,i+=3){
slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
&x->p5_posi[i]);
}
if((x->p5_fg & (fg_off|fg_brk))==0){
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_ARM_L+LG][x->p5_fg&fg_dmg]);
slCalcPoint(0,+0x8*DEC,0,&x->vul_L_pos[X]);
}
slPopMatrix(); /* PUSH 8 */
slPopMatrix(); /* PUSH 7 */
/*------------------------------------------------------------------------*/
slPopMatrix(); /* PUSH 6 */
slPopMatrix(); /* PUSH 5 */
/*----------------------------------------------------------------------------*/
/* Wings Parts R */
/*----------------------------------------------------------------------------*/
slPushMatrix(); /* PUSH 9 */
slTranslate(-0x010*DEC-(LwgPOSX*0x100)-ofsX,
+0x008*DEC-(LwgPOSX*0x060),+0x000*DEC);
slPushMatrix(); /* PUSH 10*/
slTranslate(-0x000*DEC,+0x000*DEC,+0x000*DEC);
slRotZ(-LwgANGZ);
slRotY(-LwgANGY);
p = &p4_posi_data[0];
for(i=0; i<p4_suu*3; p+=4,i+=3){
slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
&x->p4_posi[i]);
}
if((x->p4_fg & fg_off)==0){
if((x->p4_fg & fg_brk)==0){
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_KATA_R+LG][x->p4_fg&fg_dmg]);
slCalcPoint(-0x8*DEC,+0x40*DEC,0,&x->wng_R_pos[X]);
/*--------------------------------------------------------------*/
/* Omake Wing */
/*--------------------------------------------------------------*/
slPushMatrix();
slTranslate(-0x014*DEC,+0x030*DEC,+0x008*DEC);
if(x->mw.angy<0){
slRotY(x->mw.angy);
}
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_HANE_R+LG][x->p4_fg&fg_dmg]);
slPopMatrix();
}else{
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_KATA_R_DMG+LG][0]);
}
}
/*------------------------------------------------------------------------*/
/* Arm Parts R */
/*------------------------------------------------------------------------*/
slPushMatrix(); /* PUSH 11*/
slTranslate(+0x004*DEC-(LamPOSX*0x040)+ofsX,
+0x00e*DEC+(LamPOSX*0x100),+0x000*DEC);
slPushMatrix(); /* PUSH 12*/
slRotZ(-RamANGZ);
slRotX(+RamANGX);
slTranslate(-0x000*DEC,+0x00a*DEC,0x000*DEC);
p = &p6_posi_data[0];
for(i=0; i<p6_suu*3; p+=4,i+=3){
slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
&x->p6_posi[i]);
}
if((x->p6_fg & (fg_off|fg_brk))==0){
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_ARM_R+LG][x->p6_fg&fg_dmg]);
slCalcPoint(0,+0x8*DEC,0,&x->vul_R_pos[X]);
}
slPopMatrix(); /* PUSH 12*/
slPopMatrix(); /* PUSH 11*/
/*------------------------------------------------------------------------*/
slPopMatrix(); /* PUSH 10*/
slPopMatrix(); /* PUSH 9 */
/*----------------------------------------------------------------------------*/
/* Reg Parts L */
/*----------------------------------------------------------------------------*/
slPushMatrix();
slTranslate(+0x013*DEC+(LwgPOSX*0x020),
+0x020*DEC-(LwgPOSX*0x020),+0x015*DEC+(LrgPOSZ)*0x100);
slPushMatrix();
slRotX(LrgANGX);
slRotZ(LrgANGZ);
slRotY(LrgANGY);
slTranslate(+0x000*DEC,+0x000*DEC,+0x000*DEC);
p = &p7_posi_data[0];
for(i=0; i<p7_suu*3; p+=4,i+=3){
slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
&x->p7_posi[i]);
}
if((x->p0_fg & fg_off)==0){
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_LEG_L+LG][x->p0_fg&fg_dmg]);
/* Back Fire Point */
slCalcPoint( 0x0000*DEC,
(+0x0028+(RAND&3)+(rest(v_timer,3))*0x08)*DEC,
0x0008*DEC,
&x->p7_fire[0]); /* Trans XYZ Data */
}
slPopMatrix();
slPopMatrix();
/*----------------------------------------------------------------------------*/
/* Reg Parts R */
/*----------------------------------------------------------------------------*/
slPushMatrix();
slTranslate(-0x013*DEC-(LwgPOSX*0x020),
+0x020*DEC-(LwgPOSX*0x020),+0x015*DEC+(LrgPOSZ)*0x100);
slPushMatrix();
slRotX(RrgANGX);
slRotZ(-RrgANGZ);
slRotY(-RrgANGY);
slTranslate(-0x000*DEC,+0x000*DEC,+0x000*DEC);
p = &p8_posi_data[0];
for(i=0; i<p8_suu*3; p+=4,i+=3){
slCalcPoint(*(p+X)*DEC,*(p+Y)*DEC,*(p+Z)*DEC,
&x->p8_posi[i]);
}
if((x->p0_fg & fg_off)==0){
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_LEG_R+LG][x->p0_fg&fg_dmg]);
/* Back Fire Point */
slCalcPoint( 0x0000*DEC,
(+0x0028+(RAND&3)+(rest(v_timer,3))*0x08)*DEC,
0x0008*DEC,
&x->p8_fire[0]); /* Trans XYZ Data */
}
slPopMatrix();
slPopMatrix();
/*----------------------------------------------------------------------------*/
/* Tail Parts */
/*----------------------------------------------------------------------------*/
slPushMatrix();
slTranslate(+0x000*DEC,+0x01e*DEC,-0x00a*DEC);
slPushMatrix();
slRotX(TilANGX);
slTranslate(+0x000*DEC,+0x000*DEC,+0x000*DEC);
if((x->p0_fg & fg_off)==0){
slPutPolygonS((void *)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)
->pdata_tbl[M_SONIC_SHIPPO+LG][x->p0_fg&fg_dmg]);
}
slPopMatrix();
slPopMatrix();
/*----------------------------------------------------------------------------*/
slPopMatrix(); /* PUSH */
slPopMatrix(); /* PUSH 0 */
/*----------------------------------------------------------------------------*/
/* Ideon Elec */
/*----------------------------------------------------------------------------*/
if(x->IDEON_L_sp>40
|| x->IDEON_R_sp>40){
mw_init(&b);
b.sys_fg = RAND&MESH_ON;
b.angz = x->mw.angz;
b.char_no = CHAR_EFT;
b.pri_ofs = PRI_INU;
b.zoomy = 0xc000;
b.anm_no = A_DENKI0+(RAND&0xf);
if(x->LG_fg){
b.color_m = char_tbl[CHAR_EFT].color + COL_E_BLUE;
}else{
b.color_m = char_tbl[CHAR_EFT].color + COL_E_RED;
}
if(x->IDEON_L_sp>40){
b.zoomx = x->s32w0+0x6000;
for(i=0; i<4; i++){
b.x = IDE_L_pos[XYZ*i+X];
b.y = IDE_L_pos[XYZ*i+Y];
b.z = IDE_L_pos[XYZ*i+Z]-0xb0*DEC;
spr_put(&b);
}
}
if(x->IDEON_R_sp>40){
b.zoomx = x->s32w1+0x6000;
for(i=0; i<4; i++){
b.x = IDE_R_pos[XYZ*i+X];
b.y = IDE_R_pos[XYZ*i+Y];
b.z = IDE_R_pos[XYZ*i+Z]-0xb0*DEC;
spr_put(&b);
}
spr_put(&b);
}
}
/*----------------------------------------------------------------------------*/
/* Backed Fire */
/*----------------------------------------------------------------------------*/
if((x->p0_fg & fg_off)==0){
mw_init(&b);
b.zoomx = (rest(v_timer,3)*0x3000)+0x4000+((RAND&0xf)*0x300);
b.zoomy = fixmuls(b.zoomx,0x14000);
b.angz = x->mw.angz;
b.char_no = CHAR_EFT;
b.pri_ofs = 0;
switch(rest(v_timer,3)){
case 0:
if(LG){
b.color_m = char_tbl[CHAR_EFT].color + COL_YELLOW;
}else{
b.color_m = char_tbl[CHAR_EFT].color + COL_BLUE2;
}
b.anm_no = A_MARU0;
break;
case 1:
if(LG){
b.color_m = char_tbl[CHAR_EFT].color + COL_YRED;
}else{
b.color_m = char_tbl[CHAR_EFT].color + COL_BLUE;
}
b.anm_no = A_MARU1;
break;
case 2:
b.sys_fg |= MESH_ON;
if(LG){
b.color_m = char_tbl[CHAR_EFT].color + COL_E_RED;
}else{
b.color_m = char_tbl[CHAR_EFT].color + COL_E_BLUE;
}
b.anm_no = A_MARU1;
}
if(v_timer&1){
b.x = x->p8_fire[X];
b.y = x->p8_fire[Y];
b.z = x->p8_fire[Z]-0xb0*DEC;
spr_put(&b);
b.x = x->p7_fire[X];
b.y = x->p7_fire[Y];
b.z = x->p7_fire[Z]-0xb0*DEC;
spr_put(&b);
}else{
b.x = x->p7_fire[X];
b.y = x->p7_fire[Y];
b.z = x->p7_fire[Z]-0xb0*DEC;
spr_put(&b);
b.x = x->p8_fire[X];
b.y = x->p8_fire[Y];
b.z = x->p8_fire[Z]-0xb0*DEC;
spr_put(&b);
}
}
}
/*============================================================================*/
/* ------------------------------------------ */
/* Init Main */
/* ------------------------------------------ */
/*============================================================================*/
/*=================================================================*/
static void bos12_set_S(BOS12_WK *x){
/*=================================================================*/
x->sp = s_DEMO;
x->runHundle = 0x40;
x->runZ = 0;
x->runsgt = 0x20;
x->runspd = -SC_DY;
x->runXpos = 0;
x->runYpos = (-0x40+0x20)*DEC;
x->scr_command = SC_ZERO;
x->scr_step = 0;
x->scr_p[0] = SC_ZERO;
x->scr_p[1] = SC_ZERO;
x->scr_y[0] = +0x80*DEC;
x->scr_y[1] = +0x00*DEC;
x->scr_rand[0] = +1;
x->scr_rand[1] = +1;
x->scr_shut = 0;
x->fg = 0x80;
bar_set(P0_LIFE);
M_hit_off(x);
se_set(SE02_APPEAR2_2,0);
}
/*=================================================================*/
static void bos12_set_M(BOS12_WK *x){
/*=================================================================*/
x->sp = m_DEMO;
x->mw.angy = 0x8000;
#if SCR_DBG
x->scr_y[0] = +0x180*DEC;
x->scr_y[1] = +0x080*DEC;
#endif
M_hit_off(x);
}
/*=================================================================*/
static void bos12_hitset(BOS12_WK *x){
/*=================================================================*/
x->p0_fg = 0;
x->p0_brk_sp = 0;
x->p0_posi_num = 0; /* For EDIT */
x->p0_menu = 0; /* For EDIT */
x->p0_life = P0_LIFE;
HIT3D_SET( p0_suu,
&x->p0_posi[0],
&x->p0_fg,
&x->p0_life,
& p0_posi_data[0],
x->mw.obj_no);
/*-----------------------------------------------*/
x->p1_fg = 0;
x->p1_brk_sp = 0;
x->p1_life = P1_LIFE;
HIT3D_SET( p1_suu,
&x->p1_posi[0],
&x->p1_fg,
&x->p1_life,
& p1_posi_data[0],
x->mw.obj_no);
/*-----------------------------------------------*/
x->p2_fg = 0;
x->p2_brk_sp = 0;
x->p2_life = P2_LIFE;
HIT3D_SET( p2_suu,
&x->p2_posi[0],
&x->p2_fg,
&x->p2_life,
& p2_posi_data[0],
x->mw.obj_no);
/*-----------------------------------------------*/
x->p3_fg = 0;
x->p3_brk_sp = 0;
x->p3_life = P3_LIFE;
HIT3D_SET( p3_suu,
&x->p3_posi[0],
&x->p3_fg,
&x->p3_life,
& p3_posi_data[0],
x->mw.obj_no);
/*-----------------------------------------------*/
x->p4_fg = 0;
x->p4_brk_sp = 0;
x->p4_life = P4_LIFE;
HIT3D_SET( p4_suu,
&x->p4_posi[0],
&x->p4_fg,
&x->p4_life,
& p4_posi_data[0],
x->mw.obj_no);
/*-----------------------------------------------*/
x->p5_fg = 0;
x->p5_brk_sp = 0;
x->p5_life = P5_LIFE;
HIT3D_SET( p5_suu,
&x->p5_posi[0],
&x->p5_fg,
&x->p5_life,
& p5_posi_data[0],
x->mw.obj_no);
/*-----------------------------------------------*/
x->p6_fg = 0;
x->p6_brk_sp = 0;
x->p6_life = P6_LIFE;
HIT3D_SET( p6_suu,
&x->p6_posi[0],
&x->p6_fg,
&x->p6_life,
& p6_posi_data[0],
x->mw.obj_no);
/*-----------------------------------------------*/
HIT3D_SET( p7_suu,
&x->p7_posi[0],
&x->p0_fg,
&x->p0_life,
& p7_posi_data[0],
x->mw.obj_no);
/*-----------------------------------------------*/
HIT3D_SET( p8_suu,
&x->p8_posi[0],
&x->p0_fg,
&x->p0_life,
& p8_posi_data[0],
x->mw.obj_no);
}
/*=================================================================*/
static void bos12_set_sub(BOS12_WK *x, s8 nB, u8 LG){
/*=================================================================*/
/* Works Init */
mw_init(&x->mw);
aw_init(&x->aw);
/*-----------------------------------------------*/
x->mw.dousa_func = bos12;
x->mw.sys_fg |= (MODEL_DISP_FG|MODEL_FUNC_CALL_FG|ATARI_OFF_FG);
x->mw.poly_adr = bos12_disp;
x->LG_fg = LG;
x->LG_no = nB;
/*-----------------------------------------------*/
x->mw.x = +0x000*DEC;
x->mw.y = +0x120*DEC;
x->mw.z = -0x060*DEC;
x->dx = 0;
x->dy = 0;
x->dz = 0;
x->angXspd = 0;
x->angXssp = 0;
x->angYspd = 0;
x->angYssp = 0;
x->angZspd = 0;
x->angZssp = 0;
x->btimer = 0;
x->fg = 0;
x->proc_step = 0;
x->proc_wait = 0;
x->zibaku = 0;
/*-----------------------------------------------*/
if(LG==0){
bos12_hitset(x);
bos12_set_S(x);
}else{
bos12_hitset(x);
bos12_set_M(x);
}
x->IDEON_L_sp = 0;
x->IDEON_R_sp = 0;
x->IDEON_X = 0;
/*--------------------------------------*/
/* SSSS Init */
x->sw.S_Chain_suu = BOS12_Chain_suu;
x->sw.S_mot_buf = &x->mot_buf[0];
x->sw.S_spd_buf = &x->spd_buf[0];
x->sw.S_ent_adr = BOS12_mot_ent_tbl;
SSSS_Mot_Set(&x->sw, BOS12_Mot_0000);
SSSS_Anime_Set(&x->sw, BOS12_WAIT);
SSSS_Anime(&x->sw);
#if EDIT
x->sp = s_TEST;
x->ew.edit_anm_adr = &BOS12_TRNS[0];
x->ew.sp = 0;
x->ew.parts_num = 0;
x->mw.x = 0;
x->mw.y = 0;
x->mw.z = +0x10*DEC;
SSSS_Anime_Set(&x->sw, x->ew.edit_anm_adr);
#endif
}
/*=================================================================*/
s8 bos12_set(void){
/*=================================================================*/
BOS12_WK *xL,*xG;
s8 iL,iG;
u16 i;
iL = ENM_OBJ_get();
if(iL == DUMMY_OBJ) return 0;
xL = obj_set(ENM_OBJ_AREA,obj_size(sizeof(BOS12_WK)),enm);
if(xL == NULL) return 0;
xL->mw.obj_no = iL;
obj_x[xL->mw.obj_no]= xL;
#if !EDIT
iG = ENM_OBJ_get();
if(iG == DUMMY_OBJ) return 0;
xG = obj_set(ENM_OBJ_AREA,obj_size(sizeof(BOS12_WK)),enm);
if(xG == NULL) return 0;
xG->mw.obj_no = iG;
obj_x[xG->mw.obj_no]= xG;
#endif
/*-----------------------------------------------*/
/* Lets */
/*-----------------------------------------------*/
bos12_set_sub(xL,iG,0);
/*-----------------------------------------------*/
/* GO */
/*-----------------------------------------------*/
#if !EDIT
bos12_set_sub(xG,iL,1);
#endif
for(i=M_MAGNUM_BREST_R; i<M_SONIC_END; i++){
model_col_set(CHAR_SONIC,i,
get_look_colno(CHAR_SONIC) + COL_MAGNUM);
}
return iG;
}
0xDB400
This is part of an objdump listing.
etNbg0
00002ce8 .text 00002ce8 _SCR_2_1d_ctrl
00016be4 .control 06056be4 _hit3D
0002de70 .control 0606de70 _slSpecialCCalcModeNbg0
0002de78 .control 0606de78 _slSpecialCCalcModeNbg3
060fff60 *ABS* 060fff60 _DAR1
060ffdf8 *ABS* 060ffdf8 _rb_char_adr
0600406c *ABS* 0600406c _PCM_WkSize
00000040 COMMON 00000040 _tim0_pos
06008a58 *ABS* 06008a58 _f_title
060ffdc0 *ABS* 060ffdc0 _VDP2_CCRSA
060ffd92 *ABS* 060ffd92 _VDP2_WCTLB
00023618 .control 06063618 _set_laser_hit
06009434 *ABS* 06009434 _f_st24_tne
00021014 .control 06061014 _disp_string8
00014c18 .control 06054c18 _eshot04_set_cstm
060ffcd4 *ABS* 060ffcd4 _VDP2_CYCA1L
06008028 *ABS* 06008028 ___ashiftrt_r4_2
00000614 .data 00004534 _houmon1
0000662c .control 0604662c _bef_link_dmc
060ffcde *ABS* 060ffcde _VDP2_CYCB1U
060ffefc *ABS* 060ffefc _Window1_data
000269d0 .control 060669d0 ___gesf2
060ffca8 *ABS* 060ffca8 _DMASetFlag
060fff2c *ABS* 060fff2c _Center2_data
0001e178 .control 0605e178 _init_objscr
06009104 *ABS* 06009104 _f_ed_bg05
000066f8 .text 000066f8 _SCR_2_6c_ctrl
06008b6c *ABS* 06008b6c _f_demo43
060092bc *ABS* 060092bc _f_stg2_tne_m
00029714 .control 06069714 _slCos
060ffcd2 *ABS* 060ffcd2 _VDP2_CYCA0U
00021714 .control 06061714 _set_kaiwa_int_func
0000089c .text 0000089c _SONIC_set
00008418 .contbss 0607bd88 _weapon_level
0001e0e8 .control 0605e0e8 _scroll_system_stop
00003ee4 .text 00003ee4 _SCR_2_3_n0_sub
00019528 .control 06059528 _boss_brk_sub
0002d840 .control 0606d840 _slIncMatrixPtr
00018de0 .control 06058de0 _eft_moon_set
06008b24 *ABS* 06008b24 _f_demo31
00032dd8 .control 06072dd8 _anm_hibana02
000015e4 .data 00005504 _tail_anmpat
060ffd6c *ABS* 060ffd6c _VDP2_BKTA
000187a0 .control 060587a0 _bbom
00022f88 .control 06062f88 _model_gour_set
060ffc0c *ABS* 060ffc0c _EventCount
0001ecb8 .control 0605ecb8 _Map2VRAM
06008e00 *ABS* 06008e00 _f_nurse
00000000 SLPROG 00000000 _slZoomR
000080d4 .control 060480d4 _player_set
0600ed28 *ABS* 0600ed28 _v_timer
000023a0 .text 000023a0 _enm05_2
060fff16 *ABS* 060fff16 _Window2_Bottom
00002244 .text 00002244 _nise_set
06009394 *ABS* 06009394 _f_st10_tne
00016ff4 .control 06056ff4 _rot_sub
06007ff2 *ABS* 06007ff2 ___ashiftrt_r4_24
06035010 *ABS* 06035010 _set_imask
00008420 .contbss 0607bd90 _load_end_ram_adr
060ffc1c *ABS* 060ffc1c _mtptr
060ffcd6 *ABS* 060ffcd6 _VDP2_CYCA1U
000003d4 .text 000003d4 _padman_muku
0000170c .data 0000562c _middle_pos
06008b9c *ABS* 06008b9c _f_peft
060ffd64 *ABS* 060ffd64 _VDP2_LSTA1
06008c88 *ABS* 06008c88 _f_misako
060ffc1a *ABS* 060ffc1a _TransRequest
0000391c .text 0000391c _SCR_2_3b2_init
000041ec .text 000041ec _SCR_2_3d3_ctrl
00000f74 .control 06040f74 _credit_ct
06
0xDC000
This is part of the header file for the boss Golets.
/*------------------------------------------------------------------------*/
/* HIT3D */
/*------------------------------------------------------------------------*/
/*-------------------------------------------*/
//M_SONIC_BODY
static s16 p0_posi_data[]={
/* 0x00 */ 0x0000, 0x0000, 0xfffb, 0x0000,
/* 0x00 */ 0x0000, 0x0000, 0x0005, 0x0000,
/* 0x00 */ 0x0000, 0xfff4, 0x0000, 0x0003,
/* 0x00 */ 0x0000, 0x000b, 0x0002, 0x0000,
/* 0x00 */ 0x0000, 0xfff4, 0x0008, 0x0003,
/* 0x00 */ 0x0000, 0xfff4, 0xfff9, 0x0003,
/* 0x06 */ 0x0000, 0xffef, 0x0002, 0x0003,
};
#define p0_suu (6+1)
/*-------------------------------------------*/
//M_SONIC_BREST_L
//M_SONIC_BREST_R
static s16 p1_posi_data[]={
/* 0x00 */ 0x0000, 0xfff9, 0x0000, 0x0000,
/* 0x01 */ 0x0000, 0x0006, 0x0000, 0x0000,
};
#define p1_suu (1+1)
#define p2_suu (1+1)
#define p2_posi_data p1_posi_data
/*-------------------------------------------*/
//M_SONIC_KATA_L
static s16 p3_posi_data[]={
/* 0x00 */ 0x0000, 0xffff, 0x0000, 0x0000,
/* 0x00 */ 0xfffd, 0x0035, 0x0000, 0x0000,
/* 0x00 */ 0x0008, 0x000c, 0x0004, 0x0003,
/* 0x00 */ 0x0008, 0x000c, 0xfffc, 0x0003,
/* 0x00 */ 0x0008, 0x0014, 0x0004, 0x0003,
/* 0x00 */ 0x0008, 0x0014, 0xfffc, 0x0003,
/* 0x00 */ 0x0008, 0x001c, 0x0004, 0x0003,
/* 0x00 */ 0x0008, 0x001c, 0xfffc, 0x0003,
/* 0x00 */ 0x0008, 0x0024, 0x0004, 0x0003,
/* 0x00 */ 0x0008, 0x0024, 0xfffc, 0x0003,
/* 0x00 */ 0x000b, 0x002d, 0x0000, 0x0000,
/* 0x0b */ 0x000b, 0x0038, 0x0000, 0x0000,
};
#define p3_suu (11+1)
/*-------------------------------------------*/
//M_SONIC_KATA_R
static s16 p4_posi_data[]={
/* 0x00 */ 0x0000, 0xffff, 0x0000, 0x0000,
/* 0x00 */ 0x0003, 0x0035, 0x0000, 0x0000,
/* 0x00 */ 0xfff8, 0x000c, 0x0004, 0x0003,
/* 0x00 */ 0xfff8, 0x000c, 0xfffc, 0x0003,
/* 0x00 */ 0xfff8, 0x0014, 0x0004, 0x0003,
/* 0x00 */ 0xfff8, 0x0014, 0xfffc, 0x0003,
/* 0x00 */ 0xfff8, 0x001c, 0x0004, 0x0003,
/* 0x00 */ 0xfff8, 0x001c, 0xfffc, 0x0003,
/* 0x00 */ 0xfff8, 0x0024, 0x0004, 0x0003,
/* 0x00 */ 0xfff8, 0x0024, 0xfffc, 0x0003,
/* 0x00 */ 0xfff5, 0x002d, 0x0000, 0x0000,
/* 0x0b */ 0xfff5, 0x0038, 0x0000, 0x0000,
};
#define p4_suu (11+1)
/*-------------------------------------------*/
//M_SONIC_ARM_L
//M_SONIC_ARM_R
static s16 p5_posi_data[]={
/* 0x00 */ 0x0000, 0xfff9, 0x0000, 0x0000,
/* 0x01 */ 0x0000, 0x0005, 0x0000, 0x0000,
};
#define p5_suu (1+1)
#define p6_suu (1+1)
#define p6_posi_data p5_posi_data
/*-------------------------------------------*/
//M_SONIC_LEG_L
static s16 p7_posi_data[]={
/* 0x00 */ 0x0009, 0x0000, 0x0000, 0x0000,
/* 0x00 */ 0x0000, 0x000d, 0x0000, 0x0000,
/* 0x00 */ 0x0000, 0x0017, 0x0000, 0x0000,
/* 0x00 */ 0x0000, 0x0020, 0x0000, 0x0000,
/* 0x00 */ 0x0000, 0x001b, 0x000a, 0x0000,
/* 0x06 */ 0x0000, 0x0011, 0x0006, 0x0000,
};
#define p7_suu (6+1)
/*-------------------------------------------*/
//M_SONIC_LEG_R
static s16 p8_posi_data[]={
/* 0x00 */ 0xfff7, 0x0000, 0x0000, 0x0000,
/* 0x00 */ 0x0000, 0x000d, 0x0000, 0x0000,
/* 0x00 */ 0x0000, 0x0017, 0x0000, 0x0000,
/* 0x00 */ 0x0000, 0x0020, 0x0000, 0x0000,
/* 0x00 */ 0x0000, 0x001b, 0x000a, 0x0000,
/* 0x06 */ 0x0000, 0x0011, 0x0006, 0x0000,
};
#define p8_suu (6+1)
/*------------------------------------------------------------------------*/
/* SSSS Defines */
/*------------------------------------------------------------------------*/
#define BOS12_Chain_suu (19+1)
/*------------------------------------------------------------------------*/
/* Structs */
/*------------------------------------------------------------------------*/
obj_def(BOS12_WK,
MAIN_WK mw;
ATARI_WK aw;
/* For System */
u8 sp;
u16 fg; /* Control Master */
u16 btimer;
/* For GAME Proc */
u16 proc_step;
s16 proc_wait;
s16 zibaku;
/* For Moving */
s32 dx;
s32 dy;
s32 dz;
s16 angXspd;
s16 angXssp;
s16 angYspd;
s16 angYssp;
s16 angZspd;
s16 angZssp;
/* For Hit3D */
u16 p0_fg;
u16 p1_fg;
u16 p2_fg;
u16 p3_fg;
u16 p4_fg;
u16 p5_fg;
u16 p6_fg;
u8 p0_brk_sp;
u8 p1_brk_sp;
u8 p2_brk_sp;
u8 p3_brk_sp;
u8 p4_brk_sp;
u8 p5_brk_sp;
u8 p6_brk_sp;
s32 p0_life;
s32 p1_life;
s32 p2_life;
s32 p3_life;
s32 p4_life;
s32 p5_life;
s32 p6_life;
FIXED p0_posi[(XYZ)*p0_suu];
FIXED p1_posi[(XYZ)*p1_suu];
FIXED p2_posi[(XYZ)*p2_suu];
FIXED p3_posi[(XYZ)*p3_suu];
FIXED p4_posi[(XYZ)*p4_suu];
FIXED p5_posi[(XYZ)*p5_suu];
FIXED p6_posi[(XYZ)*p6_suu];
FIXED p7_posi[(XYZ)*p7_suu];
FIXED p8_posi[(XYZ)*p8_suu];
FIXED p7_fire[(XYZ)];
FIXED p8_fire[(XYZ)];
/* For Hit3D EDIT */
s16 p0_posi_num;
s16 p0_menu;
s16 p0_save;
/* For SSSS */
SSSS_WK sw;
s16 mot_buf[BOS12_Chain_suu];
s16 spd_buf[BOS12_Chain_suu];
SEDT_WK ew;
/* For Parts_Link TransForm */
s8 IDEON_X;
u8 IDEON_X_fg;
u16 IDEON_X_sv;
/* For Run-away */
u8 runHundle;
s16 runZ;
s16 runsgt;
s32 runspd;
s32 runXpos;
s32 runYpos;
u8 scr_command;
u8 scr_step;
s8 scr_rand[2];
u8 scr_p[2];
s32 scr_y[2];
s8 scr_shut;
/* For Lets&GO */
u8 LG_fg;
s8 LG_no;
/* For Ideon Sword */
u8 IDEON_L_sp;
u8 IDEON_R_sp;
FIXED IDEON_L_pos[XYZ*4];
FIXED IDEON_R_pos[XYZ*4];
/* For Shot Pos */
FIXED rain_pos[XYZ];
FIXED vul_L_pos[XYZ];
FIXED vul_R_pos[XYZ];
FIXED wng_L_pos[XYZ];
FIXED wng_R_pos[XYZ];
/* For Report Wait */
EFT_OBJ *rep;
s32 STG_SCORE0;
s32 STG_SCORE1;
/* For UserFree */
s16 s16w0;
s16 s16w1;
s16 s16w2;
s16 s16w3;
s16 s16w4;
s16 s16w5;
s32 s32w0;
s32 s32w1;
s32 s32w2;
s32 s32w3;
);
obj_def(IDEON_SWORD_WK,
MAIN_WK mw;
ATARI_WK aw;
u8 *IDEON_sp;
FIXED *pos;
s32 *zom;
);
obj_def(SEARCH_WK,
MAIN_WK mw;
ATARI_WK aw;
BOS12_WK *ms;
u16 fg;
s32 dx;
s32 dy;
s8 s8w1;
s8 s16we;
);
/*------------------------------------------------------------------------*/
/* SSSS Datas */
/*------------------------------------------------------------------------*/
#define DATA(Z) Z,
#define MasANGY *(x->sw.S_mot_buf+0x00)
#define MasANGZ *(x->sw.S_mot_buf+0x01)
#define BstANGY *(x->sw.S_mot_buf+0x02)
#define BstANGX *(x->sw.S_mot_buf+0x03)
#define LwgANGY *(x->sw.S_mot_buf+0x04)
#define LwgANGZ *(x->sw.S_mot_buf+0x05)
#define LwgPOSX *(x->sw.S_mot_buf+0x06)
#define LamPOSX *(x->sw.S_mot_buf+0x07)
#define LamANGZ *(x->sw.S_mot_buf+0x08)
#define LamANGX *(x->sw.S_mot_buf+0x09)
#define RamANGZ *(x->sw.S_mot_buf+0x0a)
#define RamANGX *(x->sw.S_mot_buf+0x0b)
#define LrgPOSZ *(x->sw.S_mot_buf+0x0c)
#define LrgANGZ *(x->sw.S_mot_buf+0x0d)
#define LrgANGY *(x->sw.S_mot_buf+0x0e)
#define LrgANGX *(x->sw.S_mot_buf+0x0f)
#define RrgANGZ *(x->sw.S_mot_buf+0x10)
#define RrgANGY *(x->sw.S_mot_buf+0x11)
#define RrgANGX *(x->sw.S_mot_buf+0x12)
#define TilANGX *(x->sw.S_mot_buf+0x13)
/*====================================== 31 Line ===================*/
static s16 BOS12_Mot_0000[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x0000) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0000) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0x0000) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
};
/*====================================== 31 Line ===================*/
static s16 BOS12_Mot_0001[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0xdc00) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0xe000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x1000) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0300) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0xf000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0xf000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xf600) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x3000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x3000) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x1000) /* Mas DATA */
};
/*====================================== 31 Line ===================*/
static s16 BOS12_Mot_0002[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x8000) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x2000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0xf000) /* Mas DATA */
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x1a00) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0800) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x3000) /* Mas DATA */
DATA ( 0xe000) /* Mas DATA */
DATA ( 0x3000) /* Mas DATA */
DATA ( 0xe000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xf000) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x1000) /* Mas DATA */
DATA ( 0x5800) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x1000) /* Mas DATA */
DATA ( 0x5800) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x2000) /* Mas DATA */
};
/*====================================== 31 Line ===================*/
static s16 BOS12_Mot_0003[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x4000) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0x0800) /* Mas DATA */
DATA ( 0xb800) /* Mas DATA */
DATA ( 0x1600) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0800) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x4000) /* Mas DATA */
DATA ( 0xe000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0xe000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xe800) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0xfc00) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0xfc00) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x4000) /* Mas DATA */
};
/*====================================== 31 Line ===================*/
static s16 BOS12_Mot_0004[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x3000) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x2000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0x2000) /* Mas DATA */
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x1a00) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0000) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xf800) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0xea00) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0xea00) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x5400) /* Mas DATA */
};
/*====================================== 31 Line ===================*/
static s16 BOS12_Mot_0005[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x1000) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0x3000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x1100) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0000) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xf600) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x2000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x2000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x3b00) /* Mas DATA */
};
/*====================================== 31 Line ===================*/
static s16 BOS12_Mot_0006[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x4000) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xb800) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0xc400) /* Mas DATA */
DATA ( 0x0e00) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0e00) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x6800) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x6800) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xec00) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0xfc00) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0x0300) /* Mas DATA */
DATA ( 0xfc00) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0x0300) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x4b00) /* Mas DATA */
};
/*====================================== 31 Line ===================*/
static s16 BOS12_Mot_0007[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x3800) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc500) /* Mas DATA */
DATA ( 0x5000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0xbb00) /* Mas DATA */
DATA ( 0x0c00) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0300) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x1000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x1000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xec00) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0xfa00) /* Mas DATA */
DATA ( 0x3500) /* Mas DATA */
DATA ( 0xfe00) /* Mas DATA */
DATA ( 0xfa00) /* Mas DATA */
DATA ( 0x3500) /* Mas DATA */
DATA ( 0xfe00) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x2800) /* Mas DATA */
};
/*====================================== 30 Line ===================*/
static s16 BOS12_Mot_0008[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x4400) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xcc00) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0xfc00) /* Mas DATA */
DATA ( 0xb800) /* Mas DATA */
DATA ( 0x1200) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0900) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x4000) /* Mas DATA */
DATA ( 0xd000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0xd000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xe500) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0xfa00) /* Mas DATA */
DATA ( 0x3500) /* Mas DATA */
DATA ( 0xf000) /* Mas DATA */
DATA ( 0xfa00) /* Mas DATA */
DATA ( 0x3500) /* Mas DATA */
DATA ( 0xf000) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x4b00) /* Mas DATA */
};
/*====================================== 30 Line ===================*/
static s16 BOS12_Mot_0009[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x4200) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x4600) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0x0400) /* Mas DATA */
DATA ( 0xc500) /* Mas DATA */
DATA ( 0x1000) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0800) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x3c00) /* Mas DATA */
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x3c00) /* Mas DATA */
DATA ( 0xc000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xe900) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0xf500) /* Mas DATA */
DATA ( 0x3500) /* Mas DATA */
DATA ( 0xf400) /* Mas DATA */
DATA ( 0xf500) /* Mas DATA */
DATA ( 0x3500) /* Mas DATA */
DATA ( 0xf400) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x4000) /* Mas DATA */
};
/*====================================== 30 Line ===================*/
static s16 BOS12_Mot_000a[]={
DATA ( 0xfc00) /* MasANG Y */
DATA ( 0x4000) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xa800) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0xe600) /* Mas DATA */
DATA ( 0xcc00) /* Mas DATA */
DATA ( 0x1300) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0500) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x7300) /* Mas DATA */
DATA ( 0xe900) /* Mas DATA */
DATA ( 0x1700) /* Mas DATA */
DATA ( 0x2000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xde00) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0xe900) /* Mas DATA */
DATA ( 0x1f00) /* Mas DATA */
DATA ( 0xe100) /* Mas DATA */
DATA ( 0x1100) /* Mas DATA */
DATA ( 0x5600) /* Mas DATA */
DATA ( 0xea00) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x6d00) /* Mas DATA */
};
/*====================================== 30 Line ===================*/
static s16 BOS12_Mot_000b[]={
DATA ( 0x0400) /* MasANG Y */
DATA ( 0x4000) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xa800) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0xe600) /* Mas DATA */
DATA ( 0xcc00) /* Mas DATA */
DATA ( 0x1300) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0500) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x1700) /* Mas DATA */
DATA ( 0x2000) /* Mas DATA */
DATA ( 0x7300) /* Mas DATA */
DATA ( 0xe900) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xde00) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0x1100) /* Mas DATA */
DATA ( 0x5600) /* Mas DATA */
DATA ( 0xea00) /* Mas DATA */
DATA ( 0xe900) /* Mas DATA */
DATA ( 0x1f00) /* Mas DATA */
DATA ( 0xe100) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x6d00) /* Mas DATA */
};
/*====================================== 30 Line ===================*/
static s16 BOS12_Mot_000c[]={
DATA ( 0xfc00) /* MasANG Y */
DATA ( 0x4000) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0xf200) /* Mas DATA */
DATA ( 0xb100) /* Mas DATA */
DATA ( 0x1300) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0a00) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x2000) /* Mas DATA */
DATA ( 0xcf00) /* Mas DATA */
DATA ( 0x2800) /* Mas DATA */
DATA ( 0xe000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xe300) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0x0300) /* Mas DATA */
DATA ( 0x4c00) /* Mas DATA */
DATA ( 0xde00) /* Mas DATA */
DATA ( 0xfd00) /* Mas DATA */
DATA ( 0x1c00) /* Mas DATA */
DATA ( 0xe700) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x6900) /* Mas DATA */
};
/*====================================== 30 Line ===================*/
static s16 BOS12_Mot_000d[]={
DATA ( 0x0400) /* MasANG Y */
DATA ( 0x4000) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0xf200) /* Mas DATA */
DATA ( 0xb100) /* Mas DATA */
DATA ( 0x1300) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0a00) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x2800) /* Mas DATA */
DATA ( 0xe000) /* Mas DATA */
DATA ( 0x2000) /* Mas DATA */
DATA ( 0xcf00) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xe300) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0xfd00) /* Mas DATA */
DATA ( 0x1c00) /* Mas DATA */
DATA ( 0xe700) /* Mas DATA */
DATA ( 0x0300) /* Mas DATA */
DATA ( 0x4c00) /* Mas DATA */
DATA ( 0xde00) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x6900) /* Mas DATA */
};
/*====================================== 30 Line ===================*/
static s16 BOS12_Mot_000e[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x4600) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x4600) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0x1800) /* Mas DATA */
DATA ( 0xa800) /* Mas DATA */
DATA ( 0x0c00) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0700) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x4000) /* Mas DATA */
DATA ( 0xaa00) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0xaa00) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xf300) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0x1000) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0x1000) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x1800) /* Mas DATA */
};
/*====================================== 30 Line ===================*/
static s16 BOS12_Mot_000f[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x5c00) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x2400) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0xd800) /* Mas DATA */
DATA ( 0x0e00) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0800) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x1b00) /* Mas DATA */
DATA ( 0x1000) /* Mas DATA */
DATA ( 0x1b00) /* Mas DATA */
DATA ( 0x1000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xed00) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0x0400) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0x0400) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x5800) /* Mas DATA */
};
/*====================================== 30 Line ===================*/
static s16 BOS12_Mot_0010[]={
DATA ( 0x0000) /* MasANG Y */
DATA ( 0x6800) /* MasANG Y */
/*- Brest --------------------------*/
DATA ( 0xc000) /* Mas DATA */
DATA ( 0x1c00) /* Mas DATA */
/*- Wing ---------------------------*/
DATA ( 0xf500) /* Mas DATA */
DATA ( 0xd200) /* Mas DATA */
DATA ( 0x1000) /* Mas DATA */
/*- Arm Pos ------------------------*/
DATA ( 0x0800) /* Mas DATA */
/*- Arm ----------------------------*/
DATA ( 0x2000) /* Mas DATA */
DATA ( 0xf000) /* Mas DATA */
DATA ( 0x2000) /* Mas DATA */
DATA ( 0xf000) /* Mas DATA */
/*- Reg ZP -------------------------*/
DATA ( 0xed00) /* Mas DATA */
/*- Reg ----------------------------*/
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0xed00) /* Mas DATA */
DATA ( 0x0000) /* Mas DATA */
DATA ( 0x4000) /* Mas DATA */
DATA ( 0xed00) /* Mas DATA */
/*- Til ----------------------------*/
DATA ( 0x4d00) /* Mas DATA */
};
/*=========================================================*/
static s16 *BOS12_mot_ent_tbl[]={
/*--- Trans Form ------------------------------------------*/
BOS12_Mot_0000,
BOS12_Mot_0001,
BOS12_Mot_0002,
BOS12_Mot_0003,
BOS12_Mot_0004,
BOS12_Mot_0005,
/*--- M Vulcan --------------------------------------------*/
BOS12_Mot_0006,
BOS12_Mot_0007,
/*--- M Wait --------------------------------------------*/
BOS12_Mot_0008,
BOS12_Mot_0009,
/*--- M Msht --------------------------------------------*/
BOS12_Mot_000a,
BOS12_Mot_000b,
BOS12_Mot_000c,
BOS12_Mot_000d,
BOS12_Mot_000e,
/*--- M Meto --------------------------------------------*/
BOS12_Mot_000f,
BOS12_Mot_0010,
};
/*=========================================================*/
static s16 BOS12_WAIT[]={
0x0000, 10, 0,
0x0000, 10, 0,
SSSS_LOOP,
};
static s16 BOS12_TRNS1[]={
SSSS_START,
0x0001, 10, 0,
0x0002, 10, 0,
0x0003, 10, 0,
0x0003, 10, 0,
0x0008, 30, 0,
SSSS_END,
};
#if 0
static s16 BOS12_TRNS2[]={
SSSS_START,
0x0004, 10, 0,
0x0005, 10, 0,
0x0000, 10, 0,
SSSS_END,
};
#endif
static s16 BOS12_Wait[]={
0x0009, 20, 0,
0x0008, 50, -45,
0x0008, 40, -5,
0x0008, 20, 0,
0x0009, 50, -45,
0x0009, 40, -5,
SSSS_LOOP,
};
static s16 BOS12_Vulc_Set[]={
SSSS_START,
0x0007, 30, -8,
0x0007, 20, +4,
SSSS_END,
};
static s16 BOS12_Vulc[]={
0x0007, 20, 0,
0x0006, 100,-90,
0x0006, 80, -10,
0x0006, 20, 0,
0x0007, 100,-90,
0x0007, 80, -10,
SSSS_LOOP,
};
static s16 BOS12_MshtR[]={
SSSS_START,
0x000e, 40, 0,
0x000a, 8, 0,
0x000c, 16, 0,
0x0008, 20, -10,
0x0008, 30, 0,
SSSS_END,
};
static s16 BOS12_MshtL[]={
SSSS_START,
0x000e, 40, 0,
0x000b, 8, 0,
0x000d, 16, 0,
0x0008, 20, -10,
0x0008, 30, 0,
SSSS_END,
};
static s16 BOS12_Meto_Set[]={
SSSS_START,
0x0010, 30, 0,
SSSS_END,
};
static s16 BOS12_Meto[]={
0x0010, 7, 0,
0x000f, 7, 0,
SSSS_LOOP,
};
#if EDIT
static s16 BOS12_TRNS[]={
0x0010, 10, 0,
0x000f, 10, 0,
SSSS_LOOP,
};
#endif
0xE4400
This is part of an objdump listing.
0026d1c .control 06066d1c ___mulsi3
06008adc *ABS* 06008adc _f_demo13
00000000 .text 00000000 _SCR_2_init
00014ef0 .control 06054ef0 _eshot07_disp
00032e48 .control 06072e48 _anm_gero00
06007860 *ABS* 06007860 _SND_GetSeqStat
060ffd26 *ABS* 060ffd26 _VDP2_MPGHRB
060342d8 *ABS* 060342d8 _slSetPortMode2
0600931c *ABS* 0600931c _f_stg4_tne_m
00018a60 .control 06058a60 _bbom_set
060ffc76 *ABS* 060ffc76 _TotalVertices
00018170 .control 06058170 _hahen_set
0000de64 .control 0604de64 _eft_func
06008d2c *ABS* 06008d2c _f_s3jama
0000ac40 .contbss 0607e5b0 _vntbl_body
00001174 .text 00001174 _set_mime_matrix
0000847a .contbss 0607bdea _local_load_tex_ofs
00024f8c .control 06064f8c _sys__interrupt_handler28
0000424c .text 0000424c _SCR_2_3_moya
060fff18 *ABS* 060fff18 _Win1Zlimit
060ffd28 *ABS* 060ffd28 _VDP2_MPIJRB
00024d48 .control 06064d48 _SYS_SetUintMacSave
060094e4 *ABS* 060094e4 _f_st51_tne
000311a0 .control 060711a0 _slDivFX
00016084 .control 06056084 _hansya_anm
0001f244 .control 0605f244 _SCR_MoveRbgRB
00021534 .control 06061534 _demo_start
06004000 *ABS* 06004000 _main
0000847c .contbss 0607bdec _load_col_ofs
06008c14 *ABS* 06008c14 _f_makuno
06004064 *ABS* 06004064 _SortListSize
0600405c *ABS* 0600405c _EventSize
00019d38 .control 06059d38 _enm01_dead
06033530 *ABS* 06033530 _slInitInterrupt
06008ba8 *ABS* 06008ba8 _f_warning
00006608 .text 00006608 _moni_scr
060fff20 *ABS* 060fff20 _Win1_ScreenDist
00021c4c .control 06061c4c _set_next_win
00016030 .control 06056030 _hansya_set
0000019c .data 00007124 _st2_name_10
060ffd7c *ABS* 060ffd7c _VDP2_RPTA
00003508 .text 00003508 _SCR_2_2c_ctrl
06033276 *ABS* 06033276 _BlankIn
00030930 .control 06070930 _slMapNbg0
00023a98 .control 06063a98 _chase_laser
000216d0 .control 060616d0 _kaiwa_tim0_func3
000095d0 .control 060495d0 _play_spred_set
060ffd5a *ABS* 060ffd5a _VDP2_SCRCTL
060344d8 *ABS* 060344d8 _Smpc_Result
060ffde0 *ABS* 060ffde0 _ScrRotPtr
0002da30 .control 0606da30 _slVRAMMode
00006268 .text 00006268 _guid_set
06034d92 *ABS* 06034d92 _PCM_EndCheck
00017bb4 .control 06057bb4 _eft_bomb04_set
00002284 .text 00002284 _SCR_2_1a_ctrl
00008480 .contbss 0607bdf0 _obj_x
060ffd2a *ABS* 060ffd2a _VDP2_MPKLRB
06006a58 *ABS* 06006a58 _SND_TIMING
060ffcc4 *ABS* 060ffcc4 _VDP2_TVSTAT
00024f02 .control 06064f02 _sys__interrupt_handler3
00003b50 .text 00003b50 _padman_disp2
060093f4 *ABS* 060093f4 _f_stg2_seq
0001fb4c .control 0605fb4c _disp_warning_bg
00020ab4 .control 06060ab4 _mk_credit_map_sub
06008f18 *ABS* 06008f18 _f_titlebg
060ffde4 *ABS* 060ffde4 _nbg0_char_adr
00020884 .control 06060884 _mk_score_map
00030eb0 .control 06070eb0 _slSetAmbient
00014638 .control 06054638 _eshot02_set
000006f4
0xE5000
This is part of the source code for Stage 2.
/*==================================================================*/
/* STG02 */
/*==================================================================*/
#include "bios.h"
#include "ryo.h"
#include "game.h"
#include "nami.h"
#include "scroll.h"
/*------------------------------------------------------------------*/
#define NORMAL_SET 1
#define BOSSX_DEBUG_SET 0
#define BOSSY_DEBUG_SET 0
#define BOSSZ_DEBUG_SET 0
#define PAD_DEBUG_SET 0
#define FLAT_MODE 0
/*------------------------------------------------------------------*/
#define tm(X,Y,Z) ((X*60*60)+(Y*60)+Z)
/*------------------------------------------------------------------*/
ENM_SET_TBL_ etbl00[];
ENM_SET_TBL_ etbl01[];
ENM_SET_TBL_ etbl02[];
ENM_SET_TBL_ etbl03[];
ENM_SET_TBL_ etbl04[];
/*------------------------------------------------------------------*/
/* Common Enemy */
/*------------------------------------------------------------------*/
extern s32 eset10_enm00_set(ESET_OBJ *ex);
extern s32 inu_set(ESET_OBJ *ex);
extern void name_set_sub(s8 *AD0, s8 *AD1, s8 *AD2, s8 *AD3, s16 Wait);
/*------------------------------------------------------------------*/
/* Boss Enemy */
/*------------------------------------------------------------------*/
extern s8 bos10_set(void);
extern s8 bos11_set(void);
extern s8 bos12_set(void);
extern s8 padman_set(void);
extern s8 guid_set(void);
extern s8 bike_set(void);
extern s32 nise_set(ENM_SET_TBL *etbl);
/*------------------------------------------------------------------*/
static s8 bos00_name[] = "^1KOTETSU";
static s8 bos00_p0[] = "1:HARDINESS";
static s8 bos00_p1[] = "2:SLEIGHT;OF;HAND";
static s8 bos00_p2[] = "3:FRIEND;SHIP";
static s8 bos01_name[] = "^1GOLETS";
static s8 bos01_p0[] = "1:HIGH;SPEED;SIGHT";
static s8 bos01_p1[] = "2:BRAVE;HEART";
static s8 bos01_p2[] = "3:BROTHER;LOVE";
static s8 bos02_name[] = "^1NASU";
static s8 bos02_p0[] = "1:BRAVE;FOR;ENTER;BOSOM";
static s8 bos02_p1[] = "2:PLACATE;TO;ANIMAL";
static s8 bos02_p2[] = "3:WILD;CAMERA";
static s8 bos03_name[] = "^1DAIKAI10";
static s8 bos03_p0[] = "1:DECIDE;WEAPONS";
static s8 bos03_p1[] = "2:SUPPLE;THINK";
static s8 bos03_p2[] = "3:...AND;LUCK";
static s8 bos04_name[] = "^1GEDO-O";
static s8 bos04_p0[] = "1:MAKE TIME";
static s8 bos04_p1[] = "2:DECIDE;WEAPONS";
static s8 bos04_p2[] = "3:LOOK;OVER;TO;LINES";
static s8 *bos_name[]={
bos00_name,
bos01_name,
bos02_name,
bos03_name,
bos04_name,
};
static s8 *bos_poten[]={
bos00_p0,bos00_p1,bos00_p2,
bos01_p0,bos01_p1,bos01_p2,
bos02_p0,bos02_p1,bos02_p2,
bos03_p0,bos03_p1,bos03_p2,
bos04_p0,bos04_p1,bos04_p2,
};
/*=================================================================*/
static s32 name_set(ENM_SET_TBL *etbl){
/*=================================================================*/
name_set_sub(bos_name[(u8)etbl->no],
bos_poten[((u8)etbl->no*3)+0],
bos_poten[((u8)etbl->no*3)+1],
bos_poten[((u8)etbl->no*3)+2],
etbl->d0.swl);
return 1;
}
/*==================================================================*/
#define step no
#define load_adr etbl->w1.swl
#define vram_adr etbl->w2.swl
#define tex_ofs etbl->w3.sww[0]
#define col_ofs etbl->w3.sww[1]
#define sd_adr etbl->w1.swl
#define sq_adr (sd_adr + sd_size)
#define sd_size etbl->w2.swl
#define sq_size etbl->w3.swl
static s32 SE_load(ENM_SET_TBL *etbl, u8 TONE){
enum{
LOAD_INIT,
SD_LOAD_START,
SD_LOAD_WAIT,
SD_SET,
LOAD_END,
END
};
s32 ret;
#ifdef SS
GfsHn cdhn;
#endif
#ifdef STV
LOAD_FILE_INF *cdhn;
#endif
cdhn = etbl->w0.func;
// return 1;
ret = 0;
switch(etbl->step){
/*----------------------*/
case LOAD_INIT:
/*----------------------*/
sd_adr = local_load_end_ram_adr;
sd_adr -= STG_TONE_BANK_SIZE_MAX;
etbl->step = SD_LOAD_START;
break;
/*----------------------*/
case SD_LOAD_START:
/*----------------------*/
cdhn = sd_data_load(TONE,sd_adr);
if(cdhn == NULL)break;
sd_size = file_size_get(cdhn);
etbl->step = SD_LOAD_WAIT;
break;
/*----------------------*/
case SD_LOAD_WAIT:
/*----------------------*/
if(!read_check(cdhn))break;
etbl->step = SD_SET;
break;
/*----------------------*/
case SD_SET:
/*----------------------*/
sd_data_set(TONE,sd_adr,sd_size);
etbl->step = LOAD_END;
break;
/*----------------------*/
case LOAD_END:
/*----------------------*/
ret = 1;
break;
}
etbl->w0.func = cdhn;
etbl->d0.swl--;
return(ret);
}
/*============================================================================*/
static s32 stg21_se_load(ENM_SET_TBL *etbl){
/*============================================================================*/
return SE_load(etbl,SD_STG21_TNE);
}
/*============================================================================*/
static s32 stg22_se_load(ENM_SET_TBL *etbl){
/*============================================================================*/
return SE_load(etbl,SD_STG22_TNE);
}
/*============================================================================*/
static s32 stg23_se_load(ENM_SET_TBL *etbl){
/*============================================================================*/
return SE_load(etbl,SD_STG23_TNE);
}
/*============================================================================*/
static s32 stg24_se_load(ENM_SET_TBL *etbl){
/*============================================================================*/
return SE_load(etbl,SD_STG24_TNE);
}
/*============================================================================*/
static s32 stg25_se_load(ENM_SET_TBL *etbl){
/*============================================================================*/
return SE_load(etbl,SD_STG25_TNE);
}
#undef sd_adr
#undef sq_adr
#undef sd_size
#undef sq_size
/*==================================================================*/
#define step no
#define load_adr etbl->w1.swl
#define vram_adr etbl->w2.swl
#define tex_ofs etbl->w3.sww[0]
#define col_ofs etbl->w3.sww[1]
#define sd_adr etbl->w1.swl
#define sq_adr (sd_adr + sd_size)
#define sd_size etbl->w2.swl
#define sq_size etbl->w3.swl
static s32 bos_bgm_load(ENM_SET_TBL *etbl)
{
enum{
LOAD_INIT,
SD_LOAD_START,
SD_LOAD_WAIT,
SQ_LOAD_START,
SQ_LOAD_WAIT,
BGM_STOP,
BGM_STOP_WAIT,
SD_SET,
SQ_SET,
BGM_SET,
LOAD_END,
END
};
s32 ret;
#ifdef SS
GfsHn cdhn;
#endif
#ifdef STV
LOAD_FILE_INF *cdhn;
#endif
cdhn = etbl->w0.func;
ret = 0;
switch(etbl->step){
case LOAD_INIT:
sd_adr = local_load_end_ram_adr;
sd_adr -= BGM_BANK_SIZE_MAX;
etbl->step++;
break;
case SD_LOAD_START:
cdhn = sd_data_load(SD_BOS2_TNE_M, sd_adr);
if(cdhn == NULL)break;
sd_size = file_size_get(cdhn);
etbl->step = SD_LOAD_WAIT;
break;
case SD_LOAD_WAIT:
if(!read_check(cdhn))break;
etbl->step++;
break;
case SQ_LOAD_START:
cdhn = sd_data_load(SD_BOS2_SEQ_M, sq_adr);
if(cdhn == NULL)break;
sq_size = file_size_get(cdhn);
etbl->step = SQ_LOAD_WAIT;
break;
case SQ_LOAD_WAIT:
if(!read_check(cdhn))break;
etbl->step = BGM_STOP;
break;
case BGM_STOP:
if(etbl->d0.swl > 0)break;
bgm_stop(200);
etbl->step = BGM_STOP_WAIT;
break;
case BGM_STOP_WAIT:
if(sd_x->bgm_set_no != BGM_NULL)break;
etbl->d0.swl = 2;
etbl->step = SD_SET;
break;
case SD_SET:
if(etbl->d0.swl > 0)break;
sd_data_set(SD_BOS2_TNE_M,sd_adr,sd_size);
sd_data_set(SD_BOS2_SEQ_M,sq_adr,sq_size);
etbl->d0.swl = cmin(etbl->d1.swl,((sd_size + sq_size) / DIV_DMA_SIZE) + 4);
etbl->step = BGM_SET;
break;
case BGM_SET:
if(etbl->d0.swl > 0)break;
gcon_x->bgm_load_no = BGM_BOS02;
bgm_set(BGM_BOS02);
etbl->step = LOAD_END;
break;
case LOAD_END:
ret = 1;
break;
}
etbl->w0.func = cdhn;
etbl->d0.swl--;
return(ret);
}
#undef sd_adr
#undef sq_adr
#undef sd_size
#undef sq_size
/*=================================================================*/
s32 demo01_set(ENM_SET_TBL *etbl){
/*=================================================================*/
switch(Set_Step){
case 0:
if(!(get_stage_fg() & STAGE_START_FG))break;
Set_Step++;
break;
case 1:
if(SCR_NextAreaFlag){
eset_x = enm_set_set((ENM_SET_TBL *)etbl00);
return -1;
}
}
return 0;
}
/*============================================================================*/
/* */
/* --- KOTESU Stage ------------------------------------------------------- */
/* */
/*============================================================================*/
static s32 kotetsu_load(ENM_SET_TBL *etbl)
{
enum{
LOAD_INIT,
MODEL_LOAD_START,
MODEL_LOAD_WAIT,
MODEL_LOAD_END,
CHAR_LOAD_START,
CHAR_LOAD_WAIT,
CHAR_LOAD_END,
LOAD_END,
END
};
s32 ret;
#ifdef SS
GfsHn cdhn;
#endif
#ifdef STV
LOAD_FILE_INF *cdhn;
#endif
cdhn = etbl->w0.func;
ret = 0;
switch(etbl->step){
case LOAD_INIT:
load_adr = local_load_ram_adr;
vram_adr = local_load_vram_adr;
tex_ofs = local_load_tex_ofs;
col_ofs = local_load_col_ofs;
etbl->step = MODEL_LOAD_START;
break;
case MODEL_LOAD_START:
cdhn = model_load(CHAR_KOTETSU,load_adr);
if(cdhn == NULL)break;
etbl->step = MODEL_LOAD_WAIT;
break;
case MODEL_LOAD_WAIT:
if(!read_check(cdhn))break;
model_load_end(CHAR_KOTETSU,load_adr);
vram_adr = model_set(CHAR_KOTETSU,vram_adr,tex_ofs,col_ofs);
tex_ofs += ((P_HEADER *)char_tbl[CHAR_KOTETSU].header_adr)->tex_suu;
if((char_tbl[CHAR_KOTETSU].atrb & CL_MODE) != CL16Look){
col_ofs += ((P_HEADER *)char_tbl[CHAR_KOTETSU].header_adr)->colsize;
}
load_adr = (u32)((P_HEADER *)char_tbl[CHAR_KOTETSU].header_adr)->texinf;
model_all_hss_set (CHAR_KOTETSU,M_KOTETSU_END);
model_all_flat_set(CHAR_KOTETSU,M_KOTETSU_END);
set_light_color (22,24,28);
set_light_ambient (10,12,14);
set_light_angle (+0x1000,-0x2000,-0x0000);
etbl->step = MODEL_LOAD_END;
break;
case MODEL_LOAD_END:
etbl->step = CHAR_LOAD_START;
break;
case CHAR_LOAD_START:
cdhn = char_load(CHAR_KOTET_E,load_adr);
if(cdhn == NULL)break;
etbl->step = CHAR_LOAD_WAIT;
break;
case CHAR_LOAD_WAIT:
if(!read_check(cdhn))break;
char_load_end(CHAR_KOTET_E,load_adr);
vram_adr = char_set(CHAR_KOTET_E,vram_adr,tex_ofs,col_ofs);
tex_ofs += ((S_HEADER *)char_tbl[CHAR_KOTET_E].header_adr)->tex_suu;
col_ofs += ((S_HEADER *)char_tbl[CHAR_KOTET_E].header_adr)->colsize;
load_adr = (u32)((S_HEADER *)char_tbl[CHAR_KOTET_E].header_adr)->texinf;
etbl->step = CHAR_LOAD_END;
break;
case CHAR_LOAD_END:
etbl->step = LOAD_END;
break;
case LOAD_END:
ret = 1;
break;
}
etbl->w0.func = cdhn;
return(ret);
}
/*=================================================================*/
s32 KOTETSU_set(ENM_SET_TBL *etbl){
/*=================================================================*/
EFT_OBJ *x;
s8 OBJ_NO;
switch(Set_Step){
case 0: /* Boss Set */
OBJ_NO = bos10_set();
if(OBJ_NO){
Set_Step++;
Set_Boss_obj_no = OBJ_NO;
}
break;
case 1: /* Boss Dead Wait */
if(obj_x[Set_Boss_obj_no]==0){
x = report_set( 60);
if(x){
Set_Step++;
Set_Report_Adr = (u32)x;
SCR_NextSection();
}
}
break;
case 2: /* Next Enemies Set */
x = (EFT_OBJ *)Set_Report_Adr;
if(x->mode >= OBJ_M_KIE){
Set_Step++;
SCR_NextSection();
}
break;
case 3: /* Next Enemies Set */
if(SCR_NextAreaFlag){
eset_x = enm_set_set((ENM_SET_TBL *)etbl01);
return -1;
}
}
return 0;
}
/*============================================================================*/
/* */
/* --- SONIC Stage ------------------------------------------------------- */
/* */
/*============================================================================*/
static s32 sonic_load(ENM_SET_TBL *etbl)
{
enum{
LOAD_INIT,
MODEL_LOAD_START,
MODEL_LOAD_WAIT,
MODEL_LOAD_END,
CHAR_LOAD_START,
CHAR_LOAD_WAIT,
CHAR_LOAD_END,
LOAD_END,
END
};
s32 ret;
#ifdef SS
GfsHn cdhn;
#endif
#ifdef STV
LOAD_FILE_INF *cdhn;
#endif
cdhn = etbl->w0.func;
ret = 0;
switch(etbl->step){
case LOAD_INIT:
load_adr = local_load_ram_adr;
vram_adr = local_load_vram_adr;
tex_ofs = local_load_tex_ofs;
col_ofs = local_load_col_ofs;
etbl->step = MODEL_LOAD_START;
break;
case MODEL_LOAD_START:
cdhn = model_load(CHAR_SONIC,load_adr);
if(cdhn == NULL)break;
etbl->step = MODEL_LOAD_WAIT;
break;
case MODEL_LOAD_WAIT:
if(!read_check(cdhn))break;
model_load_end(CHAR_SONIC,load_adr);
vram_adr = model_set(CHAR_SONIC,vram_adr,tex_ofs,col_ofs);
tex_ofs += ((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)->tex_suu;
if((char_tbl[CHAR_SONIC].atrb & CL_MODE) != CL16Look){
col_ofs += ((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)->colsize;
}
load_adr = (u32)((P_HEADER *)char_tbl[CHAR_SONIC].header_adr)->texinf;
model_all_hss_set (CHAR_SONIC,M_SONIC_END);
model_all_flat_set(CHAR_SONIC,M_SONIC_END);
set_light_color (28,28,28);
set_light_ambient (12,12,12);
set_light_angle (-0x2000,+0x2000,-0x0000);
etbl->step = MODEL_LOAD_END;
break;
case MODEL_LOAD_END:
etbl->step = CHAR_LOAD_START;
break;
case CHAR_LOAD_START:
cdhn = char_load(CHAR_SONIC_E,load_adr);
if(cdhn == NULL)break;
etbl->step = CHAR_LOAD_WAIT;
break;
case CHAR_LOAD_WAIT:
if(!read_check(cdhn))break;
char_load_end(CHAR_SONIC_E,load_adr);
vram_adr = char_set(CHAR_SONIC_E,vram_adr,tex_ofs,col_ofs);
tex_ofs += ((S_HEADER *)char_tbl[CHAR_SONIC_E].header_adr)->tex_suu;
col_ofs += ((S_HEADER *)char_tbl[CHAR_SONIC_E].header_adr)->colsize;
load_adr = (u32)((S_HEADER *)char_tbl[CHAR_SONIC_E].header_adr)->texinf;
etbl->step = CHAR_LOAD_END;
break;
case CHAR_LOAD_END:
etbl->step = LOAD_END;
break;
case LOAD_END:
ret = 1;
break;
}
etbl->w0.func = cdhn;
return(ret);
}
/*=================================================================*/
s32 SONIC_set(ENM_SET_TBL *etbl){
/*=================================================================*/
EFT_OBJ *x;
s8 OBJ_NO;
switch(Set_Step){
case 0: /* Scroll Wait */
if(SCR_NextAreaFlag){
Set_Step++;
}
break;
case 1: /* Boss Set */
OBJ_NO = bos12_set();
if(OBJ_NO){
Set_Step++;
Set_Boss_obj_no = OBJ_NO;
}
break;
case 2: /* Boss Dead Wait */
if(obj_x[Set_Boss_obj_no]==0){
x = report_set( 60);
if(x){
Set_Step++;
Set_Report_Adr = (u32)x;
SCR_NextSection();
}
}
break;
case 3: /* Next Enemies Set */
x = (EFT_OBJ *)Set_Report_Adr;
if(x->mode >= OBJ_M_KIE){
Set_Step++;
SCR_NextSection();
}
break;
case 4: /* Next Enemies Set */
if(SCR_NextAreaFlag){
eset_x = enm_set_set((ENM_SET_TBL *)etbl02);
return -1;
}
}
return 0;
}
/*============================================================================*/
/* */
/* --- NURSE Stage ------------------------------------------------------- */
/*