loadRoom merge

This commit is contained in:
theo3
2021-11-12 00:45:13 -08:00
parent fddb4abd53
commit f70c95f037
12 changed files with 202 additions and 293 deletions
+139 -24
View File
@@ -1,7 +1,9 @@
#include "global.h"
#include "area.h"
#include "room.h"
#include "flags.h"
#include "functions.h"
#include "utils.h"
extern void sub_0804B058(EntityData* dat);
extern void sub_0801AC98();
@@ -9,11 +11,132 @@ extern u32 sub_08049D1C(u32);
extern Entity* LoadRoomEntity(EntityData*);
extern void* GetRoomProperty(u32, u32, u32);
extern u32 gUnk_02017654;
extern u32* gAreaTable;
extern void** gCurrentRoomProperties;
extern void*** gAreaTable[];
extern u8 gUnk_081091E4[];
extern void sub_080186EC();
extern void sub_0804B16C();
extern void sub_080A7C7C(void);
extern Entity* GetEmptyEntityByKind(u32 kind);
void RegisterRoomEntity(Entity*, EntityData*);
void sub_0804AF0C(Entity*, EntityData*);
void sub_0804AFB0(void** properties);
void LoadRoomEntityList(EntityData* listPtr) {
if (listPtr != NULL) {
while (listPtr->kind != 0xFF) {
LoadRoomEntity(listPtr++);
}
}
}
NONMATCH("asm/loadRoomEntity.s", Entity* LoadRoomEntity(EntityData* dat)) {
int kind;
Entity* v4;
Entity* v5;
kind = dat->kind & 0xF;
if ((dat->flags & 0xF0) == 0x50 && DeepFindEntityByID(kind, dat->id))
return NULL;
v4 = GetEmptyEntityByKind(kind);
v5 = v4;
if (v4 != NULL) {
v4->kind = kind;
v4->id = dat->id;
v4->type = dat->type;
RegisterRoomEntity(v4, dat);
if ((dat->flags & 0xF0) != 16) {
v5->type2 = dat->type2;
v5->actionDelay = (dat->type2 & 0xFF00) >> 8;
if (kind == 9)
return v5;
sub_0804AF0C(v5, dat);
if (!v5->next)
return v5;
if ((dat->kind & 0x10) == 0) {
if ((dat->kind & 0x20) != 0) {
v5->collisionLayer = 2;
return v5;
}
if ((gRoomControls.unk6 & 2) == 0) {
sub_08016A30(v5);
}
}
v5->collisionLayer = 1;
}
}
return v5;
}
END_NONMATCH
void RegisterRoomEntity(Entity* ent, EntityData* dat) {
u32 list;
u32 kind;
void* offset;
list = dat->flags & 0xF;
kind = dat->kind & 0xF;
if (ent->prev == NULL) {
if (list == 0xF) {
AppendEntityToList(ent, gUnk_081091E4[kind]);
} else if (list == 8) {
AppendEntityToList(ent, 8);
} else {
AppendEntityToList(ent, list);
}
}
offset = &ent->field_0x78;
if (kind == MANAGER)
offset = &ent->y;
MemCopy(dat, offset, sizeof(EntityData));
}
void sub_0804AF0C(Entity* ent, EntityData* dat) {
switch (dat->flags & 0xf0) {
case 0x0:
ent->x.HALF.HI = dat->xPos + gRoomControls.roomOriginX;
ent->y.HALF.HI = dat->yPos + gRoomControls.roomOriginY;
break;
case 0x20:
ent->field_0x6c.HALF.HI |= 0x20;
ent->x.HALF.HI = dat->xPos + gRoomControls.roomOriginX;
ent->y.HALF.HI = dat->yPos + gRoomControls.roomOriginY;
break;
case 0x40:
ent->x.HALF.HI = dat->xPos + gRoomControls.roomOriginX;
ent->y.HALF.HI = dat->yPos + gRoomControls.roomOriginY;
if (!StartCutscene(ent, (u16*)dat->spritePtr))
DeleteEntity(ent);
break;
}
}
void sub_0804AF90(void) {
sub_0804AFB0(gArea.field_0x85c[7]);
sub_080A7C7C();
}
void sub_0804AFB0(void** properties) {
u32 i;
gCurrentRoomProperties = properties;
for (i = 0; i < 8; ++i) {
gRoomVars.field_0x6c[i] = gCurrentRoomProperties[i];
}
}
u32 sub_0804AFDC() {
u32 result;
u32 (*func)();
result = 1;
func = (u32(*)())GetCurrentRoomProperty(6);
if (func != NULL)
result = func();
return result;
}
void sub_0804AFF4(void) {
void (*func)();
@@ -31,9 +154,6 @@ void sub_0804AFF4(void) {
}
void LoadRoom(void) {
s32 iVar1;
s32* dat;
LoadRoomEntityList(GetCurrentRoomProperty(1));
LoadRoomEntityList(GetCurrentRoomProperty(0));
@@ -48,10 +168,10 @@ void sub_0804B058(EntityData* dat) {
Entity* ent;
u32 uVar2;
if ((dat != NULL) && *(u8*)dat != 0xff) {
if ((dat != NULL) && dat->kind != 0xff) {
uVar2 = 0;
do {
if ((uVar2 < 0x20) && ((dat->kind) == 3)) {
if ((uVar2 < 0x20) && ((dat->kind & 0xF) == 3)) {
if (sub_08049D1C(uVar2) != 0) {
ent = LoadRoomEntity(dat);
if ((ent != NULL) && (ent->kind == 3)) {
@@ -63,7 +183,7 @@ void sub_0804B058(EntityData* dat) {
}
uVar2++;
dat++;
} while (*(u8*)dat != 0xff);
} while (dat->kind != 0xff);
}
}
@@ -72,11 +192,9 @@ void sub_0804B0B0(u32 arg0, u32 arg1) {
}
void SetCurrentRoomPropertyList(u32 area, u32 room) {
u32** arr;
gUnk_02017654 = 0;
arr = &gAreaTable;
if (arr[area] != 0) {
gUnk_02017654 = arr[area][room];
gCurrentRoomProperties = NULL;
if (gAreaTable[area] != NULL) {
gCurrentRoomProperties = gAreaTable[area][room];
}
}
@@ -91,17 +209,14 @@ void sub_0804B0E8(u32 arg0, u32 arg1) {
}
}
// returns multiple types of data?
void* GetRoomProperty(u32 area, u32 room, u32 arg2) {
u32 temp;
u32** arr;
temp = 0;
arr = &gAreaTable;
if (arr[area] != NULL) {
temp = arr[area][room];
if (temp != 0) {
temp = *(u32*)(arg2 * 4 + temp);
void* GetRoomProperty(u32 area, u32 room, u32 property) {
void** temp;
temp = NULL;
if (gAreaTable[area] != NULL) {
temp = gAreaTable[area][room];
if (temp != NULL) {
temp = temp[property];
}
}
return (void*)temp;
return temp;
}
-12
View File
@@ -1,12 +0,0 @@
#include "global.h"
#include "room.h"
void extern LoadRoomEntity(EntityData*);
void LoadRoomEntityList(EntityData* listPtr) {
if (listPtr != NULL) {
while (*(u8*)listPtr != 0xFF) {
LoadRoomEntity(listPtr++);
}
}
}
+2 -2
View File
@@ -85,10 +85,10 @@ u32 Manager28_FindMatchingEntities(Manager28* this) {
EntityData* tmp = GetCurrentRoomProperty(this->manager.unk_0b);
if (!tmp)
return 0;
for (; *((u8*)tmp) != 0xFF && !(tmp->kind == 9 && tmp->id == 0x28); tmp++) {
for (; *((u8*)tmp) != 0xFF && !((tmp->kind & 0xf) == 9 && tmp->id == 0x28); tmp++) {
Entity* tmp2;
u32 i;
if (tmp->kind != 3)
if ((tmp->kind & 0xf) != 3)
continue;
tmp2 = Manager28_FindMatchingEntity(tmp);
if (!tmp2)
+45 -45
View File
@@ -374,7 +374,7 @@ void sub_0804B78C(void) {
}
}
extern u32 gUnk_080D6A74[];
extern u32* gUnk_080D6A74[];
u32 sub_0804B7A8(void) {
u32 index;
@@ -386,7 +386,7 @@ u32 sub_0804B7A8(void) {
index = 0;
SetLocalFlag(1);
}
gRoomVars.field_0x78 = gUnk_080D6A74[index];
gRoomVars.field_0x6c[3] = gUnk_080D6A74[index];
return 1;
}
@@ -402,7 +402,7 @@ void sub_0804B7E8(void) {
}
}
extern u32 gUnk_080D6B18[];
extern u32* gUnk_080D6B18[];
u32 sub_0804B82C(void) {
u32 index;
@@ -414,7 +414,7 @@ u32 sub_0804B82C(void) {
index = 0;
SetLocalFlag(2);
}
gRoomVars.field_0x78 = gUnk_080D6B18[index];
gRoomVars.field_0x6c[3] = gUnk_080D6B18[index];
return 1;
}
@@ -428,7 +428,7 @@ void sub_0804B86C(void) {
}
}
extern u32 gUnk_080D6BB8[];
extern u32* gUnk_080D6BB8[];
u32 sub_0804B8B0(void) {
s32 index;
@@ -440,7 +440,7 @@ u32 sub_0804B8B0(void) {
index = 0;
SetLocalFlag(3);
}
gRoomVars.field_0x78 = gUnk_080D6BB8[index];
gRoomVars.field_0x6c[3] = gUnk_080D6BB8[index];
return 1;
}
@@ -555,8 +555,8 @@ extern u32 gUnk_080D7348;
u32 sub_0804BA9C(void) {
if (CheckGlobalFlag(ENDING)) {
gRoomVars.field_0x6c = &gUnk_080D7348;
gRoomVars.field_0x74 = 0;
gRoomVars.field_0x6c[0] = &gUnk_080D7348;
gRoomVars.field_0x6c[2] = 0;
}
return 1;
}
@@ -587,8 +587,8 @@ extern u32 gUnk_080D7410;
u32 sub_0804BB18(void) {
if (CheckGlobalFlag(ENDING)) {
gRoomVars.field_0x6c = &gUnk_080D7410;
gRoomVars.field_0x74 = 0;
gRoomVars.field_0x6c[0] = &gUnk_080D7410;
gRoomVars.field_0x6c[2] = 0;
}
return 1;
}
@@ -1221,7 +1221,7 @@ extern u32 gUnk_080DA230;
u32 sub_0804C3CC(void) {
if (!CheckLocalFlag(0x39))
gRoomVars.field_0x6c = &gUnk_080DA230;
gRoomVars.field_0x6c[0] = &gUnk_080DA230;
return 1;
}
@@ -1594,7 +1594,7 @@ extern u32 gUnk_080DB910;
u32 sub_0804C730(void) {
if (CheckGlobalFlag(MIZUKAKI_START) && !CheckLocalFlag(0x73)) {
gRoomVars.field_0x70 = &gUnk_080DB910;
gRoomVars.field_0x6c[1] = &gUnk_080DB910;
}
return 1;
}
@@ -2454,7 +2454,7 @@ extern u32 gUnk_080E103C;
u32 sub_0804CE80(void) {
if (CheckGlobalFlag(LV2_CLEAR)) {
gRoomVars.field_0x70 = &gUnk_080E103C;
gRoomVars.field_0x6c[1] = &gUnk_080E103C;
}
return 1;
}
@@ -2516,7 +2516,7 @@ void sub_0804CED8(void) {
if (CheckGlobalFlag(LV2_CLEAR)) {
gUnk_0200B650 = 0;
gScreen.lcd.displayControl &= 0xfdff;
gScreen.lcd.displayControl &= ~DISPCNT_BG1_ON;
sub_0807AABC(&gPlayerEntity);
LoadRoomEntityList(&gUnk_080E1814);
} else {
@@ -3769,16 +3769,16 @@ extern u32 gUnk_080EB5D4;
u32 sub_0804D904(void) {
if (CheckGlobalFlag(ENDING)) {
gRoomVars.field_0x6c = &gUnk_080EB604;
gRoomVars.field_0x74 = 0;
gRoomVars.field_0x6c[0] = &gUnk_080EB604;
gRoomVars.field_0x6c[2] = 0;
gArea.musicIndex = gArea.pMusicIndex = 0x11;
} else if (CheckLocalFlag(0x79)) {
gRoomVars.field_0x6c = NULL;
gRoomVars.field_0x6c[0] = NULL;
if (!CheckLocalFlag(0x7a)) {
SetGlobalFlag(ZELDA_CHASE);
gRoomVars.field_0x6c = &gUnk_080EB5D4;
gRoomVars.field_0x88 = sub_0804D9B0;
gRoomVars.field_0x74 = 0;
gRoomVars.field_0x6c[0] = &gUnk_080EB5D4;
gRoomVars.field_0x6c[7] = sub_0804D9B0;
gRoomVars.field_0x6c[2] = 0;
}
}
return 1;
@@ -3841,8 +3841,8 @@ void nullsub_331() {
u32 sub_0804DA2C(void) {
if (!CheckLocalFlag(0x77)) {
gRoomVars.field_0x6c = 0;
gRoomVars.field_0x74 = 0;
gRoomVars.field_0x6c[0] = 0;
gRoomVars.field_0x6c[2] = 0;
}
return 1;
}
@@ -4034,7 +4034,7 @@ void nullsub_348() {
u32 sub_0804DBC0(void) {
if (CheckLocalFlag(0x79)) {
gRoomVars.field_0x74 = 0;
gRoomVars.field_0x6c[2] = 0;
}
return 1;
}
@@ -4067,8 +4067,8 @@ extern u32 gUnk_080ED1E4;
u32 sub_0804DC28(void) {
if (CheckGlobalFlag(ENDING)) {
gRoomVars.field_0x6c = &gUnk_080ED1E4;
gRoomVars.field_0x74 = 0;
gRoomVars.field_0x6c[0] = &gUnk_080ED1E4;
gRoomVars.field_0x6c[2] = 0;
}
return 1;
}
@@ -4228,8 +4228,8 @@ void nullsub_371() {
u32 sub_0804DD18(void) {
if (CheckLocalFlag(0x79)) {
gRoomVars.field_0x74 = 0;
gRoomVars.field_0x6c = 0;
gRoomVars.field_0x6c[2] = 0;
gRoomVars.field_0x6c[0] = 0;
}
return 1;
}
@@ -4253,7 +4253,7 @@ void nullsub_372() {
u32 sub_0804DD78(void) {
if (CheckLocalFlag(0x79)) {
gRoomVars.field_0x74 = 0;
gRoomVars.field_0x6c[2] = 0;
}
return 1;
}
@@ -4506,7 +4506,7 @@ u32 sub_0804E25C(void) {
// four sword
if (GetInventoryValue(0x6)) {
gRoomVars.field_0x70 = &gUnk_080F09A0;
gRoomVars.field_0x6c[1] = &gUnk_080F09A0;
}
return 1;
}
@@ -4989,9 +4989,9 @@ extern u32 gUnk_080F3EA4;
u32 sub_0804E998(void) {
if (CheckGlobalFlag(LV4_CLEAR) && !CheckLocalFlag(4)) {
gRoomVars.field_0x74 = &gUnk_080F3EA4;
gRoomVars.field_0x6c[2] = &gUnk_080F3EA4;
} else {
gRoomVars.field_0x74 = &gUnk_080F3D44;
gRoomVars.field_0x6c[2] = &gUnk_080F3D44;
}
return 1;
}
@@ -5144,8 +5144,8 @@ extern u32 gUnk_080F4EB0;
u32 sub_0804EBDC(void) {
if (CheckGlobalFlag(ENDING)) {
gRoomVars.field_0x6c = &gUnk_080F4EB0;
gRoomVars.field_0x74 = NULL;
gRoomVars.field_0x6c[0] = &gUnk_080F4EB0;
gRoomVars.field_0x6c[2] = NULL;
}
return 1;
}
@@ -5206,9 +5206,9 @@ extern u32 gUnk_080F5348;
u32 sub_0804ECBC(void) {
if (CheckGlobalFlag(ENDING)) {
gRoomVars.field_0x6c = &gUnk_080F5348;
gRoomVars.field_0x88 = sub_0804ED18;
gRoomVars.field_0x74 = NULL;
gRoomVars.field_0x6c[0] = &gUnk_080F5348;
gRoomVars.field_0x6c[7] = sub_0804ED18;
gRoomVars.field_0x6c[2] = NULL;
}
return 1;
}
@@ -5685,7 +5685,7 @@ extern u32 gUnk_080F7680;
u32 sub_0804f308(void) {
if (GetInventoryValue(0x11) && !GetInventoryValue(0x12)) {
gRoomVars.field_0x74 = &gUnk_080F7680;
gRoomVars.field_0x6c[2] = &gUnk_080F7680;
}
return 1;
}
@@ -5747,17 +5747,17 @@ extern void sub_0804F4E4();
u32 Vars_HyruleField_OutsideCastle(void) {
if (CheckGlobalFlag(TABIDACHI) && !GetInventoryValue(0x11)) {
gRoomVars.field_0x6c = &gUnk_080F7CD0;
gRoomVars.field_0x88 = sub_0804F5E8;
gRoomVars.field_0x6c[0] = &gUnk_080F7CD0;
gRoomVars.field_0x6c[7] = sub_0804F5E8;
}
#if defined(JP) || defined(EU) || defined(DEMO_JP)
if (CheckGlobalFlag(LV2_CLEAR) && GetInventoryValue(0x3) && !CheckLocalFlag(0x8a)) {
#else
if (CheckGlobalFlag(LV2_CLEAR) && GetInventoryValue(0x3) && !CheckLocalFlag(0x8c)) {
#endif
gRoomVars.field_0x6c = &gUnk_080F7C80;
gRoomVars.field_0x88 = sub_0804F4E4;
gRoomVars.field_0x74 = NULL;
gRoomVars.field_0x6c[0] = &gUnk_080F7C80;
gRoomVars.field_0x6c[7] = sub_0804F4E4;
gRoomVars.field_0x6c[2] = NULL;
}
#ifndef EU
if (CheckGlobalFlag(TABIDACHI)) {
@@ -6273,7 +6273,7 @@ extern u32 gUnk_080F9BF8;
u32 sub_0804FC4C(void) {
if (!CheckKinstoneFused(0xe)) {
gRoomVars.field_0x6c = &gUnk_080F9BF8;
gRoomVars.field_0x6c[0] = &gUnk_080F9BF8;
}
return 1;
}
@@ -6559,8 +6559,8 @@ extern u32 gUnk_080FAD48;
u32 sub_0804FDE0(void) {
if (CheckGlobalFlag(ENDING)) {
gRoomVars.field_0x6c = &gUnk_080FAD48;
gRoomVars.field_0x74 = NULL;
gRoomVars.field_0x6c[0] = &gUnk_080FAD48;
gRoomVars.field_0x6c[2] = NULL;
}
return 1;
}