diff options
| author | octorock <79596758+octorock@users.noreply.github.com> | 2021-08-28 20:55:43 +0200 |
|---|---|---|
| committer | octorock <79596758+octorock@users.noreply.github.com> | 2021-08-28 20:55:43 +0200 |
| commit | 5981c5b71da0dd7af5c67aabecd85787e89cb2df (patch) | |
| tree | 579865a149455c7ac3b7a96d0bd0bfb6fe7623f2 /src | |
| parent | bfe4af300bdf2d59f2453558da80a40519a5e478 (diff) | |
Decompile manager24
Diffstat (limited to 'src')
| -rw-r--r-- | src/manager/manager24.c | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/src/manager/manager24.c b/src/manager/manager24.c new file mode 100644 index 00000000..7387f322 --- /dev/null +++ b/src/manager/manager24.c @@ -0,0 +1,331 @@ +#include "entity.h" +#include "functions.h" +#include "flags.h" +#include "audio.h" +#include "game.h" +#include "object.h" +#include "area.h" + +typedef struct { + Manager manager; + u8 field_0x20; + u8 field_0x21; + u8 field_0x22; + u8 field_0x23; + u8 field_0x24; + u8 field_0x25; + u8 field_0x26; + u8 field_0x27; + u8 field_0x28; + u8 field_0x29; + u8 field_0x2a; + u8 field_0x2b; + u8 field_0x2c; + u8 field_0x2d; + u8 field_0x2e; + u8 field_0x2f; + u8 field_0x30; + u8 field_0x31; + u8 field_0x32; + u8 field_0x33; + u8 field_0x34; + u8 field_0x35; + u8 field_0x36; + u8 field_0x37; + s16 x; + u16 y; + u16 tile; + u16 field_0x3e; +} Manager24; + +extern void (*const gUnk_08108CDC[])(Manager24*); + +u32 sub_0805BFC4(u32, u32); +void sub_0805C02C(Manager24*); + +extern u32 sub_080002C8(u16, u8); + +extern void (*const gUnk_08108CE8[])(u32, u32); + +u32 sub_0805C608(void); +extern u32 sub_08052670(void); + +extern u8 gUnk_08108CFC[]; + +void Manager24_Main(Manager24* manager) { + gUnk_08108CDC[manager->manager.action](manager); +} + +void sub_0805BF30(Manager24* manager) { + manager->manager.action = 1; + manager->tile = (manager->x >> 4 & 0x3fU) | (((manager->y << 0x10) >> 0x14 & 0x3fU) << 6); + manager->manager.unk_0a = sub_0805BFC4(manager->tile, manager->field_0x35); + if (CheckLocalFlag(manager->field_0x3e) != 0) { + sub_0805C02C(manager); + DeleteManager((Manager*)manager); + } +} + +void sub_0805BF78(Manager24* this) { + if (sub_080002C8(this->tile, this->field_0x35) != 0x2e) { + this->manager.action = 2; + this->manager.unk_0e = 0x5a; + sub_0805C02C(this); + SetLocalFlag(this->field_0x3e); + } +} + +void sub_0805BFA4(Manager24* this) { + if (--this->manager.unk_0e == 0) { + SoundReq(SFX_SECRET); + DeleteManager((Manager*)this); + } +} + +u32 sub_0805BFC4(u32 pos, u32 layer) { + u32 tileType = GetTileType(pos, layer); + + switch (tileType) { + case 0xec: + return 1; + case 0xbf: + return 4; + case 0xaf: + return 0; + case 0xcc: + return 2; + case 0xdf: + return 3; + case 0xff: + return 0; + case 0x115: + return 1; + case 0x108: + return 2; + case 0x110: + return 3; + case 0x105: + return 4; + } + return 0xff; +} + +void sub_0805C02C(Manager24* this) { + if (this->manager.unk_0a != 0xff) { + gUnk_08108CE8[this->manager.unk_0a](this->tile, this->field_0x35); + } +} + +void sub_0805C050(u32 pos, u32 layer) { + SetTileType(0xb1, pos - 0x41, layer); + SetTileType(0xb2, pos - 0x40, layer); + SetTileType(0xb3, pos - 0x3f, layer); + SetTileType(0xb4, pos - 1, layer); + SetTileType(0xb7, pos + 1, layer); + if (layer == 1) { + if (sub_08052670() != 0) { + Entity* object = CreateObject(ARCHWAY, 0xe, 0); + if (object != NULL) { + object->x.HALF.HI = ((pos & 0x3f) << 4) + 8 + gRoomControls.roomOriginX; + object->y.HALF.HI = ((pos & 0xfc0) >> 2) - 8 + gRoomControls.roomOriginY; + } + SetTileType(0xb5, pos, 1); + } else { + if (CheckIsDungeon() != 0) { + SetTileType(0xb5, pos, 1); + } else { + SetTileType(0xb6, pos, 1); + } + } + + SetTileType(0xb8, pos - 0x41, 2); + SetTileType(0xb9, pos - 0x40, 2); + SetTileType(0xba, pos - 0x3f, 2); + } else { + Entity* object; + SetTileType(0xb5, pos, 2); + if (CheckIsDungeon() == 0) { + return; + } + object = CreateObject(ARCHWAY, sub_0805C608(), 6); + if (object == NULL) { + return; + } + object->x.HALF.HI = ((pos & 0x3f) << 4) + 8 + gRoomControls.roomOriginX; + object->y.HALF.HI = ((pos & 0xfc0) >> 2) - 0x10 + gRoomControls.roomOriginY; + object->collisionLayer = 2; + } +} + +void sub_0805C178(u32 pos, u32 layer) { + Entity* object; + + SetTileType(0xf1, pos - 0x40, layer); + SetTileType(0xf5, pos - 0x3f, layer); + SetTileType(0xf6, pos + 1, layer); + SetTileType(0xf4, pos + 0x40, layer); + SetTileType(0xf7, pos + 0x41, layer); + if (layer == 1) { + + if (sub_08052670() != 0) { + + object = CreateObject(ARCHWAY, 0xe, 1); + if (object != NULL) { + object->x.HALF.HI = ((pos & 0x3f) << 4) + 0x18 + gRoomControls.roomOriginX; + object->y.HALF.HI = ((pos & 0xfc0) >> 2) + 8 + gRoomControls.roomOriginY; + } + SetTileType(0xf2, pos, 1); + } else { + if (CheckIsDungeon() != 0) { + SetTileType(0xf2, pos, 1); + } else { + SetTileType(0xf3, pos, 1); + } + } + SetTileType(0xf8, pos - 0x3f, 2); + SetTileType(0xf9, pos + 1, 2); + SetTileType(0xfa, pos + 0x41, 2); + } else { + SetTileType(0xf2, pos, 2); + if (CheckIsDungeon() == 0) { + return; + } + object = CreateObject(ARCHWAY, sub_0805C608(), 7); + if (object == NULL) { + return; + } + object->x.HALF.HI = ((pos & 0x3f) << 4) + 0x20 + gRoomControls.roomOriginX; + object->y.HALF.HI = ((pos & 0xfc0) >> 2) + 8 + gRoomControls.roomOriginY; + object->collisionLayer = 2; + } +} + +void sub_0805C294(u32 pos, u32 layer) { + Entity* object; + + SetTileType(0xd1, pos - 1, layer); + SetTileType(0xd4, pos + 1, layer); + SetTileType(0xd5, pos + 0x3f, layer); + SetTileType(0xd6, pos + 0x40, layer); + SetTileType(0xd7, pos + 0x41, layer); + if (layer == 1) { + if (sub_08052670() != 0) { + object = CreateObject(0x4f, 0xe, 2); + if (object != NULL) { + object->x.HALF.HI = ((pos & 0x3f) << 4) + 8 + gRoomControls.roomOriginX; + object->y.HALF.HI = ((pos & 0xfc0) >> 2) + 0x20 + gRoomControls.roomOriginY; + } + SetTileType(0xd2, pos, 1); + } else { + if (CheckIsDungeon() != 0) { + SetTileType(0xd2, pos, 1); + } else { + SetTileType(0xd3, pos, 1); + } + } + SetTileType(0xd8, pos + 0x3f, 2); + SetTileType(0xd9, pos + 0x40, 2); + SetTileType(0xda, pos + 0x41, 2); + } else { + SetTileType(0xd2, pos, 2); + if (CheckIsDungeon() == 0) { + return; + } + object = CreateObject(0x4f, sub_0805C608(), 8); + if (object == NULL) { + return; + } + object->x.HALF.HI = ((pos & 0x3f) << 4) + 8 + gRoomControls.roomOriginX; + object->y.HALF.HI = ((pos & 0xfc0) >> 2) + 0x20 + gRoomControls.roomOriginY; + object->collisionLayer = 2; + } +} + +void sub_0805C3B4(u32 pos, u32 layer) { + Entity* object; + + SetTileType(0xe1, pos - 0x41, layer); + SetTileType(0xe4, pos - 0x40, layer); + SetTileType(0xe2, pos - 1, layer); + SetTileType(0xe3, pos + 0x3f, layer); + SetTileType(0xe7, pos + 0x40, layer); + if (layer == 1) { + if (sub_08052670() != 0) { + object = CreateObject(ARCHWAY, 0xe, 3); + if (object != NULL) { + object->x.HALF.HI = ((pos & 0x3f) << 4) + -0x10 + gRoomControls.roomOriginX; + object->y.HALF.HI = ((pos & 0xfc0) >> 2) + 8 + gRoomControls.roomOriginY; + } + SetTileType(0xe5, pos, 1); + } else { + if (CheckIsDungeon() != 0) { + SetTileType(0xe5, pos, 1); + } else { + SetTileType(0xe6, pos, 1); + } + } + SetTileType(0xe8, pos - 0x41, 2); + SetTileType(0xe9, pos - 1, 2); + SetTileType(0xea, pos + 0x3f, 2); + } else { + SetTileType(0xe5, pos, 2); + if (CheckIsDungeon() == 0) { + return; + } + + object = CreateObject(ARCHWAY, sub_0805C608(), 9); + if (object == NULL) { + return; + } + object->x.HALF.HI = ((pos & 0x3f) << 4) + -0x10 + gRoomControls.roomOriginX; + object->y.HALF.HI = ((pos & 0xfc0) >> 2) + 8 + gRoomControls.roomOriginY; + object->collisionLayer = 2; + } +} + +void sub_0805C4E0(u32 pos, u32 layer) { + Entity* object; + + SetTileType(0xc1, pos - 0x41, layer); + SetTileType(0xc2, pos - 0x40, layer); + SetTileType(0xc3, pos - 0x3f, layer); + SetTileType(0xc4, pos - 1, layer); + SetTileType(0xc7, pos + 1, layer); + if (layer == 1) { + if (sub_08052670() != 0) { + object = CreateObject(ARCHWAY, 0xe, 0); + if (object != NULL) { + object->x.HALF.HI = ((pos & 0x3f) << 4) + 8 + gRoomControls.roomOriginX; + object->y.HALF.HI = ((pos & 0xfc0) >> 2) + -0x10 + gRoomControls.roomOriginY; + } + SetTileType(0xc5, pos, 1); + } else { + if (CheckIsDungeon() != 0) { + SetTileType(0xc5, pos, 1); + } else { + SetTileType(0xc6, pos, 1); + } + } + SetTileType(0xc8, pos - 0x41, 2); + SetTileType(0xc9, pos - 0x40, 2); + SetTileType(0xca, pos - 0x3f, 2); + } else { + SetTileType(0xc5, pos, 2); + if (CheckIsDungeon() == 0) { + return; + } + + object = CreateObject(ARCHWAY, sub_0805C608(), 6); + if (object == NULL) { + return; + } + object->x.HALF.HI = ((pos & 0x3f) << 4) + 8 + gRoomControls.roomOriginX; + object->y.HALF.HI = ((pos & 0xfc0) >> 2) + -0x10 + gRoomControls.roomOriginY; + object->collisionLayer = 2; + } +} + +u32 sub_0805C608(void) +{ + return gUnk_08108CFC[gArea.regret]; +} |
