Document pass on WaterBox code (#2695)

* Document pass on WaterBox code

* implement suggestions, missing comment

---------

Co-authored-by: Dragorn421 <Dragorn421@users.noreply.github.com>
This commit is contained in:
mzxrules
2026-08-31 12:46:13 -04:00
committed by GitHub
parent 6bc695cc14
commit 176a0bc02a
17 changed files with 136 additions and 109 deletions
+17 -18
View File
@@ -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)
@@ -87,23 +86,23 @@ typedef struct BgCamFuncData {
} BgCamFuncData; // size = 0x12
// Macros for `WaterBox.properties`
#define WATERBOX_LIGHT_INDEX_NONE 0x1F // warns and defaults to 0
#define WATERBOX_ROOM(properties) (((properties) >> 13) & 0x3F)
#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) \
#define WATERBOX_PROPERTIES(bgCamIndex, lightIndex, roomIndex, isDisabled) \
((((bgCamIndex) & 0xFF) << 0) | \
(((lightIndex) & 0x1F) << 8) | \
(((room) & 0x3F) << 13) | \
(((setFlag19) & 1) << 19))
(((roomIndex) & 0x3F) << 13) | \
(((isDisabled) & 1) << 19))
#define WATERBOX_LIGHT_INDEX_NONE 0x1F // Generates printf 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"
// 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
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;
@@ -251,7 +250,7 @@ typedef struct CollisionHeader {
/* 0x1C */ SurfaceType* surfaceTypeList;
/* 0x20 */ BgCamInfo* bgCamList;
/* 0x24 */ u16 numWaterBoxes;
/* 0x28 */ WaterBox* waterBoxes;
/* 0x28 */ WaterBox* waterBoxes; // an unsorted list of non-overlapping waterboxes
} CollisionHeader; // original name: BGDataInfo
typedef struct SSNode {
@@ -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,
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_GetSurface2(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);
+2 -2
View File
@@ -1489,8 +1489,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);
+76 -49
View File
@@ -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
@@ -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 do not overlap, and have 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 do not overlap, and have 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;
@@ -4296,15 +4310,20 @@ 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. This range check excludes all points falling exactly on the border of the
//! WaterBox. Thus, when two waterboxes are flush against each other, a seam will exist between them where no
//! water is detected.
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;
}
}
}
@@ -4312,12 +4331,12 @@ s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f3
}
/**
* 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;
@@ -4334,16 +4353,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;
}
}
}
@@ -4386,12 +4407,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 do not 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;
@@ -4402,15 +4426,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;
}
}
}
+4 -3
View File
@@ -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;
@@ -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;
}
+2 -2
View File
@@ -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;
@@ -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) {
+1 -1
View File
@@ -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;
@@ -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;
@@ -2861,7 +2861,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
}
@@ -2930,8 +2930,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;
@@ -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);
@@ -596,7 +595,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) {
+4 -4
View File
@@ -927,28 +927,28 @@ void EnTite_Update(Actor* thisx, PlayState* play) {
if ((this->actor.params == TEKTITE_BLUE) && (thisx->bgCheckFlags & BGCHECKFLAG_WATER)) {
floorPoly = thisx->floorPoly;
if ((((play->gameplayFrames % 8) == 0) || (thisx->velocity.y < 0.0f)) &&
(WaterBox_GetSurfaceImpl(play, &play->colCtx, this->backRightFootPos.x, this->backRightFootPos.z,
(BgCheck_GetWaterSurface(play, &play->colCtx, this->backRightFootPos.x, this->backRightFootPos.z,
&waterSurfaceY, &waterBox)) &&
(this->backRightFootPos.y <= waterSurfaceY)) {
this->backRightFootPos.y = waterSurfaceY;
EffectSsGRipple_Spawn(play, &this->backRightFootPos, 0, 220, 0);
}
if (((((play->gameplayFrames + 2) % 8) == 0) || (thisx->velocity.y < 0.0f)) &&
(WaterBox_GetSurfaceImpl(play, &play->colCtx, this->backLeftFootPos.x, this->backLeftFootPos.z,
(BgCheck_GetWaterSurface(play, &play->colCtx, this->backLeftFootPos.x, this->backLeftFootPos.z,
&waterSurfaceY, &waterBox)) &&
(this->backLeftFootPos.y <= waterSurfaceY)) {
this->backLeftFootPos.y = waterSurfaceY;
EffectSsGRipple_Spawn(play, &this->backLeftFootPos, 0, 220, 0);
}
if (((((play->gameplayFrames + 4) % 8) == 0) || (thisx->velocity.y < 0.0f)) &&
(WaterBox_GetSurfaceImpl(play, &play->colCtx, this->frontLeftFootPos.x, this->frontLeftFootPos.z,
(BgCheck_GetWaterSurface(play, &play->colCtx, this->frontLeftFootPos.x, this->frontLeftFootPos.z,
&waterSurfaceY, &waterBox)) &&
(this->frontLeftFootPos.y <= waterSurfaceY)) {
this->frontLeftFootPos.y = waterSurfaceY;
EffectSsGRipple_Spawn(play, &this->frontLeftFootPos, 0, 220, 0);
}
if (((((play->gameplayFrames + 1) % 8) == 0) || (thisx->velocity.y < 0.0f)) &&
(WaterBox_GetSurfaceImpl(play, &play->colCtx, this->frontRightFootPos.x, this->frontRightFootPos.z,
(BgCheck_GetWaterSurface(play, &play->colCtx, this->frontRightFootPos.x, this->frontRightFootPos.z,
&waterSurfaceY, &waterBox)) &&
(this->frontRightFootPos.y <= waterSurfaceY)) {
this->frontRightFootPos.y = waterSurfaceY;
@@ -232,7 +232,7 @@ void EnWeiyer_InitInsideWaterBox(EnWeiyer* this, PlayState* play) {
this->actor.floorHeight =
BgCheck_EntityRaycastDown4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &this->actor.world.pos);
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,
&this->actor.home.pos.y, &waterBox) ||
((this->actor.home.pos.y - 5.0f) <= this->actor.floorHeight)) {
Actor_Kill(&this->actor);
@@ -152,7 +152,7 @@ void ObjSyokudai_Update(Actor* thisx, PlayState* play2) {
if (torchCount == 10) {
torchCount = 24;
}
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,
&dummy) &&
((waterSurface - this->actor.world.pos.y) > 52.0f)) {
this->litTimer = 0;
+16 -15
View File
@@ -5823,10 +5823,10 @@ void func_8083AA10(Player* this, PlayState* play) {
s32 sp5C;
CollisionPoly* sp58;
s32 sp54;
WaterBox* sp50;
WaterBox* waterBox;
Vec3f sp44;
f32 sp40;
f32 sp3C;
f32 waterSurfaceY;
this->fallDistance = this->fallStartHeight - (s32)this->actor.world.pos.y;
@@ -5871,10 +5871,11 @@ void func_8083AA10(Player* this, PlayState* play) {
!(this->stateFlags1 & PLAYER_STATE1_CARRYING_ACTOR)) {
sp40 = func_808396F4(play, this, &D_8085451C, &sp44, &sp58, &sp54);
sp3C = this->actor.world.pos.y;
waterSurfaceY = this->actor.world.pos.y;
if (WaterBox_GetSurface1(play, &play->colCtx, sp44.x, sp44.z, &sp3C, &sp50) &&
((sp3C - sp40) > 50.0f)) {
if (BgCheck_GetWaterSurfaceAllHack(play, &play->colCtx, sp44.x, sp44.z, &waterSurfaceY,
&waterBox) &&
((waterSurfaceY - sp40) > 50.0f)) {
func_808389E8(this, &gPlayerAnim_link_normal_run_jump_water_fall, 6.0f, play);
Player_SetupAction(play, this, Player_Action_80844A44, 0);
return;
@@ -6681,12 +6682,12 @@ void func_8083C8DC(Player* this, PlayState* play, s16 arg2) {
}
s32 Player_SetStartingMovement(PlayState* play, Player* this, f32 arg2) {
WaterBox* sp2C;
WaterBox* waterBox;
f32 sp28;
sp28 = this->actor.world.pos.y;
if (WaterBox_GetSurface1(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &sp28, &sp2C) !=
0) {
if (BgCheck_GetWaterSurfaceAllHack(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &sp28,
&waterBox)) {
sp28 -= this->actor.world.pos.y;
if (this->ageProperties->unk_24 <= sp28) {
Player_SetupAction(play, this, Player_Action_8084D7C4, 0);
@@ -6817,24 +6818,24 @@ void func_8083CF5C(Player* this, PlayState* play) {
s32 func_8083CFA8(PlayState* play, Player* this, f32 arg2, s32 splashScale) {
f32 sp3C = fabsf(arg2);
WaterBox* sp38;
f32 sp34;
WaterBox* waterBox;
f32 waterSurfaceY;
Vec3f splashPos;
s32 splashType;
if (sp3C > 2.0f) {
splashPos.x = this->bodyPartsPos[PLAYER_BODYPART_WAIST].x;
splashPos.z = this->bodyPartsPos[PLAYER_BODYPART_WAIST].z;
sp34 = this->actor.world.pos.y;
if (WaterBox_GetSurface1(play, &play->colCtx, splashPos.x, splashPos.z, &sp34, &sp38)) {
waterSurfaceY = this->actor.world.pos.y;
if (BgCheck_GetWaterSurfaceAllHack(play, &play->colCtx, splashPos.x, splashPos.z, &waterSurfaceY, &waterBox)) {
#if OOT_VERSION < PAL_1_0
if ((sp34 - this->actor.world.pos.y) < 80.0f)
if ((waterSurfaceY - this->actor.world.pos.y) < 80.0f)
#else
if ((sp34 - this->actor.world.pos.y) < 100.0f)
if ((waterSurfaceY - this->actor.world.pos.y) < 100.0f)
#endif
{
splashType = (sp3C <= 10.0f) ? 0 : 1;
splashPos.y = sp34;
splashPos.y = waterSurfaceY;
EffectSsGSplash_Spawn(play, &splashPos, NULL, NULL, splashType, splashScale);
return 1;
}
@@ -71,7 +71,7 @@ void EffectSsBubble_Update(PlayState* play, u32 index, EffectSs* this) {
f32 waterSurfaceY = this->pos.y;
// kill bubble if it's out of range of a water box
if (!WaterBox_GetSurface1(play, &play->colCtx, this->pos.x, this->pos.z, &waterSurfaceY, &waterBox)) {
if (!BgCheck_GetWaterSurfaceAllHack(play, &play->colCtx, this->pos.x, this->pos.z, &waterSurfaceY, &waterBox)) {
this->life = -1;
return;
}
@@ -63,7 +63,7 @@ u32 EffectSsGRipple_Init(PlayState* play, u32 index, EffectSs* this, void* initP
this->rEnvColorG = 255;
this->rEnvColorB = 255;
this->rEnvColorA = 255;
this->rWaterBoxNum = WaterBox_GetSurface2(play, &play->colCtx, &initParams->pos, 3.0f, &waterBox);
this->rWaterBoxNum = BgCheck_FindWaterBox(play, &play->colCtx, &initParams->pos, 3.0f, &waterBox);
return 1;
}
@@ -447,13 +447,13 @@ class CollisionWaterBoxesResource(CDataResource):
bgCamIndex = (v >> 0) & 0xFF
lightIndex = (v >> 8) & 0x1F
room = (v >> 13) & 0x3F
setFlag19 = (v >> 19) & 1
isDisabled = (v >> 19) & 1
return (
"WATERBOX_PROPERTIES("
f"/* bgCamIndex */ {bgCamIndex}, "
f"/* lightIndex */ {lightIndex}, "
f"/* room */ {room}, "
f"/* setFlag19 */ {'true' if setFlag19 else 'false'}"
f"/* isDisabled */ {'true' if isDisabled else 'false'}"
")"
)