1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-03 22:44:30 +00:00

Decompile Player (#387)

* Setup player decomp

* Decompile z_player.c and z_player_lib.c

* Decompile remaining z_player.c functions

* Various player improvements

* Player progress (some non matchings and .data migrated)

* Player progress (reposition data and fix some non matchings)

* Cleanup, improve and document parts of z_player_lib.c/z_player.c

* Fix player renames in z_en_st.c

* Fix missing open/close disps in z_player.c

* Minor player fixes

* Address player comments
This commit is contained in:
Roman971 2020-09-19 03:45:39 +02:00 committed by GitHub
parent b29c268f37
commit 14191307e9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
686 changed files with 16334 additions and 39630 deletions

View file

@ -97,7 +97,7 @@ u8 Inventory_DeleteEquipment(GlobalContext* globalCtx, s16 equipment) {
gSaveContext.infTable[29] = 1;
}
func_8008ECAC(globalCtx, player);
Player_SetEquipmentData(globalCtx, player);
globalCtx->pauseCtx.unk_238 = 10;
}

View file

@ -27,7 +27,7 @@ void func_800A9F6C(f32 a, u8 b, u8 c, u8 d) {
}
}
void func_800AA000(float a, u8 b, u8 c, u8 d) {
void func_800AA000(f32 a, u8 b, u8 c, u8 d) {
s32 temp1;
s32 temp2;
s32 i;

View file

@ -10,7 +10,7 @@ static u32 sRandFloat;
/**
* Gets the next integer in the sequence of pseudo-random numbers.
*/
u32 Math_Rand_Next() {
u32 Math_Rand_Next(void) {
return sRandInt = (sRandInt * 1664525) + 1013904223;
}
@ -26,7 +26,7 @@ void Math_Rand_Seed(u32 seed) {
* the next integer and masking it to an IEEE-754 compliant floating-point number
* between 1.0f and 2.0f, returning the result subtract 1.0f.
*/
f32 Math_Rand_ZeroOne() {
f32 Math_Rand_ZeroOne(void) {
sRandInt = (sRandInt * 1664525) + 1013904223;
sRandFloat = ((sRandInt >> 9) | 0x3F800000);
return *((f32*)&sRandFloat) - 1.0f;
@ -36,7 +36,7 @@ f32 Math_Rand_ZeroOne() {
* Returns a pseudo-random floating-point number between -0.5f and 0.5f by the same
* manner in which Math_Rand_ZeroOne generates its result.
*/
f32 Math_Rand_Centered() {
f32 Math_Rand_Centered(void) {
sRandInt = (sRandInt * 1664525) + 1013904223;
sRandFloat = ((sRandInt >> 9) | 0x3F800000);
return *((f32*)&sRandFloat) - 1.5f;

View file

@ -213,7 +213,7 @@ void ActorShadow_DrawFunc_Teardrop(Actor* actor, Lights* lights, GlobalContext*
#pragma GLOBAL_ASM("asm/non_matchings/code/z_actor/ActorShadow_DrawFunc_Teardrop.s")
#endif
void func_8002BDB0(Actor* actor, s32 arg1, s32 arg2, UNK_PTR arg3, s32 arg4, UNK_PTR arg5) {
void func_8002BDB0(Actor* actor, s32 arg1, s32 arg2, Vec3f* arg3, s32 arg4, Vec3f* arg5) {
if (arg1 == arg2) {
Matrix_MultVec3f(arg3, &actor->unk_CC[0]);
} else if (arg1 == arg4) {
@ -667,7 +667,7 @@ void func_8002CDE4(GlobalContext* globalCtx, TitleCardContext* titleCtx) {
titleCtx->delayA = titleCtx->delayB = titleCtx->unk_E = titleCtx->unk_C = 0;
}
void TitleCard_InitBossName(GlobalContext* globalCtx, TitleCardContext* titleCtx, u32 texture, s16 arg3, s16 arg4,
void TitleCard_InitBossName(GlobalContext* globalCtx, TitleCardContext* titleCtx, void* texture, s16 arg3, s16 arg4,
u8 arg5, u8 arg6) {
titleCtx->texture = texture;
titleCtx->unk_4 = arg3;
@ -678,7 +678,7 @@ void TitleCard_InitBossName(GlobalContext* globalCtx, TitleCardContext* titleCtx
titleCtx->delayB = 0;
}
void TitleCard_InitPlaceName(GlobalContext* globalCtx, TitleCardContext* titleCtx, u32 texture, s32 arg3, s32 arg4,
void TitleCard_InitPlaceName(GlobalContext* globalCtx, TitleCardContext* titleCtx, void* texture, s32 arg3, s32 arg4,
s32 arg5, s32 arg6, s32 arg7) {
Scene* loadedScene = globalCtx->loadedScene;
u32 size = loadedScene->titleFile.vromEnd - loadedScene->titleFile.vromStart;
@ -886,9 +886,9 @@ void func_8002D9A4(Actor* actor, f32 arg1) {
actor->velocity.y = -Math_Sins(actor->posRot.rot.x) * arg1;
}
void func_8002D9F8(Actor* actor, UNK_PTR arg1) {
void func_8002D9F8(Actor* actor, SkelAnime* skelAnime) {
Vec3f sp1C;
func_800A54FC(arg1, &sp1C, actor->shape.rot.y);
func_800A54FC(skelAnime, &sp1C, actor->shape.rot.y);
actor->posRot.pos.x += sp1C.x * actor->scale.x;
actor->posRot.pos.y += sp1C.y * actor->scale.y;
actor->posRot.pos.z += sp1C.z * actor->scale.z;
@ -984,16 +984,19 @@ s32 func_8002DD78(Player* player) {
s32 func_8002DDA8(GlobalContext* globalCtx) {
Player* player = PLAYER;
return (player->stateFlags1 & 0x800) || func_8002DD78(player);
}
s32 func_8002DDE4(GlobalContext* globalCtx) {
Player* player = PLAYER;
return player->stateFlags2 & 0x8;
}
s32 func_8002DDF4(GlobalContext* globalCtx) {
Player* player = PLAYER;
return player->stateFlags2 & 0x1000;
}
@ -1015,32 +1018,34 @@ void func_8002DE74(GlobalContext* globalCtx, Player* player) {
}
}
void func_8002DECC(GlobalContext* globalCtx, Player* player, Actor* actor) {
player->rideActor = actor;
void func_8002DECC(GlobalContext* globalCtx, Player* player, Actor* horse) {
player->rideActor = horse;
player->stateFlags1 |= 0x800000;
actor->child = &player->actor;
horse->child = &player->actor;
}
s32 func_8002DEEC(Player* player) {
return (player->stateFlags1 & 0x20000080) || player->action;
return (player->stateFlags1 & 0x20000080) || (player->csMode != 0);
}
void func_8002DF18(GlobalContext* globalCtx, Player* player) {
func_8006DC68(globalCtx, player);
}
u32 func_8002DF38(GlobalContext* globalCtx, Actor* actor, u8 newAction) {
s32 func_8002DF38(GlobalContext* globalCtx, Actor* actor, u8 csMode) {
Player* player = PLAYER;
player->action = newAction;
player->csMode = csMode;
player->unk_448 = actor;
player->unk_46A = 0;
return 1;
}
s32 func_8002DF54(GlobalContext* globalCtx, Actor* actor, u8 arg2) {
s32 func_8002DF54(GlobalContext* globalCtx, Actor* actor, u8 csMode) {
Player* player = PLAYER;
func_8002DF38(globalCtx, actor, arg2);
func_8002DF38(globalCtx, actor, csMode);
player->unk_46A = 1;
return 1;
@ -1475,30 +1480,30 @@ u32 func_8002F194(Actor* actor, GlobalContext* globalCtx) {
return 0;
}
s32 func_8002F1C4(Actor* actor, GlobalContext* globalCtx, f32 arg2, f32 arg3, u32 arg4) {
s32 func_8002F1C4(Actor* actor, GlobalContext* globalCtx, f32 arg2, f32 arg3, u32 exchangeItemId) {
Player* player = PLAYER;
// This is convoluted but it seems like it must be a single if statement to match
if ((player->actor.flags & 0x100) || ((arg4 != 0) && func_8008E988(globalCtx)) ||
if ((player->actor.flags & 0x100) || ((exchangeItemId != EXCH_ITEM_NONE) && Player_InCsMode(globalCtx)) ||
((actor->unk_10C == 0) &&
((arg3 < fabsf(actor->yDistFromLink)) || (player->targetActorDistance < actor->xzDistFromLink) ||
(arg2 < actor->xzDistFromLink)))) {
return 0;
}
player->naviTargetActor = actor;
player->targetActor = actor;
player->targetActorDistance = actor->xzDistFromLink;
player->exchangeItemId = arg4;
player->exchangeItemId = exchangeItemId;
return 1;
}
s32 func_8002F298(Actor* actor, GlobalContext* globalCtx, f32 arg2, u32 arg3) {
return func_8002F1C4(actor, globalCtx, arg2, arg2, arg3);
s32 func_8002F298(Actor* actor, GlobalContext* globalCtx, f32 arg2, u32 exchangeItemId) {
return func_8002F1C4(actor, globalCtx, arg2, arg2, exchangeItemId);
}
s32 func_8002F2CC(Actor* actor, GlobalContext* globalCtx, f32 arg2) {
return func_8002F298(actor, globalCtx, arg2, 0);
return func_8002F298(actor, globalCtx, arg2, EXCH_ITEM_NONE);
}
s32 func_8002F2F4(Actor* actor, GlobalContext* globalCtx) {
@ -1516,6 +1521,7 @@ u32 func_8002F334(Actor* actor, GlobalContext* globalCtx) {
s8 func_8002F368(GlobalContext* globalCtx) {
Player* player = PLAYER;
return player->exchangeItemId;
}
@ -1538,20 +1544,20 @@ u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx) {
s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange) {
Player* player = PLAYER;
s16 var;
s32 abs_var;
s16 yawDiff;
s32 absYawDiff;
if (!(player->stateFlags1 & 0x3C7080) && func_8008F29C(player) < 0) {
if ((((player->heldActor != NULL) || (actor == player->naviTargetActor)) && (getItemId > 0) &&
(getItemId < 0x7E)) ||
if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) {
if ((((player->heldActor != NULL) || (actor == player->targetActor)) && (getItemId > GI_NONE) &&
(getItemId < GI_MAX)) ||
(!(player->stateFlags1 & 0x20000800))) {
if ((actor->xzDistFromLink < xzRange) && (fabsf(actor->yDistFromLink) < yRange)) {
var = actor->yawTowardsLink - player->actor.shape.rot.y;
abs_var = ABS(var);
if ((getItemId != 0) || (player->getItemDirection < abs_var)) {
yawDiff = actor->yawTowardsLink - player->actor.shape.rot.y;
absYawDiff = ABS(yawDiff);
if ((getItemId != GI_NONE) || (player->getItemDirection < absYawDiff)) {
player->getItemId = getItemId;
player->interactRangeActor = actor;
player->getItemDirection = abs_var;
player->getItemDirection = absYawDiff;
return 1;
}
}
@ -1566,7 +1572,7 @@ void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId) {
}
void func_8002F580(Actor* actor, GlobalContext* globalCtx) {
func_8002F554(actor, globalCtx, 0);
func_8002F554(actor, globalCtx, GI_NONE);
}
u32 Actor_HasNoParent(Actor* actor, GlobalContext* globalCtx) {
@ -1607,11 +1613,11 @@ u32 Actor_HasChild(GlobalContext* globalCtx, Actor* actor) {
}
}
u32 func_8002F63C(GlobalContext* globalCtx, Actor* actor, s32 arg2) {
u32 func_8002F63C(GlobalContext* globalCtx, Actor* horse, s32 arg2) {
Player* player = PLAYER;
if (!(player->stateFlags1 & 0x003C7880)) {
player->rideActor = actor;
player->rideActor = horse;
player->unk_43C = arg2;
return 1;
}
@ -1629,6 +1635,7 @@ u32 Actor_HasNoChild(GlobalContext* globalCtx, Actor* actor) {
void func_8002F698(GlobalContext* globalCtx, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5, u32 arg6) {
Player* player = PLAYER;
player->unk_8A0 = arg6;
player->unk_8A1 = arg5;
player->unk_8A2 = arg3;
@ -1712,7 +1719,7 @@ void func_8002F994(Actor* actor, s32 arg1) {
}
}
s32 func_8002F9EC(GlobalContext* globalCtx, Actor* actor, UNK_TYPE arg2, UNK_TYPE arg3, UNK_TYPE arg4) {
s32 func_8002F9EC(GlobalContext* globalCtx, Actor* actor, CollisionPoly* arg2, u32 arg3, Vec3f* arg4) {
if (func_80041D4C(&globalCtx->colCtx, arg2, arg3) == 8) {
globalCtx->unk_11D30[0] = 1;
func_8005DFAC(globalCtx, 0, arg4);
@ -2028,7 +2035,7 @@ void Actor_UpdateAll(GlobalContext* globalCtx, ActorContext* actorCtx) {
}
if ((player->stateFlags1 & 0x40) && ((player->actor.textId & 0xFF00) != 0x600)) {
sp74 = player->naviTargetActor;
sp74 = player->targetActor;
}
for (i = 0; i < ARRAY_COUNT(actorCtx->actorList); i++, sp80++) {
@ -2053,7 +2060,7 @@ void Actor_UpdateAll(GlobalContext* globalCtx, ActorContext* actorCtx) {
Actor_Kill(actor);
actor = actor->next;
} else if ((unkFlag && !(actor->flags & unkFlag)) ||
(!unkFlag && unkCondition && (sp74 != actor) && (actor != player->navi) &&
(!unkFlag && unkCondition && (sp74 != actor) && (actor != player->naviActor) &&
(actor != player->heldActor) && (&player->actor != actor->parent))) {
func_80061E8C(&actor->colChkInfo);
actor = actor->next;
@ -2415,7 +2422,7 @@ void func_800315AC(GlobalContext* globalCtx, ActorContext* actorCtx) {
if ((HREG(64) != 1) || (HREG(72) != 0)) {
if (globalCtx->actorCtx.unk_03 != 0) {
func_8003115C(globalCtx, invisibleActorCounter, invisibleActors);
if ((globalCtx->csCtx.state != 0) || func_8008E988(globalCtx)) {
if ((globalCtx->csCtx.state != 0) || Player_InCsMode(globalCtx)) {
func_800304B0(globalCtx);
}
}
@ -2800,12 +2807,12 @@ void Actor_SpawnTransitionActors(GlobalContext* globalCtx, ActorContext* actorCt
for (i = 0; i < nbTransitionActors; i++) {
if (transitionActor->id >= 0) {
if (((transitionActor->frontRoom >= 0) &&
((transitionActor->frontRoom == globalCtx->roomCtx.curRoom.num) ||
(transitionActor->frontRoom == globalCtx->roomCtx.prevRoom.num))) ||
((transitionActor->backRoom >= 0) &&
((transitionActor->backRoom == globalCtx->roomCtx.curRoom.num) ||
(transitionActor->backRoom == globalCtx->roomCtx.prevRoom.num)))) {
if (((transitionActor->sides[0].room >= 0) &&
((transitionActor->sides[0].room == globalCtx->roomCtx.curRoom.num) ||
(transitionActor->sides[0].room == globalCtx->roomCtx.prevRoom.num))) ||
((transitionActor->sides[1].room >= 0) &&
((transitionActor->sides[1].room == globalCtx->roomCtx.curRoom.num) ||
(transitionActor->sides[1].room == globalCtx->roomCtx.prevRoom.num)))) {
Actor_Spawn(actorCtx, globalCtx, (s16)(transitionActor->id & 0x1FFF), transitionActor->pos.x,
transitionActor->pos.y, transitionActor->pos.z, 0, transitionActor->rotY, 0,
(i << 0xA) + transitionActor->params);
@ -2955,7 +2962,7 @@ Actor* func_80032AF0(GlobalContext* globalCtx, ActorContext* actorCtx, Actor** a
D_8015BBF0 = D_8015BBF4 = FLT_MAX;
D_8015BBF8 = 0x7FFFFFFF;
if (!func_8008E988(globalCtx)) {
if (!Player_InCsMode(globalCtx)) {
entry = &D_801160A0[0];
actorCtx->targetCtx.unk_90 = NULL;
@ -3376,6 +3383,7 @@ s16 func_800339B8(Actor* actor, GlobalContext* globalCtx, f32 arg2, s16 arg3) {
s32 func_80033A84(GlobalContext* globalCtx, Actor* actor) {
Player* player = PLAYER;
if ((player->stateFlags1 & 0x10) && (actor->unk_10C != 0)) {
return 1;
} else {
@ -3385,6 +3393,7 @@ s32 func_80033A84(GlobalContext* globalCtx, Actor* actor) {
s32 func_80033AB8(GlobalContext* globalCtx, Actor* actor) {
Player* player = PLAYER;
if ((player->stateFlags1 & 0x10) && (actor->unk_10C == 0)) {
return 1;
} else {
@ -3904,6 +3913,7 @@ s32 func_80035124(Actor* actor, GlobalContext* globalCtx) {
u8 func_800353E8(GlobalContext* globalCtx) {
Player* player = PLAYER;
return player->unk_845;
}
@ -4007,11 +4017,11 @@ void func_80035650(Actor* actor, ColliderBody* colBody, s32 freezeFlag) {
actor->unk_116 = 0x04;
} else if (colBody->acHitItem->toucher.flags & 0x8000) {
actor->unk_116 = 0x08;
} else if ((colBody->acHitItem->toucher.flags << 0xF) < 0) {
} else if (colBody->acHitItem->toucher.flags & 0x10000) {
actor->unk_116 = 0x10;
} else if (colBody->acHitItem->toucher.flags & 0x2000) {
actor->unk_116 = 0x20;
} else if ((colBody->acHitItem->toucher.flags << 0xC) < 0) {
} else if (colBody->acHitItem->toucher.flags & 0x80000) {
if (freezeFlag) {
actor->freezeTimer = colBody->acHitItem->toucher.damage;
}
@ -4107,9 +4117,9 @@ void func_800359B8(Actor* actor, s16 arg1, Vec3s* arg2) {
if (actor->floorPoly != NULL) {
floorPoly = actor->floorPoly;
sp44 = floorPoly->norm.x * (1.f / 32767);
sp40 = floorPoly->norm.y * (1.f / 32767);
sp3C = floorPoly->norm.z * (1.f / 32767);
sp44 = floorPoly->norm.x * (1.0f / 32767);
sp40 = floorPoly->norm.y * (1.0f / 32767);
sp3C = floorPoly->norm.z * (1.0f / 32767);
sp38 = Math_Sins(arg1);
sp34 = Math_Coss(arg1);

View file

@ -1907,9 +1907,9 @@ s32 func_80043D18(Camera* camera, Vec3f* arg1, struct_80043D18* arg2) {
arg2->unk_24 = sp44;
}
arg2->unk_0C.x = arg2->unk_18->norm.x * (1.f / 32767);
arg2->unk_0C.y = arg2->unk_18->norm.y * (1.f / 32767);
arg2->unk_0C.z = arg2->unk_18->norm.z * (1.f / 32767);
arg2->unk_0C.x = arg2->unk_18->norm.x * (1.0f / 32767.0f);
arg2->unk_0C.y = arg2->unk_18->norm.y * (1.0f / 32767.0f);
arg2->unk_0C.z = arg2->unk_18->norm.z * (1.0f / 32767.0f);
arg2->unk_00.x = arg2->unk_0C.x + sp68.x;
arg2->unk_00.y = arg2->unk_0C.y + sp68.y;
arg2->unk_00.z = arg2->unk_0C.z + sp68.z;
@ -1965,9 +1965,9 @@ f32 func_80044434(Camera* camera, Vec3f* arg1, Vec3f* arg2, s32* arg3) {
arg1->z = 0.0f;
arg1->y = 1.0f;
} else {
arg1->x = sp28->norm.x * (1.f / 32767);
arg1->y = sp28->norm.y * (1.f / 32767);
arg1->z = sp28->norm.z * (1.f / 32767);
arg1->x = sp28->norm.x * (1.f / 32767.0f);
arg1->y = sp28->norm.y * (1.f / 32767.0f);
arg1->z = sp28->norm.z * (1.f / 32767.0f);
}
return temp_ret;
@ -3369,7 +3369,7 @@ void func_80059EC8(Camera* camera) {
player->actor.freezeTimer = 0;
player->stateFlags1 &= ~0x20000000;
if (player->action != 0) {
if (player->csMode != 0) {
func_8002DF54(camera->globalCtx, &player->actor, 7);
osSyncPrintf("camera: player demo end!!\n");
}
@ -3545,8 +3545,8 @@ s32 Camera_ChangeMode(Camera* camera, s16 mode, u8 arg2) {
#pragma GLOBAL_ASM("asm/non_matchings/code/z_camera/Camera_ChangeMode.s")
#endif
void func_8005A444(Camera* camera, s16 arg1) {
Camera_ChangeMode(camera, arg1, 0);
s32 func_8005A444(Camera* camera, s16 arg1) {
return Camera_ChangeMode(camera, arg1, 0);
}
s32 func_8005A470(Camera* camera, s16 arg1) {
@ -3927,7 +3927,7 @@ Vec3f* func_8005AFB4(Vec3f* dst, Camera* camera) {
}
void Camera_SetCameraData(Camera* camera, s16 arg1, CutsceneCameraPoint* atPoints, CutsceneCameraPoint* eyePoints,
s16 relativeToPlayer, s16 arg5) {
s16 relativeToPlayer, s16 arg5, s32 arg6) {
if (arg1 & 0x1) {
camera->atPoints = atPoints;
}

View file

@ -54,7 +54,7 @@ void func_800636C0() {
// Called when free movement is active.
// 8011D394 to enable camera debugger
void func_8006375C(s32 arg0, s32 arg1, float* d_80855320) {
void func_8006375C(s32 arg0, s32 arg1, const char* text) {
}
// Copy Camera Debugger Text

View file

@ -258,7 +258,7 @@ void func_80064824(GlobalContext* globalCtx, CutsceneContext* csCtx, CsCmdBase*
break;
case 15:
if (sp3F != 0) {
TitleCard_InitPlaceName(globalCtx, &globalCtx->actorCtx.titleCtx, player->getItemModel, 0xA0, 0x78,
TitleCard_InitPlaceName(globalCtx, &globalCtx->actorCtx.titleCtx, player->giObjectSegment, 0xA0, 0x78,
0x90, 0x18, 0x14);
}
break;
@ -882,9 +882,9 @@ void Cutscene_Command_Terminator(GlobalContext* globalCtx, CutsceneContext* csCt
break;
case 71:
gSaveContext.equips.equipment |= 0x0100;
func_8008ECAC(globalCtx, player);
Player_SetEquipmentData(globalCtx, player);
gSaveContext.equips.equipment |= 0x1000;
func_8008ECAC(globalCtx, player);
Player_SetEquipmentData(globalCtx, player);
globalCtx->linkAgeOnLoad = 1;
globalCtx->nextEntranceIndex = 0x0053;
globalCtx->sceneLoadFlag = 0x14;
@ -1925,7 +1925,7 @@ void func_80068DC0(GlobalContext* globalCtx, CutsceneContext* csCtx) {
void func_80068ECC(GlobalContext* globalCtx, CutsceneContext* csCtx) {
u8 i;
if ((gSaveContext.cutsceneTrigger != 0) && (csCtx->state == CS_STATE_IDLE) && !func_8008E988(globalCtx)) {
if ((gSaveContext.cutsceneTrigger != 0) && (csCtx->state == CS_STATE_IDLE) && !Player_InCsMode(globalCtx)) {
gSaveContext.cutsceneIndex = 0xFFFD;
}

View file

@ -1,7 +1,7 @@
#include <ultra64.h>
#include <global.h>
u16 sReactionTextIds[][9] = {
u16 sReactionTextIds[][PLAYER_MASK_MAX] = {
{ 0x0000, 0x7124, 0x7127, 0x7126, 0x7125, 0x7127, 0x7124, 0x7125, 0x7127 },
{ 0x0000, 0x7128, 0x7129, 0x7128, 0x7128, 0x7128, 0x7128, 0x712A, 0x712B },
{ 0x0000, 0x7128, 0x712B, 0x7128, 0x7128, 0x7129, 0x7128, 0x712B, 0x7128 },
@ -65,6 +65,6 @@ u16 sReactionTextIds[][9] = {
};
u16 Text_GetFaceReaction(GlobalContext* globalCtx, u32 reactionSet) {
u8 currentMask = func_8008F080(globalCtx);
u8 currentMask = Player_GetMask(globalCtx);
return sReactionTextIds[reactionSet][currentMask];
}

View file

@ -167,20 +167,14 @@ s32 func_80077C6C(f32* pValue, f32 target, f32 incrStep, f32 decrStep) {
return 0;
}
typedef struct {
/* 0x00 */ char unk_00[0x14];
/* 0x14 */ s8 unk_14;
/* 0x14 */ s8 unk_15;
} struct_80077D10;
void func_80077D10(f32* arg0, s16* arg1, Input* input) {
f32 relX = input->rel.in.x;
f32 relY = input->rel.in.y;
void func_80077D10(f32* arg0, s16* arg1, struct_80077D10* arg2) {
f32 var1 = arg2->unk_14;
f32 var2 = arg2->unk_15;
*arg0 = sqrtf(SQ(var1) + SQ(var2));
*arg0 = sqrtf(SQ(relX) + SQ(relY));
*arg0 = (60.0f < *arg0) ? 60.0f : *arg0;
*arg1 = atan2s(var2, -var1);
*arg1 = atan2s(relY, -relX);
}
s16 Math_Rand_S16Offset(s16 base, s16 range) {

View file

@ -176,7 +176,7 @@ s32 func_80078E84(GlobalContext* globalCtx) {
if (interfaceCtx->unk_226 <= 0) {
interfaceCtx->unk_226 = 0;
globalCtx->unk_11D58(globalCtx, -(gSaveContext.health + 1));
globalCtx->damagePlayer(globalCtx, -(gSaveContext.health + 1));
return 1;
}
}
@ -381,8 +381,6 @@ void Health_Draw(GlobalContext* globalCtx) {
CLOSE_DISPS(gfxCtx, "../z_lifemeter.c", 606);
}
u32 Health_IsCritical(void);
void Health_HandleCriticalAlarm(GlobalContext* globalCtx) {
InterfaceContext* interfaceCtx = &globalCtx->interfaceCtx;
@ -391,7 +389,7 @@ void Health_HandleCriticalAlarm(GlobalContext* globalCtx) {
if (interfaceCtx->unk_22A <= 0) {
interfaceCtx->unk_22A = 0;
interfaceCtx->unk_22C = 0;
if (!func_8008E988(globalCtx) && (globalCtx->pauseCtx.state == 0) && (globalCtx->pauseCtx.flag == 0) &&
if (!Player_InCsMode(globalCtx) && (globalCtx->pauseCtx.state == 0) && (globalCtx->pauseCtx.flag == 0) &&
Health_IsCritical() && !Gameplay_InCsMode(globalCtx)) {
func_80078884(NA_SE_SY_HITPOINT_ALARM);
}

View file

@ -1240,8 +1240,8 @@ void Interface_InitHorsebackArchery(GlobalContext* globalCtx) {
}
void func_800849EC(GlobalContext* globalCtx) {
gSaveContext.equipment |= gBitFlags[2] << gEquipShifts[0];
gSaveContext.equipment ^= 8 << gEquipShifts[0];
gSaveContext.equipment |= gBitFlags[2] << gEquipShifts[EQUIP_SWORD];
gSaveContext.equipment ^= 8 << gEquipShifts[EQUIP_SWORD];
if (gBitFlags[3] & gSaveContext.equipment) {
gSaveContext.equips.buttonItems[0] = ITEM_SWORD_KNIFE;
@ -1380,7 +1380,7 @@ u8 Item_Give(GlobalContext* globalCtx, u8 item) {
gSaveContext.equipment |= gBitFlags[item - ITEM_SWORD_KOKIRI] << gEquipShifts[EQUIP_SWORD];
if (item == ITEM_SWORD_BGS) {
gSaveContext.bgsHitsLeft = 8;
gSaveContext.swordHealth = 8;
if (ALL_EQUIP_VALUE(EQUIP_SWORD) == 0xF) {
gSaveContext.equipment ^= 8 << gEquipShifts[EQUIP_SWORD];
@ -1997,24 +1997,24 @@ s32 Inventory_HasSpecificBottle(u8 bottleItem) {
}
}
void Inventory_UpdateBottleItem(GlobalContext* globalCtx, u8 item, u8 cButton) {
osSyncPrintf("item_no=%x, c_no=%x, Pt=%x Item_Register=%x\n", item, cButton,
gSaveContext.equips.cButtonSlots[cButton - 1],
gSaveContext.items[gSaveContext.equips.cButtonSlots[cButton - 1]]);
void Inventory_UpdateBottleItem(GlobalContext* globalCtx, u8 item, u8 button) {
osSyncPrintf("item_no=%x, c_no=%x, Pt=%x Item_Register=%x\n", item, button,
gSaveContext.equips.cButtonSlots[button - 1],
gSaveContext.items[gSaveContext.equips.cButtonSlots[button - 1]]);
// Special case to only empty half of a Lon Lon Milk Bottle
if ((gSaveContext.items[gSaveContext.equips.cButtonSlots[cButton - 1]] == ITEM_MILK_BOTTLE) &&
if ((gSaveContext.items[gSaveContext.equips.cButtonSlots[button - 1]] == ITEM_MILK_BOTTLE) &&
(item == ITEM_BOTTLE)) {
item = ITEM_MILK_HALF;
}
gSaveContext.items[gSaveContext.equips.cButtonSlots[cButton - 1]] = item;
gSaveContext.equips.buttonItems[cButton] = item;
gSaveContext.items[gSaveContext.equips.cButtonSlots[button - 1]] = item;
gSaveContext.equips.buttonItems[button] = item;
Interface_LoadItemIcon1(globalCtx, cButton);
Interface_LoadItemIcon1(globalCtx, button);
globalCtx->pauseCtx.unk_23E = item;
gSaveContext.buttonStatus[cButton] = BTN_ENABLED;
gSaveContext.buttonStatus[button] = BTN_ENABLED;
}
s32 Inventory_ConsumeFairy(GlobalContext* globalCtx) {
@ -3605,7 +3605,7 @@ void Interface_Draw(GlobalContext* globalCtx) {
gSaveContext.timer1State = 10;
if (D_80125A5C != 0) {
gSaveContext.health = 0;
globalCtx->unk_11D58(globalCtx, -(gSaveContext.health + 2));
globalCtx->damagePlayer(globalCtx, -(gSaveContext.health + 2));
}
D_80125A5C = 0;
} else if (gSaveContext.timer1Value > 60) {
@ -4156,7 +4156,7 @@ void Interface_Update(GlobalContext* globalCtx) {
if ((globalCtx->pauseCtx.state == 0) && (globalCtx->pauseCtx.flag == 0) && (msgCtx->msgMode == 0) &&
(globalCtx->sceneLoadFlag == 0) && (globalCtx->unk_10A20 == 0) && (globalCtx->transitionMode == 0) &&
((globalCtx->csCtx.state == 0) || !func_8008E988(globalCtx))) {
((globalCtx->csCtx.state == 0) || !Player_InCsMode(globalCtx))) {
if ((gSaveContext.magicAcquired != 0) && (gSaveContext.magicLevel == 0)) {
gSaveContext.magicLevel = gSaveContext.doubleMagic + 1;
gSaveContext.unk_13F0 = 8;

View file

@ -178,7 +178,7 @@ void Gameplay_Destroy(GlobalContext* globalCtx) {
if (gSaveContext.linkAge != globalCtx->linkAgeOnLoad) {
Inventory_SwapAgeEquipment();
func_8008ECAC(globalCtx, player);
Player_SetEquipmentData(globalCtx, player);
}
func_80031C3C(&globalCtx->actorCtx, globalCtx);
@ -925,7 +925,7 @@ void Gameplay_Update(GlobalContext* globalCtx) {
if ((globalCtx->pauseCtx.state != 0) || (globalCtx->pauseCtx.flag != 0)) {
// Translates to: "Changing viewpoint is prohibited due to the kaleidoscope"
osSyncPrintf(VT_FGCOL(CYAN) "カレイドスコープ中につき視点変更を禁止しております\n" VT_RST);
} else if (func_8008E988(globalCtx)) {
} else if (Player_InCsMode(globalCtx)) {
// Translates to: "Changing viewpoint is prohibited during the cutscene"
osSyncPrintf(VT_FGCOL(CYAN) "デモ中につき視点変更を禁止しております\n" VT_RST);
} else if (YREG(15) == 0x10) {
@ -1372,7 +1372,7 @@ void Gameplay_Main(GlobalContext* globalCtx) {
// original name: "Game_play_demo_mode_check"
s32 Gameplay_InCsMode(GlobalContext* globalCtx) {
return (globalCtx->csCtx.state != 0) || func_8008E988(globalCtx);
return (globalCtx->csCtx.state != 0) || Player_InCsMode(globalCtx);
}
f32 func_800BFCB8(GlobalContext* globalCtx, MtxF* mf, Vec3f* vec) {
@ -1801,18 +1801,20 @@ s32 func_800C0D28(GlobalContext* globalCtx) {
s32 func_800C0D34(GlobalContext* globalCtx, Actor* actor, s16* yaw) {
TransitionActorEntry* transitionActor;
s32 frontRoom;
if (actor->type != ACTORTYPE_DOOR) {
return 0;
}
transitionActor = &globalCtx->transitionActorList[(u16)actor->params >> 10];
frontRoom = transitionActor->sides[0].room;
if (transitionActor->backRoom == transitionActor->frontRoom) {
if (frontRoom == transitionActor->sides[1].room) {
return 0;
}
if (actor->room == transitionActor->frontRoom) {
if (frontRoom == actor->room) {
*yaw = actor->shape.rot.y;
} else {
*yaw = actor->shape.rot.y + 0x8000;

View file

@ -1,24 +1,26 @@
#include <global.h>
#define FLAGS 0x06000035
void (*sPlayerCallInitFunc)(Actor* thisx, GlobalContext* globalCtx);
void (*sPlayerCallDestroyFunc)(Actor* thisx, GlobalContext* globalCtx);
void (*sPlayerCallUpdateFunc)(Actor* thisx, GlobalContext* globalCtx);
void (*sPlayerCallDrawFunc)(Actor* thisx, GlobalContext* globalCtx);
void func_80846CD8(Actor* thisx, GlobalContext* globalCtx);
void func_8084AB54(Actor* thisx, GlobalContext* globalCtx);
void func_80849EA8(Actor* thisx, GlobalContext* globalCtx);
void func_8084A5C4(Actor* thisx, GlobalContext* globalCtx);
void PlayerCall_Init(Actor* thisx, GlobalContext* globalCtx);
void PlayerCall_Destroy(Actor* thisx, GlobalContext* globalCtx);
void PlayerCall_Update(Actor* thisx, GlobalContext* globalCtx);
void PlayerCall_Draw(Actor* thisx, GlobalContext* globalCtx);
void Player_Init(Actor* thisx, GlobalContext* globalCtx);
void Player_Destroy(Actor* thisx, GlobalContext* globalCtx);
void Player_Update(Actor* thisx, GlobalContext* globalCtx);
void Player_Draw(Actor* thisx, GlobalContext* globalCtx);
const ActorInit Player_InitVars = {
ACTOR_PLAYER,
ACTORTYPE_PLAYER,
0x6000035,
FLAGS,
OBJECT_GAMEPLAY_KEEP,
sizeof(Player),
(ActorFunc)PlayerCall_Init,
@ -28,10 +30,10 @@ const ActorInit Player_InitVars = {
};
void PlayerCall_InitFuncPtrs() {
sPlayerCallInitFunc = KaleidoManager_GetRamAddr(func_80846CD8);
sPlayerCallDestroyFunc = KaleidoManager_GetRamAddr(func_8084AB54);
sPlayerCallUpdateFunc = KaleidoManager_GetRamAddr(func_80849EA8);
sPlayerCallDrawFunc = KaleidoManager_GetRamAddr(func_8084A5C4);
sPlayerCallInitFunc = KaleidoManager_GetRamAddr(Player_Init);
sPlayerCallDestroyFunc = KaleidoManager_GetRamAddr(Player_Destroy);
sPlayerCallUpdateFunc = KaleidoManager_GetRamAddr(Player_Update);
sPlayerCallDrawFunc = KaleidoManager_GetRamAddr(Player_Draw);
}
void PlayerCall_Init(Actor* thisx, GlobalContext* globalCtx) {

File diff suppressed because it is too large Load diff

View file

@ -519,8 +519,8 @@ u32 func_80096FE8(GlobalContext* globalCtx, RoomContext* roomCtx) {
LOG_NUM("game_play->room_rom_address.num", globalCtx->nbRooms, "../z_room.c", 912);
for (j = 0; j < globalCtx->nbTransitionActors; j++) {
s8 frontRoom = transitionActor->frontRoom;
s8 backRoom = transitionActor->backRoom;
s8 frontRoom = transitionActor->sides[0].room;
s8 backRoom = transitionActor->sides[1].room;
u32 frontRoomSize = (frontRoom < 0) ? 0 : roomList[frontRoom].vromEnd - roomList[frontRoom].vromStart;
u32 backRoomSize = (backRoom < 0) ? 0 : roomList[backRoom].vromEnd - roomList[backRoom].vromStart;
u32 cumulRoomSize = (frontRoom != backRoom) ? frontRoomSize + backRoomSize : frontRoomSize;
@ -599,7 +599,7 @@ s32 func_800973FC(GlobalContext* globalCtx, RoomContext* roomCtx) {
gSegments[3] = VIRTUAL_TO_PHYSICAL(roomCtx->unk_34);
Scene_ExecuteCommands(globalCtx, roomCtx->curRoom.segment);
func_8008E750(globalCtx, PLAYER);
Player_SetBootData(globalCtx, PLAYER);
Actor_SpawnTransitionActors(globalCtx, &globalCtx->actorCtx);
return 1;