1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-04 06:54:33 +00:00

Merge branch 'master' (early part) into doc_pause_menu

This commit is contained in:
Dragorn421 2022-12-30 15:42:14 +01:00
commit ae8cc175f2
No known key found for this signature in database
GPG key ID: 32B53D2D16FC4118
19 changed files with 622 additions and 517 deletions

View file

@ -761,10 +761,10 @@ u8 CollisionCheck_GetSwordDamage(s32 dmgFlags);
void SaveContext_Init(void); void SaveContext_Init(void);
s32 func_800635D0(s32); s32 func_800635D0(s32);
void Regs_Init(void); void Regs_Init(void);
void func_8006375C(s32 arg0, s32 arg1, const char* text); void DbCamera_ScreenText(u8 x, u8 y, const char* text);
void func_8006376C(u8 x, u8 y, u8 colorIndex, const char* text); void DbCamera_ScreenTextColored(u8 x, u8 y, u8 colorIndex, const char* text);
void Regs_UpdateEditor(Input* input); void Regs_UpdateEditor(Input* input);
void func_80063D7C(GraphicsContext* gfxCtx); void Debug_DrawText(GraphicsContext* gfxCtx);
void DebugDisplay_Init(void); void DebugDisplay_Init(void);
DebugDispObject* DebugDisplay_AddObject(f32 posX, f32 posY, f32 posZ, s16 rotX, s16 rotY, s16 rotZ, f32 scaleX, DebugDispObject* DebugDisplay_AddObject(f32 posX, f32 posY, f32 posZ, s16 rotX, s16 rotY, s16 rotZ, f32 scaleX,
f32 scaleY, f32 scaleZ, u8 red, u8 green, u8 blue, u8 alpha, s16 type, f32 scaleY, f32 scaleZ, u8 red, u8 green, u8 blue, u8 alpha, s16 type,
@ -1208,13 +1208,10 @@ void func_800AD920(struct_80166500* this);
void func_800AD950(struct_80166500* this); void func_800AD950(struct_80166500* this);
void func_800AD958(struct_80166500* this, Gfx** gfxp); void func_800AD958(struct_80166500* this, Gfx** gfxp);
void PlayerCall_InitFuncPtrs(void); void PlayerCall_InitFuncPtrs(void);
void TransitionUnk_InitGraphics(TransitionUnk* this); void TransitionTile_Destroy(TransitionTile* this);
void TransitionUnk_InitData(TransitionUnk* this); TransitionTile* TransitionTile_Init(TransitionTile* this, s32 cols, s32 rows);
void TransitionUnk_Destroy(TransitionUnk* this); void TransitionTile_Draw(TransitionTile* this, Gfx** gfxP);
TransitionUnk* TransitionUnk_Init(TransitionUnk* this, s32 row, s32 col); void TransitionTile_Update(TransitionTile* this);
void TransitionUnk_SetData(TransitionUnk* this);
void TransitionUnk_Draw(TransitionUnk* this, Gfx**);
void func_800B23E8(TransitionUnk* this);
void TransitionTriforce_Start(void* thisx); void TransitionTriforce_Start(void* thisx);
void* TransitionTriforce_Init(void* thisx); void* TransitionTriforce_Init(void* thisx);
void TransitionTriforce_Destroy(void* thisx); void TransitionTriforce_Destroy(void* thisx);

View file

@ -90,6 +90,7 @@
#define R_CAM_AT_LERP_STEP_SCALE_FAC OREG(42) #define R_CAM_AT_LERP_STEP_SCALE_FAC OREG(42)
#define R_CAM_YOFFSET_NORM OREG(46) #define R_CAM_YOFFSET_NORM OREG(46)
#define R_CAM_DATA(type) PREG(0 + (type)) #define R_CAM_DATA(type) PREG(0 + (type))
#define R_CAM_PARALLEL_LOCKON_CALC_SLOPE_Y_ADJ PREG(76)
#define R_DBG_CAM_UPDATE PREG(80) #define R_DBG_CAM_UPDATE PREG(80)
#define R_DBG_REG_UPDATE PREG(82) #define R_DBG_REG_UPDATE PREG(82)
#define R_RELOAD_CAM_PARAMS QREG(0) #define R_RELOAD_CAM_PARAMS QREG(0)

View file

@ -183,7 +183,7 @@ extern LightningStrike gLightningStrike;
extern MapData* gMapData; extern MapData* gMapData;
extern f32 gBossMarkScale; extern f32 gBossMarkScale;
extern PauseMapMarksData* gLoadedPauseMarkDataTable; extern PauseMapMarksData* gLoadedPauseMarkDataTable;
extern s32 gTrnsnUnkState; extern s32 gTransitionTileState;
extern Color_RGBA8_u32 gVisMonoColor; extern Color_RGBA8_u32 gVisMonoColor;
extern PreNmiBuff* gAppNmiBufferPtr; extern PreNmiBuff* gAppNmiBufferPtr;
extern Scheduler gScheduler; extern Scheduler gScheduler;

View file

@ -663,7 +663,7 @@ typedef enum {
/* 0 */ PAUSE_BG_PRERENDER_OFF, // Inactive, do nothing. /* 0 */ PAUSE_BG_PRERENDER_OFF, // Inactive, do nothing.
/* 1 */ PAUSE_BG_PRERENDER_SETUP, // The current frame is only drawn for the purpose of serving as the pause background. /* 1 */ PAUSE_BG_PRERENDER_SETUP, // The current frame is only drawn for the purpose of serving as the pause background.
/* 2 */ PAUSE_BG_PRERENDER_PROCESS, // The previous frame was PAUSE_BG_PRERENDER_SETUP, now apply prerender filters. /* 2 */ PAUSE_BG_PRERENDER_PROCESS, // The previous frame was PAUSE_BG_PRERENDER_SETUP, now apply prerender filters.
/* 3 */ PAUSE_BG_PRERENDER_DONE, // The pause background is ready to be used. /* 3 */ PAUSE_BG_PRERENDER_READY, // The pause background is ready to be used.
/* 4 */ PAUSE_BG_PRERENDER_MAX /* 4 */ PAUSE_BG_PRERENDER_MAX
} PauseBgPreRenderState; } PauseBgPreRenderState;

View file

@ -1567,7 +1567,7 @@ typedef struct Camera {
/* 0x0D8 */ f32 xzSpeed; /* 0x0D8 */ f32 xzSpeed;
/* 0x0DC */ f32 dist; /* 0x0DC */ f32 dist;
/* 0x0E0 */ f32 speedRatio; /* 0x0E0 */ f32 speedRatio;
/* 0x0E4 */ Vec3f posOffset; /* 0x0E4 */ Vec3f playerToAtOffset;
/* 0x0F0 */ Vec3f playerPosDelta; /* 0x0F0 */ Vec3f playerPosDelta;
/* 0x0FC */ f32 fov; /* 0x0FC */ f32 fov;
/* 0x100 */ f32 atLERPStepScale; /* 0x100 */ f32 atLERPStepScale;
@ -1675,4 +1675,15 @@ typedef struct {
/* 0x2C */ f32 fov; /* 0x2C */ f32 fov;
} DbCameraAnim; // size = 0x30 } DbCameraAnim; // size = 0x30
typedef enum {
/* 0 */ DBCAMERA_TEXT_YELLOW,
/* 1 */ DBCAMERA_TEXT_PEACH,
/* 2 */ DBCAMERA_TEXT_BROWN,
/* 3 */ DBCAMERA_TEXT_ORANGE,
/* 4 */ DBCAMERA_TEXT_GOLD,
/* 5 */ DBCAMERA_TEXT_WHITE,
/* 6 */ DBCAMERA_TEXT_BLUE,
/* 7 */ DBCAMERA_TEXT_GREEN
} DbCameraTextColor;
#endif #endif

View file

@ -271,7 +271,7 @@
CMD_W(unk1), CMD_W(unk2), CMD_W(unk3), CMD_W(unk4), CMD_W(unk5), CMD_W(unk6), \ CMD_W(unk1), CMD_W(unk2), CMD_W(unk3), CMD_W(unk4), CMD_W(unk5), CMD_W(unk6), \
CMD_W(unk7), CMD_W(unk8), CMD_W(unk9), CMD_W(unk10), CMD_W(unk11), CMD_W(unk12) CMD_W(unk7), CMD_W(unk8), CMD_W(unk9), CMD_W(unk10), CMD_W(unk11), CMD_W(unk12)
// TODO: Fix ZAPD and delete these // TODO: Fix ZAPD and delete these (everything to the end of the file)
#define CS_CAM_POS_LIST CS_CAM_EYE_SPLINE #define CS_CAM_POS_LIST CS_CAM_EYE_SPLINE
#define CS_CAM_POS CS_CAM_POINT #define CS_CAM_POS CS_CAM_POINT
#define CS_CAM_FOCUS_POINT_LIST CS_CAM_AT_SPLINE #define CS_CAM_FOCUS_POINT_LIST CS_CAM_AT_SPLINE
@ -296,6 +296,18 @@
#define CS_FADE_BGM CS_FADE_OUT_SEQ #define CS_FADE_BGM CS_FADE_OUT_SEQ
#define CS_TERMINATOR CS_DESTINATION #define CS_TERMINATOR CS_DESTINATION
// CS_TIME macro:
// The last argument of the macro was removed, but ZAPD isn't aware
// Passing 6 arguments to a 5-arguments macro works fine with IDO, so ignore this hack for IDO
#ifndef __sgi
// Only spot06_scene uses CS_TIME. Limit the hack to that file, so everything else can use the new macro
# ifdef SPOT06_SCENE_H
# undef CS_TIME
# define CS_TIME(unused0, startFrame, endFrame, hour, min, _unusedZapdCompatibilityArg) \
CMD_HH(unused0, startFrame), CMD_HBB(endFrame, hour, min), CMD_W(0)
# endif
#endif
#define CS_PLAY_BGM(seqId, startFrame, endFrame, unused0, unused1, unused2, unused3, unused4, unused5, unused6, unused7) \ #define CS_PLAY_BGM(seqId, startFrame, endFrame, unused0, unused1, unused2, unused3, unused4, unused5, unused6, unused7) \
CS_START_SEQ((seqId)-1, startFrame, endFrame, unused0, unused1, unused2, unused3, unused4, unused5, unused6, unused7) CS_START_SEQ((seqId)-1, startFrame, endFrame, unused0, unused1, unused2, unused3, unused4, unused5, unused6, unused7)

View file

@ -4,16 +4,23 @@
#include "ultra64.h" #include "ultra64.h"
#include "color.h" #include "color.h"
typedef struct { typedef enum {
f32 unk_0; /* 0 */ TRANS_TILE_OFF, // Inactive, do nothing
f32 unk_4; /* 1 */ TRANS_TILE_SETUP, // Save the necessary buffers
} TransitionUnkData; /* 2 */ TRANS_TILE_PROCESS, // Initialize the transition
/* 3 */ TRANS_TILE_READY // The transition is ready, so will update and draw each frame
} TransitionTileStatus;
typedef struct { typedef struct {
/* 0x00 */ s32 row; /* 0x0 */ f32 x;
/* 0x04 */ s32 col; /* 0x4 */ f32 y;
} TransitionTileVtxData; // size = 0x8
typedef struct {
/* 0x00 */ s32 cols;
/* 0x04 */ s32 rows;
/* 0x08 */ s32 frame; /* 0x08 */ s32 frame;
/* 0x0C */ TransitionUnkData* unk_0C; /* 0x0C */ TransitionTileVtxData* vtxData;
/* 0x10 */ Vtx* vtxFrame1; /* 0x10 */ Vtx* vtxFrame1;
/* 0x14 */ Vtx* vtxFrame2; /* 0x14 */ Vtx* vtxFrame2;
/* 0x18 */ Mtx projection; /* 0x18 */ Mtx projection;
@ -21,7 +28,7 @@ typedef struct {
/* 0x98 */ Mtx unk_98; /* 0x98 */ Mtx unk_98;
/* 0xD8 */ Gfx* gfx; // "gfxtbl" /* 0xD8 */ Gfx* gfx; // "gfxtbl"
/* 0xDC */ u16* zBuffer; /* 0xDC */ u16* zBuffer;
} TransitionUnk; // size = 0xE0 } TransitionTile; // size = 0xE0
typedef enum { typedef enum {
/* 1 */ TRANS_INSTANCE_TYPE_FILL_OUT = 1, /* 1 */ TRANS_INSTANCE_TYPE_FILL_OUT = 1,

View file

@ -364,9 +364,9 @@ void func_800B44E0(DbCamera* dbCamera, Camera* cam) {
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
sDbCamAnim.unk_0A = 0; sDbCamAnim.unk_0A = 0;
} }
func_8006376C(0x11, 0x17, 3, D_8012CEE0[0]); DbCamera_ScreenTextColored(17, 23, DBCAMERA_TEXT_ORANGE, D_8012CEE0[0]);
func_8006376C(0x12, 0x18, 3, D_8012CEE4); DbCamera_ScreenTextColored(18, 24, DBCAMERA_TEXT_ORANGE, D_8012CEE4);
func_8006376C(0x10, 0x1A, 1, D_8012CEE8); DbCamera_ScreenTextColored(16, 26, DBCAMERA_TEXT_PEACH, D_8012CEE8);
return; return;
} }
@ -381,7 +381,7 @@ void func_800B44E0(DbCamera* dbCamera, Camera* cam) {
if (dbCamera->sub.nFrames > 0 && dbCamera->sub.nFrames < sDbCamAnim.unk_04) { if (dbCamera->sub.nFrames > 0 && dbCamera->sub.nFrames < sDbCamAnim.unk_04) {
sDbCamAnim.unk_0A = 0; sDbCamAnim.unk_0A = 0;
func_8006376C(0xF, 0x1A, 1, D_8012CEEC); DbCamera_ScreenTextColored(15, 26, DBCAMERA_TEXT_PEACH, D_8012CEEC);
} }
if (dbCamera->sub.mode != 1) { if (dbCamera->sub.mode != 1) {
@ -397,18 +397,18 @@ void func_800B44E0(DbCamera* dbCamera, Camera* cam) {
dbCamera->rollDegrees = sDbCamAnim.roll * (360.0f / 256.0f); dbCamera->rollDegrees = sDbCamAnim.roll * (360.0f / 256.0f);
DbCamera_SetTextValue(sDbCamAnim.unk_04, &D_8012CFB4[8], 4); DbCamera_SetTextValue(sDbCamAnim.unk_04, &D_8012CFB4[8], 4);
func_8006376C(0x10, 0x17, 3, D_8012CFB4); DbCamera_ScreenTextColored(16, 23, DBCAMERA_TEXT_ORANGE, D_8012CFB4);
D_8012CFC4[5] = ((sDbCamAnim.keyframe + 1) / 10) + '0'; D_8012CFC4[5] = ((sDbCamAnim.keyframe + 1) / 10) + '0';
D_8012CFC4[6] = ((sDbCamAnim.keyframe + 1) % 10) + '0'; D_8012CFC4[6] = ((sDbCamAnim.keyframe + 1) % 10) + '0';
D_8012CFC4[8] = ((dbCamera->sub.nPoints - 5) / 10) + '0'; D_8012CFC4[8] = ((dbCamera->sub.nPoints - 5) / 10) + '0';
D_8012CFC4[9] = ((dbCamera->sub.nPoints - 5) % 10) + '0'; D_8012CFC4[9] = ((dbCamera->sub.nPoints - 5) % 10) + '0';
func_8006376C(0x10, 0x18, 3, D_8012CFC4); DbCamera_ScreenTextColored(16, 24, DBCAMERA_TEXT_ORANGE, D_8012CFC4);
func_8006376C(0x10, 0x1A, 1, D_8012CEF0); DbCamera_ScreenTextColored(16, 26, DBCAMERA_TEXT_PEACH, D_8012CEF0);
return; return;
} }
sDbCamAnim.unk_0A = 0; sDbCamAnim.unk_0A = 0;
func_8006376C(0xF, 0x1A, 1, D_8012CEEC); DbCamera_ScreenTextColored(15, 26, DBCAMERA_TEXT_PEACH, D_8012CEEC);
} }
void DbCamera_PrintPoints(const char* name, s16 count, CutsceneCameraPoint* points) { void DbCamera_PrintPoints(const char* name, s16 count, CutsceneCameraPoint* points) {
@ -989,7 +989,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
if (dbCamera->unk_00 == 1) { if (dbCamera->unk_00 == 1) {
OREG(0) = 8; OREG(0) = 8;
func_8006376C(0xC, 5, 0, D_8012CEF4); DbCamera_ScreenTextColored(12, 5, DBCAMERA_TEXT_YELLOW, D_8012CEF4);
if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_CRIGHT) && if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_CRIGHT) &&
!CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) { !CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
func_800B44E0(dbCamera, cam); func_800B44E0(dbCamera, cam);
@ -1075,21 +1075,24 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
} }
} }
func_8006376C(0xA, 6, (dbCamera->sub.unk_08 == 0) ? 7 : 4, D_8012D00C); DbCamera_ScreenTextColored(10, 6, (dbCamera->sub.unk_08 == 0) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD,
func_8006376C(0x11, 6, (dbCamera->sub.unk_08 == 1) ? 7 : 4, D_8012D020); D_8012D00C);
func_8006376C(0x17, 6, (dbCamera->sub.unk_08 == 2) ? 7 : 4, D_8012D034); DbCamera_ScreenTextColored(17, 6, (dbCamera->sub.unk_08 == 1) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD,
D_8012D020);
DbCamera_ScreenTextColored(23, 6, (dbCamera->sub.unk_08 == 2) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD,
D_8012D034);
if (dbCamera->sub.unkIdx == 0x80) { if (dbCamera->sub.unkIdx == 0x80) {
func_8006376C(0x10, 0x1A, 1, D_8012CEF8[0]); DbCamera_ScreenTextColored(16, 26, DBCAMERA_TEXT_PEACH, D_8012CEF8[0]);
} else if (dbCamera->sub.unkIdx == (dbCamera->sub.nPoints - 1)) { } else if (dbCamera->sub.unkIdx == (dbCamera->sub.nPoints - 1)) {
D_8012CEE0[7][10] = (dbCamera->sub.nPoints / 10) + '0'; D_8012CEE0[7][10] = (dbCamera->sub.nPoints / 10) + '0';
D_8012CEE0[7][11] = (dbCamera->sub.nPoints % 10) + '0'; D_8012CEE0[7][11] = (dbCamera->sub.nPoints % 10) + '0';
func_8006376C(0xF, 0x1A, 1, D_8012CEE0[7]); DbCamera_ScreenTextColored(15, 26, DBCAMERA_TEXT_PEACH, D_8012CEE0[7]);
} else { } else {
D_8012CEE0[8][10] = ((dbCamera->sub.unkIdx + 1) / 10) + '0'; D_8012CEE0[8][10] = ((dbCamera->sub.unkIdx + 1) / 10) + '0';
D_8012CEE0[8][11] = ((dbCamera->sub.unkIdx + 1) % 10) + '0'; D_8012CEE0[8][11] = ((dbCamera->sub.unkIdx + 1) % 10) + '0';
D_8012CEE0[8][13] = ((dbCamera->sub.nPoints - 1) / 10) + '0'; D_8012CEE0[8][13] = ((dbCamera->sub.nPoints - 1) / 10) + '0';
D_8012CEE0[8][14] = ((dbCamera->sub.nPoints - 1) % 10) + '0'; D_8012CEE0[8][14] = ((dbCamera->sub.nPoints - 1) % 10) + '0';
func_8006376C(0xF, 0x1A, 1, D_8012CEE0[8]); DbCamera_ScreenTextColored(15, 26, DBCAMERA_TEXT_PEACH, D_8012CEE0[8]);
} }
switch (dbCamera->sub.unk_08) { switch (dbCamera->sub.unk_08) {
@ -1099,25 +1102,25 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
case 0: case 0:
dbCamera->unk_3C = false; dbCamera->unk_3C = false;
if (dbCamera->sub.mode != 1) { if (dbCamera->sub.mode != 1) {
func_8006376C(0xD, 0x18, 3, !D_80161144 ? D_8012CF04 : D_8012CF08); DbCamera_ScreenTextColored(13, 24, DBCAMERA_TEXT_ORANGE, !D_80161144 ? D_8012CF04 : D_8012CF08);
DbCamera_SetTextValue(CAM_BINANG_TO_DEG(sp104.pitch), &D_8012D0E4[11], 4); DbCamera_SetTextValue(CAM_BINANG_TO_DEG(sp104.pitch), &D_8012D0E4[11], 4);
func_8006376C(0xF, 0x17, 3, D_8012D0E4); DbCamera_ScreenTextColored(15, 23, DBCAMERA_TEXT_ORANGE, D_8012D0E4);
DbCamera_SetTextValue(CAM_BINANG_TO_DEG(sp104.yaw), &D_8012D0F8[11], 4); DbCamera_SetTextValue(CAM_BINANG_TO_DEG(sp104.yaw), &D_8012D0F8[11], 4);
func_8006376C(0xF, 0x18, 3, D_8012D0F8); DbCamera_ScreenTextColored(15, 24, DBCAMERA_TEXT_ORANGE, D_8012D0F8);
DbCamera_SetTextValue(sp104.r, &D_8012D0D4[8], 6); DbCamera_SetTextValue(sp104.r, &D_8012D0D4[8], 6);
func_8006376C(0xF, 0x19, 3, D_8012D0D4); DbCamera_ScreenTextColored(15, 25, DBCAMERA_TEXT_ORANGE, D_8012D0D4);
} else { } else {
func_8006376C(0xE, 0x18, 3, D_8012CF0C); DbCamera_ScreenTextColored(14, 24, DBCAMERA_TEXT_ORANGE, D_8012CF0C);
func_8006376C(0x10, 0x16, 3, D_8012CF10); DbCamera_ScreenTextColored(16, 22, DBCAMERA_TEXT_ORANGE, D_8012CF10);
sp110 = 'X'; sp110 = 'X';
DbCamera_SetTextValue(temp_s6->pos.x, &sp111, 7); DbCamera_SetTextValue(temp_s6->pos.x, &sp111, 7);
func_8006376C(0x10, 0x17, 3, &sp110); DbCamera_ScreenTextColored(16, 23, DBCAMERA_TEXT_ORANGE, &sp110);
sp110 = 'Y'; sp110 = 'Y';
DbCamera_SetTextValue(temp_s6->pos.y, &sp111, 7); DbCamera_SetTextValue(temp_s6->pos.y, &sp111, 7);
func_8006376C(0x10, 0x18, 3, &sp110); DbCamera_ScreenTextColored(16, 24, DBCAMERA_TEXT_ORANGE, &sp110);
sp110 = 'Z'; sp110 = 'Z';
DbCamera_SetTextValue(temp_s6->pos.z, &sp111, 7); DbCamera_SetTextValue(temp_s6->pos.z, &sp111, 7);
func_8006376C(0x10, 0x19, 3, &sp110); DbCamera_ScreenTextColored(16, 25, DBCAMERA_TEXT_ORANGE, &sp110);
} }
break; break;
case 1: case 1:
@ -1305,12 +1308,16 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
} }
DbCamera_SetTextValue(dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle, &D_8012D05C[10], 3); DbCamera_SetTextValue(dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle, &D_8012D05C[10], 3);
func_8006376C(0x10, 0x14, (dbCamera->sub.unk_0A == 0) ? 7 : 4, D_8012D05C); DbCamera_ScreenTextColored(
16, 20, (dbCamera->sub.unk_0A == 0) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD, D_8012D05C);
DbCamera_SetTextValue(dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame, &D_8012D070[9], 3); DbCamera_SetTextValue(dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame, &D_8012D070[9], 3);
func_8006376C(0x10, 0x15, (dbCamera->sub.unk_0A == 1) ? 7 : 4, D_8012D070); DbCamera_ScreenTextColored(
16, 21, (dbCamera->sub.unk_0A == 1) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD, D_8012D070);
DbCamera_SetTextValue(dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll, &D_8012D084[10], 3); DbCamera_SetTextValue(dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll, &D_8012D084[10], 3);
func_8006376C(0x10, 0x16, (dbCamera->sub.unk_0A == 2) ? 7 : 4, D_8012D084); DbCamera_ScreenTextColored(
func_8006376C(0xF, 0x17, (dbCamera->sub.unk_0A == 3) ? 7 : 4, 16, 22, (dbCamera->sub.unk_0A == 2) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD, D_8012D084);
DbCamera_ScreenTextColored(15, 23,
(dbCamera->sub.unk_0A == 3) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD,
(dbCamera->sub.mode == 1) ? D_8012CF14 (dbCamera->sub.mode == 1) ? D_8012CF14
: (dbCamera->sub.mode == 0) ? *D_8012CF18 : (dbCamera->sub.mode == 0) ? *D_8012CF18
: D_8012CFB0); : D_8012CFB0);
@ -1329,70 +1336,76 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
D_8012D05C[95] = '<'; D_8012D05C[95] = '<';
} }
D_8012D05C[96] = '\0'; D_8012D05C[96] = '\0';
func_8006376C(0xF, 0x18, (dbCamera->sub.unk_0A == 4) ? 7 : 4, D_8012D0AC); DbCamera_ScreenTextColored(
15, 24, (dbCamera->sub.unk_0A == 4) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD, D_8012D0AC);
DbCamera_SetTextValue(dbCamera->sub.nFrames, &D_8012D0C0[10], 5); DbCamera_SetTextValue(dbCamera->sub.nFrames, &D_8012D0C0[10], 5);
func_8006376C(0xF, 0x19, (dbCamera->sub.unk_0A == 5) ? 7 : 4, DbCamera_ScreenTextColored(15, 25,
(dbCamera->sub.unk_0A == 5) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD,
(dbCamera->sub.nFrames == -1) ? *D_8012CF24 : D_8012D0C0); (dbCamera->sub.nFrames == -1) ? *D_8012CF24 : D_8012D0C0);
break; break;
} }
if (dbCamera->sub.mode != 1) { if (dbCamera->sub.mode != 1) {
func_8006376C(3, 0x16, DbCamera_ScreenTextColored(3, 22,
((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && !D_80161144) ? 7 ((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && !D_80161144)
: !D_80161144 ? 4 ? DBCAMERA_TEXT_GREEN
: 3, : !D_80161144 ? DBCAMERA_TEXT_GOLD
: DBCAMERA_TEXT_ORANGE,
D_8012CF30); D_8012CF30);
sp110 = 'X'; sp110 = 'X';
DbCamera_SetTextValue(dbCamera->at.x, &sp111, 6); DbCamera_SetTextValue(dbCamera->at.x, &sp111, 6);
func_8006376C(3, 0x17, 2, &sp110); DbCamera_ScreenTextColored(3, 23, DBCAMERA_TEXT_BROWN, &sp110);
sp110 = 'Y'; sp110 = 'Y';
DbCamera_SetTextValue(dbCamera->at.y, &sp111, 6); DbCamera_SetTextValue(dbCamera->at.y, &sp111, 6);
func_8006376C(3, 0x18, 2, &sp110); DbCamera_ScreenTextColored(3, 24, DBCAMERA_TEXT_BROWN, &sp110);
sp110 = 'Z'; sp110 = 'Z';
DbCamera_SetTextValue(dbCamera->at.z, &sp111, 6); DbCamera_SetTextValue(dbCamera->at.z, &sp111, 6);
func_8006376C(3, 0x19, 2, &sp110); DbCamera_ScreenTextColored(3, 25, DBCAMERA_TEXT_BROWN, &sp110);
func_8006376C(0x1E, 0x16, DbCamera_ScreenTextColored(30, 22,
((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && D_80161144) ? 7 ((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && D_80161144)
: D_80161144 ? 4 ? DBCAMERA_TEXT_GREEN
: 3, : D_80161144 ? DBCAMERA_TEXT_GOLD
: DBCAMERA_TEXT_ORANGE,
D_8012CF34); D_8012CF34);
sp110 = 'X'; sp110 = 'X';
DbCamera_SetTextValue(dbCamera->eye.x, &sp111, 6); DbCamera_SetTextValue(dbCamera->eye.x, &sp111, 6);
func_8006376C(0x1E, 0x17, 2, &sp110); DbCamera_ScreenTextColored(30, 23, DBCAMERA_TEXT_BROWN, &sp110);
sp110 = 'Y'; sp110 = 'Y';
DbCamera_SetTextValue(dbCamera->eye.y, &sp111, 6); DbCamera_SetTextValue(dbCamera->eye.y, &sp111, 6);
func_8006376C(0x1E, 0x18, 2, &sp110); DbCamera_ScreenTextColored(30, 24, DBCAMERA_TEXT_BROWN, &sp110);
sp110 = 'Z'; sp110 = 'Z';
DbCamera_SetTextValue(dbCamera->eye.z, &sp111, 6); DbCamera_SetTextValue(dbCamera->eye.z, &sp111, 6);
func_8006376C(0x1E, 0x19, 2, &sp110); DbCamera_ScreenTextColored(30, 25, DBCAMERA_TEXT_BROWN, &sp110);
} else { } else {
if (D_8012CEE0[0]) {} if (D_8012CEE0[0]) {}
OLib_Vec3fDiffToVecGeo(&spFC, sp90, sp7C); OLib_Vec3fDiffToVecGeo(&spFC, sp90, sp7C);
spFC.yaw -= cam->playerPosRot.rot.y; spFC.yaw -= cam->playerPosRot.rot.y;
func_8006376C(3, 0x16, DbCamera_ScreenTextColored(3, 22,
((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && !D_80161144) ? 7 ((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && !D_80161144)
: !D_80161144 ? 4 ? DBCAMERA_TEXT_GREEN
: 3, : !D_80161144 ? DBCAMERA_TEXT_GOLD
: DBCAMERA_TEXT_ORANGE,
D_8012CF30); D_8012CF30);
DbCamera_SetTextValue(CAM_BINANG_TO_DEG(spFC.pitch), &D_8012D0E4[10], 4); DbCamera_SetTextValue(CAM_BINANG_TO_DEG(spFC.pitch), &D_8012D0E4[10], 4);
func_8006376C(3, 0x17, 3, D_8012D0E4); DbCamera_ScreenTextColored(3, 23, DBCAMERA_TEXT_ORANGE, D_8012D0E4);
DbCamera_SetTextValue(CAM_BINANG_TO_DEG(spFC.yaw), &D_8012D0F8[10], 4); DbCamera_SetTextValue(CAM_BINANG_TO_DEG(spFC.yaw), &D_8012D0F8[10], 4);
func_8006376C(3, 0x18, 3, D_8012D0F8); DbCamera_ScreenTextColored(3, 24, DBCAMERA_TEXT_ORANGE, D_8012D0F8);
DbCamera_SetTextValue(spFC.r, &D_8012D0D4[7], 6); DbCamera_SetTextValue(spFC.r, &D_8012D0D4[7], 6);
func_8006376C(3, 0x19, 3, D_8012D0D4); DbCamera_ScreenTextColored(3, 25, DBCAMERA_TEXT_ORANGE, D_8012D0D4);
OLib_Vec3fDiffToVecGeo(&spFC, sp90, sp80); OLib_Vec3fDiffToVecGeo(&spFC, sp90, sp80);
spFC.yaw -= cam->playerPosRot.rot.y; spFC.yaw -= cam->playerPosRot.rot.y;
func_8006376C(0x1E, 0x16, DbCamera_ScreenTextColored(30, 22,
((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && D_80161144) ? 7 ((dbCamera->sub.unk_08 == 1) && (dbCamera->sub.unk_0A == 4) && D_80161144)
: D_80161144 ? 4 ? DBCAMERA_TEXT_GREEN
: 3, : D_80161144 ? DBCAMERA_TEXT_GOLD
: DBCAMERA_TEXT_ORANGE,
D_8012CF34); D_8012CF34);
DbCamera_SetTextValue(CAM_BINANG_TO_DEG(spFC.pitch), &D_8012D0E4[10], 4); DbCamera_SetTextValue(CAM_BINANG_TO_DEG(spFC.pitch), &D_8012D0E4[10], 4);
func_8006376C(0x1C, 0x17, 3, D_8012D0E4); DbCamera_ScreenTextColored(28, 23, DBCAMERA_TEXT_ORANGE, D_8012D0E4);
DbCamera_SetTextValue(CAM_BINANG_TO_DEG(spFC.yaw), &D_8012D0F8[10], 4); DbCamera_SetTextValue(CAM_BINANG_TO_DEG(spFC.yaw), &D_8012D0F8[10], 4);
func_8006376C(0x1C, 0x18, 3, D_8012D0F8); DbCamera_ScreenTextColored(28, 24, DBCAMERA_TEXT_ORANGE, D_8012D0F8);
DbCamera_SetTextValue(spFC.r, &D_8012D0D4[7], 6); DbCamera_SetTextValue(spFC.r, &D_8012D0D4[7], 6);
func_8006376C(0x1C, 0x19, 3, D_8012D0D4); DbCamera_ScreenTextColored(28, 25, DBCAMERA_TEXT_ORANGE, D_8012D0D4);
} }
DebugDisplay_AddObject(dbCamera->at.x, dbCamera->at.y + 1.0f, dbCamera->at.z, 0, 0, 0, 0.02f, 2.0f, 0.02f, DebugDisplay_AddObject(dbCamera->at.x, dbCamera->at.y + 1.0f, dbCamera->at.z, 0, 0, 0, 0.02f, 2.0f, 0.02f,
@ -1438,41 +1451,44 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_38 = -1; dbCamera->unk_38 = -1;
} }
func_8006376C(0xE, 5, 0, D_8012CF38); DbCamera_ScreenTextColored(14, 5, DBCAMERA_TEXT_YELLOW, D_8012CF38);
func_8006376C(9, 6, (dbCamera->unk_78 == 0) ? 7 : 4, D_8012CFD0); DbCamera_ScreenTextColored(9, 6, (dbCamera->unk_78 == 0) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD,
func_8006376C(0x11, 6, (dbCamera->unk_78 == 1) ? 7 : 4, D_8012CFE4); D_8012CFD0);
func_8006376C(0x18, 6, (dbCamera->unk_78 == 2) ? 7 : 4, D_8012CFF8); DbCamera_ScreenTextColored(17, 6, (dbCamera->unk_78 == 1) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD,
func_8006376C(3, 0x16, D_80161144 ? 3 : 4, D_8012CF30); D_8012CFE4);
DbCamera_ScreenTextColored(24, 6, (dbCamera->unk_78 == 2) ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD,
D_8012CFF8);
DbCamera_ScreenTextColored(3, 22, D_80161144 ? DBCAMERA_TEXT_ORANGE : DBCAMERA_TEXT_GOLD, D_8012CF30);
sp110 = 'X'; sp110 = 'X';
DbCamera_SetTextValue(dbCamera->at.x, &sp111, 6); DbCamera_SetTextValue(dbCamera->at.x, &sp111, 6);
func_8006376C(3, 0x17, 2, &sp110); DbCamera_ScreenTextColored(3, 23, DBCAMERA_TEXT_BROWN, &sp110);
sp110 = 'Y'; sp110 = 'Y';
DbCamera_SetTextValue(dbCamera->at.y, &sp111, 6); DbCamera_SetTextValue(dbCamera->at.y, &sp111, 6);
func_8006376C(3, 0x18, 2, &sp110); DbCamera_ScreenTextColored(3, 24, DBCAMERA_TEXT_BROWN, &sp110);
sp110 = 'Z'; sp110 = 'Z';
DbCamera_SetTextValue(dbCamera->at.z, &sp111, 6); DbCamera_SetTextValue(dbCamera->at.z, &sp111, 6);
func_8006376C(3, 0x19, 2, &sp110); DbCamera_ScreenTextColored(3, 25, DBCAMERA_TEXT_BROWN, &sp110);
func_8006376C(0x1E, 0x16, D_80161144 ? 4 : 3, D_8012CF34); DbCamera_ScreenTextColored(30, 22, D_80161144 ? DBCAMERA_TEXT_GOLD : DBCAMERA_TEXT_ORANGE, D_8012CF34);
sp110 = 'X'; sp110 = 'X';
DbCamera_SetTextValue(dbCamera->eye.x, &sp111, 6); DbCamera_SetTextValue(dbCamera->eye.x, &sp111, 6);
func_8006376C(0x1E, 0x17, 2, &sp110); DbCamera_ScreenTextColored(30, 23, DBCAMERA_TEXT_BROWN, &sp110);
sp110 = 'Y'; sp110 = 'Y';
DbCamera_SetTextValue(dbCamera->eye.y, &sp111, 6); DbCamera_SetTextValue(dbCamera->eye.y, &sp111, 6);
func_8006376C(0x1E, 0x18, 2, &sp110); DbCamera_ScreenTextColored(30, 24, DBCAMERA_TEXT_BROWN, &sp110);
sp110 = 'Z'; sp110 = 'Z';
DbCamera_SetTextValue(dbCamera->eye.z, &sp111, 6); DbCamera_SetTextValue(dbCamera->eye.z, &sp111, 6);
func_8006376C(0x1E, 0x19, 2, &sp110); DbCamera_ScreenTextColored(30, 25, DBCAMERA_TEXT_BROWN, &sp110);
func_8006376C(0xD, 0x18, 3, !D_80161144 ? D_8012CF04 : D_8012CF08); DbCamera_ScreenTextColored(13, 24, DBCAMERA_TEXT_ORANGE, !D_80161144 ? D_8012CF04 : D_8012CF08);
DbCamera_SetTextValue(CAM_BINANG_TO_DEG(sp104.pitch), &D_8012D0E4[11], 4); DbCamera_SetTextValue(CAM_BINANG_TO_DEG(sp104.pitch), &D_8012D0E4[11], 4);
func_8006376C(0xF, 0x17, 3, D_8012D0E4); DbCamera_ScreenTextColored(15, 23, DBCAMERA_TEXT_ORANGE, D_8012D0E4);
DbCamera_SetTextValue(CAM_BINANG_TO_DEG(sp104.yaw), &D_8012D0F8[11], 4); DbCamera_SetTextValue(CAM_BINANG_TO_DEG(sp104.yaw), &D_8012D0F8[11], 4);
func_8006376C(0xF, 0x18, 3, D_8012D0F8); DbCamera_ScreenTextColored(15, 24, DBCAMERA_TEXT_ORANGE, D_8012D0F8);
DbCamera_SetTextValue(sp104.r, &D_8012D0D4[8], 6); DbCamera_SetTextValue(sp104.r, &D_8012D0D4[8], 6);
func_8006376C(0xF, 0x19, 3, D_8012D0D4); DbCamera_ScreenTextColored(15, 25, DBCAMERA_TEXT_ORANGE, D_8012D0D4);
if (dbCamera->unk_3C) { if (dbCamera->unk_3C) {
func_8006376C(0x10, 0x1A, 1, D_8012CF3C); DbCamera_ScreenTextColored(16, 26, DBCAMERA_TEXT_PEACH, D_8012CF3C);
} else { } else {
func_8006376C(0x10, 0x1A, 1, D_8012CF40); DbCamera_ScreenTextColored(16, 26, DBCAMERA_TEXT_PEACH, D_8012CF40);
} }
D_8012D110++; D_8012D110++;
@ -1706,9 +1722,9 @@ void DbCamera_DrawSlotLetters(char* str, s16 y, s16 x, s32 colorIndex) {
} }
str[0x14] = str[i * 2 + 1] = '\0'; str[0x14] = str[i * 2 + 1] = '\0';
func_8006376C(x, y, colorIndex, str); DbCamera_ScreenTextColored(x, y, colorIndex, str);
str[0x14] = str[i * 2 + 0] = '-'; str[0x14] = str[i * 2 + 0] = '-';
func_8006376C(x + 0x14, y, colorIndex, str + 0x14); DbCamera_ScreenTextColored(20 + x, y, colorIndex, str + 0x14);
} }
void DbCamera_PrintAllCuts(Camera* cam) { void DbCamera_PrintAllCuts(Camera* cam) {
@ -1766,11 +1782,11 @@ s32 func_800B91B0(Camera* cam, DbCamera* dbCamera) {
D_8012D13C[10] = ((sDbCameraCuts[D_8016110C].nPoints - 5) / 10) + '0'; D_8012D13C[10] = ((sDbCameraCuts[D_8016110C].nPoints - 5) / 10) + '0';
D_8012D13C[11] = ((sDbCameraCuts[D_8016110C].nPoints - 5) % 10) + '0'; D_8012D13C[11] = ((sDbCameraCuts[D_8016110C].nPoints - 5) % 10) + '0';
DbCamera_SetTextValue(sDbCamAnim.unk_04, &D_8012D114[10], 4); DbCamera_SetTextValue(sDbCamAnim.unk_04, &D_8012D114[10], 4);
func_8006376C(0xF, 0x16, 3, D_8012D114); DbCamera_ScreenTextColored(15, 22, DBCAMERA_TEXT_ORANGE, D_8012D114);
DbCamera_SetTextValue(sDbCamAnim.unk_0C, &D_8012D128[10], 4); DbCamera_SetTextValue(sDbCamAnim.unk_0C, &D_8012D128[10], 4);
func_8006376C(0xF, 0x17, 3, D_8012D128); DbCamera_ScreenTextColored(15, 23, DBCAMERA_TEXT_ORANGE, D_8012D128);
func_8006376C(0xF, 0x18, 3, D_8012D13C); DbCamera_ScreenTextColored(15, 24, DBCAMERA_TEXT_ORANGE, D_8012D13C);
func_8006376C(0x10, 0x1A, 1, D_8012CEF0); DbCamera_ScreenTextColored(16, 26, DBCAMERA_TEXT_PEACH, D_8012CEF0);
sDbCamAnim.unk_04++; sDbCamAnim.unk_04++;
sDbCamAnim.unk_0C++; sDbCamAnim.unk_0C++;
@ -1833,7 +1849,8 @@ void DbCamera_Reset(Camera* cam, DbCamera* dbCam) {
s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) { s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
static s32 sMempakFiles; static s32 sMempakFiles;
static u32 sDbCameraColors[] = { static u32 sDbCameraColors[] = {
4, 4, 4, 7, 4, 4, DBCAMERA_TEXT_GOLD, DBCAMERA_TEXT_GOLD, DBCAMERA_TEXT_GOLD,
DBCAMERA_TEXT_GREEN, DBCAMERA_TEXT_GOLD, DBCAMERA_TEXT_GOLD,
}; };
static s32 sMempakFilesize = 0; static s32 sMempakFilesize = 0;
s32 i; s32 i;
@ -1845,7 +1862,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
VecGeo sp5C; VecGeo sp5C;
s32 (*callbacks[])(char*) = { DbCamera_SaveCallback, DbCamera_LoadCallback, DbCamera_ClearCallback }; s32 (*callbacks[])(char*) = { DbCamera_SaveCallback, DbCamera_LoadCallback, DbCamera_ClearCallback };
func_8006376C(0xE, 5, 0, D_8012CF44); // DEMO CONTROL DbCamera_ScreenTextColored(14, 5, DBCAMERA_TEXT_YELLOW, D_8012CF44); // DEMO CONTROL
idx1 = sCurFileIdx >> 1; idx1 = sCurFileIdx >> 1;
idx2 = sLastFileIdx >> 1; idx2 = sLastFileIdx >> 1;
@ -1867,12 +1884,17 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
dbCamera->sub.demoCtrlToggleSwitch ^= 1; dbCamera->sub.demoCtrlToggleSwitch ^= 1;
} }
D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx); D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx);
func_8006376C(0xA, 7, 5, D_8012CEE0[41]); DbCamera_ScreenTextColored(10, 7, DBCAMERA_TEXT_WHITE, D_8012CEE0[41]);
func_8006376C(0x10, 7, 5, D_8012CF60[dbCamera->sub.demoCtrlActionIdx]); DbCamera_ScreenTextColored(16, 7, DBCAMERA_TEXT_WHITE,
func_8006376C(0x14, 7, 5, D_8012CF88[0]); D_8012CF60[dbCamera->sub.demoCtrlActionIdx]);
DbCamera_ScreenTextColored(20, 7, DBCAMERA_TEXT_WHITE, D_8012CF88[0]);
func_8006376C(0x11, 8, dbCamera->sub.demoCtrlToggleSwitch ? 4 : 7, D_8012CF94); DbCamera_ScreenTextColored(
func_8006376C(0x15, 8, dbCamera->sub.demoCtrlToggleSwitch ? 7 : 4, D_8012CF98); 17, 8, dbCamera->sub.demoCtrlToggleSwitch ? DBCAMERA_TEXT_GOLD : DBCAMERA_TEXT_GREEN,
D_8012CF94);
DbCamera_ScreenTextColored(
21, 8, dbCamera->sub.demoCtrlToggleSwitch ? DBCAMERA_TEXT_GREEN : DBCAMERA_TEXT_GOLD,
D_8012CF98);
if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A)) { if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A)) {
if (dbCamera->sub.demoCtrlToggleSwitch == 0) { if (dbCamera->sub.demoCtrlToggleSwitch == 0) {
@ -1891,9 +1913,12 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
} else { } else {
dbCamera->sub.demoCtrlToggleSwitch ^= 1; dbCamera->sub.demoCtrlToggleSwitch ^= 1;
D_8012CF84[9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx); D_8012CF84[9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx);
func_8006376C(0xD, 7, 5, D_8012CF88[-1]); // todo: find something better DbCamera_ScreenTextColored(13, 7, DBCAMERA_TEXT_WHITE,
func_8006376C(0x12, 7, 5, D_8012CF80); D_8012CF88[-1]); // todo: find something better
func_8006376C(0xD, 9, dbCamera->sub.demoCtrlToggleSwitch ? 1 : 6, "PRESS B BUTTON"); DbCamera_ScreenTextColored(18, 7, DBCAMERA_TEXT_WHITE, D_8012CF80);
DbCamera_ScreenTextColored(
13, 9, dbCamera->sub.demoCtrlToggleSwitch ? DBCAMERA_TEXT_PEACH : DBCAMERA_TEXT_BLUE,
"PRESS B BUTTON");
} }
} }
if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) { if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) {
@ -1909,9 +1934,9 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
case DEMO_CTRL_MENU(ACTION_LOAD, MENU_CALLBACK): case DEMO_CTRL_MENU(ACTION_LOAD, MENU_CALLBACK):
case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_CALLBACK): { case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_CALLBACK): {
D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx); D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx);
func_8006376C(0xC, 7, 5, D_8012CEE0[41]); DbCamera_ScreenTextColored(12, 7, DBCAMERA_TEXT_WHITE, D_8012CEE0[41]);
func_8006376C(0x12, 7, 5, D_8012CF60[dbCamera->sub.demoCtrlActionIdx]); DbCamera_ScreenTextColored(18, 7, DBCAMERA_TEXT_WHITE, D_8012CF60[dbCamera->sub.demoCtrlActionIdx]);
func_8006376C(0x16, 7, 5, D_8012CF9C[0]); DbCamera_ScreenTextColored(22, 7, DBCAMERA_TEXT_WHITE, D_8012CF9C[0]);
if (callbacks[dbCamera->sub.demoCtrlActionIdx - 1](&D_8012CF84[9])) { if (callbacks[dbCamera->sub.demoCtrlActionIdx - 1](&D_8012CF84[9])) {
dbCamera->sub.demoCtrlMenu++; dbCamera->sub.demoCtrlMenu++;
@ -1927,10 +1952,13 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_SUCCESS): { case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_SUCCESS): {
dbCamera->sub.demoCtrlToggleSwitch ^= 1; dbCamera->sub.demoCtrlToggleSwitch ^= 1;
D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx); D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx);
func_8006376C(0xD, 7, 5, D_8012CEE0[41]); DbCamera_ScreenTextColored(13, 7, DBCAMERA_TEXT_WHITE, D_8012CEE0[41]);
func_8006376C(0x13, 7, 5, D_8012CF60[dbCamera->sub.demoCtrlMenu / 100]); DbCamera_ScreenTextColored(19, 7, DBCAMERA_TEXT_WHITE,
func_8006376C(0x17, 7, 5, D_8012CFA4); D_8012CF60[dbCamera->sub.demoCtrlMenu / 100]);
func_8006376C(0xD, 9, (dbCamera->sub.demoCtrlToggleSwitch != 0) ? 1 : 6, "PRESS B BUTTON"); DbCamera_ScreenTextColored(23, 7, DBCAMERA_TEXT_WHITE, D_8012CFA4);
DbCamera_ScreenTextColored(
13, 9, (dbCamera->sub.demoCtrlToggleSwitch != 0) ? DBCAMERA_TEXT_PEACH : DBCAMERA_TEXT_BLUE,
"PRESS B BUTTON");
if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A) || if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A) ||
CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) { CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) {
@ -1950,10 +1978,13 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_ERROR): { case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_ERROR): {
dbCamera->sub.demoCtrlToggleSwitch ^= 1; dbCamera->sub.demoCtrlToggleSwitch ^= 1;
D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx); D_8012CEE0[41][9] = MEMPAK_INDEX_TO_LETTER(sCurFileIdx);
func_8006376C(0xD, 7, 5, D_8012CEE0[(dbCamera->sub.demoCtrlMenu / 100) + 32]); DbCamera_ScreenTextColored(13, 7, DBCAMERA_TEXT_WHITE,
func_8006376C(0x11, 7, 5, D_8012CFAC); D_8012CEE0[(dbCamera->sub.demoCtrlMenu / 100) + 32]);
func_8006376C(0x17, 7, 5, D_8012CFA4); DbCamera_ScreenTextColored(17, 7, DBCAMERA_TEXT_WHITE, D_8012CFAC);
func_8006376C(0xD, 9, (dbCamera->sub.demoCtrlToggleSwitch != 0) ? 1 : 6, "PRESS B BUTTON"); DbCamera_ScreenTextColored(23, 7, DBCAMERA_TEXT_WHITE, D_8012CFA4);
DbCamera_ScreenTextColored(
13, 9, (dbCamera->sub.demoCtrlToggleSwitch != 0) ? DBCAMERA_TEXT_PEACH : DBCAMERA_TEXT_BLUE,
"PRESS B BUTTON");
if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A) || if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A) ||
CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) { CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) {
@ -2029,30 +2060,31 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
} }
} }
idx3 = dbCamera->sub.demoCtrlActionIdx; idx3 = dbCamera->sub.demoCtrlActionIdx;
func_8006376C(0xE, 7, 5, D_8012CF50[idx3]); DbCamera_ScreenTextColored(14, 7, DBCAMERA_TEXT_WHITE, D_8012CF50[idx3]);
func_8006376C(0xF, 7, 4, sp74); DbCamera_ScreenTextColored(15, 7, DBCAMERA_TEXT_GOLD, sp74);
func_8006376C((sCurFileIdx * 2) + 0x10, 7, 7, "_"); // cursor DbCamera_ScreenTextColored(16 + (sCurFileIdx * 2), 7, DBCAMERA_TEXT_GREEN, "_"); // cursor
DbCamera_SetTextValue(DbCamera_GetMempakAllocSize(), sp74, 6); DbCamera_SetTextValue(DbCamera_GetMempakAllocSize(), sp74, 6);
func_8006376C(0xD, 9, 6, D_8012CF78); // NEED BYTE DbCamera_ScreenTextColored(13, 9, DBCAMERA_TEXT_BLUE, D_8012CF78); // NEED BYTE
func_8006376C(0x11, 9, 4, sp74); DbCamera_ScreenTextColored(17, 9, DBCAMERA_TEXT_GOLD, sp74);
DbCamera_SetTextValue(Mempak_GetFreeBytes(DBCAM_CONTROLLER_PORT), sp74, 6); DbCamera_SetTextValue(Mempak_GetFreeBytes(DBCAM_CONTROLLER_PORT), sp74, 6);
func_8006376C(0xD, 0xA, 6, D_8012CF74); // FREE BYTE DbCamera_ScreenTextColored(13, 10, DBCAMERA_TEXT_BLUE, D_8012CF74); // FREE BYTE
func_8006376C(0x11, 0xA, 4, sp74); DbCamera_ScreenTextColored(17, 10, DBCAMERA_TEXT_GOLD, sp74);
if (sMempakFilesize != 0) { if (sMempakFilesize != 0) {
DbCamera_SetTextValue(sMempakFilesize, sp74, 6); DbCamera_SetTextValue(sMempakFilesize, sp74, 6);
func_8006376C(0xD, 0xB, 7, D_8012CFA8); DbCamera_ScreenTextColored(13, 11, DBCAMERA_TEXT_GREEN, D_8012CFA8);
func_8006376C(0x11, 0xB, 4, sp74); DbCamera_ScreenTextColored(17, 11, DBCAMERA_TEXT_GOLD, sp74);
} }
idx1 = (dbCamera->sub.demoCtrlActionIdx + 2); idx1 = (dbCamera->sub.demoCtrlActionIdx + 2);
func_8006376C(0xF, 0x16, 1, D_8012CF7C); DbCamera_ScreenTextColored(15, 22, DBCAMERA_TEXT_PEACH, D_8012CF7C);
func_8006376C(0x12, 0x17, sDbCameraColors[idx1], D_8012CF64); DbCamera_ScreenTextColored(18, 23, sDbCameraColors[idx1], D_8012CF64);
func_8006376C(0x12, 0x18, sDbCameraColors[idx1 - 1], D_8012CF68); DbCamera_ScreenTextColored(18, 24, sDbCameraColors[idx1 - 1], D_8012CF68);
func_8006376C(0x12, 0x19, sDbCameraColors[idx1 - 2], D_8012CF6C); DbCamera_ScreenTextColored(18, 25, sDbCameraColors[idx1 - 2], D_8012CF6C);
func_8006376C(0xE, dbCamera->sub.demoCtrlActionIdx + 0x16, 7, D_8012CF0C); // current selection DbCamera_ScreenTextColored(14, 22 + dbCamera->sub.demoCtrlActionIdx, DBCAMERA_TEXT_GREEN,
func_8006376C(0xD, 0x1A, 5, D_8012CF60[0]); D_8012CF0C); // current selection
func_8006376C(0x14, 0x1A, 5, D_8012CF70); DbCamera_ScreenTextColored(13, 26, DBCAMERA_TEXT_WHITE, D_8012CF60[0]);
DbCamera_ScreenTextColored(20, 26, DBCAMERA_TEXT_WHITE, D_8012CF70);
if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DUP)) { if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DUP)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
@ -2079,8 +2111,8 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
} }
goto block_2; goto block_2;
} else { } else {
func_8006376C(0xC, 0x1A, 4, D_8012CF60[0]); DbCamera_ScreenTextColored(12, 26, DBCAMERA_TEXT_GOLD, D_8012CF60[0]);
func_8006376C(0x13, 0x1A, 4, D_8012CF80); DbCamera_ScreenTextColored(19, 26, DBCAMERA_TEXT_GOLD, D_8012CF80);
if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B) || if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B) ||
CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DUP) || CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DUP) ||
CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DDOWN)) { CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DDOWN)) {
@ -2112,11 +2144,11 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
sCurFileIdx = 0; sCurFileIdx = 0;
} }
DbCamera_DrawSlotLetters(sp74, 7, 5, 4); DbCamera_DrawSlotLetters(sp74, 7, 5, DBCAMERA_TEXT_GOLD);
if (sDbCamAnim.unk_0A != 0) { if (sDbCamAnim.unk_0A != 0) {
func_8006376C(4, 7, 5, D_8012CF4C); DbCamera_ScreenTextColored(4, 7, DBCAMERA_TEXT_WHITE, D_8012CF4C);
func_8006376C(D_8016110C * 2 + 6, 7, 7, ">"); DbCamera_ScreenTextColored(6 + (D_8016110C * 2), 7, DBCAMERA_TEXT_GREEN, ">");
if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CUP)) { if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CUP)) {
if (D_8016110C > 0) { if (D_8016110C > 0) {
@ -2225,7 +2257,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
sp74[sCurFileIdx] = DbCamera_InitCut(idx1, &dbCamera->sub); sp74[sCurFileIdx] = DbCamera_InitCut(idx1, &dbCamera->sub);
if (sp74[sCurFileIdx] == '?') { if (sp74[sCurFileIdx] == '?') {
func_8006376C(0xF, 0x18, 7, D_8012CF48); DbCamera_ScreenTextColored(15, 24, DBCAMERA_TEXT_GREEN, D_8012CF48);
} }
} }
} }
@ -2309,15 +2341,15 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
} }
func_8006376C(4, 7, 5, D_8012CF50[0]); DbCamera_ScreenTextColored(4, 7, DBCAMERA_TEXT_WHITE, D_8012CF50[0]);
sp74[1] = 0; sp74[1] = 0;
if (sLastFileIdx != -1) { if (sLastFileIdx != -1) {
sp74[0] = D_801612EA; sp74[0] = D_801612EA;
func_8006376C(sLastFileIdx + 5, 7, 2, sp74); DbCamera_ScreenTextColored(5 + sLastFileIdx, 7, DBCAMERA_TEXT_BROWN, sp74);
} else { } else {
sp74[0] = '_'; sp74[0] = '_';
} }
func_8006376C(sCurFileIdx + 5, 7, 7, sp74); DbCamera_ScreenTextColored(5 + sCurFileIdx, 7, DBCAMERA_TEXT_GREEN, sp74);
break; break;
} }

