sm64/data/iwa_path/tripstar.s

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