Document distortion world B4F/B5F waterfall (#1088)

Signed-off-by: Kuruyia <github@kuruyia.net>
This commit is contained in:
Alexandre Sollier
2026-04-15 18:31:35 +02:00
committed by GitHub
parent 12219e2dda
commit 54a7625b0f
11 changed files with 1270 additions and 1163 deletions

View File

@@ -35,7 +35,7 @@ enum FieldEffectRendererType {
FIELD_EFFECT_RENDERER_1E,
FIELD_EFFECT_RENDERER_1F,
FIELD_EFFECT_RENDERER_20,
FIELD_EFFECT_RENDERER_21,
FIELD_EFFECT_RENDERER_DISTORTION_WORLD_SURF_MOUNT,
FIELD_EFFECT_RENDERER_COUNT,
FIELD_EFFECT_RENDERER_INVALID = FIELD_EFFECT_RENDERER_COUNT,
};

View File

@@ -0,0 +1,46 @@
#ifndef POKEPLATINUM_DIST_WORLD_SURF_MOUNT_RENDERER_H
#define POKEPLATINUM_DIST_WORLD_SURF_MOUNT_RENDERER_H
#include <nitro/fx/fx.h>
#include "constants/player_avatar.h"
#include "overlay005/field_effect_manager.h"
#include "location.h"
#include "overworld_anim_manager.h"
#include "player_avatar.h"
#include "simple3d.h"
enum DistWorldSurfMountRendererFlag {
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_NO_RENDER = 0,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_TICK,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_NO_ROTATION_RECALCULATION,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_NO_POSITION_RECALCULATION,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_NO_ORBIT_RECALCULATION,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_USE_EXTERNAL_SPRITE_POS_OFFSET,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_USE_EXTERNAL_POS_FIX,
};
enum DistWorldSurfMountRendererFlagMask {
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_NO_RENDER = 1 << DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_NO_RENDER,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_TICK = 1 << DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_TICK,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_NO_ROTATION_RECALCULATION = 1 << DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_NO_ROTATION_RECALCULATION,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_NO_POSITION_RECALCULATION = 1 << DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_NO_POSITION_RECALCULATION,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_NO_ORBIT_RECALCULATION = 1 << DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_NO_ORBIT_RECALCULATION,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_USE_EXTERNAL_SPRITE_POS_OFFSET = 1 << DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_USE_EXTERNAL_SPRITE_POS_OFFSET,
DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_USE_EXTERNAL_POS_FIX = 1 << DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_USE_EXTERNAL_POS_FIX,
};
void *DistWorldSurfMountRenderer_New(FieldEffectManager *fieldEffMan);
void DistWorldSurfMountRenderer_Free(void *context);
OverworldAnimManager *DistWorldSurfMountRenderer_HandleSurfBegin(PlayerAvatar *playerAvatar, int mountTileX, int mountTileY, int mountTileZ, enum FaceDirection dir, BOOL reuseMapObjPos, enum AvatarDistortionState avatarDistortionState);
Simple3DRotationAngles *DistWorldSurfMountRenderer_GetSurfMountRotationAngles(OverworldAnimManager *animMan);
void DistWorldSurfMountRenderer_SetFixedRotationAngles(OverworldAnimManager *animMan, enum FaceDirection dir, enum AvatarDistortionState avatarDistortionState);
void DistWorldSurfMountRenderer_SetFlags(OverworldAnimManager *animMan, int mask);
void DistWorldSurfMountRenderer_ClearFlags(OverworldAnimManager *animMan, int mask);
VecFx32 *DistWorldSurfMountRenderer_GetExternalSpritePosOffsetPtr(OverworldAnimManager *animMan);
VecFx32 *DistWorldSurfMountRenderer_GetExternalPosFixPtr(OverworldAnimManager *animMan);
void DistWorldSurfMountRenderer_SetOrbitAngle(OverworldAnimManager *animMan, u16 orbitAngle);
#endif // POKEPLATINUM_DIST_WORLD_SURF_MOUNT_RENDERER_H

View File

@@ -1,23 +0,0 @@
#ifndef POKEPLATINUM_OV5_021F8560_H
#define POKEPLATINUM_OV5_021F8560_H
#include <nitro/fx/fx.h>
#include "overlay005/field_effect_manager.h"
#include "overworld_anim_manager.h"
#include "player_avatar.h"
#include "simple3d.h"
void *ov5_021F8560(FieldEffectManager *param0);
void ov5_021F857C(void *param0);
OverworldAnimManager *ov5_021F85BC(PlayerAvatar *playerAvatar, int param1, int param2, int param3, int param4, int param5, int param6);
Simple3DRotationAngles *ov5_021F88A8(OverworldAnimManager *param0);
void ov5_021F88B4(OverworldAnimManager *param0, int param1, int param2);
void ov5_021F88CC(OverworldAnimManager *param0, int param1);
void ov5_021F88DC(OverworldAnimManager *param0, int param1);
VecFx32 *ov5_021F88F0(OverworldAnimManager *param0);
VecFx32 *ov5_021F88FC(OverworldAnimManager *param0);
void ov5_021F8908(OverworldAnimManager *param0, u16 param1);
#endif // POKEPLATINUM_OV5_021F8560_H

View File

@@ -8,6 +8,7 @@
#include "billboard.h"
#include "field_task.h"
#include "location.h"
#define GHOST_PROP_GROUP_MAX_COUNT 24
@@ -73,7 +74,7 @@ void DistWorld_ResetPersistedCameraAngles(FieldSystem *fieldSystem);
int ov9_0224A520(FieldSystem *fieldSystem, MapObject *param1);
void ov9_0224A558(FieldSystem *fieldSystem, Billboard *param1, int param2);
void ov9_0224A564(FieldSystem *fieldSystem, const Billboard *param1);
BOOL ov9_0224A59C(FieldSystem *fieldSystem, int param1);
BOOL DistWorld_HandlePlayerMoved(FieldSystem *fieldSystem, enum FaceDirection playerDir);
BOOL ov9_0224A67C(FieldSystem *fieldSystem, int param1);
BOOL ov9_0224A71C(FieldSystem *fieldSystem);
BOOL ov9_0224A800(FieldSystem *fieldSystem, int param1);

View File

@@ -553,7 +553,7 @@ Overlay overlay5
Object main.nef.p/src_overlay005_ov5_021F6454.c.o
Object main.nef.p/src_overlay005_scrcmd_move_tutor.c.o
Object main.nef.p/src_overlay005_ov5_021F8370.c.o
Object main.nef.p/src_overlay005_ov5_021F8560.c.o
Object main.nef.p/src_overlay005_dist_world_surf_mount_renderer.c.o
}
Overlay overlay6

