diff --git a/asm/kinstone.s b/asm/kinstone.s index 8a0bbd2c..b525a065 100644 --- a/asm/kinstone.s +++ b/asm/kinstone.s @@ -343,315 +343,3 @@ _08018760: .align 2, 0 _08018764: .4byte gUnk_080FE320 _08018768: .4byte gRoomControls - - thumb_func_start sub_0801876C -sub_0801876C: @ 0x0801876C - push {r4, r5, lr} - adds r2, r0, #0 - adds r4, r1, #0 - lsls r0, r2, #2 - adds r0, r0, r2 - lsls r0, r0, #2 - ldr r1, _08018790 @ =gUnk_080FE320 - adds r5, r0, r1 - ldrb r0, [r5] - cmp r0, #0x1c - bls _08018784 - b _080189E4 -_08018784: - lsls r0, r0, #2 - ldr r1, _08018794 @ =_08018798 - adds r0, r0, r1 - ldr r0, [r0] - mov pc, r0 - .align 2, 0 -_08018790: .4byte gUnk_080FE320 -_08018794: .4byte _08018798 -_08018798: @ jump table - .4byte _080189E4 @ case 0 - .4byte _08018838 @ case 1 - .4byte _0801882A @ case 2 - .4byte _08018858 @ case 3 - .4byte _08018878 @ case 4 - .4byte _08018886 @ case 5 - .4byte _0801880C @ case 6 - .4byte _08018894 @ case 7 - .4byte _080188E0 @ case 8 - .4byte _08018930 @ case 9 - .4byte _080189E4 @ case 10 - .4byte _080188FE @ case 11 - .4byte _080189E4 @ case 12 - .4byte _080189E4 @ case 13 - .4byte _080189E4 @ case 14 - .4byte _080189B4 @ case 15 - .4byte _080189E4 @ case 16 - .4byte _080189D0 @ case 17 - .4byte _080189E4 @ case 18 - .4byte _080189E4 @ case 19 - .4byte _080189E4 @ case 20 - .4byte _080189E4 @ case 21 - .4byte _080189E4 @ case 22 - .4byte _080189E4 @ case 23 - .4byte _080189A4 @ case 24 - .4byte _080188B8 @ case 25 - .4byte _080189E4 @ case 26 - .4byte _080189E4 @ case 27 - .4byte _080189E4 @ case 28 -_0801880C: - cmp r4, #0 - beq _08018812 - b _080189E4 -_08018812: - ldrh r0, [r5, #8] - lsrs r0, r0, #4 - movs r2, #0x3f - ands r0, r2 - ldrh r1, [r5, #0xa] - lsrs r1, r1, #4 - ands r1, r2 - lsls r1, r1, #6 - orrs r0, r1 - bl sub_08018AB4 - b _080189E4 -_0801882A: - cmp r4, #0 - bne _08018830 - b _080189E4 -_08018830: - adds r0, r2, #0 - bl sub_08018BB4 - b _080189E4 -_08018838: - cmp r4, #0 - bne _0801883E - b _080189E4 -_0801883E: - ldrh r0, [r5, #0x12] - bl CheckGlobalFlag - cmp r0, #0 - beq _0801884A - b _080189E4 -_0801884A: - ldrb r0, [r5, #1] - lsls r0, r0, #4 - ldr r1, _08018854 @ =gUnk_080FEC28 - b _080188A4 - .align 2, 0 -_08018854: .4byte gUnk_080FEC28 -_08018858: - cmp r4, #0 - bne _0801885E - b _080189E4 -_0801885E: - ldrh r0, [r5, #0x12] - bl GetInventoryValue - cmp r0, #0 - beq _0801886A - b _080189E4 -_0801886A: - ldrb r0, [r5, #1] - lsls r0, r0, #4 - ldr r1, _08018874 @ =gUnk_080FEBE8 - b _080188A4 - .align 2, 0 -_08018874: .4byte gUnk_080FEBE8 -_08018878: - cmp r4, #0 - beq _0801887E - b _080189E4 -_0801887E: - adds r0, r2, #0 - bl sub_08018A58 - b _080189E4 -_08018886: - cmp r4, #0 - bne _0801888C - b _080189E4 -_0801888C: - adds r0, r2, #0 - bl sub_08018B50 - b _080189E4 -_08018894: - cmp r4, #0 - beq _0801889A - b _080189E4 -_0801889A: - ldrb r0, [r5, #1] - cmp r0, #0x80 - beq _080188B0 - lsls r0, r0, #4 - ldr r1, _080188AC @ =gUnk_080FECC8 -_080188A4: - adds r0, r0, r1 - bl LoadRoomEntity - b _080189E4 - .align 2, 0 -_080188AC: .4byte gUnk_080FECC8 -_080188B0: - adds r0, r2, #0 - bl sub_080189EC - b _080189E4 -_080188B8: - ldrb r0, [r5, #1] - lsls r0, r0, #4 - ldr r1, _080188DC @ =gUnk_080FED18 - adds r0, r0, r1 - bl LoadRoomEntity - adds r2, r0, #0 - cmp r2, #0 - bne _080188CC - b _080189E4 -_080188CC: - rsbs r0, r4, #0 - orrs r0, r4 - asrs r0, r0, #0x1f - movs r1, #2 - ands r0, r1 - strb r0, [r2, #0xa] - b _080189E4 - .align 2, 0 -_080188DC: .4byte gUnk_080FED18 -_080188E0: - cmp r4, #0 - bne _080188E6 - b _080189E4 -_080188E6: - movs r0, #0xb4 - lsls r0, r0, #1 - ldrh r1, [r5, #8] - lsrs r1, r1, #4 - movs r3, #0x3f - ands r1, r3 - ldrh r2, [r5, #0xa] - lsrs r2, r2, #4 - ands r2, r3 - lsls r2, r2, #6 - orrs r1, r2 - b _0801899C -_080188FE: - cmp r4, #0 - beq _080189E4 - ldrb r0, [r5, #1] - lsls r0, r0, #4 - ldr r1, _08018924 @ =gUnk_080FED58 - adds r0, r0, r1 - bl LoadRoomEntity - ldr r2, _08018928 @ =gRoomVars - ldrb r0, [r5, #1] - lsls r0, r0, #2 - adds r2, #0x8c - adds r2, r0, r2 - ldr r1, _0801892C @ =gUnk_080FED98 - adds r0, r0, r1 - ldr r0, [r0] - str r0, [r2] - b _080189E4 - .align 2, 0 -_08018924: .4byte gUnk_080FED58 -_08018928: .4byte gRoomVars -_0801892C: .4byte gUnk_080FED98 -_08018930: - cmp r4, #0 - beq _080189E4 - ldrb r0, [r5, #1] - lsls r0, r0, #4 - ldr r1, _08018974 @ =gUnk_080FEE78 - adds r0, r0, r1 - bl LoadRoomEntity - adds r2, r0, #0 - cmp r2, #0 - beq _08018958 - ldr r0, _08018978 @ =gRoomControls - ldrh r1, [r0, #6] - ldrh r3, [r5, #8] - adds r1, r1, r3 - strh r1, [r2, #0x38] - ldrh r0, [r0, #8] - ldrh r1, [r5, #0xa] - adds r0, r0, r1 - strh r0, [r2, #0x3a] -_08018958: - ldrb r0, [r5, #1] - cmp r0, #0 - bne _0801897C - ldrh r1, [r5, #8] - lsrs r1, r1, #4 - movs r2, #0x3f - ands r1, r2 - ldrh r0, [r5, #0xa] - lsrs r0, r0, #4 - ands r0, r2 - lsls r0, r0, #6 - orrs r1, r0 - movs r0, #0x8d - b _0801899C - .align 2, 0 -_08018974: .4byte gUnk_080FEE78 -_08018978: .4byte gRoomControls -_0801897C: - ldrh r4, [r5, #8] - lsrs r4, r4, #4 - movs r1, #0x3f - ands r4, r1 - ldrh r0, [r5, #0xa] - lsrs r0, r0, #4 - ands r0, r1 - lsls r0, r0, #6 - orrs r4, r0 - subs r1, r4, #1 - movs r0, #0x8c - movs r2, #1 - bl SetTileType - movs r0, #0x8e - adds r1, r4, #0 -_0801899C: - movs r2, #1 - bl SetTileType - b _080189E4 -_080189A4: - cmp r4, #0 - beq _080189E4 - ldr r0, _080189B0 @ =gUnk_080FEE18 - bl LoadRoomEntityList - b _080189E4 - .align 2, 0 -_080189B0: .4byte gUnk_080FEE18 -_080189B4: - cmp r4, #0 - beq _080189C4 - ldr r0, _080189C0 @ =gUnk_080FEE58 - bl LoadRoomEntity - b _080189E4 - .align 2, 0 -_080189C0: .4byte gUnk_080FEE58 -_080189C4: - ldr r0, _080189CC @ =gUnk_080FEE48 - bl LoadRoomEntity - b _080189E4 - .align 2, 0 -_080189CC: .4byte gUnk_080FEE48 -_080189D0: - cmp r4, #0 - beq _080189E4 - movs r0, #0x80 - lsls r0, r0, #1 -.ifdef JP - movs r1, #0x77 -.else -.ifdef EU - movs r1, #0x77 -.else -.ifdef DEMO_JP - movs r1, #0x77 @ TODO deduplicate -.else - movs r1, #0x79 -.endif -.endif -.endif - bl SetLocalFlagByBank - ldr r0, _080189E8 @ =gUnk_080FEE38 - bl LoadRoomEntityList -_080189E4: - pop {r4, r5, pc} - .align 2, 0 -_080189E8: .4byte gUnk_080FEE38 diff --git a/include/room.h b/include/room.h index cb3a456f..d4c35300 100644 --- a/include/room.h +++ b/include/room.h @@ -228,7 +228,8 @@ void LoadRoom(void); void SetCurrentRoomPropertyList(u32 area, u32 room); void* GetCurrentRoomProperty(u32); void LoadRoomTileEntities(); -void LoadRoomEntityList(EntityData* listPtr); +Entity* LoadRoomEntity(const EntityData*); +void LoadRoomEntityList(const EntityData* listPtr); bool32 LoadFixedGFX(Entity*, u32); void UnloadGFXSlots(Entity*); diff --git a/src/kinstone.c b/src/kinstone.c index 16f488c9..a8baaf50 100644 --- a/src/kinstone.c +++ b/src/kinstone.c @@ -3,6 +3,148 @@ #include "subtask.h" #include "common.h" #include "flags.h" +#include "player.h" + +extern EntityData gUnk_080FEC28[]; +extern EntityData gUnk_080FEBE8[]; +extern EntityData gUnk_080FECC8[]; +extern EntityData gUnk_080FEE78[]; +extern EntityData gUnk_080FED58[]; +extern const EntityData gUnk_080FED18[]; +extern const EntityData gUnk_080FEE38[]; +extern const EntityData gUnk_080FEE18[]; +extern const EntityData gUnk_080FEE48[]; +extern const EntityData gUnk_080FEE58[]; +extern const void* gUnk_080FED98[]; + +void sub_08018AB4(int); +void sub_08018BB4(int); +void sub_08018A58(int); +void sub_08018B50(int); +void sub_080189EC(int); + +void sub_0801876C(int param_1, int param_2) { + Entity* roomEnt; + Entity* ent; + u32 uVar3; + u32 tmp; + u8* puVar4; + u32 uVar5; + struct_080FE320* ptr; + + ptr = &gUnk_080FE320[param_1]; + switch (ptr->evt_type) { + case 6: + if (param_2 == 0) { + sub_08018AB4((ptr->x >> 4 & 0x3f) | (ptr->y >> 4 & 0x3f) << 6); + } + break; + case 0: + break; + case 2: + if (param_2 != 0) { + sub_08018BB4(param_1); + } + break; + case 1: + if (param_2 == 0) { + return; + } + if (CheckGlobalFlag(ptr->flag)) { + return; + } + LoadRoomEntity(gUnk_080FEC28 + ptr->entity_idx); + break; + case 3: + if (param_2 == 0) { + return; + } + if (GetInventoryValue(ptr->flag)) { + return; + } + LoadRoomEntity(gUnk_080FEBE8 + ptr->entity_idx); + break; + case 4: + if (param_2 == 0) { + sub_08018A58(param_1); + } + break; + case 5: + if (param_2 != 0) { + sub_08018B50(param_1); + } + break; + + case 7: + if (param_2 != 0) { + return; + } + if (ptr->entity_idx != 0x80) { + LoadRoomEntity(gUnk_080FECC8 + ptr->entity_idx); + } else { + sub_080189EC(param_1); + } + break; + case 0x19: + roomEnt = LoadRoomEntity(&gUnk_080FED18[ptr->entity_idx]); + if (roomEnt != 0) { + roomEnt->type = param_2 ? 2 : 0; + } + break; + case 8: + if (param_2 == 0) { + return; + } + SetTileType(0x168, (ptr->x >> 4 & 0x3f) | (ptr->y >> 4 & 0x3f) << 6, 1); + break; + case 0xb: + if (param_2 != 0) { + LoadRoomEntity(&gUnk_080FED58[ptr->entity_idx]); + gRoomVars.field_0x8c[ptr->entity_idx] = (void*)gUnk_080FED98[ptr->entity_idx]; + } + break; + case 9: + if (param_2 == 0) { + return; + } + ent = LoadRoomEntity(&gUnk_080FEE78[ptr->entity_idx]); + if (ent != 0) { + *(u16*)&ent->collisionLayer = ptr->x + gRoomControls.origin_x; + *(u16*)&ent->gustJarState = ptr->y + gRoomControls.origin_y; + } + if (ptr->entity_idx == 0) { + SetTileType(0x8d, (ptr->x >> 4 & 0x3f) | (ptr->y >> 4 & 0x3f) << 6, 1); + } else { + uVar5 = (ptr->x >> 4 & 0x3f) | (ptr->y >> 4 & 0x3f) << 6; + SetTileType(0x8c, uVar5 - 1, 1); + uVar3 = 0x8e; + SetTileType(uVar3, uVar5, 1); + } + break; + case 0x18: + if (param_2 != 0) { + LoadRoomEntityList(gUnk_080FEE18); + } + break; + case 0xf: + if (param_2 != 0) { + LoadRoomEntity(gUnk_080FEE58); + } else { + LoadRoomEntity(gUnk_080FEE48); + } + break; + case 0x11: + if (param_2 != 0) { + SetLocalFlagByBank(FLAG_BANK_1, SOUGEN_05_BOMB_00); + LoadRoomEntityList(gUnk_080FEE38); + } + break; + case 0x1a: + case 0x1b: + case 0x1c: + break; + } +} void sub_080189EC(int param_1) { u32 i; diff --git a/src/manager/manager38.c b/src/manager/manager38.c index 081beb14..5e377242 100644 --- a/src/manager/manager38.c +++ b/src/manager/manager38.c @@ -1,8 +1,6 @@ #include "entity.h" #include "room.h" -extern Entity* LoadRoomEntity(EntityData*); - void sub_0805E0C0(Entity*); void sub_0805E0F4(Entity*); diff --git a/src/manager/managerB.c b/src/manager/managerB.c index 1e49669f..bb9aa75e 100644 --- a/src/manager/managerB.c +++ b/src/manager/managerB.c @@ -81,8 +81,6 @@ void ManagerB_WaitForDone(ManagerB* this) { ManagerBHelper* CreateHelper(Manager*); void ManagerBHelper_Monitor(ManagerBHelper*, Entity*, u32); -extern Entity* LoadRoomEntity(EntityData*); - void ManagerB_LoadFight(Manager* this) { ManagerBHelper* monitor; EntityData* prop; diff --git a/src/projectile/removableDust.c b/src/projectile/removableDust.c index 2c188926..86fa2908 100644 --- a/src/projectile/removableDust.c +++ b/src/projectile/removableDust.c @@ -5,7 +5,6 @@ #include "object.h" extern u32 sub_080B1AE0(u16, u8); -extern Entity* LoadRoomEntity(EntityData*); extern void (*const RemovableDust_Functions[])(Entity*); extern const u16 gUnk_08129FD0[]; diff --git a/src/room.c b/src/room.c index f1051403..f4ef24c7 100644 --- a/src/room.c +++ b/src/room.c @@ -10,7 +10,7 @@ static void sub_0804B058(EntityData* dat); extern void sub_0801AC98(void); extern u32 sub_08049D1C(u32); -extern Entity* LoadRoomEntity(EntityData*); +extern Entity* LoadRoomEntity(const EntityData*); extern void* GetRoomProperty(u32, u32, u32); extern void** gCurrentRoomProperties; @@ -22,8 +22,8 @@ extern void sub_0804B16C(void); extern void ClearSmallChests(void); extern Entity* GetEmptyEntityByKind(u32 kind); -void RegisterRoomEntity(Entity*, EntityData*); -void sub_0804AF0C(Entity*, EntityData*); +void RegisterRoomEntity(Entity*, const EntityData*); +void sub_0804AF0C(Entity*, const EntityData*); void sub_0804AFB0(void** properties); void sub_08054524(void); @@ -39,7 +39,7 @@ static void LoadDestructibleTile(TileEntity*); static void LoadGrassDropTile(TileEntity*); static void LoadLocationTile(TileEntity*); -void LoadRoomEntityList(EntityData* listPtr) { +void LoadRoomEntityList(const EntityData* listPtr) { if (listPtr != NULL) { while (listPtr->kind != 0xFF) { LoadRoomEntity(listPtr++); @@ -47,7 +47,7 @@ void LoadRoomEntityList(EntityData* listPtr) { } } -NONMATCH("asm/non_matching/LoadRoomEntity.inc", Entity* LoadRoomEntity(EntityData* dat)) { +NONMATCH("asm/non_matching/LoadRoomEntity.inc", Entity* LoadRoomEntity(const EntityData* dat)) { int kind; Entity* v4; Entity* v5; @@ -86,7 +86,7 @@ NONMATCH("asm/non_matching/LoadRoomEntity.inc", Entity* LoadRoomEntity(EntityDat } END_NONMATCH -void RegisterRoomEntity(Entity* ent, EntityData* dat) { +void RegisterRoomEntity(Entity* ent, const EntityData* dat) { u32 list; u32 kind; void* offset; @@ -108,7 +108,7 @@ void RegisterRoomEntity(Entity* ent, EntityData* dat) { MemCopy(dat, offset, sizeof(EntityData)); } -void sub_0804AF0C(Entity* ent, EntityData* dat) { +void sub_0804AF0C(Entity* ent, const EntityData* dat) { switch (dat->flags & 0xf0) { case 0x0: ent->x.HALF.HI = dat->xPos + gRoomControls.origin_x; diff --git a/src/subtask.c b/src/subtask.c index 4adbe0bd..03d36828 100644 --- a/src/subtask.c +++ b/src/subtask.c @@ -69,7 +69,6 @@ extern const EntityData gUnk_080FF264[]; extern void (*const gUnk_080FF28C[])(void); -extern Entity* LoadRoomEntity(EntityData*); extern void sub_08054A14(u32); extern const EntityData gUnk_080FEE48[];