501 lines
14 KiB
ArmAsm
501 lines
14 KiB
ArmAsm
/********************************************************************************
|
|
-------------------------
|
|
Ultra 64 MARIO Brothers
|
|
-------------------------
|
|
Strategy
|
|
|
|
March 31 1996 programed by Iwamoto Daiki
|
|
********************************************************************************/
|
|
|
|
/*################*/
|
|
#ifdef ASSEMBLER
|
|
/*################*/
|
|
|
|
/*===============================================================================
|
|
New Star Path Data
|
|
================================================================================*/
|
|
e_tripstar:
|
|
p_initialize(item)
|
|
p_setbit( flag,stf_moveON )
|
|
p_program(s_areastage_init)
|
|
p_program(s_polystar_init)
|
|
|
|
p_while
|
|
p_program(s_polystar_main)
|
|
p_loop
|
|
|
|
|
|
/*===============================================================================*/
|
|
e_enemy_star:
|
|
p_initialize(item)
|
|
p_setbit( flag,stf_moveON )
|
|
p_program(s_polystar_init)
|
|
p_program(s_enemy_star_init)
|
|
|
|
p_while
|
|
p_program(s_enemy_star_main)
|
|
p_loop
|
|
|
|
/*===============================================================================*/
|
|
e_tripstar_getcoins:
|
|
p_initialize(item)
|
|
p_setbit( flag,stf_moveON | stf_NOramsave)
|
|
p_program(s_getcoins_star_init)
|
|
|
|
p_while
|
|
p_program(s_getcoins_star_main)
|
|
p_loop
|
|
|
|
e_coin_appstar:
|
|
p_initialize(item)
|
|
p_setbit(flag,stf_moveON)
|
|
p_softspritemodeON
|
|
p_hitON
|
|
p_animereset
|
|
p_program(s_areastage_init)
|
|
p_program(s_coin_appear_init)
|
|
|
|
p_while
|
|
p_program(s_coin_appear_main)
|
|
p_animeinc
|
|
p_loop
|
|
|
|
e_extstar_getcoins:
|
|
p_initialize(item)
|
|
p_setbit( flag,stf_moveON | stf_NOramsave)
|
|
|
|
p_while
|
|
p_program(s_getcoins_extstar_main)
|
|
p_loop
|
|
|
|
/*===============================================================================*/
|
|
e_tripstar_getdummy:
|
|
p_initialize(item)
|
|
p_setbit( flag,stf_moveON | stf_NOramsave)
|
|
p_program(s_getdummy_star_init)
|
|
|
|
p_while
|
|
p_program(s_getdummy_star_main)
|
|
p_loop
|
|
|
|
e_dummy_appstar:
|
|
p_initialize(item)
|
|
p_setbit(flag,stf_moveON)
|
|
p_sethitbox(100,100)
|
|
p_hitON
|
|
|
|
p_while
|
|
p_program(s_dummy_appear)
|
|
p_loop
|
|
|
|
|
|
/*################*/
|
|
#else
|
|
/*################*/
|
|
|
|
|
|
/*==================================================================================================
|
|
C Program
|
|
===================================================================================================*/
|
|
static HitCheckRecord polystar_hit = {
|
|
OBJNAME_TRIPSTAR,
|
|
0,0,0,0, /* flag,ap,hp,coin */
|
|
80,50, /* player attack hitarea */
|
|
0, 0, /* player damage hitarea */
|
|
};
|
|
|
|
|
|
/***************************************************************************************************
|
|
Polygon Star Init
|
|
***************************************************************************************************/
|
|
extern void s_polystar_init(void) {
|
|
|
|
char starNo = ((execstp->s[stw_actorcode].d >> 24) & 0xff);
|
|
|
|
unsigned char star_flag = BuGetStarFlag(activePlayerNo-1,activeCourseNo-1);
|
|
|
|
if (star_flag & (0x0001 << starNo)) {
|
|
execstp->map.shape = stageShapes[S_shadestar]; //Change Shape
|
|
}
|
|
else {
|
|
execstp->map.shape = stageShapes[S_polystar]; //Change Shape
|
|
}
|
|
|
|
s_set_hitparam(execstp,&polystar_hit); /* Set HitCheck Param */
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Polygon Star Main
|
|
***************************************************************************************************/
|
|
extern void s_polystar_main(void) {
|
|
|
|
|
|
obj_animeangleY += 0x800;
|
|
|
|
if ( obj_mail & EMAIL_PLAYERHIT ){
|
|
RemoveShape(execstp);
|
|
Mbitclr(obj_mail,EMAIL_PLAYERHITALL);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
/*=======================Enemy Set Star============================================================*/
|
|
#define enemystar_target_dist (execstp->s[stw_work0].f)
|
|
#define enemystar_spY (execstp->s[stw_work1].f)
|
|
#define enemystar_worldY (execstp->s[stw_work2].f)
|
|
#define STARFLY 30
|
|
|
|
/***************************************************************************************************
|
|
Enemy Set Stars
|
|
***************************************************************************************************/
|
|
extern void s_enemy_star_init()
|
|
{
|
|
obj_angleY = atan( (obj_attZ-obj_worldZ),(obj_attX-obj_worldX) );
|
|
|
|
enemystar_target_dist = sqrtf((obj_attX-obj_worldX)*(obj_attX-obj_worldX)+(obj_attZ-obj_worldZ)*(obj_attZ-obj_worldZ));
|
|
|
|
obj_speedY = (obj_attY-obj_worldY)/STARFLY;
|
|
obj_speedF = enemystar_target_dist/STARFLY;
|
|
enemystar_worldY = obj_worldY;
|
|
|
|
if (obj_programselect == 0 || activeCourseNo == 5) cameraDemoStrat(CAM_DEMO_LOOKOBJ,execstp); //CAMERA DEMO
|
|
else cameraDemoStrat(CAM_DEMO_STAR8,execstp); //CAMERA DEMO
|
|
|
|
|
|
s_begin_enemydemo(STRATMAIN_DEMOMODE+STRATMAIN_PLAYERSTOP); //Strategy Stop
|
|
Mbitset( execstp->status,OBJECT_DEMOMOVEENTRY ); //kaijo only me
|
|
|
|
s_hitOFF();
|
|
}
|
|
/***************************************************************************************************
|
|
Enemy Set Stars
|
|
***************************************************************************************************/
|
|
extern void s_enemy_star_main()
|
|
{
|
|
float worldY;
|
|
|
|
switch (obj_mode) {
|
|
case 0: obj_animeangleY += 0x1000;
|
|
if (obj_timer > 20) obj_mode = 1;
|
|
break;
|
|
|
|
case 1: ObjSpeedOn(execstp);
|
|
enemystar_worldY += obj_speedY;
|
|
obj_worldY = enemystar_worldY + sin(0x8000*obj_timer/STARFLY)*400;
|
|
obj_animeangleY += 0x1000;
|
|
s_makeobj_nowpos(execstp,S_NULL,e_twinkle_special);
|
|
objsound_level(NA_LSE2_STAR_MOVE);
|
|
if (obj_timer == STARFLY) {
|
|
obj_mode = 2;
|
|
obj_speedF = 0;
|
|
Na_StarAppearBgm();
|
|
}
|
|
break;
|
|
|
|
case 2: if (obj_timer < 20) obj_speedY = (20 - obj_timer);
|
|
else obj_speedY = -10;
|
|
s_makeobj_nowpos(execstp,S_NULL,e_twinkle_special);
|
|
ObjSpeedOn(execstp);
|
|
obj_animeangleY += 0x1000 - obj_timer*0x10;
|
|
objsound_level(NA_LSE2_STAR_MOVE);
|
|
if (obj_worldY < obj_attY) {
|
|
objsound(NA_SE2_STAR_FINISH);
|
|
s_hitON();
|
|
obj_worldY = obj_attY;
|
|
obj_mode = 3;
|
|
}
|
|
break;
|
|
|
|
case 3: obj_animeangleY += 0x800;
|
|
if (obj_timer == 20) {
|
|
demoseqcode = 1; // CAMERA DEMO END
|
|
s_end_enemydemo(STRATMAIN_DEMOMODE+STRATMAIN_PLAYERSTOP);
|
|
Mbitclr( execstp->status,OBJECT_DEMOMOVEENTRY );
|
|
}
|
|
|
|
if ( obj_mail & EMAIL_PLAYERHIT ){
|
|
RemoveShape(execstp);
|
|
Mbitclr(obj_mail,EMAIL_PLAYERHITALL);
|
|
}
|
|
break;
|
|
}
|
|
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Enemy Set Stars
|
|
***************************************************************************************************/
|
|
static StrategyRecord* EnemysetStar(StrategyRecord* stp,float posx,float posy,float posz)
|
|
{
|
|
|
|
stp = s_makeobj_absolute(execstp,0,S_polystar,e_enemy_star,obj_worldX,obj_worldY,obj_worldZ,0,0,0);
|
|
|
|
stp->s[stw_actorcode].d = execstp->s[stw_actorcode].d;
|
|
stp->s[stw_worldX_attention].f = posx;
|
|
stp->s[stw_worldY_attention].f = posy;
|
|
stp->s[stw_worldZ_attention].f = posz;
|
|
|
|
stp->s[stw_animeangleX].d = 0;
|
|
stp->s[stw_animeangleZ].d = 0;
|
|
|
|
return(stp);
|
|
}
|
|
|
|
/***************************************************************************************************
|
|
Enemy Set Stars
|
|
***************************************************************************************************/
|
|
extern void s_enemyset_star(float posx,float posy,float posz)
|
|
{
|
|
StrategyRecord* stp;
|
|
|
|
stp = EnemysetStar(stp,posx,posy,posz);
|
|
stp->s[stw_programselect].d = 0;
|
|
}
|
|
/***************************************************************************************************
|
|
8coin Set Stars
|
|
***************************************************************************************************/
|
|
static void s_coinset_star(float posx,float posy,float posz)
|
|
{
|
|
StrategyRecord* stp;
|
|
|
|
stp = EnemysetStar(stp,posx,posy,posz);
|
|
stp->s[stw_programselect].d = 1;
|
|
}
|
|
|
|
/***************************************************************************************************
|
|
Enemy Set Stars
|
|
***************************************************************************************************/
|
|
extern void s_extraset_star(float posx,float posy,float posz)
|
|
{
|
|
|
|
StrategyRecord* stp;
|
|
|
|
stp = EnemysetStar(stp,posx,posy,posz);
|
|
stp->s[stw_programselect].d = 1;
|
|
Mbitset((stp->s[stw_enemyinfo].d),ENEMYINFO_EXTSTAR);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*=======================8 Coins Get Version======================================================*/
|
|
|
|
extern char redcoin_num;
|
|
|
|
#define appearstar_flag (execstp->s[stw_work0].d)
|
|
|
|
static HitCheckRecord redcoin_hit = {
|
|
OBJNAME_COIN,
|
|
0,2,0,0, /* flag,ap,hp,coin */
|
|
100, 64, /* player damage hitarea */
|
|
0, 0, /* player attack hitarea */
|
|
};
|
|
/***************************************************************************************************
|
|
8 Coins Star Main
|
|
***************************************************************************************************/
|
|
extern void s_getcoins_star_init() {
|
|
|
|
short coin_num;
|
|
|
|
if (activeCourseNo != 3) s_makeobj_nowpos(execstp,S_shadestar,e_starpanel);
|
|
|
|
coin_num = s_count_obj(e_coin_appstar);
|
|
|
|
if (coin_num == 0) {
|
|
StrategyRecord* stp = s_makeobj_absolute(execstp,0,S_polystar,e_tripstar,obj_worldX,obj_worldY,obj_worldZ,0,0,0);
|
|
stp->s[stw_actorcode].d = execstp->s[stw_actorcode].d;
|
|
execstp->status = 0;
|
|
}
|
|
|
|
appearstar_flag = (8 - coin_num);
|
|
}
|
|
/***************************************************************************************************
|
|
8 Coins Star Main
|
|
***************************************************************************************************/
|
|
extern void s_getcoins_star_main() {
|
|
|
|
redcoin_num = appearstar_flag;
|
|
|
|
switch (obj_mode) {
|
|
case 0: if (appearstar_flag == 8) {
|
|
obj_mode = 1;
|
|
}
|
|
break;
|
|
|
|
case 1: if (obj_timer > 2) {
|
|
s_coinset_star(obj_worldX,obj_worldY,obj_worldZ);
|
|
s_kemuri();
|
|
execstp->status = 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
/***************************************************************************************************
|
|
8 Coins Star (COIN)
|
|
***************************************************************************************************/
|
|
extern void s_coin_appear_init() {
|
|
|
|
BGCheckData* bgcp;
|
|
float posy = mcBGGroundCheck(obj_worldX,obj_worldY,obj_worldZ,&bgcp);
|
|
StrategyRecord* stratp;
|
|
|
|
if ((stratp = s_find_obj(e_tripstar_getcoins)) != NULL) {
|
|
execstp->motherobj = stratp;
|
|
}
|
|
else if ((stratp = s_find_obj(e_extstar_getcoins)) != NULL){
|
|
execstp->motherobj = stratp;
|
|
}
|
|
else { execstp->motherobj = NULL; }
|
|
|
|
|
|
/*
|
|
if (obj_worldY > posy+1500) {
|
|
execstp->map.shape = stageShapes[S_redcoin_noshadow]; //Change Shape
|
|
}
|
|
else {
|
|
execstp->map.shape = stageShapes[S_redcoin]; //Change Shape
|
|
}
|
|
*/
|
|
|
|
s_set_hitparam(execstp,&redcoin_hit); /* Set HitCheck Param */
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
8 Coins Star (COIN)
|
|
***************************************************************************************************/
|
|
extern void s_coin_appear_main() {
|
|
|
|
|
|
if ( obj_mail & EMAIL_PLAYERHIT ){
|
|
if (motherp != NULL) {
|
|
(motherp->s[stw_work0].d) += 1;
|
|
//rmonpf(("ff %d\n",(motherp->s[stw_work0].d) ));
|
|
if ((motherp->s[stw_work0].d)!=8) { AppNumber( (char)(motherp->s[stw_work0].d),0,0,0); }
|
|
Na_RedCoinSe((u8)(motherp->s[stw_work0].d));
|
|
}
|
|
|
|
RemoveCoinCatch();
|
|
Mbitclr(obj_mail,EMAIL_PLAYERHITALL);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
/*=======================Dummyss Get Version======================================================*/
|
|
|
|
/***************************************************************************************************
|
|
Dummy Star Main
|
|
***************************************************************************************************/
|
|
extern void s_getdummy_star_init() {
|
|
|
|
short dummy_num;
|
|
|
|
dummy_num = s_count_obj(e_dummy_appstar);
|
|
|
|
if (dummy_num == 0) {
|
|
StrategyRecord* stp = s_makeobj_absolute(execstp,0,S_polystar,e_tripstar,obj_worldX,obj_worldY,obj_worldZ,0,0,0);
|
|
stp->s[stw_actorcode].d = execstp->s[stw_actorcode].d;
|
|
execstp->status = 0;
|
|
}
|
|
|
|
appearstar_flag = (5 - dummy_num);
|
|
|
|
|
|
}
|
|
/***************************************************************************************************
|
|
Dummy Star Init
|
|
***************************************************************************************************/
|
|
extern void s_getdummy_star_main() {
|
|
|
|
switch (obj_mode) {
|
|
case 0: if (appearstar_flag == 5) {
|
|
obj_mode = 1;
|
|
}
|
|
break;
|
|
|
|
case 1: if (obj_timer > 2) {
|
|
s_coinset_star(obj_worldX,obj_worldY,obj_worldZ);
|
|
s_kemuri();
|
|
execstp->status = 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
/***************************************************************************************************
|
|
Dummy Get Star
|
|
***************************************************************************************************/
|
|
extern void s_dummy_appear() {
|
|
|
|
if ( s_hitcheck(execstp,player1stp) == 1 ){
|
|
StrategyRecord* stratp = s_find_obj(e_tripstar_getdummy);
|
|
if (stratp != NULL) {
|
|
(stratp->s[stw_work0].d) += 1;
|
|
if ((stratp->s[stw_work0].d) != 5) AppNumber( (char)(stratp->s[stw_work0].d),0,0,0);
|
|
Na_SecretPointSe((u8)(stratp->s[stw_work0].d));
|
|
}
|
|
|
|
execstp->status = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*================================================================================================*/
|
|
/***************************************************************************************************
|
|
8 Coins Extra Star Main
|
|
***************************************************************************************************/
|
|
extern void s_getcoins_extstar_main() {
|
|
|
|
redcoin_num = appearstar_flag;
|
|
|
|
switch (obj_mode) {
|
|
case 0: if (appearstar_flag == 8) {
|
|
obj_mode = 1;
|
|
}
|
|
break;
|
|
|
|
case 1: if (obj_timer > 2) {
|
|
s_extraset_star(obj_worldX,obj_worldY,obj_worldZ);
|
|
s_kemuri();
|
|
execstp->status = 0;
|
|
}
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*################*/
|
|
#endif
|
|
/*################*/
|
|
|
|
|