mirror of https://github.com/zeldaret/tmc.git
130 lines
3.0 KiB
C
130 lines
3.0 KiB
C
#include "global.h"
|
|
#include "manager.h"
|
|
#include "flags.h"
|
|
#include "functions.h"
|
|
|
|
|
|
typedef struct {
|
|
Manager manager;
|
|
u8 unk_20[0x08];
|
|
u16 unk_28;
|
|
u16 unk_2a;
|
|
u16 unk_2c;
|
|
u16 unk_2e;
|
|
u16 unk_30;
|
|
u16 unk_32;
|
|
u8 unk_34[0x04];
|
|
s16 unk_38;
|
|
s16 unk_3a;
|
|
u16 unk_3c;
|
|
u16 unk_3e;
|
|
} Manager5;
|
|
|
|
void sub_08057AE8(Manager5*);
|
|
void sub_08057BA4(Manager5*);
|
|
void sub_08057C28(Manager5*);
|
|
|
|
const u16 gUnk_08108024[] = {
|
|
0,
|
|
-1,
|
|
1,
|
|
0,
|
|
0,
|
|
1,
|
|
-1,
|
|
0
|
|
};
|
|
const u16 gUnk_08108034[] = {
|
|
0,
|
|
1,
|
|
-1,
|
|
0,
|
|
0,
|
|
-1,
|
|
1,
|
|
0
|
|
};
|
|
|
|
void (*const gUnk_08108044[])(Manager5*) = {
|
|
sub_08057AE8,
|
|
sub_08057BA4,
|
|
sub_08057C28
|
|
};
|
|
|
|
void sub_08057AD0(Manager5* this) {
|
|
gUnk_08108044[this->manager.action](this);
|
|
}
|
|
|
|
void sub_08057CA4(Manager5*, u32, u32);
|
|
|
|
extern void DeleteManager(Manager*);
|
|
|
|
void sub_08057AE8(Manager5* this) {
|
|
u32 tmp;
|
|
tmp = (this->manager.unk_0b & 0x3)<<1;
|
|
if (this->manager.unk_0e == 1) {
|
|
this->unk_30 = 0x323;
|
|
} else {
|
|
this->unk_30 = tmp & 2 ? 0x37 : 0x36;
|
|
}
|
|
this->unk_28 = gUnk_08108024[tmp];
|
|
this->unk_2a = gUnk_08108024[tmp+1];
|
|
this->unk_2c = gUnk_08108034[tmp];
|
|
this->unk_2e = gUnk_08108034[tmp+1];
|
|
this->unk_32 = ((this->manager.unk_0b>>2)&0xF)+1;
|
|
this->manager.unk_0e = 0x1C;
|
|
this->manager.unk_0f = 0;
|
|
this->manager.action = (this->manager.unk_0b & 0x80)?2:1;
|
|
if (this->manager.action != 2
|
|
|| !CheckFlags(this->unk_3e)) return;
|
|
for (;this->unk_32;this->unk_32--) {
|
|
sub_08057CA4(this, this->unk_28, this->unk_2a);
|
|
sub_0807B7D8(this->unk_30, this->unk_38 | (this->unk_3a << 6),this->unk_3c);
|
|
}
|
|
DeleteManager(&this->manager);
|
|
}
|
|
|
|
void sub_08057BA4(Manager5* this) {
|
|
if (--this->manager.unk_0e) return;
|
|
this->manager.unk_0e = 8;
|
|
if (CheckFlags(this->unk_3e)) {
|
|
if (this->unk_32 == this->manager.unk_0f) return;
|
|
sub_08057CA4(this, this->unk_28, this->unk_2a);
|
|
sub_0807B7D8(this->unk_30, this->unk_38 | (this->unk_3a << 6), this->unk_3c);
|
|
this->manager.unk_0f++;
|
|
PlaySFX(0x71);
|
|
} else {
|
|
if (!this->manager.unk_0f) return;
|
|
sub_0807BA8C(this->unk_38 | (this->unk_3a << 6), this->unk_3c);
|
|
sub_08057CA4(this, this->unk_2c, this->unk_2e);
|
|
this->manager.unk_0f--;
|
|
PlaySFX(0x71);
|
|
}
|
|
}
|
|
|
|
void sub_08057C28(Manager5* this) {
|
|
if (!this->manager.unk_0d) {
|
|
if (!CheckFlags(this->unk_3e)) return;
|
|
this->manager.unk_0d++;
|
|
} else {
|
|
if (--this->manager.unk_0e) return;
|
|
this->manager.unk_0e = 8;
|
|
if (this->unk_32 != this->manager.unk_0f) {
|
|
sub_08057CA4(this, this->unk_28, this->unk_2a);
|
|
sub_0807B7D8(this->unk_30, this->unk_38 | (this->unk_3a << 6), this->unk_3c);
|
|
this->manager.unk_0f++;
|
|
PlaySFX(0x71);
|
|
} else {
|
|
if (this->unk_30 != 0x323) {
|
|
PlaySFX(0x72);
|
|
}
|
|
DeleteManager(&this->manager);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_08057CA4(Manager5* this, u32 unk1, u32 unk2) {
|
|
this->unk_38 += unk1;
|
|
this->unk_3a += unk2;
|
|
}
|