mirror of
https://github.com/pret/pokeplatinum.git
synced 2026-10-01 22:09:43 -05:00
Document distortion world B4F/B5F waterfall (#1088)
Signed-off-by: Kuruyia <github@kuruyia.net>
This commit is contained in:
committed by
GitHub
parent
12219e2dda
commit
54a7625b0f
@@ -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,
|
||||
};
|
||||
|
||||
46
include/overlay005/dist_world_surf_mount_renderer.h
Normal file
46
include/overlay005/dist_world_surf_mount_renderer.h
Normal 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
|
||||
@@ -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
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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',
|
||||
|
||||
379
src/overlay005/dist_world_surf_mount_renderer.c
Normal file
379
src/overlay005/dist_world_surf_mount_renderer.c
Normal 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 },
|
||||
},
|
||||
};
|
||||
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
@@ -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, ¶m0->unk_04, 0, 81, 0);
|
||||
Simple3D_CreateRenderObject(¶m0->unk_18, ¶m0->unk_04);
|
||||
}
|
||||
|
||||
static void ov5_021F85B0(UnkStruct_ov5_021F858C *param0)
|
||||
{
|
||||
Simple3D_FreeModel(¶m0->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
Reference in New Issue
Block a user