Merge branch 'master' into audio_bgm

This commit is contained in:
engineer124
2021-11-15 14:31:19 +11:00
50 changed files with 628 additions and 290 deletions
+38
View File
@@ -0,0 +1,38 @@
#ifndef SCHED_H
#define SCHED_H
#include "PR/ultratypes.h"
#include "ultra64/vi.h"
#include "ultra64/sptask.h"
#define OS_SC_NEEDS_RDP 0x0001
#define OS_SC_NEEDS_RSP 0x0002
#define OS_SC_DRAM_DLIST 0x0004
#define OS_SC_PARALLEL_TASK 0x0010
#define OS_SC_LAST_TASK 0x0020
#define OS_SC_SWAPBUFFER 0x0040
#define OS_SC_RCP_MASK 0x0003
#define OS_SC_TYPE_MASK 0x0007
#define OS_SC_DP 0x0001
#define OS_SC_SP 0x0002
#define OS_SC_YIELD 0x0010
#define OS_SC_YIELDED 0x0020
typedef struct OSScTask {
/* 0x00 */ struct OSScTask* next;
/* 0x04 */ u32 state;
/* 0x08 */ u32 flags;
/* 0x0C */ void* framebuffer;
/* 0x10 */ OSTask list;
/* 0x50 */ OSMesgQueue* msgQ;
/* 0x54 */ OSMesg msg;
} OSScTask; // size = 0x58
typedef struct {
/* 0x0 */ s16 type;
/* 0x2 */ u8 misc[30];
} OSScMsg;
#endif
+17 -17
View File
@@ -995,7 +995,7 @@ s32 func_800C45C4(CollisionContext* colCtx, u32 arg1, Vec3f* arg2, Vec3f* arg3,
// void func_800C5538(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10);
s32 func_800C55C4(CollisionContext* colCtx, Vec3f* arg1, Vec3f* arg2, Vec3f* arg3, CollisionPoly** arg4, u32 arg5, u32 arg6, u32 arg7, u32 arg8, u32* arg9);
// void func_800C5650(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11);
// void func_800C56E0(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11, UNK_TYPE4 param_12);
s32 func_800C56E0(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 chkWall, s32 chkFloor, s32 chkCeil, s32 chkOneFace, s32* bgId, Actor* actor, f32 chkDist);
s32 func_800C576C(CollisionContext* colCtx, Vec3f* arg1, Vec3f* arg2, Vec3f* arg3, CollisionPoly** arg4, u32 arg5, u32 arg6, u32 arg7, u32 arg8, u32* arg9);
// void func_800C57F8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6);
// void func_800C583C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9);
@@ -1109,22 +1109,22 @@ void BgCheck2_UpdateActorPosition(CollisionContext* colCtx, s32 index, Actor* ac
void BgCheck2_UpdateActorYRotation(CollisionContext* colCtx, s32 index, Actor* actor);
void BgCheck2_AttachToMesh(CollisionContext* colCtx, Actor* actor, s32 index);
u32 BgCheck2_UpdateActorAttachedToMesh(CollisionContext* colCtx, s32 index, Actor* actor);
void BcCheck3_BgActorInit(DynaPolyActor* actor, UNK_TYPE4 param_2);
void BgCheck3_LoadMesh(GlobalContext* globalCtx, DynaPolyActor* actor, CollisionHeader* meshHeader);
void BgCheck3_ResetFlags(DynaPolyActor* actor);
void func_800CAE88(DynaPolyActor* actor);
void func_800CAE9C(DynaPolyActor* actor);
void func_800CAEB0(CollisionContext* colCtx, s32 index);
void func_800CAEE0(DynaPolyActor* actor);
void func_800CAEF4(CollisionContext* colCtx, s32 index);
void func_800CAF24(DynaPolyActor* actor);
void func_800CAF38(DynaPolyActor* actor);
s32 func_800CAF4C(DynaPolyActor* actor);
s32 func_800CAF70(DynaPolyActor* actor);
s32 func_800CAF94(DynaPolyActor* actor);
s32 func_800CAFB8(DynaPolyActor* actor);
s32 func_800CAFDC(DynaPolyActor* actor);
// void func_800CB000(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE2 param_5);
void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 flags);
void DynaPolyActor_LoadMesh(GlobalContext* globalCtx, DynaPolyActor* dynaActor, CollisionHeader* meshHeader);
void DynaPolyActor_ResetState(DynaPolyActor* dynaActor);
void DynaPolyActor_SetRidingFallingState(DynaPolyActor* dynaActor);
void DynaPolyActor_SetRidingMovingState(DynaPolyActor* dynaActor);
void DynaPolyActor_SetRidingMovingStateByIndex(CollisionContext* colCtx, s32 index);
void DynaPolyActor_SetRidingRotatingState(DynaPolyActor* dynaActor);
void DynaPolyActor_SetRidingRotatingStateByIndex(CollisionContext* colCtx, s32 index);
void DynaPolyActor_SetSwitchPressedState(DynaPolyActor* dynaActor);
void DynaPolyActor_SetHeavySwitchPressedState(DynaPolyActor* dynaActor);
s32 DynaPolyActor_IsInRidingFallingState(DynaPolyActor* dynaActor);
s32 DynaPolyActor_IsInRidingMovingState(DynaPolyActor* dynaActor);
s32 DynaPolyActor_IsInRidingRotatingState(DynaPolyActor* dynaActor);
s32 DynaPolyActor_IsInSwitchPressedState(DynaPolyActor* dynaActor);
s32 DynaPolyActor_IsInHeavySwitchPressedState(DynaPolyActor* dynaActor);
s32 DynaPolyActor_ValidateMove(GlobalContext* globalCtx, DynaPolyActor* dynaActor, s16 arg2, s16 arg3, s16 arg4);
f32 Camera_fabsf(f32 f);
f32 Camera_LengthVec3f(Vec3f* v);
// void func_800CB270(void);
+27
View File
@@ -0,0 +1,27 @@
#ifndef IRQMGR_H
#define IRQMGR_H
#include "PR/ultratypes.h"
#include "PR/sched.h"
#include "ultra64/message.h"
typedef struct IrqMgrClient {
/* 0x0 */ struct IrqMgrClient* next;
/* 0x4 */ OSMesgQueue* queue;
} IrqMgrClient; // size = 0x8
typedef struct {
/* 0x000 */ OSScMsg verticalRetraceMesg;
/* 0x020 */ OSScMsg prenmiMsg;
/* 0x040 */ OSScMsg nmiMsg;
/* 0x060 */ OSMesgQueue irqQueue;
/* 0x078 */ OSMesg irqBuffer[8];
/* 0x098 */ OSThread thread;
/* 0x248 */ IrqMgrClient* callbacks;
/* 0x24C */ u8 prenmiStage;
/* 0x250 */ OSTime lastPrenmiTime;
/* 0x258 */ OSTimer prenmiTimer;
/* 0x278 */ OSTime lastFrameTime;
} IrqMgr; // size = 0x280
#endif
+6
View File
@@ -5,6 +5,12 @@
#include "convert.h"
#include "z64.h"
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
#define SCREEN_WIDTH_HIGH_RES 576
#define SCREEN_HEIGHT_HIGH_RES 454
#define ARRAY_COUNT(arr) (s32)(sizeof(arr) / sizeof(arr[0]))
#define ARRAY_COUNTU(arr) (u32)(sizeof(arr) / sizeof(arr[0]))
+47
View File
@@ -0,0 +1,47 @@
#ifndef SCHEDULER_H
#define SCHEDULER_H
#include "PR/ultratypes.h"
#include "PR/sched.h"
#include "ultra64/vi.h"
#include "ultra64/sptask.h"
#include "irqmgr.h"
#define TASK_FRAMEBUFFER(task) ((CfbInfo*)(task)->framebuffer)
typedef struct {
/* 0x00 */ u16* fb1;
/* 0x04 */ u16* swapBuffer;
/* 0x08 */ OSViMode* viMode;
/* 0x0C */ u32 features;
/* 0x10 */ u8 unk_10;
/* 0x11 */ s8 updateRate;
/* 0x12 */ s8 updateRate2;
/* 0x13 */ u8 unk_13;
/* 0x14 */ f32 xScale;
/* 0x18 */ f32 yScale;
} CfbInfo; // size = 0x1C
typedef struct {
/* 0x000 */ OSMesgQueue interruptQ;
/* 0x018 */ OSMesg intBuf[64];
/* 0x118 */ OSMesgQueue cmdQ;
/* 0x130 */ OSMesg cmdMsgBuf[8];
/* 0x150 */ OSThread thread;
/* 0x300 */ OSScTask* audioListHead;
/* 0x304 */ OSScTask* gfxListHead;
/* 0x308 */ OSScTask* audioListTail;
/* 0x30C */ OSScTask* gfxListTail;
/* 0x310 */ OSScTask* curRSPTask;
/* 0x314 */ OSScTask* curRDPTask;
/* 0x318 */ s32 retraceCount;
/* 0x318 */ s32 doAudio;
/* 0x320 */ CfbInfo* curBuf;
/* 0x324 */ CfbInfo* pendingSwapBuf1;
/* 0x328 */ CfbInfo* pendingSwapBuf2;
/* 0x32C */ char unk_32C[0x3];
/* 0x32F */ u8 shouldUpdateVi;
/* 0x330 */ IrqMgrClient irqClient;
} SchedContext; // size = 0x338
#endif
+1
View File
@@ -1,6 +1,7 @@
#ifndef _ULTRA64_VI_H_
#define _ULTRA64_VI_H_
#include "PR/ultratypes.h"
#include "ultra64/message.h"
/* Special Features */
+1
View File
@@ -3,6 +3,7 @@
#include "z64.h"
#include "segment_symbols.h"
#include "macros.h"
// pre-boot variables
extern u32 osTvType;
+3 -91
View File
@@ -13,12 +13,14 @@
#include "io/controller.h"
#include "osint.h"
#include "os.h"
#include "irqmgr.h"
#include "scheduler.h"
#include "xstdio.h"
#include "bgm.h"
#include "sfx.h"
#include "color.h"
#include "ichain.h"
#include "sfx.h"
#include "z64actor.h"
#include "z64animation.h"
@@ -37,12 +39,6 @@
#include "z64transition.h"
#include "regs.h"
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
#define SCREEN_WIDTH_HIGH_RES 576
#define SCREEN_HEIGHT_HIGH_RES 454
#define Z_THREAD_ID_IDLE 1
#define Z_THREAD_ID_SLOWLY 2
#define Z_THREAD_ID_MAIN 3
@@ -249,30 +245,6 @@ typedef struct {
/* 0x14 */ s16 data[REG_GROUPS * REG_PER_GROUP]; // 0xAE0 entries
} GameInfo; // size = 0x15D4
typedef struct IrqMgrClient {
/* 0x0 */ struct IrqMgrClient* next;
/* 0x4 */ OSMesgQueue* queue;
} IrqMgrClient; // size = 0x8
typedef struct {
/* 0x0 */ s16 type;
/* 0x2 */ u8 misc[30];
} OSScMsg;
typedef struct {
/* 0x000 */ OSScMsg verticalRetraceMesg;
/* 0x020 */ OSScMsg prenmiMsg;
/* 0x040 */ OSScMsg nmiMsg;
/* 0x060 */ OSMesgQueue irqQueue;
/* 0x078 */ OSMesg irqBuffer[8];
/* 0x098 */ OSThread thread;
/* 0x248 */ IrqMgrClient* callbacks;
/* 0x24C */ u8 prenmiStage;
/* 0x250 */ OSTime lastPrenmiTime;
/* 0x258 */ OSTimer prenmiTimer;
/* 0x278 */ OSTime lastFrameTime;
} IrqMgr; // size = 0x280
typedef struct {
/* 0x0000 */ u32 size;
/* 0x0004 */ void* bufp;
@@ -316,44 +288,6 @@ typedef struct {
/* 0x20308 */ u16 tailMagic; // 5678
} GfxPool; // size = 0x20310
typedef struct {
/* 0x00 */ u16* fb1;
/* 0x04 */ u16* swapBuffer;
/* 0x08 */ OSViMode* viMode;
/* 0x0C */ u32 features;
/* 0x10 */ u8 unk_10;
/* 0x11 */ s8 updateRate;
/* 0x12 */ s8 updateRate2;
/* 0x13 */ u8 unk_13;
/* 0x14 */ f32 xScale;
/* 0x18 */ f32 yScale;
} CfbInfo; // size = 0x1C
#define OS_SC_NEEDS_RDP 0x0001
#define OS_SC_NEEDS_RSP 0x0002
#define OS_SC_DRAM_DLIST 0x0004
#define OS_SC_PARALLEL_TASK 0x0010
#define OS_SC_LAST_TASK 0x0020
#define OS_SC_SWAPBUFFER 0x0040
#define OS_SC_RCP_MASK 0x0003
#define OS_SC_TYPE_MASK 0x0007
#define OS_SC_DP 0x0001
#define OS_SC_SP 0x0002
#define OS_SC_YIELD 0x0010
#define OS_SC_YIELDED 0x0020
typedef struct OSScTask {
/* 0x00 */ struct OSScTask* next;
/* 0x04 */ u32 state;
/* 0x08 */ u32 flags;
/* 0x0C */ CfbInfo* framebuffer;
/* 0x10 */ OSTask list;
/* 0x50 */ OSMesgQueue* msgQ;
/* 0x54 */ OSMesg msg;
} OSScTask; // size = 0x58
typedef struct GraphicsContext {
/* 0x000 */ Gfx* polyOpaBuffer; // Pointer to "Zelda 0"
/* 0x004 */ Gfx* polyXluBuffer; // Pointer to "Zelda 1"
@@ -392,28 +326,6 @@ typedef struct GraphicsContext {
/* 0x2FC */ GfxMasterList* masterList;
} GraphicsContext; // size = 0x300
typedef struct {
/* 0x000 */ OSMesgQueue interruptQ;
/* 0x018 */ OSMesg intBuf[64];
/* 0x118 */ OSMesgQueue cmdQ;
/* 0x130 */ OSMesg cmdMsgBuf[8];
/* 0x150 */ OSThread thread;
/* 0x300 */ OSScTask* audioListHead;
/* 0x304 */ OSScTask* gfxListHead;
/* 0x308 */ OSScTask* audioListTail;
/* 0x30C */ OSScTask* gfxListTail;
/* 0x310 */ OSScTask* curRSPTask;
/* 0x314 */ OSScTask* curRDPTask;
/* 0x318 */ s32 retraceCount;
/* 0x318 */ s32 doAudio;
/* 0x320 */ CfbInfo* curBuf;
/* 0x324 */ CfbInfo* pendingSwapBuf1;
/* 0x328 */ CfbInfo* pendingSwapBuf2;
/* 0x32C */ char unk_32C[0x3];
/* 0x32F */ u8 shouldUpdateVi;
/* 0x330 */ IrqMgrClient irqClient;
} SchedContext; // size = 0x338
typedef enum IRQ_MSG_TYPE {
IRQ_VERTICAL_RETRACE_MSG = 0x1,
IRQ_PRENMI_2_MSG = 0x3,
+4 -4
View File
@@ -228,12 +228,12 @@ typedef enum {
typedef struct {
/* 0x000 */ Actor actor;
/* 0x144 */ s32 bgId;
/* 0x148 */ f32 unk148;
/* 0x148 */ f32 pushForce;
/* 0x14C */ f32 unk14C;
/* 0x150 */ s16 unk150;
/* 0x150 */ s16 yRotation;
/* 0x152 */ u16 unk152;
/* 0x154 */ u32 unk154;
/* 0x158 */ u8 unk_158;
/* 0x154 */ u32 flags;
/* 0x158 */ u8 stateFlags;
/* 0x15A */ s16 pad15A;
} DynaPolyActor; // size = 0x15C
-1
View File
@@ -457,7 +457,6 @@ beginseg
include "build/data/code/z_bgcheck.bss.o"
include "build/src/code/z_bg_collect.o"
include "build/src/code/z_bg_item.o"
include "build/src/code/code_800CB000.o"
include "build/src/code/z_camera.o"
include "build/data/code/z_camera.data.o"
include "build/data/code/z_camera.bss.o"
-3
View File
@@ -1,3 +0,0 @@
#include "global.h"
#pragma GLOBAL_ASM("asm/non_matchings/code/code_800CB000/func_800CB000.s")
+3 -3
View File
@@ -225,7 +225,7 @@ s32 Sched_TaskCheckFramebuffers(SchedContext* sched, OSScTask* task) {
void* nextFB = osViGetNextFramebuffer();
void* curFB = osViGetCurrentFramebuffer();
if (task == NULL || sched->pendingSwapBuf1 != NULL || (curFB == task->framebuffer->fb1 && curFB != nextFB)) {
if (task == NULL || sched->pendingSwapBuf1 != NULL || (curFB == TASK_FRAMEBUFFER(task)->fb1 && curFB != nextFB)) {
return 0;
}
return 1;
@@ -257,7 +257,7 @@ s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s3
}
}
} else if (ret == (OS_SC_SP | OS_SC_DP)) {
if (gfxTask->framebuffer == NULL || Sched_TaskCheckFramebuffers(sched, gfxTask)) {
if (TASK_FRAMEBUFFER(gfxTask) == NULL || Sched_TaskCheckFramebuffers(sched, gfxTask)) {
*spTask = *dpTask = gfxTask;
ret &= ~(OS_SC_SP | OS_SC_DP);
sched->gfxListHead = sched->gfxListHead->next;
@@ -271,7 +271,7 @@ s32 Sched_Schedule(SchedContext* sched, OSScTask** spTask, OSScTask** dpTask, s3
}
void Sched_TaskUpdateFramebuffer(SchedContext* sched, OSScTask* task) {
sched->pendingSwapBuf1 = task->framebuffer;
sched->pendingSwapBuf1 = TASK_FRAMEBUFFER(task);
if (sched->curBuf != NULL && sched->curBuf->updateRate2 > 0) {
return;
+2 -2
View File
@@ -509,8 +509,8 @@ f32 Actor_YDistance(Actor* actor1, Actor* actor2) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_actor/func_800B72E0.s")
void func_800B72F8(DynaPolyActor* dpactor, f32 a1, s16 a2) {
dpactor->unk150 = a2;
dpactor->unk148 += a1;
dpactor->yRotation = a2;
dpactor->pushForce += a1;
}
#pragma GLOBAL_ASM("asm/non_matchings/code/z_actor/Actor_IsLinkFacingActor.s")
+6 -6
View File
@@ -61,13 +61,13 @@ void BgCheck2_AttachToMesh(CollisionContext* colCtx, Actor* actor, s32 index) {
meshActor = BgCheck_GetActorOfMesh(colCtx, index);
if (meshActor != NULL) {
func_800CAE88(meshActor);
DynaPolyActor_SetRidingFallingState(meshActor);
if ((actor->flags & 0x4000000) == 0x4000000) {
func_800CAF24(meshActor);
DynaPolyActor_SetSwitchPressedState(meshActor);
}
if ((actor->flags & 0x20000) == 0x20000) {
func_800CAF38(meshActor);
DynaPolyActor_SetHeavySwitchPressedState(meshActor);
}
}
}
@@ -80,7 +80,7 @@ u32 BgCheck2_UpdateActorAttachedToMesh(CollisionContext* colCtx, s32 index, Acto
return 0;
}
if (((colCtx->dyna.bgActorFlags[index] & 2) != 0) || ((colCtx->dyna.bgActorFlags[index] & 1) == 0)) {
if (colCtx->dyna.bgActorFlags[index] & 2 || !(colCtx->dyna.bgActorFlags[index] & 1)) {
return 0;
}
@@ -90,12 +90,12 @@ u32 BgCheck2_UpdateActorAttachedToMesh(CollisionContext* colCtx, s32 index, Acto
return 0;
}
if ((meshActor->unk154 & 1) != 0) {
if (meshActor->flags & 1) {
BgCheck2_UpdateActorPosition(colCtx, index, actor);
wasUpdated = 1;
}
if ((meshActor->unk154 & 2) != 0) {
if (meshActor->flags & 2) {
BgCheck2_UpdateActorYRotation(colCtx, index, actor);
wasUpdated = 1;
}
+94 -52
View File
@@ -1,99 +1,141 @@
#include "global.h"
void BcCheck3_BgActorInit(DynaPolyActor* actor, UNK_TYPE4 param_2) {
actor->bgId = -1;
actor->unk148 = 0;
actor->unk14C = 0;
actor->unk154 = param_2;
actor->unk_158 = 0;
#define DYNAPOLY_STATE_NONE 0
#define DYNAPOLY_STATE_RIDING_FALLING (1 << 0)
#define DYNAPOLY_STATE_RIDING_MOVING (1 << 1)
#define DYNAPOLY_STATE_RIDING_ROTATING (1 << 2)
#define DYNAPOLY_STATE_SWITCH_PRESSED (1 << 3)
#define DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED (1 << 4)
void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 flags) {
dynaActor->bgId = -1;
dynaActor->pushForce = 0.0f;
dynaActor->unk14C = 0.0f;
dynaActor->flags = flags;
dynaActor->stateFlags = DYNAPOLY_STATE_NONE;
}
void BgCheck3_LoadMesh(GlobalContext* globalCtx, DynaPolyActor* actor, CollisionHeader* meshHeader) {
CollisionHeader* header;
void DynaPolyActor_LoadMesh(GlobalContext* globalCtx, DynaPolyActor* dynaActor, CollisionHeader* meshHeader) {
CollisionHeader* header = NULL;
header = NULL;
BgCheck_RelocateMeshHeader(meshHeader, &header);
actor->bgId = BgCheck_AddActorMesh(globalCtx, &globalCtx->colCtx.dyna, actor, header);
dynaActor->bgId = BgCheck_AddActorMesh(globalCtx, &globalCtx->colCtx.dyna, dynaActor, header);
}
void BgCheck3_ResetFlags(DynaPolyActor* actor) {
actor->unk_158 = 0;
void DynaPolyActor_ResetState(DynaPolyActor* dynaActor) {
dynaActor->stateFlags = DYNAPOLY_STATE_NONE;
}
void func_800CAE88(DynaPolyActor* actor) {
actor->unk_158 |= 1;
void DynaPolyActor_SetRidingFallingState(DynaPolyActor* dynaActor) {
dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_FALLING;
}
void func_800CAE9C(DynaPolyActor* actor) {
actor->unk_158 |= 2;
void DynaPolyActor_SetRidingMovingState(DynaPolyActor* dynaActor) {
dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_MOVING;
}
void func_800CAEB0(CollisionContext* colCtx, s32 index) {
DynaPolyActor* actor;
void DynaPolyActor_SetRidingMovingStateByIndex(CollisionContext* colCtx, s32 index) {
DynaPolyActor* dynaActor = BgCheck_GetActorOfMesh(colCtx, index);
actor = BgCheck_GetActorOfMesh(colCtx, index);
if (actor != (DynaPolyActor*)0x0) {
func_800CAE9C(actor);
if (dynaActor != NULL) {
DynaPolyActor_SetRidingMovingState(dynaActor);
}
}
void func_800CAEE0(DynaPolyActor* actor) {
actor->unk_158 |= 4;
void DynaPolyActor_SetRidingRotatingState(DynaPolyActor* dynaActor) {
dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_ROTATING;
}
void func_800CAEF4(CollisionContext* colCtx, s32 index) {
DynaPolyActor* actor;
void DynaPolyActor_SetRidingRotatingStateByIndex(CollisionContext* colCtx, s32 index) {
DynaPolyActor* dynaActor = BgCheck_GetActorOfMesh(colCtx, index);
actor = BgCheck_GetActorOfMesh(colCtx, index);
if (actor != (DynaPolyActor*)0x0) {
func_800CAEE0(actor);
if (dynaActor != NULL) {
DynaPolyActor_SetRidingRotatingState(dynaActor);
}
}
void func_800CAF24(DynaPolyActor* actor) {
actor->unk_158 |= 8;
void DynaPolyActor_SetSwitchPressedState(DynaPolyActor* dynaActor) {
dynaActor->stateFlags |= DYNAPOLY_STATE_SWITCH_PRESSED;
}
void func_800CAF38(DynaPolyActor* actor) {
actor->unk_158 |= 0x10;
void DynaPolyActor_SetHeavySwitchPressedState(DynaPolyActor* dynaActor) {
dynaActor->stateFlags |= DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED;
}
s32 func_800CAF4C(DynaPolyActor* actor) {
if (actor->unk_158 & 1) {
return 1;
s32 DynaPolyActor_IsInRidingFallingState(DynaPolyActor* dynaActor) {
if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_FALLING) {
return true;
} else {
return 0;
return false;
}
}
s32 func_800CAF70(DynaPolyActor* actor) {
if (actor->unk_158 & 2) {
return 1;
s32 DynaPolyActor_IsInRidingMovingState(DynaPolyActor* dynaActor) {
if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_MOVING) {
return true;
} else {
return 0;
return false;
}
}
s32 func_800CAF94(DynaPolyActor* actor) {
if (actor->unk_158 & 4) {
return 1;
s32 DynaPolyActor_IsInRidingRotatingState(DynaPolyActor* dynaActor) {
if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_ROTATING) {
return true;
} else {
return 0;
return false;
}
}
s32 func_800CAFB8(DynaPolyActor* actor) {
if (actor->unk_158 & 8) {
return 1;
s32 DynaPolyActor_IsInSwitchPressedState(DynaPolyActor* dynaActor) {
if (dynaActor->stateFlags & DYNAPOLY_STATE_SWITCH_PRESSED) {
return true;
} else {
return 0;
return false;
}
}
s32 func_800CAFDC(DynaPolyActor* actor) {
if (actor->unk_158 & 0x10) {
return 1;
s32 DynaPolyActor_IsInHeavySwitchPressedState(DynaPolyActor* dynaActor) {
if (dynaActor->stateFlags & DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED) {
return true;
} else {
return 0;
return false;
}
}
s32 DynaPolyActor_ValidateMove(GlobalContext* globalCtx, DynaPolyActor* dynaActor, s16 startRadius, s16 endRadius,
s16 startHeight) {
Vec3f startPos;
Vec3f endPos;
Vec3f intersectionPos;
f32 sin = Math_SinS(dynaActor->yRotation);
f32 cos = Math_CosS(dynaActor->yRotation);
s32 bgId;
CollisionPoly* poly;
f32 adjustedStartRadius;
f32 adjustedEndRadius;
f32 sign = (0.0f <= dynaActor->pushForce) ? 1.0f : -1.0f;
adjustedStartRadius = (f32)startRadius - 0.1f;
startPos.x = dynaActor->actor.world.pos.x + (adjustedStartRadius * cos);
startPos.y = dynaActor->actor.world.pos.y + startHeight;
startPos.z = dynaActor->actor.world.pos.z - (adjustedStartRadius * sin);
adjustedEndRadius = (f32)endRadius - 0.1f;
endPos.x = sign * adjustedEndRadius * sin + startPos.x;
endPos.y = startPos.y;
endPos.z = sign * adjustedEndRadius * cos + startPos.z;
if (func_800C56E0(&globalCtx->colCtx, &startPos, &endPos, &intersectionPos, &poly, true, false, false, true, &bgId,
&dynaActor->actor, 0.0f)) {
return false;
}
startPos.x = (dynaActor->actor.world.pos.x * 2.0f) - startPos.x;
startPos.z = (dynaActor->actor.world.pos.z * 2.0f) - startPos.z;
endPos.x = sign * adjustedEndRadius * sin + startPos.x;
endPos.z = sign * adjustedEndRadius * cos + startPos.z;
if (func_800C56E0(&globalCtx->colCtx, &startPos, &endPos, &intersectionPos, &poly, true, false, false, true, &bgId,
&dynaActor->actor, 0.0f)) {
return false;
}
return true;
}
+271 -3
View File
@@ -1,7 +1,275 @@
#include "global.h"
#pragma GLOBAL_ASM("asm/non_matchings/boot/xldtob/_Ldtob.s")
#define BUFF_LEN 0x20
#pragma GLOBAL_ASM("asm/non_matchings/boot/xldtob/_Ldunscale.s")
s16 _Ldunscale(s16*, _Pft*);
void _Genld(_Pft*, u8, u8*, s16, s16);
#pragma GLOBAL_ASM("asm/non_matchings/boot/xldtob/_Genld.s")
const f64 digs[] = { 10e0L, 10e1L, 10e3L, 10e7L, 10e15L, 10e31L, 10e63L, 10e127L, 10e255L };
/* float properties */
#define _D0 0
#define _DBIAS 0x3ff
#define _DLONG 1
#define _DOFF 4
#define _FBIAS 0x7e
#define _FOFF 7
#define _FRND 1
#define _LBIAS 0x3ffe
#define _LOFF 15
/* integer properties */
#define _C2 1
#define _CSIGN 1
#define _ILONG 0
#define _MBMAX 8
#define NAN 2
#define INF 1
#define FINITE -1
#define _DFRAC ((1 << _DOFF) - 1)
#define _DMASK (0x7fff & ~_DFRAC)
#define _DMAX ((1 << (15 - _DOFF)) - 1)
#define _DNAN (0x8000 | _DMAX << _DOFF | 1 << (_DOFF - 1))
#define _DSIGN 0x8000
#if _D0 == 3
#define _D1 2 /* little-endian order */
#define _D2 1
#define _D3 0
#else
#define _D1 1 /* big-endian order */
#define _D2 2
#define _D3 3
#endif
void _Ldtob(_Pft* args, u8 type) {
u8 buff[BUFF_LEN];
u8* ptr = buff;
u32 sp70;
f64 val = args->v.ld;
/* maybe struct? */
s16 err;
s16 nsig;
s16 exp;
s32 i;
s32 n;
f64 factor;
s32 gen;
s32 j;
s32 lo;
ldiv_t qr;
u8 drop;
s32 n2;
if (args->prec < 0) {
args->prec = 6;
} else if (args->prec == 0 && (type == 'g' || type == 'G')) {
args->prec = 1;
}
err = _Ldunscale(&exp, (_Pft*)args);
if (err > 0) {
memcpy(args->s, err == 2 ? "NaN" : "Inf", args->n1 = 3);
return;
}
if (err == 0) {
nsig = 0;
exp = 0;
} else {
if (val < 0) {
val = -val;
}
exp = exp * 30103 / 0x000186A0 - 4;
if (exp < 0) {
n = (3 - exp) & ~3;
exp = -n;
for (i = 0; n > 0; n >>= 1, i++) {
if ((n & 1) != 0) {
val *= digs[i];
}
}
} else if (exp > 0) {
factor = 1;
exp &= ~3;
for (n = exp, i = 0; n > 0; n >>= 1, i++) {
if ((n & 1) != 0) {
factor *= digs[i];
}
}
val /= factor;
}
gen = ((type == 'f') ? exp + 10 : 6) + args->prec;
if (gen > 0x13) {
gen = 0x13;
}
*ptr++ = '0';
while (gen > 0 && 0 < val) {
lo = val;
if ((gen -= 8) > 0) {
val = (val - lo) * 1.0e8;
}
ptr = ptr + 8;
for (j = 8; lo > 0 && --j >= 0;) {
qr = ldiv(lo, 10);
*--ptr = qr.rem + '0';
lo = qr.quot;
}
while (--j >= 0) {
ptr--;
*ptr = '0';
}
ptr += 8;
}
gen = ptr - &buff[1];
for (ptr = &buff[1], exp += 7; *ptr == '0'; ptr++) {
--gen, --exp;
}
nsig = ((type == 'f') ? exp + 1 : ((type == 'e' || type == 'E') ? 1 : 0)) + args->prec;
if (gen < nsig) {
nsig = gen;
}
if (nsig > 0) {
if (nsig < gen && ptr[nsig] > '4') {
drop = '9';
} else {
drop = '0';
}
for (n2 = nsig; ptr[--n2] == drop;) {
nsig--;
}
if (drop == '9') {
ptr[n2]++;
}
if (n2 < 0) {
--ptr, ++nsig, ++exp;
}
}
}
_Genld((_Pft*)args, type, ptr, nsig, exp);
}
s16 _Ldunscale(s16* pex, _Pft* px) {
u16* ps = (u16*)px;
s16 xchar = (ps[_D0] & _DMASK) >> _DOFF;
if (xchar == _DMAX) { /* NaN or INF */
*pex = 0;
return (s16)(ps[_D0] & _DFRAC || ps[_D1] || ps[_D2] || ps[_D3] ? NAN : INF);
} else if (0 < xchar) {
ps[_D0] = (ps[_D0] & ~_DMASK) | (_DBIAS << _DOFF);
*pex = xchar - (_DBIAS - 1);
return FINITE;
}
if (0 > xchar) {
return NAN;
} else {
*pex = 0;
return 0;
}
}
void _Genld(_Pft* px, u8 code, u8* p, s16 nsig, s16 xexp) {
u8 point = '.';
if (nsig <= 0) {
nsig = 1,
p = (u8*)"0";
}
if (code == 'f' || ((code == 'g' || code == 'G') && (-4 <= xexp) && (xexp < px->prec))) { /* 'f' format */
++xexp; /* change to leading digit count */
if (code != 'f') { /* fixup for 'g' */
if (!(px->flags & FLAGS_HASH) && nsig < px->prec) {
px->prec = nsig;
}
if ((px->prec -= xexp) < 0) {
px->prec = 0;
}
}
if (xexp <= 0) { /* digits only to right of point */
px->s[px->n1++] = '0';
if (0 < px->prec || px->flags & FLAGS_HASH) {
px->s[px->n1++] = point;
}
if (px->prec < -xexp) {
xexp = -px->prec;
}
px->nz1 = -xexp;
px->prec += xexp;
if (px->prec < nsig) {
nsig = px->prec;
}
memcpy(&px->s[px->n1], p, px->n2 = nsig);
px->nz2 = px->prec - nsig;
} else if (nsig < xexp) { /* zeros before point */
memcpy(&px->s[px->n1], p, nsig);
px->n1 += nsig;
px->nz1 = xexp - nsig;
if (0 < px->prec || px->flags & FLAGS_HASH) {
px->s[px->n1] = point, ++px->n2;
}
px->nz2 = px->prec;
} else { /* enough digits before point */
memcpy(&px->s[px->n1], p, xexp);
px->n1 += xexp;
nsig -= xexp;
if (0 < px->prec || px->flags & FLAGS_HASH) {
px->s[px->n1++] = point;
}
if (px->prec < nsig) {
nsig = px->prec;
}
memcpy(&px->s[px->n1], p + xexp, nsig);
px->n1 += nsig;
px->nz1 = px->prec - nsig;
}
} else { /* 'e' format */
if (code == 'g' || code == 'G') { /* fixup for 'g' */
if (nsig < px->prec) {
px->prec = nsig;
}
if (--px->prec < 0) {
px->prec = 0;
}
code = code == 'g' ? 'e' : 'E';
}
px->s[px->n1++] = *p++;
if (0 < px->prec || px->flags & FLAGS_HASH) {
px->s[px->n1++] = point;
}
if (0 < px->prec) { /* put fraction digits */
if (px->prec < --nsig) {
nsig = px->prec;
}
memcpy(&px->s[px->n1], p, nsig);
px->n1 += nsig;
px->nz1 = px->prec - nsig;
}
p = (u8*)&px->s[px->n1]; /* put exponent */
*p++ = code;
if (0 <= xexp) {
*p++ = '+';
} else { /* negative exponent */
*p++ = '-';
xexp = -xexp;
}
if (100 <= xexp) { /* put oversize exponent */
if (1000 <= xexp) {
*p++ = xexp / 1000 + '0', xexp %= 1000;
}
*p++ = xexp / 100 + '0', xexp %= 100;
}
*p++ = xexp / 10 + '0', xexp %= 10;
*p++ = xexp + '0';
px->n2 = p - (u8*)&px->s[px->n1];
}
if ((px->flags & (FLAGS_ZERO | FLAGS_MINUS)) == FLAGS_ZERO) { /* pad with leading zeros */
s32 n = px->n0 + px->n1 + px->nz1 + px->n2 + px->nz2;
if (n < px->width) {
px->nz0 = px->width - n;
}
}
}
@@ -143,11 +143,11 @@ void BgCtowerGear_Init(Actor* thisx, GlobalContext* globalCtx) {
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
}
if (type == WATER_WHEEL) {
BcCheck3_BgActorInit(&this->dyna, 3);
BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_06018588);
DynaPolyActor_Init(&this->dyna, 3);
DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &D_06018588);
} else if (type == ORGAN) {
BcCheck3_BgActorInit(&this->dyna, 0);
BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_06016E70);
DynaPolyActor_Init(&this->dyna, 0);
DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &D_06016E70);
func_800C62BC(globalCtx, &globalCtx->colCtx.dyna, this->dyna.bgId);
}
}
@@ -53,18 +53,18 @@ void BgCtowerRot_Init(Actor* thisx, GlobalContext* globalCtx) {
Vec3f offset;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
BcCheck3_BgActorInit(&this->dyna, 1);
DynaPolyActor_Init(&this->dyna, 1);
if (this->dyna.actor.params == CORRIDOR) {
BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_060142E8);
DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &D_060142E8);
this->actionFunc = BgCtowerRot_CorridorRotate;
return;
}
player = GET_PLAYER(globalCtx);
if (this->dyna.actor.params == MAIN_DOOR) {
BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_06017410);
DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &D_06017410);
this->dyna.actor.world.rot.y = this->dyna.actor.shape.rot.y + 0x4000;
} else {
BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_06017650);
DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &D_06017650);
this->dyna.actor.world.rot.y = this->dyna.actor.shape.rot.y - 0x4000;
}
Actor_CalcOffsetOrientedToDrawRotation(&this->dyna.actor, &offset, &player->actor.world.pos);
@@ -36,7 +36,7 @@ void BgFuKaiten_Init(Actor* thisx, GlobalContext* globalCtx) {
CollisionHeader* header = 0;
Actor_SetScale(thisx, 1.0);
BcCheck3_BgActorInit(&THIS->bg, 3);
DynaPolyActor_Init(&THIS->bg, 3);
BgCheck_RelocateMeshHeader(&D_06002D30, &header);
THIS->bg.bgId = BgCheck_AddActorMesh(globalCtx, &globalCtx->colCtx.dyna, &THIS->bg, header);
@@ -51,8 +51,8 @@ void BgHakaCurtain_Init(Actor* thisx, GlobalContext* globalCtx) {
BgHakaCurtain* this = THIS;
Actor_ProcessInitChain(&this->dyna.actor, sInitChain);
BcCheck3_BgActorInit(&this->dyna, 1);
BgCheck3_LoadMesh(globalCtx, &this->dyna, &D_06001588);
DynaPolyActor_Init(&this->dyna, 1);
DynaPolyActor_LoadMesh(globalCtx, &this->dyna, &D_06001588);
if (Actor_GetRoomCleared(globalCtx, this->dyna.actor.room)) {
func_80B6DE80(this);
return;

Some files were not shown because too many files have changed in this diff Show More