From 33fa7013b057aaaa793a21ab868c08ac4ffbcdf0 Mon Sep 17 00:00:00 2001 From: Mineqwerty Date: Sat, 4 Sep 2021 20:27:21 -0400 Subject: [PATCH 1/4] Added a level script function to easily set a skybox for each area In your level script add the function CHANGE_AREA_SKYBOX(Area ID, Skybox Segment Start, Skybox Segment End) . --- include/level_commands.h | 6 ++++++ src/engine/level_script.c | 8 ++++++++ src/game/area.c | 7 +++++-- src/game/game_init.c | 2 ++ src/game/game_init.h | 2 ++ 5 files changed, 23 insertions(+), 2 deletions(-) diff --git a/include/level_commands.h b/include/level_commands.h index b3a2816b..6e2a0602 100644 --- a/include/level_commands.h +++ b/include/level_commands.h @@ -190,6 +190,12 @@ CMD_PTR(romEnd) #endif +#define CHANGE_AREA_SKYBOX(area, segStart, segEnd) \ + CMD_BBH(0x3D, 0x0C, area), \ + CMD_PTR(segStart), \ + CMD_PTR(segEnd) + + #define INIT_LEVEL() \ CMD_BBH(0x1B, 0x04, 0x0000) diff --git a/src/engine/level_script.c b/src/engine/level_script.c index c823b1a9..2b4bc9a5 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -303,6 +303,13 @@ static void level_cmd_load_yay0_texture(void) { sCurrentCmd = CMD_NEXT; } +static void level_cmd_change_area_skybox(int area, u8 *start, u8 *end) { + u8 areaCheck = CMD_GET(s16, 2); + gAreaSkyboxStart[areaCheck-1] = CMD_GET(void *, 4); + gAreaSkyboxEnd[areaCheck-1] = CMD_GET(void *, 8); + sCurrentCmd = CMD_NEXT; +} + static void level_cmd_init_level(void) { init_graph_node_start(NULL, (struct GraphNodeStart *) &gObjParentGraphNode); clear_objects(); @@ -819,6 +826,7 @@ static void (*LevelScriptJumpTable[])(void) = { /*3A*/ level_cmd_3A, /*3B*/ level_cmd_create_whirlpool, /*3C*/ level_cmd_get_or_set_var, + /*3D*/ level_cmd_change_area_skybox, }; struct LevelCommand *level_script_execute(struct LevelCommand *cmd) { diff --git a/src/game/area.c b/src/game/area.c index 3298ef98..a6b7c99c 100644 --- a/src/game/area.c +++ b/src/game/area.c @@ -225,7 +225,7 @@ void load_area(s32 index) { if (gCurrentArea == NULL && gAreaData[index].unk04 != NULL) { gCurrentArea = &gAreaData[index]; gCurrAreaIndex = gCurrentArea->index; - + if (gCurrentArea->terrainData != NULL) { load_area_terrain(index, gCurrentArea->terrainData, gCurrentArea->surfaceRooms, gCurrentArea->macroObjects); @@ -236,7 +236,7 @@ void load_area(s32 index) { } load_obj_warp_nodes(); - geo_call_global_function_nodes(&gCurrentArea->unk04->node, GEO_CONTEXT_AREA_LOAD); + geo_call_global_function_nodes(&gCurrentArea->unk04->node, GEO_CONTEXT_AREA_LOAD); } } @@ -259,6 +259,9 @@ void load_mario_area(void) { gCurrentArea->flags |= 0x01; spawn_objects_from_info(0, gMarioSpawnInfo); } + if (gAreaSkyboxStart[gCurrAreaIndex-1]) { + load_segment_decompress(0x0A, gAreaSkyboxStart[gCurrAreaIndex-1], gAreaSkyboxEnd[gCurrAreaIndex-1]); + } } void unload_mario_area(void) { diff --git a/src/game/game_init.c b/src/game/game_init.c index c72b60cf..241d3c83 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -66,6 +66,8 @@ u8 gIsConsole; #ifdef WIDE u8 gWidescreen; #endif +u8 *gAreaSkyboxStart[7]; +u8 *gAreaSkyboxEnd[7]; u16 sCurrFBNum = 0; u16 frameBufferIndex = 0; diff --git a/src/game/game_init.h b/src/game/game_init.h index ab658eaf..5bf056bf 100644 --- a/src/game/game_init.h +++ b/src/game/game_init.h @@ -45,6 +45,8 @@ extern u8 gIsConsole; #ifdef WIDE extern u8 gWidescreen; #endif +extern u8 *gAreaSkyboxStart[7]; +extern u8 *gAreaSkyboxEnd[7]; #ifdef EEP extern s8 gEepromProbe; #endif From aa8c033e2b56498147698bd080f657f974409ebd Mon Sep 17 00:00:00 2001 From: Mineqwerty Date: Sun, 5 Sep 2021 11:00:11 -0400 Subject: [PATCH 2/4] Clear pointers + misc recommended fixes --- src/engine/level_script.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/engine/level_script.c b/src/engine/level_script.c index 2b4bc9a5..c6131953 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -315,6 +315,10 @@ static void level_cmd_init_level(void) { clear_objects(); clear_areas(); main_pool_push_state(); + for (u8 clearPointers; clearPointers < 8; clearPointers++) { + gAreaSkyboxStart[clearPointers] = 0; + gAreaSkyboxEnd[clearPointers] = 0; + } sCurrentCmd = CMD_NEXT; } From fdf375faa8deeea38239e6724d5a4eb7a612810f Mon Sep 17 00:00:00 2001 From: Mineqwerty Date: Sun, 5 Sep 2021 11:14:55 -0400 Subject: [PATCH 3/4] puppycam interference >:( --- include/level_commands.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/level_commands.h b/include/level_commands.h index e5392d27..940706a4 100644 --- a/include/level_commands.h +++ b/include/level_commands.h @@ -220,7 +220,7 @@ #endif #define CHANGE_AREA_SKYBOX(area, segStart, segEnd) \ - CMD_BBH(0x3D, 0x0C, area), \ + CMD_BBH(0x3E, 0x0C, area), \ CMD_PTR(segStart), \ CMD_PTR(segEnd) From e248621a55285bc36469b060503a893826de1db4 Mon Sep 17 00:00:00 2001 From: Mineqwerty Date: Sun, 5 Sep 2021 11:35:35 -0400 Subject: [PATCH 4/4] Added area number define, fixed undefined init value --- include/config.h | 2 ++ src/engine/level_script.c | 2 +- src/game/area.c | 2 +- src/game/game_init.c | 4 ++-- src/game/game_init.h | 4 ++-- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/config.h b/include/config.h index 4790cfa1..848112bb 100644 --- a/include/config.h +++ b/include/config.h @@ -123,6 +123,8 @@ // Visual debug enables some collision visuals. Tapping Right on the dpad will cycle between visual hitboxes, visual surfaces, both, and neither. // If puppyprint is enabled, then this can be cycled only while the screen is active. //#define VISUAL_DEBUG +// Number of supported areas per level. +#define AREA_COUNT 8 // BUG/GAME QOL FIXES // Fix instant warp offset not working when warping across different areas diff --git a/src/engine/level_script.c b/src/engine/level_script.c index 97c06e93..e656482e 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -316,7 +316,7 @@ static void level_cmd_init_level(void) { clear_objects(); clear_areas(); main_pool_push_state(); - for (u8 clearPointers; clearPointers < 8; clearPointers++) { + for (u8 clearPointers = 0; clearPointers < AREA_COUNT; clearPointers++) { gAreaSkyboxStart[clearPointers] = 0; gAreaSkyboxEnd[clearPointers] = 0; } diff --git a/src/game/area.c b/src/game/area.c index eb1b829a..ce9fefd3 100644 --- a/src/game/area.c +++ b/src/game/area.c @@ -264,7 +264,7 @@ void load_mario_area(void) { } if (gAreaSkyboxStart[gCurrAreaIndex-1]) { load_segment_decompress(0x0A, gAreaSkyboxStart[gCurrAreaIndex-1], gAreaSkyboxEnd[gCurrAreaIndex-1]); - } + } } void unload_mario_area(void) { diff --git a/src/game/game_init.c b/src/game/game_init.c index 450fe395..e081e277 100644 --- a/src/game/game_init.c +++ b/src/game/game_init.c @@ -86,8 +86,8 @@ u32 gGlobalTimer = 0; #ifdef WIDE s16 gWidescreen; #endif -u8 *gAreaSkyboxStart[7]; -u8 *gAreaSkyboxEnd[7]; +u8 *gAreaSkyboxStart[AREA_COUNT-1]; +u8 *gAreaSkyboxEnd[AREA_COUNT-1]; // Framebuffer rendering values (max 3) u16 sRenderedFramebuffer = 0; diff --git a/src/game/game_init.h b/src/game/game_init.h index 7b1a7588..0d451764 100644 --- a/src/game/game_init.h +++ b/src/game/game_init.h @@ -49,8 +49,8 @@ extern u8 gBorderHeight; #ifdef CUSTOM_DEBUG extern u8 gCustomDebugMode; #endif -extern u8 *gAreaSkyboxStart[7]; -extern u8 *gAreaSkyboxEnd[7]; +extern u8 *gAreaSkyboxStart[AREA_COUNT-1]; +extern u8 *gAreaSkyboxEnd[AREA_COUNT-1]; #ifdef EEP extern s8 gEepromProbe; #endif