1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2024-12-02 15:55:59 +00:00
oot/src/code/z_actor.c

5570 lines
178 KiB
C
Raw Normal View History

#include "global.h"
#include "vt.h"
2020-03-17 04:31:30 +00:00
#include "overlays/actors/ovl_Arms_Hook/z_arms_hook.h"
#include "overlays/actors/ovl_En_Part/z_en_part.h"
Updated Texture Asset Handling (#478) * Auto stash before rebase of "upstream/master" * A large number of scenes have been decompiled. * Fixed makefile * Decompiled around 40 scenes. * Removed old file * Finished matching remaining scenes. * Removed old commented out spec lines * Decompiled a few object files. * Reorganized xmls a bit. Updated pu_box overlay to use proper symbol. * Updated texture and object file decomp * Fixed newline issue with ZAPD * Moved scenes/ into the assets/ folder * Fixed a few compile errors * Auto stash before rebase of "upstream/master" * A large number of scenes have been decompiled. * Fixed makefile * Decompiled around 40 scenes. * Removed old file * Finished matching remaining scenes. * Removed old commented out spec lines * Decompiled a few object files. * Reorganized xmls a bit. Updated pu_box overlay to use proper symbol. * Updated texture and object file decomp * Moved scenes/ into the assets/ folder * Fixed a few compile errors * Fixed merge issues. * Fixed makefile merge error * Fixed additional merge error * Fixed several more merge issues * Commented out gameplay_keep and sk2 extraction, since currently unused. * Reenabled gameplay_keep extraction since it's used in the spec * Fixed build error * Removed test struct * Fixed makefile error that would happen on fresh builds * Fixed merge issue * Removed relative paths * Multithreading on extraction, spec uses numbers, few changes to XMLs * Removed redundant code from the extract_assets script * object_sk2 and object_spot09_obj OK * object_spot11_obj OK * object_spot17_obj OK * Test: One of the gameplay_keep dlists given a proper symbol * Updated asset symbol names based on new naming scheme * XMLs use "Offset" instead of "Address" now * Fixed merge issues, updated ovl_Magic_Dark xml and gfx file * Updated to use latest build of ZAPD * Updated ZAPD again * Updated ZAP to remove assimp dependency * Jenkins Test: Added .gitkeep file * Updated ZAP once more * Updated png file name to comply with new naming scheme. * Fixed bad include Co-authored-by: Jack Walker <7463599+Jack-Walker@users.noreply.github.com>
2020-12-26 11:39:52 +00:00
#include "objects/gameplay_keep/gameplay_keep.h"
void ActorShape_Init(ActorShape* shape, f32 yOffset, ActorShadowFunc shadowDraw, f32 shadowScale) {
shape->yOffset = yOffset;
shape->shadowDraw = shadowDraw;
shape->shadowScale = shadowScale;
shape->shadowAlpha = 255;
2020-03-17 04:31:30 +00:00
}
void ActorShadow_Draw(Actor* actor, Lights* lights, GlobalContext* globalCtx, Gfx* dlist, Color_RGBA8* color) {
2020-03-17 04:31:30 +00:00
f32 temp1;
f32 temp2;
MtxF sp60;
2020-03-22 21:19:43 +00:00
if (actor->floorPoly != NULL) {
temp1 = actor->world.pos.y - actor->floorHeight;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (temp1 >= -50.0f && temp1 < 500.0f) {
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 1553);
2020-03-17 04:31:30 +00:00
POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
2020-03-17 04:31:30 +00:00
gDPSetCombineLERP(POLY_OPA_DISP++, 0, 0, 0, PRIMITIVE, TEXEL0, 0, PRIMITIVE, 0, 0, 0, 0, COMBINED, 0, 0, 0,
COMBINED);
2020-03-17 04:31:30 +00:00
temp1 = (temp1 < 0.0f) ? 0.0f : ((temp1 > 150.0f) ? 150.0f : temp1);
temp2 = 1.0f - (temp1 * (1.0f / 350));
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (color != NULL) {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, color->r, color->g, color->b,
(u32)(actor->shape.shadowAlpha * temp2) & 0xFF);
2020-03-22 21:19:43 +00:00
} else {
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, (u32)(actor->shape.shadowAlpha * temp2) & 0xFF);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
func_80038A28(actor->floorPoly, actor->world.pos.x, actor->floorHeight, actor->world.pos.z, &sp60);
2020-03-17 04:31:30 +00:00
Matrix_Put(&sp60);
Decompile Gameplay_Keep and fix all existing decompiled objects (#595) * First batch of files * Add missing folders back * Fix missing folders again * Finish fixing existing texture files * Gameplay_Keep XML finished * Most actor gameplay_keep undefined syms removed * Only ~200 gkeep symbols remain * All gkeep symbols that ZAP supports are fixed * Cleanup, and make gkeep names more accurate * Starting to figure out what some unknown blobs are, merge zeldaret in * fix a few more things * refactor gkeep * Change how gitkeep is handled * gkeep xml cleanup * Gkeep finished, now just waiting up ZAP updates * 100 link animations finished * 150 link animations finished * 200 link animations finished * 250 link animations finished * 350 link animations finished * 400 link animations finished * 450 link animations finished * 500 link animations finished * 550 link animations finished * All Link animations finished cannot build yet because ZAP doesn't have LinkAnimationHeader yet * xml changes for new zap stuff * finish gameplay_keep * fixing existing objects * ready for pr besides zap padding issue * mostly ready for pr * format all c files * all conflicts fixed * make changes that roman requested * fix thing i didn't mean to change * some animation symbols renamed * fixed roman's stuff * lifemeter hardcoded pointers removed * fix issue with incorrect data in gameplay_keep * removed unused asm * fixed most of fig's comments * fix all of fig's comments * reformat files * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * fixed stuff * fixed most of roman's comments * remove leading zeroes * should build now * git subrepo pull --force tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "f84d8337b" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "f84d8337b" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * all of gkeep symbols fixed * compiler error fixed * format files * final changes Co-authored-by: Zelllll <elijah@DESKTOP-NMP1I89.localdomain> Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
2021-01-25 00:36:40 +00:00
if (dlist != gCircleShadowDL) {
Matrix_RotateY(actor->shape.rot.y * (M_PI / 0x8000), MTXMODE_APPLY);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
temp2 = (1.0f - (temp1 * (1.0f / 350))) * actor->shape.shadowScale;
2020-03-17 04:31:30 +00:00
Matrix_Scale(actor->scale.x * temp2, 1.0f, actor->scale.z * temp2, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_actor.c", 1588),
2020-03-22 21:19:43 +00:00
G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, dlist);
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 1594);
2020-03-17 04:31:30 +00:00
}
}
}
void ActorShadow_DrawCircle(Actor* actor, Lights* lights, GlobalContext* globalCtx) {
Decompile Gameplay_Keep and fix all existing decompiled objects (#595) * First batch of files * Add missing folders back * Fix missing folders again * Finish fixing existing texture files * Gameplay_Keep XML finished * Most actor gameplay_keep undefined syms removed * Only ~200 gkeep symbols remain * All gkeep symbols that ZAP supports are fixed * Cleanup, and make gkeep names more accurate * Starting to figure out what some unknown blobs are, merge zeldaret in * fix a few more things * refactor gkeep * Change how gitkeep is handled * gkeep xml cleanup * Gkeep finished, now just waiting up ZAP updates * 100 link animations finished * 150 link animations finished * 200 link animations finished * 250 link animations finished * 350 link animations finished * 400 link animations finished * 450 link animations finished * 500 link animations finished * 550 link animations finished * All Link animations finished cannot build yet because ZAP doesn't have LinkAnimationHeader yet * xml changes for new zap stuff * finish gameplay_keep * fixing existing objects * ready for pr besides zap padding issue * mostly ready for pr * format all c files * all conflicts fixed * make changes that roman requested * fix thing i didn't mean to change * some animation symbols renamed * fixed roman's stuff * lifemeter hardcoded pointers removed * fix issue with incorrect data in gameplay_keep * removed unused asm * fixed most of fig's comments * fix all of fig's comments * reformat files * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * fixed stuff * fixed most of roman's comments * remove leading zeroes * should build now * git subrepo pull --force tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "f84d8337b" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "f84d8337b" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * all of gkeep symbols fixed * compiler error fixed * format files * final changes Co-authored-by: Zelllll <elijah@DESKTOP-NMP1I89.localdomain> Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
2021-01-25 00:36:40 +00:00
ActorShadow_Draw(actor, lights, globalCtx, gCircleShadowDL, NULL);
2020-03-17 04:31:30 +00:00
}
void ActorShadow_DrawWhiteCircle(Actor* actor, Lights* lights, GlobalContext* globalCtx) {
static Color_RGBA8 white = { 255, 255, 255, 255 };
2020-03-17 04:31:30 +00:00
Decompile Gameplay_Keep and fix all existing decompiled objects (#595) * First batch of files * Add missing folders back * Fix missing folders again * Finish fixing existing texture files * Gameplay_Keep XML finished * Most actor gameplay_keep undefined syms removed * Only ~200 gkeep symbols remain * All gkeep symbols that ZAP supports are fixed * Cleanup, and make gkeep names more accurate * Starting to figure out what some unknown blobs are, merge zeldaret in * fix a few more things * refactor gkeep * Change how gitkeep is handled * gkeep xml cleanup * Gkeep finished, now just waiting up ZAP updates * 100 link animations finished * 150 link animations finished * 200 link animations finished * 250 link animations finished * 350 link animations finished * 400 link animations finished * 450 link animations finished * 500 link animations finished * 550 link animations finished * All Link animations finished cannot build yet because ZAP doesn't have LinkAnimationHeader yet * xml changes for new zap stuff * finish gameplay_keep * fixing existing objects * ready for pr besides zap padding issue * mostly ready for pr * format all c files * all conflicts fixed * make changes that roman requested * fix thing i didn't mean to change * some animation symbols renamed * fixed roman's stuff * lifemeter hardcoded pointers removed * fix issue with incorrect data in gameplay_keep * removed unused asm * fixed most of fig's comments * fix all of fig's comments * reformat files * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * fixed stuff * fixed most of roman's comments * remove leading zeroes * should build now * git subrepo pull --force tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "f84d8337b" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "f84d8337b" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * all of gkeep symbols fixed * compiler error fixed * format files * final changes Co-authored-by: Zelllll <elijah@DESKTOP-NMP1I89.localdomain> Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
2021-01-25 00:36:40 +00:00
ActorShadow_Draw(actor, lights, globalCtx, gCircleShadowDL, &white);
2020-03-17 04:31:30 +00:00
}
void ActorShadow_DrawHorse(Actor* actor, Lights* lights, GlobalContext* globalCtx) {
Decompile Gameplay_Keep and fix all existing decompiled objects (#595) * First batch of files * Add missing folders back * Fix missing folders again * Finish fixing existing texture files * Gameplay_Keep XML finished * Most actor gameplay_keep undefined syms removed * Only ~200 gkeep symbols remain * All gkeep symbols that ZAP supports are fixed * Cleanup, and make gkeep names more accurate * Starting to figure out what some unknown blobs are, merge zeldaret in * fix a few more things * refactor gkeep * Change how gitkeep is handled * gkeep xml cleanup * Gkeep finished, now just waiting up ZAP updates * 100 link animations finished * 150 link animations finished * 200 link animations finished * 250 link animations finished * 350 link animations finished * 400 link animations finished * 450 link animations finished * 500 link animations finished * 550 link animations finished * All Link animations finished cannot build yet because ZAP doesn't have LinkAnimationHeader yet * xml changes for new zap stuff * finish gameplay_keep * fixing existing objects * ready for pr besides zap padding issue * mostly ready for pr * format all c files * all conflicts fixed * make changes that roman requested * fix thing i didn't mean to change * some animation symbols renamed * fixed roman's stuff * lifemeter hardcoded pointers removed * fix issue with incorrect data in gameplay_keep * removed unused asm * fixed most of fig's comments * fix all of fig's comments * reformat files * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * fixed stuff * fixed most of roman's comments * remove leading zeroes * should build now * git subrepo pull --force tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "f84d8337b" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "f84d8337b" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * all of gkeep symbols fixed * compiler error fixed * format files * final changes Co-authored-by: Zelllll <elijah@DESKTOP-NMP1I89.localdomain> Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
2021-01-25 00:36:40 +00:00
ActorShadow_Draw(actor, lights, globalCtx, gHorseShadowDL, NULL);
2020-03-17 04:31:30 +00:00
}
void ActorShadow_DrawFoot(GlobalContext* globalCtx, Light* light, MtxF* arg2, s32 arg3, f32 arg4, f32 arg5, f32 arg6) {
s32 pad1;
2020-03-17 04:31:30 +00:00
f32 sp58;
s32 pad2[2];
2020-03-17 04:31:30 +00:00
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 1661);
2020-03-17 04:31:30 +00:00
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0,
2020-03-17 04:31:30 +00:00
(u32)(((arg3 * 0.00005f) > 1.0f ? 1.0f : (arg3 * 0.00005f)) * arg4) & 0xFF);
sp58 = Math_FAtan2F(light->l.dir[0], light->l.dir[2]);
2020-03-17 04:31:30 +00:00
arg6 *= (4.5f - (light->l.dir[1] * 0.035f));
arg6 = (arg6 < 1.0f) ? 1.0f : arg6;
Matrix_Put(arg2);
Matrix_RotateY(sp58, MTXMODE_APPLY);
Matrix_Scale(arg5, 1.0f, arg5 * arg6, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_actor.c", 1687),
2020-03-22 21:19:43 +00:00
G_MTX_MODELVIEW | G_MTX_LOAD);
Decompile Gameplay_Keep and fix all existing decompiled objects (#595) * First batch of files * Add missing folders back * Fix missing folders again * Finish fixing existing texture files * Gameplay_Keep XML finished * Most actor gameplay_keep undefined syms removed * Only ~200 gkeep symbols remain * All gkeep symbols that ZAP supports are fixed * Cleanup, and make gkeep names more accurate * Starting to figure out what some unknown blobs are, merge zeldaret in * fix a few more things * refactor gkeep * Change how gitkeep is handled * gkeep xml cleanup * Gkeep finished, now just waiting up ZAP updates * 100 link animations finished * 150 link animations finished * 200 link animations finished * 250 link animations finished * 350 link animations finished * 400 link animations finished * 450 link animations finished * 500 link animations finished * 550 link animations finished * All Link animations finished cannot build yet because ZAP doesn't have LinkAnimationHeader yet * xml changes for new zap stuff * finish gameplay_keep * fixing existing objects * ready for pr besides zap padding issue * mostly ready for pr * format all c files * all conflicts fixed * make changes that roman requested * fix thing i didn't mean to change * some animation symbols renamed * fixed roman's stuff * lifemeter hardcoded pointers removed * fix issue with incorrect data in gameplay_keep * removed unused asm * fixed most of fig's comments * fix all of fig's comments * reformat files * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * fixed stuff * fixed most of roman's comments * remove leading zeroes * should build now * git subrepo pull --force tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "f84d8337b" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "f84d8337b" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * all of gkeep symbols fixed * compiler error fixed * format files * final changes Co-authored-by: Zelllll <elijah@DESKTOP-NMP1I89.localdomain> Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
2021-01-25 00:36:40 +00:00
gSPDisplayList(POLY_OPA_DISP++, gFootShadowDL);
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 1693);
2020-03-17 04:31:30 +00:00
}
#ifdef NON_MATCHING
2020-03-23 00:38:25 +00:00
// saved register, stack usage and minor ordering differences
void ActorShadow_DrawFeet(Actor* actor, Lights* lights, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
MtxF spE8;
2020-03-23 00:38:25 +00:00
f32 spE0[2];
s32 i;
2020-03-17 04:31:30 +00:00
f32* spAC;
f32 temp_10;
u8 temp_14;
f32 temp_f0;
f32 temp_f20;
f32 temp_f20_2;
f32 temp_f22_2;
f32 temp_f24;
s32 temp_a3;
s32 temp_lo;
u8 temp_s6;
Vec3f* phi_s7;
f32 phi_f2;
Light* phi_s0;
s32 phi_s1;
s32 phi_s2;
temp_f20 = actor->world.pos.y - actor->floorHeight;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (temp_f20 > 20.0f) {
temp_10 = actor->shape.shadowScale;
temp_14 = actor->shape.shadowAlpha;
actor->shape.shadowScale *= 0.3f;
actor->shape.shadowAlpha *= ((temp_f20 - 20.0f) * 0.02f) > 1.0f ? 1.0f : ((temp_f20 - 20.0f) * 0.02f);
ActorShadow_DrawCircle(actor, lights, globalCtx);
actor->shape.shadowScale = temp_10;
actor->shape.shadowAlpha = temp_14;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (temp_f20 < 200.0f) {
phi_s7 = &actor->shape.feetPos[FOOT_LEFT];
2020-03-23 00:38:25 +00:00
spAC = &spE0[0];
temp_s6 = lights->numLights;
2020-03-23 00:38:25 +00:00
temp_s6 -= 2;
2020-03-17 04:31:30 +00:00
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 1741);
2020-03-17 04:31:30 +00:00
POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
actor->shape.feetFloorFlags = 0;
2020-03-17 04:31:30 +00:00
2020-03-23 00:38:25 +00:00
for (i = 0; i < 2; i++) {
2020-03-17 04:31:30 +00:00
phi_s7->y += 50.0f;
*spAC = func_800BFCB8(globalCtx, &spE8, phi_s7);
phi_s7->y -= 50.0f;
actor->shape.feetFloorFlags *= 2;
2020-03-17 04:31:30 +00:00
phi_f2 = phi_s7->y - *spAC;
2020-03-22 21:19:43 +00:00
if ((phi_f2 >= -1.0f) && (phi_f2 < 500.0f)) {
phi_s0 = &lights->l.l[0];
2020-03-17 04:31:30 +00:00
2020-03-23 23:11:21 +00:00
if (phi_f2 <= 0.0f) {
actor->shape.feetFloorFlags++;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-23 23:11:21 +00:00
if (30.0f < phi_f2) {
2020-03-17 04:31:30 +00:00
phi_f2 = 30.0f;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
temp_f24 = actor->shape.shadowAlpha * (1.0f - (phi_f2 * (1.0f / 30)));
2020-03-17 04:31:30 +00:00
2020-03-23 23:11:21 +00:00
if (30.0f < phi_f2) {
2020-03-17 04:31:30 +00:00
phi_f2 = 30.0f;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-23 00:38:25 +00:00
temp_f20_2 = 1.0f - (phi_f2 * (1.0f / 70));
temp_f22_2 = (actor->shape.shadowScale * temp_f20_2) * actor->scale.x;
2020-03-17 04:31:30 +00:00
phi_s2 = 0;
2020-03-22 21:19:43 +00:00
for (phi_s1 = 0; phi_s1 < temp_s6; phi_s1++) {
if (phi_s0->l.dir[1] > 0) {
2020-03-17 04:31:30 +00:00
temp_lo = ABS(phi_s0->l.dir[1]) * ((phi_s0->l.col[0] + phi_s0->l.col[1]) + phi_s0->l.col[2]);
2020-03-22 21:19:43 +00:00
if (temp_lo > 0) {
ActorShadow_DrawFoot(globalCtx, phi_s0, &spE8, temp_lo, temp_f24, temp_f22_2, temp_f20_2);
2020-03-17 04:31:30 +00:00
phi_s2 += temp_lo;
}
}
phi_s0++;
}
2020-03-22 21:19:43 +00:00
for (phi_s1 = 0; phi_s1 < 2; phi_s1++) {
if (phi_s0->l.dir[1] > 0) {
temp_a3 = (ABS(phi_s0->l.dir[1]) * ((phi_s0->l.col[0] + phi_s0->l.col[1]) + phi_s0->l.col[2])) -
(phi_s2 * 8);
2020-03-23 23:11:21 +00:00
if (temp_a3 > 0) {
ActorShadow_DrawFoot(globalCtx, phi_s0, &spE8, temp_a3, temp_f24, temp_f22_2, temp_f20_2);
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
}
phi_s0++;
}
}
spAC++;
phi_s7++;
}
2020-03-23 00:38:25 +00:00
if (!(actor->bgCheckFlags & 1)) {
actor->shape.feetFloorFlags = 0;
} else if (actor->shape.feetFloorFlags == 3) {
temp_f0 = actor->shape.feetPos[FOOT_LEFT].y - actor->shape.feetPos[FOOT_RIGHT].y;
actor->shape.feetFloorFlags = ((spE0[0] + temp_f0) < (spE0[1] - temp_f0)) ? 2 : 1;
2020-03-17 04:31:30 +00:00
}
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 1831);
2020-03-17 04:31:30 +00:00
}
}
#else
#pragma GLOBAL_ASM("asm/non_matchings/code/z_actor/ActorShadow_DrawFeet.s")
2020-03-17 04:31:30 +00:00
#endif
void Actor_SetFeetPos(Actor* actor, s32 limbIndex, s32 leftFootIndex, Vec3f* leftFootPos, s32 rightFootIndex,
Vec3f* rightFootPos) {
if (limbIndex == leftFootIndex) {
Matrix_MultVec3f(leftFootPos, &actor->shape.feetPos[FOOT_LEFT]);
} else if (limbIndex == rightFootIndex) {
Matrix_MultVec3f(rightFootPos, &actor->shape.feetPos[FOOT_RIGHT]);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002BE04(GlobalContext* globalCtx, Vec3f* arg1, Vec3f* arg2, f32* arg3) {
z_skin_matrix.c decompiled (1 non matching, 1 non equivalent) (#243) * func_800A7BE4 and func_800A7C20 done - func_800A7BE4 copy of "Math_Vec3f_ToVec3s" in z_lib.c - func_800A7C20 copy of "Math_Vec3s_ToVec3f" in z_lib.c * done func_800A7A24 * func_800A76A4 done * func_800A6E10 done * func_800A6EF4 done * func_800A6FA0 done * func_800A72FC done * Deleted z_skin_matrix.data.s and updated spec * func_800A730C done * func_800A735C done * func_800A7E70 done, func_800A7C60 matching but I'm not happy with it (weird types in function params) * Corrections. func_800A7C60 in skin_matrix done, Matrix_MtxFToMtx in sys_matrix done. * func_800A7EC0 nonmatching * func_800A8030 nonmatching but VERY close (two registers swapped) * func_800A8030 done * updating comments * func_800A7704 done * func_800A7894 done * halfway through deciphering mips_to_c for func_800A73E0 * func_800A73E0 functional but non-matching (saved register differences and probably regalloc) * Renaming some arguments and rewriting comments * Renamed files across whole project and deleted asm nonmatchings * ran format.sh * fixed function name * fixing multiplcation order in SkinMatrix_MtxFMtxFMult * Corrections in SkinMatrix_MtxFMtxFMult * Formatting changes after review * Changes as per code review * fixing rename error * fixing rename error * rename fixes * fixing function rename error * ran ./format.sh * last couple of changes as per code review * renamed SetScaling -> SetScale * Skin_Matrix_Invert -> SkinMatrix_Invert * Renaming and fixing debug message print * Renamed argument "mf" to more specific "clear" in SkinMatrix_GetClear * renamed again to "mfp" * snake case to camel case changes
2020-08-08 15:23:16 +00:00
SkinMatrix_Vec3fMtxFMultXYZW(&globalCtx->mf_11D60, arg1, arg2, arg3);
2020-03-17 04:31:30 +00:00
*arg3 = (*arg3 < 1.0f) ? 1.0f : (1.0f / *arg3);
}
2020-03-22 21:19:43 +00:00
typedef struct {
2020-03-17 04:31:30 +00:00
/* 0x00 */ Color_RGBA8 inner;
/* 0x04 */ Color_RGBA8 outer;
} NaviColor; // size = 0x8
2020-03-22 21:19:43 +00:00
NaviColor sNaviColorList[] = {
{ { 0, 255, 0, 255 }, { 0, 255, 0, 0 } }, { { 0, 255, 0, 255 }, { 0, 255, 0, 0 } },
{ { 255, 255, 255, 255 }, { 0, 0, 255, 0 } }, { { 0, 255, 0, 255 }, { 0, 255, 0, 0 } },
{ { 150, 150, 255, 255 }, { 150, 150, 255, 0 } }, { { 255, 255, 0, 255 }, { 200, 155, 0, 0 } },
{ { 0, 255, 0, 255 }, { 0, 255, 0, 0 } }, { { 0, 255, 0, 255 }, { 0, 255, 0, 0 } },
{ { 0, 255, 0, 255 }, { 0, 255, 0, 0 } }, { { 255, 255, 0, 255 }, { 200, 155, 0, 0 } },
{ { 0, 255, 0, 255 }, { 0, 255, 0, 0 } }, { { 0, 255, 0, 255 }, { 0, 255, 0, 0 } },
{ { 0, 255, 0, 255 }, { 0, 255, 0, 0 } },
2020-03-17 04:31:30 +00:00
};
// unused
2020-03-22 21:19:43 +00:00
Gfx D_80115FF0[] = {
2020-03-17 04:31:30 +00:00
gsSPEndDisplayList(),
};
2020-03-22 21:19:43 +00:00
void func_8002BE64(TargetContext* targetCtx, s32 index, f32 arg2, f32 arg3, f32 arg4) {
2020-03-17 04:31:30 +00:00
targetCtx->arr_50[index].pos.x = arg2;
targetCtx->arr_50[index].pos.y = arg3;
targetCtx->arr_50[index].pos.z = arg4;
targetCtx->arr_50[index].unk_0C = targetCtx->unk_44;
}
void func_8002BE98(TargetContext* targetCtx, s32 actorCategory, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
TargetContextEntry* entry;
NaviColor* naviColor;
s32 i;
Math_Vec3f_Copy(&targetCtx->targetCenterPos, &globalCtx->view.eye);
targetCtx->unk_44 = 500.0f;
targetCtx->unk_48 = 0x100;
naviColor = &sNaviColorList[actorCategory];
2020-03-17 04:31:30 +00:00
entry = &targetCtx->arr_50[0];
2020-03-22 21:19:43 +00:00
for (i = 0; i < ARRAY_COUNT(targetCtx->arr_50); i++) {
2020-03-17 04:31:30 +00:00
func_8002BE64(targetCtx, i, 0.0f, 0.0f, 0.0f);
entry->color.r = naviColor->inner.r;
entry->color.g = naviColor->inner.g;
entry->color.b = naviColor->inner.b;
entry++;
}
}
void func_8002BF60(TargetContext* targetCtx, Actor* actor, s32 actorCategory, GlobalContext* globalCtx) {
NaviColor* naviColor = &sNaviColorList[actorCategory];
targetCtx->naviRefPos.x = actor->focus.pos.x;
targetCtx->naviRefPos.y = actor->focus.pos.y + (actor->targetArrowOffset * actor->scale.y);
targetCtx->naviRefPos.z = actor->focus.pos.z;
2020-03-17 04:31:30 +00:00
targetCtx->naviInner.r = naviColor->inner.r;
targetCtx->naviInner.g = naviColor->inner.g;
targetCtx->naviInner.b = naviColor->inner.b;
targetCtx->naviInner.a = naviColor->inner.a;
targetCtx->naviOuter.r = naviColor->outer.r;
targetCtx->naviOuter.g = naviColor->outer.g;
targetCtx->naviOuter.b = naviColor->outer.b;
targetCtx->naviOuter.a = naviColor->outer.a;
}
2020-03-22 21:19:43 +00:00
void func_8002C0C0(TargetContext* targetCtx, Actor* actor, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
targetCtx->arrowPointedActor = NULL;
targetCtx->targetedActor = NULL;
targetCtx->unk_40 = 0.0f;
targetCtx->unk_8C = NULL;
targetCtx->unk_90 = NULL;
targetCtx->unk_4B = 0;
targetCtx->unk_4C = 0;
func_8002BF60(targetCtx, actor, actor->category, globalCtx);
func_8002BE98(targetCtx, actor->category, globalCtx);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002C124(TargetContext* targetCtx, GlobalContext* globalCtx) {
Actor* actor = targetCtx->targetedActor;
2020-03-17 04:31:30 +00:00
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 2029);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (targetCtx->unk_48 != 0) {
TargetContextEntry* entry;
Player* player;
s16 spCE;
f32 temp1;
Vec3f spBC;
s32 spB8;
f32 spB4;
s32 spB0;
s32 spAC;
f32 var1;
f32 var2;
s32 i;
2020-03-17 04:31:30 +00:00
player = PLAYER;
spCE = 0xFF;
var1 = 1.0f;
2020-03-23 23:11:21 +00:00
if (targetCtx->unk_4B != 0) {
2020-03-17 04:31:30 +00:00
spB8 = 1;
2020-03-23 23:11:21 +00:00
} else {
2020-03-17 04:31:30 +00:00
spB8 = 3;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-23 00:38:25 +00:00
if (actor != NULL) {
Math_Vec3f_Copy(&targetCtx->targetCenterPos, &actor->focus.pos);
2020-03-17 04:31:30 +00:00
var1 = (500.0f - targetCtx->unk_44) / 420.0f;
2020-03-22 21:19:43 +00:00
} else {
2020-03-23 00:38:25 +00:00
targetCtx->unk_48 -= 120;
2020-03-23 23:11:21 +00:00
if (targetCtx->unk_48 < 0) {
2020-03-17 04:31:30 +00:00
targetCtx->unk_48 = 0;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
spCE = targetCtx->unk_48;
}
func_8002BE04(globalCtx, &targetCtx->targetCenterPos, &spBC, &spB4);
spBC.x = (160 * (spBC.x * spB4)) * var1;
spBC.x = CLAMP(spBC.x, -320.0f, 320.0f);
2020-03-17 04:31:30 +00:00
spBC.y = (120 * (spBC.y * spB4)) * var1;
spBC.y = CLAMP(spBC.y, -240.0f, 240.0f);
2020-03-17 04:31:30 +00:00
2020-03-23 00:38:25 +00:00
spBC.z = spBC.z * var1;
2020-03-17 04:31:30 +00:00
targetCtx->unk_4C--;
2020-03-23 23:11:21 +00:00
if (targetCtx->unk_4C < 0) {
2020-03-17 04:31:30 +00:00
targetCtx->unk_4C = 2;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
func_8002BE64(targetCtx, targetCtx->unk_4C, spBC.x, spBC.y, spBC.z);
2020-03-23 00:38:25 +00:00
if ((!(player->stateFlags1 & 0x40)) || (actor != player->unk_664)) {
OVERLAY_DISP = Gfx_CallSetupDL(OVERLAY_DISP, 0x39);
2020-03-17 04:31:30 +00:00
for (spB0 = 0, spAC = targetCtx->unk_4C; spB0 < spB8; spB0++, spAC = (spAC + 1) % 3) {
2020-03-17 04:31:30 +00:00
entry = &targetCtx->arr_50[spAC];
2020-03-22 21:19:43 +00:00
if (entry->unk_0C < 500.0f) {
2020-03-23 23:11:21 +00:00
if (entry->unk_0C <= 120.0f) {
2020-03-17 04:31:30 +00:00
var2 = 0.15f;
2020-03-23 23:11:21 +00:00
} else {
2020-03-17 04:31:30 +00:00
var2 = ((entry->unk_0C - 120.0f) * 0.001f) + 0.15f;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
Matrix_Translate(entry->pos.x, entry->pos.y, 0.0f, MTXMODE_NEW);
Matrix_Scale(var2, 0.15f, 1.0f, MTXMODE_APPLY);
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, entry->color.r, entry->color.g, entry->color.b, (u8)spCE);
2020-03-17 04:31:30 +00:00
Matrix_RotateZ((targetCtx->unk_4B & 0x7F) * (M_PI / 64), MTXMODE_APPLY);
2020-03-22 21:19:43 +00:00
for (i = 0; i < 4; i++) {
2020-03-17 04:31:30 +00:00
Matrix_RotateZ(M_PI / 2, MTXMODE_APPLY);
Matrix_Push();
Matrix_Translate(entry->unk_0C, entry->unk_0C, 0.0f, MTXMODE_APPLY);
gSPMatrix(OVERLAY_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_actor.c", 2116),
2020-03-22 21:19:43 +00:00
G_MTX_MODELVIEW | G_MTX_LOAD);
Decompile Gameplay_Keep and fix all existing decompiled objects (#595) * First batch of files * Add missing folders back * Fix missing folders again * Finish fixing existing texture files * Gameplay_Keep XML finished * Most actor gameplay_keep undefined syms removed * Only ~200 gkeep symbols remain * All gkeep symbols that ZAP supports are fixed * Cleanup, and make gkeep names more accurate * Starting to figure out what some unknown blobs are, merge zeldaret in * fix a few more things * refactor gkeep * Change how gitkeep is handled * gkeep xml cleanup * Gkeep finished, now just waiting up ZAP updates * 100 link animations finished * 150 link animations finished * 200 link animations finished * 250 link animations finished * 350 link animations finished * 400 link animations finished * 450 link animations finished * 500 link animations finished * 550 link animations finished * All Link animations finished cannot build yet because ZAP doesn't have LinkAnimationHeader yet * xml changes for new zap stuff * finish gameplay_keep * fixing existing objects * ready for pr besides zap padding issue * mostly ready for pr * format all c files * all conflicts fixed * make changes that roman requested * fix thing i didn't mean to change * some animation symbols renamed * fixed roman's stuff * lifemeter hardcoded pointers removed * fix issue with incorrect data in gameplay_keep * removed unused asm * fixed most of fig's comments * fix all of fig's comments * reformat files * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * fixed stuff * fixed most of roman's comments * remove leading zeroes * should build now * git subrepo pull --force tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "f84d8337b" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "f84d8337b" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * all of gkeep symbols fixed * compiler error fixed * format files * final changes Co-authored-by: Zelllll <elijah@DESKTOP-NMP1I89.localdomain> Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
2021-01-25 00:36:40 +00:00
gSPDisplayList(OVERLAY_DISP++, gZTargetLockOnTriangleDL);
Matrix_Pop();
2020-03-17 04:31:30 +00:00
}
}
spCE -= 0xFF / 3;
2020-03-23 23:11:21 +00:00
if (spCE < 0) {
2020-03-17 04:31:30 +00:00
spCE = 0;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
}
actor = targetCtx->unk_94;
2020-03-22 21:19:43 +00:00
if ((actor != NULL) && !(actor->flags & 0x8000000)) {
NaviColor* naviColor = &sNaviColorList[actor->category];
2020-03-17 04:31:30 +00:00
POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x7);
2020-03-17 04:31:30 +00:00
Matrix_Translate(actor->focus.pos.x, actor->focus.pos.y + (actor->targetArrowOffset * actor->scale.y) + 17.0f,
actor->focus.pos.z, MTXMODE_NEW);
Matrix_RotateY((f32)((u16)(globalCtx->gameplayFrames * 3000)) * (M_PI / 0x8000), MTXMODE_APPLY);
2020-03-22 21:19:43 +00:00
Matrix_Scale((iREG(27) + 35) / 1000.0f, (iREG(28) + 60) / 1000.0f, (iREG(29) + 50) / 1000.0f, MTXMODE_APPLY);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, naviColor->inner.r, naviColor->inner.g, naviColor->inner.b, 255);
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_actor.c", 2153),
2020-03-22 21:19:43 +00:00
G_MTX_MODELVIEW | G_MTX_LOAD);
Decompile Gameplay_Keep and fix all existing decompiled objects (#595) * First batch of files * Add missing folders back * Fix missing folders again * Finish fixing existing texture files * Gameplay_Keep XML finished * Most actor gameplay_keep undefined syms removed * Only ~200 gkeep symbols remain * All gkeep symbols that ZAP supports are fixed * Cleanup, and make gkeep names more accurate * Starting to figure out what some unknown blobs are, merge zeldaret in * fix a few more things * refactor gkeep * Change how gitkeep is handled * gkeep xml cleanup * Gkeep finished, now just waiting up ZAP updates * 100 link animations finished * 150 link animations finished * 200 link animations finished * 250 link animations finished * 350 link animations finished * 400 link animations finished * 450 link animations finished * 500 link animations finished * 550 link animations finished * All Link animations finished cannot build yet because ZAP doesn't have LinkAnimationHeader yet * xml changes for new zap stuff * finish gameplay_keep * fixing existing objects * ready for pr besides zap padding issue * mostly ready for pr * format all c files * all conflicts fixed * make changes that roman requested * fix thing i didn't mean to change * some animation symbols renamed * fixed roman's stuff * lifemeter hardcoded pointers removed * fix issue with incorrect data in gameplay_keep * removed unused asm * fixed most of fig's comments * fix all of fig's comments * reformat files * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * fixed stuff * fixed most of roman's comments * remove leading zeroes * should build now * git subrepo pull --force tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "f84d8337b" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "f84d8337b" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * all of gkeep symbols fixed * compiler error fixed * format files * final changes Co-authored-by: Zelllll <elijah@DESKTOP-NMP1I89.localdomain> Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
2021-01-25 00:36:40 +00:00
gSPDisplayList(POLY_XLU_DISP++, &gZTargetArrowDL);
2020-03-17 04:31:30 +00:00
}
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 2158);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002C7BC(TargetContext* targetCtx, Player* player, Actor* actorArg, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
s32 pad;
Actor* unkActor;
s32 actorCategory;
2020-03-17 04:31:30 +00:00
Vec3f sp50;
f32 sp4C;
f32 temp1;
f32 temp2;
f32 temp3;
f32 temp4;
f32 temp5;
f32 temp6;
s32 lockOnSfxId;
unkActor = NULL;
2020-03-22 21:19:43 +00:00
if ((player->unk_664 != NULL) && (player->unk_84B[player->unk_846] == 2)) {
2020-03-17 04:31:30 +00:00
targetCtx->unk_94 = NULL;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
func_80032AF0(globalCtx, &globalCtx->actorCtx, &unkActor, player);
targetCtx->unk_94 = unkActor;
}
2020-03-22 21:19:43 +00:00
if (targetCtx->unk_8C != NULL) {
2020-03-17 04:31:30 +00:00
unkActor = targetCtx->unk_8C;
targetCtx->unk_8C = NULL;
2020-03-22 21:19:43 +00:00
} else if (actorArg != NULL) {
2020-03-17 04:31:30 +00:00
unkActor = actorArg;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (unkActor != NULL) {
actorCategory = unkActor->category;
2020-03-22 21:19:43 +00:00
} else {
actorCategory = player->actor.category;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if ((unkActor != targetCtx->arrowPointedActor) || (actorCategory != targetCtx->activeCategory)) {
2020-03-17 04:31:30 +00:00
targetCtx->arrowPointedActor = unkActor;
targetCtx->activeCategory = actorCategory;
2020-03-17 04:31:30 +00:00
targetCtx->unk_40 = 1.0f;
}
2020-03-22 21:19:43 +00:00
if (unkActor == NULL) {
2020-03-17 04:31:30 +00:00
unkActor = &player->actor;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if (Math_StepToF(&targetCtx->unk_40, 0.0f, 0.25f) == 0) {
2020-03-17 04:31:30 +00:00
temp1 = 0.25f / targetCtx->unk_40;
temp2 = unkActor->world.pos.x - targetCtx->naviRefPos.x;
temp3 = (unkActor->world.pos.y + (unkActor->targetArrowOffset * unkActor->scale.y)) - targetCtx->naviRefPos.y;
temp4 = unkActor->world.pos.z - targetCtx->naviRefPos.z;
2020-03-17 04:31:30 +00:00
targetCtx->naviRefPos.x += temp2 * temp1;
targetCtx->naviRefPos.y += temp3 * temp1;
targetCtx->naviRefPos.z += temp4 * temp1;
2020-03-22 21:19:43 +00:00
} else {
func_8002BF60(targetCtx, unkActor, actorCategory, globalCtx);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((actorArg != NULL) && (targetCtx->unk_4B == 0)) {
func_8002BE04(globalCtx, &actorArg->focus.pos, &sp50, &sp4C);
2020-03-22 21:19:43 +00:00
if (((sp50.z <= 0.0f) || (1.0f <= fabsf(sp50.x * sp4C))) || (1.0f <= fabsf(sp50.y * sp4C))) {
2020-03-17 04:31:30 +00:00
actorArg = NULL;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (actorArg != NULL) {
if (actorArg != targetCtx->targetedActor) {
func_8002BE98(targetCtx, actorArg->category, globalCtx);
2020-03-17 04:31:30 +00:00
targetCtx->targetedActor = actorArg;
2020-03-22 21:19:43 +00:00
if (actorArg->id == ACTOR_EN_BOOM) {
2020-03-17 04:31:30 +00:00
targetCtx->unk_48 = 0;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
lockOnSfxId = ((actorArg->flags & 5) == 5) ? NA_SE_SY_LOCK_ON : NA_SE_SY_LOCK_ON_HUMAN;
func_80078884(lockOnSfxId);
}
targetCtx->targetCenterPos.x = actorArg->world.pos.x;
targetCtx->targetCenterPos.y = actorArg->world.pos.y - (actorArg->shape.yOffset * actorArg->scale.y);
targetCtx->targetCenterPos.z = actorArg->world.pos.z;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (targetCtx->unk_4B == 0) {
2020-03-17 04:31:30 +00:00
temp5 = (500.0f - targetCtx->unk_44) * 3.0f;
temp6 = (temp5 < 30.0f) ? 30.0f : ((100.0f < temp5) ? 100.0f : temp5);
if (Math_StepToF(&targetCtx->unk_44, 80.0f, temp6) != 0) {
2020-03-17 04:31:30 +00:00
targetCtx->unk_4B++;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
targetCtx->unk_4B = (targetCtx->unk_4B + 3) | 0x80;
targetCtx->unk_44 = 120.0f;
}
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
targetCtx->targetedActor = NULL;
Math_StepToF(&targetCtx->unk_44, 500.0f, 80.0f);
2020-03-17 04:31:30 +00:00
}
}
/**
* Tests if current scene switch flag is set.
*/
2020-03-22 21:19:43 +00:00
s32 Flags_GetSwitch(GlobalContext* globalCtx, s32 flag) {
if (flag < 0x20) {
2020-03-17 04:31:30 +00:00
return globalCtx->actorCtx.flags.swch & (1 << flag);
2020-03-22 21:19:43 +00:00
} else {
2020-10-13 16:32:19 +00:00
return globalCtx->actorCtx.flags.tempSwch & (1 << (flag - 0x20));
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
/**
* Sets current scene switch flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_SetSwitch(GlobalContext* globalCtx, s32 flag) {
if (flag < 0x20) {
2020-03-17 04:31:30 +00:00
globalCtx->actorCtx.flags.swch |= (1 << flag);
2020-03-22 21:19:43 +00:00
} else {
2020-10-13 16:32:19 +00:00
globalCtx->actorCtx.flags.tempSwch |= (1 << (flag - 0x20));
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
/**
* Unsets current scene switch flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_UnsetSwitch(GlobalContext* globalCtx, s32 flag) {
if (flag < 0x20) {
2020-03-17 04:31:30 +00:00
globalCtx->actorCtx.flags.swch &= ~(1 << flag);
2020-03-22 21:19:43 +00:00
} else {
2020-10-13 16:32:19 +00:00
globalCtx->actorCtx.flags.tempSwch &= ~(1 << (flag - 0x20));
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
/**
* Tests if current scene unknown flag is set.
*/
2020-03-22 21:19:43 +00:00
s32 Flags_GetUnknown(GlobalContext* globalCtx, s32 flag) {
if (flag < 0x20) {
2020-03-17 04:31:30 +00:00
return globalCtx->actorCtx.flags.unk0 & (1 << flag);
2020-03-22 21:19:43 +00:00
} else {
2020-10-13 16:32:19 +00:00
return globalCtx->actorCtx.flags.unk1 & (1 << (flag - 0x20));
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
/**
* Sets current scene unknown flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_SetUnknown(GlobalContext* globalCtx, s32 flag) {
if (flag < 0x20) {
2020-03-17 04:31:30 +00:00
globalCtx->actorCtx.flags.unk0 |= (1 << flag);
2020-03-22 21:19:43 +00:00
} else {
2020-10-13 16:32:19 +00:00
globalCtx->actorCtx.flags.unk1 |= (1 << (flag - 0x20));
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
/**
* Unsets current scene unknown flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_UnsetUnknown(GlobalContext* globalCtx, s32 flag) {
if (flag < 0x20) {
2020-03-17 04:31:30 +00:00
globalCtx->actorCtx.flags.unk0 &= ~(1 << flag);
2020-03-22 21:19:43 +00:00
} else {
2020-10-13 16:32:19 +00:00
globalCtx->actorCtx.flags.unk1 &= ~(1 << (flag - 0x20));
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
/**
* Tests if current scene chest flag is set.
*/
2020-03-22 21:19:43 +00:00
s32 Flags_GetTreasure(GlobalContext* globalCtx, s32 flag) {
2020-03-17 04:31:30 +00:00
return globalCtx->actorCtx.flags.chest & (1 << flag);
}
/**
* Sets current scene chest flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_SetTreasure(GlobalContext* globalCtx, s32 flag) {
2020-03-17 04:31:30 +00:00
globalCtx->actorCtx.flags.chest |= (1 << flag);
}
/**
* Tests if current scene clear flag is set.
*/
2020-03-22 21:19:43 +00:00
s32 Flags_GetClear(GlobalContext* globalCtx, s32 flag) {
2020-03-17 04:31:30 +00:00
return globalCtx->actorCtx.flags.clear & (1 << flag);
}
/**
* Sets current scene clear flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_SetClear(GlobalContext* globalCtx, s32 flag) {
2020-03-17 04:31:30 +00:00
globalCtx->actorCtx.flags.clear |= (1 << flag);
}
/**
* Unsets current scene clear flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_UnsetClear(GlobalContext* globalCtx, s32 flag) {
2020-03-17 04:31:30 +00:00
globalCtx->actorCtx.flags.clear &= ~(1 << flag);
}
/**
* Tests if current scene temp clear flag is set.
*/
2020-03-22 21:19:43 +00:00
s32 Flags_GetTempClear(GlobalContext* globalCtx, s32 flag) {
2020-03-17 04:31:30 +00:00
return globalCtx->actorCtx.flags.tempClear & (1 << flag);
}
/**
* Sets current scene temp clear flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_SetTempClear(GlobalContext* globalCtx, s32 flag) {
2020-10-13 16:32:19 +00:00
globalCtx->actorCtx.flags.tempClear |= (1 << flag);
2020-03-17 04:31:30 +00:00
}
/**
* Unsets current scene temp clear flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_UnsetTempClear(GlobalContext* globalCtx, s32 flag) {
2020-03-17 04:31:30 +00:00
globalCtx->actorCtx.flags.tempClear &= ~(1 << flag);
}
/**
* Tests if current scene collectible flag is set.
*/
2020-03-22 21:19:43 +00:00
s32 Flags_GetCollectible(GlobalContext* globalCtx, s32 flag) {
if (flag < 0x20) {
2020-03-17 04:31:30 +00:00
return globalCtx->actorCtx.flags.collect & (1 << flag);
2020-03-22 21:19:43 +00:00
} else {
2020-10-13 16:32:19 +00:00
return globalCtx->actorCtx.flags.tempCollect & (1 << (flag - 0x20));
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
/**
* Sets current scene collectible flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_SetCollectible(GlobalContext* globalCtx, s32 flag) {
if (flag != 0) {
if (flag < 0x20) {
2020-10-13 16:32:19 +00:00
globalCtx->actorCtx.flags.collect |= (1 << flag);
2020-03-22 21:19:43 +00:00
} else {
2020-10-13 16:32:19 +00:00
globalCtx->actorCtx.flags.tempCollect |= (1 << (flag - 0x20));
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
2020-03-22 21:19:43 +00:00
void func_8002CDE4(GlobalContext* globalCtx, TitleCardContext* titleCtx) {
titleCtx->durationTimer = titleCtx->delayTimer = titleCtx->intensity = titleCtx->alpha = 0;
2020-03-17 04:31:30 +00:00
}
void TitleCard_InitBossName(GlobalContext* globalCtx, TitleCardContext* titleCtx, void* texture, s16 x, s16 y, u8 width,
u8 height) {
2020-03-17 04:31:30 +00:00
titleCtx->texture = texture;
titleCtx->x = x;
titleCtx->y = y;
titleCtx->width = width;
titleCtx->height = height;
titleCtx->durationTimer = 80;
titleCtx->delayTimer = 0;
2020-03-17 04:31:30 +00:00
}
void TitleCard_InitPlaceName(GlobalContext* globalCtx, TitleCardContext* titleCtx, void* texture, s32 x, s32 y,
s32 width, s32 height, s32 delay) {
SceneTableEntry* loadedScene = globalCtx->loadedScene;
u32 size = loadedScene->titleFile.vromEnd - loadedScene->titleFile.vromStart;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((size != 0) && (size <= 0x3000)) {
DmaMgr_SendRequest1(texture, loadedScene->titleFile.vromStart, size, "../z_actor.c", 2765);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
titleCtx->texture = texture;
titleCtx->x = x;
titleCtx->y = y;
titleCtx->width = width;
titleCtx->height = height;
titleCtx->durationTimer = 80;
titleCtx->delayTimer = delay;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void TitleCard_Update(GlobalContext* globalCtx, TitleCardContext* titleCtx) {
if (DECR(titleCtx->delayTimer) == 0) {
if (DECR(titleCtx->durationTimer) == 0) {
Math_StepToS(&titleCtx->alpha, 0, 30);
Math_StepToS(&titleCtx->intensity, 0, 70);
2020-03-22 21:19:43 +00:00
} else {
Math_StepToS(&titleCtx->alpha, 255, 10);
Math_StepToS(&titleCtx->intensity, 255, 20);
2020-03-17 04:31:30 +00:00
}
}
}
2020-03-22 21:19:43 +00:00
void TitleCard_Draw(GlobalContext* globalCtx, TitleCardContext* titleCtx) {
2020-03-17 04:31:30 +00:00
s32 spCC;
s32 spC8;
s32 unk1;
s32 spC0;
2020-03-23 00:38:25 +00:00
s32 sp38;
2020-03-17 04:31:30 +00:00
s32 spB8;
s32 spB4;
s32 spB0;
if (titleCtx->alpha != 0) {
spCC = titleCtx->width;
spC8 = titleCtx->height;
spC0 = (titleCtx->x * 4) - (spCC * 2);
spB8 = (titleCtx->y * 4) - (spC8 * 2);
2020-03-17 04:31:30 +00:00
sp38 = spCC * 2;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 2824);
2020-03-17 04:31:30 +00:00
spB0 = spCC * spC8 * gSaveContext.language;
spC8 = (spCC * spC8 > 0x1000) ? 0x1000 / spCC : spC8;
2020-03-23 00:38:25 +00:00
spB4 = spB8 + (spC8 * 4);
2020-03-17 04:31:30 +00:00
2020-03-23 00:38:25 +00:00
if (1) {} // Necessary to match
2020-03-17 04:31:30 +00:00
OVERLAY_DISP = func_80093808(OVERLAY_DISP);
2020-03-17 04:31:30 +00:00
gDPSetPrimColor(OVERLAY_DISP++, 0, 0, (u8)titleCtx->intensity, (u8)titleCtx->intensity, (u8)titleCtx->intensity,
(u8)titleCtx->alpha);
2020-03-17 04:31:30 +00:00
gDPLoadTextureBlock(OVERLAY_DISP++, (s32)titleCtx->texture + spB0, G_IM_FMT_IA, G_IM_SIZ_8b, spCC, spC8, 0,
2020-03-22 21:19:43 +00:00
G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK, G_TX_NOLOD,
G_TX_NOLOD);
2020-03-17 04:31:30 +00:00
gSPTextureRectangle(OVERLAY_DISP++, spC0, spB8, ((sp38 * 2) + spC0) - 4, spB8 + (spC8 * 4) - 1, G_TX_RENDERTILE,
0, 0, 1 << 10, 1 << 10);
2020-03-17 04:31:30 +00:00
spC8 = titleCtx->height - spC8;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (spC8 > 0) {
gDPLoadTextureBlock(OVERLAY_DISP++, (s32)titleCtx->texture + spB0 + 0x1000, G_IM_FMT_IA, G_IM_SIZ_8b, spCC,
spC8, 0, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMIRROR | G_TX_WRAP, G_TX_NOMASK, G_TX_NOMASK,
2020-03-17 04:31:30 +00:00
G_TX_NOLOD, G_TX_NOLOD);
gSPTextureRectangle(OVERLAY_DISP++, spC0, spB4, ((sp38 * 2) + spC0) - 4, spB4 + (spC8 * 4) - 1,
G_TX_RENDERTILE, 0, 0, 1 << 10, 1 << 10);
2020-03-17 04:31:30 +00:00
}
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 2880);
2020-03-17 04:31:30 +00:00
}
}
2020-03-22 21:19:43 +00:00
s32 func_8002D53C(GlobalContext* globalCtx, TitleCardContext* titleCtx) {
if ((globalCtx->actorCtx.titleCtx.delayTimer != 0) || (globalCtx->actorCtx.titleCtx.alpha != 0)) {
titleCtx->durationTimer = 0;
titleCtx->delayTimer = 0;
return false;
2020-03-17 04:31:30 +00:00
}
return true;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void Actor_Kill(Actor* actor) {
2020-03-17 04:31:30 +00:00
actor->draw = NULL;
actor->update = NULL;
actor->flags &= ~0x1;
}
void Actor_SetWorldToHome(Actor* actor) {
actor->world = actor->home;
2020-03-17 04:31:30 +00:00
}
void Actor_SetFocus(Actor* actor, f32 yOffset) {
actor->focus.pos.x = actor->world.pos.x;
actor->focus.pos.y = actor->world.pos.y + yOffset;
actor->focus.pos.z = actor->world.pos.z;
2020-03-17 04:31:30 +00:00
actor->focus.rot.x = actor->world.rot.x;
actor->focus.rot.y = actor->world.rot.y;
actor->focus.rot.z = actor->world.rot.z;
2020-03-17 04:31:30 +00:00
}
void Actor_SetWorldRotToShape(Actor* actor) {
actor->world.rot = actor->shape.rot;
2020-03-17 04:31:30 +00:00
}
void Actor_SetShapeRotToWorld(Actor* actor) {
actor->shape.rot = actor->world.rot;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void Actor_SetScale(Actor* actor, f32 scale) {
2020-03-17 04:31:30 +00:00
actor->scale.z = scale;
actor->scale.y = scale;
actor->scale.x = scale;
}
2020-03-22 21:19:43 +00:00
void Actor_SetObjectDependency(GlobalContext* globalCtx, Actor* actor) {
gSegments[6] = VIRTUAL_TO_PHYSICAL(globalCtx->objectCtx.status[actor->objBankIndex].segment);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void Actor_Init(Actor* actor, GlobalContext* globalCtx) {
Actor_SetWorldToHome(actor);
Actor_SetShapeRotToWorld(actor);
Actor_SetFocus(actor, 0.0f);
Math_Vec3f_Copy(&actor->prevPos, &actor->world.pos);
2020-03-17 04:31:30 +00:00
Actor_SetScale(actor, 0.01f);
actor->targetMode = 3;
2020-03-17 04:31:30 +00:00
actor->minVelocityY = -20.0f;
actor->xyzDistToPlayerSq = FLT_MAX;
2020-03-17 04:31:30 +00:00
actor->naviEnemyId = 0xFF;
actor->uncullZoneForward = 1000.0f;
actor->uncullZoneScale = 350.0f;
actor->uncullZoneDownward = 700.0f;
CollisionCheck_InitInfo(&actor->colChkInfo);
actor->floorBgId = BGCHECK_SCENE;
2020-03-17 04:31:30 +00:00
ActorShape_Init(&actor->shape, 0.0f, NULL, 0.0f);
2020-03-22 21:19:43 +00:00
if (Object_IsLoaded(&globalCtx->objectCtx, actor->objBankIndex)) {
2020-03-17 04:31:30 +00:00
Actor_SetObjectDependency(globalCtx, actor);
actor->init(actor, globalCtx);
actor->init = NULL;
}
}
2020-03-22 21:19:43 +00:00
void Actor_Destroy(Actor* actor, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
ActorOverlay* overlayEntry;
char* name;
2020-03-22 21:19:43 +00:00
if (actor->destroy != NULL) {
2020-03-17 04:31:30 +00:00
actor->destroy(actor, globalCtx);
actor->destroy = NULL;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
overlayEntry = actor->overlayEntry;
name = overlayEntry->name != NULL ? overlayEntry->name : "";
// Translates to: "NO Actor CLASS DESTRUCT [%s]"
osSyncPrintf("Actorクラス デストラクトがありません [%s]\n" VT_RST, name);
}
}
Volvagia (ovl_Boss_Fd) and related actors (#352) * Darkmeiro decompilation Bg_Gnd_Darkmeiro decompiled, matched, and documented. * Lots of functions matched. Some big ones are close. * Five left unmatched, one close. * Merged data and decompiled the giant function into something readable. Its branch structure has yet to be matched. * Three unmatched, one essentially matched, the rest matched. * More fixes. * Documented more of the structure and cleaned up a bit. * BossFd2, BgVbSima, and EnVbBall matched and documented * Also removed unneeded .s files * And need to name EnVbBall's functions * give this a shot * fix conflict * one more try * removing darkmeiro changes * and again * now OK from make clean * minor cleanup * One more matching function for BossFd * which means it doesn't need its .s * splitting * splitting * splitting * forgot some .s * fancy new names * fancy new names * trying again * sneaky .s files * sound effects and some hex to decimal conversions * Sound effects and static variable cleanup * format.sh and clean up static variables * sfx and formatting * ZAP and cleanup * small cleanup * cleanup and ZAP * ZAP * looking at the giant function again * looking at the giant function again * Only the big function left. * Those .s files aren't mine, officer * float literals might be fixed. regalloc still a nightmare * almost done with the big function * should make now * not much of a change * all functions match. rodata somehow doesn't. * forgot some things * lots of cleanup * and a little more * small error * large cleanup. Also BossFd has function names and inlined variable declarations * still more cleanup * the quest for 0.1f continues * forgot to put NON_MATCHING back in * Data structures fully documented. Still more cleanup. * DECR now works with BossFd2 * should match now * cleanup * small cleanup * cleanup and names * tiny thing * particles and headers and stuff * now with more enums * merge * test * end test * update * cleanup * object 2 * object 1 * doc object_fd2 * git subrepo pull --force tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "6f874af4a" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "6f874af4a" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * formatting * .s * merge actor * vertex arrays * a little more * formatting * merge opd * fixed damage check * cleanup * fixes * effect struct * review Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain> Co-authored-by: fig02 <fig02srl@gmail.com>
2021-04-17 17:12:46 +00:00
s16 func_8002D7EC(Actor* actor) {
2020-03-17 04:31:30 +00:00
f32 speedRate = R_UPDATE_RATE * 0.5f;
actor->world.pos.x += (actor->velocity.x * speedRate) + actor->colChkInfo.displacement.x;
actor->world.pos.y += (actor->velocity.y * speedRate) + actor->colChkInfo.displacement.y;
actor->world.pos.z += (actor->velocity.z * speedRate) + actor->colChkInfo.displacement.z;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002D868(Actor* actor) {
actor->velocity.x = Math_SinS(actor->world.rot.y) * actor->speedXZ;
actor->velocity.z = Math_CosS(actor->world.rot.y) * actor->speedXZ;
2020-03-17 04:31:30 +00:00
actor->velocity.y += actor->gravity;
2020-03-22 21:19:43 +00:00
if (actor->velocity.y < actor->minVelocityY) {
2020-03-17 04:31:30 +00:00
actor->velocity.y = actor->minVelocityY;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void Actor_MoveForward(Actor* actor) {
2020-03-17 04:31:30 +00:00
func_8002D868(actor);
func_8002D7EC(actor);
}
2020-03-22 21:19:43 +00:00
void func_8002D908(Actor* actor) {
f32 sp24 = Math_CosS(actor->world.rot.x) * actor->speedXZ;
actor->velocity.x = Math_SinS(actor->world.rot.y) * sp24;
actor->velocity.y = Math_SinS(actor->world.rot.x) * actor->speedXZ;
actor->velocity.z = Math_CosS(actor->world.rot.y) * sp24;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002D97C(Actor* actor) {
2020-03-17 04:31:30 +00:00
func_8002D908(actor);
func_8002D7EC(actor);
}
2020-03-22 21:19:43 +00:00
void func_8002D9A4(Actor* actor, f32 arg1) {
actor->speedXZ = Math_CosS(actor->world.rot.x) * arg1;
actor->velocity.y = -Math_SinS(actor->world.rot.x) * arg1;
2020-03-17 04:31:30 +00:00
}
void func_8002D9F8(Actor* actor, SkelAnime* skelAnime) {
2020-03-17 04:31:30 +00:00
Vec3f sp1C;
SkelAnime_UpdateTranslation(skelAnime, &sp1C, actor->shape.rot.y);
actor->world.pos.x += sp1C.x * actor->scale.x;
actor->world.pos.y += sp1C.y * actor->scale.y;
actor->world.pos.z += sp1C.z * actor->scale.z;
2020-03-17 04:31:30 +00:00
}
s16 Actor_WorldYawTowardActor(Actor* actorA, Actor* actorB) {
return Math_Vec3f_Yaw(&actorA->world.pos, &actorB->world.pos);
2020-03-17 04:31:30 +00:00
}
s16 Actor_FocusYawTowardActor(Actor* actorA, Actor* actorB) {
return Math_Vec3f_Yaw(&actorA->focus.pos, &actorB->focus.pos);
2020-03-17 04:31:30 +00:00
}
s16 Actor_WorldYawTowardPoint(Actor* actor, Vec3f* refPoint) {
return Math_Vec3f_Yaw(&actor->world.pos, refPoint);
2020-03-17 04:31:30 +00:00
}
s16 Actor_WorldPitchTowardActor(Actor* actorA, Actor* actorB) {
return Math_Vec3f_Pitch(&actorA->world.pos, &actorB->world.pos);
2020-03-17 04:31:30 +00:00
}
s16 Actor_FocusPitchTowardActor(Actor* actorA, Actor* actorB) {
return Math_Vec3f_Pitch(&actorA->focus.pos, &actorB->focus.pos);
2020-03-17 04:31:30 +00:00
}
s16 Actor_WorldPitchTowardPoint(Actor* actor, Vec3f* refPoint) {
return Math_Vec3f_Pitch(&actor->world.pos, refPoint);
2020-03-17 04:31:30 +00:00
}
f32 Actor_WorldDistXYZToActor(Actor* actorA, Actor* actorB) {
return Math_Vec3f_DistXYZ(&actorA->world.pos, &actorB->world.pos);
2020-03-17 04:31:30 +00:00
}
f32 Actor_WorldDistXYZToPoint(Actor* actor, Vec3f* refPoint) {
return Math_Vec3f_DistXYZ(&actor->world.pos, refPoint);
2020-03-17 04:31:30 +00:00
}
f32 Actor_WorldDistXZToActor(Actor* actorA, Actor* actorB) {
return Math_Vec3f_DistXZ(&actorA->world.pos, &actorB->world.pos);
2020-03-17 04:31:30 +00:00
}
f32 Actor_WorldDistXZToPoint(Actor* actor, Vec3f* refPoint) {
return Math_Vec3f_DistXZ(&actor->world.pos, refPoint);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002DBD0(Actor* actor, Vec3f* result, Vec3f* arg2) {
2020-03-17 04:31:30 +00:00
f32 cosRot2Y;
f32 sinRot2Y;
f32 deltaX;
f32 deltaZ;
cosRot2Y = Math_CosS(actor->shape.rot.y);
sinRot2Y = Math_SinS(actor->shape.rot.y);
deltaX = arg2->x - actor->world.pos.x;
deltaZ = arg2->z - actor->world.pos.z;
2020-03-17 04:31:30 +00:00
result->x = (deltaX * cosRot2Y) - (deltaZ * sinRot2Y);
result->z = (deltaX * sinRot2Y) + (deltaZ * cosRot2Y);
result->y = arg2->y - actor->world.pos.y;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
f32 Actor_HeightDiff(Actor* actorA, Actor* actorB) {
return actorB->world.pos.y - actorA->world.pos.y;
2020-03-17 04:31:30 +00:00
}
decompile z_camera (#398) * cleanup * name camera action functions * decompile a few small functions, name a few Camera struct members * decompile camera data, decompile a few camera functions * Split ASM for code_800BB0A0 * removing code_800BB0A0.s * PR Requests, Camera WIP * remove #define NON_MATCHING from db_camera * rename code_8007BF90.c to z_olib.c, rename functions in z_olib.c * camera wip * rename some struct memebers, some decomp wip * pr updates * camera wip * name some fields in Camera Struct, being making sense of Camera_Update * Camera WIP * wip * wip * add z64camera.h header, begin creating CameraSetting macros * wip * wip * wip * wip * migrate camera bss to c * match a couple functions in db_camera * match some small db_camera functions * wip * migrate db_camera rodata, match a few functions * remote db_camera.rodata.s * match some of db_camera * identify types of some unknown data pieces * some small wip * Match Camera_Init, some function changes, some struct name changes. Change unk_C0 and unk_CC to floats from Vec3fs * add naming for a few more Camera struct members * wip * match func_80043F94 * Match Camera_Jump1 * document some of Camera_Jump1 * wip * match Camera_Jump3 * Match Camera_Update, FeelsAmazing * wip * wip * match Camera_SetParam * minor cleanup * wip * wip * match Camera_KeepOn0 * some documentation, modify some matching functions to match style of others. * match Camera_Demo1 * match camera_demo9 * document Camera_Demo1 and Camera_Demo9 * wip * Match camera_battle4 * match camera_unique2 * Match Camera_Unique3 * match camera_special6 * match Camera_Special5 * wip * document camera_special6 * naming updates * match camera_Unique1 * match Camera_Unique0 * wip * Match Camera_CalcUpFromPitchYawRoll * match func_80045508 * document Camera_Battle4 * document several camera functions, move camera data to separate file * rename phi/theta to pitch/yaw * wip * uniq9 wip * Camera_Unqiue9 OK * document Camera_Unique9 * name unk_160 in camera struct * wip * wip * minor updates * fix conflicts * wip * wip * Olib updates * wip * wip * rename most Math3D functions, few matches, documentation * wip * document most of math3d * wip * wip * wip * pr updates * Match Camera_Fixed4 * match func_80058E8C * pr updates * add missing comment block finalizer * Merge math3dupdates * match Camera_ChangeSetting * Match Camera_ChangeMode * match func_80058148 * Match Camera_Special9 * decompile the rest of camera data * match Camera_Demo5 * name a few camera functions in z_play * match func_80046CB4, some work on other fucntions * wip * impove some non matchings * fix function rename * match func_800588B4 * match Camera_Subj4 * wip * Camera_Demo3 matching, Camera_Battle1 big progress * Camera_Normal2 OK * wip * match Camera_Parallel1 * normalize some things across functions * match Camera_Normal1 * Match Camera_Normal3 * some cleanup * more cleanup * more cleanup , match Camera_CalcDefaultPitch * data formatting * Match Camera_Jump2 * document Camera_Jump2 * Match Camera_KeepOn3 * document some of Camera_KeepOn3 * improve some non_matchings * match func_80045C74 and func_800460A8 * code cleanup, documentation * match Camera_KeepOn1 * Match Camera_Subj3 * Match Camera_Battle1 * remove non_matching from func_80044adc and func_80046e20 * name several members of Battle1 * more documentation on Battle1 * cleanup * renaming Camera_Vec3fScaleXYZFactor to Camera_Vec3fTranslateByUnitVector * reorganize update structs, remove final references to params, remove CameraParams union * implement camera enums into player * Renaming Camera_GetDir to Camera_GetInputDir, Camera_GetRealDir to Camera_GetCamDir, etc, implement camera enum's into player * remove non-global camera variables from variables.h * clean up some variable declarations * finish pr comment updates * fix some warnings * data formatting * finish commenting on data * delete unused asm * remove asm Co-authored-by: fig <fig02srl@gmail.com>
2020-12-06 22:39:47 +00:00
f32 Player_GetHeight(Player* player) {
2020-03-17 04:31:30 +00:00
f32 offset = (player->stateFlags1 & 0x800000) ? 32.0f : 0.0f;
2020-03-22 21:19:43 +00:00
if (LINK_IS_ADULT) {
2020-03-17 04:31:30 +00:00
return offset + 68.0f;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
return offset + 44.0f;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
f32 func_8002DCE4(Player* player) {
if (player->stateFlags1 & 0x800000) {
2020-03-17 04:31:30 +00:00
return 8.0f;
2020-03-22 21:19:43 +00:00
} else if (player->stateFlags1 & 0x8000000) {
2020-03-17 04:31:30 +00:00
return (R_RUN_SPEED_LIMIT / 100.0f) * 0.6f;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
return R_RUN_SPEED_LIMIT / 100.0f;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_8002DD6C(Player* player) {
2020-03-17 04:31:30 +00:00
return player->stateFlags1 & 0x8;
}
2020-03-22 21:19:43 +00:00
s32 func_8002DD78(Player* player) {
2020-03-17 04:31:30 +00:00
return func_8002DD6C(player) && player->unk_834;
}
2020-03-22 21:19:43 +00:00
s32 func_8002DDA8(GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
2020-03-17 04:31:30 +00:00
return (player->stateFlags1 & 0x800) || func_8002DD78(player);
}
2020-03-22 21:19:43 +00:00
s32 func_8002DDE4(GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
2020-03-17 04:31:30 +00:00
return player->stateFlags2 & 0x8;
}
2020-03-22 21:19:43 +00:00
s32 func_8002DDF4(GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
2020-03-17 04:31:30 +00:00
return player->stateFlags2 & 0x1000;
}
2020-03-22 21:19:43 +00:00
void func_8002DE04(GlobalContext* globalCtx, Actor* actorA, Actor* actorB) {
ArmsHook* hookshot = (ArmsHook*)Actor_Find(&globalCtx->actorCtx, ACTOR_ARMS_HOOK, ACTORCAT_ITEMACTION);
2020-03-17 04:31:30 +00:00
hookshot->grabbed = actorB;
hookshot->grabbedDistDiff.x = 0.0f;
hookshot->grabbedDistDiff.y = 0.0f;
hookshot->grabbedDistDiff.z = 0.0f;
2020-03-17 04:31:30 +00:00
actorB->flags |= 0x2000;
actorA->flags &= ~0x2000;
}
2020-03-22 21:19:43 +00:00
void func_8002DE74(GlobalContext* globalCtx, Player* player) {
if ((globalCtx->roomCtx.curRoom.unk_03 != 4) && func_800C0CB8(globalCtx)) {
Camera_ChangeSetting(Gameplay_GetCamera(globalCtx, MAIN_CAM), CAM_SET_HORSE0);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
void Actor_MountHorse(GlobalContext* globalCtx, Player* player, Actor* horse) {
player->rideActor = horse;
2020-03-17 04:31:30 +00:00
player->stateFlags1 |= 0x800000;
horse->child = &player->actor;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_8002DEEC(Player* player) {
return (player->stateFlags1 & 0x20000080) || (player->csMode != 0);
2020-03-17 04:31:30 +00:00
}
void func_8002DF18(GlobalContext* globalCtx, Player* player) {
func_8006DC68(globalCtx, player);
2020-03-17 04:31:30 +00:00
}
s32 func_8002DF38(GlobalContext* globalCtx, Actor* actor, u8 csMode) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
player->csMode = csMode;
2020-03-17 04:31:30 +00:00
player->unk_448 = actor;
player->unk_46A = 0;
return true;
2020-03-17 04:31:30 +00:00
}
s32 func_8002DF54(GlobalContext* globalCtx, Actor* actor, u8 csMode) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
func_8002DF38(globalCtx, actor, csMode);
2020-03-17 04:31:30 +00:00
player->unk_46A = 1;
return true;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002DF90(DynaPolyActor* dynaActor) {
2020-03-17 04:31:30 +00:00
dynaActor->unk_154 = 0.0f;
dynaActor->unk_150 = 0.0f;
}
2020-03-22 21:19:43 +00:00
void func_8002DFA4(DynaPolyActor* dynaActor, f32 arg1, s16 arg2) {
2020-03-17 04:31:30 +00:00
dynaActor->unk_150 += arg1;
dynaActor->unk_158 = arg2;
}
/**
* Chcek if the player is facing the specified actor.
* The maximum angle difference that qualifies as "facing" is specified by `maxAngle`.
*/
s32 Player_IsFacingActor(Actor* actor, s16 maxAngle, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
s16 yawDiff = (s16)(actor->yawTowardsPlayer + 0x8000) - player->actor.shape.rot.y;
2020-03-17 04:31:30 +00:00
if (ABS(yawDiff) < maxAngle) {
return true;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return false;
2020-03-17 04:31:30 +00:00
}
/**
* Chcek if `actorB` is facing `actorA`.
* The maximum angle difference that qualifies as "facing" is specified by `maxAngle`.
*
* This function is unused in the original game.
*/
s32 Actor_ActorBIsFacingActorA(Actor* actorA, Actor* actorB, s16 maxAngle) {
s16 yawDiff = (s16)(Actor_WorldYawTowardActor(actorA, actorB) + 0x8000) - actorB->shape.rot.y;
2020-03-17 04:31:30 +00:00
if (ABS(yawDiff) < maxAngle) {
return true;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return false;
2020-03-17 04:31:30 +00:00
}
/**
* Chcek if the specified actor is facing the player.
* The maximum angle difference that qualifies as "facing" is specified by `maxAngle`.
*/
s32 Actor_IsFacingPlayer(Actor* actor, s16 maxAngle) {
s16 yawDiff = actor->yawTowardsPlayer - actor->shape.rot.y;
2020-03-17 04:31:30 +00:00
if (ABS(yawDiff) < maxAngle) {
return true;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return false;
2020-03-17 04:31:30 +00:00
}
/**
* Chcek if `actorA` is facing `actorB`.
* The maximum angle difference that qualifies as "facing" is specified by `maxAngle`.
*
* This function is unused in the original game.
*/
s32 Actor_ActorAIsFacingActorB(Actor* actorA, Actor* actorB, s16 maxAngle) {
s16 yawDiff = Actor_WorldYawTowardActor(actorA, actorB) - actorA->shape.rot.y;
2020-03-17 04:31:30 +00:00
if (ABS(yawDiff) < maxAngle) {
return true;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return false;
2020-03-17 04:31:30 +00:00
}
/**
* Chcek if the specified actor is facing the player and is nearby.
* The maximum angle difference that qualifies as "facing" is specified by `maxAngle`.
* The minimum distance that qualifies as "nearby" is specified by `range`.
*/
s32 Actor_IsFacingAndNearPlayer(Actor* actor, f32 range, s16 maxAngle) {
s16 yawDiff = actor->yawTowardsPlayer - actor->shape.rot.y;
2020-03-17 04:31:30 +00:00
if (ABS(yawDiff) < maxAngle) {
f32 xyzDistanceFromLink = sqrtf(SQ(actor->xzDistToPlayer) + SQ(actor->yDistToPlayer));
2020-03-17 04:31:30 +00:00
if (xyzDistanceFromLink < range) {
return true;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
return false;
2020-03-17 04:31:30 +00:00
}
/**
* Chcek if `actorA` is facing `actorB` and is nearby.
* The maximum angle difference that qualifies as "facing" is specified by `maxAngle`.
* The minimum distance that qualifies as "nearby" is specified by `range`.
*/
s32 Actor_ActorAIsFacingAndNearActorB(Actor* actorA, Actor* actorB, f32 range, s16 maxAngle) {
if (Actor_WorldDistXYZToActor(actorA, actorB) < range) {
s16 yawDiff = Actor_WorldYawTowardActor(actorA, actorB) - actorA->shape.rot.y;
2020-03-17 04:31:30 +00:00
if (ABS(yawDiff) < maxAngle) {
return true;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
return false;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_8002E234(Actor* actor, f32 arg1, s32 arg2) {
if ((actor->bgCheckFlags & 0x1) && (arg1 < -11.0f)) {
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags &= ~0x1;
actor->bgCheckFlags |= 0x4;
2020-03-22 21:19:43 +00:00
if ((actor->velocity.y < 0.0f) && (arg2 & 0x10)) {
2020-03-17 04:31:30 +00:00
actor->velocity.y = 0.0f;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return false;
2020-03-17 04:31:30 +00:00
}
return true;
2020-03-17 04:31:30 +00:00
}
CollisionPoly* sCurCeilingPoly;
s32 sCurCeilingBgId;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
s32 func_8002E2AC(GlobalContext* globalCtx, Actor* actor, Vec3f* arg2, s32 arg3) {
f32 floorHeightDiff;
s32 floorBgId;
2020-03-17 04:31:30 +00:00
arg2->y += 50.0f;
actor->floorHeight =
BgCheck_EntityRaycastFloor5(globalCtx, &globalCtx->colCtx, &actor->floorPoly, &floorBgId, actor, arg2);
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags &= ~0x0086;
if (actor->floorHeight <= BGCHECK_Y_MIN) {
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
return func_8002E234(actor, BGCHECK_Y_MIN, arg3);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
floorHeightDiff = actor->floorHeight - actor->world.pos.y;
actor->floorBgId = floorBgId;
2020-03-17 04:31:30 +00:00
if (floorHeightDiff >= 0.0f) { // actor is on or below the ground
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags |= 0x80;
2020-03-22 21:19:43 +00:00
if (actor->bgCheckFlags & 0x10) {
if (floorBgId != sCurCeilingBgId) {
if (floorHeightDiff > 15.0f) {
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags |= 0x100;
2020-03-22 21:19:43 +00:00
}
} else {
actor->world.pos.x = actor->prevPos.x;
actor->world.pos.z = actor->prevPos.z;
2020-03-17 04:31:30 +00:00
}
}
actor->world.pos.y = actor->floorHeight;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (actor->velocity.y <= 0.0f) {
if (!(actor->bgCheckFlags & 0x1)) {
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags |= 0x2;
2020-03-22 21:19:43 +00:00
} else if ((arg3 & 0x8) && (actor->gravity < 0.0f)) {
2020-03-17 04:31:30 +00:00
actor->velocity.y = -4.0f;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor->velocity.y = 0.0f;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags |= 0x1;
func_80043334(&globalCtx->colCtx, actor, actor->floorBgId);
2020-03-17 04:31:30 +00:00
}
} else { // actor is above ground
if ((actor->bgCheckFlags & 0x1) && (floorHeightDiff >= -11.0f)) {
func_80043334(&globalCtx->colCtx, actor, actor->floorBgId);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return func_8002E234(actor, floorHeightDiff, arg3);
2020-03-17 04:31:30 +00:00
}
return true;
2020-03-17 04:31:30 +00:00
}
void Actor_UpdateBgCheckInfo(GlobalContext* globalCtx, Actor* actor, f32 wallCheckHeight, f32 wallCheckRadius,
f32 ceilingCheckHeight, s32 flags) {
2020-03-17 04:31:30 +00:00
f32 sp74;
s32 pad;
Vec3f sp64;
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
s32 bgId;
CollisionPoly* wallPoly;
2020-03-17 04:31:30 +00:00
f32 sp58;
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
WaterBox* waterBox;
f32 waterBoxYSurface;
Vec3f ripplePos;
2020-03-17 04:31:30 +00:00
sp74 = actor->world.pos.y - actor->prevPos.y;
2020-03-17 04:31:30 +00:00
if ((actor->floorBgId != BGCHECK_SCENE) && (actor->bgCheckFlags & 1)) {
func_800433A4(&globalCtx->colCtx, actor->floorBgId, actor);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if (flags & 1) {
if ((!(flags & 0x80) &&
BgCheck_EntitySphVsWall3(&globalCtx->colCtx, &sp64, &actor->world.pos, &actor->prevPos, wallCheckRadius,
&actor->wallPoly, &bgId, actor, wallCheckHeight)) ||
((flags & 0x80) &&
BgCheck_EntitySphVsWall4(&globalCtx->colCtx, &sp64, &actor->world.pos, &actor->prevPos, wallCheckRadius,
&actor->wallPoly, &bgId, actor, wallCheckHeight))) {
wallPoly = actor->wallPoly;
Math_Vec3f_Copy(&actor->world.pos, &sp64);
actor->wallYaw = Math_Atan2S(wallPoly->normal.z, wallPoly->normal.x);
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags |= 8;
actor->wallBgId = bgId;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags &= ~8;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
sp64.x = actor->world.pos.x;
sp64.z = actor->world.pos.z;
2020-03-17 04:31:30 +00:00
if (flags & 2) {
sp64.y = actor->prevPos.y + 10.0f;
if (BgCheck_EntityCheckCeiling(&globalCtx->colCtx, &sp58, &sp64, (ceilingCheckHeight + sp74) - 10.0f,
&sCurCeilingPoly, &sCurCeilingBgId, actor)) {
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags |= 0x10;
actor->world.pos.y = (sp58 + sp74) - 10.0f;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags &= ~0x10;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
if (flags & 4) {
sp64.y = actor->prevPos.y;
func_8002E2AC(globalCtx, actor, &sp64, flags);
waterBoxYSurface = actor->world.pos.y;
if (WaterBox_GetSurface1(globalCtx, &globalCtx->colCtx, actor->world.pos.x, actor->world.pos.z,
&waterBoxYSurface, &waterBox)) {
actor->yDistToWater = waterBoxYSurface - actor->world.pos.y;
if (actor->yDistToWater < 0.0f) {
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags &= ~0x60;
2020-03-22 21:19:43 +00:00
} else {
if (!(actor->bgCheckFlags & 0x20)) {
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags |= 0x40;
if (!(flags & 0x40)) {
ripplePos.x = actor->world.pos.x;
ripplePos.y = waterBoxYSurface;
ripplePos.z = actor->world.pos.z;
EffectSsGRipple_Spawn(globalCtx, &ripplePos, 100, 500, 0);
EffectSsGRipple_Spawn(globalCtx, &ripplePos, 100, 500, 4);
EffectSsGRipple_Spawn(globalCtx, &ripplePos, 100, 500, 8);
2020-03-17 04:31:30 +00:00
}
}
actor->bgCheckFlags |= 0x20;
}
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor->bgCheckFlags &= ~0x60;
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
actor->yDistToWater = BGCHECK_Y_MIN;
2020-03-17 04:31:30 +00:00
}
}
}
Mtx D_8015BBA8;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
Gfx* func_8002E830(Vec3f* object, Vec3f* eye, Vec3f* lightDir, GraphicsContext* gfxCtx, Gfx* gfx, Hilite** hilite) {
LookAt* lookAt;
2020-03-17 04:31:30 +00:00
f32 correctedEyeX;
lookAt = Graph_Alloc(gfxCtx, sizeof(LookAt));
2020-03-17 04:31:30 +00:00
correctedEyeX = (eye->x == object->x) && (eye->z == object->z) ? eye->x + 0.001f : eye->x;
*hilite = Graph_Alloc(gfxCtx, sizeof(Hilite));
2020-03-22 21:19:43 +00:00
if (HREG(80) == 6) {
2020-10-13 16:32:19 +00:00
osSyncPrintf("z_actor.c 3529 eye=[%f(%f) %f %f] object=[%f %f %f] light_direction=[%f %f %f]\n", correctedEyeX,
eye->x, eye->y, eye->z, object->x, object->y, object->z, lightDir->x, lightDir->y, lightDir->z);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
func_800ABE74(correctedEyeX, eye->y, eye->z);
guLookAtHilite(&D_8015BBA8, lookAt, *hilite, correctedEyeX, eye->y, eye->z, object->x, object->y, object->z, 0.0f,
1.0f, 0.0f, lightDir->x, lightDir->y, lightDir->z, lightDir->x, lightDir->y, lightDir->z, 0x10,
0x10);
2020-03-17 04:31:30 +00:00
gSPLookAt(gfx++, lookAt);
gDPSetHilite1Tile(gfx++, 1, *hilite, 0x10, 0x10);
return gfx;
}
2020-03-22 21:19:43 +00:00
Hilite* func_8002EABC(Vec3f* object, Vec3f* eye, Vec3f* lightDir, GraphicsContext* gfxCtx) {
2020-03-17 04:31:30 +00:00
Hilite* hilite;
OPEN_DISPS(gfxCtx, "../z_actor.c", 4306);
POLY_OPA_DISP = func_8002E830(object, eye, lightDir, gfxCtx, POLY_OPA_DISP, &hilite);
CLOSE_DISPS(gfxCtx, "../z_actor.c", 4313);
2020-03-17 04:31:30 +00:00
return hilite;
}
2020-03-22 21:19:43 +00:00
Hilite* func_8002EB44(Vec3f* object, Vec3f* eye, Vec3f* lightDir, GraphicsContext* gfxCtx) {
2020-03-17 04:31:30 +00:00
Hilite* hilite;
OPEN_DISPS(gfxCtx, "../z_actor.c", 4332);
POLY_XLU_DISP = func_8002E830(object, eye, lightDir, gfxCtx, POLY_XLU_DISP, &hilite);
CLOSE_DISPS(gfxCtx, "../z_actor.c", 4339);
2020-03-17 04:31:30 +00:00
return hilite;
}
2020-03-22 21:19:43 +00:00
void func_8002EBCC(Actor* actor, GlobalContext* globalCtx, s32 flag) {
2020-03-17 04:31:30 +00:00
Hilite* hilite;
Vec3f lightDir;
Gfx* displayListHead;
Gfx* displayList;
lightDir.x = globalCtx->envCtx.unk_2A;
lightDir.y = globalCtx->envCtx.unk_2B;
lightDir.z = globalCtx->envCtx.unk_2C;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (HREG(80) == 6) {
2020-10-13 16:32:19 +00:00
osSyncPrintf("z_actor.c 3637 game_play->view.eye=[%f(%f) %f %f]\n", globalCtx->view.eye.x,
globalCtx->view.eye.y, globalCtx->view.eye.z);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
hilite = func_8002EABC(&actor->world.pos, &globalCtx->view.eye, &lightDir, globalCtx->state.gfxCtx);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (flag != 0) {
2020-03-17 04:31:30 +00:00
displayList = Graph_Alloc(globalCtx->state.gfxCtx, 2 * sizeof(Gfx));
displayListHead = displayList;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 4384);
2020-03-17 04:31:30 +00:00
gDPSetHilite1Tile(displayListHead++, 1, hilite, 0x10, 0x10);
gSPEndDisplayList(displayListHead);
gSPSegment(POLY_OPA_DISP++, 0x07, displayList);
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 4394);
2020-03-17 04:31:30 +00:00
}
}
2020-03-22 21:19:43 +00:00
void func_8002ED80(Actor* actor, GlobalContext* globalCtx, s32 flag) {
2020-03-17 04:31:30 +00:00
Hilite* hilite;
Vec3f lightDir;
Gfx* displayListHead;
Gfx* displayList;
lightDir.x = globalCtx->envCtx.unk_2A;
lightDir.y = globalCtx->envCtx.unk_2B;
lightDir.z = globalCtx->envCtx.unk_2C;
2020-03-17 04:31:30 +00:00
hilite = func_8002EB44(&actor->world.pos, &globalCtx->view.eye, &lightDir, globalCtx->state.gfxCtx);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (flag != 0) {
2020-03-17 04:31:30 +00:00
displayList = Graph_Alloc(globalCtx->state.gfxCtx, 2 * sizeof(Gfx));
displayListHead = displayList;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 4429);
2020-03-17 04:31:30 +00:00
gDPSetHilite1Tile(displayListHead++, 1, hilite, 0x10, 0x10);
gSPEndDisplayList(displayListHead);
gSPSegment(POLY_XLU_DISP++, 0x07, displayList);
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 4439);
2020-03-17 04:31:30 +00:00
}
}
PosRot* Actor_GetFocus(PosRot* dest, Actor* actor) {
*dest = actor->focus;
2020-03-17 04:31:30 +00:00
return dest;
2020-03-17 04:31:30 +00:00
}
PosRot* Actor_GetWorld(PosRot* dest, Actor* actor) {
*dest = actor->world;
2020-03-17 04:31:30 +00:00
return dest;
2020-03-17 04:31:30 +00:00
}
PosRot* Actor_GetWorldPosShapeRot(PosRot* arg0, Actor* actor) {
2020-03-17 04:31:30 +00:00
PosRot sp1C;
Math_Vec3f_Copy(&sp1C.pos, &actor->world.pos);
2020-03-17 04:31:30 +00:00
sp1C.rot = actor->shape.rot;
*arg0 = sp1C;
return arg0;
}
2020-03-22 21:19:43 +00:00
f32 func_8002EFC0(Actor* actor, Player* player, s16 arg2) {
s16 yawTemp = (s16)(actor->yawTowardsPlayer - 0x8000) - arg2;
s16 yawTempAbs = ABS(yawTemp);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (player->unk_664 != NULL) {
if ((yawTempAbs > 0x4000) || (actor->flags & 0x8000000)) {
2020-03-17 04:31:30 +00:00
return FLT_MAX;
2020-03-23 23:11:21 +00:00
} else {
f32 ret =
actor->xyzDistToPlayerSq - actor->xyzDistToPlayerSq * 0.8f * ((0x4000 - yawTempAbs) * (1.0f / 0x8000));
return ret;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
}
if (yawTempAbs > 0x2AAA) {
2020-03-17 04:31:30 +00:00
return FLT_MAX;
2020-03-23 23:11:21 +00:00
}
2020-03-17 04:31:30 +00:00
return actor->xyzDistToPlayerSq;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
typedef struct {
/* 0x0 */ f32 rangeSq;
/* 0x4 */ f32 leashScale;
} TargetRangeParams; // size = 0x8
2020-03-17 04:31:30 +00:00
#define TARGET_RANGE(range, leash) \
{ SQ(range), (f32)range / leash }
TargetRangeParams D_80115FF8[] = {
TARGET_RANGE(70, 140), TARGET_RANGE(170, 255), TARGET_RANGE(280, 5600), TARGET_RANGE(350, 525),
TARGET_RANGE(700, 1050), TARGET_RANGE(1000, 1500), TARGET_RANGE(100, 105.36842), TARGET_RANGE(140, 163.33333),
TARGET_RANGE(240, 576), TARGET_RANGE(280, 280000),
2020-03-17 04:31:30 +00:00
};
2020-03-22 21:19:43 +00:00
u32 func_8002F090(Actor* actor, f32 arg1) {
return arg1 < D_80115FF8[actor->targetMode].rangeSq;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_8002F0C8(Actor* actor, Player* player, s32 flag) {
if ((actor->update == NULL) || !(actor->flags & 1)) {
return true;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (!flag) {
s16 var = (s16)(actor->yawTowardsPlayer - 0x8000) - player->actor.shape.rot.y;
s16 abs_var = ABS(var);
f32 dist;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((player->unk_664 == NULL) && (abs_var > 0x2AAA)) {
2020-03-17 04:31:30 +00:00
dist = FLT_MAX;
2020-03-22 21:19:43 +00:00
} else {
dist = actor->xyzDistToPlayerSq;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return !func_8002F090(actor, D_80115FF8[actor->targetMode].leashScale * dist);
2020-03-17 04:31:30 +00:00
}
return false;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
u32 func_8002F194(Actor* actor, GlobalContext* globalCtx) {
if (actor->flags & 0x100) {
2020-03-17 04:31:30 +00:00
actor->flags &= ~0x100;
return true;
2020-03-17 04:31:30 +00:00
}
return false;
2020-03-17 04:31:30 +00:00
}
s32 func_8002F1C4(Actor* actor, GlobalContext* globalCtx, f32 arg2, f32 arg3, u32 exchangeItemId) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
// This is convoluted but it seems like it must be a single if statement to match
if ((player->actor.flags & 0x100) || ((exchangeItemId != EXCH_ITEM_NONE) && Player_InCsMode(globalCtx)) ||
(!actor->isTargeted &&
((arg3 < fabsf(actor->yDistToPlayer)) || (player->targetActorDistance < actor->xzDistToPlayer) ||
(arg2 < actor->xzDistToPlayer)))) {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
player->targetActor = actor;
player->targetActorDistance = actor->xzDistToPlayer;
player->exchangeItemId = exchangeItemId;
2020-03-17 04:31:30 +00:00
return true;
2020-03-17 04:31:30 +00:00
}
s32 func_8002F298(Actor* actor, GlobalContext* globalCtx, f32 arg2, u32 exchangeItemId) {
return func_8002F1C4(actor, globalCtx, arg2, arg2, exchangeItemId);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_8002F2CC(Actor* actor, GlobalContext* globalCtx, f32 arg2) {
return func_8002F298(actor, globalCtx, arg2, EXCH_ITEM_NONE);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_8002F2F4(Actor* actor, GlobalContext* globalCtx) {
f32 var1 = 50.0f + actor->colChkInfo.cylRadius;
2020-03-17 04:31:30 +00:00
return func_8002F2CC(actor, globalCtx, var1);
}
2020-03-22 21:19:43 +00:00
u32 func_8002F334(Actor* actor, GlobalContext* globalCtx) {
if (func_8010BDBC(&globalCtx->msgCtx) == 2) {
return true;
2020-03-22 21:19:43 +00:00
} else {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s8 func_8002F368(GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
2020-03-17 04:31:30 +00:00
return player->exchangeItemId;
}
void func_8002F374(GlobalContext* globalCtx, Actor* actor, s16* x, s16* y) {
2020-03-17 04:31:30 +00:00
Vec3f sp1C;
f32 sp18;
func_8002BE04(globalCtx, &actor->focus.pos, &sp1C, &sp18);
*x = sp1C.x * sp18 * 160.0f + 160.0f;
*y = sp1C.y * sp18 * -120.0f + 120.0f;
2020-03-17 04:31:30 +00:00
}
u32 Actor_HasParent(Actor* actor, GlobalContext* globalCtx) {
if (actor->parent != NULL) {
return true;
2020-03-22 21:19:43 +00:00
} else {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_8002F434(Actor* actor, GlobalContext* globalCtx, s32 getItemId, f32 xzRange, f32 yRange) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
if (!(player->stateFlags1 & 0x3C7080) && Player_GetExplosiveHeld(player) < 0) {
if ((((player->heldActor != NULL) || (actor == player->targetActor)) && (getItemId > GI_NONE) &&
(getItemId < GI_MAX)) ||
2020-03-22 21:19:43 +00:00
(!(player->stateFlags1 & 0x20000800))) {
if ((actor->xzDistToPlayer < xzRange) && (fabsf(actor->yDistToPlayer) < yRange)) {
s16 yawDiff = actor->yawTowardsPlayer - player->actor.shape.rot.y;
s32 absYawDiff = ABS(yawDiff);
if ((getItemId != GI_NONE) || (player->getItemDirection < absYawDiff)) {
2020-03-17 04:31:30 +00:00
player->getItemId = getItemId;
player->interactRangeActor = actor;
player->getItemDirection = absYawDiff;
return true;
2020-03-17 04:31:30 +00:00
}
}
}
}
return false;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002F554(Actor* actor, GlobalContext* globalCtx, s32 getItemId) {
2020-03-17 04:31:30 +00:00
func_8002F434(actor, globalCtx, getItemId, 50.0f, 10.0f);
}
2020-03-22 21:19:43 +00:00
void func_8002F580(Actor* actor, GlobalContext* globalCtx) {
func_8002F554(actor, globalCtx, GI_NONE);
2020-03-17 04:31:30 +00:00
}
u32 Actor_HasNoParent(Actor* actor, GlobalContext* globalCtx) {
if (actor->parent == NULL) {
return true;
2020-03-22 21:19:43 +00:00
} else {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002F5C4(Actor* actorA, Actor* actorB, GlobalContext* globalCtx) {
Actor* parent = actorA->parent;
2020-03-17 04:31:30 +00:00
if (parent->id == ACTOR_PLAYER) {
Player* player = (Player*)parent;
2020-03-17 04:31:30 +00:00
player->heldActor = actorB;
player->interactRangeActor = actorB;
}
parent->child = actorB;
actorB->parent = parent;
actorA->parent = NULL;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002F5F0(Actor* actor, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
if (actor->xyzDistToPlayerSq < player->unk_6A4) {
player->unk_6A4 = actor->xyzDistToPlayerSq;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
s32 Actor_IsMounted(GlobalContext* globalCtx, Actor* horse) {
if (horse->child != NULL) {
return true;
2020-03-22 21:19:43 +00:00
} else {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
u32 Actor_SetRideActor(GlobalContext* globalCtx, Actor* horse, s32 mountSide) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
2020-03-22 21:19:43 +00:00
if (!(player->stateFlags1 & 0x003C7880)) {
player->rideActor = horse;
player->mountSide = mountSide;
return true;
2020-03-17 04:31:30 +00:00
}
return false;
2020-03-17 04:31:30 +00:00
}
s32 Actor_NotMounted(GlobalContext* globalCtx, Actor* horse) {
if (horse->child == NULL) {
return true;
2020-03-22 21:19:43 +00:00
} else {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
void func_8002F698(GlobalContext* globalCtx, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5, u32 arg6) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
2020-03-17 04:31:30 +00:00
player->unk_8A0 = arg6;
player->unk_8A1 = arg5;
player->unk_8A2 = arg3;
player->unk_8A4 = arg2;
player->unk_8A8 = arg4;
}
void func_8002F6D4(GlobalContext* globalCtx, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5) {
func_8002F698(globalCtx, actor, arg2, arg3, arg4, 2, arg5);
2020-03-17 04:31:30 +00:00
}
void func_8002F71C(GlobalContext* globalCtx, Actor* actor, f32 arg2, s16 arg3, f32 arg4) {
func_8002F6D4(globalCtx, actor, arg2, arg3, arg4, 0);
2020-03-17 04:31:30 +00:00
}
void func_8002F758(GlobalContext* globalCtx, Actor* actor, f32 arg2, s16 arg3, f32 arg4, u32 arg5) {
func_8002F698(globalCtx, actor, arg2, arg3, arg4, 1, arg5);
2020-03-17 04:31:30 +00:00
}
void func_8002F7A0(GlobalContext* globalCtx, Actor* actor, f32 arg2, s16 arg3, f32 arg4) {
func_8002F758(globalCtx, actor, arg2, arg3, arg4, 0);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002F7DC(Actor* actor, u16 sfxId) {
Audio_PlaySoundGeneral(sfxId, &actor->projectedPos, 4, &D_801333E0, &D_801333E0, &D_801333E8);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void Audio_PlayActorSound2(Actor* actor, u16 sfxId) {
func_80078914(&actor->projectedPos, sfxId);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002F850(GlobalContext* globalCtx, Actor* actor) {
2020-03-17 04:31:30 +00:00
s32 sfxId;
2020-03-22 21:19:43 +00:00
if (actor->bgCheckFlags & 0x20) {
if (actor->yDistToWater < 20.0f) {
sfxId = NA_SE_PL_WALK_WATER0 - SFX_FLAG;
2020-03-22 21:19:43 +00:00
} else {
sfxId = NA_SE_PL_WALK_WATER1 - SFX_FLAG;
2020-03-22 21:19:43 +00:00
}
} else {
sfxId = SurfaceType_GetSfx(&globalCtx->colCtx, actor->floorPoly, actor->floorBgId);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
func_80078914(&actor->projectedPos, NA_SE_EV_BOMB_BOUND);
func_80078914(&actor->projectedPos, sfxId + SFX_FLAG);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8002F8F0(Actor* actor, u16 sfxId) {
actor->sfx = sfxId;
2020-03-17 04:31:30 +00:00
actor->flags |= 0x80000;
actor->flags &= ~0x10300000;
}
2020-03-22 21:19:43 +00:00
void func_8002F91C(Actor* actor, u16 sfxId) {
actor->sfx = sfxId;
2020-03-17 04:31:30 +00:00
actor->flags |= 0x100000;
actor->flags &= ~0x10280000;
}
2020-03-22 21:19:43 +00:00
void func_8002F948(Actor* actor, u16 sfxId) {
actor->sfx = sfxId;
2020-03-17 04:31:30 +00:00
actor->flags |= 0x200000;
actor->flags &= ~0x10180000;
}
2020-03-22 21:19:43 +00:00
void func_8002F974(Actor* actor, u16 sfxId) {
2020-03-17 04:31:30 +00:00
actor->flags &= ~0x10380000;
actor->sfx = sfxId;
2020-03-17 04:31:30 +00:00
}
void func_8002F994(Actor* actor, s32 arg1) {
2020-03-17 04:31:30 +00:00
actor->flags |= 0x10000000;
actor->flags &= ~0x00380000;
if (arg1 < 40) {
actor->sfx = NA_SE_PL_WALK_DIRT - SFX_FLAG;
} else if (arg1 < 100) {
actor->sfx = NA_SE_PL_WALK_CONCRETE - SFX_FLAG;
2020-03-22 21:19:43 +00:00
} else {
actor->sfx = NA_SE_PL_WALK_SAND - SFX_FLAG;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
// Tests if something hit Jabu Jabu surface, displaying hit splash and playing sfx if true
s32 func_8002F9EC(GlobalContext* globalCtx, Actor* actor, CollisionPoly* poly, s32 bgId, Vec3f* pos) {
if (func_80041D4C(&globalCtx->colCtx, poly, bgId) == 8) {
globalCtx->roomCtx.unk_74[0] = 1;
CollisionCheck_BlueBlood(globalCtx, NULL, pos);
2020-03-17 04:31:30 +00:00
Audio_PlayActorSound2(actor, NA_SE_IT_WALL_HIT_BUYO);
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
return true;
2020-03-17 04:31:30 +00:00
}
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
return false;
2020-03-17 04:31:30 +00:00
}
// Local data used for Farore's Wind light (stored in BSS, possibly a struct?)
LightInfo D_8015BC00;
LightNode* D_8015BC10;
2020-03-17 04:31:30 +00:00
s32 D_8015BC14;
f32 D_8015BC18;
2020-03-22 21:19:43 +00:00
void func_8002FA60(GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Vec3f lightPos;
2020-03-22 21:19:43 +00:00
if (gSaveContext.fw.set) {
2020-03-17 04:31:30 +00:00
gSaveContext.respawn[RESPAWN_MODE_TOP].data = 0x28;
gSaveContext.respawn[RESPAWN_MODE_TOP].pos.x = gSaveContext.fw.pos.x;
gSaveContext.respawn[RESPAWN_MODE_TOP].pos.y = gSaveContext.fw.pos.y;
gSaveContext.respawn[RESPAWN_MODE_TOP].pos.z = gSaveContext.fw.pos.z;
2020-03-17 04:31:30 +00:00
gSaveContext.respawn[RESPAWN_MODE_TOP].yaw = gSaveContext.fw.yaw;
gSaveContext.respawn[RESPAWN_MODE_TOP].playerParams = gSaveContext.fw.playerParams;
gSaveContext.respawn[RESPAWN_MODE_TOP].entranceIndex = gSaveContext.fw.entranceIndex;
gSaveContext.respawn[RESPAWN_MODE_TOP].roomIndex = gSaveContext.fw.roomIndex;
gSaveContext.respawn[RESPAWN_MODE_TOP].tempSwchFlags = gSaveContext.fw.tempSwchFlags;
gSaveContext.respawn[RESPAWN_MODE_TOP].tempCollectFlags = gSaveContext.fw.tempCollectFlags;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
gSaveContext.respawn[RESPAWN_MODE_TOP].data = 0;
gSaveContext.respawn[RESPAWN_MODE_TOP].pos.x = 0.0f;
gSaveContext.respawn[RESPAWN_MODE_TOP].pos.y = 0.0f;
gSaveContext.respawn[RESPAWN_MODE_TOP].pos.z = 0.0f;
}
lightPos.x = gSaveContext.respawn[RESPAWN_MODE_TOP].pos.x;
lightPos.y = gSaveContext.respawn[RESPAWN_MODE_TOP].pos.y + 80.0f;
lightPos.z = gSaveContext.respawn[RESPAWN_MODE_TOP].pos.z;
Lights_PointNoGlowSetInfo(&D_8015BC00, lightPos.x, lightPos.y, lightPos.z, 0xFF, 0xFF, 0xFF, -1);
2020-03-17 04:31:30 +00:00
D_8015BC10 = LightContext_InsertLight(globalCtx, &globalCtx->lightCtx, &D_8015BC00);
2020-03-17 04:31:30 +00:00
D_8015BC14 = 0;
D_8015BC18 = 0.0f;
}
#ifdef NON_MATCHING
// some regalloc and odd loading of gSaveContext
2020-03-22 21:19:43 +00:00
void func_8002FBAC(GlobalContext* globalCtx) {
static Vec3f D_80116048 = { 0.0f, -0.05f, 0.0f };
static Vec3f D_80116054 = { 0.0f, -0.025f, 0.0f };
static Color_RGBA8 D_80116060 = { 255, 255, 255, 0 };
static Color_RGBA8 D_80116064 = { 100, 200, 0, 0 };
Vec3f* temp = &gSaveContext.respawn[RESPAWN_MODE_TOP].pos;
s32 spF0;
2020-03-17 04:31:30 +00:00
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 5308);
2020-03-17 04:31:30 +00:00
spF0 = gSaveContext.respawn[RESPAWN_MODE_TOP].data;
2020-03-17 04:31:30 +00:00
if (spF0 != 0) {
f32 spD8 = LINK_IS_ADULT ? 80.0f : 60.0f;
f32 spD4 = 1.0f;
s32 spD0 = 0xFF;
s32 spCC = spF0 - 40;
s32 temp2;
s32 pad;
2020-03-17 04:31:30 +00:00
if (spCC < 0) {
gSaveContext.respawn[RESPAWN_MODE_TOP].data = ++spF0;
spD4 = ABS(spF0) * 0.025f;
2020-03-17 04:31:30 +00:00
D_8015BC14 = 60;
D_8015BC18 = 1.0f;
2020-03-22 21:19:43 +00:00
} else if (D_8015BC14 != 0) {
2020-03-17 04:31:30 +00:00
D_8015BC14--;
2020-03-22 21:19:43 +00:00
} else if (D_8015BC18 > 0.0f) {
f32 spC0 = D_8015BC18;
Vec3f spB4;
f32 spB0 = Math_Vec3f_DistXYZAndStoreDiff(&gSaveContext.respawn[RESPAWN_MODE_DOWN].pos, temp, &spB4);
Vec3f spA4;
2020-03-17 04:31:30 +00:00
if (spB0 < 20.0f) {
2020-03-17 04:31:30 +00:00
D_8015BC18 = 0.0f;
Math_Vec3f_Copy(temp, &gSaveContext.respawn[RESPAWN_MODE_DOWN].pos);
2020-03-22 21:19:43 +00:00
} else {
f32 temp_f2;
f32 sp9C = spB0 * (1.0f / D_8015BC18);
f32 phi_f14 = 20.0f / sp9C;
phi_f14 = CLAMP_MIN(phi_f14, 0.05f);
Math_StepToF(&D_8015BC18, 0.0f, phi_f14);
temp_f2 = ((D_8015BC18 / spC0) * spB0) / spB0;
temp->x = gSaveContext.respawn[RESPAWN_MODE_DOWN].pos.x + (spB4.x * temp_f2);
temp->y = gSaveContext.respawn[RESPAWN_MODE_DOWN].pos.y + (spB4.y * temp_f2);
temp->z = gSaveContext.respawn[RESPAWN_MODE_DOWN].pos.z + (spB4.z * temp_f2);
spD8 += sqrtf(SQ(sp9C / 2.0f) - SQ(spB0 - sp9C / 2.0f)) * 0.2f;
2020-03-23 00:38:25 +00:00
osSyncPrintf("-------- DISPLAY Y=%f\n", spD8);
2020-03-17 04:31:30 +00:00
}
spA4.x = temp->x + Rand_CenteredFloat(6.0f);
spA4.y = temp->y + 80.0f + Rand_ZeroOne() * 6.0f;
spA4.z = temp->z + Rand_CenteredFloat(6.0f);
2020-03-17 04:31:30 +00:00
EffectSsKiraKira_SpawnDispersed(globalCtx, &spA4, &D_80116048, &D_80116054, &D_80116060, &D_80116064, 1000,
16);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (D_8015BC18 == 0.0f) {
2020-03-17 04:31:30 +00:00
gSaveContext.respawn[RESPAWN_MODE_TOP] = gSaveContext.respawn[RESPAWN_MODE_DOWN];
gSaveContext.respawn[RESPAWN_MODE_TOP].playerParams = 0x06FF;
gSaveContext.respawn[RESPAWN_MODE_TOP].data = 40;
2020-03-17 04:31:30 +00:00
}
gSaveContext.respawn[RESPAWN_MODE_TOP].pos = *temp;
} else if (spCC > 0) {
if (spCC * 0.1f < 1.0f) {
s32 pad2;
s32 pad3;
f32 temp3;
f32 temp4;
Vec3f sp7C;
Vec3f sp70;
2020-03-17 04:31:30 +00:00
sp7C.x = globalCtx->view.eye.x;
sp7C.y = globalCtx->view.eye.y - spD8;
sp7C.z = globalCtx->view.eye.z;
temp4 = Math_Vec3f_DistXYZAndStoreDiff(&sp7C, temp, &sp70);
temp3 = (((1.0f - spCC * 0.1f) / (1.0f - ((f32)(spCC - 1) * 0.1f))) * temp4) / temp4;
temp->x = sp70.x * temp3 + sp7C.x;
temp->y = sp70.y * temp3 + sp7C.y;
temp->z = sp70.z * temp3 + sp7C.z;
2020-03-17 04:31:30 +00:00
gSaveContext.respawn[RESPAWN_MODE_TOP].pos = *temp;
}
2020-03-17 04:31:30 +00:00
spD0 = 0xFF - 30 * spCC;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (spD0 < 0) {
2020-03-17 04:31:30 +00:00
gSaveContext.fw.set = 0;
gSaveContext.respawn[RESPAWN_MODE_TOP].data = 0;
spD0 = 0;
2020-03-22 21:19:43 +00:00
} else {
gSaveContext.respawn[RESPAWN_MODE_TOP].data = ++spF0;
2020-03-17 04:31:30 +00:00
}
spD4 = (f32)spCC * 0.2 + 1.0f;
2020-03-17 04:31:30 +00:00
}
if (globalCtx->csCtx.state == CS_STATE_IDLE) {
temp2 = gSaveContext.respawn[RESPAWN_MODE_TOP].entranceIndex;
if ((temp2 == gSaveContext.entranceIndex) &&
(globalCtx->roomCtx.curRoom.num == gSaveContext.respawn[RESPAWN_MODE_TOP].roomIndex)) {
f32 phi_f10;
f32 phi_f6;
2020-03-17 04:31:30 +00:00
POLY_XLU_DISP = Gfx_CallSetupDL(POLY_XLU_DISP, 0x19);
// bad gSaveContext load here
Matrix_Translate(temp->x, temp->y + spD8, temp->z, MTXMODE_NEW);
Matrix_Scale(0.025f * spD4, 0.025f * spD4, 0.025f * spD4, MTXMODE_APPLY);
Matrix_Mult(&globalCtx->mf_11DA0, MTXMODE_APPLY);
Matrix_Push();
2020-03-17 04:31:30 +00:00
gDPPipeSync(POLY_XLU_DISP++);
gDPSetPrimColor(POLY_XLU_DISP++, 0x80, 0x80, 255, 255, 200, spD0);
gDPSetEnvColor(POLY_XLU_DISP++, 100, 200, 0, 255);
2020-03-17 04:31:30 +00:00
phi_f10 = (globalCtx->gameplayFrames * 1500) & 0xFFFF;
Matrix_RotateZ((phi_f10 * M_PI) / 32768.0f, MTXMODE_APPLY);
2020-03-17 04:31:30 +00:00
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_actor.c", 5458),
G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_XLU_DISP++, &gEffFlash1DL);
2020-03-17 04:31:30 +00:00
Matrix_Pop();
phi_f6 = ~((globalCtx->gameplayFrames * 1200) & 0xFFFF);
Matrix_RotateZ((phi_f6 * M_PI) / 32768.0f, MTXMODE_APPLY);
2020-03-17 04:31:30 +00:00
gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_actor.c", 5463),
G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_XLU_DISP++, &gEffFlash1DL);
}
{
Vec3f lightPos;
2020-03-17 04:31:30 +00:00
lightPos.x = gSaveContext.respawn[RESPAWN_MODE_TOP].pos.x;
lightPos.y = gSaveContext.respawn[RESPAWN_MODE_TOP].pos.y + spD8;
lightPos.z = gSaveContext.respawn[RESPAWN_MODE_TOP].pos.z;
2020-03-17 04:31:30 +00:00
Lights_PointNoGlowSetInfo(&D_8015BC00, lightPos.x, lightPos.y, lightPos.z, 0xFF, 0xFF, 0xFF,
500.0f * spD4);
}
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 5474);
}
2020-03-17 04:31:30 +00:00
}
}
#else
static Vec3f D_80116048 = { 0.0f, -0.05f, 0.0f };
static Vec3f D_80116054 = { 0.0f, -0.025f, 0.0f };
static Color_RGBA8 D_80116060 = { 255, 255, 255, 0 };
static Color_RGBA8 D_80116064 = { 100, 200, 0, 0 };
2020-03-17 04:31:30 +00:00
#pragma GLOBAL_ASM("asm/non_matchings/code/z_actor/func_8002FBAC.s")
#endif
2020-03-22 21:19:43 +00:00
void func_80030488(GlobalContext* globalCtx) {
LightContext_RemoveLight(globalCtx, &globalCtx->lightCtx, D_8015BC10);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_800304B0(GlobalContext* globalCtx) {
if (globalCtx->actorCtx.unk_03 != 0) {
2020-03-17 04:31:30 +00:00
globalCtx->actorCtx.unk_03 = 0;
func_800876C8(globalCtx);
}
}
// Actor_InitContext
2020-03-22 21:19:43 +00:00
void func_800304DC(GlobalContext* globalCtx, ActorContext* actorCtx, ActorEntry* actorEntry) {
2020-03-17 04:31:30 +00:00
ActorOverlay* overlayEntry;
SavedSceneFlags* savedSceneFlags;
2020-03-17 04:31:30 +00:00
s32 i;
savedSceneFlags = &gSaveContext.sceneFlags[globalCtx->sceneNum];
2020-03-17 04:31:30 +00:00
bzero(actorCtx, sizeof(*actorCtx));
ActorOverlayTable_Init();
Matrix_MtxFCopy(&globalCtx->mf_11DA0, &gMtxFClear);
Matrix_MtxFCopy(&globalCtx->mf_11D60, &gMtxFClear);
overlayEntry = &gActorOverlayTable[0];
2020-03-22 21:19:43 +00:00
for (i = 0; i < ARRAY_COUNT(gActorOverlayTable); i++) {
2020-03-17 04:31:30 +00:00
overlayEntry->loadedRamAddr = NULL;
overlayEntry->numLoaded = 0;
2020-03-17 04:31:30 +00:00
overlayEntry++;
}
actorCtx->flags.chest = savedSceneFlags->chest;
actorCtx->flags.swch = savedSceneFlags->swch;
actorCtx->flags.clear = savedSceneFlags->clear;
actorCtx->flags.collect = savedSceneFlags->collect;
2020-03-17 04:31:30 +00:00
func_8002CDE4(globalCtx, &actorCtx->titleCtx);
actorCtx->absoluteSpace = NULL;
Actor_SpawnEntry(actorCtx, actorEntry, globalCtx);
func_8002C0C0(&actorCtx->targetCtx, actorCtx->actorLists[ACTORCAT_PLAYER].head, globalCtx);
2020-03-17 04:31:30 +00:00
func_8002FA60(globalCtx);
}
2020-03-22 21:19:43 +00:00
u32 D_80116068[] = {
0x100000C0, 0x100000C0, 0x00000000, 0x100004C0, 0x00000080, 0x300000C0,
0x10000080, 0x00000000, 0x300000C0, 0x100004C0, 0x00000000, 0x100000C0,
2020-03-17 04:31:30 +00:00
};
2020-03-22 21:19:43 +00:00
void Actor_UpdateAll(GlobalContext* globalCtx, ActorContext* actorCtx) {
2020-03-17 04:31:30 +00:00
Actor* refActor;
Actor* actor;
Player* player;
u32* sp80;
u32 unkFlag;
u32 unkCondition;
Actor* sp74;
ActorEntry* actorEntry;
s32 i;
player = PLAYER;
2020-03-22 21:19:43 +00:00
if (0) {
// This ASSERT is optimized out but it exists due to its presence in rodata
ASSERT(gMaxActorId == ACTOR_ID_MAX, "MaxProfile == ACTOR_DLF_MAX", "../z_actor.c", UNK_LINE);
2020-03-17 04:31:30 +00:00
}
sp74 = NULL;
unkFlag = 0;
if (globalCtx->numSetupActors != 0) {
2020-03-17 04:31:30 +00:00
actorEntry = &globalCtx->setupActorList[0];
for (i = 0; i < globalCtx->numSetupActors; i++) {
2020-03-17 04:31:30 +00:00
Actor_SpawnEntry(&globalCtx->actorCtx, actorEntry++, globalCtx);
2020-03-22 21:19:43 +00:00
}
globalCtx->numSetupActors = 0;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (actorCtx->unk_02 != 0) {
2020-03-17 04:31:30 +00:00
actorCtx->unk_02--;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (KREG(0) == -100) {
2020-03-17 04:31:30 +00:00
refActor = &PLAYER->actor;
KREG(0) = 0;
Actor_Spawn(&globalCtx->actorCtx, globalCtx, ACTOR_EN_CLEAR_TAG, refActor->world.pos.x,
refActor->world.pos.y + 100.0f, refActor->world.pos.z, 0, 0, 0, 1);
2020-03-17 04:31:30 +00:00
}
sp80 = &D_80116068[0];
2020-03-22 21:19:43 +00:00
if (player->stateFlags2 & 0x8000000) {
2020-03-17 04:31:30 +00:00
unkFlag = 0x2000000;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((player->stateFlags1 & 0x40) && ((player->actor.textId & 0xFF00) != 0x600)) {
sp74 = player->targetActor;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
for (i = 0; i < ARRAY_COUNT(actorCtx->actorLists); i++, sp80++) {
2020-03-17 04:31:30 +00:00
unkCondition = (*sp80 & player->stateFlags1);
actor = actorCtx->actorLists[i].head;
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
if (actor->world.pos.y < -25000.0f) {
actor->world.pos.y = -25000.0f;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actor->sfx = 0;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (actor->init != NULL) {
if (Object_IsLoaded(&globalCtx->objectCtx, actor->objBankIndex)) {
2020-03-17 04:31:30 +00:00
Actor_SetObjectDependency(globalCtx, actor);
actor->init(actor, globalCtx);
actor->init = NULL;
}
actor = actor->next;
2020-03-22 21:19:43 +00:00
} else if (!Object_IsLoaded(&globalCtx->objectCtx, actor->objBankIndex)) {
2020-03-17 04:31:30 +00:00
Actor_Kill(actor);
actor = actor->next;
2020-03-22 21:19:43 +00:00
} else if ((unkFlag && !(actor->flags & unkFlag)) ||
(!unkFlag && unkCondition && (sp74 != actor) && (actor != player->naviActor) &&
(actor != player->heldActor) && (&player->actor != actor->parent))) {
CollisionCheck_ResetDamage(&actor->colChkInfo);
2020-03-17 04:31:30 +00:00
actor = actor->next;
2020-03-22 21:19:43 +00:00
} else if (actor->update == NULL) {
if (!actor->isDrawn) {
2020-03-17 04:31:30 +00:00
actor = Actor_Delete(&globalCtx->actorCtx, actor, globalCtx);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Actor_Destroy(actor, globalCtx);
actor = actor->next;
}
2020-03-22 21:19:43 +00:00
} else {
Math_Vec3f_Copy(&actor->prevPos, &actor->world.pos);
actor->xzDistToPlayer = Actor_WorldDistXZToActor(actor, &player->actor);
actor->yDistToPlayer = Actor_HeightDiff(actor, &player->actor);
actor->xyzDistToPlayerSq = SQ(actor->xzDistToPlayer) + SQ(actor->yDistToPlayer);
2020-03-17 04:31:30 +00:00
actor->yawTowardsPlayer = Actor_WorldYawTowardActor(actor, &player->actor);
2020-03-17 04:31:30 +00:00
actor->flags &= ~0x1000000;
if ((DECR(actor->freezeTimer) == 0) && (actor->flags & 0x50)) {
2020-03-22 21:19:43 +00:00
if (actor == player->unk_664) {
actor->isTargeted = true;
2020-03-22 21:19:43 +00:00
} else {
actor->isTargeted = false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if ((actor->targetPriority != 0) && (player->unk_664 == NULL)) {
actor->targetPriority = 0;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
Actor_SetObjectDependency(globalCtx, actor);
if (actor->colorFilterTimer != 0) {
actor->colorFilterTimer--;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actor->update(actor, globalCtx);
func_8003F8EC(globalCtx, &globalCtx->colCtx.dyna, actor);
}
CollisionCheck_ResetDamage(&actor->colChkInfo);
2020-03-17 04:31:30 +00:00
actor = actor->next;
}
}
if (i == ACTORCAT_BG) {
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
DynaPoly_Setup(globalCtx, &globalCtx->colCtx.dyna);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
actor = player->unk_664;
2020-03-22 21:19:43 +00:00
if ((actor != NULL) && (actor->update == NULL)) {
2020-03-17 04:31:30 +00:00
actor = NULL;
func_8008EDF0(player);
}
2020-03-22 21:19:43 +00:00
if ((actor == NULL) || (player->unk_66C < 5)) {
2020-03-17 04:31:30 +00:00
actor = NULL;
2020-03-22 21:19:43 +00:00
if (actorCtx->targetCtx.unk_4B != 0) {
2020-03-17 04:31:30 +00:00
actorCtx->targetCtx.unk_4B = 0;
func_80078884(NA_SE_SY_LOCK_OFF);
}
}
func_8002C7BC(&actorCtx->targetCtx, player, actor, globalCtx);
TitleCard_Update(globalCtx, &actorCtx->titleCtx);
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
DynaPoly_UpdateBgActorTransforms(globalCtx, &globalCtx->colCtx.dyna);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void Actor_FaultPrint(Actor* actor, char* command) {
2020-03-17 04:31:30 +00:00
ActorOverlay* overlayEntry;
char* name;
2020-03-22 21:19:43 +00:00
if ((actor == NULL) || (actor->overlayEntry == NULL)) {
2020-03-17 04:31:30 +00:00
FaultDrawer_SetCursor(48, 24);
FaultDrawer_Printf("ACTOR NAME is NULL");
}
overlayEntry = actor->overlayEntry;
name = overlayEntry->name != NULL ? overlayEntry->name : "";
// Translates to: "ACTOR NAME(%08x:%s)"
osSyncPrintf("アクターの名前(%08x:%s)\n", actor, name);
2020-03-22 21:19:43 +00:00
if (command != NULL) {
2020-03-17 04:31:30 +00:00
// Translates to: "COMMAND:%s"
osSyncPrintf("コメント:%s\n", command);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
FaultDrawer_SetCursor(48, 24);
FaultDrawer_Printf("ACTOR NAME %08x:%s", actor, name);
}
2020-03-22 21:19:43 +00:00
void Actor_Draw(GlobalContext* globalCtx, Actor* actor) {
2020-03-17 04:31:30 +00:00
FaultClient faultClient;
Lights* lights;
2020-03-17 04:31:30 +00:00
Fault_AddClient(&faultClient, Actor_FaultPrint, actor, "Actor_draw");
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 6035);
2020-03-17 04:31:30 +00:00
lights = LightContext_NewLights(&globalCtx->lightCtx, globalCtx->state.gfxCtx);
2020-03-17 04:31:30 +00:00
Lights_BindAll(lights, globalCtx->lightCtx.listHead, (actor->flags & 0x400000) ? NULL : &actor->world.pos);
Lights_Draw(lights, globalCtx->state.gfxCtx);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (actor->flags & 0x1000) {
func_800D1694(actor->world.pos.x + globalCtx->mainCamera.skyboxOffset.x,
actor->world.pos.y +
(f32)((actor->shape.yOffset * actor->scale.y) + globalCtx->mainCamera.skyboxOffset.y),
actor->world.pos.z + globalCtx->mainCamera.skyboxOffset.z, &actor->shape.rot);
2020-03-22 21:19:43 +00:00
} else {
func_800D1694(actor->world.pos.x, actor->world.pos.y + (actor->shape.yOffset * actor->scale.y),
actor->world.pos.z, &actor->shape.rot);
2020-03-17 04:31:30 +00:00
}
Matrix_Scale(actor->scale.x, actor->scale.y, actor->scale.z, MTXMODE_APPLY);
Actor_SetObjectDependency(globalCtx, actor);
gSPSegment(POLY_OPA_DISP++, 0x06, globalCtx->objectCtx.status[actor->objBankIndex].segment);
gSPSegment(POLY_XLU_DISP++, 0x06, globalCtx->objectCtx.status[actor->objBankIndex].segment);
2020-03-17 04:31:30 +00:00
if (actor->colorFilterTimer != 0) {
Color_RGBA8 color = { 0, 0, 0, 255 };
if (actor->colorFilterParams & 0x8000) {
color.r = color.g = color.b = ((actor->colorFilterParams & 0x1F00) >> 5) | 7;
} else if (actor->colorFilterParams & 0x4000) {
color.r = ((actor->colorFilterParams & 0x1F00) >> 5) | 7;
2020-03-22 21:19:43 +00:00
} else {
color.b = ((actor->colorFilterParams & 0x1F00) >> 5) | 7;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if (actor->colorFilterParams & 0x2000) {
func_80026860(globalCtx, &color, actor->colorFilterTimer, actor->colorFilterParams & 0xFF);
2020-03-22 21:19:43 +00:00
} else {
func_80026400(globalCtx, &color, actor->colorFilterTimer, actor->colorFilterParams & 0xFF);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
actor->draw(actor, globalCtx);
if (actor->colorFilterTimer != 0) {
if (actor->colorFilterParams & 0x2000) {
2020-03-17 04:31:30 +00:00
func_80026A6C(globalCtx);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
func_80026608(globalCtx);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
if (actor->shape.shadowDraw != NULL) {
actor->shape.shadowDraw(actor, lights, globalCtx);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 6119);
2020-03-17 04:31:30 +00:00
Fault_RemoveClient(&faultClient);
}
2020-03-22 21:19:43 +00:00
void func_80030ED8(Actor* actor) {
if (actor->flags & 0x80000) {
Audio_PlaySoundGeneral(actor->sfx, &actor->projectedPos, 4, &D_801333E0, &D_801333E0, &D_801333E8);
2020-03-22 21:19:43 +00:00
} else if (actor->flags & 0x100000) {
func_80078884(actor->sfx);
2020-03-22 21:19:43 +00:00
} else if (actor->flags & 0x200000) {
func_800788CC(actor->sfx);
2020-03-22 21:19:43 +00:00
} else if (actor->flags & 0x10000000) {
func_800F4C58(&D_801333D4, NA_SE_SY_TIMER - SFX_FLAG, (s8)(actor->sfx - 1));
2020-03-22 21:19:43 +00:00
} else {
func_80078914(&actor->projectedPos, actor->sfx);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_80030FA8(GraphicsContext* gfxCtx) {
OPEN_DISPS(gfxCtx, "../z_actor.c", 6161);
2020-03-17 04:31:30 +00:00
gDPLoadTextureBlock(POLY_XLU_DISP++, gLensOfTruthMaskTex, G_IM_FMT_I, G_IM_SIZ_8b, 64, 64, 0,
Decompile Gameplay_Keep and fix all existing decompiled objects (#595) * First batch of files * Add missing folders back * Fix missing folders again * Finish fixing existing texture files * Gameplay_Keep XML finished * Most actor gameplay_keep undefined syms removed * Only ~200 gkeep symbols remain * All gkeep symbols that ZAP supports are fixed * Cleanup, and make gkeep names more accurate * Starting to figure out what some unknown blobs are, merge zeldaret in * fix a few more things * refactor gkeep * Change how gitkeep is handled * gkeep xml cleanup * Gkeep finished, now just waiting up ZAP updates * 100 link animations finished * 150 link animations finished * 200 link animations finished * 250 link animations finished * 350 link animations finished * 400 link animations finished * 450 link animations finished * 500 link animations finished * 550 link animations finished * All Link animations finished cannot build yet because ZAP doesn't have LinkAnimationHeader yet * xml changes for new zap stuff * finish gameplay_keep * fixing existing objects * ready for pr besides zap padding issue * mostly ready for pr * format all c files * all conflicts fixed * make changes that roman requested * fix thing i didn't mean to change * some animation symbols renamed * fixed roman's stuff * lifemeter hardcoded pointers removed * fix issue with incorrect data in gameplay_keep * removed unused asm * fixed most of fig's comments * fix all of fig's comments * reformat files * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * fixed stuff * fixed most of roman's comments * remove leading zeroes * should build now * git subrepo pull --force tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "f84d8337b" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "f84d8337b" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * all of gkeep symbols fixed * compiler error fixed * format files * final changes Co-authored-by: Zelllll <elijah@DESKTOP-NMP1I89.localdomain> Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
2021-01-25 00:36:40 +00:00
G_TX_MIRROR | G_TX_CLAMP, G_TX_MIRROR | G_TX_CLAMP, 6, 6, G_TX_NOLOD, G_TX_NOLOD);
2020-03-17 04:31:30 +00:00
gDPSetTileSize(POLY_XLU_DISP++, G_TX_RENDERTILE, 384, 224, 892, 732);
gSPTextureRectangle(POLY_XLU_DISP++, 0, 0, 1280, 960, G_TX_RENDERTILE, 2240, 1600, 576, 597);
gDPPipeSync(POLY_XLU_DISP++);
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(gfxCtx, "../z_actor.c", 6183);
2020-03-17 04:31:30 +00:00
}
void func_8003115C(GlobalContext* globalCtx, s32 numInvisibleActors, Actor** invisibleActors) {
2020-03-17 04:31:30 +00:00
Actor** invisibleActor;
GraphicsContext* gfxCtx;
s32 i;
gfxCtx = globalCtx->state.gfxCtx;
OPEN_DISPS(gfxCtx, "../z_actor.c", 6197);
2020-03-17 04:31:30 +00:00
// Translates to: "MAGIC LENS START"
gDPNoOpString(POLY_OPA_DISP++, "魔法のメガネ START", 0);
2020-03-17 04:31:30 +00:00
gDPPipeSync(POLY_XLU_DISP++);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (globalCtx->roomCtx.curRoom.showInvisActors == 0) {
gDPSetOtherMode(POLY_XLU_DISP++,
2020-03-22 21:19:43 +00:00
G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
2020-03-17 04:31:30 +00:00
G_AC_THRESHOLD | G_ZS_PRIM | Z_UPD | G_RM_CLD_SURF | G_RM_CLD_SURF2);
gDPSetCombineMode(POLY_XLU_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 0, 0, 255);
2020-03-22 21:19:43 +00:00
} else {
gDPSetOtherMode(POLY_XLU_DISP++,
2020-03-22 21:19:43 +00:00
G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
G_AC_THRESHOLD | G_ZS_PRIM | Z_UPD | IM_RD | CVG_DST_SAVE | ZMODE_OPA | FORCE_BL |
GBL_c1(G_BL_CLR_BL, G_BL_0, G_BL_CLR_MEM, G_BL_1MA) |
GBL_c2(G_BL_CLR_BL, G_BL_0, G_BL_CLR_MEM, G_BL_1MA));
gDPSetCombineLERP(POLY_XLU_DISP++, PRIMITIVE, TEXEL0, PRIM_LOD_FRAC, 0, PRIMITIVE, TEXEL0, PRIM_LOD_FRAC, 0,
PRIMITIVE, TEXEL0, PRIM_LOD_FRAC, 0, PRIMITIVE, TEXEL0, PRIM_LOD_FRAC, 0);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0xFF, 74, 74, 74, 74);
2020-03-17 04:31:30 +00:00
}
gDPSetPrimDepth(POLY_XLU_DISP++, 0, 0);
2020-03-17 04:31:30 +00:00
func_80030FA8(gfxCtx);
// Translates to: "MAGIC LENS INVISIBLE ACTOR DISPLAY START"
gDPNoOpString(POLY_OPA_DISP++, "魔法のメガネ 見えないc表示 START", numInvisibleActors);
2020-03-17 04:31:30 +00:00
invisibleActor = &invisibleActors[0];
for (i = 0; i < numInvisibleActors; i++) {
2020-03-17 04:31:30 +00:00
// Translates to: "MAGIC LENS INVISIBLE ACTOR DISPLAY"
gDPNoOpString(POLY_OPA_DISP++, "魔法のメガネ 見えないc表示", i);
2020-03-17 04:31:30 +00:00
Actor_Draw(globalCtx, *(invisibleActor++));
}
// Translates to: "MAGIC LENS INVISIBLE ACTOR DISPLAY END"
gDPNoOpString(POLY_OPA_DISP++, "魔法のメガネ 見えないc表示 END", numInvisibleActors);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (globalCtx->roomCtx.curRoom.showInvisActors != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "BLUE SPECTACLES (EXTERIOR)"
gDPNoOpString(POLY_OPA_DISP++, "青い眼鏡(外側)", 0);
2020-03-17 04:31:30 +00:00
gDPPipeSync(POLY_XLU_DISP++);
2020-03-17 04:31:30 +00:00
gDPSetOtherMode(POLY_XLU_DISP++,
2020-03-22 21:19:43 +00:00
G_AD_DISABLE | G_CD_MAGICSQ | G_CK_NONE | G_TC_FILT | G_TF_BILERP | G_TT_NONE | G_TL_TILE |
G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
2020-03-17 04:31:30 +00:00
G_AC_THRESHOLD | G_ZS_PRIM | G_RM_CLD_SURF | G_RM_CLD_SURF2);
gDPSetCombineMode(POLY_XLU_DISP++, G_CC_MODULATEIA_PRIM, G_CC_MODULATEIA_PRIM);
gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 0, 0, 255);
2020-03-17 04:31:30 +00:00
func_80030FA8(gfxCtx);
// Translates to: "BLUE SPECTACLES (EXTERIOR)"
gDPNoOpString(POLY_OPA_DISP++, "青い眼鏡(外側)", 1);
2020-03-17 04:31:30 +00:00
}
// Translates to: "MAGIC LENS END"
gDPNoOpString(POLY_OPA_DISP++, "魔法のメガネ END", 0);
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(gfxCtx, "../z_actor.c", 6284);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_800314B0(GlobalContext* globalCtx, Actor* actor) {
return func_800314D4(globalCtx, actor, &actor->projectedPos, actor->projectedW);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_800314D4(GlobalContext* globalCtx, Actor* actor, Vec3f* arg2, f32 arg3) {
2020-03-17 04:31:30 +00:00
f32 var;
if ((arg2->z > -actor->uncullZoneScale) && (arg2->z < (actor->uncullZoneForward + actor->uncullZoneScale))) {
2020-03-17 04:31:30 +00:00
var = (arg3 < 1.0f) ? 1.0f : 1.0f / arg3;
if ((((fabsf(arg2->x) - actor->uncullZoneScale) * var) < 1.0f) &&
(((arg2->y + actor->uncullZoneDownward) * var) > -1.0f) &&
(((arg2->y - actor->uncullZoneScale) * var) < 1.0f)) {
return true;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
return false;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_800315AC(GlobalContext* globalCtx, ActorContext* actorCtx) {
2020-03-17 04:31:30 +00:00
s32 invisibleActorCounter;
Actor* invisibleActors[INVISIBLE_ACTOR_MAX];
ActorListEntry* actorListEntry;
Actor* actor;
s32 i;
2020-03-17 04:31:30 +00:00
invisibleActorCounter = 0;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 6336);
2020-03-17 04:31:30 +00:00
actorListEntry = &actorCtx->actorLists[0];
2020-03-17 04:31:30 +00:00
for (i = 0; i < ARRAY_COUNT(actorCtx->actorLists); i++, actorListEntry++) {
actor = actorListEntry->head;
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
ActorOverlay* overlayEntry = actor->overlayEntry;
char* actorName = overlayEntry->name != NULL ? overlayEntry->name : "";
2020-03-17 04:31:30 +00:00
gDPNoOpString(POLY_OPA_DISP++, actorName, i);
gDPNoOpString(POLY_XLU_DISP++, actorName, i);
2020-03-17 04:31:30 +00:00
HREG(66) = i;
2020-03-22 21:19:43 +00:00
if ((HREG(64) != 1) || ((HREG(65) != -1) && (HREG(65) != HREG(66))) || (HREG(68) == 0)) {
SkinMatrix_Vec3fMtxFMultXYZW(&globalCtx->mf_11D60, &actor->world.pos, &actor->projectedPos,
z_skin_matrix.c decompiled (1 non matching, 1 non equivalent) (#243) * func_800A7BE4 and func_800A7C20 done - func_800A7BE4 copy of "Math_Vec3f_ToVec3s" in z_lib.c - func_800A7C20 copy of "Math_Vec3s_ToVec3f" in z_lib.c * done func_800A7A24 * func_800A76A4 done * func_800A6E10 done * func_800A6EF4 done * func_800A6FA0 done * func_800A72FC done * Deleted z_skin_matrix.data.s and updated spec * func_800A730C done * func_800A735C done * func_800A7E70 done, func_800A7C60 matching but I'm not happy with it (weird types in function params) * Corrections. func_800A7C60 in skin_matrix done, Matrix_MtxFToMtx in sys_matrix done. * func_800A7EC0 nonmatching * func_800A8030 nonmatching but VERY close (two registers swapped) * func_800A8030 done * updating comments * func_800A7704 done * func_800A7894 done * halfway through deciphering mips_to_c for func_800A73E0 * func_800A73E0 functional but non-matching (saved register differences and probably regalloc) * Renaming some arguments and rewriting comments * Renamed files across whole project and deleted asm nonmatchings * ran format.sh * fixed function name * fixing multiplcation order in SkinMatrix_MtxFMtxFMult * Corrections in SkinMatrix_MtxFMtxFMult * Formatting changes after review * Changes as per code review * fixing rename error * fixing rename error * rename fixes * fixing function rename error * ran ./format.sh * last couple of changes as per code review * renamed SetScaling -> SetScale * Skin_Matrix_Invert -> SkinMatrix_Invert * Renaming and fixing debug message print * Renamed argument "mf" to more specific "clear" in SkinMatrix_GetClear * renamed again to "mfp" * snake case to camel case changes
2020-08-08 15:23:16 +00:00
&actor->projectedW);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if ((HREG(64) != 1) || ((HREG(65) != -1) && (HREG(65) != HREG(66))) || (HREG(69) == 0)) {
if (actor->sfx != 0) {
2020-03-17 04:31:30 +00:00
func_80030ED8(actor);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if ((HREG(64) != 1) || ((HREG(65) != -1) && (HREG(65) != HREG(66))) || (HREG(70) == 0)) {
if (func_800314B0(globalCtx, actor)) {
2020-03-17 04:31:30 +00:00
actor->flags |= 0x40;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor->flags &= ~0x40;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
actor->isDrawn = false;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((HREG(64) != 1) || ((HREG(65) != -1) && (HREG(65) != HREG(66))) || (HREG(71) == 0)) {
if ((actor->init == NULL) && (actor->draw != NULL) && (actor->flags & 0x60)) {
2020-03-17 04:31:30 +00:00
if ((actor->flags & 0x80) &&
2020-03-22 21:19:43 +00:00
((globalCtx->roomCtx.curRoom.showInvisActors == 0) || (globalCtx->actorCtx.unk_03 != 0) ||
(actor->room != globalCtx->roomCtx.curRoom.num))) {
ASSERT(invisibleActorCounter < INVISIBLE_ACTOR_MAX,
"invisible_actor_counter < INVISIBLE_ACTOR_MAX", "../z_actor.c", 6464);
2020-03-17 04:31:30 +00:00
invisibleActors[invisibleActorCounter] = actor;
invisibleActorCounter++;
2020-03-22 21:19:43 +00:00
} else {
if ((HREG(64) != 1) || ((HREG(65) != -1) && (HREG(65) != HREG(66))) || (HREG(72) == 0)) {
2020-03-17 04:31:30 +00:00
Actor_Draw(globalCtx, actor);
actor->isDrawn = true;
2020-03-17 04:31:30 +00:00
}
}
}
}
actor = actor->next;
}
}
2020-03-22 21:19:43 +00:00
if ((HREG(64) != 1) || (HREG(73) != 0)) {
Effect_DrawAll(globalCtx->state.gfxCtx);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((HREG(64) != 1) || (HREG(74) != 0)) {
EffectSs_DrawAll(globalCtx);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((HREG(64) != 1) || (HREG(72) != 0)) {
if (globalCtx->actorCtx.unk_03 != 0) {
2020-03-17 04:31:30 +00:00
func_8003115C(globalCtx, invisibleActorCounter, invisibleActors);
if ((globalCtx->csCtx.state != CS_STATE_IDLE) || Player_InCsMode(globalCtx)) {
2020-03-17 04:31:30 +00:00
func_800304B0(globalCtx);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
func_8002FBAC(globalCtx);
2020-03-22 21:19:43 +00:00
if (IREG(32) == 0) {
Lights_DrawGlow(globalCtx);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((HREG(64) != 1) || (HREG(75) != 0)) {
2020-03-17 04:31:30 +00:00
TitleCard_Draw(globalCtx, &actorCtx->titleCtx);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((HREG(64) != 1) || (HREG(76) != 0)) {
CollisionCheck_DrawCollision(globalCtx, &globalCtx->colChkCtx);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 6563);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_80031A28(GlobalContext* globalCtx, ActorContext* actorCtx) {
2020-03-17 04:31:30 +00:00
Actor* actor;
s32 i;
for (i = 0; i < ARRAY_COUNT(actorCtx->actorLists); i++) {
actor = actorCtx->actorLists[i].head;
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
if (!Object_IsLoaded(&globalCtx->objectCtx, actor->objBankIndex)) {
2020-03-17 04:31:30 +00:00
Actor_Kill(actor);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actor = actor->next;
}
}
}
u8 sEnemyActorCategories[] = { ACTORCAT_ENEMY, ACTORCAT_BOSS };
2020-03-17 04:31:30 +00:00
void Actor_FreezeAllEnemies(GlobalContext* globalCtx, ActorContext* actorCtx, s32 duration) {
2020-03-17 04:31:30 +00:00
Actor* actor;
s32 i;
for (i = 0; i < ARRAY_COUNT(sEnemyActorCategories); i++) {
actor = actorCtx->actorLists[sEnemyActorCategories[i]].head;
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
actor->freezeTimer = duration;
2020-03-17 04:31:30 +00:00
actor = actor->next;
}
}
}
2020-03-22 21:19:43 +00:00
void func_80031B14(GlobalContext* globalCtx, ActorContext* actorCtx) {
2020-03-17 04:31:30 +00:00
Actor* actor;
s32 i;
for (i = 0; i < ARRAY_COUNT(actorCtx->actorLists); i++) {
actor = actorCtx->actorLists[i].head;
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
if ((actor->room >= 0) && (actor->room != globalCtx->roomCtx.curRoom.num) &&
(actor->room != globalCtx->roomCtx.prevRoom.num)) {
if (!actor->isDrawn) {
2020-03-17 04:31:30 +00:00
actor = Actor_Delete(actorCtx, actor, globalCtx);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Actor_Kill(actor);
Actor_Destroy(actor, globalCtx);
actor = actor->next;
}
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor = actor->next;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
CollisionCheck_ClearContext(globalCtx, &globalCtx->colChkCtx);
2020-03-17 04:31:30 +00:00
actorCtx->flags.tempClear = 0;
actorCtx->flags.tempSwch &= 0xFFFFFF;
globalCtx->msgCtx.unk_E3F4 = 0;
}
// Actor_CleanupContext
2020-03-22 21:19:43 +00:00
void func_80031C3C(ActorContext* actorCtx, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Actor* actor;
s32 i;
for (i = 0; i < ARRAY_COUNT(actorCtx->actorLists); i++) {
actor = actorCtx->actorLists[i].head;
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
2020-03-17 04:31:30 +00:00
Actor_Delete(actorCtx, actor, globalCtx);
actor = actorCtx->actorLists[i].head;
2020-03-17 04:31:30 +00:00
}
}
2020-03-22 21:19:43 +00:00
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "ABSOLUTE MAGIC FIELD DEALLOCATION"
osSyncPrintf("絶対魔法領域解放\n");
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (actorCtx->absoluteSpace != NULL) {
2020-03-17 04:31:30 +00:00
ZeldaArena_FreeDebug(actorCtx->absoluteSpace, "../z_actor.c", 6731);
actorCtx->absoluteSpace = NULL;
}
Gameplay_SaveSceneFlags(globalCtx);
2020-03-17 04:31:30 +00:00
func_80030488(globalCtx);
ActorOverlayTable_Cleanup();
}
/**
* Adds a given actor instance at the front of the actor list of the specified category.
* Also sets the actor instance as being of that category.
2020-03-17 04:31:30 +00:00
*/
void Actor_AddToCategory(ActorContext* actorCtx, Actor* actorToAdd, u8 actorCategory) {
Actor* prevHead;
2020-03-17 04:31:30 +00:00
actorToAdd->category = actorCategory;
2020-03-17 04:31:30 +00:00
actorCtx->total++;
actorCtx->actorLists[actorCategory].length++;
prevHead = actorCtx->actorLists[actorCategory].head;
2020-03-17 04:31:30 +00:00
if (prevHead != NULL) {
prevHead->prev = actorToAdd;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actorCtx->actorLists[actorCategory].head = actorToAdd;
actorToAdd->next = prevHead;
2020-03-17 04:31:30 +00:00
}
/**
* Removes a given actor instance from its actor list.
* Also sets the temp clear flag of the current room if the actor removed was the last enemy loaded.
*/
Actor* Actor_RemoveFromCategory(GlobalContext* globalCtx, ActorContext* actorCtx, Actor* actorToRemove) {
Actor* newHead;
2020-03-17 04:31:30 +00:00
actorCtx->total--;
actorCtx->actorLists[actorToRemove->category].length--;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (actorToRemove->prev != NULL) {
2020-03-17 04:31:30 +00:00
actorToRemove->prev->next = actorToRemove->next;
2020-03-22 21:19:43 +00:00
} else {
actorCtx->actorLists[actorToRemove->category].head = actorToRemove->next;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
newHead = actorToRemove->next;
2020-03-17 04:31:30 +00:00
if (newHead != NULL) {
newHead->prev = actorToRemove->prev;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actorToRemove->next = NULL;
actorToRemove->prev = NULL;
if ((actorToRemove->room == globalCtx->roomCtx.curRoom.num) && (actorToRemove->category == ACTORCAT_ENEMY) &&
(actorCtx->actorLists[ACTORCAT_ENEMY].length == 0)) {
2020-03-17 04:31:30 +00:00
Flags_SetTempClear(globalCtx, globalCtx->roomCtx.curRoom.num);
}
return newHead;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void Actor_FreeOverlay(ActorOverlay* actorOverlay) {
2020-03-17 04:31:30 +00:00
osSyncPrintf(VT_FGCOL(CYAN));
if (actorOverlay->numLoaded == 0) {
2020-03-22 21:19:43 +00:00
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "ACTOR CLIENT IS NOW 0"
osSyncPrintf("アクタークライアントが0になりました\n");
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (actorOverlay->loadedRamAddr != NULL) {
if (actorOverlay->allocType & ALLOCTYPE_PERMANENT) {
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "OVERLAY WILL NOT BE DEALLOCATED"
osSyncPrintf("オーバーレイ解放しません\n");
2020-03-22 21:19:43 +00:00
}
} else if (actorOverlay->allocType & ALLOCTYPE_ABSOLUTE) {
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "ABSOLUTE MAGIC FIELD RESERVED, SO DEALLOCATION WILL NOT OCCUR"
osSyncPrintf("絶対魔法領域確保なので解放しません\n");
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actorOverlay->loadedRamAddr = NULL;
2020-03-22 21:19:43 +00:00
} else {
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "OVERLAY DEALLOCATED"
osSyncPrintf("オーバーレイ解放します\n");
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
ZeldaArena_FreeDebug(actorOverlay->loadedRamAddr, "../z_actor.c", 6834);
actorOverlay->loadedRamAddr = NULL;
}
}
2020-03-22 21:19:43 +00:00
} else if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "%d OF ACTOR CLIENT REMAINS"
osSyncPrintf("アクタークライアントはあと %d 残っています\n", actorOverlay->numLoaded);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
osSyncPrintf(VT_RST);
}
2020-03-22 21:19:43 +00:00
Actor* Actor_Spawn(ActorContext* actorCtx, GlobalContext* globalCtx, s16 actorId, f32 posX, f32 posY, f32 posZ,
s16 rotX, s16 rotY, s16 rotZ, s16 params) {
2020-03-17 04:31:30 +00:00
s32 pad;
Actor* actor;
ActorInit* actorInit;
s32 objBankIndex;
ActorOverlay* overlayEntry;
u32 temp;
char* name;
u32 overlaySize;
overlayEntry = &gActorOverlayTable[actorId];
ASSERT(actorId < ACTOR_ID_MAX, "profile < ACTOR_DLF_MAX", "../z_actor.c", 6883);
2020-03-17 04:31:30 +00:00
name = overlayEntry->name != NULL ? overlayEntry->name : "";
overlaySize = (u32)overlayEntry->vramEnd - (u32)overlayEntry->vramStart;
2020-03-22 21:19:43 +00:00
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "ACTOR CLASS ADDITION [%d:%s]"
osSyncPrintf("アクタークラス追加 [%d:%s]\n", actorId, name);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (actorCtx->total > ACTOR_NUMBER_MAX) {
2020-03-17 04:31:30 +00:00
// Translates to: " SET NUMBER EXCEEDED"
osSyncPrintf(VT_COL(YELLOW, BLACK) "Actorセット数オーバー\n" VT_RST);
return NULL;
}
2020-03-22 21:19:43 +00:00
if (overlayEntry->vramStart == 0) {
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "NOT AN OVERLAY"
osSyncPrintf("オーバーレイではありません\n");
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actorInit = overlayEntry->initInfo;
2020-03-22 21:19:43 +00:00
} else {
if (overlayEntry->loadedRamAddr != NULL) {
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "ALREADY LOADED"
osSyncPrintf("既にロードされています\n");
2020-03-22 21:19:43 +00:00
}
} else {
if (overlayEntry->allocType & ALLOCTYPE_ABSOLUTE) {
ASSERT(overlaySize <= AM_FIELD_SIZE, "actor_segsize <= AM_FIELD_SIZE", "../z_actor.c", 6934);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (actorCtx->absoluteSpace == NULL) {
2020-03-17 04:31:30 +00:00
// Translates to: "AMF: ABSOLUTE MAGIC FIELD"
actorCtx->absoluteSpace = ZeldaArena_MallocRDebug(AM_FIELD_SIZE, "AMF:絶対魔法領域", 0);
2020-03-22 21:19:43 +00:00
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "ABSOLUTE MAGIC FIELD RESERVATION - %d BYTES RESERVED"
osSyncPrintf("絶対魔法領域確保 %d バイト確保\n", AM_FIELD_SIZE);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
overlayEntry->loadedRamAddr = actorCtx->absoluteSpace;
2020-03-22 21:19:43 +00:00
} else if (overlayEntry->allocType & ALLOCTYPE_PERMANENT) {
2020-03-17 04:31:30 +00:00
overlayEntry->loadedRamAddr = ZeldaArena_MallocRDebug(overlaySize, name, 0);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
overlayEntry->loadedRamAddr = ZeldaArena_MallocDebug(overlaySize, name, 0);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (overlayEntry->loadedRamAddr == NULL) {
2020-03-17 04:31:30 +00:00
// Translates to: "CANNOT RESERVE ACTOR PROGRAM MEMORY"
osSyncPrintf(VT_COL(RED, WHITE) "Actorプログラムメモリが確保できません\n" VT_RST);
return NULL;
}
2020-03-22 21:19:43 +00:00
Overlay_Load(overlayEntry->vromStart, overlayEntry->vromEnd, overlayEntry->vramStart, overlayEntry->vramEnd,
overlayEntry->loadedRamAddr);
2020-03-17 04:31:30 +00:00
osSyncPrintf(VT_FGCOL(GREEN));
2020-03-22 21:19:43 +00:00
osSyncPrintf("OVL(a):Seg:%08x-%08x Ram:%08x-%08x Off:%08x %s\n", overlayEntry->vramStart,
overlayEntry->vramEnd, overlayEntry->loadedRamAddr,
2020-03-17 04:31:30 +00:00
(u32)overlayEntry->loadedRamAddr + (u32)overlayEntry->vramEnd - (u32)overlayEntry->vramStart,
2020-03-22 21:19:43 +00:00
(u32)overlayEntry->vramStart - (u32)overlayEntry->loadedRamAddr, name);
2020-03-17 04:31:30 +00:00
osSyncPrintf(VT_RST);
overlayEntry->numLoaded = 0;
2020-03-17 04:31:30 +00:00
}
actorInit = (void*)(u32)((overlayEntry->initInfo != NULL)
? (void*)((u32)overlayEntry->initInfo -
(s32)((u32)overlayEntry->vramStart - (u32)overlayEntry->loadedRamAddr))
: NULL);
2020-03-17 04:31:30 +00:00
}
objBankIndex = Object_GetIndex(&globalCtx->objectCtx, actorInit->objectId);
if ((objBankIndex < 0) ||
((actorInit->category == ACTORCAT_ENEMY) && (Flags_GetClear(globalCtx, globalCtx->roomCtx.curRoom.num)))) {
2020-03-17 04:31:30 +00:00
// Translates to: "NO DATA BANK!! <DATA BANK%d> (profilep->bank=%d)"
2020-03-22 21:19:43 +00:00
osSyncPrintf(VT_COL(RED, WHITE) "データバンク無し!!<データバンク=%d>(profilep->bank=%d)\n" VT_RST,
objBankIndex, actorInit->objectId);
2020-03-17 04:31:30 +00:00
Actor_FreeOverlay(overlayEntry);
return NULL;
}
actor = ZeldaArena_MallocDebug(actorInit->instanceSize, name, 1);
2020-03-22 21:19:43 +00:00
if (actor == NULL) {
2020-03-17 04:31:30 +00:00
// Translates to: "ACTOR CLASS CANNOT BE RESERVED! %s <SIZE%d BYTES>"
2020-03-22 21:19:43 +00:00
osSyncPrintf(VT_COL(RED, WHITE) "Actorクラス確保できません! %s <サイズ=%dバイト>\n", VT_RST, name,
actorInit->instanceSize);
2020-03-17 04:31:30 +00:00
Actor_FreeOverlay(overlayEntry);
return NULL;
}
ASSERT(overlayEntry->numLoaded < 255, "actor_dlftbl->clients < 255", "../z_actor.c", 7031);
2020-03-17 04:31:30 +00:00
overlayEntry->numLoaded++;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "ACTOR CLIENT No. %d"
osSyncPrintf("アクタークライアントは %d 個目です\n", overlayEntry->numLoaded);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
Lib_MemSet((u8*)actor, actorInit->instanceSize, 0);
2020-03-17 04:31:30 +00:00
actor->overlayEntry = overlayEntry;
actor->id = actorInit->id;
actor->flags = actorInit->flags;
2020-03-22 21:19:43 +00:00
if (actorInit->id == ACTOR_EN_PART) {
2020-03-17 04:31:30 +00:00
actor->objBankIndex = rotZ;
rotZ = 0;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor->objBankIndex = objBankIndex;
}
actor->init = actorInit->init;
actor->destroy = actorInit->destroy;
actor->update = actorInit->update;
actor->draw = actorInit->draw;
actor->room = globalCtx->roomCtx.curRoom.num;
actor->home.pos.x = posX;
actor->home.pos.y = posY;
actor->home.pos.z = posZ;
actor->home.rot.x = rotX;
actor->home.rot.y = rotY;
actor->home.rot.z = rotZ;
2020-03-17 04:31:30 +00:00
actor->params = params;
Actor_AddToCategory(actorCtx, actor, actorInit->category);
2020-03-17 04:31:30 +00:00
temp = gSegments[6];
Actor_Init(actor, globalCtx);
gSegments[6] = temp;
return actor;
}
Actor* Actor_SpawnAsChild(ActorContext* actorCtx, Actor* parent, GlobalContext* globalCtx, s16 actorId, f32 posX,
f32 posY, f32 posZ, s16 rotX, s16 rotY, s16 rotZ, s16 params) {
2020-03-22 21:19:43 +00:00
Actor* spawnedActor = Actor_Spawn(actorCtx, globalCtx, actorId, posX, posY, posZ, rotX, rotY, rotZ, params);
if (spawnedActor == NULL) {
2020-03-17 04:31:30 +00:00
return NULL;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
parent->child = spawnedActor;
spawnedActor->parent = parent;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (spawnedActor->room >= 0) {
spawnedActor->room = parent->room;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return spawnedActor;
}
2020-03-22 21:19:43 +00:00
void Actor_SpawnTransitionActors(GlobalContext* globalCtx, ActorContext* actorCtx) {
2020-03-17 04:31:30 +00:00
TransitionActorEntry* transitionActor;
u8 numActors;
2020-03-17 04:31:30 +00:00
s32 i;
transitionActor = globalCtx->transiActorCtx.list;
numActors = globalCtx->transiActorCtx.numActors;
2020-03-17 04:31:30 +00:00
for (i = 0; i < numActors; i++) {
2020-03-22 21:19:43 +00:00
if (transitionActor->id >= 0) {
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)))) {
2020-03-22 21:19:43 +00:00
Actor_Spawn(actorCtx, globalCtx, (s16)(transitionActor->id & 0x1FFF), transitionActor->pos.x,
transitionActor->pos.y, transitionActor->pos.z, 0, transitionActor->rotY, 0,
2020-03-17 04:31:30 +00:00
(i << 0xA) + transitionActor->params);
transitionActor->id = -transitionActor->id;
numActors = globalCtx->transiActorCtx.numActors;
2020-03-17 04:31:30 +00:00
}
}
transitionActor++;
}
}
2020-03-22 21:19:43 +00:00
Actor* Actor_SpawnEntry(ActorContext* actorCtx, ActorEntry* actorEntry, GlobalContext* globalCtx) {
return Actor_Spawn(actorCtx, globalCtx, actorEntry->id, actorEntry->pos.x, actorEntry->pos.y, actorEntry->pos.z,
actorEntry->rot.x, actorEntry->rot.y, actorEntry->rot.z, actorEntry->params);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
Actor* Actor_Delete(ActorContext* actorCtx, Actor* actor, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
char* name;
Player* player;
Actor* newHead;
2020-03-17 04:31:30 +00:00
ActorOverlay* overlayEntry;
player = PLAYER;
overlayEntry = actor->overlayEntry;
name = overlayEntry->name != NULL ? overlayEntry->name : "";
2020-03-22 21:19:43 +00:00
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "ACTOR CLASS DELETED [%s]"
osSyncPrintf("アクタークラス削除 [%s]\n", name);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((player != NULL) && (actor == player->unk_664)) {
2020-03-17 04:31:30 +00:00
func_8008EDF0(player);
decompile z_camera (#398) * cleanup * name camera action functions * decompile a few small functions, name a few Camera struct members * decompile camera data, decompile a few camera functions * Split ASM for code_800BB0A0 * removing code_800BB0A0.s * PR Requests, Camera WIP * remove #define NON_MATCHING from db_camera * rename code_8007BF90.c to z_olib.c, rename functions in z_olib.c * camera wip * rename some struct memebers, some decomp wip * pr updates * camera wip * name some fields in Camera Struct, being making sense of Camera_Update * Camera WIP * wip * wip * add z64camera.h header, begin creating CameraSetting macros * wip * wip * wip * wip * migrate camera bss to c * match a couple functions in db_camera * match some small db_camera functions * wip * migrate db_camera rodata, match a few functions * remote db_camera.rodata.s * match some of db_camera * identify types of some unknown data pieces * some small wip * Match Camera_Init, some function changes, some struct name changes. Change unk_C0 and unk_CC to floats from Vec3fs * add naming for a few more Camera struct members * wip * match func_80043F94 * Match Camera_Jump1 * document some of Camera_Jump1 * wip * match Camera_Jump3 * Match Camera_Update, FeelsAmazing * wip * wip * match Camera_SetParam * minor cleanup * wip * wip * match Camera_KeepOn0 * some documentation, modify some matching functions to match style of others. * match Camera_Demo1 * match camera_demo9 * document Camera_Demo1 and Camera_Demo9 * wip * Match camera_battle4 * match camera_unique2 * Match Camera_Unique3 * match camera_special6 * match Camera_Special5 * wip * document camera_special6 * naming updates * match camera_Unique1 * match Camera_Unique0 * wip * Match Camera_CalcUpFromPitchYawRoll * match func_80045508 * document Camera_Battle4 * document several camera functions, move camera data to separate file * rename phi/theta to pitch/yaw * wip * uniq9 wip * Camera_Unqiue9 OK * document Camera_Unique9 * name unk_160 in camera struct * wip * wip * minor updates * fix conflicts * wip * wip * Olib updates * wip * wip * rename most Math3D functions, few matches, documentation * wip * document most of math3d * wip * wip * wip * pr updates * Match Camera_Fixed4 * match func_80058E8C * pr updates * add missing comment block finalizer * Merge math3dupdates * match Camera_ChangeSetting * Match Camera_ChangeMode * match func_80058148 * Match Camera_Special9 * decompile the rest of camera data * match Camera_Demo5 * name a few camera functions in z_play * match func_80046CB4, some work on other fucntions * wip * impove some non matchings * fix function rename * match func_800588B4 * match Camera_Subj4 * wip * Camera_Demo3 matching, Camera_Battle1 big progress * Camera_Normal2 OK * wip * match Camera_Parallel1 * normalize some things across functions * match Camera_Normal1 * Match Camera_Normal3 * some cleanup * more cleanup * more cleanup , match Camera_CalcDefaultPitch * data formatting * Match Camera_Jump2 * document Camera_Jump2 * Match Camera_KeepOn3 * document some of Camera_KeepOn3 * improve some non_matchings * match func_80045C74 and func_800460A8 * code cleanup, documentation * match Camera_KeepOn1 * Match Camera_Subj3 * Match Camera_Battle1 * remove non_matching from func_80044adc and func_80046e20 * name several members of Battle1 * more documentation on Battle1 * cleanup * renaming Camera_Vec3fScaleXYZFactor to Camera_Vec3fTranslateByUnitVector * reorganize update structs, remove final references to params, remove CameraParams union * implement camera enums into player * Renaming Camera_GetDir to Camera_GetInputDir, Camera_GetRealDir to Camera_GetCamDir, etc, implement camera enum's into player * remove non-global camera variables from variables.h * clean up some variable declarations * finish pr comment updates * fix some warnings * data formatting * finish commenting on data * delete unused asm * remove asm Co-authored-by: fig <fig02srl@gmail.com>
2020-12-06 22:39:47 +00:00
Camera_ChangeMode(Gameplay_GetCamera(globalCtx, Gameplay_GetActiveCamId(globalCtx)), 0);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (actor == actorCtx->targetCtx.arrowPointedActor) {
2020-03-17 04:31:30 +00:00
actorCtx->targetCtx.arrowPointedActor = NULL;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (actor == actorCtx->targetCtx.unk_8C) {
2020-03-17 04:31:30 +00:00
actorCtx->targetCtx.unk_8C = NULL;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (actor == actorCtx->targetCtx.unk_90) {
2020-03-17 04:31:30 +00:00
actorCtx->targetCtx.unk_90 = NULL;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
func_800F89E8(&actor->projectedPos);
2020-03-17 04:31:30 +00:00
Actor_Destroy(actor, globalCtx);
newHead = Actor_RemoveFromCategory(globalCtx, actorCtx, actor);
2020-03-17 04:31:30 +00:00
ZeldaArena_FreeDebug(actor, "../z_actor.c", 7242);
2020-03-22 21:19:43 +00:00
if (overlayEntry->vramStart == 0) {
if (HREG(20) != 0) {
2020-03-17 04:31:30 +00:00
// Translates to: "NOT AN OVERLAY"
osSyncPrintf("オーバーレイではありません\n");
2020-03-22 21:19:43 +00:00
}
} else {
ASSERT(overlayEntry->loadedRamAddr != NULL, "actor_dlftbl->allocp != NULL", "../z_actor.c", 7251);
ASSERT(overlayEntry->numLoaded > 0, "actor_dlftbl->clients > 0", "../z_actor.c", 7252);
overlayEntry->numLoaded--;
2020-03-17 04:31:30 +00:00
Actor_FreeOverlay(overlayEntry);
}
return newHead;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_80032880(GlobalContext* globalCtx, Actor* actor) {
2020-03-17 04:31:30 +00:00
s16 sp1E;
s16 sp1C;
func_8002F374(globalCtx, actor, &sp1E, &sp1C);
return (sp1E > -20) && (sp1E < 340) && (sp1C > -160) && (sp1C < 400);
}
Actor* D_8015BBE8;
Actor* D_8015BBEC;
f32 D_8015BBF0;
f32 D_8015BBF4;
s32 D_8015BBF8;
s16 D_8015BBFC;
void func_800328D4(GlobalContext* globalCtx, ActorContext* actorCtx, Player* player, u32 actorCategory) {
2020-03-17 04:31:30 +00:00
f32 var;
Actor* actor;
Actor* sp84;
2020-03-22 21:19:43 +00:00
CollisionPoly* sp80;
2020-03-17 04:31:30 +00:00
UNK_TYPE sp7C;
Vec3f sp70;
actor = actorCtx->actorLists[actorCategory].head;
2020-03-17 04:31:30 +00:00
sp84 = player->unk_664;
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
if ((actor->update != NULL) && ((Player*)actor != player) && ((actor->flags & 1) == 1)) {
if ((actorCategory == ACTORCAT_ENEMY) && ((actor->flags & 5) == 5) &&
(actor->xyzDistToPlayerSq < 250000.0f) && (actor->xyzDistToPlayerSq < D_8015BBF4)) {
2020-03-22 21:19:43 +00:00
actorCtx->targetCtx.unk_90 = actor;
D_8015BBF4 = actor->xyzDistToPlayerSq;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (actor != sp84) {
2020-03-17 04:31:30 +00:00
var = func_8002EFC0(actor, player, D_8015BBFC);
2020-03-22 21:19:43 +00:00
if ((var < D_8015BBF0) && func_8002F090(actor, var) && func_80032880(globalCtx, actor) &&
(!BgCheck_CameraLineTest1(&globalCtx->colCtx, &player->actor.focus.pos, &actor->focus.pos, &sp70,
&sp80, 1, 1, 1, 1, &sp7C) ||
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
SurfaceType_IsIgnoredByProjectiles(&globalCtx->colCtx, sp80, sp7C))) {
if (actor->targetPriority != 0) {
if (actor->targetPriority < D_8015BBF8) {
2020-03-17 04:31:30 +00:00
D_8015BBEC = actor;
D_8015BBF8 = actor->targetPriority;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
D_8015BBE8 = actor;
D_8015BBF0 = var;
}
}
}
}
actor = actor->next;
}
}
2020-03-22 21:19:43 +00:00
u8 D_801160A0[] = {
ACTORCAT_BOSS, ACTORCAT_ENEMY, ACTORCAT_BG, ACTORCAT_EXPLOSIVE, ACTORCAT_NPC, ACTORCAT_ITEMACTION,
ACTORCAT_CHEST, ACTORCAT_SWITCH, ACTORCAT_PROP, ACTORCAT_MISC, ACTORCAT_DOOR, ACTORCAT_SWITCH,
2020-03-17 04:31:30 +00:00
};
2020-03-22 21:19:43 +00:00
Actor* func_80032AF0(GlobalContext* globalCtx, ActorContext* actorCtx, Actor** actorPtr, Player* player) {
2020-03-17 04:31:30 +00:00
s32 i;
u8* entry;
D_8015BBE8 = D_8015BBEC = NULL;
D_8015BBF0 = D_8015BBF4 = FLT_MAX;
D_8015BBF8 = 0x7FFFFFFF;
if (!Player_InCsMode(globalCtx)) {
2020-03-17 04:31:30 +00:00
entry = &D_801160A0[0];
actorCtx->targetCtx.unk_90 = NULL;
D_8015BBFC = player->actor.shape.rot.y;
2020-03-22 21:19:43 +00:00
for (i = 0; i < 3; i++) {
2020-03-17 04:31:30 +00:00
func_800328D4(globalCtx, actorCtx, player, *entry);
entry++;
}
2020-03-22 21:19:43 +00:00
if (D_8015BBE8 == NULL) {
for (; i < ARRAY_COUNT(D_801160A0); i++) {
2020-03-17 04:31:30 +00:00
func_800328D4(globalCtx, actorCtx, player, *entry);
entry++;
}
}
}
2020-03-22 21:19:43 +00:00
if (D_8015BBE8 == 0) {
2020-03-17 04:31:30 +00:00
*actorPtr = D_8015BBEC;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
*actorPtr = D_8015BBE8;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return *actorPtr;
}
/**
* Finds the first actor instance of a specified ID and category if there is one.
2020-03-17 04:31:30 +00:00
*/
Actor* Actor_Find(ActorContext* actorCtx, s32 actorId, s32 actorCategory) {
Actor* actor = actorCtx->actorLists[actorCategory].head;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
if (actorId == actor->id) {
2020-03-17 04:31:30 +00:00
return actor;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actor = actor->next;
}
return NULL;
}
/**
* Play the death sound effect and flash the screen white for 4 frames.
* While the screen flashes, the game freezes.
*/
void Enemy_StartFinishingBlow(GlobalContext* globalCtx, Actor* actor) {
globalCtx->actorCtx.freezeFlashTimer = 5;
Audio_PlaySoundAtPosition(globalCtx, &actor->world.pos, 20, NA_SE_EN_LAST_DAMAGE);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s16 func_80032CB4(s16* arg0, s16 arg1, s16 arg2, s16 arg3) {
if (DECR(arg0[1]) == 0) {
arg0[1] = Rand_S16Offset(arg1, arg2);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if ((arg0[1] - arg3) > 0) {
2020-03-17 04:31:30 +00:00
arg0[0] = 0;
2020-03-22 21:19:43 +00:00
} else if (((arg0[1] - arg3) > -2) || (arg0[1] < 2)) {
2020-03-17 04:31:30 +00:00
arg0[0] = 1;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
arg0[0] = 2;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return arg0[0];
}
2020-03-22 21:19:43 +00:00
s16 func_80032D60(s16* arg0, s16 arg1, s16 arg2, s16 arg3) {
if (DECR(arg0[1]) == 0) {
arg0[1] = Rand_S16Offset(arg1, arg2);
2020-03-17 04:31:30 +00:00
arg0[0]++;
2020-03-22 21:19:43 +00:00
if ((arg0[0] % 3) == 0) {
arg0[0] = (s32)(Rand_ZeroOne() * arg3) * 3;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
return arg0[0];
}
void BodyBreak_Alloc(BodyBreak* bodyBreak, s32 count, GlobalContext* globalCtx) {
u32 matricesSize;
u32 dListsSize;
u32 objectIdsSize;
matricesSize = (count + 1) * sizeof(*bodyBreak->matrices);
bodyBreak->matrices = ZeldaArena_MallocDebug(matricesSize, "../z_actor.c", 7540);
if (bodyBreak->matrices != NULL) {
dListsSize = (count + 1) * sizeof(*bodyBreak->dLists);
bodyBreak->dLists = ZeldaArena_MallocDebug(dListsSize, "../z_actor.c", 7543);
if (bodyBreak->dLists != NULL) {
objectIdsSize = (count + 1) * sizeof(*bodyBreak->objectIds);
bodyBreak->objectIds = ZeldaArena_MallocDebug(objectIdsSize, "../z_actor.c", 7546);
if (bodyBreak->objectIds != NULL) {
Lib_MemSet((u8*)bodyBreak->matrices, matricesSize, 0);
Lib_MemSet((u8*)bodyBreak->dLists, dListsSize, 0);
Lib_MemSet((u8*)bodyBreak->objectIds, objectIdsSize, 0);
bodyBreak->val = 1;
2020-03-17 04:31:30 +00:00
return;
}
}
}
if (bodyBreak->matrices != NULL) {
ZeldaArena_FreeDebug(bodyBreak->matrices, "../z_actor.c", 7558);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if (bodyBreak->dLists != NULL) {
ZeldaArena_FreeDebug(bodyBreak->dLists, "../z_actor.c", 7561);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if (bodyBreak->objectIds != NULL) {
ZeldaArena_FreeDebug(bodyBreak->objectIds, "../z_actor.c", 7564);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
void BodyBreak_SetInfo(BodyBreak* bodyBreak, s32 limbIndex, s32 minLimbIndex, s32 maxLimbIndex, u32 count, Gfx** dList,
s16 objectId) {
GlobalContext* globalCtx = Effect_GetGlobalCtx();
2020-03-17 04:31:30 +00:00
if ((globalCtx->actorCtx.freezeFlashTimer == 0) && (bodyBreak->val > 0)) {
if ((limbIndex >= minLimbIndex) && (limbIndex <= maxLimbIndex) && (*dList != NULL)) {
bodyBreak->dLists[bodyBreak->val] = *dList;
Matrix_Get(&bodyBreak->matrices[bodyBreak->val]);
bodyBreak->objectIds[bodyBreak->val] = objectId;
bodyBreak->val++;
2020-03-17 04:31:30 +00:00
}
if (limbIndex != bodyBreak->prevLimbIndex) {
bodyBreak->count++;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if ((u32)bodyBreak->count >= count) {
bodyBreak->count = bodyBreak->val - 1;
bodyBreak->val = BODYBREAK_STATUS_READY;
2020-03-17 04:31:30 +00:00
}
}
bodyBreak->prevLimbIndex = limbIndex;
2020-03-17 04:31:30 +00:00
}
s32 BodyBreak_SpawnParts(Actor* actor, BodyBreak* bodyBreak, GlobalContext* globalCtx, s16 type) {
EnPart* spawnedEnPart;
2020-03-17 04:31:30 +00:00
MtxF* mtx;
s16 objBankIndex;
if (bodyBreak->val != BODYBREAK_STATUS_READY) {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
while (bodyBreak->count > 0) {
Matrix_Put(&bodyBreak->matrices[bodyBreak->count]);
2020-03-17 04:31:30 +00:00
Matrix_Scale(1.0f / actor->scale.x, 1.0f / actor->scale.y, 1.0f / actor->scale.z, MTXMODE_APPLY);
Matrix_Get(&bodyBreak->matrices[bodyBreak->count]);
2020-03-17 04:31:30 +00:00
if (1) {
if (bodyBreak->objectIds[bodyBreak->count] >= 0) {
objBankIndex = bodyBreak->objectIds[bodyBreak->count];
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
objBankIndex = actor->objBankIndex;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
mtx = &bodyBreak->matrices[bodyBreak->count];
spawnedEnPart = (EnPart*)Actor_SpawnAsChild(&globalCtx->actorCtx, actor, globalCtx, ACTOR_EN_PART, mtx->wx,
mtx->wy, mtx->wz, 0, 0, objBankIndex, type);
2020-03-22 21:19:43 +00:00
if (spawnedEnPart != NULL) {
func_800D20CC(&bodyBreak->matrices[bodyBreak->count], &spawnedEnPart->actor.shape.rot, 0);
spawnedEnPart->displayList = bodyBreak->dLists[bodyBreak->count];
2020-03-17 04:31:30 +00:00
spawnedEnPart->actor.scale = actor->scale;
}
bodyBreak->count--;
2020-03-17 04:31:30 +00:00
}
bodyBreak->val = BODYBREAK_STATUS_FINISHED;
ZeldaArena_FreeDebug(bodyBreak->matrices, "../z_actor.c", 7678);
ZeldaArena_FreeDebug(bodyBreak->dLists, "../z_actor.c", 7679);
ZeldaArena_FreeDebug(bodyBreak->objectIds, "../z_actor.c", 7680);
2020-03-17 04:31:30 +00:00
return true;
2020-03-17 04:31:30 +00:00
}
void Actor_SpawnFloorDustRing(GlobalContext* globalCtx, Actor* actor, Vec3f* posXZ, f32 radius, s32 amountMinusOne,
f32 randAccelWeight, s16 scale, s16 scaleStep, u8 useLighting) {
Vec3f pos;
Vec3f velocity = { 0.0f, 0.0f, 0.0f };
Vec3f accel = { 0.0f, 0.3f, 0.0f };
f32 angle;
2020-03-17 04:31:30 +00:00
s32 i;
angle = (Rand_ZeroOne() - 0.5f) * (2.0f * 3.14f);
pos.y = actor->floorHeight;
accel.y += (Rand_ZeroOne() - 0.5f) * 0.2f;
2020-03-17 04:31:30 +00:00
for (i = amountMinusOne; i >= 0; i--) {
pos.x = Math_SinF(angle) * radius + posXZ->x;
pos.z = Math_CosF(angle) * radius + posXZ->z;
accel.x = (Rand_ZeroOne() - 0.5f) * randAccelWeight;
accel.z = (Rand_ZeroOne() - 0.5f) * randAccelWeight;
2020-03-17 04:31:30 +00:00
if (scale == 0) {
func_8002857C(globalCtx, &pos, &velocity, &accel);
2020-03-22 21:19:43 +00:00
} else {
if (useLighting) {
func_800286CC(globalCtx, &pos, &velocity, &accel, scale, scaleStep);
} else {
func_8002865C(globalCtx, &pos, &velocity, &accel, scale, scaleStep);
}
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
angle += (2.0f * 3.14f) / (amountMinusOne + 1.0f);
2020-03-17 04:31:30 +00:00
}
}
void func_80033480(GlobalContext* globalCtx, Vec3f* arg1, f32 arg2, s32 arg3, s16 arg4, s16 scaleStep, u8 arg6) {
Vec3f pos;
Vec3f velocity = { 0.0f, 0.0f, 0.0f };
Vec3f accel = { 0.0f, 0.3f, 0.0f };
s16 scale;
2020-03-17 04:31:30 +00:00
u32 var2;
s32 i;
2020-03-22 21:19:43 +00:00
for (i = arg3; i >= 0; i--) {
pos.x = arg1->x + ((Rand_ZeroOne() - 0.5f) * arg2);
pos.y = arg1->y + ((Rand_ZeroOne() - 0.5f) * arg2);
pos.z = arg1->z + ((Rand_ZeroOne() - 0.5f) * arg2);
2020-03-17 04:31:30 +00:00
scale = (s16)((Rand_ZeroOne() * arg4) * 0.2f) + arg4;
2020-03-17 04:31:30 +00:00
var2 = arg6;
2020-03-22 21:19:43 +00:00
if (var2 != 0) {
func_800286CC(globalCtx, &pos, &velocity, &accel, scale, scaleStep);
2020-03-22 21:19:43 +00:00
} else {
func_8002865C(globalCtx, &pos, &velocity, &accel, scale, scaleStep);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
Actor* Actor_GetCollidedExplosive(GlobalContext* globalCtx, Collider* collider) {
if ((collider->acFlags & AC_HIT) && (collider->ac->category == ACTORCAT_EXPLOSIVE)) {
collider->acFlags &= ~AC_HIT;
2020-03-17 04:31:30 +00:00
return collider->ac;
}
return NULL;
}
2020-03-22 21:19:43 +00:00
Actor* func_80033684(GlobalContext* globalCtx, Actor* explosiveActor) {
Actor* actor = globalCtx->actorCtx.actorLists[ACTORCAT_EXPLOSIVE].head;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
if ((actor == explosiveActor) || (actor->params != 1)) {
2020-03-17 04:31:30 +00:00
actor = actor->next;
2020-03-22 21:19:43 +00:00
} else {
if (Actor_WorldDistXYZToActor(explosiveActor, actor) <= (actor->shape.rot.z * 10) + 80.0f) {
2020-03-17 04:31:30 +00:00
return actor;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor = actor->next;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
return NULL;
}
/**
* Dynamically changes the category of a given actor instance.
* This is done by moving it to the corresponding category list and setting its category variable accordingly.
2020-03-17 04:31:30 +00:00
*/
void Actor_ChangeCategory(GlobalContext* globalCtx, ActorContext* actorCtx, Actor* actor, u8 actorCategory) {
Actor_RemoveFromCategory(globalCtx, actorCtx, actor);
Actor_AddToCategory(actorCtx, actor, actorCategory);
2020-03-17 04:31:30 +00:00
}
/**
* Checks if a hookshot or arrow actor is going to collide with the cylinder denoted by the
* actor's `cylRadius` and `cylHeight`.
* The check is only peformed if the projectile actor is within the provided sphere radius.
*
* Returns the actor if there will be collision, NULL otherwise.
*/
Actor* Actor_GetProjectileActor(GlobalContext* globalCtx, Actor* refActor, f32 radius) {
Actor* actor;
2020-03-17 04:31:30 +00:00
Vec3f spA8;
f32 deltaX;
f32 deltaY;
f32 deltaZ;
Vec3f sp90;
Vec3f sp84;
actor = globalCtx->actorCtx.actorLists[ACTORCAT_ITEMACTION].head;
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
if (((actor->id != ACTOR_ARMS_HOOK) && (actor->id != ACTOR_EN_ARROW)) || (actor == refActor)) {
2020-03-17 04:31:30 +00:00
actor = actor->next;
2020-03-22 21:19:43 +00:00
} else {
//! @bug The projectile actor gets unsafely casted to a hookshot to check its timer, even though
// it can also be an arrow.
// Luckily, the field at the same offset in the arrow actor is the x component of a vector
// which will rarely ever be 0. So its very unlikely for this bug to cause an issue.
if ((Math_Vec3f_DistXYZ(&refActor->world.pos, &actor->world.pos) > radius) ||
(((ArmsHook*)actor)->timer == 0)) {
2020-03-17 04:31:30 +00:00
actor = actor->next;
2020-03-22 21:19:43 +00:00
} else {
deltaX = Math_SinS(actor->world.rot.y) * (actor->speedXZ * 10.0f);
deltaY = actor->velocity.y + (actor->gravity * 10.0f);
deltaZ = Math_CosS(actor->world.rot.y) * (actor->speedXZ * 10.0f);
2020-03-17 04:31:30 +00:00
spA8.x = actor->world.pos.x + deltaX;
spA8.y = actor->world.pos.y + deltaY;
spA8.z = actor->world.pos.z + deltaZ;
2020-03-17 04:31:30 +00:00
if (CollisionCheck_CylSideVsLineSeg(refActor->colChkInfo.cylRadius, refActor->colChkInfo.cylHeight,
0.0f, &refActor->world.pos, &actor->world.pos, &spA8, &sp90,
&sp84)) {
return actor;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor = actor->next;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
}
return NULL;
}
/**
* Sets the actor's text id with a dynamic prefix based on the current scene.
*/
2020-03-22 21:19:43 +00:00
void Actor_SetTextWithPrefix(GlobalContext* globalCtx, Actor* actor, s16 baseTextId) {
2020-03-17 04:31:30 +00:00
s16 prefix;
2020-03-22 21:19:43 +00:00
switch (globalCtx->sceneNum) {
2020-03-17 04:31:30 +00:00
case SCENE_YDAN:
case SCENE_YDAN_BOSS:
case SCENE_MORIBOSSROOM:
case SCENE_KOKIRI_HOME:
case SCENE_KOKIRI_HOME3:
case SCENE_KOKIRI_HOME4:
case SCENE_KOKIRI_HOME5:
case SCENE_KOKIRI_SHOP:
case SCENE_LINK_HOME:
case SCENE_SPOT04:
case SCENE_SPOT05:
case SCENE_SPOT10:
case 112:
prefix = 0x1000;
break;
case SCENE_MALON_STABLE:
case SCENE_SPOT00:
case SCENE_SPOT20:
prefix = 0x2000;
break;
case SCENE_HIDAN:
case SCENE_DDAN_BOSS:
case SCENE_FIRE_BS:
case SCENE_SPOT16:
case SCENE_SPOT17:
case SCENE_SPOT18:
prefix = 0x3000;
break;
case SCENE_BDAN:
case SCENE_BDAN_BOSS:
case SCENE_SPOT03:
case SCENE_SPOT07:
case SCENE_SPOT08:
prefix = 0x4000;
break;
case SCENE_HAKADAN:
case SCENE_HAKADAN_BS:
case SCENE_KAKARIKO:
case SCENE_KAKARIKO3:
case SCENE_IMPA:
case SCENE_HUT:
case SCENE_HAKAANA:
case SCENE_HAKASITARELAY:
case SCENE_SPOT01:
case SCENE_SPOT02:
prefix = 0x5000;
break;
case SCENE_JYASINZOU:
case SCENE_JYASINBOSS:
case SCENE_LABO:
case SCENE_TENT:
case SCENE_SPOT06:
case SCENE_SPOT09:
case SCENE_SPOT11:
prefix = 0x6000;
break;
case SCENE_ENTRA:
case SCENE_MARKET_ALLEY:
case SCENE_MARKET_ALLEY_N:
case SCENE_MARKET_DAY:
case SCENE_MARKET_NIGHT:
case SCENE_MARKET_RUINS:
case SCENE_SPOT15:
prefix = 0x7000;
break;
default:
prefix = 0x0000;
break;
}
actor->textId = prefix | baseTextId;
}
/**
* Checks if a given actor will be standing on the ground after being translated
* by the provided distance and angle.
*
* Returns true if the actor will be standing on ground.
*/
s16 Actor_TestFloorInDirection(Actor* actor, GlobalContext* globalCtx, f32 distance, s16 angle) {
2020-03-17 04:31:30 +00:00
s16 ret;
s16 prevBgCheckFlags;
f32 dx;
f32 dz;
Vec3f prevActorPos;
Math_Vec3f_Copy(&prevActorPos, &actor->world.pos);
prevBgCheckFlags = actor->bgCheckFlags;
dx = Math_SinS(angle) * distance;
dz = Math_CosS(angle) * distance;
actor->world.pos.x += dx;
actor->world.pos.z += dz;
Actor_UpdateBgCheckInfo(globalCtx, actor, 0.0f, 0.0f, 0.0f, 4);
Math_Vec3f_Copy(&actor->world.pos, &prevActorPos);
2020-03-17 04:31:30 +00:00
ret = actor->bgCheckFlags & 1;
actor->bgCheckFlags = prevBgCheckFlags;
2020-03-17 04:31:30 +00:00
return ret;
}
/**
* Returns true if the player is targeting the provided actor
*/
s32 Actor_IsTargeted(GlobalContext* globalCtx, Actor* actor) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
if ((player->stateFlags1 & 0x10) && actor->isTargeted) {
return true;
2020-03-22 21:19:43 +00:00
} else {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
/**
* Returns true if the player is targeting an actor other than the provided actor
*/
s32 Actor_OtherIsTargeted(GlobalContext* globalCtx, Actor* actor) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
if ((player->stateFlags1 & 0x10) && !actor->isTargeted) {
return true;
2020-03-22 21:19:43 +00:00
} else {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
f32 func_80033AEC(Vec3f* arg0, Vec3f* arg1, f32 arg2, f32 arg3, f32 arg4, f32 arg5) {
2020-03-17 04:31:30 +00:00
f32 ret = 0.0f;
2020-03-22 21:19:43 +00:00
if (arg4 <= Math_Vec3f_DistXYZ(arg0, arg1)) {
ret = Math_SmoothStepToF(&arg1->x, arg0->x, arg2, arg3, 0.0f);
ret += Math_SmoothStepToF(&arg1->y, arg0->y, arg2, arg3, 0.0f);
ret += Math_SmoothStepToF(&arg1->z, arg0->z, arg2, arg3, 0.0f);
2020-03-22 21:19:43 +00:00
} else if (arg5 < Math_Vec3f_DistXYZ(arg0, arg1)) {
ret = Math_SmoothStepToF(&arg1->x, arg0->x, arg2, arg3, 0.0f);
ret += Math_SmoothStepToF(&arg1->y, arg0->y, arg2, arg3, 0.0f);
ret += Math_SmoothStepToF(&arg1->z, arg0->z, arg2, arg3, 0.0f);
2020-03-17 04:31:30 +00:00
}
return ret;
}
2020-03-22 21:19:43 +00:00
void func_80033C30(Vec3f* arg0, Vec3f* arg1, u8 alpha, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
MtxF sp60;
f32 var;
Vec3f sp50;
CollisionPoly* sp4C;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 8120);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (0) {} // Necessary to match
2020-03-17 04:31:30 +00:00
POLY_OPA_DISP = Gfx_CallSetupDL(POLY_OPA_DISP, 0x2C);
2020-03-17 04:31:30 +00:00
gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, alpha);
2020-03-17 04:31:30 +00:00
sp50.x = arg0->x;
sp50.y = arg0->y + 1.0f;
sp50.z = arg0->z;
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
var = BgCheck_EntityRaycastFloor2(globalCtx, &globalCtx->colCtx, &sp4C, &sp50);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (sp4C != NULL) {
2020-03-17 04:31:30 +00:00
func_80038A28(sp4C, arg0->x, var, arg0->z, &sp60);
Matrix_Put(&sp60);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Matrix_Translate(arg0->x, arg0->y, arg0->z, MTXMODE_NEW);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
Matrix_Scale(arg1->x, 1.0f, arg1->z, MTXMODE_APPLY);
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_actor.c", 8149),
2020-03-22 21:19:43 +00:00
G_MTX_MODELVIEW | G_MTX_LOAD);
Decompile Gameplay_Keep and fix all existing decompiled objects (#595) * First batch of files * Add missing folders back * Fix missing folders again * Finish fixing existing texture files * Gameplay_Keep XML finished * Most actor gameplay_keep undefined syms removed * Only ~200 gkeep symbols remain * All gkeep symbols that ZAP supports are fixed * Cleanup, and make gkeep names more accurate * Starting to figure out what some unknown blobs are, merge zeldaret in * fix a few more things * refactor gkeep * Change how gitkeep is handled * gkeep xml cleanup * Gkeep finished, now just waiting up ZAP updates * 100 link animations finished * 150 link animations finished * 200 link animations finished * 250 link animations finished * 350 link animations finished * 400 link animations finished * 450 link animations finished * 500 link animations finished * 550 link animations finished * All Link animations finished cannot build yet because ZAP doesn't have LinkAnimationHeader yet * xml changes for new zap stuff * finish gameplay_keep * fixing existing objects * ready for pr besides zap padding issue * mostly ready for pr * format all c files * all conflicts fixed * make changes that roman requested * fix thing i didn't mean to change * some animation symbols renamed * fixed roman's stuff * lifemeter hardcoded pointers removed * fix issue with incorrect data in gameplay_keep * removed unused asm * fixed most of fig's comments * fix all of fig's comments * reformat files * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * Update assets/xml/textures/icon_item_static.xml Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com> * fixed stuff * fixed most of roman's comments * remove leading zeroes * should build now * git subrepo pull --force tools/ZAPD subrepo: subdir: "tools/ZAPD" merged: "f84d8337b" upstream: origin: "https://github.com/zeldaret/ZAPD.git" branch: "master" commit: "f84d8337b" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo.git" commit: "2f68596" * all of gkeep symbols fixed * compiler error fixed * format files * final changes Co-authored-by: Zelllll <elijah@DESKTOP-NMP1I89.localdomain> Co-authored-by: Roman971 <32455037+Roman971@users.noreply.github.com>
2021-01-25 00:36:40 +00:00
gSPDisplayList(POLY_OPA_DISP++, &gCircleShadowDL);
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 8155);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_80033DB8(GlobalContext* globalCtx, s16 arg1, s16 arg2) {
s16 var = Quake_Add(&globalCtx->mainCamera, 3);
Quake_SetSpeed(var, 20000);
Quake_SetQuakeValues(var, arg1, 0, 0, 0);
Quake_SetCountdown(var, arg2);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_80033E1C(GlobalContext* globalCtx, s16 arg1, s16 arg2, s16 arg3) {
s16 var = Quake_Add(&globalCtx->mainCamera, 3);
Quake_SetSpeed(var, arg3);
Quake_SetQuakeValues(var, arg1, 0, 0, 0);
Quake_SetCountdown(var, arg2);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_80033E88(Actor* actor, GlobalContext* globalCtx, s16 arg2, s16 arg3) {
if (arg2 >= 5) {
func_800AA000(actor->xyzDistToPlayerSq, 0xFF, 0x14, 0x96);
2020-03-22 21:19:43 +00:00
} else {
func_800AA000(actor->xyzDistToPlayerSq, 0xB4, 0x14, 0x64);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
func_80033DB8(globalCtx, arg2, arg3);
}
f32 Rand_ZeroFloat(f32 f) {
return Rand_ZeroOne() * f;
2020-03-17 04:31:30 +00:00
}
f32 Rand_CenteredFloat(f32 f) {
return (Rand_ZeroOne() - 0.5f) * f;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
typedef struct {
2020-03-17 04:31:30 +00:00
/* 0x00 */ f32 unk_00;
/* 0x04 */ f32 unk_04;
/* 0x08 */ f32 unk_08;
/* 0x0C */ f32 unk_0C;
/* 0x10 */ f32 unk_10;
/* 0x14 */ u32 unk_14;
/* 0x18 */ u32 unk_18;
} struct_801160DC; // size = 0x1C
static struct_801160DC D_801160DC[] = {
2020-03-22 21:19:43 +00:00
{ 0.54f, 6000.0f, 5000.0f, 1.0f, 0.0f, 0x050011F0, 0x05001100 },
{ 0.644f, 12000.0f, 8000.0f, 1.0f, 0.0f, 0x06001530, 0x06001400 },
{ 0.64000005f, 8500.0f, 8000.0f, 1.75f, 0.1f, 0x050011F0, 0x05001100 },
2020-03-17 04:31:30 +00:00
};
void Actor_DrawDoorLock(GlobalContext* globalCtx, s32 frame, s32 type) {
2020-03-17 04:31:30 +00:00
struct_801160DC* entry;
s32 i;
MtxF spB0;
f32 var;
f32 temp1;
f32 temp2;
f32 temp3;
entry = &D_801160DC[type];
2020-03-17 04:31:30 +00:00
var = entry->unk_10;
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 8265);
2020-03-17 04:31:30 +00:00
Matrix_Translate(0.0f, entry->unk_08, 500.0f, MTXMODE_APPLY);
Matrix_Get(&spB0);
temp1 = sinf(entry->unk_00 - var) * -(10 - frame) * 0.1f * entry->unk_04;
temp2 = cosf(entry->unk_00 - var) * (10 - frame) * 0.1f * entry->unk_04;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
for (i = 0; i < 4; i++) {
2020-03-17 04:31:30 +00:00
Matrix_Put(&spB0);
Matrix_RotateZ(var, MTXMODE_APPLY);
Matrix_Translate(temp1, temp2, 0.0f, MTXMODE_APPLY);
2020-03-22 21:19:43 +00:00
if (entry->unk_0C != 1.0f) {
2020-03-17 04:31:30 +00:00
Matrix_Scale(entry->unk_0C, entry->unk_0C, entry->unk_0C, MTXMODE_APPLY);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_actor.c", 8299),
2020-03-22 21:19:43 +00:00
G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, entry->unk_14);
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (i % 2) {
2020-03-17 04:31:30 +00:00
temp3 = entry->unk_00 + entry->unk_00;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
temp3 = M_PI - (entry->unk_00 + entry->unk_00);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
var += temp3;
}
Matrix_Put(&spB0);
Matrix_Scale(frame * 0.1f, frame * 0.1f, frame * 0.1f, MTXMODE_APPLY);
2020-03-17 04:31:30 +00:00
gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(globalCtx->state.gfxCtx, "../z_actor.c", 8314),
2020-03-22 21:19:43 +00:00
G_MTX_MODELVIEW | G_MTX_LOAD);
gSPDisplayList(POLY_OPA_DISP++, entry->unk_18);
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 8319);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8003424C(GlobalContext* globalCtx, Vec3f* arg1) {
CollisionCheck_SpawnShieldParticlesMetal(globalCtx, arg1);
2020-03-17 04:31:30 +00:00
}
void Actor_SetColorFilter(Actor* actor, s16 colorFlag, s16 colorIntensityMax, s16 xluFlag, s16 duration) {
if ((colorFlag == 0x8000) && !(colorIntensityMax & 0x8000)) {
2020-03-17 04:31:30 +00:00
Audio_PlayActorSound2(actor, NA_SE_EN_LIGHT_ARROW_HIT);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actor->colorFilterParams = colorFlag | xluFlag | ((colorIntensityMax & 0xF8) << 5) | duration;
actor->colorFilterTimer = duration;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
Hilite* func_800342EC(Vec3f* object, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Vec3f lightDir;
lightDir.x = globalCtx->envCtx.unk_2A;
lightDir.y = globalCtx->envCtx.unk_2B;
lightDir.z = globalCtx->envCtx.unk_2C;
2020-03-17 04:31:30 +00:00
return func_8002EABC(object, &globalCtx->view.eye, &lightDir, globalCtx->state.gfxCtx);
}
2020-03-22 21:19:43 +00:00
Hilite* func_8003435C(Vec3f* object, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Vec3f lightDir;
lightDir.x = globalCtx->envCtx.unk_2A;
lightDir.y = globalCtx->envCtx.unk_2B;
lightDir.z = globalCtx->envCtx.unk_2C;
2020-03-17 04:31:30 +00:00
return func_8002EB44(object, &globalCtx->view.eye, &lightDir, globalCtx->state.gfxCtx);
}
s32 func_800343CC(GlobalContext* globalCtx, Actor* actor, s16* arg2, f32 arg3, callback1_800343CC unkFunc1,
callback2_800343CC unkFunc2) {
2020-03-17 04:31:30 +00:00
s16 sp26;
s16 sp24;
2020-03-22 21:19:43 +00:00
if (func_8002F194(actor, globalCtx)) {
2020-03-17 04:31:30 +00:00
*arg2 = 1;
return true;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (*arg2 != 0) {
2020-03-17 04:31:30 +00:00
*arg2 = unkFunc2(globalCtx, actor);
return false;
2020-03-17 04:31:30 +00:00
}
func_8002F374(globalCtx, actor, &sp26, &sp24);
if ((sp26 < 0) || (sp26 > SCREEN_WIDTH) || (sp24 < 0) || (sp24 > SCREEN_HEIGHT)) {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (!func_8002F2CC(actor, globalCtx, arg3)) {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
actor->textId = unkFunc1(globalCtx, actor);
return false;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
typedef struct {
/* 0x00 */ s16 unk_00;
/* 0x02 */ s16 unk_02;
/* 0x04 */ s16 unk_04;
/* 0x06 */ s16 unk_06;
/* 0x08 */ s16 unk_08;
/* 0x0A */ s16 unk_0A;
/* 0x0C */ u8 unk_0C;
2020-03-17 04:31:30 +00:00
} struct_80116130_0; // size = 0x10
2020-03-22 21:19:43 +00:00
typedef struct {
2020-03-17 04:31:30 +00:00
/* 0x00 */ struct_80116130_0 sub_00;
2020-03-22 21:19:43 +00:00
/* 0x10 */ f32 unk_10;
/* 0x14 */ s16 unk_14;
2020-03-17 04:31:30 +00:00
} struct_80116130; // size = 0x18
static struct_80116130 D_80116130[] = {
2020-03-17 04:31:30 +00:00
{ { 0x2AA8, 0xF1C8, 0x18E2, 0x1554, 0x0000, 0x0000, 1 }, 170.0f, 0x3FFC },
{ { 0x2AA8, 0xEAAC, 0x1554, 0x1554, 0xF8E4, 0x0E38, 1 }, 170.0f, 0x3FFC },
{ { 0x31C4, 0xE390, 0x0E38, 0x0E38, 0xF1C8, 0x071C, 1 }, 170.0f, 0x3FFC },
{ { 0x1554, 0xF1C8, 0x0000, 0x071C, 0xF8E4, 0x0000, 1 }, 170.0f, 0x3FFC },
{ { 0x2AA8, 0xF8E4, 0x071C, 0x0E38, 0xD558, 0x2AA8, 1 }, 170.0f, 0x3FFC },
{ { 0x0000, 0xE390, 0x2AA8, 0x3FFC, 0xF1C8, 0x0E38, 1 }, 170.0f, 0x3FFC },
2020-03-22 21:19:43 +00:00
{ { 0x2AA8, 0xF1C8, 0x0E38, 0x0E38, 0x0000, 0x0000, 1 }, 0.0f, 0x0000 },
{ { 0x2AA8, 0xF1C8, 0x0000, 0x0E38, 0x0000, 0x1C70, 1 }, 0.0f, 0x0000 },
{ { 0x2AA8, 0xF1C8, 0xF1C8, 0x0000, 0x0000, 0x0000, 1 }, 0.0f, 0x0000 },
{ { 0x071C, 0xF1C8, 0x0E38, 0x1C70, 0x0000, 0x0000, 1 }, 0.0f, 0x0000 },
{ { 0x0E38, 0xF1C8, 0x0000, 0x1C70, 0x0000, 0x0E38, 1 }, 0.0f, 0x0000 },
{ { 0x2AA8, 0xE390, 0x1C70, 0x0E38, 0xF1C8, 0x0E38, 1 }, 0.0f, 0x0000 },
{ { 0x18E2, 0xF1C8, 0x0E38, 0x0E38, 0x0000, 0x0000, 1 }, 0.0f, 0x0000 },
2020-03-17 04:31:30 +00:00
};
2020-03-22 21:19:43 +00:00
void func_800344BC(Actor* actor, struct_80034A14_arg1* arg1, s16 arg2, s16 arg3, s16 arg4, s16 arg5, s16 arg6, s16 arg7,
u8 arg8) {
2020-03-17 04:31:30 +00:00
s16 sp46;
s16 sp44;
s16 temp2;
2020-03-23 00:38:25 +00:00
s16 sp40;
s16 temp1;
2020-03-17 04:31:30 +00:00
Vec3f sp30;
sp30.x = actor->world.pos.x;
sp30.y = actor->world.pos.y + arg1->unk_14;
sp30.z = actor->world.pos.z;
2020-03-17 04:31:30 +00:00
sp46 = Math_Vec3f_Pitch(&sp30, &arg1->unk_18);
sp44 = Math_Vec3f_Yaw(&sp30, &arg1->unk_18);
sp40 = Math_Vec3f_Yaw(&actor->world.pos, &arg1->unk_18) - actor->shape.rot.y;
2020-03-17 04:31:30 +00:00
temp1 = CLAMP(sp40, -arg2, arg2);
Math_SmoothStepToS(&arg1->unk_08.y, temp1, 6, 2000, 1);
2020-03-17 04:31:30 +00:00
temp1 = (ABS(sp40) >= 0x8000) ? 0 : ABS(sp40);
arg1->unk_08.y = CLAMP(arg1->unk_08.y, -temp1, temp1);
2020-03-17 04:31:30 +00:00
sp40 -= arg1->unk_08.y;
2020-03-17 04:31:30 +00:00
temp1 = CLAMP(sp40, -arg5, arg5);
Math_SmoothStepToS(&arg1->unk_0E.y, temp1, 6, 2000, 1);
2020-03-17 04:31:30 +00:00
temp1 = (ABS(sp40) >= 0x8000) ? 0 : ABS(sp40);
arg1->unk_0E.y = CLAMP(arg1->unk_0E.y, -temp1, temp1);
2020-03-17 04:31:30 +00:00
if (arg8) {
Math_SmoothStepToS(&actor->shape.rot.y, sp44, 6, 2000, 1);
2020-03-23 00:38:25 +00:00
}
2020-03-17 04:31:30 +00:00
temp1 = CLAMP(sp46, arg4, (s16)(u16)arg3);
Math_SmoothStepToS(&arg1->unk_08.x, temp1, 6, 2000, 1);
2020-03-17 04:31:30 +00:00
temp2 = sp46 - arg1->unk_08.x;
2020-03-23 00:38:25 +00:00
temp1 = CLAMP(temp2, arg7, arg6);
Math_SmoothStepToS(&arg1->unk_0E.x, temp1, 6, 2000, 1);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s16 func_800347E8(s16 arg0) {
2020-03-17 04:31:30 +00:00
return D_80116130[arg0].unk_14;
}
2020-03-22 21:19:43 +00:00
s16 func_80034810(Actor* actor, struct_80034A14_arg1* arg1, f32 arg2, s16 arg3, s16 arg4) {
2020-03-17 04:31:30 +00:00
s32 pad;
s16 var;
s16 abs_var;
2020-03-22 21:19:43 +00:00
if (arg4 != 0) {
2020-03-17 04:31:30 +00:00
return arg4;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (arg1->unk_00 != 0) {
2020-03-17 04:31:30 +00:00
return 4;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if (arg2 < Math_Vec3f_DistXYZ(&actor->world.pos, &arg1->unk_18)) {
2020-03-17 04:31:30 +00:00
arg1->unk_04 = 0;
arg1->unk_06 = 0;
return 1;
}
var = Math_Vec3f_Yaw(&actor->world.pos, &arg1->unk_18);
2020-03-17 04:31:30 +00:00
abs_var = ABS((s16)((f32)var - actor->shape.rot.y));
2020-03-22 21:19:43 +00:00
if (arg3 >= abs_var) {
2020-03-17 04:31:30 +00:00
arg1->unk_04 = 0;
arg1->unk_06 = 0;
return 2;
}
2020-03-22 21:19:43 +00:00
if (DECR(arg1->unk_04) != 0) {
2020-03-17 04:31:30 +00:00
return arg1->unk_02;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
switch (arg1->unk_06) {
2020-03-17 04:31:30 +00:00
case 0:
case 2:
arg1->unk_04 = Rand_S16Offset(30, 30);
2020-03-17 04:31:30 +00:00
arg1->unk_06++;
return 1;
case 1:
arg1->unk_04 = Rand_S16Offset(10, 10);
2020-03-17 04:31:30 +00:00
arg1->unk_06++;
return 3;
}
return 4;
}
2020-03-22 21:19:43 +00:00
void func_80034A14(Actor* actor, struct_80034A14_arg1* arg1, s16 arg2, s16 arg3) {
2020-03-17 04:31:30 +00:00
struct_80116130_0 sp38;
arg1->unk_02 = func_80034810(actor, arg1, D_80116130[arg2].unk_10, D_80116130[arg2].unk_14, arg3);
sp38 = D_80116130[arg2].sub_00;
2020-03-22 21:19:43 +00:00
switch (arg1->unk_02) {
2020-03-17 04:31:30 +00:00
case 1:
sp38.unk_00 = 0;
sp38.unk_04 = 0;
sp38.unk_02 = 0;
case 3:
sp38.unk_06 = 0;
sp38.unk_0A = 0;
sp38.unk_08 = 0;
case 2:
sp38.unk_0C = 0;
}
2020-03-22 21:19:43 +00:00
func_800344BC(actor, arg1, sp38.unk_00, sp38.unk_04, sp38.unk_02, sp38.unk_06, sp38.unk_0A, sp38.unk_08,
sp38.unk_0C);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
Gfx* func_80034B28(GraphicsContext* gfxCtx) {
2020-03-17 04:31:30 +00:00
Gfx* displayList;
displayList = Graph_Alloc(gfxCtx, sizeof(Gfx));
gSPEndDisplayList(displayList);
return displayList;
}
2020-03-22 21:19:43 +00:00
Gfx* func_80034B54(GraphicsContext* gfxCtx) {
2020-03-17 04:31:30 +00:00
Gfx* displayListHead;
Gfx* displayList;
2020-03-17 04:31:30 +00:00
displayList = displayListHead = Graph_Alloc(gfxCtx, 2 * sizeof(Gfx));
2020-03-17 04:31:30 +00:00
2020-04-05 19:41:49 +00:00
gDPSetRenderMode(displayListHead++, G_RM_FOG_SHADE_A,
2020-03-22 21:19:43 +00:00
AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU | FORCE_BL |
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA));
2020-03-17 04:31:30 +00:00
gSPEndDisplayList(displayListHead++);
2020-03-17 04:31:30 +00:00
return displayList;
}
void func_80034BA0(GlobalContext* globalCtx, SkelAnime* skelAnime, OverrideLimbDraw overrideLimbDraw,
PostLimbDraw postLimbDraw, Actor* actor, s16 alpha) {
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 8831);
2020-03-17 04:31:30 +00:00
func_80093D18(globalCtx->state.gfxCtx);
gDPPipeSync(POLY_OPA_DISP++);
gDPSetEnvColor(POLY_OPA_DISP++, 0, 0, 0, alpha);
gDPPipeSync(POLY_OPA_DISP++);
gSPSegment(POLY_OPA_DISP++, 0x0C, func_80034B28(globalCtx->state.gfxCtx));
2020-03-17 04:31:30 +00:00
POLY_OPA_DISP = SkelAnime_DrawFlex(globalCtx, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount,
overrideLimbDraw, postLimbDraw, actor, POLY_OPA_DISP);
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 8860);
2020-03-17 04:31:30 +00:00
}
void func_80034CC4(GlobalContext* globalCtx, SkelAnime* skelAnime, OverrideLimbDraw overrideLimbDraw,
PostLimbDraw postLimbDraw, Actor* actor, s16 alpha) {
OPEN_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 8876);
2020-03-17 04:31:30 +00:00
func_80093D84(globalCtx->state.gfxCtx);
gDPPipeSync(POLY_XLU_DISP++);
gDPSetEnvColor(POLY_XLU_DISP++, 0, 0, 0, alpha);
gSPSegment(POLY_XLU_DISP++, 0x0C, func_80034B54(globalCtx->state.gfxCtx));
2020-03-17 04:31:30 +00:00
POLY_XLU_DISP = SkelAnime_DrawFlex(globalCtx, skelAnime->skeleton, skelAnime->jointTable, skelAnime->dListCount,
overrideLimbDraw, postLimbDraw, actor, POLY_XLU_DISP);
2020-03-17 04:31:30 +00:00
CLOSE_DISPS(globalCtx->state.gfxCtx, "../z_actor.c", 8904);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s16 func_80034DD4(Actor* actor, GlobalContext* globalCtx, s16 arg2, f32 arg3) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
f32 var;
if ((globalCtx->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) {
var = Math_Vec3f_DistXYZ(&actor->world.pos, &globalCtx->view.eye) * 0.25f;
2020-03-22 21:19:43 +00:00
} else {
var = Math_Vec3f_DistXYZ(&actor->world.pos, &player->actor.world.pos);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
if (arg3 < var) {
actor->flags &= ~1;
Math_SmoothStepToS(&arg2, 0, 6, 0x14, 1);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor->flags |= 1;
Math_SmoothStepToS(&arg2, 0xFF, 6, 0x14, 1);
2020-03-17 04:31:30 +00:00
}
return arg2;
}
void func_80034EC0(SkelAnime* skelAnime, struct_80034EC0_Entry* animations, s32 index) {
2020-03-17 04:31:30 +00:00
f32 frameCount;
animations += index;
2020-03-17 04:31:30 +00:00
if (animations->frameCount > 0.0f) {
frameCount = animations->frameCount;
2020-03-22 21:19:43 +00:00
} else {
frameCount = Animation_GetLastFrame(animations->animation);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
Animation_Change(skelAnime, animations->animation, animations->playbackSpeed, animations->startFrame, frameCount,
animations->mode, animations->transitionRate);
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_80034F54(GlobalContext* globalCtx, s16* arg1, s16* arg2, s32 arg3) {
2020-03-17 04:31:30 +00:00
u32 frames = globalCtx->gameplayFrames;
s32 i;
2020-03-22 21:19:43 +00:00
for (i = 0; i < arg3; i++) {
2020-03-17 04:31:30 +00:00
arg1[i] = (0x814 + 50 * i) * frames;
arg2[i] = (0x940 + 50 * i) * frames;
}
}
2020-03-22 21:19:43 +00:00
void Actor_Noop(Actor* actor, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_80035124(Actor* actor, GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
s32 ret = 0;
2020-03-22 21:19:43 +00:00
switch (actor->params) {
2020-03-17 04:31:30 +00:00
case 0:
if (Actor_HasParent(actor, globalCtx)) {
2020-03-17 04:31:30 +00:00
actor->params = 1;
2020-03-22 21:19:43 +00:00
} else if (!(actor->bgCheckFlags & 1)) {
2020-03-17 04:31:30 +00:00
Actor_MoveForward(actor);
Math_SmoothStepToF(&actor->speedXZ, 0.0f, 1.0f, 0.1f, 0.0f);
2020-03-22 21:19:43 +00:00
} else if ((actor->bgCheckFlags & 2) && (actor->velocity.y < -4.0f)) {
2020-03-17 04:31:30 +00:00
ret = 1;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor->shape.rot.x = actor->shape.rot.z = 0;
func_8002F580(actor, globalCtx);
}
break;
case 1:
if (Actor_HasNoParent(actor, globalCtx)) {
2020-03-17 04:31:30 +00:00
actor->params = 0;
}
break;
}
Actor_UpdateBgCheckInfo(globalCtx, actor, actor->colChkInfo.cylHeight, actor->colChkInfo.cylRadius,
actor->colChkInfo.cylRadius, 0x1D);
2020-03-17 04:31:30 +00:00
return ret;
}
#include "z_cheap_proc.c"
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
u8 func_800353E8(GlobalContext* globalCtx) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
2020-03-17 04:31:30 +00:00
return player->unk_845;
}
/**
* Finds the first actor instance of a specified ID and category within a given range from
* an actor if there is one. If the ID provided is -1, this will look for any actor of the
* specified category rather than a specific ID.
2020-03-17 04:31:30 +00:00
*/
Actor* Actor_FindNearby(GlobalContext* globalCtx, Actor* refActor, s16 actorId, u8 actorCategory, f32 range) {
Actor* actor = globalCtx->actorCtx.actorLists[actorCategory].head;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
while (actor != NULL) {
if (actor == refActor || ((actorId != -1) && (actorId != actor->id))) {
2020-03-17 04:31:30 +00:00
actor = actor->next;
2020-03-22 21:19:43 +00:00
} else {
if (Actor_WorldDistXYZToActor(refActor, actor) <= range) {
2020-03-17 04:31:30 +00:00
return actor;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
actor = actor->next;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
return NULL;
}
2020-03-22 21:19:43 +00:00
s32 func_800354B4(GlobalContext* globalCtx, Actor* actor, f32 range, s16 arg3, s16 arg4, s16 arg5) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
s16 var1;
s16 var2;
var1 = (s16)(actor->yawTowardsPlayer + 0x8000) - player->actor.shape.rot.y;
var2 = actor->yawTowardsPlayer - arg5;
2020-03-17 04:31:30 +00:00
if ((actor->xzDistToPlayer <= range) && (player->swordState != 0) && (arg4 >= ABS(var1)) && (arg3 >= ABS(var2))) {
return true;
2020-03-22 21:19:43 +00:00
} else {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
void func_8003555C(GlobalContext* globalCtx, Vec3f* arg1, Vec3f* arg2, Vec3f* arg3) {
Color_RGBA8 color1;
Color_RGBA8 color2;
2020-03-17 04:31:30 +00:00
color1.r = 200;
color1.g = 160;
color1.b = 120;
2020-03-17 04:31:30 +00:00
color2.r = 130;
color2.g = 90;
color2.b = 50;
2020-03-17 04:31:30 +00:00
//! @bug color1 and color2 alpha components not set before being passed on
EffectSsKiraKira_SpawnSmall(globalCtx, arg1, arg2, arg3, &color1, &color2);
2020-03-17 04:31:30 +00:00
}
Vec3f D_80116268 = { 0.0f, -1.5f, 0.0f };
Vec3f D_80116274 = { 0.0f, -0.2f, 0.0f };
2020-03-22 21:19:43 +00:00
Gfx D_80116280[] = {
2020-04-05 19:41:49 +00:00
gsDPSetRenderMode(G_RM_FOG_SHADE_A, AA_EN | Z_CMP | Z_UPD | IM_RD | CLR_ON_CVG | CVG_DST_WRAP | ZMODE_XLU |
FORCE_BL | GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_MEM, G_BL_1MA)),
2020-03-17 04:31:30 +00:00
gsDPSetAlphaCompare(G_AC_THRESHOLD),
gsSPEndDisplayList(),
};
2020-03-22 21:19:43 +00:00
void func_800355B8(GlobalContext* globalCtx, Vec3f* arg1) {
2020-03-17 04:31:30 +00:00
func_8003555C(globalCtx, arg1, &D_80116268, &D_80116274);
}
z_collision_check.c (#73) * func_8005B280 ok * func_8005B65C OK * split out func_8005BD50 * func_8005B7C0 OK * func_8005B7F4 OK * func_8005B824 OK * func_8005B860 ok * improve sanity * func_8005B6B0 ok, ColliderInit_Actor structs added * func_8005B884 ok * func_8005BBF8 ok, split out func_8005BF50 * split more stuff out of func_8005C050.s * func_8005C050 OK * func_8005BA30 fakish OK, func_8005BAD8 real OK * func_8005BB48 OK, func_8005BA84 almost decomp'd, but type issues * func_8005BB10 Ok * func_8005BF50 OK * func_8005BE50 OK * func_8005BD50 OK * func_8005BCC8 Ok * func_8005BC28 * func_8005BB8C func_8005BBB0 func_8005BBD4 Ok * save my work commit * func_8005C2BC fake OK * func_8005C5B0 ok * func_8005C608 ok * func_8005C6C0 ok * func_8005C6F8 ok * func_8005C730 ok * func_8005C774 func_8005C798 func_8005C7BC OK * func_8005C7E0 ok, func_8005C810 split * func_8005C810 OK * func_8005C8C8 ok * func_8005C964 OK * func_8005CA88 ok * func_8005CBAC ok * func_8005C124 func_8005C1AC func_8005C234 func_8005CC98 OK * func_8005CD34 func_8005CDD0 Ok * func_8005CE6C ok * func_8005CEC4 ok * func_8005CEDC ok * func_8005CF90 Ok * standardize type names/vars more * func_8005D3BC ok * func_8005D40C OK, z64.h CollisionCheckContext * func_8005D4B4 func_8005D4C8 ok * partial data section migration * improve function documentation, OT->OC * Actor_CollisionCheck_SetOC ok * Actor_CollisionCheck_SetAT Actor_CollisionCheck_SetAC Ok * func_8005BA84 ok * func_800611A0 ok * func_80061274 ok * clean up func_80061274 * func_8006139C ok * func_8005E9C0 and dependencies OK * minor cleanup to func_8005E9C0 * func_8005EC6C OK! * func_8005E81C ok * func_8005E604 ok * func_8005E2EC func_8005E4F8 OK * func_8005DE9C OK func_8005D8AC disassembled * func_8006146C func_8006268C ok * func_8005EEE0 ok * func_8005F17C * func_8005F39C ok * func_8005F5B0 decompiled, not matching * func_8005F7D0 decomp, func_8005D218 and func_8005D324 OK * func_8005FA30 ok, split more functions * func_8005FC04 ok * func_8005FDCC k * func_8005FF90 OK OK OK * func_80060204 dead * func_800604B0 ok * func_80060704 func_80060994 ok, func_80060C2C somewhat disassembled. AT to AC matrix doneish * func_800635D0 ok, func_80062ECC not so much * OcLine oks * D_8011DF28 functions disassembled * D_8011DF5C functions OK * setAT_SAC. setAC_SAC, setOC_SAC OK * func_80061C98 decompiled, func_80061BF4, func_80061C18 OK * func_800617D4 ok, func_800614A4 disassembled * CollisionCheck_OC D_8011DFAC functions OK * func_80062530 ok * CollisionCheck_generalLineOcCheck subfunctions OK * func_800622E4 ok * after a long fought battle, func_80061F64 has fallen. * func_800628A4 disassembled * func_800627A0 func_8006285C OK * ActorCollider_Cylinder_Update, func_80062718, func_80062734 ok * func_80062CD4 decompiled, import EffShield/EffSpark types from MM * various SubActor98 struct functions OK * func_8005D4DC func_8005D62C ok * .data section migrated, more OKs, fix NON_MATCHINGs to use effect structs * func_80060C2C ok * minor code tweaks * func_80061C98 ok somehow * Attempt to fix some unknowns, move types out of z64actor, add set3 ColliderInit types * Apply changes * formatting * tweak a couple function names * krim changes, func naming * missed some things * function renames * Implement GenColliderInit.py utility * Implement pr changes, GenColliderInit.py, DamageTable.py, z_collision_btltbls.c fully matching * func_800614A4 ok * Implement Roman's fixes, name Collider unknowns, rename COLTYPE -> COLSHAPE and define new COLTYPE * collisionCheckCtx -> colChkCtx, fix small things
2020-04-26 02:43:35 +00:00
u8 func_800355E4(GlobalContext* globalCtx, Collider* collider) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
if ((collider->acFlags & AC_TYPE_PLAYER) && (player->swordState != 0) && (player->swordAnimation == 0x16)) {
return true;
2020-03-22 21:19:43 +00:00
} else {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
u8 Actor_ApplyDamage(Actor* actor) {
z_collision_check.c (#73) * func_8005B280 ok * func_8005B65C OK * split out func_8005BD50 * func_8005B7C0 OK * func_8005B7F4 OK * func_8005B824 OK * func_8005B860 ok * improve sanity * func_8005B6B0 ok, ColliderInit_Actor structs added * func_8005B884 ok * func_8005BBF8 ok, split out func_8005BF50 * split more stuff out of func_8005C050.s * func_8005C050 OK * func_8005BA30 fakish OK, func_8005BAD8 real OK * func_8005BB48 OK, func_8005BA84 almost decomp'd, but type issues * func_8005BB10 Ok * func_8005BF50 OK * func_8005BE50 OK * func_8005BD50 OK * func_8005BCC8 Ok * func_8005BC28 * func_8005BB8C func_8005BBB0 func_8005BBD4 Ok * save my work commit * func_8005C2BC fake OK * func_8005C5B0 ok * func_8005C608 ok * func_8005C6C0 ok * func_8005C6F8 ok * func_8005C730 ok * func_8005C774 func_8005C798 func_8005C7BC OK * func_8005C7E0 ok, func_8005C810 split * func_8005C810 OK * func_8005C8C8 ok * func_8005C964 OK * func_8005CA88 ok * func_8005CBAC ok * func_8005C124 func_8005C1AC func_8005C234 func_8005CC98 OK * func_8005CD34 func_8005CDD0 Ok * func_8005CE6C ok * func_8005CEC4 ok * func_8005CEDC ok * func_8005CF90 Ok * standardize type names/vars more * func_8005D3BC ok * func_8005D40C OK, z64.h CollisionCheckContext * func_8005D4B4 func_8005D4C8 ok * partial data section migration * improve function documentation, OT->OC * Actor_CollisionCheck_SetOC ok * Actor_CollisionCheck_SetAT Actor_CollisionCheck_SetAC Ok * func_8005BA84 ok * func_800611A0 ok * func_80061274 ok * clean up func_80061274 * func_8006139C ok * func_8005E9C0 and dependencies OK * minor cleanup to func_8005E9C0 * func_8005EC6C OK! * func_8005E81C ok * func_8005E604 ok * func_8005E2EC func_8005E4F8 OK * func_8005DE9C OK func_8005D8AC disassembled * func_8006146C func_8006268C ok * func_8005EEE0 ok * func_8005F17C * func_8005F39C ok * func_8005F5B0 decompiled, not matching * func_8005F7D0 decomp, func_8005D218 and func_8005D324 OK * func_8005FA30 ok, split more functions * func_8005FC04 ok * func_8005FDCC k * func_8005FF90 OK OK OK * func_80060204 dead * func_800604B0 ok * func_80060704 func_80060994 ok, func_80060C2C somewhat disassembled. AT to AC matrix doneish * func_800635D0 ok, func_80062ECC not so much * OcLine oks * D_8011DF28 functions disassembled * D_8011DF5C functions OK * setAT_SAC. setAC_SAC, setOC_SAC OK * func_80061C98 decompiled, func_80061BF4, func_80061C18 OK * func_800617D4 ok, func_800614A4 disassembled * CollisionCheck_OC D_8011DFAC functions OK * func_80062530 ok * CollisionCheck_generalLineOcCheck subfunctions OK * func_800622E4 ok * after a long fought battle, func_80061F64 has fallen. * func_800628A4 disassembled * func_800627A0 func_8006285C OK * ActorCollider_Cylinder_Update, func_80062718, func_80062734 ok * func_80062CD4 decompiled, import EffShield/EffSpark types from MM * various SubActor98 struct functions OK * func_8005D4DC func_8005D62C ok * .data section migrated, more OKs, fix NON_MATCHINGs to use effect structs * func_80060C2C ok * minor code tweaks * func_80061C98 ok somehow * Attempt to fix some unknowns, move types out of z64actor, add set3 ColliderInit types * Apply changes * formatting * tweak a couple function names * krim changes, func naming * missed some things * function renames * Implement GenColliderInit.py utility * Implement pr changes, GenColliderInit.py, DamageTable.py, z_collision_btltbls.c fully matching * func_800614A4 ok * Implement Roman's fixes, name Collider unknowns, rename COLTYPE -> COLSHAPE and define new COLTYPE * collisionCheckCtx -> colChkCtx, fix small things
2020-04-26 02:43:35 +00:00
if (actor->colChkInfo.damage >= actor->colChkInfo.health) {
actor->colChkInfo.health = 0;
2020-03-22 21:19:43 +00:00
} else {
z_collision_check.c (#73) * func_8005B280 ok * func_8005B65C OK * split out func_8005BD50 * func_8005B7C0 OK * func_8005B7F4 OK * func_8005B824 OK * func_8005B860 ok * improve sanity * func_8005B6B0 ok, ColliderInit_Actor structs added * func_8005B884 ok * func_8005BBF8 ok, split out func_8005BF50 * split more stuff out of func_8005C050.s * func_8005C050 OK * func_8005BA30 fakish OK, func_8005BAD8 real OK * func_8005BB48 OK, func_8005BA84 almost decomp'd, but type issues * func_8005BB10 Ok * func_8005BF50 OK * func_8005BE50 OK * func_8005BD50 OK * func_8005BCC8 Ok * func_8005BC28 * func_8005BB8C func_8005BBB0 func_8005BBD4 Ok * save my work commit * func_8005C2BC fake OK * func_8005C5B0 ok * func_8005C608 ok * func_8005C6C0 ok * func_8005C6F8 ok * func_8005C730 ok * func_8005C774 func_8005C798 func_8005C7BC OK * func_8005C7E0 ok, func_8005C810 split * func_8005C810 OK * func_8005C8C8 ok * func_8005C964 OK * func_8005CA88 ok * func_8005CBAC ok * func_8005C124 func_8005C1AC func_8005C234 func_8005CC98 OK * func_8005CD34 func_8005CDD0 Ok * func_8005CE6C ok * func_8005CEC4 ok * func_8005CEDC ok * func_8005CF90 Ok * standardize type names/vars more * func_8005D3BC ok * func_8005D40C OK, z64.h CollisionCheckContext * func_8005D4B4 func_8005D4C8 ok * partial data section migration * improve function documentation, OT->OC * Actor_CollisionCheck_SetOC ok * Actor_CollisionCheck_SetAT Actor_CollisionCheck_SetAC Ok * func_8005BA84 ok * func_800611A0 ok * func_80061274 ok * clean up func_80061274 * func_8006139C ok * func_8005E9C0 and dependencies OK * minor cleanup to func_8005E9C0 * func_8005EC6C OK! * func_8005E81C ok * func_8005E604 ok * func_8005E2EC func_8005E4F8 OK * func_8005DE9C OK func_8005D8AC disassembled * func_8006146C func_8006268C ok * func_8005EEE0 ok * func_8005F17C * func_8005F39C ok * func_8005F5B0 decompiled, not matching * func_8005F7D0 decomp, func_8005D218 and func_8005D324 OK * func_8005FA30 ok, split more functions * func_8005FC04 ok * func_8005FDCC k * func_8005FF90 OK OK OK * func_80060204 dead * func_800604B0 ok * func_80060704 func_80060994 ok, func_80060C2C somewhat disassembled. AT to AC matrix doneish * func_800635D0 ok, func_80062ECC not so much * OcLine oks * D_8011DF28 functions disassembled * D_8011DF5C functions OK * setAT_SAC. setAC_SAC, setOC_SAC OK * func_80061C98 decompiled, func_80061BF4, func_80061C18 OK * func_800617D4 ok, func_800614A4 disassembled * CollisionCheck_OC D_8011DFAC functions OK * func_80062530 ok * CollisionCheck_generalLineOcCheck subfunctions OK * func_800622E4 ok * after a long fought battle, func_80061F64 has fallen. * func_800628A4 disassembled * func_800627A0 func_8006285C OK * ActorCollider_Cylinder_Update, func_80062718, func_80062734 ok * func_80062CD4 decompiled, import EffShield/EffSpark types from MM * various SubActor98 struct functions OK * func_8005D4DC func_8005D62C ok * .data section migrated, more OKs, fix NON_MATCHINGs to use effect structs * func_80060C2C ok * minor code tweaks * func_80061C98 ok somehow * Attempt to fix some unknowns, move types out of z64actor, add set3 ColliderInit types * Apply changes * formatting * tweak a couple function names * krim changes, func naming * missed some things * function renames * Implement GenColliderInit.py utility * Implement pr changes, GenColliderInit.py, DamageTable.py, z_collision_btltbls.c fully matching * func_800614A4 ok * Implement Roman's fixes, name Collider unknowns, rename COLTYPE -> COLSHAPE and define new COLTYPE * collisionCheckCtx -> colChkCtx, fix small things
2020-04-26 02:43:35 +00:00
actor->colChkInfo.health -= actor->colChkInfo.damage;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
z_collision_check.c (#73) * func_8005B280 ok * func_8005B65C OK * split out func_8005BD50 * func_8005B7C0 OK * func_8005B7F4 OK * func_8005B824 OK * func_8005B860 ok * improve sanity * func_8005B6B0 ok, ColliderInit_Actor structs added * func_8005B884 ok * func_8005BBF8 ok, split out func_8005BF50 * split more stuff out of func_8005C050.s * func_8005C050 OK * func_8005BA30 fakish OK, func_8005BAD8 real OK * func_8005BB48 OK, func_8005BA84 almost decomp'd, but type issues * func_8005BB10 Ok * func_8005BF50 OK * func_8005BE50 OK * func_8005BD50 OK * func_8005BCC8 Ok * func_8005BC28 * func_8005BB8C func_8005BBB0 func_8005BBD4 Ok * save my work commit * func_8005C2BC fake OK * func_8005C5B0 ok * func_8005C608 ok * func_8005C6C0 ok * func_8005C6F8 ok * func_8005C730 ok * func_8005C774 func_8005C798 func_8005C7BC OK * func_8005C7E0 ok, func_8005C810 split * func_8005C810 OK * func_8005C8C8 ok * func_8005C964 OK * func_8005CA88 ok * func_8005CBAC ok * func_8005C124 func_8005C1AC func_8005C234 func_8005CC98 OK * func_8005CD34 func_8005CDD0 Ok * func_8005CE6C ok * func_8005CEC4 ok * func_8005CEDC ok * func_8005CF90 Ok * standardize type names/vars more * func_8005D3BC ok * func_8005D40C OK, z64.h CollisionCheckContext * func_8005D4B4 func_8005D4C8 ok * partial data section migration * improve function documentation, OT->OC * Actor_CollisionCheck_SetOC ok * Actor_CollisionCheck_SetAT Actor_CollisionCheck_SetAC Ok * func_8005BA84 ok * func_800611A0 ok * func_80061274 ok * clean up func_80061274 * func_8006139C ok * func_8005E9C0 and dependencies OK * minor cleanup to func_8005E9C0 * func_8005EC6C OK! * func_8005E81C ok * func_8005E604 ok * func_8005E2EC func_8005E4F8 OK * func_8005DE9C OK func_8005D8AC disassembled * func_8006146C func_8006268C ok * func_8005EEE0 ok * func_8005F17C * func_8005F39C ok * func_8005F5B0 decompiled, not matching * func_8005F7D0 decomp, func_8005D218 and func_8005D324 OK * func_8005FA30 ok, split more functions * func_8005FC04 ok * func_8005FDCC k * func_8005FF90 OK OK OK * func_80060204 dead * func_800604B0 ok * func_80060704 func_80060994 ok, func_80060C2C somewhat disassembled. AT to AC matrix doneish * func_800635D0 ok, func_80062ECC not so much * OcLine oks * D_8011DF28 functions disassembled * D_8011DF5C functions OK * setAT_SAC. setAC_SAC, setOC_SAC OK * func_80061C98 decompiled, func_80061BF4, func_80061C18 OK * func_800617D4 ok, func_800614A4 disassembled * CollisionCheck_OC D_8011DFAC functions OK * func_80062530 ok * CollisionCheck_generalLineOcCheck subfunctions OK * func_800622E4 ok * after a long fought battle, func_80061F64 has fallen. * func_800628A4 disassembled * func_800627A0 func_8006285C OK * ActorCollider_Cylinder_Update, func_80062718, func_80062734 ok * func_80062CD4 decompiled, import EffShield/EffSpark types from MM * various SubActor98 struct functions OK * func_8005D4DC func_8005D62C ok * .data section migrated, more OKs, fix NON_MATCHINGs to use effect structs * func_80060C2C ok * minor code tweaks * func_80061C98 ok somehow * Attempt to fix some unknowns, move types out of z64actor, add set3 ColliderInit types * Apply changes * formatting * tweak a couple function names * krim changes, func naming * missed some things * function renames * Implement GenColliderInit.py utility * Implement pr changes, GenColliderInit.py, DamageTable.py, z_collision_btltbls.c fully matching * func_800614A4 ok * Implement Roman's fixes, name Collider unknowns, rename COLTYPE -> COLSHAPE and define new COLTYPE * collisionCheckCtx -> colChkCtx, fix small things
2020-04-26 02:43:35 +00:00
return actor->colChkInfo.health;
2020-03-17 04:31:30 +00:00
}
void Actor_SetDropFlag(Actor* actor, ColliderInfo* colInfo, s32 freezeFlag) {
if (colInfo->acHitInfo == NULL) {
actor->dropFlag = 0x00;
} else if (freezeFlag && (colInfo->acHitInfo->toucher.dmgFlags & 0x10060000)) {
actor->freezeTimer = colInfo->acHitInfo->toucher.damage;
actor->dropFlag = 0x00;
} else if (colInfo->acHitInfo->toucher.dmgFlags & 0x0800) {
actor->dropFlag = 0x01;
} else if (colInfo->acHitInfo->toucher.dmgFlags & 0x1000) {
actor->dropFlag = 0x02;
} else if (colInfo->acHitInfo->toucher.dmgFlags & 0x4000) {
actor->dropFlag = 0x04;
} else if (colInfo->acHitInfo->toucher.dmgFlags & 0x8000) {
actor->dropFlag = 0x08;
} else if (colInfo->acHitInfo->toucher.dmgFlags & 0x10000) {
actor->dropFlag = 0x10;
} else if (colInfo->acHitInfo->toucher.dmgFlags & 0x2000) {
actor->dropFlag = 0x20;
} else if (colInfo->acHitInfo->toucher.dmgFlags & 0x80000) {
2020-03-22 21:19:43 +00:00
if (freezeFlag) {
actor->freezeTimer = colInfo->acHitInfo->toucher.damage;
2020-03-22 21:19:43 +00:00
}
actor->dropFlag = 0x40;
2020-03-22 21:19:43 +00:00
} else {
actor->dropFlag = 0x00;
2020-03-17 04:31:30 +00:00
}
}
void Actor_SetDropFlagJntSph(Actor* actor, ColliderJntSph* jntSph, s32 freezeFlag) {
ColliderInfo* curColInfo;
2020-03-17 04:31:30 +00:00
s32 flag;
s32 i;
actor->dropFlag = 0x00;
2020-03-17 04:31:30 +00:00
z_collision_check.c (#73) * func_8005B280 ok * func_8005B65C OK * split out func_8005BD50 * func_8005B7C0 OK * func_8005B7F4 OK * func_8005B824 OK * func_8005B860 ok * improve sanity * func_8005B6B0 ok, ColliderInit_Actor structs added * func_8005B884 ok * func_8005BBF8 ok, split out func_8005BF50 * split more stuff out of func_8005C050.s * func_8005C050 OK * func_8005BA30 fakish OK, func_8005BAD8 real OK * func_8005BB48 OK, func_8005BA84 almost decomp'd, but type issues * func_8005BB10 Ok * func_8005BF50 OK * func_8005BE50 OK * func_8005BD50 OK * func_8005BCC8 Ok * func_8005BC28 * func_8005BB8C func_8005BBB0 func_8005BBD4 Ok * save my work commit * func_8005C2BC fake OK * func_8005C5B0 ok * func_8005C608 ok * func_8005C6C0 ok * func_8005C6F8 ok * func_8005C730 ok * func_8005C774 func_8005C798 func_8005C7BC OK * func_8005C7E0 ok, func_8005C810 split * func_8005C810 OK * func_8005C8C8 ok * func_8005C964 OK * func_8005CA88 ok * func_8005CBAC ok * func_8005C124 func_8005C1AC func_8005C234 func_8005CC98 OK * func_8005CD34 func_8005CDD0 Ok * func_8005CE6C ok * func_8005CEC4 ok * func_8005CEDC ok * func_8005CF90 Ok * standardize type names/vars more * func_8005D3BC ok * func_8005D40C OK, z64.h CollisionCheckContext * func_8005D4B4 func_8005D4C8 ok * partial data section migration * improve function documentation, OT->OC * Actor_CollisionCheck_SetOC ok * Actor_CollisionCheck_SetAT Actor_CollisionCheck_SetAC Ok * func_8005BA84 ok * func_800611A0 ok * func_80061274 ok * clean up func_80061274 * func_8006139C ok * func_8005E9C0 and dependencies OK * minor cleanup to func_8005E9C0 * func_8005EC6C OK! * func_8005E81C ok * func_8005E604 ok * func_8005E2EC func_8005E4F8 OK * func_8005DE9C OK func_8005D8AC disassembled * func_8006146C func_8006268C ok * func_8005EEE0 ok * func_8005F17C * func_8005F39C ok * func_8005F5B0 decompiled, not matching * func_8005F7D0 decomp, func_8005D218 and func_8005D324 OK * func_8005FA30 ok, split more functions * func_8005FC04 ok * func_8005FDCC k * func_8005FF90 OK OK OK * func_80060204 dead * func_800604B0 ok * func_80060704 func_80060994 ok, func_80060C2C somewhat disassembled. AT to AC matrix doneish * func_800635D0 ok, func_80062ECC not so much * OcLine oks * D_8011DF28 functions disassembled * D_8011DF5C functions OK * setAT_SAC. setAC_SAC, setOC_SAC OK * func_80061C98 decompiled, func_80061BF4, func_80061C18 OK * func_800617D4 ok, func_800614A4 disassembled * CollisionCheck_OC D_8011DFAC functions OK * func_80062530 ok * CollisionCheck_generalLineOcCheck subfunctions OK * func_800622E4 ok * after a long fought battle, func_80061F64 has fallen. * func_800628A4 disassembled * func_800627A0 func_8006285C OK * ActorCollider_Cylinder_Update, func_80062718, func_80062734 ok * func_80062CD4 decompiled, import EffShield/EffSpark types from MM * various SubActor98 struct functions OK * func_8005D4DC func_8005D62C ok * .data section migrated, more OKs, fix NON_MATCHINGs to use effect structs * func_80060C2C ok * minor code tweaks * func_80061C98 ok somehow * Attempt to fix some unknowns, move types out of z64actor, add set3 ColliderInit types * Apply changes * formatting * tweak a couple function names * krim changes, func naming * missed some things * function renames * Implement GenColliderInit.py utility * Implement pr changes, GenColliderInit.py, DamageTable.py, z_collision_btltbls.c fully matching * func_800614A4 ok * Implement Roman's fixes, name Collider unknowns, rename COLTYPE -> COLSHAPE and define new COLTYPE * collisionCheckCtx -> colChkCtx, fix small things
2020-04-26 02:43:35 +00:00
for (i = jntSph->count - 1; i >= 0; i--) {
curColInfo = &jntSph->elements[i].info;
if (curColInfo->acHitInfo == NULL) {
2020-03-17 04:31:30 +00:00
flag = 0x00;
} else if (freezeFlag && (curColInfo->acHitInfo->toucher.dmgFlags & 0x10060000)) {
actor->freezeTimer = curColInfo->acHitInfo->toucher.damage;
2020-03-17 04:31:30 +00:00
flag = 0x00;
} else if (curColInfo->acHitInfo->toucher.dmgFlags & 0x0800) {
2020-03-17 04:31:30 +00:00
flag = 0x01;
} else if (curColInfo->acHitInfo->toucher.dmgFlags & 0x1000) {
2020-03-17 04:31:30 +00:00
flag = 0x02;
} else if (curColInfo->acHitInfo->toucher.dmgFlags & 0x4000) {
2020-03-17 04:31:30 +00:00
flag = 0x04;
} else if (curColInfo->acHitInfo->toucher.dmgFlags & 0x8000) {
2020-03-17 04:31:30 +00:00
flag = 0x08;
} else if (curColInfo->acHitInfo->toucher.dmgFlags & 0x10000) {
2020-03-17 04:31:30 +00:00
flag = 0x10;
} else if (curColInfo->acHitInfo->toucher.dmgFlags & 0x2000) {
2020-03-17 04:31:30 +00:00
flag = 0x20;
} else if (curColInfo->acHitInfo->toucher.dmgFlags & 0x80000) {
2020-03-22 21:19:43 +00:00
if (freezeFlag) {
actor->freezeTimer = curColInfo->acHitInfo->toucher.damage;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
flag = 0x40;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
flag = 0x00;
}
actor->dropFlag |= flag;
2020-03-17 04:31:30 +00:00
}
}
void func_80035844(Vec3f* arg0, Vec3f* arg1, Vec3s* arg2, s32 arg3) {
2020-03-17 04:31:30 +00:00
f32 dx = arg1->x - arg0->x;
f32 dz = arg1->z - arg0->z;
f32 dy = arg3 ? (arg1->y - arg0->y) : (arg0->y - arg1->y);
arg2->y = Math_Atan2S(dz, dx);
arg2->x = Math_Atan2S(sqrtf(SQ(dx) + SQ(dz)), dy);
2020-03-17 04:31:30 +00:00
}
/**
* Spawns En_Part (Dissipating Flames) actor as a child of the given actor.
2020-03-17 04:31:30 +00:00
*/
Fix most actor compiler warnings (#656) * functions.h * Bg_Hidan_Kowarerukabe * Demo_Geff * Arrow_Fire * Demo_Sa * Arms_Hook * En_Okarina_Effect * Demo_Im * Bg_Menkuri_Kaiten * Bg_Spot09_Obj (minus CollisionHeader) * Obj_Hsblock * Obj_Elevator * En_Anubice_Tag * Bg_Ydan_Hasi (minus BgYdanHasi_MoveWater return shenanigans) * En_Heishi4 * Demo_Go * Bg_Spot00_Break * Bg_Hidan_Kousi * Bg_Spot17_Bakudankabe * Bg_Spot18_Basket * En_Dha * Bg_Jya_Goroiwa * En_Js * Bg_Mori_Hineri * Bg_Spot18_Shutter * Bg_Jya_Bombchuiwa * Bg_Bdan_Objects * Bg_Jya_Amishutter * Bg_Toki_Swd * En_Heishi2 * En_Fu * Bg_Jya_Kanaami * Bg_Pushbox * Bg_Spot12_Saku * En_Ani * En_Zl1 * En_Vase * Bg_Spot05_Soko * En_Crow (and a rename in En_Firefly) * Bg_Hidan_Fslift * En_Dog * Bg_Heavy_Block * En_Boom * Bg_Ddan_Kd * Bg_Spot16_Bombstone * Demo_Effect * Bg_Hidan_Syoku * En_Firefly * En_Fw * Bg_Jya_Bombiwa * En_Fd * ovl_Bg_Spot15_Saku * En_Mb * Bg_Spot18_Obj * Bg_Zg * Bg_Bdan_Switch * En_Md * En_Box * En_Bw * En_Viewer * En_Hs2 * Bg_Ydan_Maruta * En_St * En_Ru1 * Bg_Ddan_Jd * En_Sb * Bg_Jya_Cobra * Bg_Spot12_Gate * Bg_Haka_Trap * En_Ms * En_Kakasi2 * En_Horse_Link_Child * Obj_Bombiwa * En_Ds * En_Kz * Bg_Umajump * Bg_Spot03_Taki * Door_Toki * Item_Etcetera * En_Ru2 * En_Niw * Bg_Spot15_Rrbox * Demo_Tre_Lgt * Obj_Oshihiki * Bg_Mjin * Bg_Spot18_Futa * Bg_Spot01_Idosoko * En_Arow_Trap * Bg_Mizu_Uzu * En_Horse_Zelda * Player * fix func_800358DC to work in functions.h * fix fix to functions.h * enum fixes * Some review comments addressed * DynaPoly_GetActor standardisation * ovl_Daiku_Kakariko * ovl_En_Vase * ovl_En_Mk * ovl_Bg_Spot00_Hanebasi * ovl_Bg_Spot06_Objects * ovl_En_Go * ovl_En_Go2 * ovl_Bg_Jya_Bombiwa * ovl_En_Cs * ovl_En_Dodojr * ovl_En_Ny * ovl_En_Mm2 * Apply review suggestion
2021-02-02 23:44:24 +00:00
Actor* func_800358DC(Actor* actor, Vec3f* spawnPos, Vec3s* spawnRot, f32* arg3, s32 timer, s16* unused,
GlobalContext* globalCtx, s16 params, s32 arg8) {
EnPart* spawnedEnPart;
2020-03-17 04:31:30 +00:00
spawnedEnPart =
(EnPart*)Actor_SpawnAsChild(&globalCtx->actorCtx, actor, globalCtx, ACTOR_EN_PART, spawnPos->x, spawnPos->y,
spawnPos->z, spawnRot->x, spawnRot->y, actor->objBankIndex, params);
2020-03-22 21:19:43 +00:00
if (spawnedEnPart != NULL) {
2020-03-17 04:31:30 +00:00
spawnedEnPart->actor.scale = actor->scale;
spawnedEnPart->actor.speedXZ = arg3[0];
spawnedEnPart->displayList = arg8;
spawnedEnPart->action = 2;
spawnedEnPart->timer = timer;
spawnedEnPart->rotZ = arg3[1];
spawnedEnPart->rotZSpeed = arg3[2];
Fix most actor compiler warnings (#656) * functions.h * Bg_Hidan_Kowarerukabe * Demo_Geff * Arrow_Fire * Demo_Sa * Arms_Hook * En_Okarina_Effect * Demo_Im * Bg_Menkuri_Kaiten * Bg_Spot09_Obj (minus CollisionHeader) * Obj_Hsblock * Obj_Elevator * En_Anubice_Tag * Bg_Ydan_Hasi (minus BgYdanHasi_MoveWater return shenanigans) * En_Heishi4 * Demo_Go * Bg_Spot00_Break * Bg_Hidan_Kousi * Bg_Spot17_Bakudankabe * Bg_Spot18_Basket * En_Dha * Bg_Jya_Goroiwa * En_Js * Bg_Mori_Hineri * Bg_Spot18_Shutter * Bg_Jya_Bombchuiwa * Bg_Bdan_Objects * Bg_Jya_Amishutter * Bg_Toki_Swd * En_Heishi2 * En_Fu * Bg_Jya_Kanaami * Bg_Pushbox * Bg_Spot12_Saku * En_Ani * En_Zl1 * En_Vase * Bg_Spot05_Soko * En_Crow (and a rename in En_Firefly) * Bg_Hidan_Fslift * En_Dog * Bg_Heavy_Block * En_Boom * Bg_Ddan_Kd * Bg_Spot16_Bombstone * Demo_Effect * Bg_Hidan_Syoku * En_Firefly * En_Fw * Bg_Jya_Bombiwa * En_Fd * ovl_Bg_Spot15_Saku * En_Mb * Bg_Spot18_Obj * Bg_Zg * Bg_Bdan_Switch * En_Md * En_Box * En_Bw * En_Viewer * En_Hs2 * Bg_Ydan_Maruta * En_St * En_Ru1 * Bg_Ddan_Jd * En_Sb * Bg_Jya_Cobra * Bg_Spot12_Gate * Bg_Haka_Trap * En_Ms * En_Kakasi2 * En_Horse_Link_Child * Obj_Bombiwa * En_Ds * En_Kz * Bg_Umajump * Bg_Spot03_Taki * Door_Toki * Item_Etcetera * En_Ru2 * En_Niw * Bg_Spot15_Rrbox * Demo_Tre_Lgt * Obj_Oshihiki * Bg_Mjin * Bg_Spot18_Futa * Bg_Spot01_Idosoko * En_Arow_Trap * Bg_Mizu_Uzu * En_Horse_Zelda * Player * fix func_800358DC to work in functions.h * fix fix to functions.h * enum fixes * Some review comments addressed * DynaPoly_GetActor standardisation * ovl_Daiku_Kakariko * ovl_En_Vase * ovl_En_Mk * ovl_Bg_Spot00_Hanebasi * ovl_Bg_Spot06_Objects * ovl_En_Go * ovl_En_Go2 * ovl_Bg_Jya_Bombiwa * ovl_En_Cs * ovl_En_Dodojr * ovl_En_Ny * ovl_En_Mm2 * Apply review suggestion
2021-02-02 23:44:24 +00:00
return &spawnedEnPart->actor;
2020-03-17 04:31:30 +00:00
}
return NULL;
}
2020-03-22 21:19:43 +00:00
void func_800359B8(Actor* actor, s16 arg1, Vec3s* arg2) {
2020-03-17 04:31:30 +00:00
f32 sp44;
f32 sp40;
f32 sp3C;
f32 sp38;
f32 sp34;
f32 sp30;
f32 sp2C;
f32 sp28;
f32 sp24;
CollisionPoly* floorPoly;
s32 pad;
2020-03-22 21:19:43 +00:00
if (actor->floorPoly != NULL) {
2020-03-17 04:31:30 +00:00
floorPoly = actor->floorPoly;
z_bgcheck.c, 800430A0.c, 80043480.c (#256) * beginning of migrating changes * got matching * changed order a bit * clean up bgcheck * fix conflict * fix conflict again * first stab at identifying types, some oks * Clean up most bad structs/pointer math, move relevant structs to z64bgcheck.h, get some OKs * more OKs, z_bgcheck.bss migration, update some sys_math3d.c args * couple more OKs * pushing some OKs * fix compilation issues * code_800430A0.c OK, more files decomp'd * 8003A3E0 big OK :) * Decomp most of func_8003C614, decomp helper funcs * Decomp SurfaceType, CamData, and WaterBox property related functions * more OKs, big OK in 8003C078 * more OKs, more progress, move a function definition in z_collision_check to functions.h * more clean-ups, more OKs, dyn_vtx is now defined as u8* * 8003A5B8, 8003A7D8, 8003C614, 8003DD6C OK, document function args better * data migrated, more OKs * 80041240 OK, func_8003B3C8 and func_8003BB18 disassembled * func_80040284, 800409A8 non_matching, add IS_ZERO macro * All asm files have C representations, some big OKs, lots of minor tweaks * More OKs, non-matching code cleanup * 8003FBF4 and 80040BE4 OK, improve codegen for most functions * format z_bgcheck.c * fix warnings, compile errors on NON_MATCHING * func_8003EE80 is now NON_MATCHING * begin documenting some functions * formatting * more documentation, func_8003A95C OK * fix PHYSICAL_TO_VIRTUAL changes * fix var rename * More documentation, functions 80040E40, 80041648 OK, change types to not be compatible with ZAP * func_8004239C ok, more NON_MATCHING improvements, more documentation * Implement most suggested changes * Convert comments to slower comments * /** * Implement ZAP2 changes * my anti-virus ate my format.sh results * Rename a couple hundred functions, fix minor stuff * rename var so that clang formats correctly * run format.sh * implement Petrie's matches/suggestions * format * matches * and the asm * slight error * Add SSList * two more matches * stuff * implement code changes * clean up Petrie's matchings Co-authored-by: Arthur <arthurtilly413@gmail.com> Co-authored-by: fig02 <fig02srl@gmail.com> Co-authored-by: petrie911 <pmontag@DESKTOP-LG8A167.localdomain>
2021-01-08 11:12:58 +00:00
sp44 = COLPOLY_GET_NORMAL(floorPoly->normal.x);
sp40 = COLPOLY_GET_NORMAL(floorPoly->normal.y);
sp3C = COLPOLY_GET_NORMAL(floorPoly->normal.z);
2020-03-17 04:31:30 +00:00
sp38 = Math_SinS(arg1);
sp34 = Math_CosS(arg1);
2020-03-17 04:31:30 +00:00
sp28 = (-(sp44 * sp38) - (sp3C * sp34));
arg2->x = -(s16)(Math_FAtan2F(sp28 * sp40, 1.0f) * (32768 / M_PI));
2020-03-17 04:31:30 +00:00
sp2C = Math_SinS(arg1 - 16375);
sp30 = Math_CosS(arg1 - 16375);
2020-03-17 04:31:30 +00:00
sp24 = (-(sp44 * sp2C) - (sp3C * sp30));
arg2->z = -(s16)(Math_FAtan2F(sp24 * sp40, 1.0f) * (32768 / M_PI));
2020-03-17 04:31:30 +00:00
}
}
2020-03-22 21:19:43 +00:00
void func_80035B18(GlobalContext* globalCtx, Actor* actor, u16 textId) {
2020-03-17 04:31:30 +00:00
func_8010B720(globalCtx, textId);
actor->textId = textId;
}
/**
* Tests if event_chk_inf flag is set.
*/
2020-03-22 21:19:43 +00:00
s32 Flags_GetEventChkInf(s32 flag) {
return gSaveContext.eventChkInf[flag >> 4] & (1 << (flag & 0xF));
2020-03-17 04:31:30 +00:00
}
/**
* Sets event_chk_inf flag.
*/
2020-03-22 21:19:43 +00:00
void Flags_SetEventChkInf(s32 flag) {
gSaveContext.eventChkInf[flag >> 4] |= (1 << (flag & 0xF));
2020-03-17 04:31:30 +00:00
}
/**
* Tests if "inf_table flag is set.
2020-03-17 04:31:30 +00:00
*/
2020-03-22 21:19:43 +00:00
s32 Flags_GetInfTable(s32 flag) {
return gSaveContext.infTable[flag >> 4] & (1 << (flag & 0xF));
2020-03-17 04:31:30 +00:00
}
/**
* Sets "inf_table" flag.
2020-03-17 04:31:30 +00:00
*/
2020-03-22 21:19:43 +00:00
void Flags_SetInfTable(s32 flag) {
gSaveContext.infTable[flag >> 4] |= (1 << (flag & 0xF));
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
u32 func_80035BFC(GlobalContext* globalCtx, s16 arg1) {
2020-03-17 04:31:30 +00:00
u16 retTextId = 0;
2020-03-22 21:19:43 +00:00
switch (arg1) {
2020-03-17 04:31:30 +00:00
case 0:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
if (Flags_GetInfTable(0x5)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1048;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1047;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x2)) {
if (Flags_GetInfTable(0x3)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1032;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1031;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetInfTable(0x0)) {
if (Flags_GetInfTable(0x1)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1003;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1002;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1001;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
break;
case 1:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
if (Flags_GetInfTable(0x10)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1046;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1045;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x3)) {
if (Flags_GetInfTable(0xE)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1034;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1033;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetInfTable(0xC)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1030;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x102F;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
2020-03-22 21:19:43 +00:00
} else {
if (Flags_GetEventChkInf(0x5C)) {
if (Flags_GetInfTable(0x19)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1071;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1070;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0xB)) {
if (Flags_GetInfTable(0x17)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1068;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1067;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetInfTable(0x15)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1061;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1060;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
}
}
break;
case 2:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1042;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1004;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1072;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x41)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1055;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1056;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 3:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1043;
2020-03-22 21:19:43 +00:00
} else {
if (Flags_GetInfTable(0x1E)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1006;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1005;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1073;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x105A;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 4:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1042;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1007;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1072;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x47)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x105E;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x105D;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 5:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1044;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x22)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1009;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1008;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1075;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x105B;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 6:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1042;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x24)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x100B;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x100A;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1056;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x105F;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 7:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1043;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x26)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x100D;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x100C;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1057;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1057;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 8:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1043;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x28)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1019;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x100E;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1077;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x51)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1058;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1059;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 9:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1049;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1035;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1079;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x104e;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 10:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x104A;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1038;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1079;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x59)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1050;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x104F;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 11:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x104B;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x103C;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x107b;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1051;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 12:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x104C;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x103D;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x107C;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1052;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 13:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x104D;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x103E;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x106E;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x61)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1053;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1054;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 15:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x5C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1078;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x66)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x1066;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x1062;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 16:
2020-03-22 21:19:43 +00:00
if (globalCtx->sceneNum == SCENE_SPOT15) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7002;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x6A)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7004;
} else if ((gSaveContext.dayTime >= 0x4000) && (gSaveContext.dayTime < 0xC556)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7002;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x7003;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 17:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
if (Flags_GetInfTable(0x6c)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7008;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x7007;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 19:
retTextId = 0x702D;
break;
case 18:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7006;
2020-03-22 21:19:43 +00:00
} else {
if (Flags_GetEventChkInf(0x12)) {
if (Flags_GetInfTable(0x71)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7072;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x7071;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x7029;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 20:
case 21:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x42)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x2012;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x41)) {
if (Flags_GetInfTable(0x76)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x2011;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x2010;
2020-03-22 21:19:43 +00:00
}
} else if (Flags_GetEventChkInf(0x40)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x200F;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x200E;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 24:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7044;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x7015;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 25:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7045;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Flags_GetInfTable(0xC2);
retTextId = 0x7016;
}
break;
case 26:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7046;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Flags_GetInfTable(0xc2);
retTextId = 0x7018;
}
break;
case 27:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7047;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x14)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x701A;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x11)) {
if (Flags_GetInfTable(0xC6)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x701C;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x701B;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x701A;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 28:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7048;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Flags_GetInfTable(0xca);
retTextId = 0x701D;
}
break;
case 29:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x7049;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Flags_GetInfTable(0xcc);
retTextId = 0x701F;
}
break;
case 30:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x704A;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Flags_GetInfTable(0xCE);
retTextId = 0x7021;
}
break;
case 31:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x704B;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Flags_GetInfTable(0xD0);
retTextId = 0x7023;
}
break;
case 32:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x704C;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Flags_GetInfTable(0xD2);
retTextId = 0x7025;
}
break;
case 33:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x9) && Flags_GetEventChkInf(0x25) && Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x704D;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
Flags_GetInfTable(0xD4);
retTextId = 0x7027;
}
break;
case 34:
Flags_GetInfTable(0xD6);
retTextId = 0x403C;
break;
case 35:
2020-03-22 21:19:43 +00:00
if (Flags_GetInfTable(0xD8)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x5029;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x5028;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 37:
retTextId = 0x5002;
break;
case 38:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x25)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3027;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x23)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3021;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0xE0)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x302A;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x3008;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x20)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x4043;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x302A;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 39:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x25)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3027;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x23)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3026;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x3009;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x2A)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x4043;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x302A;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 40:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x25)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3027;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x23)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3026;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0xEB)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x302B;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x300A;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x2B)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x4043;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x302A;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 41:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x25)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3027;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0xF0)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3015;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x3014;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x2C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x4043;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x302A;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 42:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x25)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3027;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0xF4)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3017;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x3016;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x2C)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x4043;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x302A;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 43:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x25)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3027;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0xF8)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3019;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x3018;
2020-03-22 21:19:43 +00:00
}
} else {
if (Flags_GetEventChkInf(0x2D)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x4043;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x302A;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
case 48:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x25)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x3029;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x20) && Flags_GetEventChkInf(0x21)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x301B;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x301A;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 49:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x402D;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x30)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x4007;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x4006;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 50:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x402E;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x30)) {
if (Flags_GetInfTable(0x124)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x4009;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x4008;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x4006;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 51:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x402D;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x31)) {
if (Flags_GetInfTable(0x12A)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x400B;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x402F;
2020-03-22 21:19:43 +00:00
}
} else if (Flags_GetEventChkInf(0x30)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x400A;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x4006;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 52:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x402E;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x30)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x400C;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x4006;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 53:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x402D;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x33)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x4010;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x30)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x400F;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x4006;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 54:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x402E;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x30)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x4011;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x4006;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 55:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x37)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x402B;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x31)) {
if (Flags_GetInfTable(0x138)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x401C;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x401B;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x401A;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 58:
retTextId = 0x500F;
break;
case 59:
retTextId = 0x5010;
break;
case 60:
retTextId = 0x5012;
break;
case 61:
2020-03-22 21:19:43 +00:00
if (Flags_GetInfTable(0x166)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x5001;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x5000;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 62:
retTextId = 0x5012;
break;
case 63:
2020-03-22 21:19:43 +00:00
if (Flags_GetInfTable(0x16A)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x5001;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x5000;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 71:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x16)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x2049;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x15)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x2048;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x14)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x2047;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x12) && !Flags_GetEventChkInf(0x14)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x2044;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetEventChkInf(0x10)) {
if (Flags_GetEventChkInf(0x11)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x2043;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x2042;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x2041;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
break;
case 72:
if (!LINK_IS_ADULT) {
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x14)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x2040;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x94)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x2040;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x203F;
2020-03-22 21:19:43 +00:00
}
} else {
if (!Flags_GetEventChkInf(0x18)) {
if (!IS_DAY) {
2020-03-17 04:31:30 +00:00
retTextId = 0x204E;
2020-03-22 21:19:43 +00:00
} else if (Flags_GetInfTable(0x9A)) {
2020-03-17 04:31:30 +00:00
retTextId = 0x2031;
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0x2030;
2020-03-22 21:19:43 +00:00
}
} else {
2020-03-17 04:31:30 +00:00
retTextId = 0;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
break;
}
2020-03-22 21:19:43 +00:00
if (retTextId == 0) {
2020-03-17 04:31:30 +00:00
retTextId = 1;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return retTextId;
}
2020-03-22 21:19:43 +00:00
void func_80036E50(u16 textId, s16 arg1) {
switch (arg1) {
2020-03-17 04:31:30 +00:00
case 0:
2020-03-22 21:19:43 +00:00
switch (textId) {
2020-03-17 04:31:30 +00:00
case 0x1001:
Flags_SetInfTable(0x0);
return;
case 0x1002:
Flags_SetInfTable(0x1);
return;
case 0x1031:
Flags_SetEventChkInf(0x3);
Flags_SetInfTable(0x3);
return;
case 0x1047:
Flags_SetInfTable(0x5);
return;
}
return;
case 1:
2020-03-22 21:19:43 +00:00
switch (textId) {
2020-03-17 04:31:30 +00:00
case 0x102F:
Flags_SetEventChkInf(0x2);
Flags_SetInfTable(0xC);
return;
case 0x1033:
2020-03-22 21:19:43 +00:00
Audio_PlaySoundGeneral(NA_SE_SY_CORRECT_CHIME, &D_801333D4, 4, &D_801333E0, &D_801333E0,
&D_801333E8);
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x4);
Flags_SetInfTable(0xE);
return;
case 0x1045:
Flags_SetInfTable(0x10);
return;
case 0x1060:
Flags_SetInfTable(0x15);
return;
case 0x1067:
Flags_SetEventChkInf(0xA);
Flags_SetInfTable(0x17);
return;
case 0x1070:
Flags_SetInfTable(0x19);
return;
}
return;
case 2:
2020-03-22 21:19:43 +00:00
if (textId == 0x1056) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x41);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 3:
2020-03-22 21:19:43 +00:00
if (textId == 0x1005) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x1E);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 4:
2020-03-22 21:19:43 +00:00
if (textId == 0x105D) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x47);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 5:
2020-03-22 21:19:43 +00:00
if (textId == 0x1008) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x22);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 6:
2020-03-22 21:19:43 +00:00
if (textId == 0x100A) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x24);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 7:
2020-03-22 21:19:43 +00:00
if (textId == 0x100C) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x26);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 8:
2020-03-22 21:19:43 +00:00
if (textId == 0x100E) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x28);
2020-03-22 21:19:43 +00:00
}
if (textId == 0x1059) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x51);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 10:
2020-03-22 21:19:43 +00:00
if (textId == 0x104F) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x59);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 13:
2020-03-22 21:19:43 +00:00
if (textId == 0x1054) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x61);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 15:
2020-03-22 21:19:43 +00:00
if (textId == 0x1062) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x66);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 16:
2020-03-22 21:19:43 +00:00
if (textId == 0x7002) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x6A);
2020-03-22 21:19:43 +00:00
}
if (textId == 0x7003) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x6A);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 17:
2020-03-22 21:19:43 +00:00
if (textId == 0x7007) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x6C);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 18:
2020-03-22 21:19:43 +00:00
if (textId == 0x7071) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x71);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 20:
case 21:
2020-03-22 21:19:43 +00:00
if (textId == 0x2010) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x76);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 25:
2020-03-22 21:19:43 +00:00
if (textId == 0x7016) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xC2);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 26:
2020-03-22 21:19:43 +00:00
if (textId == 0x7018) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xC4);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 28:
2020-03-22 21:19:43 +00:00
if (textId == 0x701D) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xCA);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 29:
2020-03-22 21:19:43 +00:00
if (textId == 0x701F) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xCC);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 30:
2020-03-22 21:19:43 +00:00
if (textId == 0x7021) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xCE);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 31:
2020-03-22 21:19:43 +00:00
if (textId == 0x7023) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xD0);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 32:
2020-03-22 21:19:43 +00:00
if (textId == 0x7025) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xD2);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 33:
2020-03-22 21:19:43 +00:00
if (textId == 0x7027) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xD4);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 34:
2020-03-22 21:19:43 +00:00
if (textId == 0x403c) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xD6);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 35:
2020-03-22 21:19:43 +00:00
if (textId == 0x5028) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xD8);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 38:
2020-03-22 21:19:43 +00:00
if (textId == 0x3008) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xE0);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 40:
2020-03-22 21:19:43 +00:00
if (textId == 0x300B) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xEB);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 41:
2020-03-22 21:19:43 +00:00
if (textId == 0x3014) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xF0);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 42:
2020-03-22 21:19:43 +00:00
if (textId == 0x3016) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0xF4);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 43:
2020-03-22 21:19:43 +00:00
if (textId == 0x3018) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x20);
Flags_SetInfTable(0xF8);
}
return;
case 48:
2020-03-22 21:19:43 +00:00
if (textId == 0x3020) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x22);
Flags_SetInfTable(0x113);
}
return;
case 49:
case 52:
case 53:
case 54:
2020-03-22 21:19:43 +00:00
if (textId == 0x4006) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x30);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 50:
2020-03-22 21:19:43 +00:00
if (textId == 0x4006) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x30);
2020-03-22 21:19:43 +00:00
}
if (textId == 0x4008) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x124);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 51:
2020-03-22 21:19:43 +00:00
if (textId == 0x4006) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x30);
2020-03-22 21:19:43 +00:00
}
if (textId == 0x400A) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x32);
2020-03-22 21:19:43 +00:00
}
if (textId == 0x402F) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x12A);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 55:
2020-03-22 21:19:43 +00:00
if (textId == 0x401B) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x33);
Flags_SetInfTable(0x138);
}
return;
case 61:
2020-03-22 21:19:43 +00:00
if (textId == 0x5000) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x166);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 63:
2020-03-22 21:19:43 +00:00
if (textId == 0x5013) {
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x16A);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 71:
2020-03-22 21:19:43 +00:00
if (textId == 0x2041) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x10);
2020-03-22 21:19:43 +00:00
}
if (textId == 0x2044) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x12);
2020-03-22 21:19:43 +00:00
}
if (textId == 0x2047) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x15);
2020-03-22 21:19:43 +00:00
}
if (textId == 0x2048) {
2020-03-17 04:31:30 +00:00
Flags_SetEventChkInf(0x16);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
return;
case 72:
return;
}
}
2020-03-22 21:19:43 +00:00
s32 func_800374E0(GlobalContext* globalCtx, Actor* actor, u16 textId) {
2020-03-17 04:31:30 +00:00
MessageContext* msgCtx = &globalCtx->msgCtx;
s32 ret = 1;
2020-03-22 21:19:43 +00:00
switch (textId) {
2020-03-17 04:31:30 +00:00
case 0x1035:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 0) {
if (Flags_GetInfTable(0x2A)) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1036);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1041);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 1) {
if (Flags_GetInfTable(0x2B)) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1037);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1041);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
ret = 0;
break;
case 0x1038:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 0) {
if (Flags_GetInfTable(0x2E)) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1039);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1041);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 1) {
if (Flags_GetInfTable(0x2F)) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x103A);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1041);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 2) {
if (Flags_GetInfTable(0x30)) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x103B);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1041);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
ret = 0;
break;
case 0x103E:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 0) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x103F);
2020-03-22 21:19:43 +00:00
}
if (msgCtx->choiceIndex == 1) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1040);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
ret = 0;
break;
case 0x1041:
2020-03-22 21:19:43 +00:00
if (msgCtx->unk_E2FA == 0x1035) {
if (msgCtx->choiceIndex == 0) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1036);
Flags_SetInfTable(0x2A);
}
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 1) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1037);
Flags_SetInfTable(0x2B);
}
}
2020-03-22 21:19:43 +00:00
if (msgCtx->unk_E2FA == 0x1038) {
if (msgCtx->choiceIndex == 0) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1039);
Flags_SetInfTable(0x2E);
}
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 1) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x103A);
Flags_SetInfTable(0x2F);
}
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 2) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x103B);
Flags_SetInfTable(0x30);
}
}
ret = 0;
break;
case 0x1062:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 0) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1063);
2020-03-22 21:19:43 +00:00
}
if (msgCtx->choiceIndex == 1) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x1064);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
ret = 0;
break;
case 0x2030:
case 0x2031:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 0) {
if (gSaveContext.rupees >= 10) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x2034);
Rupees_ChangeBy(-10);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x2032);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 1) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x2032);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
Flags_SetInfTable(0x9A);
ret = 0;
break;
case 0x2036:
case 0x2037:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 0) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x201F);
2020-03-22 21:19:43 +00:00
}
if (msgCtx->choiceIndex == 1) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x205A);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
ret = 0;
break;
case 0x2038:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 0) {
2020-03-17 04:31:30 +00:00
break;
2020-03-22 21:19:43 +00:00
}
if (msgCtx->choiceIndex == 1) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x205A);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
ret = 0;
break;
case 0x2034:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex != 0) {
2020-03-17 04:31:30 +00:00
break;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x2035);
ret = 0;
break;
case 0x2043:
2020-03-22 21:19:43 +00:00
if (Flags_GetEventChkInf(0x12)) {
2020-03-17 04:31:30 +00:00
break;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x2044);
ret = 0;
break;
case 0x205A:
break;
case 0x300A:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 0) {
if (Flags_GetEventChkInf(0x22)) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x300B);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x300C);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 1) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x300D);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
ret = 0;
break;
case 0x301B:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 0) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x301D);
}
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 1) {
if (Flags_GetInfTable(0x113)) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x301F);
2020-03-22 21:19:43 +00:00
} else {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x301E);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
ret = 0;
break;
case 0x301E:
func_80035B18(globalCtx, actor, 0x3020);
ret = 0;
break;
case 0x400C:
2020-03-22 21:19:43 +00:00
if (msgCtx->choiceIndex == 0) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x400D);
2020-03-22 21:19:43 +00:00
}
if (msgCtx->choiceIndex == 1) {
2020-03-17 04:31:30 +00:00
func_80035B18(globalCtx, actor, 0x400E);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
ret = 0;
break;
case 0x7007:
func_80035B18(globalCtx, actor, 0x703E);
ret = 0;
break;
case 0x703E:
func_80035B18(globalCtx, actor, 0x703F);
ret = 0;
break;
case 0x703F:
func_80035B18(globalCtx, actor, 0x7042);
ret = 0;
break;
}
return ret;
}
2020-03-22 21:19:43 +00:00
u16 func_80037C30(GlobalContext* globalCtx, s16 arg1) {
2020-03-17 04:31:30 +00:00
return func_80035BFC(globalCtx, arg1);
}
2020-03-22 21:19:43 +00:00
s32 func_80037C5C(GlobalContext* globalCtx, s16 arg1, u16 textId) {
2020-03-17 04:31:30 +00:00
func_80036E50(textId, arg1);
return false;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_80037C94(GlobalContext* globalCtx, Actor* actor, s32 arg2) {
2020-03-17 04:31:30 +00:00
return func_800374E0(globalCtx, actor, actor->textId);
}
2020-03-22 21:19:43 +00:00
s32 func_80037CB8(GlobalContext* globalCtx, Actor* actor, s16 arg2) {
2020-03-17 04:31:30 +00:00
MessageContext* msgCtx = &globalCtx->msgCtx;
s32 ret = false;
2020-03-17 04:31:30 +00:00
2020-03-22 21:19:43 +00:00
switch (func_8010BDBC(msgCtx)) {
2020-03-17 04:31:30 +00:00
case 2:
func_80037C5C(globalCtx, arg2, actor->textId);
ret = true;
2020-03-17 04:31:30 +00:00
break;
case 4:
case 5:
2020-03-22 21:19:43 +00:00
if (func_80106BC8(globalCtx) && func_80037C94(globalCtx, actor, arg2)) {
2020-03-17 04:31:30 +00:00
Audio_PlaySoundGeneral(NA_SE_SY_CANCEL, &D_801333D4, 4, &D_801333E0, &D_801333E0, &D_801333E8);
msgCtx->msgMode = 0x36;
ret = true;
2020-03-17 04:31:30 +00:00
}
break;
}
return ret;
}
2020-03-22 21:19:43 +00:00
s32 func_80037D98(GlobalContext* globalCtx, Actor* actor, s16 arg2, s32* arg3) {
2020-03-17 04:31:30 +00:00
s16 var;
s16 sp2C;
s16 sp2A;
s16 abs_var;
2020-03-22 21:19:43 +00:00
if (func_8002F194(actor, globalCtx)) {
2020-03-17 04:31:30 +00:00
*arg3 = 1;
return true;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
if (*arg3 == 1) {
if (func_80037CB8(globalCtx, actor, arg2)) {
2020-03-17 04:31:30 +00:00
*arg3 = 0;
2020-03-22 21:19:43 +00:00
}
return false;
2020-03-17 04:31:30 +00:00
}
func_8002F374(globalCtx, actor, &sp2C, &sp2A);
2020-03-22 21:19:43 +00:00
if (0) {} // Necessary to match
2020-03-17 04:31:30 +00:00
if ((sp2C < 0) || (sp2C > SCREEN_WIDTH) || (sp2A < 0) || (sp2A > SCREEN_HEIGHT)) {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
var = actor->yawTowardsPlayer - actor->shape.rot.y;
2020-03-17 04:31:30 +00:00
abs_var = ABS(var);
2020-03-22 21:19:43 +00:00
if (abs_var >= 0x4300) {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if ((actor->xyzDistToPlayerSq > SQ(160.0f)) && !actor->isTargeted) {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
if (actor->xyzDistToPlayerSq <= SQ(80.0f)) {
2020-03-22 21:19:43 +00:00
if (func_8002F2CC(actor, globalCtx, 80.0f)) {
2020-03-17 04:31:30 +00:00
actor->textId = func_80037C30(globalCtx, arg2);
2020-03-22 21:19:43 +00:00
}
} else {
if (func_8002F2F4(actor, globalCtx)) {
2020-03-17 04:31:30 +00:00
actor->textId = func_80037C30(globalCtx, arg2);
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
}
return false;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_80037F30(Vec3s* arg0, Vec3s* arg1) {
Math_SmoothStepToS(&arg0->y, 0, 6, 6200, 100);
Math_SmoothStepToS(&arg0->x, 0, 6, 6200, 100);
Math_SmoothStepToS(&arg1->y, 0, 6, 6200, 100);
Math_SmoothStepToS(&arg1->x, 0, 6, 6200, 100);
return true;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_80037FC8(Actor* actor, Vec3f* arg1, Vec3s* arg2, Vec3s* arg3) {
2020-03-17 04:31:30 +00:00
s16 sp36;
s16 sp34;
s16 var;
sp36 = Math_Vec3f_Pitch(&actor->focus.pos, arg1);
sp34 = Math_Vec3f_Yaw(&actor->focus.pos, arg1) - actor->world.rot.y;
2020-03-17 04:31:30 +00:00
Math_SmoothStepToS(&arg2->x, sp36, 6, 2000, 1);
2020-03-17 04:31:30 +00:00
arg2->x = (arg2->x < -6000) ? -6000 : ((arg2->x > 6000) ? 6000 : arg2->x);
var = Math_SmoothStepToS(&arg2->y, sp34, 6, 2000, 1);
2020-03-17 04:31:30 +00:00
arg2->y = (arg2->y < -8000) ? -8000 : ((arg2->y > 8000) ? 8000 : arg2->y);
2020-03-22 21:19:43 +00:00
if (var && (ABS(arg2->y) < 8000)) {
return false;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
Math_SmoothStepToS(&arg3->y, sp34 - arg2->y, 4, 2000, 1);
2020-03-17 04:31:30 +00:00
arg3->y = (arg3->y < -12000) ? -12000 : ((arg3->y > 12000) ? 12000 : arg3->y);
return true;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_80038154(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* arg3, f32 arg4) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
s32 pad;
Vec3f sp2C;
s16 var;
s16 abs_var;
actor->focus.pos = actor->world.pos;
actor->focus.pos.y += arg4;
2020-03-17 04:31:30 +00:00
if (!(((globalCtx->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == 0x00EE))) {
var = actor->yawTowardsPlayer - actor->shape.rot.y;
2020-03-17 04:31:30 +00:00
abs_var = ABS(var);
2020-03-22 21:19:43 +00:00
if (abs_var >= 0x4300) {
2020-03-17 04:31:30 +00:00
func_80037F30(arg2, arg3);
return false;
2020-03-17 04:31:30 +00:00
}
}
if (((globalCtx->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == 0x00EE)) {
2020-03-17 04:31:30 +00:00
sp2C = globalCtx->view.eye;
2020-03-22 21:19:43 +00:00
} else {
sp2C = player->actor.focus.pos;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
func_80037FC8(actor, &sp2C, arg2, arg3);
return true;
2020-03-17 04:31:30 +00:00
}
2020-03-22 21:19:43 +00:00
s32 func_80038290(GlobalContext* globalCtx, Actor* actor, Vec3s* arg2, Vec3s* arg3, Vec3f arg4) {
2020-03-17 04:31:30 +00:00
Player* player = PLAYER;
s32 pad;
Vec3f sp24;
s16 var;
s16 abs_var;
actor->focus.pos = arg4;
2020-03-17 04:31:30 +00:00
if (!(((globalCtx->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == 0x00EE))) {
var = actor->yawTowardsPlayer - actor->shape.rot.y;
2020-03-17 04:31:30 +00:00
abs_var = ABS(var);
2020-03-22 21:19:43 +00:00
if (abs_var >= 0x4300) {
2020-03-17 04:31:30 +00:00
func_80037F30(arg2, arg3);
return false;
2020-03-17 04:31:30 +00:00
}
}
if (((globalCtx->csCtx.state != CS_STATE_IDLE) || (gDbgCamEnabled)) && (gSaveContext.entranceIndex == 0x00EE)) {
2020-03-17 04:31:30 +00:00
sp24 = globalCtx->view.eye;
2020-03-22 21:19:43 +00:00
} else {
sp24 = player->actor.focus.pos;
2020-03-22 21:19:43 +00:00
}
2020-03-17 04:31:30 +00:00
func_80037FC8(actor, &sp24, arg2, arg3);
return true;
2020-03-17 04:31:30 +00:00
}