mirror of
https://github.com/zeldaret/oot
synced 2026-09-06 19:01:01 -04:00
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:
+2
-2
@@ -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
@@ -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
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user