Files
tmc/src/manager/bridgeManager.c
T
2022-06-22 00:00:57 +01:00

103 lines
3.0 KiB
C

/**
* @file bridgeManager.c
* @ingroup Managers
*
* @brief Manages spawn/removal of bridges
*/
#include "manager/bridgeManager.h"
#include "flags.h"
#include "functions.h"
#include "sound.h"
void BridgeManager_Init(BridgeManager*);
void BridgeManager_Action1(BridgeManager*);
void BridgeManager_Action2(BridgeManager*);
static const u16 gUnk_08108024[] = { 0, -1, 1, 0, 0, 1, -1, 0 };
static const u16 gUnk_08108034[] = { 0, 1, -1, 0, 0, -1, 1, 0 };
void BridgeManager_Main(BridgeManager* this) {
static void (*const BridgeManager_Actions[])(BridgeManager*) = {
BridgeManager_Init,
BridgeManager_Action1,
BridgeManager_Action2,
};
BridgeManager_Actions[super->action](this);
}
void sub_08057CA4(BridgeManager*, u32, u32);
void BridgeManager_Init(BridgeManager* this) {
u32 tmp;
tmp = (super->type2 & 0x3) << 1;
if (super->timer == 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 = ((super->type2 >> 2) & 0xF) + 1;
super->timer = 28;
super->subtimer = 0;
super->action = (super->type2 & 0x80) ? 2 : 1;
if (super->action != 2 || !CheckFlags(this->flags))
return;
for (; this->unk_32; this->unk_32--) {
sub_08057CA4(this, this->unk_28, this->unk_2a);
sub_0807B7D8(this->unk_30, this->x | (this->y << 6), this->unk_3c);
}
DeleteManager(super);
}
void BridgeManager_Action1(BridgeManager* this) {
if (--super->timer)
return;
super->timer = 8;
if (CheckFlags(this->flags)) {
if (this->unk_32 == super->subtimer)
return;
sub_08057CA4(this, this->unk_28, this->unk_2a);
sub_0807B7D8(this->unk_30, this->x | (this->y << 6), this->unk_3c);
super->subtimer++;
SoundReq(SFX_HEART_GET);
} else {
if (!super->subtimer)
return;
RestorePrevTileEntity(this->x | (this->y << 6), this->unk_3c);
sub_08057CA4(this, this->unk_2c, this->unk_2e);
super->subtimer--;
SoundReq(SFX_HEART_GET);
}
}
void BridgeManager_Action2(BridgeManager* this) {
if (super->subAction == 0) {
if (!CheckFlags(this->flags))
return;
super->subAction++;
} else {
if (--super->timer)
return;
super->timer = 8;
if (this->unk_32 != super->subtimer) {
sub_08057CA4(this, this->unk_28, this->unk_2a);
sub_0807B7D8(this->unk_30, this->x | (this->y << 6), this->unk_3c);
super->subtimer++;
SoundReq(SFX_HEART_GET);
} else {
if (this->unk_30 != 0x323) {
SoundReq(SFX_SECRET);
}
DeleteManager(super);
}
}
}
void sub_08057CA4(BridgeManager* this, u32 xOffset, u32 yOffset) {
this->x += xOffset;
this->y += yOffset;
}