diff --git a/autogen/lua_definitions/structs.lua b/autogen/lua_definitions/structs.lua index 010a7f64..111127cf 100644 --- a/autogen/lua_definitions/structs.lua +++ b/autogen/lua_definitions/structs.lua @@ -575,6 +575,7 @@ --- @field public exitCastleArea integer --- @field public exitCastleLevel LevelNum --- @field public exitCastleWarpNode integer +--- @field public skipCreditsAt LevelNum --- @field public starPositions StarPositions --- @class LinearTransitionPoint @@ -642,6 +643,7 @@ --- @field public interactObj Object --- @field public invincTimer integer --- @field public isSnoring integer +--- @field public knockbackTimer integer --- @field public marioBodyState MarioBodyState --- @field public marioObj Object --- @field public minimumBoneY number diff --git a/docs/lua/structs.md b/docs/lua/structs.md index 796b371a..a225759a 100644 --- a/docs/lua/structs.md +++ b/docs/lua/structs.md @@ -837,6 +837,7 @@ | exitCastleArea | `integer` | | | exitCastleLevel | [enum LevelNum](constants.md#enum-LevelNum) | | | exitCastleWarpNode | `integer` | | +| skipCreditsAt | [enum LevelNum](constants.md#enum-LevelNum) | | | starPositions | [StarPositions](structs.md#StarPositions) | read-only | [:arrow_up_small:](#) @@ -932,6 +933,7 @@ | interactObj | [Object](structs.md#Object) | | | invincTimer | `integer` | | | isSnoring | `integer` | | +| knockbackTimer | `integer` | | | marioBodyState | [MarioBodyState](structs.md#MarioBodyState) | | | marioObj | [Object](structs.md#Object) | | | minimumBoneY | `number` | | diff --git a/mods/sm74/camera.lua b/mods/sm74/camera.lua index 920b1142..86a39033 100644 --- a/mods/sm74/camera.lua +++ b/mods/sm74/camera.lua @@ -6,7 +6,7 @@ sOverrideCameraModes = { --[CAMERA_MODE_C_UP] = true, [CAMERA_MODE_WATER_SURFACE] = true, [CAMERA_MODE_SLIDE_HOOT] = true, - [CAMERA_MODE_INSIDE_CANNON] = true, + --[CAMERA_MODE_INSIDE_CANNON] = true, --[CAMERA_MODE_BOSS_FIGHT] = true, [CAMERA_MODE_PARALLEL_TRACKING] = true, [CAMERA_MODE_FIXED] = true, diff --git a/mods/sm74/course.lua b/mods/sm74/course.lua index ea555a2b..37376a2a 100644 --- a/mods/sm74/course.lua +++ b/mods/sm74/course.lua @@ -42,7 +42,7 @@ end function course_names_swap_sm74ee() if sCourseNamesEE then return end smlua_text_utils_course_acts_replace(COURSE_BOB, " 1 DEVIL'S DICE", "LITTLE WARM-UP", "LET'S-A-GO!", "SCALE THE TOWER", "FUNDAMENTAL TUNNEL PROBLEMS", "FIRST RED KATASTROPHE", "YOU WON'T FIND ME!") - smlua_text_utils_course_acts_replace(COURSE_WF, " 2 VIRUSVINE VERANDA", "THE VINE'S TREASURE", "TIME PRESSURE TRAVEL", "ON TOP OF THAT WALL!", "JUMPING-PARCOUR 1", "JUMPING-PARCOUR 2", "LIGHT RED COINS") + smlua_text_utils_course_acts_replace(COURSE_WF, " 2 VIRUSVINE VERANDA", "THE VINE'S TREASURE", "TIME PRESSURE TRAVEL", "ON TOP OF THAT WALL!", "JUMPING-PARCOUR 1", "JUMPING-PARCOUR 2", "LIGHT RED COINS") smlua_text_utils_course_acts_replace(COURSE_JRB, " 3 DEEPRED DEPTHS", "THE UPPER END OF THE CRATER", "SMALL PILLAR TRAINING", "HOT STEP STONES", "DEEP WITHIN THE VOLCANO", "ARTISTIC COIN SEARCH", "PAINFUL EXPERIENCE") smlua_text_utils_course_acts_replace(COURSE_CCM, " 4 SYSTEM OF A DOWNTOWN", "GHOST ODYSSEE", "GUARDIAN OF THE VILLAGE", "EXPANDED SECRET ROOM", "DEATH PIT", "SO CLOSE AND YET SO FAR AWAY", "HIDDEN COWARD") smlua_text_utils_course_acts_replace(COURSE_BBH, " 5 DROWNED FACTORY", "PEARL DIVER", "THE TUNNEL LABYRINTH PART 1", "THE TUNNEL LABYRINTH PART 2", "THE TUNNEL LABYRINTH PART 3", "THE TUNNEL LABYRINTH PART 4", "THE TUNNEL LABYRINTH PART 5") @@ -50,23 +50,23 @@ function course_names_swap_sm74ee() smlua_text_utils_course_acts_replace(COURSE_LLL, " 7 MELTING ICECRYSTAL-TOWER", "BRICK BATTLE", "FLOATATION IN BLOCK FORM", "SOUL OF A CLIMBER", "BLOOR-RED FINANCES", "ANNOYING SEARCH", "UNJUSTIFIABLE SEARCH") smlua_text_utils_course_acts_replace(COURSE_SSL, " 8 OVERGROWN OASIS", "STILL UNDER CONSTRUCTION", "FLOOD LANDING STAGE", "NOT SO SECRET SECRET ANYMORE", "DOUBTFUL PYRAMID", "HIDDEN HERMIT", "YOU SHALL DROWN!") smlua_text_utils_course_acts_replace(COURSE_DDD, " 9 FIREFLOWER FIELDS", "ANOTHER REMATCH WITH KING BOB-OMB", "WINDY MILL", "WAY TOO EASY COINS", "THE UNSTABLE WOODEN CONSTRUCTION", "NOT SO SECRET CAVERN", "BARK BEETLE JUMPS") - smlua_text_utils_course_acts_replace(COURSE_SL, "10 BREEZING BEACH", "SECRET OF THE SMARAGDS", "HOT POLE-DANCE", "SOMEWHERE IN THE NOWHERE", "NOWHERE IN THE SOMEWHERE", "COLD TOMB", "HEMOGLOBIN-COINS") + smlua_text_utils_course_acts_replace(COURSE_SL, "10 BREEZING BEACH", "SECRET OF THE SMARAGDS", "HOT POLE-DANCE", "SOMEWHERE IN THE NOWHERE", "NOWHERE IN THE SOMEWHERE", "COLD TOMB", "HEMOGLOBIN-COINS") smlua_text_utils_course_acts_replace(COURSE_WDW, "11 DRIED-OUT DEAD DESERT", "BURNING FEET", "AIRY STORED COINS", "THE OLD HIDEOUT", "GRAVE DIGGER", "CEMETARY ARTISTICS", "THE SAND PLATEAU'S TORTURE") smlua_text_utils_course_acts_replace(COURSE_TTM, "12 CLIFF OF PAIN", "MOVE YOUR BUTT UP THERE!", "WAY TOO HIGH", "ANOTHER PROBLEMATIC BOX", "HEAVE-HO CAVE", "YOU-CAN-GUESS-WHICH COINS", "BRAZENLY PLACED") smlua_text_utils_course_acts_replace(COURSE_THI, "13 ACID PEAKS", "WELCOME TO THE ACID SWAMP", "EYE TO EYE", "ACIDPROOF BOXES", "IN THE BIG CAVE", "ANOTHER CLIMBING CHALLENGE", "LAVA-COLORED GLITTER") smlua_text_utils_course_acts_replace(COURSE_TTC, "14 VENENO SPHERE", "THE SAME PLACE IN A WORSE WORLD", "THROUGH THE HEART OF THE WORLD", "THE EDGE OF THE WORLD", "THE ROOF OF THE WORLD", "WORLDWIDE PAIN", "BLOODRED COINS OF RUINATION") - smlua_text_utils_course_acts_replace(COURSE_RR, "15 CRUDELO SPHERE", "THE NIGHTMARE BEGINS", "JUST GO CRAZY", "STRAIGHT FROM HELL", "TRAUMATISING EXPERIENCE", "MORBID DEADLY PUZZLE", "BLOODY SCREAM OF RAGE") + smlua_text_utils_course_acts_replace(COURSE_RR, "15 CRUDELO SPHERE", "THE NIGHTMARE BEGINS", "JUST GO CRAZY", "STRAIGHT FROM HELL", "TRAUMATISING EXPERIENCE", "MORBID DEADLY PUZZLE", "BLOODY SCREAM OF RAGE") - smlua_text_utils_secret_star_replace(15, " BOWSER'S BEAUTIFUL BACKYARD") - smlua_text_utils_secret_star_replace(16, " BOWSER'S QUICKSAND PIT") - smlua_text_utils_secret_star_replace(17, " ZTAR ZANCTUARY") - smlua_text_utils_secret_star_replace(18, " OLD SUPPLY SLIDE") - smlua_text_utils_secret_star_replace(19, " TOXIC TERRACE") - smlua_text_utils_secret_star_replace(20, " DEVIL'S PIT") - smlua_text_utils_secret_star_replace(21, " DUST DESTINATION") - smlua_text_utils_secret_star_replace(22, " LAKE OF THE LORDS") - smlua_text_utils_secret_star_replace(23, " TRIARC-BRIDGE") - smlua_text_utils_secret_star_replace(24, "") + smlua_text_utils_secret_star_replace(COURSE_BITDW, " BOWSER'S BEAUTIFUL BACKYARD") + smlua_text_utils_secret_star_replace(COURSE_BITFS, " BOWSER'S QUICKSAND PIT") + smlua_text_utils_secret_star_replace(COURSE_BITS, " ZTAR ZANCTUARY") + smlua_text_utils_secret_star_replace(COURSE_PSS, " OLD SUPPLY SLIDE") + smlua_text_utils_secret_star_replace(COURSE_COTMC, " TOXIC TERRACE") + smlua_text_utils_secret_star_replace(COURSE_TOTWC, " DEVIL'S PIT") + smlua_text_utils_secret_star_replace(COURSE_VCUTM, " DUST DESTINATION") + smlua_text_utils_secret_star_replace(COURSE_WMOTR, " LAKE OF THE LORDS") + smlua_text_utils_secret_star_replace(COURSE_SA, " TRIARC-BRIDGE") + smlua_text_utils_secret_star_replace(COURSE_CAKE_END, "") smlua_text_utils_castle_secret_stars_replace(" BONUSSTARS") smlua_text_utils_extra_text_replace(0, "BONUS STAR") diff --git a/mods/sm74/levels/level_sl_entry.lvl b/mods/sm74/levels/level_sl_entry.lvl index d86b0ff2..33cb6c37 100644 Binary files a/mods/sm74/levels/level_sl_entry.lvl and b/mods/sm74/levels/level_sl_entry.lvl differ diff --git a/mods/sm74/main.lua b/mods/sm74/main.lua index 0b2cc635..8112676f 100644 --- a/mods/sm74/main.lua +++ b/mods/sm74/main.lua @@ -9,6 +9,7 @@ gLevelValues.entryLevel = LEVEL_CASTLE_COURTYARD gLevelValues.exitCastleLevel = LEVEL_CASTLE_COURTYARD gLevelValues.exitCastleWarpNode = 0x40 +gLevelValues.skipCreditsAt = LEVEL_BOB --------------------- -- behavior values -- diff --git a/src/game/behaviors/koopa.inc.c b/src/game/behaviors/koopa.inc.c index b0533cf0..055db242 100644 --- a/src/game/behaviors/koopa.inc.c +++ b/src/game/behaviors/koopa.inc.c @@ -871,11 +871,11 @@ static void koopa_the_quick_act_after_race(void) { } } else if (o->parentObj->oKoopaRaceEndpointRaceStatus != 0) { if (o->oKoopaTheQuickRaceIndex == 0) { - f32* starPos = gLevelValues.starPositions.KoopaBobStarPos; - spawn_default_star(starPos[0], starPos[1], starPos[2]); + f32* starPos = gLevelValues.starPositions.KoopaBobStarPos; + spawn_default_star(starPos[0], starPos[1], starPos[2]); } else { - f32* starPos = gLevelValues.starPositions.KoopaThiStarPos; - spawn_default_star(starPos[0], starPos[1], starPos[2]); + f32* starPos = gLevelValues.starPositions.KoopaThiStarPos; + spawn_default_star(starPos[0], starPos[1], starPos[2]); } o->parentObj->oKoopaRaceEndpointRaceStatus = 0; diff --git a/src/game/hardcoded.c b/src/game/hardcoded.c index e41510bb..7e24c7f4 100644 --- a/src/game/hardcoded.c +++ b/src/game/hardcoded.c @@ -42,6 +42,7 @@ struct LevelValues gLevelValues = { .exitCastleLevel = LEVEL_CASTLE, .exitCastleArea = 1, .exitCastleWarpNode = 0x1F, + .skipCreditsAt = (LEVEL_MAX+1), .starPositions = { .KoopaBobStarPos = { 3030.0f, 4500.0f, -4600.0f }, .KoopaThiStarPos = { 7100.0f, -1300.0f, -6000.0f }, diff --git a/src/game/hardcoded.h b/src/game/hardcoded.h index 3a29cf2e..1ebf69a7 100644 --- a/src/game/hardcoded.h +++ b/src/game/hardcoded.h @@ -41,6 +41,7 @@ struct LevelValues { enum LevelNum exitCastleLevel; s16 exitCastleArea; u8 exitCastleWarpNode; + enum LevelNum skipCreditsAt; struct StarPositions starPositions; }; diff --git a/src/game/level_update.c b/src/game/level_update.c index b35a0357..62437bf8 100644 --- a/src/game/level_update.c +++ b/src/game/level_update.c @@ -573,6 +573,11 @@ void warp_credits(void) { gCurrCreditsEntry = &sCreditsSequence[0]; } + if ((gCurrCreditsEntry != NULL) && (gCurrCreditsEntry->levelNum == gLevelValues.skipCreditsAt)) { + lvl_skip_credits(); + return; + } + for (s32 i = 0; i < MAX_PLAYERS; i++) { vec3s_set(gPlayerSpawnInfos[i].startPos, gCurrCreditsEntry->marioPos[0], gCurrCreditsEntry->marioPos[1], gCurrCreditsEntry->marioPos[2]); @@ -967,26 +972,36 @@ void initiate_delayed_warp(void) { case WARP_OP_CREDITS_START: gCurrCreditsEntry = &sCreditsSequence[0]; - // instance players in the credits - gCurrActStarNum = 99; - gCurrActNum = 99; - initiate_warp(gCurrCreditsEntry->levelNum, gCurrCreditsEntry->areaIndex, - WARP_NODE_CREDITS_START, 0); + + if ((gCurrCreditsEntry != NULL) && (gCurrCreditsEntry->levelNum == gLevelValues.skipCreditsAt)) { + lvl_skip_credits(); + } else { + // instance players in the credits + gCurrActStarNum = 99; + gCurrActNum = 99; + initiate_warp(gCurrCreditsEntry->levelNum, gCurrCreditsEntry->areaIndex, + WARP_NODE_CREDITS_START, 0); + } break; case WARP_OP_CREDITS_NEXT: sound_banks_disable(SEQ_PLAYER_SFX, SOUND_BANKS_ALL); gCurrCreditsEntry += 1; - gCurrActNum = gCurrCreditsEntry->unk02 & 0x07; - if ((gCurrCreditsEntry + 1)->levelNum == LEVEL_NONE) { - destWarpNode = WARP_NODE_CREDITS_END; - } else { - destWarpNode = WARP_NODE_CREDITS_NEXT; - } - initiate_warp(gCurrCreditsEntry->levelNum, gCurrCreditsEntry->areaIndex, - destWarpNode, 0); + if ((gCurrCreditsEntry != NULL) && (gCurrCreditsEntry->levelNum == gLevelValues.skipCreditsAt)) { + lvl_skip_credits(); + } else { + gCurrActNum = gCurrCreditsEntry->unk02 & 0x07; + if ((gCurrCreditsEntry + 1)->levelNum == LEVEL_NONE) { + destWarpNode = WARP_NODE_CREDITS_END; + } else { + destWarpNode = WARP_NODE_CREDITS_NEXT; + } + + initiate_warp(gCurrCreditsEntry->levelNum, gCurrCreditsEntry->areaIndex, + destWarpNode, 0); + } break; default: @@ -1566,3 +1581,12 @@ void fake_lvl_init_from_save_file(void) { gChangeLevel = gLevelValues.entryLevel; } + +void lvl_skip_credits(void) { + gCurrCreditsEntry = NULL; + gCurrActStarNum = 0; + gCurrActNum = 0; + gChangeLevel = gLevelValues.entryLevel; + gMarioStates[0].health = 0x880; + play_transition(0x09, 0x14, 0x00, 0x00, 0x00); +} \ No newline at end of file diff --git a/src/game/level_update.h b/src/game/level_update.h index 3b326c4c..b746a2e7 100644 --- a/src/game/level_update.h +++ b/src/game/level_update.h @@ -160,5 +160,6 @@ void star_select_finish_selection(void); s32 lvl_exiting_credits(UNUSED s16 arg0, UNUSED s32 arg1); void fake_lvl_init_from_save_file(void); +void lvl_skip_credits(void); #endif // LEVEL_UPDATE_H diff --git a/src/game/mario.c b/src/game/mario.c index af8a4089..57fd4804 100644 --- a/src/game/mario.c +++ b/src/game/mario.c @@ -1531,12 +1531,7 @@ void update_mario_inputs(struct MarioState *m) { /* End of developer stuff */ if ((m->action == ACT_END_PEACH_CUTSCENE || m->action == ACT_CREDITS_CUTSCENE) && m->controller->buttonPressed & START_BUTTON) { - gCurrCreditsEntry = NULL; - gCurrActStarNum = 0; - gCurrActNum = 0; - gChangeLevel = gLevelValues.entryLevel; - m->health = 0x880; - play_transition(0x09, 0x14, 0x00, 0x00, 0x00); + lvl_skip_credits(); } if (m->playerIndex == 0) { diff --git a/src/pc/lua/smlua_cobject_autogen.c b/src/pc/lua/smlua_cobject_autogen.c index 57e03cff..e9bb1c86 100644 --- a/src/pc/lua/smlua_cobject_autogen.c +++ b/src/pc/lua/smlua_cobject_autogen.c @@ -666,12 +666,13 @@ static struct LuaObjectField sLakituStateFields[LUA_LAKITU_STATE_FIELD_COUNT] = { "yaw", LVT_S16, offsetof(struct LakituState, yaw), false, LOT_NONE }, }; -#define LUA_LEVEL_VALUES_FIELD_COUNT 5 +#define LUA_LEVEL_VALUES_FIELD_COUNT 6 static struct LuaObjectField sLevelValuesFields[LUA_LEVEL_VALUES_FIELD_COUNT] = { { "entryLevel", LVT_S32, offsetof(struct LevelValues, entryLevel), false, LOT_NONE }, { "exitCastleArea", LVT_S16, offsetof(struct LevelValues, exitCastleArea), false, LOT_NONE }, { "exitCastleLevel", LVT_S32, offsetof(struct LevelValues, exitCastleLevel), false, LOT_NONE }, { "exitCastleWarpNode", LVT_U8, offsetof(struct LevelValues, exitCastleWarpNode), false, LOT_NONE }, + { "skipCreditsAt", LVT_S32, offsetof(struct LevelValues, skipCreditsAt), false, LOT_NONE }, { "starPositions", LVT_COBJECT, offsetof(struct LevelValues, starPositions), true, LOT_STARPOSITIONS }, }; @@ -710,7 +711,7 @@ static struct LuaObjectField sMarioBodyStateFields[LUA_MARIO_BODY_STATE_FIELD_CO { "wingFlutter", LVT_S8, offsetof(struct MarioBodyState, wingFlutter), false, LOT_NONE }, }; -#define LUA_MARIO_STATE_FIELD_COUNT 72 +#define LUA_MARIO_STATE_FIELD_COUNT 73 static struct LuaObjectField sMarioStateFields[LUA_MARIO_STATE_FIELD_COUNT] = { { "action", LVT_U32, offsetof(struct MarioState, action), false, LOT_NONE }, { "actionArg", LVT_U32, offsetof(struct MarioState, actionArg), false, LOT_NONE }, @@ -750,6 +751,7 @@ static struct LuaObjectField sMarioStateFields[LUA_MARIO_STATE_FIELD_COUNT] = { { "interactObj", LVT_COBJECT_P, offsetof(struct MarioState, interactObj), false, LOT_OBJECT }, { "invincTimer", LVT_S16, offsetof(struct MarioState, invincTimer), false, LOT_NONE }, { "isSnoring", LVT_U8, offsetof(struct MarioState, isSnoring), false, LOT_NONE }, + { "knockbackTimer", LVT_U8, offsetof(struct MarioState, knockbackTimer), false, LOT_NONE }, { "marioBodyState", LVT_COBJECT_P, offsetof(struct MarioState, marioBodyState), false, LOT_MARIOBODYSTATE }, { "marioObj", LVT_COBJECT_P, offsetof(struct MarioState, marioObj), false, LOT_OBJECT }, { "minimumBoneY", LVT_F32, offsetof(struct MarioState, minimumBoneY), false, LOT_NONE },