From da4b4db7aea81a96ba7ca79933a7c006f74e07e5 Mon Sep 17 00:00:00 2001 From: Gregory Heskett Date: Fri, 30 Sep 2022 18:41:58 -0400 Subject: [PATCH] Bugfix: Change instant warps to use ints instead of shorts (#500) Additionally clean up some inconsistencies surrounding instant warps --- include/level_commands.h | 7 ++++--- include/surface_terrains.h | 6 +++++- src/engine/level_script.c | 8 ++++---- src/game/area.h | 6 +----- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/include/level_commands.h b/include/level_commands.h index 5a935f2f..4df140fd 100644 --- a/include/level_commands.h +++ b/include/level_commands.h @@ -377,9 +377,10 @@ enum GoddardScene { CMD_BBBB(destArea, destNode, flags, 0x00) #define INSTANT_WARP(index, destArea, displaceX, displaceY, displaceZ) \ - CMD_BBBB(LEVEL_CMD_CREATE_INSTANT_WARP, 0x0C, index, destArea), \ - CMD_HH(displaceX, displaceY), \ - CMD_HH(displaceZ, 0x0000) + CMD_BBBB(LEVEL_CMD_CREATE_INSTANT_WARP, 0x10, index, destArea), \ + CMD_W(displaceX), \ + CMD_W(displaceY), \ + CMD_W(displaceZ) #define LOAD_AREA(area) \ CMD_BBBB(LEVEL_CMD_LOAD_AREA, 0x04, area, 0x00) diff --git a/include/surface_terrains.h b/include/surface_terrains.h index 95b20aa3..67eb6451 100644 --- a/include/surface_terrains.h +++ b/include/surface_terrains.h @@ -227,6 +227,10 @@ enum SurfaceTypes { SURFACE_TRAPDOOR, // 0x00FF // Bowser Left trapdoor, has no action defined }; +// From Surface 0x1B to 0x1E +#define INSTANT_WARP_INDEX_START 0x00 // Equal and greater than Surface 0x1B +#define INSTANT_WARP_INDEX_STOP 0x04 // Less than Surface 0x1F + #define SURFACE_IS_NEW_WATER(cmd) (((cmd) == SURFACE_NEW_WATER) || ((cmd) == SURFACE_NEW_WATER_BOTTOM)) #define SURFACE_IS_QUICKSAND(cmd) ((((cmd) >= SURFACE_SHALLOW_QUICKSAND) && ((cmd) <= SURFACE_MOVING_QUICKSAND)) || ((cmd) == SURFACE_INSTANT_MOVING_QUICKSAND)) #define SURFACE_IS_NOT_HARD(cmd) (((cmd) != SURFACE_HARD) && !((cmd) >= SURFACE_HARD_SLIPPERY && ((cmd) <= SURFACE_HARD_NOT_SLIPPERY))) @@ -238,7 +242,7 @@ enum SurfaceTypes { #define SURFACE_IS_PAINTING_WARP_LEFT(cmd) ((((cmd) - SURFACE_PAINTING_WARP_D3 ) % 3) == 0) #define SURFACE_IS_PAINTING_WARP_MIDDLE(cmd) ((((cmd) - SURFACE_PAINTING_WARP_D4 ) % 3) == 0) #define SURFACE_IS_PAINTING_WARP_RIGHT(cmd) ((((cmd) - SURFACE_PAINTING_WARP_D5 ) % 3) == 0) -#define SURFACE_IS_INSTANT_WARP(cmd) (((cmd) >= SURFACE_INSTANT_WARP_1B) && ((cmd) <= SURFACE_INSTANT_WARP_1E)) +#define SURFACE_IS_INSTANT_WARP(cmd) (((cmd) >= SURFACE_INSTANT_WARP_1B) && ((cmd) < SURFACE_INSTANT_WARP_1B + INSTANT_WARP_INDEX_STOP)) #define SURFACE_IS_WARP(cmd) (((cmd) == SURFACE_LOOK_UP_WARP) || ((cmd) == SURFACE_WOBBLING_WARP) || SURFACE_IS_PAINTING_WARP(cmd) || SURFACE_IS_INSTANT_WARP(cmd)) #define SURFACE_IS_UNSAFE(cmd) (((cmd) == SURFACE_BURNING) || SURFACE_IS_QUICKSAND(cmd) || SURFACE_IS_WARP(cmd)) diff --git a/src/engine/level_script.c b/src/engine/level_script.c index 8256235f..bedcf448 100644 --- a/src/engine/level_script.c +++ b/src/engine/level_script.c @@ -540,12 +540,12 @@ static void level_cmd_create_instant_warp(void) { warp = gAreas[sCurrAreaIndex].instantWarps + CMD_GET(u8, 2); - warp[0].id = 1; + warp[0].id = SURFACE_INSTANT_WARP_1B + CMD_GET(u8, 2); warp[0].area = CMD_GET(u8, 3); - vec3s_set(warp[0].displacement, CMD_GET(s16, 4), - CMD_GET(s16, 6), - CMD_GET(s16, 8)); + warp[0].displacement[0] = CMD_GET(s32, 4); + warp[0].displacement[1] = CMD_GET(s32, 8); + warp[0].displacement[2] = CMD_GET(s32, 12); } sCurrentCmd = CMD_NEXT; diff --git a/src/game/area.h b/src/game/area.h index ee67169b..c9d09e72 100644 --- a/src/game/area.h +++ b/src/game/area.h @@ -20,14 +20,10 @@ struct ObjectWarpNode { /*0x08*/ struct ObjectWarpNode *next; }; -// From Surface 0x1B to 0x1E -#define INSTANT_WARP_INDEX_START 0x00 // Equal and greater than Surface 0x1B -#define INSTANT_WARP_INDEX_STOP 0x04 // Less than Surface 0x1F - struct InstantWarp { /*0x00*/ u8 id; // 0 = 0x1B / 1 = 0x1C / 2 = 0x1D / 3 = 0x1E /*0x01*/ u8 area; - /*0x02*/ Vec3s displacement; + /*0x04*/ Vec3f displacement; }; struct SpawnInfo {