diff --git a/include/object_constants.h b/include/object_constants.h index c4b847b7..7ee6ad17 100644 --- a/include/object_constants.h +++ b/include/object_constants.h @@ -779,7 +779,6 @@ enum ExclamationBoxContentsList { // oBehParams2ndByte, ExclamationBoxContents-> EXCLAMATION_BOX_BP_STAR_4, EXCLAMATION_BOX_BP_STAR_5, EXCLAMATION_BOX_BP_STAR_6, - EXCLAMATION_BOX_BP_NULL = 99 }; enum oBehParam1stByteExclamationBox { EXCLAMATION_BOX_BP1_NEEDS_SWITCH, diff --git a/src/game/behaviors/exclamation_box.inc.c b/src/game/behaviors/exclamation_box.inc.c index 34738d57..f14e9722 100644 --- a/src/game/behaviors/exclamation_box.inc.c +++ b/src/game/behaviors/exclamation_box.inc.c @@ -1,42 +1,39 @@ // exclamation_box.inc.c -struct ExclamationBoxContents { - u8 id; - u8 unk1; - u8 behParams; - ModelID16 model; - const BehaviorScript *behavior; +struct ObjectHitbox sExclamationBoxHitbox = { + .interactType = INTERACT_BREAKABLE, + .downOffset = 5, + .damageOrCoinValue = 0, + .health = 1, + .numLootCoins = 0, + .radius = 40, + .height = 30, + .hurtboxRadius = 40, + .hurtboxHeight = 30, }; -struct ObjectHitbox sExclamationBoxHitbox = { - /* interactType: */ INTERACT_BREAKABLE, - /* downOffset: */ 5, - /* damageOrCoinValue: */ 0, - /* health: */ 1, - /* numLootCoins: */ 0, - /* radius: */ 40, - /* height: */ 30, - /* hurtboxRadius: */ 40, - /* hurtboxHeight: */ 30, +struct ExclamationBoxContents { + ModelID32 model; + const BehaviorScript *behavior; + u8 behParam; }; struct ExclamationBoxContents sExclamationBoxContents[] = { - { EXCLAMATION_BOX_BP_WING_CAP, 0, 0, MODEL_MARIOS_WING_CAP, bhvWingCap }, - { EXCLAMATION_BOX_BP_METAL_CAP, 0, 0, MODEL_MARIOS_METAL_CAP, bhvMetalCap }, - { EXCLAMATION_BOX_BP_VANISH_CAP, 0, 0, MODEL_MARIOS_CAP, bhvVanishCap }, - { EXCLAMATION_BOX_BP_KOOPA_SHELL, 0, 0, MODEL_KOOPA_SHELL, bhvKoopaShell }, - { EXCLAMATION_BOX_BP_COINS_1, 0, 0, MODEL_YELLOW_COIN, bhvSingleCoinGetsSpawned }, - { EXCLAMATION_BOX_BP_COINS_3, 0, 0, MODEL_NONE, bhvThreeCoinsSpawn }, - { EXCLAMATION_BOX_BP_COINS_10, 0, 0, MODEL_NONE, bhvTenCoinsSpawn }, - { EXCLAMATION_BOX_BP_1UP_WALKING, 0, 0, MODEL_1UP, bhv1upWalking }, - { EXCLAMATION_BOX_BP_STAR_1, 0, 0, MODEL_STAR, bhvSpawnedStar }, - { EXCLAMATION_BOX_BP_1UP_RUNNING_AWAY, 0, 0, MODEL_1UP, bhv1upRunningAway }, - { EXCLAMATION_BOX_BP_STAR_2, 0, 1, MODEL_STAR, bhvSpawnedStar }, - { EXCLAMATION_BOX_BP_STAR_3, 0, 2, MODEL_STAR, bhvSpawnedStar }, - { EXCLAMATION_BOX_BP_STAR_4, 0, 3, MODEL_STAR, bhvSpawnedStar }, - { EXCLAMATION_BOX_BP_STAR_5, 0, 4, MODEL_STAR, bhvSpawnedStar }, - { EXCLAMATION_BOX_BP_STAR_6, 0, 5, MODEL_STAR, bhvSpawnedStar }, - { EXCLAMATION_BOX_BP_NULL, 0, 0, MODEL_NONE, NULL } + [EXCLAMATION_BOX_BP_WING_CAP ] = { MODEL_MARIOS_WING_CAP, bhvWingCap, 0 }, + [EXCLAMATION_BOX_BP_METAL_CAP ] = { MODEL_MARIOS_METAL_CAP, bhvMetalCap, 0 }, + [EXCLAMATION_BOX_BP_VANISH_CAP ] = { MODEL_MARIOS_CAP, bhvVanishCap, 0 }, + [EXCLAMATION_BOX_BP_KOOPA_SHELL ] = { MODEL_KOOPA_SHELL, bhvKoopaShell, 0 }, + [EXCLAMATION_BOX_BP_COINS_1 ] = { MODEL_YELLOW_COIN, bhvSingleCoinGetsSpawned, 0 }, + [EXCLAMATION_BOX_BP_COINS_3 ] = { MODEL_NONE, bhvThreeCoinsSpawn, 0 }, + [EXCLAMATION_BOX_BP_COINS_10 ] = { MODEL_NONE, bhvTenCoinsSpawn, 0 }, + [EXCLAMATION_BOX_BP_1UP_WALKING ] = { MODEL_1UP, bhv1upWalking, 0 }, + [EXCLAMATION_BOX_BP_STAR_1 ] = { MODEL_STAR, bhvSpawnedStar, 0 }, + [EXCLAMATION_BOX_BP_1UP_RUNNING_AWAY] = { MODEL_1UP, bhv1upRunningAway, 0 }, + [EXCLAMATION_BOX_BP_STAR_2 ] = { MODEL_STAR, bhvSpawnedStar, 1 }, + [EXCLAMATION_BOX_BP_STAR_3 ] = { MODEL_STAR, bhvSpawnedStar, 2 }, + [EXCLAMATION_BOX_BP_STAR_4 ] = { MODEL_STAR, bhvSpawnedStar, 3 }, + [EXCLAMATION_BOX_BP_STAR_5 ] = { MODEL_STAR, bhvSpawnedStar, 4 }, + [EXCLAMATION_BOX_BP_STAR_6 ] = { MODEL_STAR, bhvSpawnedStar, 5 }, }; void bhv_rotating_exclamation_mark_loop(void) { @@ -49,16 +46,12 @@ void exclamation_box_act_init(void) { if (o->oBehParams2ndByte < EXCLAMATION_BOX_BP_KOOPA_SHELL) { o->oAnimState = o->oBehParams2ndByte; #ifdef UNLOCK_ALL - u8 tangible = TRUE; + const u8 tangible = TRUE; #else - u8 tangible = ((save_file_get_flags() & sCapSaveFlags[o->oBehParams2ndByte]) - || (GET_BPARAM1(o->oBehParams) != EXCLAMATION_BOX_BP1_NEEDS_SWITCH)); + const u8 tangible = ((save_file_get_flags() & sCapSaveFlags[o->oBehParams2ndByte]) + || (GET_BPARAM1(o->oBehParams) != EXCLAMATION_BOX_BP1_NEEDS_SWITCH)); #endif - if (tangible) { - o->oAction = EXCLAMATION_BOX_ACT_ACTIVE; - } else { - o->oAction = EXCLAMATION_BOX_ACT_OUTLINE; - } + o->oAction = tangible ? EXCLAMATION_BOX_ACT_ACTIVE : EXCLAMATION_BOX_ACT_OUTLINE; } else { o->oAnimState = EXCLAMATION_BOX_ANIM_STATE_YELLOW; o->oAction = EXCLAMATION_BOX_ACT_ACTIVE; @@ -107,13 +100,15 @@ void exclamation_box_act_scaling(void) { o->oVelY = 0.0f; o->oGravity = 0.0f; } - o->oExclamationBoxVerticalScale = (sins(o->oExclamationBoxScaleAngle) + 1.0f) * 0.3f + 0.0f; - o->oExclamationBoxHorizontalScale = (-sins(o->oExclamationBoxScaleAngle) + 1.0f) * 0.5f + 1.0f; - o->oGraphYOffset = (-sins(o->oExclamationBoxScaleAngle) + 1.0f) * 26.0f; + o->oGraphYOffset = ((-sins(o->oExclamationBoxScaleAngle) + 1.0f) * 26.0f); + o->oExclamationBoxHorizontalScale = ((-sins(o->oExclamationBoxScaleAngle) + 1.0f) * 0.5f) + 1.0f; + o->oExclamationBoxVerticalScale = (( sins(o->oExclamationBoxScaleAngle) + 1.0f) * 0.3f) + 0.0f; o->oExclamationBoxScaleAngle += 0x1000; - o->header.gfx.scale[0] = o->oExclamationBoxHorizontalScale * 2.0f; - o->header.gfx.scale[1] = o->oExclamationBoxVerticalScale * 2.0f; - o->header.gfx.scale[2] = o->oExclamationBoxHorizontalScale * 2.0f; + obj_scale_xyz(o, + (o->oExclamationBoxHorizontalScale * 2.0f), + (o->oExclamationBoxVerticalScale * 2.0f), + (o->oExclamationBoxHorizontalScale * 2.0f) + ); if (o->oTimer == 7) { o->oAction = EXCLAMATION_BOX_ACT_EXPLODE; } @@ -122,19 +117,17 @@ void exclamation_box_act_scaling(void) { void exclamation_box_spawn_contents(struct ExclamationBoxContents *contentsList, u8 boxType) { struct Object *contentsObj = NULL; - while (contentsList->id != EXCLAMATION_BOX_BP_NULL) { - if (boxType == contentsList->id) { - contentsObj = spawn_object(o, contentsList->model, contentsList->behavior); - contentsObj->oVelY = 20.0f; - contentsObj->oForwardVel = 3.0f; - contentsObj->oMoveAngleYaw = gMarioObject->oMoveAngleYaw; - OR_BPARAM1(o->oBehParams, contentsList->behParams); - if (contentsList->model == MODEL_STAR) { - o->oFlags |= OBJ_FLAG_PERSISTENT_RESPAWN; - } - break; + if (boxType < ARRAY_COUNT(sExclamationBoxContents)) { + struct ExclamationBoxContents *contents = &contentsList[boxType]; + + contentsObj = spawn_object(o, contents->model, contents->behavior); + contentsObj->oVelY = 20.0f; + contentsObj->oForwardVel = 3.0f; + contentsObj->oMoveAngleYaw = gMarioObject->oMoveAngleYaw; + OR_BPARAM1(o->oBehParams, contents->behParam); + if (contents->model == MODEL_STAR) { + o->oFlags |= OBJ_FLAG_PERSISTENT_RESPAWN; } - contentsList++; } } @@ -143,7 +136,8 @@ void exclamation_box_act_explode(void) { spawn_mist_particles_variable(0, 0, 46.0f); spawn_triangle_break_particles(20, MODEL_CARTOON_STAR, 0.3f, o->oAnimState); create_sound_spawner(SOUND_GENERAL_BREAK_BOX); - if (o->oBehParams2ndByte < EXCLAMATION_BOX_BP_COINS_1) { + if (o->oBehParams2ndByte <= EXCLAMATION_BOX_BP_KOOPA_SHELL) { + // Cap boxes + Koopa shell boxes. o->oAction = EXCLAMATION_BOX_ACT_WAIT_FOR_RESPAWN; cur_obj_hide(); } else { diff --git a/src/game/behaviors/koopa_shell.inc.c b/src/game/behaviors/koopa_shell.inc.c index becfbe34..a9c7364a 100644 --- a/src/game/behaviors/koopa_shell.inc.c +++ b/src/game/behaviors/koopa_shell.inc.c @@ -1,19 +1,22 @@ // koopa_shell.inc.c struct ObjectHitbox sKoopaShellHitbox = { - /* interactType: */ INTERACT_KOOPA_SHELL, - /* downOffset: */ 0, - /* damageOrCoinValue: */ 4, - /* health: */ 1, - /* numLootCoins: */ 1, - /* radius: */ 50, - /* height: */ 50, - /* hurtboxRadius: */ 50, - /* hurtboxHeight: */ 50, + .interactType = INTERACT_KOOPA_SHELL, + .downOffset = 0, + .damageOrCoinValue = 4, + .health = 1, + .numLootCoins = 1, + .radius = 50, + .height = 50, + .hurtboxRadius = 50, + .hurtboxHeight = 50, }; -void shell_despawn(void) { - if (o->oTimer > 300) obj_flicker_and_disappear(o, 300); +void check_shell_despawn(void) { + if (o->parentObj->behavior == segmented_to_virtual(bhvExclamationBox) + && o->oTimer > 300) { + obj_flicker_and_disappear(o, 300); + } } void koopa_shell_spawn_water_drop(void) { @@ -77,7 +80,7 @@ void bhv_koopa_shell_loop(void) { o->oFaceAngleYaw += 0x1000; cur_obj_move_standard(-20); koopa_shell_spawn_sparkles(10.0f); - shell_despawn(); + check_shell_despawn(); break; case KOOPA_SHELL_ACT_MARIO_RIDING: