manager28.c: ok

This commit is contained in:
Ibot02 2021-01-18 16:05:52 +01:00
parent 9dc15ba380
commit 0dab5bbc99
16 changed files with 201 additions and 359 deletions

View File

@ -1,342 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start sub_0805C934
sub_0805C934: @ 0x0805C934
push {lr}
ldr r2, _0805C948 @ =gUnk_08108D28
ldrb r1, [r0, #0xc]
lsls r1, r1, #2
adds r1, r1, r2
ldr r1, [r1]
bl _call_via_r1
pop {pc}
.align 2, 0
_0805C948: .4byte gUnk_08108D28
thumb_func_start sub_0805C94C
sub_0805C94C: @ 0x0805C94C
push {r4, r5, r6, lr}
adds r4, r0, #0
ldrb r0, [r4, #0xa]
cmp r0, #0
bne _0805C9B0
adds r6, r4, #0
adds r6, #0x20
adds r1, r6, #0
movs r2, #0
adds r0, r4, #0
adds r0, #0x3c
_0805C962:
str r2, [r0]
subs r0, #4
cmp r0, r1
bge _0805C962
adds r0, r4, #0
bl sub_0805CA6C
adds r5, r0, #0
cmp r5, #1
ble _0805C9A8
bl GetEmptyManager
adds r2, r0, #0
cmp r2, #0
beq _0805C9A8
movs r0, #9
strb r0, [r2, #8]
movs r0, #0x28
strb r0, [r2, #9]
movs r0, #1
strb r0, [r2, #0xa]
strb r5, [r2, #0xe]
adds r1, r2, #0
adds r1, #0x20
adds r0, r6, #0
ldm r0!, {r3, r5, r6}
stm r1!, {r3, r5, r6}
ldm r0!, {r3, r5, r6}
stm r1!, {r3, r5, r6}
ldm r0!, {r3, r5}
stm r1!, {r3, r5}
adds r0, r2, #0
movs r1, #6
bl AppendEntityToList
_0805C9A8:
adds r0, r4, #0
bl DeleteManager
b _0805C9B8
_0805C9B0:
movs r1, #0
movs r0, #1
strb r0, [r4, #0xc]
strb r1, [r4, #0xf]
_0805C9B8:
pop {r4, r5, r6, pc}
.align 2, 0
thumb_func_start sub_0805C9BC
sub_0805C9BC: @ 0x0805C9BC
push {r4, r5, r6, r7, lr}
mov r7, sb
mov r6, r8
push {r6, r7}
sub sp, #4
adds r6, r0, #0
bl sub_0805CB48
ldrb r0, [r6, #0xe]
subs r0, #1
mov sb, r0
ldrb r1, [r6, #0xf]
adds r0, r1, #1
strb r0, [r6, #0xf]
movs r0, #1
ands r0, r1
cmp r0, #0
beq _0805CA22
movs r2, #0
cmp r2, sb
bge _0805CA62
movs r0, #0x20
adds r0, r0, r6
mov r8, r0
_0805C9EC:
lsls r1, r2, #2
adds r0, r6, #0
adds r0, #0x20
adds r0, r0, r1
ldr r3, [r0]
adds r4, r2, #1
adds r5, r4, #0
ldrb r1, [r6, #0xe]
cmp r5, r1
bge _0805CA1A
lsls r0, r5, #2
mov r1, r8
adds r7, r0, r1
_0805CA06:
ldm r7!, {r1}
adds r0, r3, #0
str r3, [sp]
bl sub_08004484
adds r4, #1
ldr r3, [sp]
ldrb r0, [r6, #0xe]
cmp r4, r0
blt _0805CA06
_0805CA1A:
adds r2, r5, #0
cmp r2, sb
blt _0805C9EC
b _0805CA62
_0805CA22:
movs r2, #0
cmp r2, sb
bge _0805CA62
movs r1, #0x20
adds r1, r1, r6
mov r8, r1
_0805CA2E:
lsls r1, r2, #2
adds r0, r6, #0
adds r0, #0x20
adds r0, r0, r1
ldr r3, [r0]
adds r4, r2, #1
adds r5, r4, #0
ldrb r0, [r6, #0xe]
cmp r5, r0
bge _0805CA5C
lsls r0, r5, #2
mov r1, r8
adds r7, r0, r1
_0805CA48:
ldm r7!, {r0}
adds r1, r3, #0
str r3, [sp]
bl sub_08004484
adds r4, #1
ldr r3, [sp]
ldrb r0, [r6, #0xe]
cmp r4, r0
blt _0805CA48
_0805CA5C:
adds r2, r5, #0
cmp r2, sb
blt _0805CA2E
_0805CA62:
add sp, #4
pop {r3, r4}
mov r8, r3
mov sb, r4
pop {r4, r5, r6, r7, pc}
thumb_func_start sub_0805CA6C
sub_0805CA6C: @ 0x0805CA6C
push {r4, r5, r6, lr}
adds r6, r0, #0
movs r5, #0
ldrb r0, [r6, #0xb]
bl GetCurrentRoomProperty
adds r4, r0, #0
cmp r4, #0
bne _0805CACE
movs r0, #0
b _0805CAE4
_0805CA82:
movs r0, #8
b _0805CAE4
_0805CA86:
movs r0, #0xf
ands r0, r2
cmp r0, #3
bne _0805CACC
adds r0, r4, #0
bl sub_0805CAF0
adds r2, r0, #0
cmp r2, #0
beq _0805CACC
movs r3, #0
cmp r3, r5
bhs _0805CAB8
ldr r0, [r6, #0x20]
cmp r0, r2
beq _0805CAB8
adds r1, r6, #0
adds r1, #0x20
_0805CAAA:
adds r1, #4
adds r3, #1
cmp r3, r5
bhs _0805CAB8
ldr r0, [r1]
cmp r0, r2
bne _0805CAAA
_0805CAB8:
cmp r3, r5
bne _0805CACC
lsls r1, r5, #2
adds r0, r6, #0
adds r0, #0x20
adds r0, r0, r1
str r2, [r0]
adds r5, #1
cmp r5, #8
beq _0805CA82
_0805CACC:
adds r4, #0x10
_0805CACE:
ldrb r2, [r4]
adds r0, r2, #0
cmp r0, #0xff
beq _0805CAE2
ldr r0, [r4]
ldr r1, _0805CAE8 @ =0x00FF000F
ands r0, r1
ldr r1, _0805CAEC @ =0x00280009
cmp r0, r1
bne _0805CA86
_0805CAE2:
adds r0, r5, #0
_0805CAE4:
pop {r4, r5, r6, pc}
.align 2, 0
_0805CAE8: .4byte 0x00FF000F
_0805CAEC: .4byte 0x00280009
thumb_func_start sub_0805CAF0
sub_0805CAF0: @ 0x0805CAF0
push {r4, r5, r6, lr}
adds r3, r0, #0
ldrh r1, [r3, #8]
ldr r2, _0805CB34 @ =gRoomControls
ldrh r0, [r2, #6]
adds r5, r1, r0
ldrh r1, [r3, #0xa]
ldrh r0, [r2, #8]
adds r4, r1, r0
ldr r1, _0805CB38 @ =gUnk_03003D90
ldr r2, [r1, #4]
cmp r2, r1
beq _0805CB42
_0805CB0A:
movs r6, #0x2e
ldrsh r0, [r2, r6]
cmp r5, r0
bne _0805CB3C
movs r6, #0x32
ldrsh r0, [r2, r6]
cmp r4, r0
bne _0805CB3C
ldrb r0, [r3, #2]
ldrb r6, [r2, #9]
cmp r0, r6
bne _0805CB3C
ldrb r0, [r2, #8]
cmp r0, #3
bne _0805CB3C
ldrb r0, [r3, #3]
ldrb r6, [r2, #0xa]
cmp r0, r6
bne _0805CB3C
adds r0, r2, #0
b _0805CB44
.align 2, 0
_0805CB34: .4byte gRoomControls
_0805CB38: .4byte gUnk_03003D90
_0805CB3C:
ldr r2, [r2, #4]
cmp r2, r1
bne _0805CB0A
_0805CB42:
movs r0, #0
_0805CB44:
pop {r4, r5, r6, pc}
.align 2, 0
thumb_func_start sub_0805CB48
sub_0805CB48: @ 0x0805CB48
push {r4, r5, r6, lr}
adds r4, r0, #0
movs r5, #0
ldrb r1, [r4, #0xe]
cmp r5, r1
bge _0805CB84
adds r3, r4, #0
adds r3, #0x20
adds r6, r3, #0
_0805CB5A:
ldr r0, [r3]
ldr r2, [r0, #4]
cmp r2, #0
bne _0805CB7A
subs r0, r1, #1
cmp r0, r5
bne _0805CB6C
str r2, [r3]
b _0805CB74
_0805CB6C:
lsls r0, r0, #2
adds r0, r6, r0
ldr r0, [r0]
str r0, [r3]
_0805CB74:
ldrb r0, [r4, #0xe]
subs r0, #1
strb r0, [r4, #0xe]
_0805CB7A:
adds r3, #4
adds r5, #1
ldrb r1, [r4, #0xe]
cmp r5, r1
blt _0805CB5A
_0805CB84:
ldrb r0, [r4, #0xe]
cmp r0, #1
bhi _0805CB8E
bl DeleteThisEntity
_0805CB8E:
pop {r4, r5, r6, pc}

View File

@ -0,0 +1,56 @@
sub_0805C94C: @ 0x0805C94C
push {r4, r5, r6, lr}
add r4, r0, #0
ldrb r0, [r4, #0xa]
cmp r0, #0
bne _0805C9B0
add r6, r4, #0
add r6, r6, #0x20
add r1, r6, #0
mov r2, #0
add r0, r4, #0
add r0, r0, #0x3c
_0805C962:
str r2, [r0]
sub r0, r0, #0x4
cmp r0, r1
bge _0805C962
add r0, r4, #0
bl sub_0805CA6C
add r5, r0, #0
cmp r5, #0x1
ble _0805C9A8
bl GetEmptyManager
add r2, r0, #0
cmp r2, #0
beq _0805C9A8
mov r0, #0x9
strb r0, [r2, #0x8]
mov r0, #0x28
strb r0, [r2, #0x9]
mov r0, #0x1
strb r0, [r2, #0xa]
strb r5, [r2, #0xe]
add r1, r2, #0
add r1, r1, #0x20
add r0, r6, #0
ldm r0!, {r3, r5, r6}
stm r1!, {r3, r5, r6}
ldm r0!, {r3, r5, r6}
stm r1!, {r3, r5, r6}
ldm r0!, {r3, r5}
stm r1!, {r3, r5}
add r0, r2, #0
mov r1, #0x6
bl AppendEntityToList
_0805C9A8:
add r0, r4, #0
bl DeleteManager
b _0805C9B8
_0805C9B0:
mov r1, #0
mov r0, #0x1
strb r0, [r4, #0xc]
strb r1, [r4, #0xf]
_0805C9B8:
pop {r4, r5, r6, pc}

View File

@ -135,6 +135,16 @@ typedef struct Entity {
/*0x86*/ union SplitHWord field_0x86; /*0x86*/ union SplitHWord field_0x86;
} Entity; } Entity;
typedef struct LinkedList {
Entity* last;
Entity* first;
} LinkedList;
extern LinkedList gEntityLists[9];
extern LinkedList gUnk_03003D90;
extern LinkedList gUnk_03003DA0;
#define TILE(x, y) \ #define TILE(x, y) \
((((x - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \ ((((x - gRoomControls.roomOriginX) >> 4) & 0x3fU) | \
(((y - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6) (((y - gRoomControls.roomOriginY) >> 4) & 0x3fU) << 6)
@ -189,6 +199,4 @@ enum {
#define Direction8ToAnimationState(expr) (Direction8RoundUp(expr) >> 2) #define Direction8ToAnimationState(expr) (Direction8RoundUp(expr) >> 2)
#define Direction8FromAnimationState(expr) (expr << 2) #define Direction8FromAnimationState(expr) (expr << 2)
extern Entity gUnk_03003DA0;
#endif #endif

View File

@ -321,4 +321,5 @@ extern void sub_08008790(Entity*, u32);
extern u32 CheckIsDungeon(); extern u32 CheckIsDungeon();
extern void sub_0804ACF8(); extern void sub_0804ACF8();
extern void sub_08073904(Entity*); extern void sub_08073904(Entity*);
extern void sub_08004484(Entity*, Entity*);
#endif #endif

View File

@ -81,4 +81,6 @@ extern RoomVars gRoomVars;
extern void SetTileType(u32, u32, u32); extern void SetTileType(u32, u32, u32);
extern void sub_08080964(u32 time, u32 magnitude); // shake screen extern void sub_08080964(u32 time, u32 magnitude); // shake screen
extern void* GetCurrentRoomProperty(u32);
#endif #endif

View File

@ -510,7 +510,7 @@ SECTIONS {
asm/manager25.o(.text); asm/manager25.o(.text);
asm/manager26.o(.text); asm/manager26.o(.text);
src/manager/manager27.o(.text); src/manager/manager27.o(.text);
asm/manager28.o(.text); src/manager/manager28.o(.text);
asm/manager29.o(.text); asm/manager29.o(.text);
asm/manager2A.o(.text); asm/manager2A.o(.text);
asm/manager2B.o(.text); asm/manager2B.o(.text);

View File

@ -4,7 +4,6 @@
extern void sub_080A2CC0(); extern void sub_080A2CC0();
extern void sub_0806F69C(); extern void sub_0806F69C();
extern void EnqueueSFX(); extern void EnqueueSFX();
extern Entity* GetCurrentRoomProperty();
void BladeTrap(Entity* ent) { void BladeTrap(Entity* ent) {
u16 uVar1; u16 uVar1;

View File

@ -132,12 +132,6 @@ void ClearDeletedEntity(Entity* ent) {
gEntCount--; gEntCount--;
} }
typedef struct LinkedList {
Entity* last;
Entity* first;
} LinkedList;
extern LinkedList gEntityLists[9];
extern EntityType gUnk_03003DB8; extern EntityType gUnk_03003DB8;
void DeleteAllEntities(void) { void DeleteAllEntities(void) {

View File

@ -3,7 +3,6 @@
#include "flags.h" #include "flags.h"
void LoadRoomEntityList(EntityData* dat); void LoadRoomEntityList(EntityData* dat);
extern EntityData* GetCurrentRoomProperty(u32 unk);
extern void sub_0804B058(EntityData* dat); extern void sub_0804B058(EntityData* dat);
extern void LoadRoomTileEntities(EntityData* dat); extern void LoadRoomTileEntities(EntityData* dat);
extern void sub_0801AC98(); extern void sub_0801AC98();

130
src/manager/manager28.c Normal file
View File

@ -0,0 +1,130 @@
#include "global.h"
#include "manager.h"
#include "entity.h"
#include "room.h"
#include "functions.h"
typedef struct {
Manager manager;
Entity* unk_20[8];
} Manager28;
extern void (* const gUnk_08108D28[])(Manager28*);
void sub_0805C934(Manager28*);
void sub_0805C94C(Manager28*);
void sub_0805C9BC(Manager28*);
u32 sub_0805CA6C(Manager28*);
Entity* sub_0805CAF0(EntityData*);
void sub_0805CB48(Manager28*);
void sub_0805C934(Manager28* this) {
gUnk_08108D28[this->manager.action](this);
}
NONMATCH("asm/non_matching/manager28/sub_0805C94C.inc", void sub_0805C94C(Manager28* this)) {
if (!this->manager.unk_0a) {
s32 tmp2;
int tmp4;
for (tmp4 = 0; tmp4 < 8; tmp4++) {
this->unk_20[tmp4] = 0;
}
tmp2 = sub_0805CA6C(this);//maybe 2 params?
if (tmp2 > 1) {
Manager28* tmp3 = (Manager28*) GetEmptyManager();
if (tmp3) {
tmp3->manager.type = 9;
tmp3->manager.subtype = 0x28;
tmp3->manager.unk_0a = 1;
tmp3->manager.unk_0e = tmp2;
for (tmp4 = 0; tmp4 < 8; tmp4++) {
tmp3->unk_20[tmp4] = this->unk_20[tmp4];
}
AppendEntityToList(tmp3, 6);
}
}
DeleteManager(&this->manager);
} else {
this->manager.action = 1;
this->manager.unk_0f = 0;
}
}
END_NONMATCH
void sub_0805C9BC(Manager28* this) {
s32 n;
s32 i;
s32 j;
Entity* tmp;
sub_0805CB48(this);
n = this->manager.unk_0e - 1;
if ((this->manager.unk_0f++) & 1) {
for (i = 0; i < n; i++) {
tmp = this->unk_20[i];
for (j = i + 1; j < this->manager.unk_0e; j++) {
sub_08004484(tmp, this->unk_20[j]);
}
}
} else {
for (i = 0; i < n; i++) {
tmp = this->unk_20[i];
for (j = i + 1; j < this->manager.unk_0e; j++) {
sub_08004484(this->unk_20[j], tmp);
}
}
}
}
u32 sub_0805CA6C(Manager28* this) {
u32 re = 0;
EntityData * tmp = GetCurrentRoomProperty(this->manager.unk_0b);
if (!tmp) return 0;
for (; *((u8*) tmp) != 0xFF && !(tmp->type == 9 && tmp->subtype == 0x28); tmp++) {
Entity* tmp2;
u32 i;
if (tmp->type != 3) continue;
tmp2 = sub_0805CAF0(tmp);
if (!tmp2) continue;
for (i = 0; i < re; i++) {
if (this->unk_20[i] == tmp2) break;
}
if (i != re) continue;
this->unk_20[re++] = tmp2;
if (re == 8) return 8;
}
return re;
}
Entity* sub_0805CAF0(EntityData* unk1) {
u32 x, y;
Entity* i;
LinkedList* tmp;
x = unk1->xPos + gRoomControls.roomOriginX;
y = unk1->yPos + gRoomControls.roomOriginY;
tmp = &gUnk_03003D90;
for (i = tmp->first; (u32) i != (u32) tmp; i = i->next) {
if (x == i->x.HALF.HI
&& y == i->y.HALF.HI
&& unk1->subtype == i->entityType.subtype
&& 3 == i->entityType.type
&& unk1->form == i->entityType.form) {
return i;
}
}
return 0;
}
void sub_0805CB48(Manager28* this) {
s32 i;
for (i = 0; i < this->manager.unk_0e; i++) {
if (this->unk_20[i]->next == 0) {
if (this->manager.unk_0e-1 == i) {
this->unk_20[i] = this->unk_20[i]->next;
} else {
this->unk_20[i] = this->unk_20[this->manager.unk_0e-1];
}
this->manager.unk_0e--;
}
}
if (this->manager.unk_0e <= 1) DeleteThisEntity();
}

View File

@ -83,7 +83,6 @@ void ManagerB_WaitForDone(ManagerB* this) {
ManagerBHelper* CreateHelper(Manager*); ManagerBHelper* CreateHelper(Manager*);
void ManagerBHelper_Monitor(ManagerBHelper*, Entity*, u32); void ManagerBHelper_Monitor(ManagerBHelper*, Entity*, u32);
extern EntityData* GetCurrentRoomProperty(u8);
extern Entity* LoadRoomEntity(EntityData*); extern Entity* LoadRoomEntity(EntityData*);
void ManagerB_LoadFight(Manager* this) { void ManagerB_LoadFight(Manager* this) {

View File

@ -4,7 +4,6 @@
#include "flags.h" #include "flags.h"
#include "room.h" #include "room.h"
extern Entity* GetCurrentRoomProperty(u8);
extern void LoadRoomEntityList(Entity*); extern void LoadRoomEntityList(Entity*);
extern void DeleteThisEntity(void); extern void DeleteThisEntity(void);
extern void DeleteManager(Manager*); extern void DeleteManager(Manager*);

View File

@ -26,7 +26,6 @@ static u8 sub_08086954(Entity*);
extern u32 sub_080562CC(u32, u32, u32, u32); extern u32 sub_080562CC(u32, u32, u32, u32);
extern void sub_08078AC0(u32, u32, u32); extern void sub_08078AC0(u32, u32, u32);
extern void* GetCurrentRoomProperty(u8);
extern void (*const gUnk_081206B4[])(Entity*); extern void (*const gUnk_081206B4[])(Entity*);
extern BoundingBox gUnk_081206AC; // TODO: should be const extern BoundingBox gUnk_081206AC; // TODO: should be const

View File

@ -9,7 +9,6 @@ extern void sub_0809EAD8(Entity*);
extern void sub_0809EABC(Entity*); extern void sub_0809EABC(Entity*);
extern void EnqueueSFX(u32); extern void EnqueueSFX(u32);
extern void sub_080A2CC0(Entity*, Entity**, u16*); extern void sub_080A2CC0(Entity*, Entity**, u16*);
extern Entity* GetCurrentRoomProperty(u32);
extern void SetTile(u32, u32, u32); extern void SetTile(u32, u32, u32);
extern void sub_0806F69C(Entity*); extern void sub_0806F69C(Entity*);

View File

@ -3,7 +3,6 @@
#include "functions.h" #include "functions.h"
#include "player.h" #include "player.h"
extern Entity* GetCurrentRoomProperty(u32);
extern void sub_080A2CC0(Entity*, Entity**, u16*); extern void sub_080A2CC0(Entity*, Entity**, u16*);
extern u16 gUnk_08123318[]; extern u16 gUnk_08123318[];

View File

@ -323,7 +323,7 @@ void sub_0808EBB8(Entity* this) {
} }
static Entity* sub_0808EC80(int form) { static Entity* sub_0808EC80(int form) {
Entity* entityA = &gUnk_03003DA0; Entity* entityA = (Entity*) &gUnk_03003DA0;
Entity* entityB = entityA->next; Entity* entityB = entityA->next;
while (entityB != entityA) { while (entityB != entityA) {
if ((entityB->entityType.type == 0x6 && entityB->entityType.subtype == 0x48) && if ((entityB->entityType.type == 0x6 && entityB->entityType.subtype == 0x48) &&