mirror of https://github.com/zeldaret/tmc.git
196 lines
5.6 KiB
C
196 lines
5.6 KiB
C
/**
|
|
* @file steamOverlayManager.c
|
|
* @ingroup Managers
|
|
*
|
|
* @brief Steamy overlay bg in Cave of Flames.
|
|
*/
|
|
#include "manager/steamOverlayManager.h"
|
|
#include "flags.h"
|
|
#include "main.h"
|
|
#include "physics.h"
|
|
#include "room.h"
|
|
#include "screen.h"
|
|
|
|
const u16 gUnk_08108588[] = { 0x1000, 0xF01, 0xE02, 0xD03, 0xC04, 0xB05, 0xA06, 0x907, 0x808 };
|
|
|
|
const u16 gUnk_0810859A[] = { 0x808, 0x907, 0xA06, 0x907 };
|
|
|
|
extern u16 gUnk_02017AA0[];
|
|
|
|
void SteamOverlayManager_Init(SteamOverlayManager*);
|
|
void SteamOverlayManager_Action4(SteamOverlayManager*);
|
|
u32 sub_08059F9C(SteamOverlayManager*);
|
|
void SteamOverlayManager_Action1(SteamOverlayManager*);
|
|
void SteamOverlayManager_Action2(SteamOverlayManager*);
|
|
void sub_0805A098(SteamOverlayManager*);
|
|
void SteamOverlayManager_Action3(SteamOverlayManager*);
|
|
void sub_0805A114(u32, u32);
|
|
void sub_0805A1D8(SteamOverlayManager*);
|
|
void nullsub_495(void*);
|
|
void sub_0805A25C(void*);
|
|
|
|
void SteamOverlayManager_Main(SteamOverlayManager* this) {
|
|
static void (*const SteamOverlayManager_Actions[])(SteamOverlayManager*) = {
|
|
SteamOverlayManager_Init, SteamOverlayManager_Action1, SteamOverlayManager_Action2,
|
|
SteamOverlayManager_Action3, SteamOverlayManager_Action4,
|
|
};
|
|
this->unk_20++;
|
|
SteamOverlayManager_Actions[super->action](this);
|
|
sub_0805A1D8(this);
|
|
}
|
|
|
|
void SteamOverlayManager_Init(SteamOverlayManager* this) {
|
|
if (EntityHasDuplicateID((Entity*)this)) {
|
|
DeleteThisEntity();
|
|
}
|
|
this->unk_22 = 1;
|
|
this->unk_20 = 0;
|
|
super->timer = 0;
|
|
super->subtimer = 4;
|
|
super->action = 4;
|
|
super->flags |= ENT_PERSIST;
|
|
gScreen.bg3.control = 0x1E04;
|
|
gScreen.lcd.displayControl |= DISPCNT_BG3_ON;
|
|
gScreen.controls.layerFXControl = 0x3E48;
|
|
gScreen.controls.alphaBlend = 0x1000;
|
|
gScreen.bg3.xOffset = 0x80;
|
|
gScreen.bg3.yOffset = 0;
|
|
RegisterTransitionManager(this, nullsub_495, sub_0805A25C);
|
|
}
|
|
|
|
void SteamOverlayManager_Action4(SteamOverlayManager* this) {
|
|
u32 tmp = --super->subtimer;
|
|
if (tmp == 0) {
|
|
super->subtimer = 4;
|
|
if (sub_08059F9C(this)) {
|
|
if (gUnk_08108588[super->timer] != 0x808) {
|
|
this->unk_22 = 1;
|
|
this->unk_24 = tmp;
|
|
gScreen.controls.alphaBlend = gUnk_08108588[++super->timer];
|
|
} else {
|
|
this->unk_22 = tmp;
|
|
}
|
|
} else {
|
|
this->unk_22 = 1;
|
|
if (gUnk_08108588[super->timer] != 0x1000) {
|
|
gScreen.controls.alphaBlend = gUnk_08108588[--super->timer];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
u32 sub_08059F9C(SteamOverlayManager* this) {
|
|
switch (gRoomControls.room) {
|
|
case 1:
|
|
if (CheckLocalFlag(0x16)) {
|
|
return 0;
|
|
}
|
|
sub_0805A25C(this);
|
|
DeleteThisEntity();
|
|
break;
|
|
case 7:
|
|
sub_0805A25C(this);
|
|
DeleteThisEntity();
|
|
break;
|
|
case 0:
|
|
case 8 ... 9:
|
|
case 23:
|
|
return 1;
|
|
case 2 ... 6:
|
|
case 10 ... 22:
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
void SteamOverlayManager_Action1(SteamOverlayManager* this) {
|
|
sub_0805A098(this);
|
|
}
|
|
|
|
void SteamOverlayManager_Action2(SteamOverlayManager* this) {
|
|
if (--super->subtimer == 0) {
|
|
super->subtimer = 4;
|
|
gScreen.controls.alphaBlend = gUnk_08108588[super->timer++];
|
|
if (super->timer == 9) {
|
|
super->action = 1;
|
|
this->unk_22 = 0;
|
|
}
|
|
}
|
|
sub_0805A098(this);
|
|
}
|
|
|
|
void sub_0805A098(SteamOverlayManager* this) {
|
|
switch (gRoomControls.room) {
|
|
case 0:
|
|
case 8:
|
|
case 9:
|
|
case 0x17:
|
|
return;
|
|
default:
|
|
super->action = 3;
|
|
}
|
|
}
|
|
|
|
void SteamOverlayManager_Action3(SteamOverlayManager* this) {
|
|
if (--super->subtimer == 0) {
|
|
super->subtimer = 4;
|
|
gScreen.controls.alphaBlend = gUnk_08108588[super->timer--];
|
|
if (super->timer == 0xFF) {
|
|
gScreen.lcd.displayControl &= ~DISPCNT_BG3_ON;
|
|
DisableVBlankDMA();
|
|
DeleteThisEntity();
|
|
}
|
|
}
|
|
}
|
|
|
|
void sub_0805A114(u32 unk0, u32 unk1) {
|
|
s32 i;
|
|
u16* p = &gUnk_02017AA0[gUnk_03003DE4[0] * 0x500];
|
|
for (i = 0; i < 0xA0; i++) {
|
|
s32 tmp = i + gScreen.bg3.yOffset;
|
|
switch ((tmp >> 3) & 7) {
|
|
case 4:
|
|
tmp -= 8;
|
|
tmp &= 0xF8;
|
|
break;
|
|
case 1:
|
|
case 7:
|
|
tmp &= 0xF0;
|
|
break;
|
|
case 0:
|
|
case 2 ... 3:
|
|
case 5 ... 6:
|
|
default:
|
|
tmp &= 0xF8;
|
|
}
|
|
*p++ = gScreen.bg3.xOffset + ((gSineTable[(unk1 + tmp) & 0xFF] * unk0) >> 8);
|
|
}
|
|
SetVBlankDMA((u16*)&gUnk_02017AA0[gUnk_03003DE4[0] * 0x500], (u16*)REG_ADDR_BG3HOFS,
|
|
((DMA_ENABLE | DMA_START_HBLANK | DMA_16BIT | DMA_REPEAT | DMA_SRC_INC | DMA_DEST_RELOAD) << 16) +
|
|
0x1);
|
|
}
|
|
|
|
void sub_0805A1D8(SteamOverlayManager* this) {
|
|
gRoomControls.bg3OffsetX.WORD -= 0x1000;
|
|
gScreen.bg3.xOffset = gRoomControls.bg3OffsetX.HALF.HI;
|
|
gRoomControls.bg3OffsetY.WORD -= 0x1000;
|
|
gScreen.bg3.yOffset = gRoomControls.bg3OffsetY.HALF.HI;
|
|
if (gScreen.lcd.displayControl & DISPCNT_BG3_ON) {
|
|
sub_0805A114(6, this->unk_20 >> 1);
|
|
if (this->unk_22 == 0 && (gMain.ticks & 0x1F) == 0) {
|
|
this->unk_24++;
|
|
this->unk_24 &= 3;
|
|
gScreen.controls.alphaBlend = gUnk_0810859A[this->unk_24];
|
|
}
|
|
}
|
|
}
|
|
|
|
void nullsub_495(void* this) {
|
|
}
|
|
|
|
void sub_0805A25C(void* this) {
|
|
gScreen.controls.layerFXControl = 0;
|
|
gScreen.lcd.displayControl &= ~DISPCNT_BG3_ON;
|
|
DisableVBlankDMA();
|
|
}
|