Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 17 additions & 18 deletions include/bgcheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ typedef struct ScaleRotPos {
} ScaleRotPos; // size = 0x20

// Macros for `CollisionPoly`

#define COLPOLY_NORMAL_FRAC (1.0f / SHT_MAX)
#define COLPOLY_SNORMAL(x) ((s16)((x) * SHT_MAX))
#define COLPOLY_GET_NORMAL(n) ((n)*COLPOLY_NORMAL_FRAC)
Expand All @@ -39,14 +38,14 @@ typedef struct ScaleRotPos {
#define COLPOLY_VTX_INDEX(vI) ((vI) & 0x1FFF)
#define COLPOLY_VTX(vtxId, flags) ((((flags) & 7) << 13) | ((vtxId) & 0x1FFF))

// flags for flags_vIA
// flags for variable flags_vIA
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

did you mean "struct member" or just "member" instead of "variable" (I think it was fine as is in main)

// poly exclusion flags (xpFlags)
#define COLPOLY_IGNORE_NONE 0
#define COLPOLY_IGNORE_CAMERA (1 << 0)
#define COLPOLY_IGNORE_ENTITY (1 << 1)
#define COLPOLY_IGNORE_PROJECTILES (1 << 2)

// flags for flags_vIB
// flags for variable flags_vIB
#define COLPOLY_IS_FLOOR_CONVEYOR (1 << 0)

typedef struct CollisionPoly {
Expand Down Expand Up @@ -87,23 +86,23 @@ typedef struct BgCamFuncData {
} BgCamFuncData; // size = 0x12

// Macros for `WaterBox.properties`
#define WATERBOX_PROPERTIES(bgCamIndex, lightIndex, roomIndex, isDisabled) \
((((bgCamIndex) & 0xFF) << 0) | \
(((lightIndex) & 0x1F) << 8) | \
(((roomIndex) & 0x3F) << 13) | \
(((isDisabled) & 1) << 19))

#define WATERBOX_LIGHT_INDEX_NONE 0x1F // warns and defaults to 0

#define WATERBOX_ROOM(properties) (((properties) >> 13) & 0x3F)
#define WATERBOX_LIGHT_INDEX_NONE 0x1F // Generates warning when built for debug and defaults to 0
#define WATERBOX_ROOM(properties) (((properties) >> 13) & 0x3F) // retrieves the room the waterbox is active in
#define WATERBOX_ROOM_ALL 0x3F // value for "room index" indicating "all rooms"

#define WATERBOX_FLAG_19 (1 << 19)

#define WATERBOX_PROPERTIES(bgCamIndex, lightIndex, room, setFlag19) \
((((bgCamIndex) & 0xFF) << 0) | \
(((lightIndex) & 0x1F) << 8) | \
(((room) & 0x3F) << 13) | \
(((setFlag19) & 1) << 19))
/* The true purpose of the flag is unknown. The state is never enabled on any waterbox, and functions that
* pass on flag enabled are never called, so there is no direct usecase context. */
#define WATERBOX_IS_DISABLED (1 << 19) // Disables waterbox collision
Comment on lines +99 to +101
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

where does the name come from then?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So in functions BgCheck_GetWaterSurface and BgCheck_FindWaterBox, the search routines will skip over a WaterBox with the flag set, and since these are the only two functions in use that process WaterBoxes, the flag basically "disables" them. WATERBOX_IS_DISABLED makes sense here.

However, my concern is that WATERBOX_IS_DISABLED could potentially be incorrect based on the context in which it's used in func_800425B0.

func_800425B0 has the same arguments as BgCheck_GetWaterSurface and performs the same search, except the one difference is that it now only selects WaterBoxes with the flag set. To me it's a really odd design and makes me believe that there was some other purpose for this flag. Like, one potential possibility that I have zero evidence of would be to have a flag turning water into lava, as those two things would be something that could share the same basic properties (e.g. flat, you'd want to know the surface height) but you would want to exclude from one another.

So in short, I opted to choose a name that make sense within the scope of what we know now, but added a comment to highlight that the assumption could potentially be incorrect, because again, never used.

Copy link
Copy Markdown
Collaborator

@Dragorn421 Dragorn421 Apr 11, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see. The comment game me the wrong impression that the flag was entirely unused outside of unused code

Maybe:

Suggested change
/* The true purpose of the flag is unknown. The state is never enabled on any waterbox, and functions that
* pass on flag enabled are never called, so there is no direct usecase context. */
#define WATERBOX_IS_DISABLED (1 << 19) // Disables waterbox collision
/* The original intended purpose of this flag may not be disabling a waterbox. See func_800425B0 (unused) which by contrast only considers waterboxes with this flag set. */
#define WATERBOX_IS_DISABLED (1 << 19) // Disables waterbox collision

+ formatting


typedef struct WaterBox {
/* 0x00 */ s16 xMin;
/* 0x02 */ s16 ySurface;
/* 0x02 */ s16 ySurface; // Water is effectively infinitely deep.
/* 0x04 */ s16 zMin;
/* 0x06 */ s16 xLength;
/* 0x08 */ s16 zLength;
Expand Down Expand Up @@ -458,11 +457,11 @@ s32 SurfaceType_IsFloorConveyor(CollisionContext* colCtx, CollisionPoly* poly, s
u32 SurfaceType_GetConveyorSpeed(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
u32 SurfaceType_GetConveyorDirection(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
u32 func_80042108(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId);
s32 WaterBox_GetSurface1(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface,
WaterBox** outWaterBox);
s32 WaterBox_GetSurface2(struct PlayState* play, CollisionContext* colCtx, Vec3f* pos, f32 surfaceChkDist,
s32 BgCheck_GetWaterSurfaceAllHack(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* y,
WaterBox** outWaterBox);
s32 BgCheck_FindWaterBox(struct PlayState* play, CollisionContext* colCtx, Vec3f* pos, f32 surfaceChkDist,
WaterBox** outWaterBox);
s32 WaterBox_GetSurfaceImpl(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface,
s32 BgCheck_GetWaterSurface(struct PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* outWaterSurface,
WaterBox** outWaterBox);
u32 WaterBox_GetBgCamIndex(CollisionContext* colCtx, WaterBox* waterBox);
u16 WaterBox_GetBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox);
Expand Down
4 changes: 2 additions & 2 deletions src/code/z_actor.c
Original file line number Diff line number Diff line change
Expand Up @@ -1484,8 +1484,8 @@ void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight,
sp64.y = actor->prevPos.y;
func_8002E2AC(play, actor, &sp64, flags);
waterBoxYSurface = actor->world.pos.y;
if (WaterBox_GetSurface1(play, &play->colCtx, actor->world.pos.x, actor->world.pos.z, &waterBoxYSurface,
&waterBox)) {
if (BgCheck_GetWaterSurfaceAllHack(play, &play->colCtx, actor->world.pos.x, actor->world.pos.z,
&waterBoxYSurface, &waterBox)) {
actor->depthInWater = waterBoxYSurface - actor->world.pos.y;
if (actor->depthInWater < 0.0f) {
actor->bgCheckFlags &= ~(BGCHECKFLAG_WATER | BGCHECKFLAG_WATER_TOUCH);
Expand Down
123 changes: 74 additions & 49 deletions src/code/z_bgcheck.c
Original file line number Diff line number Diff line change
Expand Up @@ -4247,7 +4247,14 @@ u32 func_80042108(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId) {
/**
* Zora's Domain WaterBox in King Zora's Room
*/
WaterBox sZorasDomainWaterBox = { -348, 877, -1746, 553, 780, 0x2104 };
WaterBox sZorasDomainWaterBox = {
-348, // xMin
877, // ySurface
-1746, // zMin
553, // xLength
780, // zLength
WATERBOX_PROPERTIES(/* bgCamIndex */ 4, /* lightIndex */ 1, /* roomIndex */ 1, /* isDisabled */ false),
};

/**
* WaterBox's effective bounding box
Expand All @@ -4260,31 +4267,38 @@ f32 sZorasDomainWaterBoxMaxY = 977.0f;
f32 sZorasDomainWaterBoxMaxZ = -967.0f;

/**
* Public. Get the water surface at point (`x`, `ySurface`, `z`). `ySurface` doubles as position y input
* returns true if point is within the xz boundaries of an active water box, else false
* `ySurface` returns the water box's surface, while `outWaterBox` returns a pointer to the WaterBox
* Get the water surface at point (`x`, `y`, `z`). `y` doubles as `outWaterSurface` result
* returns true if point is within the xz boundaries of an active WaterBox, else false
* `y` returns the WaterBox's surface
* `outWaterBox` returns a pointer to the WaterBox
*
* This performs a special case check on a custom waterbox in Zora's Domain that has a finite depth
* Otherwise, the search performed assumes waterboxes cannot overlap, as water has effectively infinite depth
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand the relation between not overlapping and having infinite depth

*/
s32 WaterBox_GetSurface1(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface,
WaterBox** outWaterBox) {
s32 BgCheck_GetWaterSurfaceAllHack(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* y,
WaterBox** outWaterBox) {
if (play->sceneId == SCENE_ZORAS_DOMAIN) {
s32 pad;

if (sZorasDomainWaterBoxMinX < x && x < sZorasDomainWaterBoxMaxX && sZorasDomainWaterBoxMinY < *ySurface &&
*ySurface < sZorasDomainWaterBoxMaxY && sZorasDomainWaterBoxMinZ < z && z < sZorasDomainWaterBoxMaxZ) {
if (sZorasDomainWaterBoxMinX < x && x < sZorasDomainWaterBoxMaxX && sZorasDomainWaterBoxMinY < *y &&
*y < sZorasDomainWaterBoxMaxY && sZorasDomainWaterBoxMinZ < z && z < sZorasDomainWaterBoxMaxZ) {
*outWaterBox = &sZorasDomainWaterBox;
*ySurface = sZorasDomainWaterBox.ySurface;
*y = sZorasDomainWaterBox.ySurface;
return true;
}
}
return WaterBox_GetSurfaceImpl(play, colCtx, x, z, ySurface, outWaterBox);
return BgCheck_GetWaterSurface(play, colCtx, x, z, y, outWaterBox);
}

/**
* Internal. Get the water surface at point (`x`, `ySurface`, `z`). `ySurface` doubles as position y input
* returns true if point is within the xz boundaries of an active water box, else false
* `ySurface` returns the water box's surface, while `outWaterBox` returns a pointer to the WaterBox
* Get the water surface at point (`x`, `z`).
* returns true if point is within the xz boundaries of an active WaterBox, else false
* `outWaterSurface` returns the WaterBox's surface
* `outWaterBox` returns a pointer to the WaterBox
*
* The search performed assumes waterboxes cannot overlap, as water has effectively infinite depth
*/
s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface,
s32 BgCheck_GetWaterSurface(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* outWaterSurface,
WaterBox** outWaterBox) {
CollisionHeader* colHeader = colCtx->colHeader;
s32 room;
Expand All @@ -4296,28 +4310,31 @@ s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f3

for (waterBox = colHeader->waterBoxes; waterBox < colHeader->waterBoxes + colHeader->numWaterBoxes; waterBox++) {
room = WATERBOX_ROOM(waterBox->properties);
if (room == play->roomCtx.curRoom.num || room == WATERBOX_ROOM_ALL) {
if (!(waterBox->properties & WATERBOX_FLAG_19)) {
if (waterBox->xMin < x && x < waterBox->xMin + waterBox->xLength) {
if (waterBox->zMin < z && z < waterBox->zMin + waterBox->zLength) {
*outWaterBox = waterBox;
*ySurface = waterBox->ySurface;
return true;
}
}
if (room != play->roomCtx.curRoom.num && room != WATERBOX_ROOM_ALL) {
continue;
}
if (waterBox->properties & WATERBOX_IS_DISABLED) {
continue;
}
//! @bug: WaterBox bounds check issue.
if (waterBox->xMin < x && x < waterBox->xMin + waterBox->xLength) {
Comment on lines +4319 to +4320
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

did you forget to add details here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yep, I only added it in MM woops.

if (waterBox->zMin < z && z < waterBox->zMin + waterBox->zLength) {
*outWaterBox = waterBox;
*outWaterSurface = waterBox->ySurface;
return true;
}
}
}
return false;
}

/**
* Gets the first active WaterBox at `pos` with WATERBOX_FLAG_19 not set
* Gets the first active WaterBox at `pos`, within +- `surfaceChkDist`
* `surfaceChkDist` is the absolute y distance from the water surface to check
* returns the index of the waterbox found, or -1 if no waterbox is found
* `outWaterBox` returns the pointer to the waterbox found, or NULL if none is found
*/
s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos, f32 surfaceChkDist,
s32 BgCheck_FindWaterBox(PlayState* play, CollisionContext* colCtx, Vec3f* pos, f32 surfaceChkDist,
WaterBox** outWaterBox) {
CollisionHeader* colHeader = colCtx->colHeader;
s32 room;
Expand All @@ -4334,16 +4351,18 @@ s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos,
waterBox = &colHeader->waterBoxes[i];

room = WATERBOX_ROOM(waterBox->properties);
if (room == play->roomCtx.curRoom.num || room == WATERBOX_ROOM_ALL) {
if (!(waterBox->properties & WATERBOX_FLAG_19)) {
if (waterBox->xMin < pos->x && pos->x < waterBox->xMin + waterBox->xLength) {
if (waterBox->zMin < pos->z && pos->z < waterBox->zMin + waterBox->zLength) {
if (pos->y - surfaceChkDist < waterBox->ySurface &&
waterBox->ySurface < pos->y + surfaceChkDist) {
*outWaterBox = waterBox;
return i;
}
}
if (room != play->roomCtx.curRoom.num && room != WATERBOX_ROOM_ALL) {
continue;
}
if (waterBox->properties & WATERBOX_IS_DISABLED) {
continue;
}
//! @bug: WaterBox bounds check issue. See BgCheck_GetWaterSurface for more details.
if ((waterBox->xMin < pos->x) && (pos->x < waterBox->xMin + waterBox->xLength)) {
if ((waterBox->zMin < pos->z) && (pos->z < waterBox->zMin + waterBox->zLength)) {
if (pos->y - surfaceChkDist < waterBox->ySurface && waterBox->ySurface < pos->y + surfaceChkDist) {
*outWaterBox = waterBox;
return i;
}
}
}
Expand Down Expand Up @@ -4386,12 +4405,15 @@ u32 WaterBox_GetLightIndex(CollisionContext* colCtx, WaterBox* waterBox) {
}

/**
* Get the water surface at point (`x`, `ySurface`, `z`). `ySurface` doubles as position y input
* same as WaterBox_GetSurfaceImpl, but tests if WATERBOX_FLAG_19 is set
* returns true if point is within the xz boundaries of an active water box, else false
* `ySurface` returns the water box's surface, while `outWaterBox` returns a pointer to the WaterBox
* Unused. Gets the water surface? at point (`x`, `z`) for disabled? waterboxes only.
* returns true if point is within the xz boundaries of a disabled? WaterBox, else false
* `outWaterSurface` returns the WaterBox's surface
* `outWaterBox` returns a pointer to the WaterBox
*
* The search performed assumes waterboxes cannot overlap
*/
s32 func_800425B0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* ySurface, WaterBox** outWaterBox) {
s32 func_800425B0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* outWaterSurface,
WaterBox** outWaterBox) {
CollisionHeader* colHeader = colCtx->colHeader;
s32 room;
WaterBox* waterBox;
Expand All @@ -4402,15 +4424,18 @@ s32 func_800425B0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32*

for (waterBox = colHeader->waterBoxes; waterBox < colHeader->waterBoxes + colHeader->numWaterBoxes; waterBox++) {
room = WATERBOX_ROOM(waterBox->properties);
if ((room == play->roomCtx.curRoom.num) || (room == WATERBOX_ROOM_ALL)) {
if (waterBox->properties & WATERBOX_FLAG_19) {
if (waterBox->xMin < x && x < (waterBox->xMin + waterBox->xLength)) {
if (waterBox->zMin < z && z < (waterBox->zMin + waterBox->zLength)) {
*outWaterBox = waterBox;
*ySurface = waterBox->ySurface;
return true;
}
}
if ((room != play->roomCtx.curRoom.num) && (room != WATERBOX_ROOM_ALL)) {
continue;
}
if (!(waterBox->properties & WATERBOX_IS_DISABLED)) {
continue;
}
//! @bug: WaterBox bounds check issue. See BgCheck_GetWaterSurface for more details.
if (waterBox->xMin < x && x < (waterBox->xMin + waterBox->xLength)) {
if (waterBox->zMin < z && z < (waterBox->zMin + waterBox->zLength)) {
*outWaterBox = waterBox;
*outWaterSurface = waterBox->ySurface;
return true;
}
}
}
Expand Down
7 changes: 4 additions & 3 deletions src/code/z_camera.c
Original file line number Diff line number Diff line change
Expand Up @@ -685,8 +685,8 @@ s32 Camera_GetWaterBoxBgCamIndex(Camera* camera, f32* waterY) {
playerPosRot = Actor_GetWorldPosShapeRot(&camera->player->actor);
*waterY = playerPosRot.pos.y;

if (!WaterBox_GetSurface1(camera->play, &camera->play->colCtx, playerPosRot.pos.x, playerPosRot.pos.z, waterY,
&waterBox)) {
if (!BgCheck_GetWaterSurfaceAllHack(camera->play, &camera->play->colCtx, playerPosRot.pos.x, playerPosRot.pos.z,
waterY, &waterBox)) {
// player's position is not within the x/z boundaries of a water box.
*waterY = BGCHECK_Y_MIN;
return -1;
Expand Down Expand Up @@ -722,7 +722,8 @@ f32 Camera_GetWaterSurface(Camera* camera, Vec3f* chkPos, s32* lightIndex) {
playerPosRot = Actor_GetWorldPosShapeRot(&camera->player->actor);
waterY = playerPosRot.pos.y;

if (!WaterBox_GetSurface1(camera->play, &camera->play->colCtx, chkPos->x, chkPos->z, &waterY, &waterBox)) {
if (!BgCheck_GetWaterSurfaceAllHack(camera->play, &camera->play->colCtx, chkPos->x, chkPos->z, &waterY,
&waterBox)) {
// chkPos is not within the x/z boundaries of a water box.
return BGCHECK_Y_MIN;
}
Expand Down
4 changes: 2 additions & 2 deletions src/code/z_play.c
Original file line number Diff line number Diff line change
Expand Up @@ -1974,8 +1974,8 @@ s32 func_800C0DB4(PlayState* this, Vec3f* pos) {

waterSurfacePos = *pos;

if (WaterBox_GetSurface1(this, &this->colCtx, waterSurfacePos.x, waterSurfacePos.z, &waterSurfacePos.y,
&waterBox) == true &&
if (BgCheck_GetWaterSurfaceAllHack(this, &this->colCtx, waterSurfacePos.x, waterSurfacePos.z, &waterSurfacePos.y,
&waterBox) == true &&
pos->y < waterSurfacePos.y &&
BgCheck_EntityRaycastDown3(&this->colCtx, &poly, &bgId, &waterSurfacePos) != BGCHECK_Y_MIN) {
return true;
Expand Down
4 changes: 2 additions & 2 deletions src/overlays/actors/ovl_En_Bom_Chu/z_en_bom_chu.c
Original file line number Diff line number Diff line change
Expand Up @@ -465,8 +465,8 @@ void EnBomChu_Update(Actor* thisx, PlayState* play2) {

waterY = this->actor.world.pos.y;

if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &waterY,
&waterBox)) {
if (BgCheck_GetWaterSurfaceAllHack(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z,
&waterY, &waterBox)) {
this->actor.depthInWater = waterY - this->actor.world.pos.y;

if (this->actor.depthInWater < 0.0f) {
Expand Down
2 changes: 1 addition & 1 deletion src/overlays/actors/ovl_En_Fr/z_en_fr.c
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,7 @@ void EnFr_IsDivingIntoWater(EnFr* this, PlayState* play) {
WaterBox* waterBox;
f32 waterSurface;

if (WaterBox_GetSurfaceImpl(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &waterSurface,
if (BgCheck_GetWaterSurface(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &waterSurface,
&waterBox)) {
this->isBelowWaterSurfacePrevious = this->isBelowWaterSurfaceCurrent;
this->isBelowWaterSurfaceCurrent = this->actor.world.pos.y <= waterSurface ? true : false;
Expand Down
2 changes: 1 addition & 1 deletion src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ s32 EnGoroiwa_MoveDownToNextWaypoint(EnGoroiwa* this, PlayState* play) {
this->actor.world.pos.y = nextPointY - ((this->actor.world.pos.y - nextPointY) * 0.3f);
}
if (this->bounceCount == 0 &&
WaterBox_GetSurfaceImpl(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &ySurface,
BgCheck_GetWaterSurface(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &ySurface,
&waterBox) &&
this->actor.world.pos.y <= ySurface) {
this->stateFlags |= ENGOROIWA_IN_WATER;
Expand Down
6 changes: 3 additions & 3 deletions src/overlays/actors/ovl_En_Horse/z_en_horse.c
Original file line number Diff line number Diff line change
Expand Up @@ -2853,7 +2853,7 @@ s32 EnHorse_CalcFloorHeight(EnHorse* this, PlayState* play, Vec3f* pos, Collisio
return 1; // No floor
}

if (WaterBox_GetSurfaceImpl(play, &play->colCtx, pos->x, pos->z, &waterY, &waterBox) == 1 &&
if (BgCheck_GetWaterSurface(play, &play->colCtx, pos->x, pos->z, &waterY, &waterBox) == true &&
*floorHeight < waterY) {
return 2; // Water
}
Expand Down Expand Up @@ -2922,8 +2922,8 @@ void EnHorse_CheckFloors(EnHorse* this, PlayState* play) {
WaterBox* waterBox;
s32 pad;

if (WaterBox_GetSurfaceImpl(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &waterHeight,
&waterBox) == 1 &&
if (BgCheck_GetWaterSurface(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &waterHeight,
&waterBox) == true &&
this->actor.floorHeight < waterHeight) {
EnHorse_ObstructMovement(this, play, 1, galloping);
return;
Expand Down
5 changes: 2 additions & 3 deletions src/overlays/actors/ovl_En_Okuta/z_en_okuta.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,8 +148,7 @@ void EnOkuta_Init(Actor* thisx, PlayState* play) {
}
thisx->floorHeight =
BgCheck_EntityRaycastDown4(&play->colCtx, &thisx->floorPoly, &floorBgId, thisx, &thisx->world.pos);
//! @bug calls WaterBox_GetSurfaceImpl directly
if (!WaterBox_GetSurfaceImpl(play, &play->colCtx, thisx->world.pos.x, thisx->world.pos.z, &ySurface,
if (!BgCheck_GetWaterSurface(play, &play->colCtx, thisx->world.pos.x, thisx->world.pos.z, &ySurface,
&outWaterBox) ||
(ySurface <= thisx->floorHeight)) {
Actor_Kill(thisx);
Expand Down Expand Up @@ -595,7 +594,7 @@ void EnOkuta_Update(Actor* thisx, PlayState* play2) {
if (!(player->stateFlags1 & (PLAYER_STATE1_TALKING | PLAYER_STATE1_DEAD | PLAYER_STATE1_28 | PLAYER_STATE1_29))) {
if (this->actor.params == 0) {
EnOkuta_ColliderCheck(this, play);
if (!WaterBox_GetSurfaceImpl(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z,
if (!BgCheck_GetWaterSurface(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z,
&ySurface, &outWaterBox) ||
(ySurface < this->actor.floorHeight)) {
if (this->actor.colChkInfo.health != 0) {
Expand Down
Loading