mirror of
https://github.com/zeldaret/oot
synced 2026-08-04 09:09:22 -04:00
fixed merge conflict
This commit is contained in:
@@ -1,5 +1,72 @@
|
||||
#include <ultra64.h>
|
||||
#include <global.h>
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_8006C360/func_8006C360.s")
|
||||
u16 D_8011F3F0[60][9] =
|
||||
{
|
||||
{ 0x0000, 0x7124, 0x7127, 0x7126, 0x7125, 0x7127, 0x7124, 0x7125, 0x7127 },
|
||||
{ 0x0000, 0x7128, 0x7129, 0x7128, 0x7128, 0x7128, 0x7128, 0x712A, 0x712B },
|
||||
{ 0x0000, 0x7128, 0x712B, 0x7128, 0x7128, 0x7129, 0x7128, 0x712B, 0x7128 },
|
||||
{ 0x0000, 0x7128, 0x7129, 0x7128, 0x7128, 0x7128, 0x7128, 0x712A, 0x712B },
|
||||
{ 0x0000, 0x7128, 0x7129, 0x712B, 0x7128, 0x7128, 0x7128, 0x7129, 0x7128 },
|
||||
{ 0x0000, 0x712D, 0x712D, 0x712D, 0x712D, 0x712D, 0x712D, 0x712D, 0x712F },
|
||||
{ 0x0000, 0x712C, 0x712C, 0x712C, 0x712E, 0x712C, 0x712C, 0x712F, 0x712F },
|
||||
{ 0x0000, 0x712C, 0x712C, 0x712C, 0x712F, 0x712C, 0x712C, 0x712F, 0x712F },
|
||||
{ 0x0000, 0x7130, 0x7132, 0x7133, 0x7130, 0x7130, 0x7131, 0x7132, 0x7131 },
|
||||
{ 0x0000, 0x7134, 0x7137, 0x7135, 0x7134, 0x7136, 0x7135, 0x7134, 0x7135 },
|
||||
{ 0x0000, 0x7138, 0x713A, 0x7138, 0x7139, 0x713A, 0x7138, 0x7139, 0x713B },
|
||||
{ 0x0000, 0x7144, 0x7146, 0x7144, 0x7146, 0x7147, 0x7145, 0x7145, 0x7147 },
|
||||
{ 0x0000, 0x7148, 0x7149, 0x7149, 0x714A, 0x714A, 0x714B, 0x7149, 0x714B },
|
||||
{ 0x0000, 0x714C, 0x714D, 0x714C, 0x714C, 0x714E, 0x714C, 0x714E, 0x714F },
|
||||
{ 0x0000, 0x7150, 0x7153, 0x7152, 0x7150, 0x7151, 0x7153, 0x7153, 0x7151 },
|
||||
{ 0x0000, 0x7155, 0x7156, 0x7157, 0x7154, 0x7156, 0x7156, 0x7156, 0x7156 },
|
||||
{ 0x0000, 0x715A, 0x7159, 0x715B, 0x715A, 0x715A, 0x7158, 0x7158, 0x715B },
|
||||
{ 0x0000, 0x715E, 0x715D, 0x715D, 0x715F, 0x715E, 0x715C, 0x715C, 0x715D },
|
||||
{ 0x0000, 0x7163, 0x7162, 0x7160, 0x7163, 0x7160, 0x7161, 0x7161, 0x7160 },
|
||||
{ 0x0000, 0x7164, 0x7166, 0x7164, 0x7167, 0x7164, 0x7164, 0x7164, 0x7167 },
|
||||
{ 0x0000, 0x716B, 0x7169, 0x7168, 0x716B, 0x716A, 0x716B, 0x716B, 0x716A },
|
||||
{ 0x0000, 0x716C, 0x716D, 0x716F, 0x716C, 0x716E, 0x716E, 0x716E, 0x716F },
|
||||
{ 0x0000, 0x7171, 0x7173, 0x7170, 0x7172, 0x0000, 0x0000, 0x0000, 0x0000 },
|
||||
{ 0x0000, 0x7176, 0x7177, 0x7174, 0x7174, 0x7175, 0x7174, 0x7174, 0x7177 },
|
||||
{ 0x0000, 0x7178, 0x7179, 0x7179, 0x717B, 0x717A, 0x717B, 0x717A, 0x717B },
|
||||
{ 0x0000, 0x717D, 0x717C, 0x717C, 0x717D, 0x717F, 0x717C, 0x717E, 0x717D },
|
||||
{ 0x0000, 0x7183, 0x7181, 0x7180, 0x7183, 0x7182, 0x7183, 0x7181, 0x7183 },
|
||||
{ 0x0000, 0x7184, 0x7186, 0x7185, 0x7186, 0x7184, 0x7187, 0x7186, 0x7184 },
|
||||
{ 0x0000, 0x71A4, 0x71A6, 0x71A5, 0x0000, 0x71A6, 0x71A6, 0x71A6, 0x71A7 },
|
||||
{ 0x0000, 0x7188, 0x7188, 0x7189, 0x7188, 0x7189, 0x718B, 0x718A, 0x7189 },
|
||||
{ 0x0000, 0x718C, 0x718C, 0x718D, 0x718C, 0x718E, 0x718F, 0x718D, 0x718C },
|
||||
{ 0x0000, 0x7190, 0x7190, 0x7191, 0x7192, 0x7191, 0x7193, 0x7190, 0x7191 },
|
||||
{ 0x0000, 0x7196, 0x7194, 0x7195, 0x7196, 0x7197, 0x7194, 0x7196, 0x7195 },
|
||||
{ 0x0000, 0x7199, 0x719A, 0x7198, 0x7198, 0x719A, 0x719A, 0x719B, 0x7198 },
|
||||
{ 0x0000, 0x719D, 0x719C, 0x719E, 0x719D, 0x719D, 0x719C, 0x719F, 0x719E },
|
||||
{ 0x0000, 0x71A1, 0x71A0, 0x71A1, 0x71A2, 0x71A1, 0x71A2, 0x71A3, 0x71A2 },
|
||||
{ 0x0000, 0x711C, 0x711E, 0x711C, 0x711F, 0x711E, 0x711C, 0x711D, 0x711F },
|
||||
{ 0x0000, 0x7104, 0x7105, 0x7107, 0x7107, 0x7105, 0x7106, 0x7107, 0x7107 },
|
||||
{ 0x0000, 0x7107, 0x7105, 0x7107, 0x7107, 0x7106, 0x7107, 0x7107, 0x7105 },
|
||||
{ 0x0000, 0x7113, 0x7117, 0x7113, 0x7110, 0x7112, 0x7112, 0x7116, 0x7112 },
|
||||
{ 0x0000, 0x7113, 0x7113, 0x7113, 0x7113, 0x7113, 0x7113, 0x7111, 0x7113 },
|
||||
{ 0x0000, 0x7113, 0x7117, 0x7113, 0x7110, 0x7112, 0x7112, 0x7116, 0x7112 },
|
||||
{ 0x0000, 0x7117, 0x7117, 0x7117, 0x7117, 0x7117, 0x7117, 0x7117, 0x7113 },
|
||||
{ 0x0000, 0x7101, 0x7100, 0x7102, 0x7103, 0x7101, 0x7100, 0x7102, 0x7103 },
|
||||
{ 0x0000, 0x7100, 0x7102, 0x7100, 0x7100, 0x7100, 0x7100, 0x7100, 0x7102 },
|
||||
{ 0x0000, 0x710A, 0x7109, 0x7109, 0x710A, 0x710B, 0x7108, 0x7109, 0x710B },
|
||||
{ 0x0000, 0x7117, 0x7112, 0x7113, 0x7110, 0x710C, 0x7117, 0x710E, 0x7112 },
|
||||
{ 0x0000, 0x710D, 0x710F, 0x710C, 0x7112, 0x710D, 0x710C, 0x710C, 0x710F },
|
||||
{ 0x0000, 0x710A, 0x7109, 0x711A, 0x710A, 0x7109, 0x7108, 0x710B, 0x7109 },
|
||||
{ 0x0000, 0x710C, 0x710F, 0x7113, 0x7110, 0x710D, 0x7112, 0x7116, 0x710D },
|
||||
{ 0x0000, 0x7115, 0x7114, 0x7114, 0x7115, 0x7114, 0x7114, 0x7116, 0x7117 },
|
||||
{ 0x0000, 0x7113, 0x710F, 0x7113, 0x7110, 0x710C, 0x711A, 0x710D, 0x7112 },
|
||||
{ 0x0000, 0x7101, 0x7102, 0x7103, 0x7101, 0x7100, 0x7100, 0x7102, 0x7100 },
|
||||
{ 0x0000, 0x7112, 0x710E, 0x7112, 0x710E, 0x710D, 0x7112, 0x710E, 0x710F },
|
||||
{ 0x0000, 0x7142, 0x7141, 0x7142, 0x7143, 0x7140, 0x7140, 0x7141, 0x7143 },
|
||||
{ 0x0000, 0x713C, 0x713D, 0x713D, 0x713E, 0x713E, 0x713F, 0x713D, 0x713F },
|
||||
{ 0x0000, 0x7101, 0x7102, 0x7103, 0x7101, 0x7100, 0x7100, 0x7102, 0x7100 },
|
||||
{ 0x0000, 0x7113, 0x7117, 0x7113, 0x7110, 0x7112, 0x7112, 0x7116, 0x7112 },
|
||||
{ 0x0000, 0x7104, 0x7105, 0x7107, 0x7105, 0x7105, 0x7105, 0x7107, 0x7107 },
|
||||
{ 0x0000, 0x7104, 0x7105, 0x7107, 0x7105, 0x710C, 0x7105, 0x7107, 0x7107 },
|
||||
};
|
||||
|
||||
u16 func_8006C360(GlobalContext* globalCtx, u32 idx)
|
||||
{
|
||||
u8 mask = func_8008F080(globalCtx);
|
||||
return D_8011F3F0[idx][mask];
|
||||
}
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
#include <ultra64.h>
|
||||
#include <global.h>
|
||||
|
||||
extern u32 osResetType;
|
||||
|
||||
/*
|
||||
void func_8007BE60(u32* a0)
|
||||
{
|
||||
u32 var1;
|
||||
|
||||
//*a0 = 0;
|
||||
|
||||
if (osResetType == 0)
|
||||
{
|
||||
a0[1] = 0;
|
||||
a0[2] = 0;
|
||||
a0[3] = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
var1 = a0[3] + a0[5];
|
||||
a0[1]++;
|
||||
a0[2] = (var1 < a0[5]) + a0[2] + a0[4];
|
||||
a0[3] = var1;
|
||||
}
|
||||
|
||||
a0[5] = 0;
|
||||
a0[4] = 0;
|
||||
}
|
||||
*/
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_8007BE60/func_8007BE60.s")
|
||||
|
||||
typedef struct
|
||||
{
|
||||
/* 0x00 */ u32 unk_00;
|
||||
/* 0x04 */ char unk_04[0x0C];
|
||||
/* 0x10 */ OSTime unk_10;
|
||||
} struct_8007BED4;
|
||||
|
||||
void func_8007BED4(struct_8007BED4* arg0)
|
||||
{
|
||||
arg0->unk_00 = 1;
|
||||
arg0->unk_10 = osGetTime();
|
||||
}
|
||||
|
||||
u32 func_8007BF08(struct_8007BED4* arg0)
|
||||
{
|
||||
return arg0->unk_00;
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
#include <ultra64.h>
|
||||
#include <global.h>
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/code/code_8007BF10/func_8007BF10.s")
|
||||
|
||||
+4
-4
@@ -7,7 +7,7 @@ u32 gScreenWidth = SCREEN_WIDTH;
|
||||
u32 gScreenHeight = SCREEN_HEIGHT;
|
||||
u32 gSystemHeapSize = 0;
|
||||
|
||||
u8* gAppNmiBufferPtr;
|
||||
PreNmiBuff* gAppNmiBufferPtr;
|
||||
SchedContext gSchedContext;
|
||||
PadMgr gPadMgr;
|
||||
IrqMgr gIrqMgr;
|
||||
@@ -50,8 +50,8 @@ void Main(void* arg0)
|
||||
osSyncPrintf("mainproc 実行開始\n"); //Start running
|
||||
gScreenWidth = SCREEN_WIDTH;
|
||||
gScreenHeight = SCREEN_HEIGHT;
|
||||
gAppNmiBufferPtr = osAppNmiBuffer;
|
||||
func_8007BE60(gAppNmiBufferPtr);
|
||||
gAppNmiBufferPtr = (PreNmiBuff*)osAppNmiBuffer;
|
||||
PreNmiBuff_Init(gAppNmiBufferPtr);
|
||||
Fault_Start();
|
||||
SysCfb_Init(0);
|
||||
sysHeap = (u32)gSystemHeap;
|
||||
@@ -112,7 +112,7 @@ void Main(void* arg0)
|
||||
if (*msg == OS_SC_PRE_NMI_MSG)
|
||||
{
|
||||
osSyncPrintf("main.c: リセットされたみたいだよ\n"); //Looks like it's been reset
|
||||
func_8007BED4(gAppNmiBufferPtr);
|
||||
PreNmiBuff_SetReset(gAppNmiBufferPtr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
#include <global.h>
|
||||
|
||||
u32 func_800D2DF0()
|
||||
u32 SysUcode_GetUCodeBoot()
|
||||
{
|
||||
return &D_80009320;
|
||||
}
|
||||
|
||||
u32 func_800D2DFC()
|
||||
u32 SysUcode_GetUcodeBootSize()
|
||||
{
|
||||
return (u32)&D_800093F0 - (u32)&D_80009320;
|
||||
}
|
||||
|
||||
u32 func_800D2E14()
|
||||
u32 SysUcode_GetUcode()
|
||||
{
|
||||
return D_8012DBA0;
|
||||
}
|
||||
|
||||
u32 func_800D2E20()
|
||||
u32 SysUcode_GetUcodeData()
|
||||
{
|
||||
return D_8012DBA4;
|
||||
}
|
||||
|
||||
@@ -4344,17 +4344,6 @@ s16 func_80034DD4(Actor* actor, GlobalContext* globalCtx, s16 arg2, f32 arg3)
|
||||
return arg2;
|
||||
}
|
||||
|
||||
// Some animation related structure
|
||||
typedef struct
|
||||
{
|
||||
/* 0x00 */ u32 animation;
|
||||
/* 0x04 */ f32 playbackSpeed;
|
||||
/* 0x08 */ f32 unk_08;
|
||||
/* 0x0C */ f32 frameCount;
|
||||
/* 0x10 */ u8 unk_10;
|
||||
/* 0x14 */ f32 transitionRate;
|
||||
} struct_80034EC0_Entry; // size = 0x18
|
||||
|
||||
void func_80034EC0(SkelAnime* skelAnime, struct_80034EC0_Entry* arg1, s32 arg2)
|
||||
{
|
||||
f32 frameCount;
|
||||
|
||||
@@ -14,7 +14,7 @@ void SaveContext_Init(void)
|
||||
gSaveContext.chamber_cutscene_num = 0;
|
||||
gSaveContext.next_day_time = 0xFFFF;
|
||||
gSaveContext.environment_time = 0;
|
||||
gSaveContext.unk_141C = 1;
|
||||
gSaveContext.dogIsLost = 1;
|
||||
gSaveContext.transition_type = 0xFF;
|
||||
gSaveContext.unk_13EE = 50;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
#include <ultra64.h>
|
||||
#include <global.h>
|
||||
#include <sched.h>
|
||||
|
||||
void MsgEvent_SendNullTask()
|
||||
{
|
||||
u32 pad[4];
|
||||
OSScTask task;
|
||||
OSMesgQueue queue;
|
||||
OSMesg msg;
|
||||
u32 pad2[1];
|
||||
|
||||
task.next = NULL;
|
||||
task.flags = OS_SC_RCP_MASK;
|
||||
task.msgQ = &queue;
|
||||
task.msg = NULL;
|
||||
task.framebuffer = NULL;
|
||||
task.list.t.type = M_NULTASK;
|
||||
osCreateMesgQueue(task.msgQ, &msg, 1);
|
||||
osSendMesg(&gSchedContext.cmdQ, &task, OS_MESG_BLOCK);
|
||||
func_800C95F8(&gSchedContext); // osScKickEntryMsg
|
||||
osRecvMesg(&queue, NULL, OS_MESG_BLOCK);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
#include <ultra64.h>
|
||||
#include <global.h>
|
||||
|
||||
#define COLD_RESET 0
|
||||
#define NMI 1
|
||||
|
||||
|
||||
void PreNmiBuff_Init(PreNmiBuff* this)
|
||||
{
|
||||
this->resetting = false;
|
||||
if (osResetType == COLD_RESET)
|
||||
{
|
||||
this->resetCount = 0;
|
||||
this->duration = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
this->resetCount++;
|
||||
this->duration += this->resetTime;
|
||||
}
|
||||
|
||||
this->resetTime = 0;
|
||||
}
|
||||
|
||||
|
||||
void PreNmiBuff_SetReset(PreNmiBuff* this)
|
||||
{
|
||||
this->resetting = true;
|
||||
this->resetTime = osGetTime();
|
||||
}
|
||||
|
||||
u32 PreNmiBuff_IsResetting(PreNmiBuff* this)
|
||||
{
|
||||
return this->resetting;
|
||||
}
|
||||
+4
-4
@@ -426,8 +426,8 @@ void func_80096680(GlobalContext* globalCtx, Room* room, u32 flags)
|
||||
gfxCtx->polyOpa.p = spA8;
|
||||
}
|
||||
|
||||
// gSPLoadUcode(gfxCtx->polyOpa.p++, func_800D2E14(), func_800D2E20())?
|
||||
gSPLoadUcodeEx(gfxCtx->polyOpa.p++, func_800D2E14(), func_800D2E20(), 0x800);
|
||||
// gSPLoadUcode(gfxCtx->polyOpa.p++, SysUcode_GetUcode(), SysUcode_GetUcodeData())?
|
||||
gSPLoadUcodeEx(gfxCtx->polyOpa.p++, SysUcode_GetUcode(), SysUcode_GetUcodeData(), 0x800);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -542,8 +542,8 @@ void func_80096B6C(GlobalContext* globalCtx, Room* room, u32 flags)
|
||||
gfxCtx->polyOpa.p = spA8;
|
||||
}
|
||||
|
||||
// gSPLoadUcode(gfxCtx->polyOpa.p++, func_800D2E14(), func_800D2E20())?
|
||||
gSPLoadUcodeEx(gfxCtx->polyOpa.p++, func_800D2E14(), func_800D2E20(), 0x800);
|
||||
// gSPLoadUcode(gfxCtx->polyOpa.p++, SysUcode_GetUcode(), SysUcode_GetUcodeData())?
|
||||
gSPLoadUcodeEx(gfxCtx->polyOpa.p++, SysUcode_GetUcode(), SysUcode_GetUcodeData(), 0x800);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,12 +3,18 @@
|
||||
#define ROOM 0x00
|
||||
#define FLAGS 0x00000000
|
||||
|
||||
void EnDog_Init(EnDog* this, GlobalContext* globalCtx);
|
||||
void EnDog_Destroy(EnDog* this, GlobalContext* globalCtx);
|
||||
void EnDog_Update(EnDog* this, GlobalContext* globalCtx);
|
||||
void EnDog_Draw(EnDog* this, GlobalContext* globalCtx);
|
||||
static void EnDog_Init(EnDog* this, GlobalContext* globalCtx);
|
||||
static void EnDog_Destroy(EnDog* this, GlobalContext* globalCtx);
|
||||
static void EnDog_Update(EnDog* this, GlobalContext* globalCtx);
|
||||
static void EnDog_Draw(EnDog* this, GlobalContext* globalCtx);
|
||||
|
||||
static void EnDog_FollowPath(EnDog* this, GlobalContext* globalCtx);
|
||||
static void EnDog_ChooseMovement(EnDog* this, GlobalContext* globalCtx);
|
||||
static void EnDog_FollowLink(EnDog* this, GlobalContext* globalCtx);
|
||||
static void EnDog_RunAway(EnDog* this, GlobalContext* globalCtx);
|
||||
static void EnDog_FaceLink(EnDog* this, GlobalContext* globalCtx);
|
||||
static void EnDog_Wait(EnDog* this, GlobalContext* globalCtx);
|
||||
|
||||
/*
|
||||
const ActorInit En_Dog_InitVars =
|
||||
{
|
||||
ACTOR_EN_DOG,
|
||||
@@ -22,41 +28,576 @@ const ActorInit En_Dog_InitVars =
|
||||
(ActorFunc)EnDog_Update,
|
||||
(ActorFunc)EnDog_Draw,
|
||||
};
|
||||
*/
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FAFD0.s")
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FB038.s")
|
||||
static ColliderCylinderInit cylinderInit =
|
||||
{
|
||||
0x06, 0x00, 0x09, 0x39,
|
||||
0x10, 0x01, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00000000,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0xFFCFFFFF,
|
||||
0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x01, 0x01, 0x00,
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FB0A0.s")
|
||||
0x0010,
|
||||
0x0014,
|
||||
0x0000,
|
||||
0x0000, 0x0000, 0x0000,
|
||||
};
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FB108.s")
|
||||
// There are multiple versions of sub98 init structs
|
||||
// Keeping these local until z_collision_check is decompiled
|
||||
typedef struct
|
||||
{
|
||||
/* 0x00 */ u8 health;
|
||||
/* 0x02 */ s16 unk_10;
|
||||
/* 0x04 */ s16 unk_12;
|
||||
/* 0x06 */ u16 unk_14;
|
||||
/* 0x08 */ u8 mass;
|
||||
}sub98Init;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FB29C.s")
|
||||
static sub98Init sub98Data =
|
||||
{
|
||||
0x00, //health
|
||||
0x0000, //unk_10
|
||||
0x0000, //unk_12
|
||||
0x0000, //unk_14
|
||||
0x32, //mass
|
||||
};
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FB320.s")
|
||||
static struct_80034EC0_Entry animations[]=
|
||||
{
|
||||
{0x06001368, 1.0f, 0.0f, -1.0f, 0x00, 0.0f},
|
||||
{0x06001368, 1.0f, 0.0f, -1.0f, 0x00, -6.0f},
|
||||
{0x06000D78, 1.0f, 0.0f, -1.0f, 0x00, -6.0f},
|
||||
{0x06000278, 1.0f, 0.0f, -1.0f, 0x00, -6.0f},
|
||||
{0x06001150, 1.0f, 0.0f, 4.0f, 0x02, -6.0f},
|
||||
{0x06001150, 1.0f, 5.0f, 25.0f,0x04, -6.0f},
|
||||
{0x06000928, 1.0f, 0.0f, 6.0f, 0x02, -6.0f},
|
||||
{0x06000C28, 1.0f, 0.0f, -1.0f, 0x00, -6.0f},
|
||||
};
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FB3AC.s")
|
||||
// Bandaid fix for a lw vs lh issue in EnDog_FollowPath. Roman will look at it later.
|
||||
typedef union
|
||||
{
|
||||
/* 0x00 */ s32 entry;
|
||||
struct
|
||||
{
|
||||
s16 unk_0;
|
||||
s16 unk_2;
|
||||
};
|
||||
}s16ArrEntry;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/EnDog_Init.s")
|
||||
typedef enum
|
||||
{
|
||||
/* 0x00 */ DOG_WALK,
|
||||
/* 0x01 */ DOG_RUN,
|
||||
/* 0x02 */ DOG_BARK,
|
||||
/* 0x03 */ DOG_SIT,
|
||||
/* 0x04 */ DOG_SIT_2,
|
||||
/* 0x05 */ DOG_BOW,
|
||||
/* 0x06 */ DOG_BOW_2,
|
||||
} DogBehavior;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/EnDog_Destroy.s")
|
||||
extern UNK_PTR D_06007290;
|
||||
extern UNK_PTR D_06001368;
|
||||
extern UNK_PTR D_06000D78;
|
||||
extern UNK_PTR D_06000278;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FB6C4.s")
|
||||
static void EnDog_PlayWalkSFX(EnDog* this)
|
||||
{
|
||||
u32* walk = &D_06001368;
|
||||
if (this->skelAnime.animCurrent == walk)
|
||||
{
|
||||
if ((this->skelAnime.animCurrentFrame == 1.0f) || (this->skelAnime.animCurrentFrame == 7.0f))
|
||||
{
|
||||
Audio_PlayActorSound2(&this->actor, NA_SE_EV_CHIBI_WALK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FB858.s")
|
||||
static void EnDog_PlayRunSFX(EnDog* this)
|
||||
{
|
||||
u32* run = &D_06000D78;
|
||||
if (this->skelAnime.animCurrent == run)
|
||||
{
|
||||
if ((this->skelAnime.animCurrentFrame == 2.0f) || (this->skelAnime.animCurrentFrame == 4.0f))
|
||||
{
|
||||
Audio_PlayActorSound2(&this->actor, NA_SE_EV_CHIBI_WALK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FB940.s")
|
||||
static void EnDog_PlayBarkSFX(EnDog* this)
|
||||
{
|
||||
u32* bark = &D_06000278;
|
||||
if (this->skelAnime.animCurrent == bark)
|
||||
{
|
||||
if ((this->skelAnime.animCurrentFrame == 13.0f) || (this->skelAnime.animCurrentFrame == 19.0f))
|
||||
{
|
||||
Audio_PlayActorSound2(&this->actor, NA_SE_EV_SMALL_DOG_BARK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FBABC.s")
|
||||
static s32 EnDog_PlayAnimAndSFX(EnDog* this)
|
||||
{
|
||||
s32 animation;
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FBB64.s")
|
||||
if (this->behavior != this->nextBehavior)
|
||||
{
|
||||
if (this->nextBehavior == DOG_SIT_2)
|
||||
{
|
||||
this->nextBehavior = DOG_SIT;
|
||||
}
|
||||
if (this->nextBehavior == DOG_BOW_2)
|
||||
{
|
||||
this->nextBehavior = DOG_BOW;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FBC6C.s")
|
||||
this->behavior = this->nextBehavior;
|
||||
switch(this->behavior)
|
||||
{
|
||||
case DOG_WALK:
|
||||
animation = 1;
|
||||
break;
|
||||
case DOG_RUN:
|
||||
animation = 2;
|
||||
break;
|
||||
case DOG_BARK:
|
||||
animation = 3;
|
||||
break;
|
||||
case DOG_SIT:
|
||||
animation = 4;
|
||||
break;
|
||||
case DOG_BOW:
|
||||
animation = 6;
|
||||
break;
|
||||
}
|
||||
func_80034EC0(&this->skelAnime, &animations, animation);
|
||||
}
|
||||
|
||||
switch(this->behavior)
|
||||
{
|
||||
case DOG_SIT:
|
||||
if (func_800A56C8(&this->skelAnime, this->skelAnime.animFrameCount) != 0)
|
||||
{
|
||||
func_80034EC0(&this->skelAnime, &animations, 5);
|
||||
this->behavior = this->nextBehavior = DOG_SIT_2;
|
||||
}
|
||||
break;
|
||||
case DOG_BOW:
|
||||
if (func_800A56C8(&this->skelAnime, this->skelAnime.animFrameCount) != 0)
|
||||
{
|
||||
func_80034EC0(&this->skelAnime, &animations, 7);
|
||||
this->behavior = this->nextBehavior = DOG_BOW_2;
|
||||
}
|
||||
break;
|
||||
case DOG_WALK:
|
||||
EnDog_PlayWalkSFX(this);
|
||||
break;
|
||||
case DOG_RUN:
|
||||
EnDog_PlayRunSFX(this);
|
||||
break;
|
||||
case DOG_BARK:
|
||||
EnDog_PlayBarkSFX(this);
|
||||
if (this){} // needed for regalloc
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/EnDog_Update.s")
|
||||
static s8 EnDog_CanFollow(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
if ((this->collider.base.collideFlags & 2))
|
||||
{
|
||||
this->collider.base.collideFlags &= ~2;
|
||||
return 2;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FBD8C.s")
|
||||
if (globalCtx->sceneNum == SCENE_MARKET_DAY)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/func_809FBDA4.s")
|
||||
if ((this->collider.base.maskB & 1))
|
||||
{
|
||||
this->collider.base.maskB &= ~1;
|
||||
if (gSaveContext.dogParams != 0)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
gSaveContext.dogParams = (this->actor.params & 0x7FFF);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#pragma GLOBAL_ASM("asm/non_matchings/overlays/actors/ovl_En_Dog/EnDog_Draw.s")
|
||||
return 0;
|
||||
}
|
||||
|
||||
static EnDog_UpdateWaypoint(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
s32 change;
|
||||
|
||||
if (this->path == NULL)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (this->reverse)
|
||||
{
|
||||
change = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
change = 1;
|
||||
}
|
||||
|
||||
this->waypoint += change;
|
||||
|
||||
if (this->reverse)
|
||||
{
|
||||
if (this->waypoint < 0)
|
||||
{
|
||||
this->waypoint = this->path->count - 1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((this->path->count - 1) < this->waypoint)
|
||||
{
|
||||
this->waypoint = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static s32 EnDog_Orient(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
s16 targetYaw;
|
||||
f32 waypointDistSq;
|
||||
|
||||
waypointDistSq = func_8008E520(&this->actor, this->path, this->waypoint, &targetYaw);
|
||||
Math_SmoothScaleMaxMinS(&this->actor.posRot.rot.y, targetYaw, 10, 1000, 1);
|
||||
|
||||
if ((waypointDistSq > 0.0f) && (waypointDistSq < 1000.0f))
|
||||
{
|
||||
return EnDog_UpdateWaypoint(this, globalCtx);
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void EnDog_Init(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
SkelAnime* skelAnime;
|
||||
s16 followingDog;
|
||||
ColliderCylinderMain* collider;
|
||||
|
||||
collider = &this->collider;
|
||||
ActorShape_Init(&this->actor.shape, 0.0f, ActorShadow_DrawFunc_Circle, 24.0f);
|
||||
skelAnime = &this->skelAnime;
|
||||
func_800A46F8(globalCtx, skelAnime, &D_06007290, 0, &this->unk_1F4, &this->unk_242, 13);
|
||||
func_80034EC0(skelAnime, animations, 0);
|
||||
|
||||
if ((this->actor.params & 0x8000) == 0)
|
||||
{
|
||||
this->actor.params = (this->actor.params & 0xF0FF) | ((((this->actor.params & 0x0F00) >> 8) + 1) << 8);
|
||||
}
|
||||
|
||||
followingDog = ((gSaveContext.dogParams & 0x0F00) >> 8);
|
||||
if (followingDog == ((this->actor.params & 0x0F00) >> 8) && ((this->actor.params & 0x8000) == 0))
|
||||
{
|
||||
Actor_Kill(&this->actor);
|
||||
return;
|
||||
}
|
||||
|
||||
ActorCollider_AllocCylinder(globalCtx, collider);
|
||||
ActorCollider_InitCylinder(globalCtx, collider, &this->actor, &cylinderInit);
|
||||
func_80061EFC(&this->actor.sub_98, 0, &sub98Data);
|
||||
Actor_SetScale(&this->actor, 0.0075f);
|
||||
this->waypoint = 0;
|
||||
this->actor.gravity = -1.0f;
|
||||
this->path = func_8008E4E0(globalCtx, (s16)((this->actor.params & 0x00F0) >> 4), 0xF);
|
||||
|
||||
switch (globalCtx->sceneNum)
|
||||
{
|
||||
case SCENE_MARKET_NIGHT:
|
||||
if ((!gSaveContext.dogIsLost) && (((this->actor.params & 0x0F00) >> 8) == 1))
|
||||
{
|
||||
Actor_Kill(&this->actor);
|
||||
}
|
||||
break;
|
||||
case SCENE_IMPA: // Richard's Home
|
||||
if ((u32)(this->actor.params & 0x8000) == 0)
|
||||
{
|
||||
if (!gSaveContext.dogIsLost)
|
||||
{
|
||||
this->nextBehavior = DOG_SIT;
|
||||
this->actionFunc = EnDog_Wait;
|
||||
this->actor.speedXZ = 0.0f;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
Actor_Kill(&this->actor);
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if ((u32)(this->actor.params & 0x8000) != 0)
|
||||
{
|
||||
this->nextBehavior = DOG_WALK;
|
||||
this->actionFunc = EnDog_FollowLink;
|
||||
}
|
||||
else
|
||||
{
|
||||
this->nextBehavior = DOG_SIT;
|
||||
this->actionFunc = EnDog_ChooseMovement;
|
||||
}
|
||||
}
|
||||
|
||||
static void EnDog_Destroy(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
ColliderCylinderMain* collider = &this->collider;
|
||||
ActorCollider_FreeCylinder(globalCtx, collider);
|
||||
}
|
||||
|
||||
static void EnDog_FollowPath(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
s16ArrEntry behaviors[] = { DOG_SIT, DOG_BOW, DOG_BARK };
|
||||
s16ArrEntry unused[] = { 40, 80, 20 };
|
||||
f32 speed;
|
||||
s32 frame;
|
||||
|
||||
if (EnDog_CanFollow(this, globalCtx) == 1)
|
||||
{
|
||||
this->actionFunc = EnDog_FollowLink;
|
||||
}
|
||||
|
||||
if (DECR(this->behaviorTimer) != 0)
|
||||
{
|
||||
if (this->nextBehavior == DOG_WALK)
|
||||
{
|
||||
speed = 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
speed = 4.0f;
|
||||
}
|
||||
Math_SmoothScaleMaxMinF(&this->actor.speedXZ, speed, 0.4f, 1.0f, 0.0f);
|
||||
EnDog_Orient(this, globalCtx);
|
||||
this->actor.shape.rot = this->actor.posRot.rot;
|
||||
|
||||
// Used to change between two text boxes for Richard's owner in the Market Day scene
|
||||
// depending on where he is on his path. En_Hy checks these event flags.
|
||||
if (this->waypoint < 9)
|
||||
{
|
||||
// Richard is close to her, text says something about his coat
|
||||
gSaveContext.event_inf[3] |= 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Richard is far, text says something about running fast
|
||||
gSaveContext.event_inf[3] &= ~1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
frame = globalCtx->state.frames % 3;
|
||||
this->nextBehavior = behaviors[frame].entry;
|
||||
// no clue why they're using the action id to calculate timer. possibly meant to use the unused array?
|
||||
this->behaviorTimer = Math_Rand_S16Offset(60, behaviors[frame].unk_2);
|
||||
this->actionFunc = EnDog_ChooseMovement;
|
||||
}
|
||||
}
|
||||
|
||||
static void EnDog_ChooseMovement(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
if (EnDog_CanFollow(this, globalCtx) == 1)
|
||||
{
|
||||
this->actionFunc = EnDog_FollowLink;
|
||||
}
|
||||
|
||||
if (DECR(this->behaviorTimer) == 0)
|
||||
{
|
||||
this->behaviorTimer = Math_Rand_S16Offset(200, 100);
|
||||
if (globalCtx->state.frames % 2)
|
||||
{
|
||||
this->nextBehavior = DOG_WALK;
|
||||
}
|
||||
else
|
||||
{
|
||||
this->nextBehavior = DOG_RUN;
|
||||
}
|
||||
|
||||
if (this->nextBehavior == DOG_RUN)
|
||||
{
|
||||
this->behaviorTimer /= 2;
|
||||
}
|
||||
this->actionFunc = EnDog_FollowPath;
|
||||
}
|
||||
Math_SmoothScaleMaxMinF(&this->actor.speedXZ, 0.0f, 0.4f, 1.0f, 0.0f);
|
||||
}
|
||||
|
||||
static void EnDog_FollowLink(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
f32 speed;
|
||||
|
||||
if (gSaveContext.dogParams == 0)
|
||||
{
|
||||
this->nextBehavior = DOG_SIT;
|
||||
this->actionFunc = EnDog_Wait;
|
||||
this->actor.speedXZ = 0.0f;
|
||||
return;
|
||||
}
|
||||
|
||||
if (this->actor.xzDistanceFromLink > 400.0f)
|
||||
{
|
||||
if (this->nextBehavior != DOG_SIT && this->nextBehavior != DOG_SIT_2)
|
||||
{
|
||||
this->nextBehavior = DOG_BOW;
|
||||
}
|
||||
gSaveContext.dogParams = 0;
|
||||
speed = 0.0f;
|
||||
}
|
||||
else if (this->actor.xzDistanceFromLink > 100.0f)
|
||||
{
|
||||
this->nextBehavior = DOG_RUN;
|
||||
speed = 4.0f;
|
||||
}
|
||||
else if (this->actor.xzDistanceFromLink < 40.0f)
|
||||
{
|
||||
if (this->nextBehavior != DOG_BOW && this->nextBehavior != DOG_BOW_2)
|
||||
{
|
||||
this->nextBehavior = DOG_BOW;
|
||||
}
|
||||
speed = 0.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
this->nextBehavior = DOG_WALK;
|
||||
speed = 1.0f;
|
||||
}
|
||||
|
||||
Math_SmoothScaleMaxF(&this->actor.speedXZ, speed, 0.6f, 1.0f);
|
||||
|
||||
if (!(this->actor.xzDistanceFromLink > 400.0f))
|
||||
{
|
||||
Math_SmoothScaleMaxMinS(&this->actor.posRot.rot.y, this->actor.rotTowardsLinkY, 10, 1000, 1);
|
||||
this->actor.shape.rot = this->actor.posRot.rot;
|
||||
}
|
||||
}
|
||||
|
||||
static void EnDog_RunAway(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
if (this->actor.xzDistanceFromLink < 200.0f)
|
||||
{
|
||||
Math_SmoothScaleMaxF(&this->actor.speedXZ, 4.0f, 0.6f, 1.0f);
|
||||
Math_SmoothScaleMaxMinS(&this->actor.posRot.rot.y, (this->actor.rotTowardsLinkY ^ 0x8000), 10, 1000, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
this->actionFunc = EnDog_FaceLink;
|
||||
}
|
||||
this->actor.shape.rot = this->actor.posRot.rot;
|
||||
}
|
||||
|
||||
static void EnDog_FaceLink(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
s16 rotTowardLink;
|
||||
s16 prevRotY;
|
||||
f32 absAngleDiff;
|
||||
|
||||
// if the dog is more than 200 units away from Link, turn to face him then wait
|
||||
if (200.0f <= this->actor.xzDistanceFromLink)
|
||||
{
|
||||
this->nextBehavior = DOG_WALK;
|
||||
|
||||
Math_SmoothScaleMaxF(&this->actor.speedXZ, 1.0f, 0.6f, 1.0f);
|
||||
|
||||
rotTowardLink = this->actor.rotTowardsLinkY;
|
||||
prevRotY = this->actor.posRot.rot.y;
|
||||
Math_SmoothScaleMaxMinS(&this->actor.posRot.rot.y, rotTowardLink, 10, 1000, 1);
|
||||
|
||||
absAngleDiff = this->actor.posRot.rot.y;
|
||||
absAngleDiff -= prevRotY;
|
||||
absAngleDiff = fabsf(absAngleDiff);
|
||||
if (absAngleDiff < 200.0f)
|
||||
{
|
||||
this->nextBehavior = DOG_SIT;
|
||||
this->actionFunc = EnDog_Wait;
|
||||
this->actor.speedXZ = 0.0f;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
this->nextBehavior = DOG_RUN;
|
||||
this->actionFunc = EnDog_RunAway;
|
||||
}
|
||||
this->actor.shape.rot = this->actor.posRot.rot;
|
||||
}
|
||||
|
||||
static void EnDog_Wait(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
this->unusedAngle = (this->actor.rotTowardsLinkY - this->actor.shape.rot.y);
|
||||
|
||||
// If another dog is following Link and he gets within 200 units of waiting dog, run away
|
||||
if ((gSaveContext.dogParams != 0) && (this->actor.xzDistanceFromLink < 200.0f))
|
||||
{
|
||||
this->nextBehavior = DOG_RUN;
|
||||
this->actionFunc = EnDog_RunAway;
|
||||
}
|
||||
}
|
||||
|
||||
static void EnDog_Update(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
s32 pad1;
|
||||
s32 pad2;
|
||||
|
||||
EnDog_PlayAnimAndSFX(this);
|
||||
SkelAnime_FrameUpdateMatrix(&this->skelAnime);
|
||||
func_8002E4B4(globalCtx, &this->actor, this->collider.dim.radius,
|
||||
this->collider.dim.height * 0.5f, 0.0f, 5);
|
||||
Actor_MoveForward(&this->actor);
|
||||
this->actionFunc(this, globalCtx);
|
||||
ActorCollider_Cylinder_Update(&this->actor, &this->collider);
|
||||
Actor_CollisionCheck_SetOT(globalCtx, &globalCtx->sub_11E60, &this->collider);
|
||||
}
|
||||
|
||||
static UNK_TYPE EnDog_Callback1(UNK_TYPE unused1, UNK_TYPE unused2, UNK_TYPE unused3, UNK_TYPE unused4)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void EnDog_Callback2(UNK_TYPE unused1, UNK_TYPE unused2, UNK_TYPE unused3, UNK_TYPE unused4)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
static void EnDog_Draw(EnDog* this, GlobalContext* globalCtx)
|
||||
{
|
||||
s32 pad;
|
||||
Color_RGBA8 colors[] = { {0xFF, 0xFF, 0xC8, 0x00}, {0x96, 0x64, 0x32, 0x00} };
|
||||
GraphicsContext* gfxCtx;
|
||||
s32 pad2[2];
|
||||
Gfx* gfxArr[2];
|
||||
|
||||
gfxCtx = globalCtx->state.gfxCtx;
|
||||
func_800C6AC4(gfxArr, globalCtx->state.gfxCtx, "../z_en_dog.c", 972);
|
||||
func_80093D18(globalCtx->state.gfxCtx);
|
||||
|
||||
gDPPipeSync(gfxCtx->polyOpa.p++);
|
||||
gDPSetEnvColor(gfxCtx->polyOpa.p++,
|
||||
colors[this->actor.params & 0xF].r, colors[this->actor.params & 0xF].g,
|
||||
colors[this->actor.params & 0xF].b, colors[this->actor.params & 0xF].a);
|
||||
|
||||
func_800A1AC8(globalCtx, this->skelAnime.limbIndex, this->skelAnime.actorDrawTbl,
|
||||
this->skelAnime.dListCount, EnDog_Callback1, EnDog_Callback2, &this->actor);
|
||||
func_800C6B54(gfxArr, globalCtx->state.gfxCtx, "../z_en_dog.c", 994);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,22 @@
|
||||
typedef struct
|
||||
{
|
||||
/* 0x0000 */ Actor actor;
|
||||
/* 0x014C */ char unk_14C[0x144];
|
||||
/* 0x014C */ SkelAnime skelAnime;
|
||||
/* 0x0190 */ ActorFunc actionFunc;
|
||||
/* 0x0194 */ ColliderCylinderMain collider;
|
||||
/* 0x01E0 */ Path* path;
|
||||
/* 0x01E4 */ u8 reverse;
|
||||
/* 0x01E6 */ s16 waypoint;
|
||||
/* 0x01E8 */ s16 unusedAngle;
|
||||
/* 0x01EA */ s16 pad1;
|
||||
/* 0x01EC */ s16 behaviorTimer;
|
||||
/* 0x01EE */ s16 pad2;
|
||||
/* 0x01F0 */ s16 nextBehavior;
|
||||
/* 0x01F2 */ s16 behavior;
|
||||
/* 0x01F4 */ u8 unk_1F4; // I believe this and the rest below belong to something skelanime
|
||||
/* 0x01F5 */ char unk_1F5[0x4D];
|
||||
/* 0x0242 */ u8 unk_242;
|
||||
/* 0x0243 */ char unk_243[0x4D];
|
||||
} EnDog; // size = 0x0290
|
||||
|
||||
extern const ActorInit En_Dog_InitVars;
|
||||
|
||||
Reference in New Issue
Block a user