mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2024-11-28 23:13:02 +00:00
Ensure bowser key/star spawns, make bowser intro less glitchy
This commit is contained in:
parent
149859e5ab
commit
44c5b5b02b
5 changed files with 52 additions and 12 deletions
|
@ -2040,6 +2040,7 @@ const BehaviorScript bhvBowserKey[] = {
|
||||||
ID(id_bhvBowserKey),
|
ID(id_bhvBowserKey),
|
||||||
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
|
OR_INT(oFlags, OBJ_FLAG_UPDATE_GFX_POS_AND_ANGLE),
|
||||||
SET_HOME(),
|
SET_HOME(),
|
||||||
|
CALL_NATIVE(bhv_bowser_key_init),
|
||||||
SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 30, /*Gravity*/ -400, /*Bounciness*/ -70, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 200, /*Unused*/ 0, 0),
|
SET_OBJ_PHYSICS(/*Wall hitbox radius*/ 30, /*Gravity*/ -400, /*Bounciness*/ -70, /*Drag strength*/ 1000, /*Friction*/ 1000, /*Buoyancy*/ 200, /*Unused*/ 0, 0),
|
||||||
BEGIN_LOOP(),
|
BEGIN_LOOP(),
|
||||||
CALL_NATIVE(bhv_bowser_key_loop),
|
CALL_NATIVE(bhv_bowser_key_loop),
|
||||||
|
@ -2054,6 +2055,7 @@ const BehaviorScript bhvGrandStar[] = {
|
||||||
SET_INT(oInteractionSubtype, INT_SUBTYPE_GRAND_STAR),
|
SET_INT(oInteractionSubtype, INT_SUBTYPE_GRAND_STAR),
|
||||||
SET_HITBOX(/*Radius*/ 160, /*Height*/ 100),
|
SET_HITBOX(/*Radius*/ 160, /*Height*/ 100),
|
||||||
SET_HOME(),
|
SET_HOME(),
|
||||||
|
CALL_NATIVE(bhv_grand_star_init),
|
||||||
BEGIN_LOOP(),
|
BEGIN_LOOP(),
|
||||||
CALL_NATIVE(bhv_grand_star_loop),
|
CALL_NATIVE(bhv_grand_star_loop),
|
||||||
END_LOOP(),
|
END_LOOP(),
|
||||||
|
|
|
@ -142,7 +142,9 @@ void bhv_beta_trampoline_top_loop(void);
|
||||||
void bhv_beta_trampoline_spring_loop(void);
|
void bhv_beta_trampoline_spring_loop(void);
|
||||||
void bhv_jumping_box_loop(void);
|
void bhv_jumping_box_loop(void);
|
||||||
void bhv_boo_cage_loop(void);
|
void bhv_boo_cage_loop(void);
|
||||||
|
void bhv_bowser_key_init(void);
|
||||||
void bhv_bowser_key_loop(void);
|
void bhv_bowser_key_loop(void);
|
||||||
|
void bhv_grand_star_init(void);
|
||||||
void bhv_grand_star_loop(void);
|
void bhv_grand_star_loop(void);
|
||||||
void bhv_beta_boo_key_loop(void);
|
void bhv_beta_boo_key_loop(void);
|
||||||
void bhv_alpha_boo_key_loop(void);
|
void bhv_alpha_boo_key_loop(void);
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// bowser.c.inc
|
// bowser.c.inc
|
||||||
static u32 networkBowserAnimationIndex = 0;
|
static u32 networkBowserAnimationIndex = 0;
|
||||||
|
static u8 bowserIsDying = FALSE;
|
||||||
|
|
||||||
void bowser_tail_anchor_act_0(void) {
|
void bowser_tail_anchor_act_0(void) {
|
||||||
struct Object* bowser = o->parentObj;
|
struct Object* bowser = o->parentObj;
|
||||||
|
@ -838,25 +839,29 @@ void bowser_act_dance(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void bowser_spawn_grand_star_key(void) {
|
void bowser_spawn_grand_star_key(void) {
|
||||||
struct MarioState* marioState = nearest_mario_state_to_object(o);
|
|
||||||
if (marioState->playerIndex != 0) { return; }
|
|
||||||
struct Object* reward = NULL;
|
struct Object* reward = NULL;
|
||||||
if (BITS) {
|
if (BITS) {
|
||||||
reward = spawn_object(o, MODEL_STAR, bhvGrandStar);
|
struct Object* prevReward = cur_obj_nearest_object_with_behavior(bhvGrandStar);
|
||||||
|
reward = (prevReward != NULL) ? prevReward : spawn_object(o, MODEL_STAR, bhvGrandStar);
|
||||||
gSecondCameraFocus = reward;
|
gSecondCameraFocus = reward;
|
||||||
|
|
||||||
|
if (prevReward == NULL) {
|
||||||
struct Object* spawn_objects[] = { reward };
|
struct Object* spawn_objects[] = { reward };
|
||||||
u32 models[] = { MODEL_STAR };
|
u32 models[] = { MODEL_STAR };
|
||||||
network_send_spawn_objects(spawn_objects, models, 1);
|
network_send_spawn_objects(spawn_objects, models, 1);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
reward = spawn_object(o, MODEL_BOWSER_KEY, bhvBowserKey);
|
struct Object* prevReward = cur_obj_nearest_object_with_behavior(bhvBowserKey);
|
||||||
|
reward = (prevReward != NULL) ? prevReward : spawn_object(o, MODEL_BOWSER_KEY, bhvBowserKey);
|
||||||
gSecondCameraFocus = reward;
|
gSecondCameraFocus = reward;
|
||||||
cur_obj_play_sound_2(SOUND_GENERAL2_BOWSER_KEY);
|
cur_obj_play_sound_2(SOUND_GENERAL2_BOWSER_KEY);
|
||||||
|
|
||||||
|
if (prevReward == NULL) {
|
||||||
struct Object* spawn_objects[] = { reward };
|
struct Object* spawn_objects[] = { reward };
|
||||||
u32 models[] = { MODEL_BOWSER_KEY };
|
u32 models[] = { MODEL_BOWSER_KEY };
|
||||||
network_send_spawn_objects(spawn_objects, models, 1);
|
network_send_spawn_objects(spawn_objects, models, 1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
gSecondCameraFocus->oAngleVelYaw = o->oAngleVelYaw;
|
gSecondCameraFocus->oAngleVelYaw = o->oAngleVelYaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -899,6 +904,7 @@ s32 bowser_dead_wait_for_mario(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 bowser_dead_twirl_into_trophy(void) {
|
s32 bowser_dead_twirl_into_trophy(void) {
|
||||||
|
bowserIsDying = TRUE;
|
||||||
s32 ret = 0;
|
s32 ret = 0;
|
||||||
if (o->header.gfx.scale[0] < 0.8)
|
if (o->header.gfx.scale[0] < 0.8)
|
||||||
o->oAngleVelYaw += 0x80;
|
o->oAngleVelYaw += 0x80;
|
||||||
|
@ -941,12 +947,13 @@ s32 bowser_dead_not_bits_end(void) {
|
||||||
cur_obj_play_sound_2(SOUND_GENERAL2_BOWSER_EXPLODE);
|
cur_obj_play_sound_2(SOUND_GENERAL2_BOWSER_EXPLODE);
|
||||||
sequence_player_unlower(SEQ_PLAYER_LEVEL, 60);
|
sequence_player_unlower(SEQ_PLAYER_LEVEL, 60);
|
||||||
sequence_player_fade_out(0, 1);
|
sequence_player_fade_out(0, 1);
|
||||||
|
network_send_object(o);
|
||||||
}
|
}
|
||||||
} else if (bowser_dead_twirl_into_trophy()) {
|
} else if (bowser_dead_twirl_into_trophy()) {
|
||||||
bowser_dead_hide();
|
bowser_dead_hide();
|
||||||
spawn_triangle_break_particles(20, 116, 1.0f, 0);
|
spawn_triangle_break_particles(20, 116, 1.0f, 0);
|
||||||
bowser_spawn_grand_star_key();
|
bowser_spawn_grand_star_key();
|
||||||
if (marioState->playerIndex) { set_mario_npc_dialog(marioState, 0, NULL); }
|
set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
|
||||||
ret = 1;
|
ret = 1;
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1293,13 +1300,25 @@ void bhv_bowser_loop(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void bhv_bowser_override_ownership(u8* shouldOverride, u8* shouldOwn) {
|
void bhv_bowser_override_ownership(u8* shouldOverride, u8* shouldOwn) {
|
||||||
if (o->oAction == 19) { // tilting platform
|
// waiting for text / walking up
|
||||||
|
if (o->oAction == 5 || o->oAction == 6) {
|
||||||
|
*shouldOverride = TRUE;
|
||||||
|
*shouldOwn = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// tilting platform
|
||||||
|
if (o->oAction == 19) {
|
||||||
*shouldOverride = TRUE;
|
*shouldOverride = TRUE;
|
||||||
*shouldOwn = (gNetworkType == NT_SERVER);
|
*shouldOwn = (gNetworkType == NT_SERVER);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u8 bhv_bowser_ignore_if_true(void) {
|
||||||
|
return bowserIsDying;
|
||||||
|
}
|
||||||
|
|
||||||
void bhv_bowser_init(void) {
|
void bhv_bowser_init(void) {
|
||||||
|
bowserIsDying = FALSE;
|
||||||
s32 level; // 0 is dw, 1 is fs, 2 is sky
|
s32 level; // 0 is dw, 1 is fs, 2 is sky
|
||||||
o->oBowserUnk110 = 1;
|
o->oBowserUnk110 = 1;
|
||||||
o->oOpacity = 0xFF;
|
o->oOpacity = 0xFF;
|
||||||
|
@ -1320,6 +1339,7 @@ void bhv_bowser_init(void) {
|
||||||
|
|
||||||
struct SyncObject* so = network_init_object(o, 8000.0f);
|
struct SyncObject* so = network_init_object(o, 8000.0f);
|
||||||
so->override_ownership = bhv_bowser_override_ownership;
|
so->override_ownership = bhv_bowser_override_ownership;
|
||||||
|
so->ignore_if_true = bhv_bowser_ignore_if_true;
|
||||||
so->fullObjectSync = TRUE;
|
so->fullObjectSync = TRUE;
|
||||||
network_init_object_field(o, &o->header.gfx.node.flags);
|
network_init_object_field(o, &o->header.gfx.node.flags);
|
||||||
network_init_object_field(o, &networkBowserAnimationIndex);
|
network_init_object_field(o, &networkBowserAnimationIndex);
|
||||||
|
|
|
@ -12,7 +12,15 @@ struct ObjectHitbox sBowserKeyHitbox = {
|
||||||
/* hurtboxHeight: */ 100,
|
/* hurtboxHeight: */ 100,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void bhv_bowser_key_init(void) {
|
||||||
|
struct Object* other = cur_obj_nearest_object_with_behavior(bhvBowserKey);
|
||||||
|
if (other == NULL) { return; }
|
||||||
|
obj_mark_for_deletion(o);
|
||||||
|
if (gSecondCameraFocus == o) { gSecondCameraFocus = other; }
|
||||||
|
}
|
||||||
|
|
||||||
void bhv_bowser_key_loop(void) {
|
void bhv_bowser_key_loop(void) {
|
||||||
|
if (o->activeFlags == ACTIVE_FLAG_DEACTIVATED) { return; }
|
||||||
cur_obj_scale(0.5f);
|
cur_obj_scale(0.5f);
|
||||||
if (o->oAngleVelYaw > 0x400)
|
if (o->oAngleVelYaw > 0x400)
|
||||||
o->oAngleVelYaw -= 0x100;
|
o->oAngleVelYaw -= 0x100;
|
||||||
|
|
|
@ -19,7 +19,15 @@ void grand_star_zero_velocity(void) {
|
||||||
o->oForwardVel = 0.0f;
|
o->oForwardVel = 0.0f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void bhv_grand_star_init(void) {
|
||||||
|
struct Object* other = cur_obj_nearest_object_with_behavior(bhvGrandStar);
|
||||||
|
if (other == NULL) { return; }
|
||||||
|
obj_mark_for_deletion(o);
|
||||||
|
if (gSecondCameraFocus == o) { gSecondCameraFocus = other; }
|
||||||
|
}
|
||||||
|
|
||||||
void bhv_grand_star_loop(void) {
|
void bhv_grand_star_loop(void) {
|
||||||
|
if (o->activeFlags == ACTIVE_FLAG_DEACTIVATED) { return; }
|
||||||
UNUSED s32 unused;
|
UNUSED s32 unused;
|
||||||
Vec3f sp28;
|
Vec3f sp28;
|
||||||
sp28[0] = sp28[1] = sp28[2] = 0.0f;
|
sp28[0] = sp28[1] = sp28[2] = 0.0f;
|
||||||
|
|
Loading…
Reference in a new issue