summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2017-10-14 22:16:21 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2017-10-14 22:16:21 -0400
commit80985df175f67ea1b90772d2d82c5f97bda44106 (patch)
tree85a1aba4ad51072a26441ff6c1a7dd4cb34c72c8 /src
parent8c54cccc993ab617ac8bbfb1fc6347484640c441 (diff)
sub_8123244
Diffstat (limited to 'src')
-rw-r--r--src/field/field_weather.c48
-rw-r--r--src/scene/cable_car.c204
2 files changed, 204 insertions, 48 deletions
diff --git a/src/field/field_weather.c b/src/field/field_weather.c
index 443a38357..8dcfd62fa 100644
--- a/src/field/field_weather.c
+++ b/src/field/field_weather.c
@@ -4,54 +4,6 @@
#include "sprite.h"
#include "task.h"
-struct Weather
-{
- u8 filler_000[0x200];
- u8 unknown_200[2][32];
- u8 filler_240[0x480];
- s8 unknown_6C0;
- s8 unknown_6C1;
- u8 unknown_6C2;
- u8 unknown_6C3;
- u16 unknown_6C4;
- u8 unknown_6C6;
- u8 unknown_6C7;
- u8 unknown_6C8;
- u8 unknown_6C9;
- u8 unknown_6CA;
- u8 unknown_6CB;
- u8 filler_6CC[2];
- u16 unknown_6CE;
- u8 unknown_6D0;
- u8 unknown_6D1;
- u8 filler_6D2[1];
- u8 unknown_6D3;
- u8 unknown_6D4;
- u8 unknown_6D5;
- u8 filler_6D6[2];
- u8 unknown_6D8;
- u8 filler_6D9[1];
- u8 unknown_6DA;
- u8 filler_6DB[3];
- u8 unknown_6DE;
- u8 filler_6DF[5];
- u8 unknown_6E4;
- u8 filler_6E5[0x15];
- u8 unknown_6FA;
- u8 unknown_6FB;
- u8 filler_6FC[4];
- u8 unknown_700;
- u8 filler_701[0x15];
- u8 unknown_716;
- u8 unknown_717;
- u8 filler_718[0xc];
- u8 unknown_724;
- u8 filler_725[9];
- u8 unknown_72E;
-};
-
-#define gWeather gUnknown_0202F7E8
-extern struct Weather gWeather;
extern u8 *gUnknown_083970E8;
extern u8 (*gUnknown_08396FC8[][4])(void);
extern u8 (*gUnknown_083970B8[])(void);
diff --git a/src/scene/cable_car.c b/src/scene/cable_car.c
index 1b5d22221..0f3726e3a 100644
--- a/src/scene/cable_car.c
+++ b/src/scene/cable_car.c
@@ -3,18 +3,101 @@
#include "global.h"
#include "palette.h"
#include "main.h"
+#include "script.h"
#include "task.h"
+#include "sound.h"
+#include "songs.h"
+#include "decompress.h"
+#include "field_weather.h"
+#include "unknown_task.h"
+#include "event_data.h"
+#include "cable_car_util.h"
// Static type declarations
+struct Unk_2017000 {
+ u8 unk_0000;
+ u8 unk_0001;
+ u8 unk_0002;
+ u8 filler_0003[0xf9];
+ u16 unk_00fc[0x400];
+ u16 unk_08fc[0x400];
+}; // size 0x10FC
+
+struct Unk_2019000 {
+ /* 0x000 */ u16 mtChimneyTilemap[0xb4];
+ /* 0x168 */ u16 treeTilemap[0x1e0];
+ /* 0x528 */ u16 mountainTilemap[0x258];
+ /* 0x9d8 */ u16 pylonStemTilemap[0x628]; // size not actually known
+};
+
+#define ewram_17000 (*(struct Unk_2017000 *)(ewram + 0x17000))
+#define ewram_19000 (*(struct Unk_2019000 *)(ewram + 0x19000))
+
// Static RAM declarations
+EWRAM_DATA struct Unk_2017000 *gUnknown_02039274 = NULL;
+EWRAM_DATA u8 gUnknown_02039278 = 0;
+EWRAM_DATA u8 gUnknown_02039279 = 0;
+EWRAM_DATA u8 gUnknown_0203927A = 0;
+EWRAM_DATA u8 gUnknown_0203927B = 0;
+EWRAM_DATA u8 gUnknown_0203927C = 0;
+EWRAM_DATA u8 gUnknown_0203927D = 0;
+EWRAM_DATA u32 filler_02039280 = 0;
+
// Static ROM declarations
void sub_8123244(void);
+void sub_8124118(void);
+void sub_81248AC(u8);
+void sub_8123FBC(u8);
+void sub_8123C40(void);
+void sub_8123724(void);
+void sub_8123878(u8 taskId);
+void sub_81239E4(u8 taskId);
+void sub_8123AF8(u8 taskId);
// .rodata
+extern const u8 gCableCar_Gfx[];
+extern const u8 gCableCarDoor_Gfx[];
+extern const u8 gCableCarCord_Gfx[];
+extern const u16 gCableCar_Pal[];
+extern const u16 gCableCarBG_Pal[];
+extern const u8 gCableCarBG_Gfx[];
+
+const u8 gCableCarMtChimneyTilemap[] = INCBIN_U8("graphics/misc/cable_car_mt_chimney_map.bin.lz");
+
+const u8 gCableCarTreeTilemap[] = INCBIN_U8("graphics/misc/cable_car_tree_map.bin.lz");
+
+const u8 gCableCarMountainTilemap[] = INCBIN_U8("graphics/misc/cable_car_mountain_map.bin.lz");
+
+const u16 gCableCarPylonHookTilemapEntries[] = {
+ 0x3000,
+ 0x3001,
+ 0x3002,
+ 0x3003,
+ 0x3004,
+ 0x3005,
+ 0x3006,
+ 0x3007,
+ 0x3008,
+ 0x3009
+};
+
+const u8 gCableCarPylonStemTilemap[] = INCBIN_U8("graphics/misc/cable_car_pylon_stem_map.bin.lz");
+
+const struct CompressedSpriteSheet gUnknown_08401CF8[] = {
+ { gCableCar_Gfx, 0x800, 1 },
+ { gCableCarDoor_Gfx, 0x40, 2 },
+ { gCableCarCord_Gfx, 0x80, 3 },
+ { }
+};
+const struct SpritePalette gUnknown_08401D18[] = {
+ { gCableCar_Pal, 1 },
+ { }
+};
+
// .text
void sub_81231EC(u8 taskId)
@@ -25,3 +108,124 @@ void sub_81231EC(u8 taskId)
DestroyTask(taskId);
}
}
+
+void sub_8123218(void)
+{
+ ScriptContext2_Enable();
+ CreateTask(sub_81231EC, 1);
+ BeginNormalPaletteFade(-1, 0, 0, 16, 0);
+}
+
+void sub_8123244(void)
+{
+ u8 i;
+ u16 imebak;
+
+ switch (gMain.state)
+ {
+ case 0:
+ default:
+ SetVBlankCallback(NULL);
+ remove_some_task();
+ DmaFill16Large(3, 0, (void *)VRAM, VRAM_SIZE, 0x1000);
+ DmaFill32Defvars(3, 0, (void *)OAM, OAM_SIZE);
+ DmaFill16Defvars(3, 0, (void *)PLTT, PLTT_SIZE);
+ gUnknown_02039274 = &ewram_17000;
+ DmaFill16Large(3, 0, &ewram_17000, 0x10FC, 0x1000);
+ gMain.state ++;
+ break;
+ case 1:
+ ResetSpriteData();
+ ResetTasks();
+ FreeAllSpritePalettes();
+ ResetPaletteFade();
+ sub_807C828();
+ for (i = 0; i < 20; i ++)
+ {
+ gUnknown_08396FC4->unk_0f0[i] = NULL;
+ }
+ InitMapMusic();
+ ResetMapMusic();
+ gSpriteCoordOffsetX = gSpriteCoordOffsetY = 0;
+ gMain.state ++;
+ break;
+ case 2:
+ for (i = 0; i < 3; i ++)
+ {
+ LoadCompressedObjectPic(&gUnknown_08401CF8[i]);
+ }
+ LoadSpritePalettes(gUnknown_08401D18);
+ LZDecompressWram(gCableCarMtChimneyTilemap, ewram_19000.mtChimneyTilemap);
+ LZDecompressWram(gCableCarTreeTilemap, ewram_19000.treeTilemap);
+ LZDecompressWram(gCableCarMountainTilemap, ewram_19000.mountainTilemap);
+ LZDecompressWram(gCableCarPylonStemTilemap, ewram_19000.pylonStemTilemap);
+ LoadPalette(gCableCarBG_Pal, 0, 0x80);
+ LZ77UnCompVram(gCableCarBG_Gfx, (u16 *)BG_VRAM);
+ gMain.state ++;
+ break;
+ case 3:
+ sub_8124118();
+ RunTasks();
+ gMain.state ++;
+ break;
+ case 4:
+ if (gUnknown_02039274->unk_0002 == 7)
+ {
+ gMain.state ++;
+ }
+ else if (gUnknown_08396FC4->unk_0f0[0] != NULL)
+ {
+ for (i = 0; i < 20; i ++)
+ {
+ if (gUnknown_08396FC4->unk_0f0[i] != NULL)
+ {
+ gUnknown_08396FC4->unk_0f0[i]->unk_5_2 = 0;
+ }
+ }
+ gMain.state ++;
+ }
+ break;
+ case 5:
+ sub_8124F08((u16 *)BG_SCREEN_ADDR(29), ewram_19000.treeTilemap, 0, 17, 32, 15);
+ sub_8124F08((u16 *)BG_SCREEN_ADDR(30), ewram_19000.mountainTilemap, 0, 0, 30, 20);
+ sub_8124F08(gUnknown_02039274->unk_08fc, gCableCarPylonHookTilemapEntries, 0, 0, 5, 2);
+ sub_8124F08(gUnknown_02039274->unk_08fc, ewram_19000.pylonStemTilemap, 0, 2, 2, 20);
+ gMain.state ++;
+ break;
+ case 6:
+ sub_81248AC(gSpecialVar_0x8004);
+ sub_8124F08(gUnknown_02039274->unk_00fc, ewram_19000.mtChimneyTilemap + 0x48, 0, 14, 12, 3);
+ sub_8124F08(gUnknown_02039274->unk_00fc, ewram_19000.mtChimneyTilemap + 0x6C, 12, 17, 12, 3);
+ sub_8124F08(gUnknown_02039274->unk_00fc, ewram_19000.mtChimneyTilemap + 0x90, 24, 20, 12, 3);
+ sub_8124F08(gUnknown_02039274->unk_00fc, ewram_19000.mtChimneyTilemap + 0x00, 0, 17, 12, 3);
+ sub_8124F08(gUnknown_02039274->unk_00fc, ewram_19000.mtChimneyTilemap + 0x24, 0, 20, 12, 3);
+ sub_8124F08(gUnknown_02039274->unk_00fc, ewram_19000.mtChimneyTilemap + 0x00, 12, 20, 12, 3);
+ sub_8124F08(gUnknown_02039274->unk_00fc, ewram_19000.mtChimneyTilemap + 0x24, 12, 23, 12, 3);
+ sub_8124F08(gUnknown_02039274->unk_00fc, ewram_19000.mtChimneyTilemap + 0x00, 24, 23, 12, 3);
+ gMain.state ++;
+ break;
+ case 7:
+ BeginNormalPaletteFade(-1, 3, 16, 0, 0);
+ FadeInNewBGM(BGM_ROPEWAY, 1);
+ sub_8123FBC(1);
+ gMain.state ++;
+ break;
+ case 8:
+ imebak = REG_IME;
+ REG_IME = 0;
+ REG_IE |= INTR_FLAG_VBLANK;
+ REG_IME = imebak;
+ SetVBlankCallback(sub_8123C40);
+ SetMainCallback2(sub_8123724);
+ CreateTask(sub_8123878, 0);
+ if (gSpecialVar_0x8004 == 0)
+ {
+ gUnknown_02039274->unk_0000 = CreateTask(sub_81239E4, 1);
+ }
+ else
+ {
+ gUnknown_02039274->unk_0000 = CreateTask(sub_8123AF8, 1);
+ }
+ break;
+ }
+}