View File

@@ -444,7 +444,7 @@ pokeplatinum_c = files(
'overlay005/ov5_021F6454.c',
'overlay005/scrcmd_move_tutor.c',
'overlay005/ov5_021F8370.c',
'overlay005/ov5_021F8560.c',
'overlay005/dist_world_surf_mount_renderer.c',
'overlay005/ov5_021FAF40.c',
'overlay005/field_effect_renderer.c',
'overlay006/ov6_0223E140.c',

View File

@@ -0,0 +1,379 @@
#include "overlay005/dist_world_surf_mount_renderer.h"
#include <nitro.h>
#include <string.h>
#include "constants/field/field_effect_renderer.h"
#include "constants/map_object.h"
#include "constants/player_avatar.h"
#include "struct_decls/struct_02061AB4_decl.h"
#include "field/field_system.h"
#include "overlay005/field_effect_manager.h"
#include "map_object.h"
#include "math_util.h"
#include "overworld_anim_manager.h"
#include "player_avatar.h"
#include "simple3d.h"
#define RENDERER_MIN_Y_OFFSET FX32_ONE
#define RENDERER_MAX_Y_OFFSET (FX32_ONE * 4)
#define RENDERER_INITIAL_Y_OFFSET FX32_ONE
#define RENDERER_INITIAL_Y_DELTA 1024
#define MOUNT_ORBIT_DISTANCE 20
#define MOUNT_BASE_POS_FIX_X (FX32_ONE * 0)
#define MOUNT_BASE_POS_FIX_Y (FX32_ONE * 8)
#define MOUNT_BASE_POS_FIX_Z (FX32_ONE * 0)
typedef struct DistWorldSurfMountResources {
FieldEffectManager *fieldEffMan;
Simple3DModel surfMountModel;
Simple3DRenderObj surfMountRenderObj;
} DistWorldSurfMountResources;
typedef struct DistWorldSurfMountUserData {
enum FaceDirection dir;
enum AvatarDistortionState avatarDistortionState;
FieldEffectManager *fieldEffMan;
DistWorldSurfMountResources *resources;
MapObject *playerMapObj;
PlayerAvatar *playerAvatar;
} DistWorldSurfMountUserData;
typedef struct DistWorldSurfMountRenderer {
u32 flags;
s16 dir;
u16 counter;
u16 orbitAngle;
u16 orbitDistance;
Simple3DRotationAngles rotAngles;
VecFx32 extSpritePosOffset;
VecFx32 extPosFix;
fx32 yOffset;
fx32 yDelta;
enum AvatarDistortionState avatarDistortionState;
DistWorldSurfMountUserData userData;
} DistWorldSurfMountRenderer;
static void DistWorldSurfMountResources_Init(DistWorldSurfMountResources *resources);
static void DistWorldSurfMountResources_Free(DistWorldSurfMountResources *resources);
static void GetFixedRotationAngles(enum AvatarDistortionState avatarDistortionState, enum FaceDirection dir, Simple3DRotationAngles *outRotAngles);
static const OverworldAnimManagerFuncs sDistWorldSurfMountRendererAnimFuncs;
static const VecFx32 sInitialMountPosFixes[AVATAR_DISTORTION_STATE_MAX];
static const VecFx32 sSpriteBasePosOffsets[AVATAR_DISTORTION_STATE_MAX];
static const VecFx32 sMountPosFixes[AVATAR_DISTORTION_STATE_MAX];
static const u32 sOrbitAngles[AVATAR_DISTORTION_STATE_MAX];
static const Simple3DRotationAngles sFixedRotAngles[AVATAR_DISTORTION_STATE_MAX][MAX_DIR];
void *DistWorldSurfMountRenderer_New(FieldEffectManager *fieldEffMan)
{
DistWorldSurfMountResources *resources = FieldEffectManager_HeapAllocInit(fieldEffMan, sizeof(DistWorldSurfMountResources), FALSE, 0);
resources->fieldEffMan = fieldEffMan;
DistWorldSurfMountResources_Init(resources);
return resources;
}
void DistWorldSurfMountRenderer_Free(void *context)
{
DistWorldSurfMountResources *resources = context;
DistWorldSurfMountResources_Free(resources);
FieldEffectManager_HeapFree(resources);
}
static void DistWorldSurfMountResources_Init(DistWorldSurfMountResources *resources)
{
FieldEffectManager_LoadModel(resources->fieldEffMan, &resources->surfMountModel, 0, 81, FALSE);
Simple3D_CreateRenderObject(&resources->surfMountRenderObj, &resources->surfMountModel);
}
static void DistWorldSurfMountResources_Free(DistWorldSurfMountResources *resources)
{
Simple3D_FreeModel(&resources->surfMountModel);
}
OverworldAnimManager *DistWorldSurfMountRenderer_HandleSurfBegin(PlayerAvatar *playerAvatar, int mountTileX, int mountTileY, int mountTileZ, enum FaceDirection dir, BOOL reuseMapObjPos, enum AvatarDistortionState avatarDistortionState)
{
VecFx32 mountPos = { 0, 0, 0 };
DistWorldSurfMountUserData userData;
MapObject *playerMapObj = Player_MapObject(playerAvatar);
userData.dir = dir;
userData.avatarDistortionState = avatarDistortionState;
userData.fieldEffMan = MapObject_GetFieldEffectManager(playerMapObj);
userData.resources = FieldEffectManager_GetRendererContext(userData.fieldEffMan, FIELD_EFFECT_RENDERER_DISTORTION_WORLD_SURF_MOUNT);
userData.playerMapObj = playerMapObj;
userData.playerAvatar = playerAvatar;
if (!reuseMapObjPos) {
FieldSystem *fieldSystem = MapObject_FieldSystem(playerMapObj);
const VecFx32 *mountPosFix = &sInitialMountPosFixes[avatarDistortionState];
mountPos.x = (mountTileX << 4) * FX32_ONE + mountPosFix->x;
mountPos.y = (mountTileY << 4) * FX32_ONE + mountPosFix->y;
mountPos.z = (mountTileZ << 4) * FX32_ONE + mountPosFix->z;
} else {
const VecFx32 *spritePosOffset = &sSpriteBasePosOffsets[avatarDistortionState];
MapObject_GetPosPtr(playerMapObj, &mountPos);
MapObject_SetSpritePosOffset(playerMapObj, spritePosOffset);
}
int taskPriority = MapObject_CalculateTaskPriority(playerMapObj, 2);
OverworldAnimManager *animMan = FieldEffectManager_InitAnimManager(userData.fieldEffMan, &sDistWorldSurfMountRendererAnimFuncs, &mountPos, reuseMapObjPos, &userData, taskPriority);
return animMan;
}
static BOOL DistWorldSurfMountRenderer_AnimInit(OverworldAnimManager *animMan, void *context)
{
DistWorldSurfMountRenderer *renderer = context;
const DistWorldSurfMountUserData *userData = OverworldAnimManager_GetUserData(animMan);
renderer->userData = *userData;
renderer->dir = userData->dir;
renderer->yOffset = RENDERER_INITIAL_Y_OFFSET;
renderer->yDelta = RENDERER_INITIAL_Y_DELTA;
renderer->avatarDistortionState = userData->avatarDistortionState;
GetFixedRotationAngles(renderer->avatarDistortionState, renderer->dir, &renderer->rotAngles);
renderer->orbitAngle = sOrbitAngles[renderer->avatarDistortionState];
renderer->orbitDistance = MOUNT_ORBIT_DISTANCE;
if (OverworldAnimManager_GetID(animMan) == 1) {
renderer->flags |= DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_TICK;
}
return TRUE;
}
static void DistWorldSurfMountRenderer_AnimExit(OverworldAnimManager *animMan, void *context)
{
DistWorldSurfMountRenderer *renderer = context;
MapObject *playerMapObj = renderer->userData.playerMapObj;
VecFx32 spritePosOffset = { 0, 0, 0 };
MapObject_SetSpritePosOffset(playerMapObj, &spritePosOffset);
}
static void DistWorldSurfMountRenderer_AnimTick(OverworldAnimManager *animMan, void *context)
{
DistWorldSurfMountRenderer *renderer = context;
MapObject *playerMapObj = renderer->userData.playerMapObj;
PlayerAvatar *playerAvatar = renderer->userData.playerAvatar;
if (!(renderer->flags & DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_TICK)) {
return;
}
renderer->dir = MapObject_GetMovingDir(playerMapObj);
renderer->avatarDistortionState = PlayerAvatar_MapDistortionState(playerAvatar);
GF_ASSERT(renderer->dir != DIR_NONE);
renderer->yOffset += renderer->yDelta;
if (renderer->yOffset >= RENDERER_MAX_Y_OFFSET) {
renderer->yOffset = RENDERER_MAX_Y_OFFSET;
renderer->yDelta = -renderer->yDelta;
} else if (renderer->yOffset <= RENDERER_MIN_Y_OFFSET) {
renderer->yOffset = RENDERER_MIN_Y_OFFSET;
renderer->yDelta = -renderer->yDelta;
}
if (!(renderer->flags & DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_NO_ROTATION_RECALCULATION)) {
GetFixedRotationAngles(renderer->avatarDistortionState, renderer->dir, &renderer->rotAngles);
}
if (!(renderer->flags & DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_NO_ORBIT_RECALCULATION)) {
renderer->orbitAngle = sOrbitAngles[renderer->avatarDistortionState];
}
if (!(renderer->flags & DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_NO_POSITION_RECALCULATION)) {
VecFx32 pos = sSpriteBasePosOffsets[renderer->avatarDistortionState];
if (!(renderer->flags & DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_USE_EXTERNAL_SPRITE_POS_OFFSET)) {
pos.y += renderer->yOffset;
} else {
pos.x += renderer->extSpritePosOffset.x;
pos.y += renderer->extSpritePosOffset.y;
pos.z += renderer->extSpritePosOffset.z;
}
MapObject_SetSpritePosOffset(playerMapObj, &pos);
MapObject_GetPosPtr(playerMapObj, &pos);
const VecFx32 *mountPosFix;
if ((renderer->flags & DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_USE_EXTERNAL_POS_FIX) == 0) {
mountPosFix = &sMountPosFixes[renderer->avatarDistortionState];
} else {
mountPosFix = &renderer->extPosFix;
}
pos.x += MOUNT_BASE_POS_FIX_X + mountPosFix->x + CalcCosineDegrees(renderer->orbitAngle) * renderer->orbitDistance;
pos.y += MOUNT_BASE_POS_FIX_Y + mountPosFix->y + CalcSineDegrees(renderer->orbitAngle) * renderer->orbitDistance;
pos.z += MOUNT_BASE_POS_FIX_Z + mountPosFix->z;
if (!(renderer->flags & DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_USE_EXTERNAL_SPRITE_POS_OFFSET)) {
pos.y += renderer->yOffset;
} else {
pos.x += renderer->extSpritePosOffset.x;
pos.y += renderer->extSpritePosOffset.y;
pos.z += renderer->extSpritePosOffset.z;
}
OverworldAnimManager_SetPosition(animMan, &pos);
}
}
static void DistWorldSurfMountRenderer_AnimRender(OverworldAnimManager *animMan, void *context)
{
DistWorldSurfMountRenderer *renderer = context;
if (!(renderer->flags & DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_NO_RENDER)) {
VecFx32 pos;
Simple3DRenderObj *surfMountRenderObj = &renderer->userData.resources->surfMountRenderObj;
OverworldAnimManager_GetPosition(animMan, &pos);
Simple3D_DrawRenderObjWithPosAndRotationAngles(surfMountRenderObj, &pos, &renderer->rotAngles);
}
renderer->counter++;
}
static void GetFixedRotationAngles(enum AvatarDistortionState avatarDistortionState, enum FaceDirection dir, Simple3DRotationAngles *outRotAngles)
{
GF_ASSERT((u32)avatarDistortionState < AVATAR_DISTORTION_STATE_MAX);
*outRotAngles = sFixedRotAngles[avatarDistortionState][dir];
}
Simple3DRotationAngles *DistWorldSurfMountRenderer_GetSurfMountRotationAngles(OverworldAnimManager *animMan)
{
DistWorldSurfMountRenderer *renderer = OverworldAnimManager_GetFuncsContext(animMan);
return &renderer->rotAngles;
}
void DistWorldSurfMountRenderer_SetFixedRotationAngles(OverworldAnimManager *animMan, enum FaceDirection dir, enum AvatarDistortionState avatarDistortionState)
{
DistWorldSurfMountRenderer *renderer = OverworldAnimManager_GetFuncsContext(animMan);
GetFixedRotationAngles(avatarDistortionState, dir, &renderer->rotAngles);
}
void DistWorldSurfMountRenderer_SetFlags(OverworldAnimManager *animMan, int mask)
{
DistWorldSurfMountRenderer *renderer = OverworldAnimManager_GetFuncsContext(animMan);
renderer->flags |= mask;
}
void DistWorldSurfMountRenderer_ClearFlags(OverworldAnimManager *animMan, int mask)
{
DistWorldSurfMountRenderer *renderer = OverworldAnimManager_GetFuncsContext(animMan);
renderer->flags &= ~mask;
}
VecFx32 *DistWorldSurfMountRenderer_GetExternalSpritePosOffsetPtr(OverworldAnimManager *animMan)
{
DistWorldSurfMountRenderer *renderer = OverworldAnimManager_GetFuncsContext(animMan);
return &renderer->extSpritePosOffset;
}
VecFx32 *DistWorldSurfMountRenderer_GetExternalPosFixPtr(OverworldAnimManager *animMan)
{
DistWorldSurfMountRenderer *renderer = OverworldAnimManager_GetFuncsContext(animMan);
return &renderer->extPosFix;
}
void DistWorldSurfMountRenderer_SetOrbitAngle(OverworldAnimManager *animMan, u16 orbitAngle)
{
DistWorldSurfMountRenderer *renderer = OverworldAnimManager_GetFuncsContext(animMan);
renderer->orbitAngle = orbitAngle;
}
static const OverworldAnimManagerFuncs sDistWorldSurfMountRendererAnimFuncs = {
sizeof(DistWorldSurfMountRenderer),
DistWorldSurfMountRenderer_AnimInit,
DistWorldSurfMountRenderer_AnimExit,
DistWorldSurfMountRenderer_AnimTick,
DistWorldSurfMountRenderer_AnimRender
};
static const VecFx32 sInitialMountPosFixes[AVATAR_DISTORTION_STATE_MAX] = {
[AVATAR_DISTORTION_STATE_NONE] = { 16 * FX32_ONE >> 1, 0, 16 * FX32_ONE >> 1 },
[AVATAR_DISTORTION_STATE_ACTIVE] = { 16 * FX32_ONE >> 1, 0, 16 * FX32_ONE >> 1 },
[AVATAR_DISTORTION_STATE_FLOOR] = { 16 * FX32_ONE >> 1, 0, 16 * FX32_ONE >> 1 },
[AVATAR_DISTORTION_STATE_WEST_WALL] = { 16 * FX32_ONE >> 1, 0, 16 * FX32_ONE >> 1 },
[AVATAR_DISTORTION_STATE_EAST_WALL] = { 16 * FX32_ONE >> 1, 0, 16 * FX32_ONE >> 1 },
[AVATAR_DISTORTION_STATE_CEILING] = { 16 * FX32_ONE >> 1, FX32_ONE * 40, 16 * FX32_ONE >> 1 }
};
static const VecFx32 sSpriteBasePosOffsets[AVATAR_DISTORTION_STATE_MAX] = {
[AVATAR_DISTORTION_STATE_NONE] = { 0, 0, 0 },
[AVATAR_DISTORTION_STATE_ACTIVE] = { 0, 0, 0 },
[AVATAR_DISTORTION_STATE_FLOOR] = { 0, 0, 0 },
[AVATAR_DISTORTION_STATE_WEST_WALL] = { 0, 0, 0 },
[AVATAR_DISTORTION_STATE_EAST_WALL] = { 0, 0, 0 },
[AVATAR_DISTORTION_STATE_CEILING] = { 0, 0, 0 }
};
static const VecFx32 sMountPosFixes[AVATAR_DISTORTION_STATE_MAX] = {
[AVATAR_DISTORTION_STATE_NONE] = { FX32_ONE * 1 / 4, FX32_ONE * 6, FX32_ONE * -5 },
[AVATAR_DISTORTION_STATE_ACTIVE] = { FX32_ONE * 1 / 4, FX32_ONE * 6, FX32_ONE * -5 },
[AVATAR_DISTORTION_STATE_FLOOR] = { FX32_ONE * 1 / 4, FX32_ONE * 6, FX32_ONE * -5 },
[AVATAR_DISTORTION_STATE_WEST_WALL] = { 0, 0, 0 },
[AVATAR_DISTORTION_STATE_EAST_WALL] = { 0, 0, 0 },
[AVATAR_DISTORTION_STATE_CEILING] = { 0, 0, FX32_ONE * 6 }
};
static const u32 sOrbitAngles[AVATAR_DISTORTION_STATE_MAX] = {
[AVATAR_DISTORTION_STATE_NONE] = 270,
[AVATAR_DISTORTION_STATE_ACTIVE] = 270,
[AVATAR_DISTORTION_STATE_FLOOR] = 270,
[AVATAR_DISTORTION_STATE_WEST_WALL] = 0,
[AVATAR_DISTORTION_STATE_EAST_WALL] = 0,
[AVATAR_DISTORTION_STATE_CEILING] = 90
};
static const Simple3DRotationAngles sFixedRotAngles[AVATAR_DISTORTION_STATE_MAX][MAX_DIR] = {
[AVATAR_DISTORTION_STATE_NONE] = {
[FACE_UP] = { 0, 180, 0 },
[FACE_DOWN] = { 0, 0, 0 },
[FACE_LEFT] = { 0, 270, 0 },
[FACE_RIGHT] = { 0, 90, 0 },
},
[AVATAR_DISTORTION_STATE_ACTIVE] = {
[FACE_UP] = { 0, 180, 0 },
[FACE_DOWN] = { 0, 0, 0 },
[FACE_LEFT] = { 0, 270, 0 },
[FACE_RIGHT] = { 0, 90, 0 },
},
[AVATAR_DISTORTION_STATE_FLOOR] = {
[FACE_UP] = { 0, 180, 0 },
[FACE_DOWN] = { 0, 0, 0 },
[FACE_LEFT] = { 0, 270, 0 },
[FACE_RIGHT] = { 0, 90, 0 },
},
[AVATAR_DISTORTION_STATE_WEST_WALL] = {
[FACE_UP] = { 0, 180, 0 },
[FACE_DOWN] = { 0, 0, 0 },
[FACE_LEFT] = { 0, 270, 0 },
[FACE_RIGHT] = { 0, 90, 0 },
},
[AVATAR_DISTORTION_STATE_EAST_WALL] = {
[FACE_UP] = { 0, 180, 0 },
[FACE_DOWN] = { 0, 0, 0 },
[FACE_LEFT] = { 0, 270, 0 },
[FACE_RIGHT] = { 0, 90, 0 },
},
[AVATAR_DISTORTION_STATE_CEILING] = {
[FACE_UP] = { 180, 180, 0 },
[FACE_DOWN] = { 180, 0, 0 },
[FACE_LEFT] = { 180, 90, 0 },
[FACE_RIGHT] = { 180, 270, 0 },
},
};

View File

@@ -6,6 +6,7 @@
#include "constants/field/field_effect_renderer.h"
#include "overlay005/berry_patch_effects.h"
#include "overlay005/dist_world_surf_mount_renderer.h"
#include "overlay005/ov5_021F10E8.h"
#include "overlay005/ov5_021F134C.h"
#include "overlay005/ov5_021F17B8.h"
@@ -36,7 +37,6 @@
#include "overlay005/ov5_021F5A10.h"
#include "overlay005/ov5_021F600C.h"
#include "overlay005/ov5_021F61BC.h"
#include "overlay005/ov5_021F8560.h"
#include "overlay005/surf_mount_renderer.h"
const FieldEffectRendererFuncs sFieldEffectRendererHandlers[FIELD_EFFECT_RENDERER_COUNT + 1] = {
@@ -73,7 +73,7 @@ const FieldEffectRendererFuncs sFieldEffectRendererHandlers[FIELD_EFFECT_RENDERE
{ FIELD_EFFECT_RENDERER_1E, ov5_021F4018, ov5_021F4034 },
{ FIELD_EFFECT_RENDERER_1F, ov5_021F428C, ov5_021F42A8 },
{ FIELD_EFFECT_RENDERER_20, ov5_021F47B0, ov5_021F47CC },
{ FIELD_EFFECT_RENDERER_21, ov5_021F8560, ov5_021F857C },
{ FIELD_EFFECT_RENDERER_DISTORTION_WORLD_SURF_MOUNT, DistWorldSurfMountRenderer_New, DistWorldSurfMountRenderer_Free },
{ FIELD_EFFECT_RENDERER_INVALID, NULL, NULL }
};
@@ -121,7 +121,7 @@ const u32 sUndergroundFieldEffectRenderers[FIELD_EFFECT_RENDERER_COUNT + 1] = {
const u32 sDistWorldFieldEffectRenderers[FIELD_EFFECT_RENDERER_COUNT + 1] = {
FIELD_EFFECT_RENDERER_1D,
FIELD_EFFECT_RENDERER_14,
FIELD_EFFECT_RENDERER_21,
FIELD_EFFECT_RENDERER_DISTORTION_WORLD_SURF_MOUNT,
FIELD_EFFECT_RENDERER_17,
FIELD_EFFECT_RENDERER_0E,
FIELD_EFFECT_RENDERER_INVALID

View File

@@ -12,12 +12,12 @@
#include "struct_decls/struct_02061AB4_decl.h"
#include "field/field_system.h"
#include "overlay005/dist_world_surf_mount_renderer.h"
#include "overlay005/field_effect_manager.h"
#include "overlay005/map_object_anim_cmd.h"
#include "overlay005/ov5_021EB1A0.h"
#include "overlay005/ov5_021ECE40.h"
#include "overlay005/ov5_021F2850.h"
#include "overlay005/ov5_021F8560.h"
#include "overlay005/struct_ov5_021D1BEC_decl.h"
#include "overlay005/surf_mount_renderer.h"
#include "overlay006/hm_cut_in.h"
@@ -320,7 +320,7 @@ static void PlayerAvatar_RequestStateSurf(PlayerAvatar *playerAvatar)
v5 = SurfMountRenderer_HandleSurfBegin(mapObj, 0, 0, v1, 1);
v0 = PLAYER_STATE_SURFING;
} else {
v5 = ov5_021F85BC(playerAvatar, 0, 0, 0, v1, 1, distortionState);
v5 = DistWorldSurfMountRenderer_HandleSurfBegin(playerAvatar, 0, 0, 0, v1, 1, distortionState);
v0 = 0x19;
}
@@ -457,7 +457,7 @@ static int ov5_021DFE68(FieldSystem *fieldSystem, PlayerAvatar *playerAvatar, in
int v0 = sub_02061434(playerAvatar, param2);
if (param3 & 1 << 2) {
if (ov9_0224A59C(fieldSystem, param2) == 1) {
if (DistWorld_HandlePlayerMoved(fieldSystem, param2) == 1) {
return 1;
}
}
@@ -689,7 +689,7 @@ static BOOL FieldTask_UseSurf(FieldTask *task)
enum AvatarDistortionState distortionState = PlayerAvatar_MapDistortionState(taskEnv->playerAvatar);
sub_02061674(taskEnv->playerAvatar, taskEnv->direction, &mountXPos, &mountYPos, &mountZPos);
taskEnv->unk_28 = ov5_021F85BC(taskEnv->playerAvatar, mountXPos, mountYPos, mountZPos, taskEnv->direction, 0, distortionState);
taskEnv->unk_28 = DistWorldSurfMountRenderer_HandleSurfBegin(taskEnv->playerAvatar, mountXPos, mountYPos, mountZPos, taskEnv->direction, 0, distortionState);
}
PlayerAvatar_SetSurfMountAnimManager(taskEnv->playerAvatar, taskEnv->unk_28);
@@ -734,7 +734,7 @@ static BOOL FieldTask_UseSurf(FieldTask *task)
} else {
int moveState;
ov5_021F88CC(taskEnv->unk_28, 1 << 1);
DistWorldSurfMountRenderer_SetFlags(taskEnv->unk_28, DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_TICK);
moveState = Player_MoveStateFromGender(0x19, PlayerAvatar_Gender(taskEnv->playerAvatar));
PlayerAvatar_Redraw(taskEnv->playerAvatar, moveState);
}
@@ -808,7 +808,7 @@ static BOOL ov5_021E03C8(FieldTask *param0)
SurfMountRenderer_Reset(v0->unk_14, 0);
v1 = Player_MoveStateFromGender(0x0, PlayerAvatar_Gender(v0->playerAvatar));
} else {
ov5_021F88DC(v0->unk_14, 1 << 1);
DistWorldSurfMountRenderer_ClearFlags(v0->unk_14, DIST_WORLD_SURF_MOUNT_RENDERER_FLAG_MASK_TICK);
v1 = Player_MoveStateFromGender(0x18, PlayerAvatar_Gender(v0->playerAvatar));
}

View File

@@ -1,377 +0,0 @@
#include "overlay005/ov5_021F8560.h"
#include <nitro.h>
#include <string.h>
#include "struct_decls/struct_02061AB4_decl.h"
#include "field/field_system.h"
#include "overlay005/field_effect_manager.h"
#include "map_object.h"
#include "math_util.h"
#include "overworld_anim_manager.h"
#include "player_avatar.h"
#include "simple3d.h"
typedef struct {
FieldEffectManager *unk_00;
Simple3DModel unk_04;
Simple3DRenderObj unk_18;
} UnkStruct_ov5_021F858C;
typedef struct {
int unk_00;
int unk_04;
FieldEffectManager *unk_08;
UnkStruct_ov5_021F858C *unk_0C;
MapObject *unk_10;
PlayerAvatar *playerAvatar;
} UnkStruct_ov5_021F8668;
typedef struct {
u32 unk_00;
s16 unk_04;
u16 unk_06;
u16 unk_08;
u16 unk_0A;
Simple3DRotationAngles unk_0C;
VecFx32 unk_14;
VecFx32 unk_20;
fx32 unk_2C;
fx32 unk_30;
int unk_34;
UnkStruct_ov5_021F8668 unk_38;
} UnkStruct_ov5_021F86CC;
static void ov5_021F858C(UnkStruct_ov5_021F858C *param0);
static void ov5_021F85B0(UnkStruct_ov5_021F858C *param0);
static void ov5_021F8878(int param0, int param1, Simple3DRotationAngles *param2);
static const OverworldAnimManagerFuncs Unk_ov5_02201B54;
static const VecFx32 Unk_ov5_02201BC8[6];
static const VecFx32 Unk_ov5_02201C10[6];
static const VecFx32 Unk_ov5_02201B80[6];
static const u32 Unk_ov5_02201B68[6];
static const Simple3DRotationAngles Unk_ov5_02201C58[6][4];
void *ov5_021F8560(FieldEffectManager *param0)
{
UnkStruct_ov5_021F858C *v0 = FieldEffectManager_HeapAllocInit(param0, (sizeof(UnkStruct_ov5_021F858C)), 0, 0);
v0->unk_00 = param0;
ov5_021F858C(v0);
return v0;
}
void ov5_021F857C(void *param0)
{
UnkStruct_ov5_021F858C *v0 = param0;
ov5_021F85B0(v0);
FieldEffectManager_HeapFree(v0);
}
static void ov5_021F858C(UnkStruct_ov5_021F858C *param0)
{
FieldEffectManager_LoadModel(param0->unk_00, &param0->unk_04, 0, 81, 0);
Simple3D_CreateRenderObject(&param0->unk_18, &param0->unk_04);
}
static void ov5_021F85B0(UnkStruct_ov5_021F858C *param0)
{
Simple3D_FreeModel(&param0->unk_04);
}
OverworldAnimManager *ov5_021F85BC(PlayerAvatar *playerAvatar, int param1, int param2, int param3, int param4, int param5, int param6)
{
int v0;
OverworldAnimManager *v1;
const VecFx32 *v2;
VecFx32 v3 = { 0, 0, 0 };
UnkStruct_ov5_021F8668 v4;
MapObject *v5 = Player_MapObject(playerAvatar);
v4.unk_00 = param4;
v4.unk_04 = param6;
v4.unk_08 = MapObject_GetFieldEffectManager(v5);
v4.unk_0C = FieldEffectManager_GetRendererContext(v4.unk_08, 33);
v4.unk_10 = v5;
v4.playerAvatar = playerAvatar;
if (param5 == 0) {
FieldSystem *fieldSystem = MapObject_FieldSystem(v5);
v2 = &Unk_ov5_02201BC8[param6];
v3.x = (((param1) << 4) * FX32_ONE) + v2->x;
v3.y = (((param2) << 4) * FX32_ONE) + v2->y;
v3.z = (((param3) << 4) * FX32_ONE) + v2->z;
} else {
v2 = &Unk_ov5_02201C10[param6];
MapObject_GetPosPtr(v5, &v3);
MapObject_SetSpritePosOffset(v5, v2);
}
v0 = MapObject_CalculateTaskPriority(v5, 2);
v1 = FieldEffectManager_InitAnimManager(v4.unk_08, &Unk_ov5_02201B54, &v3, param5, &v4, v0);
return v1;
}
static int ov5_021F8668(OverworldAnimManager *param0, void *param1)
{
UnkStruct_ov5_021F86CC *v0 = param1;
const UnkStruct_ov5_021F8668 *v1 = OverworldAnimManager_GetUserData(param0);
MapObject *v2 = v1->unk_10;
v0->unk_38 = *v1;
v0->unk_04 = v1->unk_00;
v0->unk_2C = FX32_ONE;
v0->unk_30 = 0x400;
v0->unk_34 = v1->unk_04;
ov5_021F8878(v0->unk_34, v0->unk_04, &v0->unk_0C);
v0->unk_08 = Unk_ov5_02201B68[v0->unk_34];
v0->unk_0A = 20;
if (OverworldAnimManager_GetID(param0) == 1) {
v0->unk_00 |= 1 << 1;
}
return 1;
}
static void ov5_021F86CC(OverworldAnimManager *param0, void *param1)
{
UnkStruct_ov5_021F86CC *v0 = param1;
MapObject *v1 = v0->unk_38.unk_10;
VecFx32 v2 = { 0, 0, 0 };
MapObject_SetSpritePosOffset(v1, &v2);
}
static void ov5_021F86E4(OverworldAnimManager *param0, void *param1)
{
UnkStruct_ov5_021F86CC *v0 = param1;
MapObject *v1 = v0->unk_38.unk_10;
PlayerAvatar *playerAvatar = v0->unk_38.playerAvatar;
if (((v0)->unk_00 & (1 << 1)) == 0) {
return;
}
v0->unk_04 = MapObject_GetMovingDir(v1);
v0->unk_34 = PlayerAvatar_MapDistortionState(playerAvatar);
GF_ASSERT(v0->unk_04 != -1);
{
v0->unk_2C += v0->unk_30;
if (v0->unk_2C >= (FX32_ONE * 4)) {
v0->unk_2C = (FX32_ONE * 4);
v0->unk_30 = -v0->unk_30;
} else if (v0->unk_2C <= FX32_ONE) {
v0->unk_2C = FX32_ONE;
v0->unk_30 = -v0->unk_30;
}
}
if (((v0)->unk_00 & (1 << 2)) == 0) {
ov5_021F8878(v0->unk_34, v0->unk_04, &v0->unk_0C);
}
if (((v0)->unk_00 & (1 << 4)) == 0) {
v0->unk_08 = Unk_ov5_02201B68[v0->unk_34];
}
if (((v0)->unk_00 & (1 << 3)) == 0) {
VecFx32 v3;
v3 = Unk_ov5_02201C10[v0->unk_34];
if (((v0)->unk_00 & (1 << 5)) == 0) {
v3.y += v0->unk_2C;
} else {
v3.x += v0->unk_14.x;
v3.y += v0->unk_14.y;
v3.z += v0->unk_14.z;
}
MapObject_SetSpritePosOffset(v1, &v3);
MapObject_GetPosPtr(v1, &v3);
{
const VecFx32 *v4;
if (((v0)->unk_00 & (1 << 6)) == 0) {
v4 = &Unk_ov5_02201B80[v0->unk_34];
} else {
v4 = &v0->unk_20;
}
v3.x += ((FX32_ONE * 0) + v4->x) + CalcCosineDegrees(v0->unk_08) * v0->unk_0A;
v3.y += ((FX32_ONE * (+8)) + v4->y) + CalcSineDegrees(v0->unk_08) * v0->unk_0A;
v3.z += ((FX32_ONE * 0) + v4->z);
}
if (((v0)->unk_00 & (1 << 5)) == 0) {
v3.y += v0->unk_2C;
} else {
v3.x += v0->unk_14.x;
v3.y += v0->unk_14.y;
v3.z += v0->unk_14.z;
}
OverworldAnimManager_SetPosition(param0, &v3);
}
}
static void ov5_021F8848(OverworldAnimManager *param0, void *param1)
{
UnkStruct_ov5_021F86CC *v0 = param1;
if (((v0)->unk_00 & (1 << 0)) == 0) {
VecFx32 v1;
Simple3DRenderObj *v2 = &v0->unk_38.unk_0C->unk_18;
OverworldAnimManager_GetPosition(param0, &v1);
Simple3D_DrawRenderObjWithPosAndRotationAngles(v2, &v1, &v0->unk_0C);
}
v0->unk_06++;
}
static void ov5_021F8878(int param0, int param1, Simple3DRotationAngles *param2)
{
const Simple3DRotationAngles *v0;
GF_ASSERT((u32)param0 < 6);
v0 = &Unk_ov5_02201C58[param0][param1];
*param2 = *v0;
}
Simple3DRotationAngles *ov5_021F88A8(OverworldAnimManager *param0)
{
UnkStruct_ov5_021F86CC *v0 = OverworldAnimManager_GetFuncsContext(param0);
return &v0->unk_0C;
}
void ov5_021F88B4(OverworldAnimManager *param0, int param1, int param2)
{
UnkStruct_ov5_021F86CC *v0 = OverworldAnimManager_GetFuncsContext(param0);
ov5_021F8878(param2, param1, &v0->unk_0C);
}
void ov5_021F88CC(OverworldAnimManager *param0, int param1)
{
UnkStruct_ov5_021F86CC *v0 = OverworldAnimManager_GetFuncsContext(param0);
v0->unk_00 |= param1;
}
void ov5_021F88DC(OverworldAnimManager *param0, int param1)
{
UnkStruct_ov5_021F86CC *v0 = OverworldAnimManager_GetFuncsContext(param0);
v0->unk_00 &= ~param1;
}
VecFx32 *ov5_021F88F0(OverworldAnimManager *param0)
{
UnkStruct_ov5_021F86CC *v0 = OverworldAnimManager_GetFuncsContext(param0);
return &v0->unk_14;
}
VecFx32 *ov5_021F88FC(OverworldAnimManager *param0)
{
UnkStruct_ov5_021F86CC *v0 = OverworldAnimManager_GetFuncsContext(param0);
return &v0->unk_20;
}
void ov5_021F8908(OverworldAnimManager *param0, u16 param1)
{
UnkStruct_ov5_021F86CC *v0 = OverworldAnimManager_GetFuncsContext(param0);
v0->unk_08 = param1;
}
static const OverworldAnimManagerFuncs Unk_ov5_02201B54 = {
sizeof(UnkStruct_ov5_021F86CC),
ov5_021F8668,
ov5_021F86CC,
ov5_021F86E4,
ov5_021F8848
};
static const VecFx32 Unk_ov5_02201BC8[6] = {
{ (16 * FX32_ONE) >> 1, 0x0, (16 * FX32_ONE) >> 1 },
{ (16 * FX32_ONE) >> 1, 0x0, (16 * FX32_ONE) >> 1 },
{ (16 * FX32_ONE) >> 1, 0x0, (16 * FX32_ONE) >> 1 },
{ (16 * FX32_ONE) >> 1, 0x0, (16 * FX32_ONE) >> 1 },
{ (16 * FX32_ONE) >> 1, 0x0, (16 * FX32_ONE) >> 1 },
{ (16 * FX32_ONE) >> 1, FX32_ONE * 40, (16 * FX32_ONE) >> 1 }
};
static const VecFx32 Unk_ov5_02201C10[6] = {
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 }
};
static const VecFx32 Unk_ov5_02201B80[6] = {
{ (FX32_ONE * 1) / 4, FX32_ONE * 6, FX32_ONE * -5 },
{ (FX32_ONE * 1) / 4, FX32_ONE * 6, FX32_ONE * -5 },
{ (FX32_ONE * 1) / 4, FX32_ONE * 6, FX32_ONE * -5 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x0, FX32_ONE * 6 }
};
static const u32 Unk_ov5_02201B68[6] = {
0x10E,
0x10E,
0x10E,
0x0,
0x0,
0x5A
};
static const Simple3DRotationAngles Unk_ov5_02201C58[6][4] = {
{
{ 0x0, 0xB4, 0x0 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x10E, 0x0 },
{ 0x0, 0x5A, 0x0 },
},
{
{ 0x0, 0xB4, 0x0 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x10E, 0x0 },
{ 0x0, 0x5A, 0x0 },
},
{
{ 0x0, 0xB4, 0x0 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x10E, 0x0 },
{ 0x0, 0x5A, 0x0 },
},
{
{ 0x0, 0xB4, 0x0 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x10E, 0x0 },
{ 0x0, 0x5A, 0x0 },
},
{
{ 0x0, 0xB4, 0x0 },
{ 0x0, 0x0, 0x0 },
{ 0x0, 0x10E, 0x0 },
{ 0x0, 0x5A, 0x0 },
},
{
{ 0xB4, 0xB4, 0x0 },
{ 0xB4, 0x0, 0x0 },
{ 0xB4, 0x5A, 0x0 },
{ 0xB4, 0x10E, 0x0 },
},
};

File diff suppressed because it is too large Load Diff