View file

@ -188,7 +188,7 @@ void GameState_Draw(GameState* gameState, GraphicsContext* gfxCtx) {
CLOSE_DISPS(gfxCtx, "../game.c", 800); CLOSE_DISPS(gfxCtx, "../game.c", 800);
func_80063D7C(gfxCtx); Debug_DrawText(gfxCtx);
if (R_ENABLE_ARENA_DBG != 0) { if (R_ENABLE_ARENA_DBG != 0) {
SpeedMeter_DrawTimeEntries(&D_801664D0, gfxCtx); SpeedMeter_DrawTimeEntries(&D_801664D0, gfxCtx);

View file

@ -25,9 +25,6 @@ s32 Camera_UpdateWater(Camera* camera);
// Load the next value and scale down from camera read-only data stored in CameraModeValue // Load the next value and scale down from camera read-only data stored in CameraModeValue
#define GET_NEXT_SCALED_RO_DATA(values) CAM_DATA_SCALED(GET_NEXT_RO_DATA(values)) #define GET_NEXT_SCALED_RO_DATA(values) CAM_DATA_SCALED(GET_NEXT_RO_DATA(values))
#define FLG_ADJSLOPE (1 << 0)
#define FLG_OFFGROUND (1 << 7)
#define DISTORTION_HOT_ROOM (1 << 0) #define DISTORTION_HOT_ROOM (1 << 0)
#define DISTORTION_UNDERWATER_WEAK (1 << 1) #define DISTORTION_UNDERWATER_WEAK (1 << 1)
#define DISTORTION_UNDERWATER_MEDIUM (1 << 2) #define DISTORTION_UNDERWATER_MEDIUM (1 << 2)
@ -910,53 +907,51 @@ f32 Camera_CalcSlopeYAdj(Vec3f* floorNorm, s16 playerYRot, s16 eyeAtYaw, f32 adj
/** /**
* Calculates new at vector for the camera pointing in `eyeAtDir` * Calculates new at vector for the camera pointing in `eyeAtDir`
*/ */
s32 Camera_CalcAtDefault(Camera* camera, VecGeo* eyeAtDir, f32 extraYOffset, s16 calcSlope) { s32 Camera_CalcAtDefault(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, s16 calcSlopeYAdj) {
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
Vec3f posOffsetTarget; Vec3f playerToAtOffsetTarget;
Vec3f atTarget; Vec3f atTarget;
s32 pad2; s32 pad2;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
f32 yOffset; f32 playerHeight = Player_GetHeight(camera->player);
yOffset = Player_GetHeight(camera->player); playerToAtOffsetTarget.x = 0.f;
playerToAtOffsetTarget.y = playerHeight + yOffset;
playerToAtOffsetTarget.z = 0.f;
posOffsetTarget.x = 0.f; if (calcSlopeYAdj) {
posOffsetTarget.y = yOffset + extraYOffset; playerToAtOffsetTarget.y -= OLib_ClampMaxDist(
posOffsetTarget.z = 0.f;
if (calcSlope) {
posOffsetTarget.y -= OLib_ClampMaxDist(
Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT), Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT),
yOffset); playerHeight);
} }
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate, Camera_LERPCeilVec3f(&playerToAtOffsetTarget, &camera->playerToAtOffset, camera->yOffsetUpdateRate,
0.1f); camera->xzOffsetUpdateRate, 0.1f);
atTarget.x = playerPosRot->pos.x + camera->posOffset.x; atTarget.x = playerPosRot->pos.x + camera->playerToAtOffset.x;
atTarget.y = playerPosRot->pos.y + camera->posOffset.y; atTarget.y = playerPosRot->pos.y + camera->playerToAtOffset.y;
atTarget.z = playerPosRot->pos.z + camera->posOffset.z; atTarget.z = playerPosRot->pos.z + camera->playerToAtOffset.z;
Camera_LERPCeilVec3f(&atTarget, at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f); Camera_LERPCeilVec3f(&atTarget, at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f);
return true; return true;
} }
s32 func_800458D4(Camera* camera, VecGeo* eyeAtDir, f32 arg2, f32* arg3, s16 arg4) { s32 func_800458D4(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* arg3, s16 calcSlopeYAdj) {
f32 phi_f2; f32 phi_f2;
Vec3f posOffsetTarget; Vec3f playerToAtOffsetTarget;
Vec3f atTarget; Vec3f atTarget;
f32 eyeAtAngle; f32 eyeAtAngle;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
f32 deltaY; f32 deltaY;
s32 pad[2]; s32 pad[2];
posOffsetTarget.y = Player_GetHeight(camera->player) + arg2; playerToAtOffsetTarget.y = Player_GetHeight(camera->player) + yOffset;
posOffsetTarget.x = 0.0f; playerToAtOffsetTarget.x = 0.0f;
posOffsetTarget.z = 0.0f; playerToAtOffsetTarget.z = 0.0f;
if (arg4) { if (calcSlopeYAdj) {
posOffsetTarget.y -= playerToAtOffsetTarget.y -=
Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT); Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT);
} }
@ -972,30 +967,30 @@ s32 func_800458D4(Camera* camera, VecGeo* eyeAtDir, f32 arg2, f32* arg3, s16 arg
phi_f2 = 1.0f; phi_f2 = 1.0f;
} }
posOffsetTarget.y -= deltaY * phi_f2; playerToAtOffsetTarget.y -= deltaY * phi_f2;
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, CAM_DATA_SCALED(OREG(29)), CAM_DATA_SCALED(OREG(30)), Camera_LERPCeilVec3f(&playerToAtOffsetTarget, &camera->playerToAtOffset, CAM_DATA_SCALED(OREG(29)),
0.1f); CAM_DATA_SCALED(OREG(30)), 0.1f);
atTarget.x = playerPosRot->pos.x + camera->posOffset.x; atTarget.x = playerPosRot->pos.x + camera->playerToAtOffset.x;
atTarget.y = playerPosRot->pos.y + camera->posOffset.y; atTarget.y = playerPosRot->pos.y + camera->playerToAtOffset.y;
atTarget.z = playerPosRot->pos.z + camera->posOffset.z; atTarget.z = playerPosRot->pos.z + camera->playerToAtOffset.z;
Camera_LERPCeilVec3f(&atTarget, &camera->at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f); Camera_LERPCeilVec3f(&atTarget, &camera->at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f);
return 1; return 1;
} }
s32 func_80045B08(Camera* camera, VecGeo* eyeAtDir, f32 yExtra, s16 arg3) { s32 func_80045B08(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, s16 arg3) {
f32 phi_f2; f32 phi_f2;
Vec3f posOffsetTarget; Vec3f playerToAtOffsetTarget;
Vec3f atTarget; Vec3f atTarget;
f32 pad; f32 pad;
f32 temp_ret; f32 temp_ret;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
posOffsetTarget.y = Player_GetHeight(camera->player) + yExtra; playerToAtOffsetTarget.y = Player_GetHeight(camera->player) + yOffset;
posOffsetTarget.x = 0.0f; playerToAtOffsetTarget.x = 0.0f;
posOffsetTarget.z = 0.0f; playerToAtOffsetTarget.z = 0.0f;
temp_ret = Math_SinS(arg3); temp_ret = Math_SinS(arg3);
@ -1005,13 +1000,13 @@ s32 func_80045B08(Camera* camera, VecGeo* eyeAtDir, f32 yExtra, s16 arg3) {
phi_f2 = -Math_CosS(playerPosRot->rot.y - eyeAtDir->yaw); phi_f2 = -Math_CosS(playerPosRot->rot.y - eyeAtDir->yaw);
} }
posOffsetTarget.y -= temp_ret * phi_f2 * R_CAM_SLOPE_Y_ADJ_AMOUNT; playerToAtOffsetTarget.y -= temp_ret * phi_f2 * R_CAM_SLOPE_Y_ADJ_AMOUNT;
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate, Camera_LERPCeilVec3f(&playerToAtOffsetTarget, &camera->playerToAtOffset, camera->yOffsetUpdateRate,
0.1f); camera->xzOffsetUpdateRate, 0.1f);
atTarget.x = playerPosRot->pos.x + camera->posOffset.x; atTarget.x = playerPosRot->pos.x + camera->playerToAtOffset.x;
atTarget.y = playerPosRot->pos.y + camera->posOffset.y; atTarget.y = playerPosRot->pos.y + camera->playerToAtOffset.y;
atTarget.z = playerPosRot->pos.z + camera->posOffset.z; atTarget.z = playerPosRot->pos.z + camera->playerToAtOffset.z;
Camera_LERPCeilVec3f(&atTarget, &camera->at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f); Camera_LERPCeilVec3f(&atTarget, &camera->at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f);
return 1; return 1;
@ -1020,9 +1015,9 @@ s32 func_80045B08(Camera* camera, VecGeo* eyeAtDir, f32 yExtra, s16 arg3) {
/** /**
* Adjusts the camera's at position for Camera_Parallel1 * Adjusts the camera's at position for Camera_Parallel1
*/ */
s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32* arg3, s16 arg4) { s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32* arg3, s16 calcSlopeYAdj) {
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
Vec3f posOffsetTarget; Vec3f playerToAtOffsetTarget;
Vec3f atTarget; Vec3f atTarget;
Vec3f* eye = &camera->eye; Vec3f* eye = &camera->eye;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
@ -1030,15 +1025,14 @@ s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32* arg
f32 phi_f16; f32 phi_f16;
f32 eyeAtDistXZ; f32 eyeAtDistXZ;
f32 phi_f20; f32 phi_f20;
f32 temp_f0_4; f32 playerHeight = Player_GetHeight(camera->player);
temp_f0_4 = Player_GetHeight(camera->player); playerToAtOffsetTarget.x = 0.0f;
posOffsetTarget.x = 0.0f; playerToAtOffsetTarget.y = playerHeight + yOffset;
posOffsetTarget.y = temp_f0_4 + yOffset; playerToAtOffsetTarget.z = 0.0f;
posOffsetTarget.z = 0.0f;
if (PREG(76) && arg4) { if (R_CAM_PARALLEL_LOCKON_CALC_SLOPE_Y_ADJ && calcSlopeYAdj) {
posOffsetTarget.y -= playerToAtOffsetTarget.y -=
Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, arg1->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT); Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, arg1->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT);
} }
@ -1046,8 +1040,8 @@ s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32* arg
camera->player->stateFlags1 & PLAYER_STATE1_21) { camera->player->stateFlags1 & PLAYER_STATE1_21) {
*arg3 = Camera_LERPCeilF(playerPosRot->pos.y, *arg3, CAM_DATA_SCALED(OREG(43)), 0.1f); *arg3 = Camera_LERPCeilF(playerPosRot->pos.y, *arg3, CAM_DATA_SCALED(OREG(43)), 0.1f);
phi_f20 = playerPosRot->pos.y - *arg3; phi_f20 = playerPosRot->pos.y - *arg3;
posOffsetTarget.y -= phi_f20; playerToAtOffsetTarget.y -= phi_f20;
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, Camera_LERPCeilVec3f(&playerToAtOffsetTarget, &camera->playerToAtOffset, camera->yOffsetUpdateRate,
camera->xzOffsetUpdateRate, 0.1f); camera->xzOffsetUpdateRate, 0.1f);
} else { } else {
if (!PREG(75)) { if (!PREG(75)) {
@ -1063,7 +1057,7 @@ s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32* arg
*arg3 += phi_f20 + temp_f2; *arg3 += phi_f20 + temp_f2;
phi_f20 = -temp_f2; phi_f20 = -temp_f2;
} }
posOffsetTarget.y -= phi_f20; playerToAtOffsetTarget.y -= phi_f20;
} else { } else {
phi_f20 = playerPosRot->pos.y - *arg3; phi_f20 = playerPosRot->pos.y - *arg3;
temp_f2 = Math_FAtan2F(phi_f20, OLib_Vec3fDistXZ(at, eye)); temp_f2 = Math_FAtan2F(phi_f20, OLib_Vec3fDistXZ(at, eye));
@ -1074,27 +1068,30 @@ s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32* arg
} else { } else {
phi_f16 = 1; phi_f16 = 1;
} }
posOffsetTarget.y -= phi_f20 * phi_f16; playerToAtOffsetTarget.y -= phi_f20 * phi_f16;
} }
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, CAM_DATA_SCALED(OREG(29)), CAM_DATA_SCALED(OREG(30)), Camera_LERPCeilVec3f(&playerToAtOffsetTarget, &camera->playerToAtOffset, CAM_DATA_SCALED(OREG(29)),
0.1f); CAM_DATA_SCALED(OREG(30)), 0.1f);
camera->yOffsetUpdateRate = CAM_DATA_SCALED(OREG(29)); camera->yOffsetUpdateRate = CAM_DATA_SCALED(OREG(29));
camera->xzOffsetUpdateRate = CAM_DATA_SCALED(OREG(30)); camera->xzOffsetUpdateRate = CAM_DATA_SCALED(OREG(30));
} }
atTarget.x = playerPosRot->pos.x + camera->posOffset.x; atTarget.x = playerPosRot->pos.x + camera->playerToAtOffset.x;
atTarget.y = playerPosRot->pos.y + camera->posOffset.y; atTarget.y = playerPosRot->pos.y + camera->playerToAtOffset.y;
atTarget.z = playerPosRot->pos.z + camera->posOffset.z; atTarget.z = playerPosRot->pos.z + camera->playerToAtOffset.z;
Camera_LERPCeilVec3f(&atTarget, at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f); Camera_LERPCeilVec3f(&atTarget, at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f);
return 1; return 1;
} }
#define CAM_LOCKON_AT_FLAG_CALC_SLOPE_Y_ADJ (1 << 0)
#define CAM_LOCKON_AT_FLAG_OFF_GROUND (1 << 7)
/** /**
* Adjusts at position for Camera_Battle1 and Camera_KeepOn1 * Adjusts at position for Camera_Battle1 and Camera_KeepOn1
*/ */
s32 Camera_CalcAtForLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f32 yOffset, f32 distance, s32 Camera_CalcAtForLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f32 yOffset, f32 distance,
f32* yPosOffset, VecGeo* outPlayerToTargetDir, s16 flags) { f32* yPosOffset, VecGeo* outPlayerToTargetDir, s16 flags) {
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
Vec3f tmpPos0; Vec3f playerToAtOffsetTarget;
Vec3f tmpPos1; Vec3f tmpPos1;
Vec3f lookFromOffset; Vec3f lookFromOffset;
Vec3f* floorNorm = &camera->floorNorm; Vec3f* floorNorm = &camera->floorNorm;
@ -1104,14 +1101,14 @@ s32 Camera_CalcAtForLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f
f32 phi_f16; f32 phi_f16;
f32 eyeAtDistXZ; f32 eyeAtDistXZ;
f32 temp_f0_2; f32 temp_f0_2;
f32 playerHeight; f32 playerHeight = Player_GetHeight(camera->player);
playerHeight = Player_GetHeight(camera->player); playerToAtOffsetTarget.x = 0.0f;
tmpPos0.x = 0.0f; playerToAtOffsetTarget.y = playerHeight + yOffset;
tmpPos0.y = playerHeight + yOffset; playerToAtOffsetTarget.z = 0.0f;
tmpPos0.z = 0.0f; if (R_CAM_PARALLEL_LOCKON_CALC_SLOPE_Y_ADJ && (flags & CAM_LOCKON_AT_FLAG_CALC_SLOPE_Y_ADJ)) {
if (PREG(76) && (flags & FLG_ADJSLOPE)) { playerToAtOffsetTarget.y -=
tmpPos0.y -= Camera_CalcSlopeYAdj(floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT); Camera_CalcSlopeYAdj(floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT);
} }
// tmpPos1 is player's head // tmpPos1 is player's head
@ -1130,7 +1127,7 @@ s32 Camera_CalcAtForLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f
playerToTargetDir.r = playerToTargetDir.r - (playerToTargetDir.r * temp_f0_2) * temp_f0_2; playerToTargetDir.r = playerToTargetDir.r - (playerToTargetDir.r * temp_f0_2) * temp_f0_2;
} }
if (flags & FLG_OFFGROUND) { if (flags & CAM_LOCKON_AT_FLAG_OFF_GROUND) {
playerToTargetDir.r *= 0.2f; playerToTargetDir.r *= 0.2f;
camera->xzOffsetUpdateRate = camera->yOffsetUpdateRate = .01f; camera->xzOffsetUpdateRate = camera->yOffsetUpdateRate = .01f;
} }
@ -1142,18 +1139,19 @@ s32 Camera_CalcAtForLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f
lookFromOffset.z, camera->atLERPStepScale); lookFromOffset.z, camera->atLERPStepScale);
} }
tmpPos0.x = tmpPos0.x + lookFromOffset.x; playerToAtOffsetTarget.x += lookFromOffset.x;
tmpPos0.y = tmpPos0.y + lookFromOffset.y; playerToAtOffsetTarget.y += lookFromOffset.y;
tmpPos0.z = tmpPos0.z + lookFromOffset.z; playerToAtOffsetTarget.z += lookFromOffset.z;
if (camera->playerGroundY == camera->playerPosRot.pos.y || camera->player->actor.gravity > -0.1f || if (camera->playerGroundY == camera->playerPosRot.pos.y || camera->player->actor.gravity > -0.1f ||
camera->player->stateFlags1 & PLAYER_STATE1_21) { camera->player->stateFlags1 & PLAYER_STATE1_21) {
*yPosOffset = Camera_LERPCeilF(playerPosRot->pos.y, *yPosOffset, CAM_DATA_SCALED(OREG(43)), 0.1f); *yPosOffset = Camera_LERPCeilF(playerPosRot->pos.y, *yPosOffset, CAM_DATA_SCALED(OREG(43)), 0.1f);
yPosDelta = playerPosRot->pos.y - *yPosOffset; yPosDelta = playerPosRot->pos.y - *yPosOffset;
tmpPos0.y -= yPosDelta; playerToAtOffsetTarget.y -= yPosDelta;
Camera_LERPCeilVec3f(&tmpPos0, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate, 0.1f); Camera_LERPCeilVec3f(&playerToAtOffsetTarget, &camera->playerToAtOffset, camera->yOffsetUpdateRate,
camera->xzOffsetUpdateRate, 0.1f);
} else { } else {
if (!(flags & FLG_OFFGROUND)) { if (!(flags & CAM_LOCKON_AT_FLAG_OFF_GROUND)) {
yPosDelta = playerPosRot->pos.y - *yPosOffset; yPosDelta = playerPosRot->pos.y - *yPosOffset;
eyeAtDistXZ = OLib_Vec3fDistXZ(at, &camera->eye); eyeAtDistXZ = OLib_Vec3fDistXZ(at, &camera->eye);
phi_f16 = eyeAtDistXZ; phi_f16 = eyeAtDistXZ;
@ -1166,7 +1164,7 @@ s32 Camera_CalcAtForLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f
*yPosOffset = *yPosOffset + (yPosDelta + temp_f0_2); *yPosOffset = *yPosOffset + (yPosDelta + temp_f0_2);
yPosDelta = -temp_f0_2; yPosDelta = -temp_f0_2;
} }
tmpPos0.y = tmpPos0.y - yPosDelta; playerToAtOffsetTarget.y = playerToAtOffsetTarget.y - yPosDelta;
} else { } else {
yPosDelta = playerPosRot->pos.y - *yPosOffset; yPosDelta = playerPosRot->pos.y - *yPosOffset;
temp_f0_2 = Math_FAtan2F(yPosDelta, OLib_Vec3fDistXZ(at, &camera->eye)); temp_f0_2 = Math_FAtan2F(yPosDelta, OLib_Vec3fDistXZ(at, &camera->eye));
@ -1178,33 +1176,32 @@ s32 Camera_CalcAtForLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f
} else { } else {
phi_f16 = 1.0f; phi_f16 = 1.0f;
} }
tmpPos0.y -= (yPosDelta * phi_f16); playerToAtOffsetTarget.y -= (yPosDelta * phi_f16);
} }
Camera_LERPCeilVec3f(&tmpPos0, &camera->posOffset, CAM_DATA_SCALED(OREG(29)), CAM_DATA_SCALED(OREG(30)), 0.1f); Camera_LERPCeilVec3f(&playerToAtOffsetTarget, &camera->playerToAtOffset, CAM_DATA_SCALED(OREG(29)),
CAM_DATA_SCALED(OREG(30)), 0.1f);
camera->yOffsetUpdateRate = CAM_DATA_SCALED(OREG(29)); camera->yOffsetUpdateRate = CAM_DATA_SCALED(OREG(29));
camera->xzOffsetUpdateRate = CAM_DATA_SCALED(OREG(30)); camera->xzOffsetUpdateRate = CAM_DATA_SCALED(OREG(30));
} }
tmpPos1.x = playerPosRot->pos.x + camera->posOffset.x; tmpPos1.x = playerPosRot->pos.x + camera->playerToAtOffset.x;
tmpPos1.y = playerPosRot->pos.y + camera->posOffset.y; tmpPos1.y = playerPosRot->pos.y + camera->playerToAtOffset.y;
tmpPos1.z = playerPosRot->pos.z + camera->posOffset.z; tmpPos1.z = playerPosRot->pos.z + camera->playerToAtOffset.z;
Camera_LERPCeilVec3f(&tmpPos1, at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f); Camera_LERPCeilVec3f(&tmpPos1, at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f);
return 1; return 1;
} }
s32 Camera_CalcAtForHorse(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* yPosOffset, s16 calcSlope) { s32 Camera_CalcAtForHorse(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* yPosOffset, s16 calcSlopeYAdj) {
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
Vec3f posOffsetTarget; Vec3f playerToAtOffsetTarget;
Vec3f atTarget; Vec3f atTarget;
s32 pad; s32 pad;
s32 pad2; s32 pad2;
f32 playerHeight; f32 playerHeight = Player_GetHeight(camera->player);
Player* player; Player* player = camera->player;
PosRot horsePosRot; PosRot horsePosRot;
playerHeight = Player_GetHeight(camera->player);
player = camera->player;
Actor_GetWorldPosShapeRot(&horsePosRot, player->rideActor); Actor_GetWorldPosShapeRot(&horsePosRot, player->rideActor);
if (EN_HORSE_CHECK_JUMPING((EnHorse*)player->rideActor)) { if (EN_HORSE_CHECK_JUMPING((EnHorse*)player->rideActor)) {
@ -1215,21 +1212,21 @@ s32 Camera_CalcAtForHorse(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* yP
*yPosOffset = Camera_LERPCeilF(horsePosRot.pos.y, *yPosOffset, 0.5f, 0.2f); *yPosOffset = Camera_LERPCeilF(horsePosRot.pos.y, *yPosOffset, 0.5f, 0.2f);
} }
posOffsetTarget.x = 0.0f; playerToAtOffsetTarget.x = 0.0f;
posOffsetTarget.y = playerHeight + yOffset; playerToAtOffsetTarget.y = playerHeight + yOffset;
posOffsetTarget.z = 0.0f; playerToAtOffsetTarget.z = 0.0f;
if (calcSlope != 0) { if (calcSlopeYAdj) {
posOffsetTarget.y -= Camera_CalcSlopeYAdj(&camera->floorNorm, camera->playerPosRot.rot.y, eyeAtDir->yaw, playerToAtOffsetTarget.y -= Camera_CalcSlopeYAdj(&camera->floorNorm, camera->playerPosRot.rot.y, eyeAtDir->yaw,
R_CAM_SLOPE_Y_ADJ_AMOUNT); R_CAM_SLOPE_Y_ADJ_AMOUNT);
} }
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate, Camera_LERPCeilVec3f(&playerToAtOffsetTarget, &camera->playerToAtOffset, camera->yOffsetUpdateRate,
0.1f); camera->xzOffsetUpdateRate, 0.1f);
atTarget.x = camera->posOffset.x + horsePosRot.pos.x; atTarget.x = camera->playerToAtOffset.x + horsePosRot.pos.x;
atTarget.y = camera->posOffset.y + horsePosRot.pos.y; atTarget.y = camera->playerToAtOffset.y + horsePosRot.pos.y;
atTarget.z = camera->posOffset.z + horsePosRot.pos.z; atTarget.z = camera->playerToAtOffset.z + horsePosRot.pos.z;
Camera_LERPCeilVec3f(&atTarget, at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f); Camera_LERPCeilVec3f(&atTarget, at, camera->atLERPStepScale, camera->atLERPStepScale, 0.2f);
return 1; return 1;
@ -1932,7 +1929,7 @@ s32 Camera_Normal3(Camera* camera) {
temp_f0 = (((1.0f / roData->unk_10) * 0.5f) * (1.0f - camera->speedRatio)); temp_f0 = (((1.0f / roData->unk_10) * 0.5f) * (1.0f - camera->speedRatio));
rwData->curPitch = Camera_LERPCeilS(t2, rwData->curPitch, sp94 + temp_f0, 0xF); rwData->curPitch = Camera_LERPCeilS(t2, rwData->curPitch, sp94 + temp_f0, 0xF);
Camera_CalcAtForHorse(camera, &sp74, roData->yOffset, &rwData->unk_20, 1); Camera_CalcAtForHorse(camera, &sp74, roData->yOffset, &rwData->unk_20, true);
sp90 = (roData->distMax + roData->distMin) * 0.5f; sp90 = (roData->distMax + roData->distMin) * 0.5f;
OLib_Vec3fDiffToVecGeo(&sp84, at, eyeNext); OLib_Vec3fDiffToVecGeo(&sp84, at, eyeNext);
camera->dist = sp84.r = Camera_ClampDist(camera, sp84.r, roData->distMin, roData->distMax, rwData->distTimer); camera->dist = sp84.r = Camera_ClampDist(camera, sp84.r, roData->distMin, roData->distMax, rwData->distTimer);
@ -2266,7 +2263,7 @@ s32 Camera_Jump1(Camera* camera) {
rwData->swing.swingUpdateRate = roData->yawUpateRateTarget; rwData->swing.swingUpdateRate = roData->yawUpateRateTarget;
rwData->unk_1C = playerPosRot->pos.y - camera->playerPosDelta.y; rwData->unk_1C = playerPosRot->pos.y - camera->playerPosDelta.y;
rwData->unk_20 = eyeAtOffset.r; rwData->unk_20 = eyeAtOffset.r;
camera->posOffset.y -= camera->playerPosDelta.y; camera->playerToAtOffset.y -= camera->playerPosDelta.y;
camera->xzOffsetUpdateRate = (1.0f / 10000.0f); camera->xzOffsetUpdateRate = (1.0f / 10000.0f);
camera->animState++; camera->animState++;
} }
@ -2294,7 +2291,7 @@ s32 Camera_Jump1(Camera* camera) {
camera->fovUpdateRate = camera->fovUpdateRate =
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate, 0.05f, 0.1f); Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate, 0.05f, 0.1f);
func_800458D4(camera, &eyeNextAtOffset, roData->atYOffset, &rwData->unk_1C, 0); func_800458D4(camera, &eyeNextAtOffset, roData->atYOffset, &rwData->unk_1C, false);
eyeDiffGeo = eyeAtOffset; eyeDiffGeo = eyeAtOffset;
@ -2458,7 +2455,7 @@ s32 Camera_Jump2(Camera* camera) {
camera->speedRatio * 0.05f, 0.1f); camera->speedRatio * 0.05f, 0.1f);
camera->rUpdateRateInv = OREG(27); camera->rUpdateRateInv = OREG(27);
Camera_CalcAtDefault(camera, &atToEyeNextDir, roData->atYOffset, 0); Camera_CalcAtDefault(camera, &atToEyeNextDir, roData->atYOffset, false);
OLib_Vec3fDiffToVecGeo(&adjAtToEyeDir, at, eye); OLib_Vec3fDiffToVecGeo(&adjAtToEyeDir, at, eye);
temp_f16 = roData->minDist; temp_f16 = roData->minDist;
@ -2919,7 +2916,10 @@ s32 Camera_Battle1(Camera* camera) {
Camera_CalcAtForLockOn(camera, &atToEyeNextDir, &camera->targetPosRot.pos, Camera_CalcAtForLockOn(camera, &atToEyeNextDir, &camera->targetPosRot.pos,
isOffGround ? roData->yOffsetOffGround : roData->yOffset, distance, &rwData->yPosOffset, isOffGround ? roData->yOffsetOffGround : roData->yOffset, distance, &rwData->yPosOffset,
&playerToTargetDir, (isOffGround ? 0x81 : 1) | roData->interfaceField); &playerToTargetDir,
(isOffGround ? (CAM_LOCKON_AT_FLAG_OFF_GROUND | CAM_LOCKON_AT_FLAG_CALC_SLOPE_Y_ADJ)
: CAM_LOCKON_AT_FLAG_CALC_SLOPE_Y_ADJ) |
roData->interfaceField);
tmpAng2 = playerToTargetDir.yaw; tmpAng2 = playerToTargetDir.yaw;
playerHead = playerPosRot->pos; playerHead = playerPosRot->pos;
playerHead.y += playerHeight; playerHead.y += playerHeight;
@ -3080,7 +3080,7 @@ s32 Camera_Battle4(Camera* camera) {
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate,
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio, 0.1f); CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio, 0.1f);
camera->fovUpdateRate = 0.0001f; camera->fovUpdateRate = 0.0001f;
Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, 1); Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, true);
if (rwData->animTimer != 0) { if (rwData->animTimer != 0) {
eyeNextOffset.yaw = eyeAtOffset.yaw; eyeNextOffset.yaw = eyeAtOffset.yaw;
eyeNextOffset.pitch = eyeAtOffset.pitch; eyeNextOffset.pitch = eyeAtOffset.pitch;
@ -3133,7 +3133,7 @@ s32 Camera_KeepOn1(Camera* camera) {
s32 sp88; s32 sp88;
f32 sp84; f32 sp84;
s16 sp82; s16 sp82;
s16 sp80; s16 isOffGround;
KeepOn1ReadOnlyData* roData = &camera->paramData.keep1.roData; KeepOn1ReadOnlyData* roData = &camera->paramData.keep1.roData;
KeepOn1ReadWriteData* rwData = &camera->paramData.keep1.rwData; KeepOn1ReadWriteData* rwData = &camera->paramData.keep1.rwData;
s16 t3; s16 t3;
@ -3232,13 +3232,14 @@ s32 Camera_KeepOn1(Camera* camera) {
if (camera->playerGroundY == camera->playerPosRot.pos.y || camera->player->actor.gravity > -0.1f || if (camera->playerGroundY == camera->playerPosRot.pos.y || camera->player->actor.gravity > -0.1f ||
camera->player->stateFlags1 & PLAYER_STATE1_21) { camera->player->stateFlags1 & PLAYER_STATE1_21) {
rwData->unk_08 = playerPosRot->pos.y; rwData->unk_08 = playerPosRot->pos.y;
sp80 = 0; isOffGround = false;
} else { } else {
sp80 = 1; isOffGround = true;
} }
Camera_CalcAtForLockOn(camera, &spB8, &camera->targetPosRot.pos, sp80 ? roData->unk_28 : roData->unk_00, Camera_CalcAtForLockOn(camera, &spB8, &camera->targetPosRot.pos,
sp104, &rwData->unk_08, &spC8, (sp80 ? 0x80 : 0) | roData->interfaceField); isOffGround ? roData->unk_28 : roData->unk_00, sp104, &rwData->unk_08, &spC8,
(isOffGround ? CAM_LOCKON_AT_FLAG_OFF_GROUND : 0) | roData->interfaceField);
sp114 = playerPosRot->pos; sp114 = playerPosRot->pos;
sp114.y += playerHeight; sp114.y += playerHeight;
OLib_Vec3fDiffToVecGeo(&spC8, &sp114, &camera->targetPosRot.pos); OLib_Vec3fDiffToVecGeo(&spC8, &sp114, &camera->targetPosRot.pos);
@ -3342,7 +3343,7 @@ s32 Camera_KeepOn1(Camera* camera) {
} }
camera->fov = Camera_LERPCeilF(roData->unk_20, camera->fov, camera->fovUpdateRate, 1.0f); camera->fov = Camera_LERPCeilF(roData->unk_20, camera->fov, camera->fovUpdateRate, 1.0f);
camera->roll = Camera_LERPCeilS(0, camera->roll, 0.5f, 0xA); camera->roll = Camera_LERPCeilS(0, camera->roll, 0.5f, 0xA);
camera->atLERPStepScale = Camera_ClampLERPScale(camera, sp80 ? roData->unk_2C : roData->unk_24); camera->atLERPStepScale = Camera_ClampLERPScale(camera, isOffGround ? roData->unk_2C : roData->unk_24);
return 1; return 1;
} }
@ -4000,9 +4001,9 @@ s32 Camera_Fixed1(Camera* camera) {
camera->roll = 0; camera->roll = 0;
camera->atLERPStepScale = 0.0f; camera->atLERPStepScale = 0.0f;
camera->posOffset.x = camera->at.x - playerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - playerPosRot->pos.x;
camera->posOffset.y = camera->at.y - playerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - playerPosRot->pos.y;
camera->posOffset.z = camera->at.z - playerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - playerPosRot->pos.z;
return true; return true;
} }
@ -4012,7 +4013,7 @@ s32 Camera_Fixed2(Camera* camera) {
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
Vec3f* eyeNext = &camera->eyeNext; Vec3f* eyeNext = &camera->eyeNext;
Vec3f atTarget; Vec3f atTarget;
Vec3f posOffsetTarget; Vec3f playerToAtOffsetTarget;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
BgCamFuncData* bgCamFuncData; BgCamFuncData* bgCamFuncData;
Fixed2ReadOnlyData* roData = &camera->paramData.fixd2.roData; Fixed2ReadOnlyData* roData = &camera->paramData.fixd2.roData;
@ -4054,14 +4055,15 @@ s32 Camera_Fixed2(Camera* camera) {
sCameraInterfaceField = roData->interfaceField; sCameraInterfaceField = roData->interfaceField;
posOffsetTarget.x = 0.0f; playerToAtOffsetTarget.x = 0.0f;
posOffsetTarget.y = roData->yOffset + playerHeight; playerToAtOffsetTarget.y = roData->yOffset + playerHeight;
posOffsetTarget.z = 0.0f; playerToAtOffsetTarget.z = 0.0f;
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, roData->posStepScale, roData->posStepScale, 0.1f); Camera_LERPCeilVec3f(&playerToAtOffsetTarget, &camera->playerToAtOffset, roData->posStepScale, roData->posStepScale,
atTarget.x = playerPosRot->pos.x + camera->posOffset.x; 0.1f);
atTarget.y = playerPosRot->pos.y + camera->posOffset.y; atTarget.x = playerPosRot->pos.x + camera->playerToAtOffset.x;
atTarget.z = playerPosRot->pos.z + camera->posOffset.z; atTarget.y = playerPosRot->pos.y + camera->playerToAtOffset.y;
atTarget.z = playerPosRot->pos.z + camera->playerToAtOffset.z;
if (camera->animState == 0) { if (camera->animState == 0) {
camera->animState++; camera->animState++;
func_80043B60(camera); func_80043B60(camera);
@ -4080,9 +4082,9 @@ s32 Camera_Fixed2(Camera* camera) {
camera->xzSpeed = 0.0f; camera->xzSpeed = 0.0f;
camera->fov = CAM_DATA_SCALED(rwData->fov); camera->fov = CAM_DATA_SCALED(rwData->fov);
camera->atLERPStepScale = Camera_ClampLERPScale(camera, 1.0f); camera->atLERPStepScale = Camera_ClampLERPScale(camera, 1.0f);
camera->posOffset.x = camera->at.x - playerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - playerPosRot->pos.x;
camera->posOffset.y = camera->at.y - playerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - playerPosRot->pos.y;
camera->posOffset.z = camera->at.z - playerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - playerPosRot->pos.z;
return true; return true;
} }
@ -4167,12 +4169,12 @@ s32 Camera_Fixed4(Camera* camera) {
Vec3f* eyeNext = &camera->eyeNext; Vec3f* eyeNext = &camera->eyeNext;
Vec3f playerPosWithCamOffset; Vec3f playerPosWithCamOffset;
Vec3f atTarget; Vec3f atTarget;
Vec3f posOffsetTarget; Vec3f playerToAtOffsetTarget;
VecGeo atEyeNextOffset; VecGeo atEyeNextOffset;
VecGeo atTargetEyeNextOffset; VecGeo atTargetEyeNextOffset;
PosRot* playerPosRot = &camera->playerPosRot; PosRot* playerPosRot = &camera->playerPosRot;
BgCamFuncData* bgCamFuncData; BgCamFuncData* bgCamFuncData;
Vec3f* posOffset = &camera->posOffset; Vec3f* posOffset = &camera->playerToAtOffset;
Fixed4ReadOnlyData* roData = &camera->paramData.fixd4.roData; Fixed4ReadOnlyData* roData = &camera->paramData.fixd4.roData;
Fixed4ReadWriteData* rwData = &camera->paramData.fixd4.rwData; Fixed4ReadWriteData* rwData = &camera->paramData.fixd4.rwData;
f32 playerYOffset; f32 playerYOffset;
@ -4212,14 +4214,14 @@ s32 Camera_Fixed4(Camera* camera) {
VEC3F_LERPIMPDST(eyeNext, eyeNext, &rwData->eyeTarget, roData->speedToEyePos); VEC3F_LERPIMPDST(eyeNext, eyeNext, &rwData->eyeTarget, roData->speedToEyePos);
*eye = *eyeNext; *eye = *eyeNext;
posOffsetTarget.x = 0.0f; playerToAtOffsetTarget.x = 0.0f;
posOffsetTarget.y = roData->yOffset + playerYOffset; playerToAtOffsetTarget.y = roData->yOffset + playerYOffset;
posOffsetTarget.z = 0.0f; playerToAtOffsetTarget.z = 0.0f;
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, 0.1f, 0.1f, 0.1f); Camera_LERPCeilVec3f(&playerToAtOffsetTarget, &camera->playerToAtOffset, 0.1f, 0.1f, 0.1f);
playerPosWithCamOffset.x = playerPosRot->pos.x + camera->posOffset.x; playerPosWithCamOffset.x = playerPosRot->pos.x + camera->playerToAtOffset.x;
playerPosWithCamOffset.y = playerPosRot->pos.y + camera->posOffset.y; playerPosWithCamOffset.y = playerPosRot->pos.y + camera->playerToAtOffset.y;
playerPosWithCamOffset.z = playerPosRot->pos.z + camera->posOffset.z; playerPosWithCamOffset.z = playerPosRot->pos.z + camera->playerToAtOffset.z;
VEC3F_LERPIMPDST(&atTarget, at, &playerPosWithCamOffset, 0.5f); VEC3F_LERPIMPDST(&atTarget, at, &playerPosWithCamOffset, 0.5f);
OLib_Vec3fDiffToVecGeo(&atEyeNextOffset, eyeNext, at); OLib_Vec3fDiffToVecGeo(&atEyeNextOffset, eyeNext, at);
@ -4366,9 +4368,9 @@ s32 Camera_Subj3(Camera* camera) {
Camera_AddVecGeoToVec3f(eye, at, &sp7C); Camera_AddVecGeoToVec3f(eye, at, &sp7C);
} }
camera->posOffset.x = camera->at.x - playerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - playerPosRot->pos.x;
camera->posOffset.y = camera->at.y - playerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - playerPosRot->pos.y;
camera->posOffset.z = camera->at.z - playerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - playerPosRot->pos.z;
camera->fov = Camera_LERPCeilF(roData->fovTarget, camera->fov, 0.25f, 1.0f); camera->fov = Camera_LERPCeilF(roData->fovTarget, camera->fov, 0.25f, 1.0f);
camera->roll = 0; camera->roll = 0;
camera->atLERPStepScale = 0.0f; camera->atLERPStepScale = 0.0f;
@ -4689,7 +4691,7 @@ s32 Camera_Unique1(Camera* camera) {
sCameraInterfaceField = roData->interfaceField; sCameraInterfaceField = roData->interfaceField;
if (camera->animState == 0) { if (camera->animState == 0) {
camera->posOffset.y = camera->posOffset.y - camera->playerPosDelta.y; camera->playerToAtOffset.y -= camera->playerPosDelta.y;
rwData->yawTarget = eyeNextAtOffset.yaw; rwData->yawTarget = eyeNextAtOffset.yaw;
rwData->unk_00 = 0.0f; rwData->unk_00 = 0.0f;
playerWaistPos = camera->player->bodyPartsPos[PLAYER_BODYPART_WAIST]; playerWaistPos = camera->player->bodyPartsPos[PLAYER_BODYPART_WAIST];
@ -4713,7 +4715,7 @@ s32 Camera_Unique1(Camera* camera) {
Camera_LERPCeilF(0.01f, camera->yOffsetUpdateRate, R_CAM_UPDATE_RATE_STEP_SCALE_Y * 0.01f, 0.01f); Camera_LERPCeilF(0.01f, camera->yOffsetUpdateRate, R_CAM_UPDATE_RATE_STEP_SCALE_Y * 0.01f, 0.01f);
camera->fovUpdateRate = Camera_LERPCeilF(R_CAM_FOV_UPDATE_RATE * 0.01f, camera->fovUpdateRate, 0.05f, 0.1f); camera->fovUpdateRate = Camera_LERPCeilF(R_CAM_FOV_UPDATE_RATE * 0.01f, camera->fovUpdateRate, 0.05f, 0.1f);
Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, 1); Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, true);
OLib_Vec3fDiffToVecGeo(&sp8C, at, eyeNext); OLib_Vec3fDiffToVecGeo(&sp8C, at, eyeNext);
camera->dist = Camera_LERPClampDist(camera, sp8C.r, roData->distMin, roData->distMax); camera->dist = Camera_LERPClampDist(camera, sp8C.r, roData->distMin, roData->distMax);
@ -4935,9 +4937,9 @@ s32 Camera_Unique3(Camera* camera) {
camera->fov = roData->fov; camera->fov = roData->fov;
Camera_ChangeSettingFlags(camera, camera->prevSetting, 2); Camera_ChangeSettingFlags(camera, camera->prevSetting, 2);
camera->atLERPStepScale = 0.0f; camera->atLERPStepScale = 0.0f;
camera->posOffset.x = camera->at.x - cameraPlayerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - cameraPlayerPosRot->pos.x;
camera->posOffset.y = camera->at.y - cameraPlayerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - cameraPlayerPosRot->pos.y;
camera->posOffset.z = camera->at.z - cameraPlayerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - cameraPlayerPosRot->pos.z;
break; break;
} }
@ -5025,9 +5027,9 @@ s32 Camera_Unique0(Camera* camera) {
CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_R) || CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_R) ||
CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_Z))) { CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_Z))) {
camera->dist = OLib_Vec3fDist(&camera->at, eye); camera->dist = OLib_Vec3fDist(&camera->at, eye);
camera->posOffset.x = camera->at.x - playerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - playerPosRot->pos.x;
camera->posOffset.y = camera->at.y - playerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - playerPosRot->pos.y;
camera->posOffset.z = camera->at.z - playerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - playerPosRot->pos.z;
camera->atLERPStepScale = 0.0f; camera->atLERPStepScale = 0.0f;
camera->stateFlags |= CAM_STATE_2; camera->stateFlags |= CAM_STATE_2;
Camera_ChangeSettingFlags(camera, camera->prevSetting, 2); Camera_ChangeSettingFlags(camera, camera->prevSetting, 2);
@ -5052,9 +5054,9 @@ s32 Camera_Unique0(Camera* camera) {
CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_R) || CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_R) ||
CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_Z))) { CHECK_BTN_ALL(D_8015BD7C->state.input[0].press.button, BTN_Z))) {
camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye); camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye);
camera->posOffset.x = camera->at.x - playerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - playerPosRot->pos.x;
camera->posOffset.y = camera->at.y - playerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - playerPosRot->pos.y;
camera->posOffset.z = camera->at.z - playerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - playerPosRot->pos.z;
camera->atLERPStepScale = 0.0f; camera->atLERPStepScale = 0.0f;
Camera_ChangeSettingFlags(camera, camera->prevSetting, 2); Camera_ChangeSettingFlags(camera, camera->prevSetting, 2);
camera->stateFlags |= CAM_STATE_2; camera->stateFlags |= CAM_STATE_2;
@ -5106,9 +5108,9 @@ s32 Camera_Unique6(Camera* camera) {
sp2C = playerPosRot->pos; sp2C = playerPosRot->pos;
sp2C.y += offset; sp2C.y += offset;
camera->dist = OLib_Vec3fDist(&sp2C, &camera->eye); camera->dist = OLib_Vec3fDist(&sp2C, &camera->eye);
camera->posOffset.x = camera->at.x - playerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - playerPosRot->pos.x;
camera->posOffset.y = camera->at.y - playerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - playerPosRot->pos.y;
camera->posOffset.z = camera->at.z - playerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - playerPosRot->pos.z;
} else { } else {
camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye); camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye);
} }
@ -5666,9 +5668,9 @@ s32 Camera_Unique9(Camera* camera) {
} }
if (camera->player != NULL) { if (camera->player != NULL) {
camera->posOffset.x = camera->at.x - camera->playerPosRot.pos.x; camera->playerToAtOffset.x = camera->at.x - camera->playerPosRot.pos.x;
camera->posOffset.y = camera->at.y - camera->playerPosRot.pos.y; camera->playerToAtOffset.y = camera->at.y - camera->playerPosRot.pos.y;
camera->posOffset.z = camera->at.z - camera->playerPosRot.pos.z; camera->playerToAtOffset.z = camera->at.z - camera->playerPosRot.pos.z;
} }
camera->dist = OLib_Vec3fDist(at, eye); camera->dist = OLib_Vec3fDist(at, eye);
@ -6007,9 +6009,9 @@ s32 Camera_Demo3(Camera* camera) {
camera->dist = OLib_Vec3fDist(at, eye); camera->dist = OLib_Vec3fDist(at, eye);
camera->atLERPStepScale = 0.1f; camera->atLERPStepScale = 0.1f;
camera->posOffset.x = camera->at.x - camPlayerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - camPlayerPosRot->pos.x;
camera->posOffset.y = camera->at.y - camPlayerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - camPlayerPosRot->pos.y;
camera->posOffset.z = camera->at.z - camPlayerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - camPlayerPosRot->pos.z;
return true; return true;
} }
@ -6528,9 +6530,9 @@ s32 Camera_Special0(Camera* camera) {
Actor_GetFocus(&camera->targetPosRot, camera->target); Actor_GetFocus(&camera->targetPosRot, camera->target);
Camera_LERPCeilVec3f(&camera->targetPosRot.pos, &camera->at, roData->lerpAtScale, roData->lerpAtScale, 0.1f); Camera_LERPCeilVec3f(&camera->targetPosRot.pos, &camera->at, roData->lerpAtScale, roData->lerpAtScale, 0.1f);
camera->posOffset.x = camera->at.x - playerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - playerPosRot->pos.x;
camera->posOffset.y = camera->at.y - playerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - playerPosRot->pos.y;
camera->posOffset.z = camera->at.z - playerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - playerPosRot->pos.z;
camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye); camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye);
camera->xzSpeed = 0.0f; camera->xzSpeed = 0.0f;
@ -6669,7 +6671,7 @@ s32 Camera_Special5(Camera* camera) {
} }
} }
Camera_CalcAtDefault(camera, &sp5C, roData->yOffset, 0); Camera_CalcAtDefault(camera, &sp5C, roData->yOffset, false);
camera->fov = Camera_LERPCeilF(roData->fovTarget, camera->fov, camera->fov = Camera_LERPCeilF(roData->fovTarget, camera->fov,
camera->atLERPStepScale * CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), 1.0f); camera->atLERPStepScale * CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), 1.0f);
camera->roll = Camera_LERPCeilS(0, camera->roll, 0.5f, 0xA); camera->roll = Camera_LERPCeilS(0, camera->roll, 0.5f, 0xA);
@ -6739,9 +6741,9 @@ s32 Camera_Special7(Camera* camera) {
camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye); camera->dist = OLib_Vec3fDist(&camera->at, &camera->eye);
camera->atLERPStepScale = 0.0f; camera->atLERPStepScale = 0.0f;
camera->posOffset.x = camera->at.x - playerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - playerPosRot->pos.x;
camera->posOffset.y = camera->at.y - playerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - playerPosRot->pos.y;
camera->posOffset.z = camera->at.z - playerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - playerPosRot->pos.z;
return true; return true;
} }
@ -7004,9 +7006,9 @@ s32 Camera_Special9(Camera* camera) {
spAC = playerPosRot->pos; spAC = playerPosRot->pos;
spAC.y += playerYOffset; spAC.y += playerYOffset;
camera->dist = OLib_Vec3fDist(&spAC, eye); camera->dist = OLib_Vec3fDist(&spAC, eye);
camera->posOffset.x = camera->at.x - playerPosRot->pos.x; camera->playerToAtOffset.x = camera->at.x - playerPosRot->pos.x;
camera->posOffset.y = camera->at.y - playerPosRot->pos.y; camera->playerToAtOffset.y = camera->at.y - playerPosRot->pos.y;
camera->posOffset.z = camera->at.z - playerPosRot->pos.z; camera->playerToAtOffset.z = camera->at.z - playerPosRot->pos.z;
return true; return true;
} }
@ -7147,13 +7149,13 @@ void Camera_InitDataUsingPlayer(Camera* camera, Player* player) {
s32 bgId; s32 bgId;
Vec3f floorPos; Vec3f floorPos;
s32 upXZ; s32 upXZ;
f32 playerYOffset; f32 playerToAtOffsetY;
Vec3f* eye = &camera->eye; Vec3f* eye = &camera->eye;
Vec3f* at = &camera->at; Vec3f* at = &camera->at;
Vec3f* eyeNext = &camera->eyeNext; Vec3f* eyeNext = &camera->eyeNext;
Actor_GetWorldPosShapeRot(&playerPosShape, &player->actor); Actor_GetWorldPosShapeRot(&playerPosShape, &player->actor);
playerYOffset = Player_GetHeight(player); playerToAtOffsetY = Player_GetHeight(player);
camera->player = player; camera->player = player;
camera->playerPosRot = playerPosShape; camera->playerPosRot = playerPosShape;
camera->dist = eyeNextAtOffset.r = 180.0f; camera->dist = eyeNextAtOffset.r = 180.0f;
@ -7165,11 +7167,11 @@ void Camera_InitDataUsingPlayer(Camera* camera, Player* player) {
camera->xzSpeed = 0.0f; camera->xzSpeed = 0.0f;
camera->playerPosDelta.y = 0.0f; camera->playerPosDelta.y = 0.0f;
camera->at = playerPosShape.pos; camera->at = playerPosShape.pos;
camera->at.y += playerYOffset; camera->at.y += playerToAtOffsetY;
camera->posOffset.x = 0; camera->playerToAtOffset.x = 0;
camera->posOffset.y = playerYOffset; camera->playerToAtOffset.y = playerToAtOffsetY;
camera->posOffset.z = 0; camera->playerToAtOffset.z = 0;
Camera_AddVecGeoToVec3f(eyeNext, at, &eyeNextAtOffset); Camera_AddVecGeoToVec3f(eyeNext, at, &eyeNextAtOffset);
*eye = *eyeNext; *eye = *eyeNext;
@ -7276,14 +7278,15 @@ void Camera_PrintSettings(Camera* camera) {
sp48[i] = '\0'; sp48[i] = '\0';
sp48[camera->play->activeCamId] = 'a'; sp48[camera->play->activeCamId] = 'a';
func_8006376C(3, 0x16, 5, sp58); DbCamera_ScreenTextColored(3, 22, DBCAMERA_TEXT_WHITE, sp58);
func_8006376C(3, 0x16, 1, sp48); DbCamera_ScreenTextColored(3, 22, DBCAMERA_TEXT_PEACH, sp48);
func_8006376C(3, 0x17, 5, "S:"); DbCamera_ScreenTextColored(3, 23, DBCAMERA_TEXT_WHITE, "S:");
func_8006376C(5, 0x17, 4, sCameraSettingNames[camera->setting]); DbCamera_ScreenTextColored(5, 23, DBCAMERA_TEXT_GOLD, sCameraSettingNames[camera->setting]);
func_8006376C(3, 0x18, 5, "M:"); DbCamera_ScreenTextColored(3, 24, DBCAMERA_TEXT_WHITE, "M:");
func_8006376C(5, 0x18, 4, sCameraModeNames[camera->mode]); DbCamera_ScreenTextColored(5, 24, DBCAMERA_TEXT_GOLD, sCameraModeNames[camera->mode]);
func_8006376C(3, 0x19, 5, "F:"); DbCamera_ScreenTextColored(3, 25, DBCAMERA_TEXT_WHITE, "F:");
func_8006376C(5, 0x19, 4, DbCamera_ScreenTextColored(
5, 25, DBCAMERA_TEXT_GOLD,
sCameraFunctionNames[sCameraSettings[camera->setting].cameraModes[camera->mode].funcIdx]); sCameraFunctionNames[sCameraSettings[camera->setting].cameraModes[camera->mode].funcIdx]);
i = 0; i = 0;
@ -7308,8 +7311,8 @@ void Camera_PrintSettings(Camera* camera) {
sp50[i++] = ' '; sp50[i++] = ' ';
sp50[i++] = ' '; sp50[i++] = ' ';
sp50[i] = '\0'; sp50[i] = '\0';
func_8006376C(3, 26, 5, "I:"); DbCamera_ScreenTextColored(3, 26, DBCAMERA_TEXT_WHITE, "I:");
func_8006376C(5, 26, 4, sp50); DbCamera_ScreenTextColored(5, 26, DBCAMERA_TEXT_GOLD, sp50);
} }
} }
@ -7677,7 +7680,7 @@ Vec3s Camera_Update(Camera* camera) {
sCameraFunctions[sCameraSettings[camera->setting].cameraModes[camera->mode].funcIdx](camera); sCameraFunctions[sCameraSettings[camera->setting].cameraModes[camera->mode].funcIdx](camera);
} else if (camera->player != NULL) { } else if (camera->player != NULL) {
OLib_Vec3fDiffToVecGeo(&eyeAtAngle, &camera->at, &camera->eye); OLib_Vec3fDiffToVecGeo(&eyeAtAngle, &camera->at, &camera->eye);
Camera_CalcAtDefault(camera, &eyeAtAngle, 0.0f, 0); Camera_CalcAtDefault(camera, &eyeAtAngle, 0.0f, false);
} }
if (camera->status == CAM_STAT_ACTIVE) { if (camera->status == CAM_STAT_ACTIVE) {
@ -8303,9 +8306,9 @@ s32 Camera_ChangeDoorCam(Camera* camera, Actor* doorActor, s16 bgCamIndex, f32 a
s32 Camera_Copy(Camera* dstCamera, Camera* srcCamera) { s32 Camera_Copy(Camera* dstCamera, Camera* srcCamera) {
s32 pad; s32 pad;
dstCamera->posOffset.x = 0.0f; dstCamera->playerToAtOffset.x = 0.0f;
dstCamera->posOffset.y = 0.0f; dstCamera->playerToAtOffset.y = 0.0f;
dstCamera->posOffset.z = 0.0f; dstCamera->playerToAtOffset.z = 0.0f;
dstCamera->atLERPStepScale = 0.1f; dstCamera->atLERPStepScale = 0.1f;
dstCamera->at = srcCamera->at; dstCamera->at = srcCamera->at;
@ -8318,9 +8321,9 @@ s32 Camera_Copy(Camera* dstCamera, Camera* srcCamera) {
if (dstCamera->player != NULL) { if (dstCamera->player != NULL) {
Actor_GetWorld(&dstCamera->playerPosRot, &dstCamera->player->actor); Actor_GetWorld(&dstCamera->playerPosRot, &dstCamera->player->actor);
dstCamera->posOffset.x = dstCamera->at.x - dstCamera->playerPosRot.pos.x; dstCamera->playerToAtOffset.x = dstCamera->at.x - dstCamera->playerPosRot.pos.x;
dstCamera->posOffset.y = dstCamera->at.y - dstCamera->playerPosRot.pos.y; dstCamera->playerToAtOffset.y = dstCamera->at.y - dstCamera->playerPosRot.pos.y;
dstCamera->posOffset.z = dstCamera->at.z - dstCamera->playerPosRot.pos.z; dstCamera->playerToAtOffset.z = dstCamera->at.z - dstCamera->playerPosRot.pos.z;
dstCamera->dist = OLib_Vec3fDist(&dstCamera->playerPosRot.pos, &dstCamera->eye); dstCamera->dist = OLib_Vec3fDist(&dstCamera->playerPosRot.pos, &dstCamera->eye);
dstCamera->xzOffsetUpdateRate = 1.0f; dstCamera->xzOffsetUpdateRate = 1.0f;
dstCamera->yOffsetUpdateRate = 1.0f; dstCamera->yOffsetUpdateRate = 1.0f;

View file

@ -5,7 +5,7 @@ typedef struct {
u8 y; u8 y;
u8 colorIndex; u8 colorIndex;
char text[21]; char text[21];
} PrintTextBufferEntry; // size = 0x18 } DbCameraTextBufferEntry; // size = 0x18
typedef struct { typedef struct {
u16 hold; u16 hold;
@ -14,17 +14,19 @@ typedef struct {
RegEditor* gRegEditor; RegEditor* gRegEditor;
PrintTextBufferEntry sDebugPrintTextBuffer[22]; DbCameraTextBufferEntry sDbCameraTextBuffer[22];
s16 sDebugPrintTextBufferNumUsed = 0;
Color_RGBA8 sDebugPrintTextColors[] = { s16 sDbCameraTextEntryCount = 0;
{ 255, 255, 32, 192 }, // 0
{ 255, 150, 128, 192 }, // 1 Color_RGBA8 sDbCameraTextColors[] = {
{ 128, 96, 0, 64 }, // 2 { 255, 255, 32, 192 }, // DBCAMERA_TEXT_YELLOW
{ 192, 128, 16, 128 }, // 3 { 255, 150, 128, 192 }, // DBCAMERA_TEXT_PEACH
{ 255, 192, 32, 128 }, // 4 { 128, 96, 0, 64 }, // DBCAMERA_TEXT_BROWN
{ 230, 230, 220, 64 }, // 5 { 192, 128, 16, 128 }, // DBCAMERA_TEXT_ORANGE
{ 128, 150, 255, 128 }, // 6 { 255, 192, 32, 128 }, // DBCAMERA_TEXT_GOLD
{ 128, 255, 32, 128 }, // 7 { 230, 230, 220, 64 }, // DBCAMERA_TEXT_WHITE
{ 128, 150, 255, 128 }, // DBCAMERA_TEXT_BLUE
{ 128, 255, 32, 128 }, // DBCAMERA_TEXT_GREEN
}; };
InputCombo sRegGroupInputCombos[REG_GROUPS] = { InputCombo sRegGroupInputCombos[REG_GROUPS] = {
@ -106,18 +108,16 @@ void Regs_Init(void) {
} }
} }
// Called when free movement is active. // Function is stubbed. Name is assumed by similarities in signature to `DbCamera_ScreenTextColored` and usage.
void func_8006375C(s32 arg0, s32 arg1, const char* text) { void DbCamera_ScreenText(u8 x, u8 y, const char* text) {
} }
// Store text during Update, to be drawn later during Draw void DbCamera_ScreenTextColored(u8 x, u8 y, u8 colorIndex, const char* text) {
void func_8006376C(u8 x, u8 y, u8 colorIndex, const char* text) { DbCameraTextBufferEntry* entry = &sDbCameraTextBuffer[sDbCameraTextEntryCount];
PrintTextBufferEntry* entry;
char* textDest; char* textDest;
s16 charCount; s16 charCount;
entry = &sDebugPrintTextBuffer[sDebugPrintTextBufferNumUsed]; if (sDbCameraTextEntryCount < ARRAY_COUNT(sDbCameraTextBuffer)) {
if (sDebugPrintTextBufferNumUsed < ARRAY_COUNT(sDebugPrintTextBuffer)) {
entry->x = x; entry->x = x;
entry->y = y; entry->y = y;
entry->colorIndex = colorIndex; entry->colorIndex = colorIndex;
@ -125,34 +125,38 @@ void func_8006376C(u8 x, u8 y, u8 colorIndex, const char* text) {
// Copy text into the entry, truncating if needed // Copy text into the entry, truncating if needed
charCount = 0; charCount = 0;
textDest = entry->text; textDest = entry->text;
while ((*textDest++ = *text++) != '\0') { while ((*textDest++ = *text++) != '\0') {
if (charCount++ > (ARRAY_COUNT(entry->text) - 1)) { if (charCount++ > (ARRAY_COUNT(entry->text) - 1)) {
break; break;
} }
} }
*textDest = '\0'; *textDest = '\0';
sDebugPrintTextBufferNumUsed++; sDbCameraTextEntryCount++;
} }
} }
// Draw text previously stored by calls to `func_8006376C` void DbCamera_DrawScreenText(GfxPrint* printer) {
void func_80063828(GfxPrint* printer) {
s32 i; s32 i;
Color_RGBA8* color; Color_RGBA8* color;
PrintTextBufferEntry* entry; DbCameraTextBufferEntry* entry;
for (i = 0; i < sDebugPrintTextBufferNumUsed; i++) { for (i = 0; i < sDbCameraTextEntryCount; i++) {
entry = &sDebugPrintTextBuffer[i]; entry = &sDbCameraTextBuffer[i];
color = &sDbCameraTextColors[entry->colorIndex];
color = &sDebugPrintTextColors[entry->colorIndex];
GfxPrint_SetColor(printer, color->r, color->g, color->b, color->a); GfxPrint_SetColor(printer, color->r, color->g, color->b, color->a);
GfxPrint_SetPos(printer, entry->x, entry->y); GfxPrint_SetPos(printer, entry->x, entry->y);
GfxPrint_Printf(printer, "%s", entry->text); GfxPrint_Printf(printer, "%s", entry->text);
} }
} }
// Process inputs to control the reg editor /**
* Updates the state of the Reg Editor according to user input.
* Also contains a controller rumble test that can be interfaced with via related REGs.
*/
void Regs_UpdateEditor(Input* input) { void Regs_UpdateEditor(Input* input) {
s32 dPadInputCur; s32 dPadInputCur;
s32 pageDataStart = ((gRegEditor->regGroup * REG_PAGES) + gRegEditor->regPage - 1) * REGS_PER_PAGE; s32 pageDataStart = ((gRegEditor->regGroup * REG_PAGES) + gRegEditor->regPage - 1) * REGS_PER_PAGE;
@ -160,6 +164,7 @@ void Regs_UpdateEditor(Input* input) {
s32 i; s32 i;
dPadInputCur = input->cur.button & (BTN_DUP | BTN_DLEFT | BTN_DRIGHT | BTN_DDOWN); dPadInputCur = input->cur.button & (BTN_DUP | BTN_DLEFT | BTN_DRIGHT | BTN_DDOWN);
if (CHECK_BTN_ALL(input->cur.button, BTN_L) || CHECK_BTN_ALL(input->cur.button, BTN_R) || if (CHECK_BTN_ALL(input->cur.button, BTN_L) || CHECK_BTN_ALL(input->cur.button, BTN_R) ||
CHECK_BTN_ALL(input->cur.button, BTN_START)) { CHECK_BTN_ALL(input->cur.button, BTN_START)) {
@ -188,7 +193,6 @@ void Regs_UpdateEditor(Input* input) {
case 4: case 4:
case 5: case 5:
case 6: case 6:
if (dPadInputCur == gRegEditor->dPadInputPrev) { if (dPadInputCur == gRegEditor->dPadInputPrev) {
gRegEditor->inputRepeatTimer--; gRegEditor->inputRepeatTimer--;
if (gRegEditor->inputRepeatTimer < 0) { if (gRegEditor->inputRepeatTimer < 0) {
@ -239,7 +243,6 @@ void Regs_UpdateEditor(Input* input) {
} }
} }
// Draw the reg editor
void Regs_DrawEditor(GfxPrint* printer) { void Regs_DrawEditor(GfxPrint* printer) {
s32 i; s32 i;
s32 pageStart = (gRegEditor->regPage - 1) * REGS_PER_PAGE; s32 pageStart = (gRegEditor->regPage - 1) * REGS_PER_PAGE;
@ -267,7 +270,10 @@ void Regs_DrawEditor(GfxPrint* printer) {
} }
} }
void func_80063D7C(GraphicsContext* gfxCtx) { /**
* Draws the Reg Editor and Debug Camera text on screen
*/
void Debug_DrawText(GraphicsContext* gfxCtx) {
Gfx* gfx; Gfx* gfx;
Gfx* opaStart; Gfx* opaStart;
GfxPrint printer; GfxPrint printer;
@ -282,14 +288,14 @@ void func_80063D7C(GraphicsContext* gfxCtx) {
GfxPrint_Open(&printer, gfx); GfxPrint_Open(&printer, gfx);
if ((OREG(0) == 1) || (OREG(0) == 8)) { if ((OREG(0) == 1) || (OREG(0) == 8)) {
func_80063828(&printer); DbCamera_DrawScreenText(&printer);
} }
if (gRegEditor->regPage != 0) { if (gRegEditor->regPage != 0) {
Regs_DrawEditor(&printer); Regs_DrawEditor(&printer);
} }
sDebugPrintTextBufferNumUsed = 0; sDbCameraTextEntryCount = 0;
gfx = GfxPrint_Close(&printer); gfx = GfxPrint_Close(&printer);
gSPEndDisplayList(gfx++); gSPEndDisplayList(gfx++);

View file

@ -1,9 +1,24 @@
/**
* @file z_fbdemo.c
*
* This file implements an unused transition system that takes the current screen, partitions it into large tiles, and
* can apply an effect to them.
*
* The screen is divided into 7 rows and 10 columns of tiles. (`gScreenWidth`/ 10 = `gScreenHeight` / 7 = 0x20)
*
* @note The only coded effect has a visual effect to blend the tiles to a single point, which looks like the screen
* gets sucked into.
*/
#include "global.h" #include "global.h"
Gfx D_8012AFB0[] = { // color framebuffer
extern u16 D_0F000000[];
// Unused background; a blue rectangle with a grey border that fills the screen
Gfx sTransTileBackgroundDL[] = {
gsDPPipeSync(), gsDPPipeSync(),
gsDPSetCycleType(G_CYC_FILL), gsDPSetCycleType(G_CYC_FILL),
gsDPSetColorImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 320, 0x0F000000), gsDPSetColorImage(G_IM_FMT_RGBA, G_IM_SIZ_16b, 320, D_0F000000),
gsDPSetFillColor((GPACK_RGBA5551(65, 65, 65, 1) << 16) | GPACK_RGBA5551(65, 65, 65, 1)), gsDPSetFillColor((GPACK_RGBA5551(65, 65, 65, 1) << 16) | GPACK_RGBA5551(65, 65, 65, 1)),
gsDPFillRectangle(0, 0, 319, 239), gsDPFillRectangle(0, 0, 319, 239),
gsDPPipeSync(), gsDPPipeSync(),
@ -13,7 +28,7 @@ Gfx D_8012AFB0[] = {
gsSPEndDisplayList(), gsSPEndDisplayList(),
}; };
Gfx D_8012B000[] = { Gfx sTransTileSetupDL[] = {
gsDPPipeSync(), gsDPPipeSync(),
gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON), gsSPTexture(0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON),
gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN | gsSPClearGeometryMode(G_ZBUFFER | G_SHADE | G_CULL_BOTH | G_FOG | G_LIGHTING | G_TEXTURE_GEN |
@ -25,18 +40,15 @@ Gfx D_8012B000[] = {
gsSPEndDisplayList(), gsSPEndDisplayList(),
}; };
void TransitionUnk_InitGraphics(TransitionUnk* this) { void TransitionTile_InitGraphics(TransitionTile* this) {
s32 row2;
s32 pad2;
s32 pad3;
Vtx_t* vtx2;
s32 frame; s32 frame;
s32 rowTex;
s32 row;
Gfx* gfx;
Vtx* vtx;
s32 col; s32 col;
s32 col2;
s32 colTex; s32 colTex;
Vtx* vtx;
s32 row;
s32 rowTex;
Gfx* gfx;
guMtxIdent(&this->modelView); guMtxIdent(&this->modelView);
guMtxIdent(&this->unk_98); guMtxIdent(&this->unk_98);
@ -45,74 +57,84 @@ void TransitionUnk_InitGraphics(TransitionUnk* this) {
for (frame = 0; frame < 2; frame++) { for (frame = 0; frame < 2; frame++) {
this->frame = frame; this->frame = frame;
vtx = (this->frame == 0) ? this->vtxFrame1 : this->vtxFrame2; vtx = (this->frame == 0) ? this->vtxFrame1 : this->vtxFrame2;
for (colTex = 0, col = 0; col < this->col + 1; colTex += 0x20, col++) { rowTex = 0;
for (rowTex = 0, row = 0; row < this->row + 1; row++) { for (row = 0; row < this->rows + 1; row++) {
vtx2 = &vtx->v; colTex = 0;
vtx++; for (col = 0; col < this->cols + 1; col++) {
Vtx_tn* vtxn = &vtx->n;
vtx2->tc[0] = rowTex << 6; vtx++;
vtx2->ob[0] = row * 0x20; vtxn->tc[0] = colTex << 6;
vtx2->ob[1] = col * 0x20; vtxn->ob[0] = col * 0x20;
vtx2->ob[2] = -5; vtxn->ob[1] = row * 0x20;
vtx2->flag = 0; vtxn->ob[2] = -5;
vtx2->tc[1] = colTex << 6; vtxn->flag = 0;
vtx2->cn[0] = 0; vtxn->tc[1] = rowTex << 6;
vtx2->cn[1] = 0; vtxn->n[0] = 0;
vtx2->cn[2] = 120; vtxn->n[1] = 0;
vtx2->cn[3] = 255; vtxn->n[2] = 120;
rowTex += 0x20; vtxn->a = 255;
colTex += 0x20;
} }
rowTex += 0x20;
} }
} }
gfx = this->gfx; gfx = this->gfx;
for (colTex = 0, col = 0; col < this->col; colTex += 0x20, col++) { rowTex = 0;
for (row = 0; row < this->rows; row++) {
gSPVertex(gfx++, SEGMENT_ADDR(0xA, (u32)row * (this->cols + 1) * sizeof(Vtx)), 2 * (this->cols + 1), 0);
gSPVertex(gfx++, SEGMENT_ADDR(0xA, (u32)col * (this->row + 1) * sizeof(Vtx)), 2 * (this->row + 1), 0); colTex = 0;
col2 = 0;
for (rowTex = 0, row = 0, row2 = 0; row < this->row;) { col = 0;
while (col < this->cols) {
gDPPipeSync(gfx++); gDPPipeSync(gfx++);
gDPLoadTextureTile(gfx++, SEGMENT_ADDR(0xB, 0), G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, SCREEN_HEIGHT, gDPLoadTextureTile(gfx++, SEGMENT_ADDR(0xB, 0), G_IM_FMT_RGBA, G_IM_SIZ_16b, SCREEN_WIDTH, SCREEN_HEIGHT,
rowTex, colTex, rowTex + 0x20, colTex + 0x20, 0, G_TX_NOMIRROR | G_TX_WRAP, colTex, rowTex, colTex + 0x20, rowTex + 0x20, 0, G_TX_NOMIRROR | G_TX_WRAP,
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD); G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD, G_TX_NOLOD);
gSP1Quadrangle(gfx++, row, row + 1, row2 + this->row + 2, this->row + row2 + 1, 0); gSP1Quadrangle(gfx++, col, col + 1, col2 + this->cols + 2, this->cols + col2 + 1, 0);
colTex += 0x20;
col2++;
col++;
}
rowTex += 0x20; rowTex += 0x20;
row2++;
row++;
}
} }
gDPPipeSync(gfx++); gDPPipeSync(gfx++);
gSPEndDisplayList(gfx++); gSPEndDisplayList(gfx++);
LOG_NUM("this->col * (1 + this->row * (1 + 7 + 1)) + 1 + 1", this->col * (1 + this->row * 9) + 2, "../z_fbdemo.c", LOG_NUM("this->col * (1 + this->row * (1 + 7 + 1)) + 1 + 1", this->rows * (1 + this->cols * 9) + 2, "../z_fbdemo.c",
144); 144);
LOG_NUM("gp - this->gfxtbl", gfx - this->gfx, "../z_fbdemo.c", 145); LOG_NUM("gp - this->gfxtbl", gfx - this->gfx, "../z_fbdemo.c", 145);
} }
void TransitionUnk_InitData(TransitionUnk* this) { void TransitionTile_InitVtxData(TransitionTile* this) {
s32 col;
s32 row; s32 row;
s32 col;
for (col = 0; col < this->col + 1; col++) { for (row = 0; row < this->rows + 1; row++) {
for (row = 0; row < this->row + 1; row++) { for (col = 0; col < this->cols + 1; col++) {
(this->unk_0C + row + col * (this->row + 1))->unk_0 = row * 32; (this->vtxData + col + row * (this->cols + 1))->x = col * 0x20;
(this->unk_0C + row + col * (this->row + 1))->unk_4 = col * 32; (this->vtxData + col + row * (this->cols + 1))->y = row * 0x20;
} }
} }
} }
void TransitionUnk_Destroy(TransitionUnk* this) { void TransitionTile_Destroy(TransitionTile* this) {
osSyncPrintf("fbdemo_cleanup(%08x)\n", this); osSyncPrintf("fbdemo_cleanup(%08x)\n", this);
osSyncPrintf("msleep(100);\n"); osSyncPrintf("msleep(100);\n");
Sleep_Msec(100); Sleep_Msec(100);
if (this->unk_0C != NULL) { if (this->vtxData != NULL) {
SystemArena_FreeDebug(this->unk_0C, "../z_fbdemo.c", 180); SystemArena_FreeDebug(this->vtxData, "../z_fbdemo.c", 180);
this->unk_0C = NULL; this->vtxData = NULL;
} }
if (this->vtxFrame1 != NULL) { if (this->vtxFrame1 != NULL) {
SystemArena_FreeDebug(this->vtxFrame1, "../z_fbdemo.c", 181); SystemArena_FreeDebug(this->vtxFrame1, "../z_fbdemo.c", 181);
@ -128,22 +150,23 @@ void TransitionUnk_Destroy(TransitionUnk* this) {
} }
} }
TransitionUnk* TransitionUnk_Init(TransitionUnk* this, s32 row, s32 col) { TransitionTile* TransitionTile_Init(TransitionTile* this, s32 cols, s32 rows) {
osSyncPrintf("fbdemo_init(%08x, %d, %d)\n", this, row, col); osSyncPrintf("fbdemo_init(%08x, %d, %d)\n", this, cols, rows);
bzero(this, sizeof(*this)); bzero(this, sizeof(TransitionTile));
this->frame = 0; this->frame = 0;
this->row = row; this->cols = cols;
this->col = col; this->rows = rows;
this->unk_0C = SystemArena_MallocDebug((row + 1) * sizeof(TransitionUnkData) * (col + 1), "../z_fbdemo.c", 195); this->vtxData =
this->vtxFrame1 = SystemArena_MallocDebug((row + 1) * sizeof(Vtx) * (col + 1), "../z_fbdemo.c", 196); SystemArena_MallocDebug((cols + 1) * sizeof(TransitionTileVtxData) * (rows + 1), "../z_fbdemo.c", 195);
this->vtxFrame2 = SystemArena_MallocDebug((row + 1) * sizeof(Vtx) * (col + 1), "../z_fbdemo.c", 197); this->vtxFrame1 = SystemArena_MallocDebug((cols + 1) * sizeof(Vtx) * (rows + 1), "../z_fbdemo.c", 196);
this->gfx = SystemArena_MallocDebug((this->col * (1 + this->row * 9) + 2) * sizeof(Gfx), "../z_fbdemo.c", 198); this->vtxFrame2 = SystemArena_MallocDebug((cols + 1) * sizeof(Vtx) * (rows + 1), "../z_fbdemo.c", 197);
this->gfx = SystemArena_MallocDebug((this->rows * (1 + this->cols * 9) + 2) * sizeof(Gfx), "../z_fbdemo.c", 198);
if (this->unk_0C == NULL || this->vtxFrame1 == NULL || this->vtxFrame2 == NULL || this->gfx == NULL) { if ((this->vtxData == NULL) || (this->vtxFrame1 == NULL) || (this->vtxFrame2 == NULL) || (this->gfx == NULL)) {
osSyncPrintf("fbdemo_init allocation error\n"); osSyncPrintf("fbdemo_init allocation error\n");
if (this->unk_0C != NULL) { if (this->vtxData != NULL) {
SystemArena_FreeDebug(this->unk_0C, "../z_fbdemo.c", 202); SystemArena_FreeDebug(this->vtxData, "../z_fbdemo.c", 202);
this->unk_0C = NULL; this->vtxData = NULL;
} }
if (this->vtxFrame1 != NULL) { if (this->vtxFrame1 != NULL) {
SystemArena_FreeDebug(this->vtxFrame1, "../z_fbdemo.c", 203); SystemArena_FreeDebug(this->vtxFrame1, "../z_fbdemo.c", 203);
@ -159,72 +182,75 @@ TransitionUnk* TransitionUnk_Init(TransitionUnk* this, s32 row, s32 col) {
} }
return NULL; return NULL;
} }
TransitionUnk_InitGraphics(this);
TransitionUnk_InitData(this); TransitionTile_InitGraphics(this);
TransitionTile_InitVtxData(this);
this->frame = 0; this->frame = 0;
return this; return this;
} }
void TransitionUnk_SetData(TransitionUnk* this) { void TransitionTile_SetVtx(TransitionTile* this) {
s32 row;
s32 col; s32 col;
Vtx* vtx; Vtx* vtx;
s32 row;
for (col = 0; col < this->col + 1; col++) { for (row = 0; row < this->rows + 1; row++) {
for (row = 0; row < this->row + 1; row++) { for (col = 0; col < this->cols + 1; col++) {
vtx = (this->frame == 0) ? this->vtxFrame1 : this->vtxFrame2; vtx = (this->frame == 0) ? this->vtxFrame1 : this->vtxFrame2;
(vtx + row + col * (this->row + 1))->v.ob[0] = (this->unk_0C + row + col * (this->row + 1))->unk_0; (vtx + col + row * (this->cols + 1))->n.ob[0] = (this->vtxData + col + row * (this->cols + 1))->x;
vtx = (this->frame == 0) ? this->vtxFrame1 : this->vtxFrame2; vtx = (this->frame == 0) ? this->vtxFrame1 : this->vtxFrame2;
(vtx + row + col * (this->row + 1))->v.ob[1] = (this->unk_0C + row + col * (this->row + 1))->unk_4; (vtx + col + row * (this->cols + 1))->n.ob[1] = (this->vtxData + col + row * (this->cols + 1))->y;
} }
} }
} }
void TransitionUnk_Draw(TransitionUnk* this, Gfx** gfxP) { void TransitionTile_Draw(TransitionTile* this, Gfx** gfxP) {
Gfx* gfx = *gfxP; Gfx* gfx = *gfxP;
gSPDisplayList(gfx++, D_8012B000); gSPDisplayList(gfx++, sTransTileSetupDL);
TransitionUnk_SetData(this); TransitionTile_SetVtx(this);
gSPMatrix(gfx++, &this->projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION); gSPMatrix(gfx++, &this->projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPMatrix(gfx++, &this->modelView, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPMatrix(gfx++, &this->modelView, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPSegment(gfx++, 0xA, this->frame == 0 ? this->vtxFrame1 : this->vtxFrame2); gSPSegment(gfx++, 0xA, this->frame == 0 ? this->vtxFrame1 : this->vtxFrame2);
gSPSegment(gfx++, 0xB, this->zBuffer); gSPSegment(gfx++, 0xB, this->zBuffer);
gSPDisplayList(gfx++, D_8012B000); gSPDisplayList(gfx++, sTransTileSetupDL);
gSPDisplayList(gfx++, this->gfx); gSPDisplayList(gfx++, this->gfx);
gDPPipeSync(gfx++); gDPPipeSync(gfx++);
this->frame ^= 1; this->frame ^= 1;
*gfxP = gfx; *gfxP = gfx;
} }
void TransitionUnk_Update(TransitionUnk* this) { /**
f32 temp_f00; * Blends tiles which has the visual effect of sucking those tiles into a single point
f32 temp_f12; */
s32 col; void TransitionTile_Suck(TransitionTile* this) {
f32 phi_f14;
s32 row; s32 row;
s32 col;
f32 diffX;
f32 diffY;
f32 scale;
for (col = 0; col < this->col + 1; col++) { for (row = 0; row < this->rows + 1; row++) {
for (row = 0; row < this->row + 1; row++) { for (col = 0; col < this->cols + 1; col++) {
temp_f00 = diffX = (this->vtxData + col + row * (this->cols + 1))->x - (this->vtxData + 5 + 4 * (this->cols + 1))->x;
(this->unk_0C + row + col * (this->row + 1))->unk_0 - (this->unk_0C + 5 + 4 * (this->row + 1))->unk_0; diffY = (this->vtxData + col + row * (this->cols + 1))->y - (this->vtxData + 5 + 4 * (this->cols + 1))->y;
temp_f12 = scale = (SQ(diffX) + SQ(diffY)) / 100.0f;
(this->unk_0C + row + col * (this->row + 1))->unk_4 - (this->unk_0C + 5 + 4 * (this->row + 1))->unk_4; if (scale != 0.0f) {
phi_f14 = (SQ(temp_f00) + SQ(temp_f12)) / 100.0f; if (scale < 1.0f) {
if (phi_f14 != 0.0f) { scale = 1.0f;
if (phi_f14 < 1.0f) {
phi_f14 = 1.0f;
} }
(this->unk_0C + row + col * (this->row + 1))->unk_0 -= temp_f00 / phi_f14; (this->vtxData + col + row * (this->cols + 1))->x -= diffX / scale;
(this->unk_0C + row + col * (this->row + 1))->unk_4 -= temp_f12 / phi_f14; (this->vtxData + col + row * (this->cols + 1))->y -= diffY / scale;
} }
} }
} }
} }
void func_800B23E8(TransitionUnk* this) { void TransitionTile_Update(TransitionTile* this) {
} }
s32 func_800B23F0(TransitionUnk* this) { s32 func_800B23F0(TransitionTile* this) {
return 0; return 0;
} }

View file

@ -76,7 +76,7 @@ void KaleidoScopeCall_Update(PlayState* play) {
} else if ((pauseCtx->state == PAUSE_STATE_WAIT_BG_PRERENDER) || (pauseCtx->state == PAUSE_STATE_9)) { } else if ((pauseCtx->state == PAUSE_STATE_WAIT_BG_PRERENDER) || (pauseCtx->state == PAUSE_STATE_9)) {
osSyncPrintf("PR_KAREIDOSCOPE_MODE=%d\n", R_PAUSE_BG_PRERENDER_STATE); osSyncPrintf("PR_KAREIDOSCOPE_MODE=%d\n", R_PAUSE_BG_PRERENDER_STATE);
if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_DONE) { if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_READY) {
pauseCtx->state++; // PAUSE_STATE_INIT or PAUSE_STATE_10 pauseCtx->state++; // PAUSE_STATE_INIT or PAUSE_STATE_10
} }
} else if (pauseCtx->state != PAUSE_STATE_OFF) { } else if (pauseCtx->state != PAUSE_STATE_OFF) {
@ -118,7 +118,7 @@ void KaleidoScopeCall_Update(PlayState* play) {
void KaleidoScopeCall_Draw(PlayState* play) { void KaleidoScopeCall_Draw(PlayState* play) {
KaleidoMgrOverlay* kaleidoScopeOvl = &gKaleidoMgrOverlayTable[KALEIDO_OVL_KALEIDO_SCOPE]; KaleidoMgrOverlay* kaleidoScopeOvl = &gKaleidoMgrOverlayTable[KALEIDO_OVL_KALEIDO_SCOPE];
if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_DONE) { if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_READY) {
if (((play->pauseCtx.state >= PAUSE_STATE_OPENING_1) && (play->pauseCtx.state <= PAUSE_STATE_SAVE_PROMPT) if (((play->pauseCtx.state >= PAUSE_STATE_OPENING_1) && (play->pauseCtx.state <= PAUSE_STATE_SAVE_PROMPT)
/* PAUSE_STATE_OPENING_1, PAUSE_STATE_OPENING_2, PAUSE_STATE_MAIN, PAUSE_STATE_SAVE_PROMPT */) || /* PAUSE_STATE_OPENING_1, PAUSE_STATE_OPENING_2, PAUSE_STATE_MAIN, PAUSE_STATE_SAVE_PROMPT */) ||
((play->pauseCtx.state >= PAUSE_STATE_11) && (play->pauseCtx.state <= PAUSE_STATE_CLOSING) ((play->pauseCtx.state >= PAUSE_STATE_11) && (play->pauseCtx.state <= PAUSE_STATE_CLOSING)

View file

@ -3239,7 +3239,7 @@ void Interface_Draw(PlayState* play) {
Minimap_Draw(play); Minimap_Draw(play);
if ((R_PAUSE_BG_PRERENDER_STATE != PAUSE_BG_PRERENDER_PROCESS) && if ((R_PAUSE_BG_PRERENDER_STATE != PAUSE_BG_PRERENDER_PROCESS) &&
(R_PAUSE_BG_PRERENDER_STATE != PAUSE_BG_PRERENDER_DONE)) { (R_PAUSE_BG_PRERENDER_STATE != PAUSE_BG_PRERENDER_READY)) {
func_8002C124(&play->actorCtx.targetCtx, play); // Draw Z-Target func_8002C124(&play->actorCtx.targetCtx, play); // Draw Z-Target
} }

View file

@ -6,8 +6,8 @@ void* gDebugCutsceneScript = NULL;
UNK_TYPE D_8012D1F4 = 0; // unused UNK_TYPE D_8012D1F4 = 0; // unused
Input* D_8012D1F8 = NULL; Input* D_8012D1F8 = NULL;
TransitionUnk sTrnsnUnk; TransitionTile sTransitionTile;
s32 gTrnsnUnkState; s32 gTransitionTileState;
VisMono D_80161498; VisMono D_80161498;
Color_RGBA8_u32 gVisMonoColor; Color_RGBA8_u32 gVisMonoColor;
FaultClient D_801614B8; FaultClient D_801614B8;
@ -186,9 +186,9 @@ void Play_Destroy(GameState* thisx) {
EffectSs_ClearAll(this); EffectSs_ClearAll(this);
CollisionCheck_DestroyContext(this, &this->colChkCtx); CollisionCheck_DestroyContext(this, &this->colChkCtx);
if (gTrnsnUnkState == 3) { if (gTransitionTileState == TRANS_TILE_READY) {
TransitionUnk_Destroy(&sTrnsnUnk); TransitionTile_Destroy(&sTransitionTile);
gTrnsnUnkState = 0; gTransitionTileState = TRANS_TILE_OFF;
} }
if (this->transitionMode == TRANS_MODE_INSTANCE_RUNNING) { if (this->transitionMode == TRANS_MODE_INSTANCE_RUNNING) {
@ -361,7 +361,7 @@ void Play_Init(GameState* thisx) {
PreRender_Init(&this->pauseBgPreRender); PreRender_Init(&this->pauseBgPreRender);
PreRender_SetValuesSave(&this->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, NULL); PreRender_SetValuesSave(&this->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL, NULL);
PreRender_SetValues(&this->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL); PreRender_SetValues(&this->pauseBgPreRender, SCREEN_WIDTH, SCREEN_HEIGHT, NULL, NULL);
gTrnsnUnkState = 0; gTransitionTileState = TRANS_TILE_OFF;
this->transitionMode = TRANS_MODE_OFF; this->transitionMode = TRANS_MODE_OFF;
FrameAdvance_Init(&this->frameAdvCtx); FrameAdvance_Init(&this->frameAdvCtx);
Rand_Seed((u32)osGetTime()); Rand_Seed((u32)osGetTime());
@ -492,20 +492,24 @@ void Play_Update(PlayState* this) {
this->transitionMode = TRANS_MODE_SETUP; this->transitionMode = TRANS_MODE_SETUP;
} }
if (gTrnsnUnkState != 0) { if (gTransitionTileState != TRANS_TILE_OFF) {
switch (gTrnsnUnkState) { switch (gTransitionTileState) {
case 2: case TRANS_TILE_PROCESS:
if (TransitionUnk_Init(&sTrnsnUnk, 10, 7) == NULL) { if (TransitionTile_Init(&sTransitionTile, 10, 7) == NULL) {
osSyncPrintf("fbdemo_init呼出し失敗\n"); // "fbdemo_init call failed!" osSyncPrintf("fbdemo_init呼出し失敗\n"); // "fbdemo_init call failed!"
gTrnsnUnkState = 0; gTransitionTileState = TRANS_TILE_OFF;
} else { } else {
sTrnsnUnk.zBuffer = (u16*)gZBuffer; sTransitionTile.zBuffer = (u16*)gZBuffer;
gTrnsnUnkState = 3; gTransitionTileState = TRANS_TILE_READY;
R_UPDATE_RATE = 1; R_UPDATE_RATE = 1;
} }
break; break;
case 3:
func_800B23E8(&sTrnsnUnk); case TRANS_TILE_READY:
TransitionTile_Update(&sTransitionTile);
break;
default:
break; break;
} }
} }
@ -652,9 +656,9 @@ void Play_Update(PlayState* this) {
func_800BC88C(this); func_800BC88C(this);
this->transitionMode = TRANS_MODE_OFF; this->transitionMode = TRANS_MODE_OFF;
if (gTrnsnUnkState == 3) { if (gTransitionTileState == TRANS_TILE_READY) {
TransitionUnk_Destroy(&sTrnsnUnk); TransitionTile_Destroy(&sTransitionTile);
gTrnsnUnkState = 0; gTransitionTileState = TRANS_TILE_OFF;
R_UPDATE_RATE = 3; R_UPDATE_RATE = 3;
} }
} }
@ -702,7 +706,7 @@ void Play_Update(PlayState* this) {
this->envCtx.screenFillColor[3] = (1 - sTransitionFillTimer / 20.0f) * 255.0f; this->envCtx.screenFillColor[3] = (1 - sTransitionFillTimer / 20.0f) * 255.0f;
if (sTransitionFillTimer >= 20) { if (sTransitionFillTimer >= 20) {
gTrnsnUnkState = 0; gTransitionTileState = TRANS_TILE_OFF;
R_UPDATE_RATE = 3; R_UPDATE_RATE = 3;
this->transitionTrigger = TRANS_TRIGGER_OFF; this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF; this->transitionMode = TRANS_MODE_OFF;
@ -736,7 +740,7 @@ void Play_Update(PlayState* this) {
this->transitionTrigger = TRANS_TRIGGER_OFF; this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF; this->transitionMode = TRANS_MODE_OFF;
} else { } else {
gTrnsnUnkState = 0; gTransitionTileState = TRANS_TILE_OFF;
R_UPDATE_RATE = 3; R_UPDATE_RATE = 3;
this->transitionTrigger = TRANS_TRIGGER_OFF; this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF; this->transitionMode = TRANS_MODE_OFF;
@ -767,7 +771,7 @@ void Play_Update(PlayState* this) {
if (this->transitionTrigger == TRANS_TRIGGER_END) { if (this->transitionTrigger == TRANS_TRIGGER_END) {
if (this->envCtx.sandstormPrimA < 110) { if (this->envCtx.sandstormPrimA < 110) {
gTrnsnUnkState = 0; gTransitionTileState = TRANS_TILE_OFF;
R_UPDATE_RATE = 3; R_UPDATE_RATE = 3;
this->transitionTrigger = TRANS_TRIGGER_OFF; this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF; this->transitionMode = TRANS_MODE_OFF;
@ -802,7 +806,7 @@ void Play_Update(PlayState* this) {
if (this->transitionTrigger == TRANS_TRIGGER_END) { if (this->transitionTrigger == TRANS_TRIGGER_END) {
if (this->envCtx.sandstormPrimA <= 0) { if (this->envCtx.sandstormPrimA <= 0) {
gTrnsnUnkState = 0; gTransitionTileState = TRANS_TILE_OFF;
R_UPDATE_RATE = 3; R_UPDATE_RATE = 3;
this->transitionTrigger = TRANS_TRIGGER_OFF; this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF; this->transitionMode = TRANS_MODE_OFF;
@ -825,7 +829,7 @@ void Play_Update(PlayState* this) {
this->envCtx.screenFillColor[3] = gSaveContext.cutsceneTransitionControl; this->envCtx.screenFillColor[3] = gSaveContext.cutsceneTransitionControl;
if (gSaveContext.cutsceneTransitionControl <= 100) { if (gSaveContext.cutsceneTransitionControl <= 100) {
gTrnsnUnkState = 0; gTransitionTileState = TRANS_TILE_OFF;
R_UPDATE_RATE = 3; R_UPDATE_RATE = 3;
this->transitionTrigger = TRANS_TRIGGER_OFF; this->transitionTrigger = TRANS_TRIGGER_OFF;
this->transitionMode = TRANS_MODE_OFF; this->transitionMode = TRANS_MODE_OFF;
@ -837,7 +841,7 @@ void Play_Update(PlayState* this) {
PLAY_LOG(3533); PLAY_LOG(3533);
if (1 && (gTrnsnUnkState != 3)) { if (1 && (gTransitionTileState != TRANS_TILE_READY)) {
PLAY_LOG(3542); PLAY_LOG(3542);
if ((gSaveContext.gameMode == GAMEMODE_NORMAL) && (this->msgCtx.msgMode == MSGMODE_NONE) && if ((gSaveContext.gameMode == GAMEMODE_NORMAL) && (this->msgCtx.msgMode == MSGMODE_NONE) &&
@ -1109,10 +1113,10 @@ void Play_Draw(PlayState* this) {
POLY_OPA_DISP = gfxP; POLY_OPA_DISP = gfxP;
} }
if (gTrnsnUnkState == 3) { if (gTransitionTileState == TRANS_TILE_READY) {
Gfx* sp88 = POLY_OPA_DISP; Gfx* sp88 = POLY_OPA_DISP;
TransitionUnk_Draw(&sTrnsnUnk, &sp88); TransitionTile_Draw(&sTransitionTile, &sp88);
POLY_OPA_DISP = sp88; POLY_OPA_DISP = sp88;
goto Play_Draw_DrawOverlayElements; goto Play_Draw_DrawOverlayElements;
} else { } else {
@ -1126,12 +1130,12 @@ void Play_Draw(PlayState* this) {
PreRender_ApplyFilters(&this->pauseBgPreRender); PreRender_ApplyFilters(&this->pauseBgPreRender);
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_DONE; R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_READY;
} else if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_MAX) { } else if (R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_MAX) {
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF; R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_OFF;
} }
if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_DONE) { if (R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_READY) {
Gfx* gfxP = POLY_OPA_DISP; Gfx* gfxP = POLY_OPA_DISP;
PreRender_RestoreFramebuffer(&this->pauseBgPreRender, &gfxP); PreRender_RestoreFramebuffer(&this->pauseBgPreRender, &gfxP);
@ -1247,7 +1251,8 @@ void Play_Draw(PlayState* this) {
DebugDisplay_DrawObjects(this); DebugDisplay_DrawObjects(this);
} }
if ((R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_SETUP) || (gTrnsnUnkState == 1)) { if ((R_PAUSE_BG_PRERENDER_STATE == PAUSE_BG_PRERENDER_SETUP) ||
(gTransitionTileState == TRANS_TILE_SETUP)) {
Gfx* gfxP = OVERLAY_DISP; Gfx* gfxP = OVERLAY_DISP;
// Copy the frame buffer contents at this point in the display list to the zbuffer // Copy the frame buffer contents at this point in the display list to the zbuffer
@ -1261,7 +1266,7 @@ void Play_Draw(PlayState* this) {
R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_PROCESS; R_PAUSE_BG_PRERENDER_STATE = PAUSE_BG_PRERENDER_PROCESS;
} else { } else {
gTrnsnUnkState = 2; gTransitionTileState = TRANS_TILE_PROCESS;
} }
OVERLAY_DISP = gfxP; OVERLAY_DISP = gfxP;
this->unk_121C7 = 2; this->unk_121C7 = 2;
@ -1560,11 +1565,11 @@ s32 Play_SetCameraAtEye(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye) {
player = camera->player; player = camera->player;
if (player != NULL) { if (player != NULL) {
camera->posOffset.x = at->x - player->actor.world.pos.x; camera->playerToAtOffset.x = at->x - player->actor.world.pos.x;
camera->posOffset.y = at->y - player->actor.world.pos.y; camera->playerToAtOffset.y = at->y - player->actor.world.pos.y;
camera->posOffset.z = at->z - player->actor.world.pos.z; camera->playerToAtOffset.z = at->z - player->actor.world.pos.z;
} else { } else {
camera->posOffset.x = camera->posOffset.y = camera->posOffset.z = 0.0f; camera->playerToAtOffset.x = camera->playerToAtOffset.y = camera->playerToAtOffset.z = 0.0f;
} }
camera->atLERPStepScale = 0.01f; camera->atLERPStepScale = 0.01f;
@ -1588,11 +1593,11 @@ s32 Play_SetCameraAtEyeUp(PlayState* this, s16 camId, Vec3f* at, Vec3f* eye, Vec
player = camera->player; player = camera->player;
if (player != NULL) { if (player != NULL) {
camera->posOffset.x = at->x - player->actor.world.pos.x; camera->playerToAtOffset.x = at->x - player->actor.world.pos.x;
camera->posOffset.y = at->y - player->actor.world.pos.y; camera->playerToAtOffset.y = at->y - player->actor.world.pos.y;
camera->posOffset.z = at->z - player->actor.world.pos.z; camera->playerToAtOffset.z = at->z - player->actor.world.pos.z;
} else { } else {
camera->posOffset.x = camera->posOffset.y = camera->posOffset.z = 0.0f; camera->playerToAtOffset.x = camera->playerToAtOffset.y = camera->playerToAtOffset.z = 0.0f;
} }
camera->atLERPStepScale = 0.01f; camera->atLERPStepScale = 0.01f;

View file

@ -1469,7 +1469,7 @@ void Gfx_SetupFrame(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b) {
gDPSetDepthImage(POLY_XLU_DISP++, gZBuffer); gDPSetDepthImage(POLY_XLU_DISP++, gZBuffer);
gDPSetDepthImage(OVERLAY_DISP++, gZBuffer); gDPSetDepthImage(OVERLAY_DISP++, gZBuffer);
if ((R_PAUSE_BG_PRERENDER_STATE <= PAUSE_BG_PRERENDER_SETUP) && (gTrnsnUnkState < 2)) { if ((R_PAUSE_BG_PRERENDER_STATE <= PAUSE_BG_PRERENDER_SETUP) && (gTransitionTileState <= TRANS_TILE_SETUP)) {
s32 letterboxSize = Letterbox_GetSize(); s32 letterboxSize = Letterbox_GetSize();
if (R_HREG_MODE == HREG_MODE_SETUP_FRAME) { if (R_HREG_MODE == HREG_MODE_SETUP_FRAME) {

View file

@ -13195,7 +13195,7 @@ s32 func_8084FCAC(Player* this, PlayState* play) {
speed = 20.0f; speed = 20.0f;
} }
func_8006375C(3, 2, "DEBUG MODE"); DbCamera_ScreenText(3, 2, "DEBUG MODE");
if (!CHECK_BTN_ALL(sControlInput->cur.button, BTN_L)) { if (!CHECK_BTN_ALL(sControlInput->cur.button, BTN_L)) {
if (CHECK_BTN_ALL(sControlInput->cur.button, BTN_B)) { if (CHECK_BTN_ALL(sControlInput->cur.button, BTN_B)) {

View file

@ -35,7 +35,12 @@ u32 EffectSsDFire_Init(PlayState* play, u32 index, EffectSs* this, void* initPar
this->pos = initParams->pos; this->pos = initParams->pos;
this->velocity = initParams->velocity; this->velocity = initParams->velocity;
this->accel = initParams->accel; this->accel = initParams->accel;
//! @bug Segment 6 is not set to the required object before setting this display list.
//! It works out in practice because this effect is spawned from an actor who uses the same object
//! and previously already set it to segment 6.
this->gfx = SEGMENTED_TO_VIRTUAL(gDodongoFireDL); this->gfx = SEGMENTED_TO_VIRTUAL(gDodongoFireDL);
this->life = initParams->life; this->life = initParams->life;
this->rScale = initParams->scale; this->rScale = initParams->scale;
this->rScaleStep = initParams->scaleStep; this->rScaleStep = initParams->scaleStep;

View file

@ -3471,7 +3471,7 @@ void KaleidoScope_Update(PlayState* play) {
s16 stepA; s16 stepA;
s32 pad; s32 pad;
if ((R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_DONE) && if ((R_PAUSE_BG_PRERENDER_STATE >= PAUSE_BG_PRERENDER_READY) &&
(((pauseCtx->state >= PAUSE_STATE_OPENING_1) && (pauseCtx->state <= PAUSE_STATE_SAVE_PROMPT) (((pauseCtx->state >= PAUSE_STATE_OPENING_1) && (pauseCtx->state <= PAUSE_STATE_SAVE_PROMPT)
/* PAUSE_STATE_OPENING_1, PAUSE_STATE_OPENING_2, PAUSE_STATE_MAIN, PAUSE_STATE_SAVE_PROMPT */ /* PAUSE_STATE_OPENING_1, PAUSE_STATE_OPENING_2, PAUSE_STATE_MAIN, PAUSE_STATE_SAVE_PROMPT */
) || ) ||