Redo fire piranha

This commit is contained in:
EmeraldLockdown 2026-05-10 14:41:35 -05:00
parent 64027f33fc
commit 60b47551eb
3 changed files with 25 additions and 22 deletions

View file

@ -22,13 +22,24 @@ struct ObjectHitbox sPiranhaPlantFireHitbox = {
.hurtboxHeight = 20,
};
s32 sNumActiveFirePiranhaPlants;
s32 sNumKilledFirePiranhaPlants;
inline static u8 is_giant_fire_piranha_plant() {
return (o->oBehParams & 0x00FF0000) != 0;
}
static u8 active_fire_piranha_plant_count() {
u8 activeCount = 0;
struct Object *obj = obj_get_first_with_behavior_id(id_bhvFirePiranhaPlant);
while (obj != NULL) {
if (obj->oFirePiranhaPlantActive) {
activeCount++;
}
obj = obj_get_next_with_same_behavior_id(obj);
}
return activeCount;
}
void bhv_fire_piranha_plant_init(void) {
o->oFirePiranhaPlantNeutralScale = (is_giant_fire_piranha_plant() ? 2.f : 0.5f);
obj_set_hitbox(o, &sFirePiranhaPlantHitbox);
@ -43,12 +54,9 @@ void bhv_fire_piranha_plant_init(void) {
o->oNumLootCoins = 2;
}
}
sNumActiveFirePiranhaPlants = sNumKilledFirePiranhaPlants = 0;
// use standard distance based syncing
sync_object_init(o, 4000.0f);
sync_object_init_field(o, sNumActiveFirePiranhaPlants);
sync_object_init_field(o, sNumKilledFirePiranhaPlants);
}
static void fire_piranha_plant_act_hide(void) {
@ -68,12 +76,11 @@ static void fire_piranha_plant_act_hide(void) {
} else if (approach_f32_ptr(&o->oFirePiranhaPlantScale, 0.0f, 0.04f * o->oFirePiranhaPlantNeutralScale)) {
cur_obj_become_intangible();
if (o->oFirePiranhaPlantActive) {
sNumActiveFirePiranhaPlants -= 1;
o->oFirePiranhaPlantActive = FALSE;
if (is_giant_fire_piranha_plant() && o->oHealth == 0) {
if (++sNumKilledFirePiranhaPlants == 5) {
f32* starPos = gLevelValues.starPositions.BigPiranhasStarPos;
if (count_objects_with_behavior(o->behavior) <= 1) {
f32 *starPos = gLevelValues.starPositions.BigPiranhasStarPos;
spawn_default_star(starPos[0], starPos[1], starPos[2]);
network_send_object(o);
}
@ -81,11 +88,10 @@ static void fire_piranha_plant_act_hide(void) {
obj_die_if_health_non_positive();
set_object_respawn_info_bits(o, 1);
}
} else if (sNumActiveFirePiranhaPlants < 2 && o->oTimer > 100 && distanceToPlayer > 100.0f && distanceToPlayer < 800.0f) {
} else if (active_fire_piranha_plant_count() < 2 && o->oTimer > 100 && distanceToPlayer > 100.0f && distanceToPlayer < 800.0f) {
cur_obj_play_sound_2(SOUND_OBJ_PIRANHA_PLANT_APPEAR);
o->oFirePiranhaPlantActive = TRUE;
sNumActiveFirePiranhaPlants += 1;
cur_obj_unhide();
o->oAction = FIRE_PIRANHA_PLANT_ACT_GROW;
@ -138,11 +144,7 @@ void bhv_fire_piranha_plant_update(void) {
}
if (obj_check_attacks(&sFirePiranhaPlantHitbox, o->oAction)) {
if (--o->oHealth < 0) {
if (o->oFirePiranhaPlantActive) {
sNumActiveFirePiranhaPlants -= 1;
}
} else {
if (--o->oHealth >= 0) {
cur_obj_init_animation_with_sound(2);
}

View file

@ -68,7 +68,7 @@ void bhv_mips_init(void) {
cur_obj_init_animation(0);
// distance-based standard sync system
struct SyncObject* so = sync_object_init(o, 4000.0f);
struct SyncObject *so = sync_object_init(o, 4000.0f);
if (so) {
sync_object_init_field(o, o->oMipsStartWaypointIndex);
sync_object_init_field(o, o->oForwardVel);
@ -256,8 +256,6 @@ static u8 bhv_mips_held_continue_dialog(void) {
* Handles MIPS being held by Mario.
*/
void bhv_mips_held(void) {
s32 dialogID;
if (o->heldByPlayerIndex >= MAX_PLAYERS) { return; }
struct Object *player = gMarioStates[o->heldByPlayerIndex].marioObj;
@ -269,19 +267,20 @@ void bhv_mips_held(void) {
// If MIPS hasn't spawned his star yet...
if (o->oMipsStarStatus == MIPS_STAR_STATUS_HAVENT_SPAWNED_STAR) {
// Choose dialog based on which MIPS encounter this is.
s32 dialogID;
if (o->oBehParams2ndByte == 0) {
dialogID = gBehaviorValues.dialogs.Mips1Dialog;
} else {
dialogID = gBehaviorValues.dialogs.Mips2Dialog;
}
if (should_start_or_continue_dialog(&gMarioStates[o->heldByPlayerIndex], o) && set_mario_npc_dialog(&gMarioStates[0], 1, bhv_mips_held_continue_dialog) == 2) {
if (should_start_or_continue_dialog(&gMarioStates[o->heldByPlayerIndex], o) && set_mario_npc_dialog(&gMarioStates[o->heldByPlayerIndex], 1, bhv_mips_held_continue_dialog) == 2) {
//o->activeFlags |= ACTIVE_FLAG_INITIATED_TIME_STOP;
if (cutscene_object_with_dialog(CUTSCENE_DIALOG, o, dialogID)) {
o->oInteractionSubtype |= INT_SUBTYPE_DROP_IMMEDIATELY;
o->activeFlags &= ~ACTIVE_FLAG_INITIATED_TIME_STOP;
o->oMipsStarStatus = MIPS_STAR_STATUS_SHOULD_SPAWN_STAR;
set_mario_npc_dialog(&gMarioStates[0], 0, NULL);
set_mario_npc_dialog(&gMarioStates[o->heldByPlayerIndex], 0, NULL);
}
}
}

View file

@ -47,8 +47,10 @@
#include "hardcoded.h"
#include "engine/surface_load.h"
#include "pc/network/network.h"
#include "pc/lua/utils/smlua_model_utils.h"
#include "pc/lua/smlua.h"
#include "pc/lua/smlua_hooks.h"
#include "pc/lua/utils/smlua_model_utils.h"
#include "pc/lua/utils/smlua_obj_utils.h"
#define POS_OP_SAVE_POSITION 0
#define POS_OP_COMPUTE_VELOCITY 1