Bugfix: Change instant warps to use ints instead of shorts (#500)

Additionally clean up some inconsistencies surrounding instant warps
This commit is contained in:
Gregory Heskett
2022-09-30 18:41:58 -04:00
committed by GitHub
parent 8c56afddba
commit da4b4db7ae
4 changed files with 14 additions and 13 deletions

View File

@@ -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)

View File

@@ -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))

View File

@@ -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;

View File

@@ -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 {