From 33fa7013b057aaaa793a21ab868c08ac4ffbcdf0 Mon Sep 17 00:00:00 2001 From: Mineqwerty Date: Sat, 4 Sep 2021 20:27:21 -0400 Subject: [PATCH] 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 b3a2816bd..6e2a06028 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 c823b1a9e..2b4bc9a5e 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 3298ef98d..a6b7c99c7 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 c72b60cf5..241d3c832 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 ab658eaff..5bf056bf9 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