summaryrefslogtreecommitdiff
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
parent8c54cccc993ab617ac8bbfb1fc6347484640c441 (diff)
sub_8123244
-rw-r--r--asm/cable_car.s574
-rw-r--r--data/cable_car.s41
-rw-r--r--include/cable_car_util.h12
-rw-r--r--include/field_weather.h60
-rw-r--r--include/gba/macro.h30
-rw-r--r--include/global.h1
-rw-r--r--ld_script.txt1
-rw-r--r--src/field/field_weather.c48
-rw-r--r--src/scene/cable_car.c204
-rw-r--r--sym_ewram.txt26
10 files changed, 309 insertions, 688 deletions
diff --git a/asm/cable_car.s b/asm/cable_car.s
index 71bc85ccb..6f20f57e3 100644
--- a/asm/cable_car.s
+++ b/asm/cable_car.s
@@ -6,580 +6,6 @@
.text
- thumb_func_start sub_8123218
-sub_8123218: @ 8123218
- push {lr}
- sub sp, 0x4
- bl ScriptContext2_Enable
- ldr r0, _08123240 @ =sub_81231EC
- movs r1, 0x1
- bl CreateTask
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r2, 0
- movs r3, 0x10
- bl BeginNormalPaletteFade
- add sp, 0x4
- pop {r0}
- bx r0
- .align 2, 0
-_08123240: .4byte sub_81231EC
- thumb_func_end sub_8123218
-
- thumb_func_start sub_8123244
-sub_8123244: @ 8123244
- push {r4-r7,lr}
- mov r7, r9
- mov r6, r8
- push {r6,r7}
- sub sp, 0x10
- ldr r1, _08123268 @ =gMain
- ldr r2, _0812326C @ =0x0000043c
- adds r0, r1, r2
- ldrb r0, [r0]
- mov r9, r1
- cmp r0, 0x8
- bhi _08123298
- lsls r0, 2
- ldr r1, _08123270 @ =_08123274
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .align 2, 0
-_08123268: .4byte gMain
-_0812326C: .4byte 0x0000043c
-_08123270: .4byte _08123274
- .align 2, 0
-_08123274:
- .4byte _08123298
- .4byte _08123384
- .4byte _081233E8
- .4byte _08123484
- .4byte _081234A0
- .4byte _08123504
- .4byte _08123598
- .4byte _08123678
- .4byte _081236B0
-_08123298:
- movs r0, 0
- bl SetVBlankCallback
- bl remove_some_task
- movs r3, 0xC0
- lsls r3, 19
- movs r4, 0xC0
- lsls r4, 9
- add r0, sp, 0xC
- mov r9, r0
- add r2, sp, 0x8
- movs r6, 0
- ldr r1, _08123368 @ =0x040000d4
- movs r5, 0x80
- lsls r5, 5
- ldr r7, _0812336C @ =0x81000800
- movs r0, 0x81
- lsls r0, 24
- mov r8, r0
-_081232C0:
- strh r6, [r2]
- add r0, sp, 0x8
- str r0, [r1]
- str r3, [r1, 0x4]
- str r7, [r1, 0x8]
- ldr r0, [r1, 0x8]
- adds r3, r5
- subs r4, r5
- cmp r4, r5
- bhi _081232C0
- strh r6, [r2]
- add r2, sp, 0x8
- str r2, [r1]
- str r3, [r1, 0x4]
- lsrs r0, r4, 1
- mov r2, r8
- orrs r0, r2
- str r0, [r1, 0x8]
- ldr r0, [r1, 0x8]
- movs r0, 0xE0
- lsls r0, 19
- movs r3, 0x80
- lsls r3, 3
- movs r4, 0
- str r4, [sp, 0xC]
- ldr r2, _08123368 @ =0x040000d4
- mov r1, r9
- str r1, [r2]
- str r0, [r2, 0x4]
- lsrs r0, r3, 2
- movs r1, 0x85
- lsls r1, 24
- orrs r0, r1
- str r0, [r2, 0x8]
- ldr r0, [r2, 0x8]
- movs r1, 0xA0
- lsls r1, 19
- add r0, sp, 0x8
- strh r4, [r0]
- str r0, [r2]
- str r1, [r2, 0x4]
- lsrs r3, 1
- movs r4, 0x81
- lsls r4, 24
- orrs r3, r4
- str r3, [r2, 0x8]
- ldr r0, [r2, 0x8]
- ldr r1, _08123370 @ =gUnknown_02039274
- ldr r0, _08123374 @ =0x02017000
- str r0, [r1]
- adds r3, r0, 0
- ldr r5, _08123378 @ =0x000010fc
- ldr r0, _0812337C @ =gMain
- mov r9, r0
- add r1, sp, 0x8
- movs r7, 0
- movs r6, 0x80
- lsls r6, 5
- ldr r0, _0812336C @ =0x81000800
- mov r8, r0
-_08123338:
- strh r7, [r1]
- add r0, sp, 0x8
- str r0, [r2]
- str r3, [r2, 0x4]
- mov r0, r8
- str r0, [r2, 0x8]
- ldr r0, [r2, 0x8]
- adds r3, r6
- subs r5, r6
- cmp r5, r6
- bhi _08123338
- strh r7, [r1]
- add r1, sp, 0x8
- str r1, [r2]
- str r3, [r2, 0x4]
- lsrs r0, r5, 1
- orrs r0, r4
- str r0, [r2, 0x8]
- ldr r0, [r2, 0x8]
- ldr r1, _08123380 @ =0x0000043c
- add r1, r9
- ldrb r0, [r1]
- adds r0, 0x1
- b _0812370C
- .align 2, 0
-_08123368: .4byte 0x040000d4
-_0812336C: .4byte 0x81000800
-_08123370: .4byte gUnknown_02039274
-_08123374: .4byte 0x02017000
-_08123378: .4byte 0x000010fc
-_0812337C: .4byte gMain
-_08123380: .4byte 0x0000043c
-_08123384:
- bl ResetSpriteData
- bl ResetTasks
- bl FreeAllSpritePalettes
- bl ResetPaletteFade
- bl sub_807C828
- movs r4, 0
- ldr r0, _081233D4 @ =gUnknown_08396FC4
- ldr r0, [r0]
- adds r1, r0, 0
- adds r1, 0xF0
- movs r2, 0
-_081233A4:
- lsls r0, r4, 2
- adds r0, r1, r0
- str r2, [r0]
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x13
- bls _081233A4
- bl InitMapMusic
- bl ResetMapMusic
- ldr r2, _081233D8 @ =gSpriteCoordOffsetX
- ldr r1, _081233DC @ =gSpriteCoordOffsetY
- movs r0, 0
- strh r0, [r1]
- strh r0, [r2]
- ldr r1, _081233E0 @ =gMain
- ldr r2, _081233E4 @ =0x0000043c
- adds r1, r2
- ldrb r0, [r1]
- adds r0, 0x1
- b _0812370C
- .align 2, 0
-_081233D4: .4byte gUnknown_08396FC4
-_081233D8: .4byte gSpriteCoordOffsetX
-_081233DC: .4byte gSpriteCoordOffsetY
-_081233E0: .4byte gMain
-_081233E4: .4byte 0x0000043c
-_081233E8:
- movs r4, 0
- ldr r5, _08123454 @ =gUnknown_08401CF8
-_081233EC:
- lsls r0, r4, 3
- adds r0, r5
- bl LoadCompressedObjectPic
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x2
- bls _081233EC
- ldr r0, _08123458 @ =gUnknown_08401D18
- bl LoadSpritePalettes
- ldr r0, _0812345C @ =gCableCarMtChimneyTilemap
- ldr r4, _08123460 @ =0x02019000
- adds r1, r4, 0
- bl LZDecompressWram
- ldr r0, _08123464 @ =gCableCarTreeTilemap
- movs r2, 0xB4
- lsls r2, 1
- adds r1, r4, r2
- bl LZDecompressWram
- ldr r0, _08123468 @ =gCableCarMountainTilemap
- movs r2, 0xA5
- lsls r2, 3
- adds r1, r4, r2
- bl LZDecompressWram
- ldr r0, _0812346C @ =gCableCarPylonStemTilemap
- ldr r1, _08123470 @ =0x000009d8
- adds r4, r1
- adds r1, r4, 0
- bl LZDecompressWram
- ldr r0, _08123474 @ =gCableCarBG_Pal
- movs r1, 0
- movs r2, 0x80
- bl LoadPalette
- ldr r0, _08123478 @ =gCableCarBG_Gfx
- movs r1, 0xC0
- lsls r1, 19
- bl LZ77UnCompVram
- ldr r1, _0812347C @ =gMain
- ldr r2, _08123480 @ =0x0000043c
- adds r1, r2
- ldrb r0, [r1]
- adds r0, 0x1
- b _0812370C
- .align 2, 0
-_08123454: .4byte gUnknown_08401CF8
-_08123458: .4byte gUnknown_08401D18
-_0812345C: .4byte gCableCarMtChimneyTilemap
-_08123460: .4byte 0x02019000
-_08123464: .4byte gCableCarTreeTilemap
-_08123468: .4byte gCableCarMountainTilemap
-_0812346C: .4byte gCableCarPylonStemTilemap
-_08123470: .4byte 0x000009d8
-_08123474: .4byte gCableCarBG_Pal
-_08123478: .4byte gCableCarBG_Gfx
-_0812347C: .4byte gMain
-_08123480: .4byte 0x0000043c
-_08123484:
- bl sub_8124118
- bl RunTasks
- ldr r1, _08123498 @ =gMain
- ldr r0, _0812349C @ =0x0000043c
- adds r1, r0
- ldrb r0, [r1]
- adds r0, 0x1
- b _0812370C
- .align 2, 0
-_08123498: .4byte gMain
-_0812349C: .4byte 0x0000043c
-_081234A0:
- ldr r0, _081234B4 @ =gUnknown_02039274
- ldr r0, [r0]
- ldrb r0, [r0, 0x2]
- cmp r0, 0x7
- bne _081234BC
- ldr r1, _081234B8 @ =0x0000043c
- add r1, r9
- ldrb r0, [r1]
- adds r0, 0x1
- b _0812370C
- .align 2, 0
-_081234B4: .4byte gUnknown_02039274
-_081234B8: .4byte 0x0000043c
-_081234BC:
- ldr r0, _081234FC @ =gUnknown_08396FC4
- ldr r0, [r0]
- adds r1, r0, 0
- adds r1, 0xF0
- ldr r0, [r1]
- cmp r0, 0
- bne _081234CC
- b _0812370E
-_081234CC:
- movs r4, 0
- adds r3, r1, 0
- movs r5, 0xD
- negs r5, r5
-_081234D4:
- lsls r0, r4, 2
- adds r0, r3, r0
- ldr r2, [r0]
- cmp r2, 0
- beq _081234E6
- ldrb r1, [r2, 0x5]
- adds r0, r5, 0
- ands r0, r1
- strb r0, [r2, 0x5]
-_081234E6:
- adds r0, r4, 0x1
- lsls r0, 24
- lsrs r4, r0, 24
- cmp r4, 0x13
- bls _081234D4
- ldr r1, _08123500 @ =0x0000043c
- add r1, r9
- ldrb r0, [r1]
- adds r0, 0x1
- b _0812370C
- .align 2, 0
-_081234FC: .4byte gUnknown_08396FC4
-_08123500: .4byte 0x0000043c
-_08123504:
- ldr r0, _08123578 @ =0x0600e800
- ldr r5, _0812357C @ =0x02019168
- movs r1, 0x20
- str r1, [sp]
- movs r1, 0xF
- str r1, [sp, 0x4]
- adds r1, r5, 0
- movs r2, 0
- movs r3, 0x11
- bl sub_8124F08
- ldr r0, _08123580 @ =0x0600f000
- movs r2, 0xF0
- lsls r2, 2
- adds r1, r5, r2
- movs r2, 0x1E
- str r2, [sp]
- movs r2, 0x14
- mov r9, r2
- str r2, [sp, 0x4]
- movs r2, 0
- movs r3, 0
- bl sub_8124F08
- ldr r0, _08123584 @ =gUnknown_02039274
- mov r8, r0
- ldr r0, [r0]
- ldr r6, _08123588 @ =0x000008fc
- adds r0, r6
- ldr r1, _0812358C @ =gCableCarPylonHookTilemapEntries
- movs r2, 0x5
- str r2, [sp]
- movs r4, 0x2
- str r4, [sp, 0x4]
- movs r2, 0
- movs r3, 0
- bl sub_8124F08
- mov r1, r8
- ldr r0, [r1]
- adds r0, r6
- movs r2, 0x87
- lsls r2, 4
- adds r5, r2
- str r4, [sp]
- mov r1, r9
- str r1, [sp, 0x4]
- adds r1, r5, 0
- movs r2, 0
- movs r3, 0x2
- bl sub_8124F08
- ldr r1, _08123590 @ =gMain
- ldr r2, _08123594 @ =0x0000043c
- adds r1, r2
- ldrb r0, [r1]
- adds r0, 0x1
- b _0812370C
- .align 2, 0
-_08123578: .4byte 0x0600e800
-_0812357C: .4byte 0x02019168
-_08123580: .4byte 0x0600f000
-_08123584: .4byte gUnknown_02039274
-_08123588: .4byte 0x000008fc
-_0812358C: .4byte gCableCarPylonHookTilemapEntries
-_08123590: .4byte gMain
-_08123594: .4byte 0x0000043c
-_08123598:
- ldr r0, _08123664 @ =gSpecialVar_0x8004
- ldrb r0, [r0]
- bl sub_81248AC
- ldr r0, _08123668 @ =gUnknown_02039274
- mov r8, r0
- ldr r0, [r0]
- adds r0, 0xFC
- ldr r4, _0812366C @ =0x02019090
- movs r6, 0xC
- str r6, [sp]
- movs r5, 0x3
- str r5, [sp, 0x4]
- adds r1, r4, 0
- movs r2, 0
- movs r3, 0xE
- bl sub_8124F08
- mov r1, r8
- ldr r0, [r1]
- adds r0, 0xFC
- adds r1, r4, 0
- adds r1, 0x48
- str r6, [sp]
- str r5, [sp, 0x4]
- movs r2, 0xC
- movs r3, 0x11
- bl sub_8124F08
- mov r2, r8
- ldr r0, [r2]
- adds r0, 0xFC
- adds r1, r4, 0
- adds r1, 0x90
- str r6, [sp]
- str r5, [sp, 0x4]
- movs r2, 0x18
- movs r3, 0x14
- bl sub_8124F08
- mov r1, r8
- ldr r0, [r1]
- adds r0, 0xFC
- movs r2, 0x90
- negs r2, r2
- adds r2, r4
- mov r9, r2
- str r6, [sp]
- str r5, [sp, 0x4]
- mov r1, r9
- movs r2, 0
- movs r3, 0x11
- bl sub_8124F08
- mov r1, r8
- ldr r0, [r1]
- adds r0, 0xFC
- subs r4, 0x48
- str r6, [sp]
- str r5, [sp, 0x4]
- adds r1, r4, 0
- movs r2, 0
- movs r3, 0x14
- bl sub_8124F08
- mov r2, r8
- ldr r0, [r2]
- adds r0, 0xFC
- str r6, [sp]
- str r5, [sp, 0x4]
- mov r1, r9
- movs r2, 0xC
- movs r3, 0x14
- bl sub_8124F08
- mov r1, r8
- ldr r0, [r1]
- adds r0, 0xFC
- str r6, [sp]
- str r5, [sp, 0x4]
- adds r1, r4, 0
- movs r2, 0xC
- movs r3, 0x17
- bl sub_8124F08
- mov r2, r8
- ldr r0, [r2]
- adds r0, 0xFC
- str r6, [sp]
- str r5, [sp, 0x4]
- mov r1, r9
- movs r2, 0x18
- movs r3, 0x17
- bl sub_8124F08
- ldr r1, _08123670 @ =gMain
- ldr r0, _08123674 @ =0x0000043c
- adds r1, r0
- ldrb r0, [r1]
- adds r0, 0x1
- b _0812370C
- .align 2, 0
-_08123664: .4byte gSpecialVar_0x8004
-_08123668: .4byte gUnknown_02039274
-_0812366C: .4byte 0x02019090
-_08123670: .4byte gMain
-_08123674: .4byte 0x0000043c
-_08123678:
- movs r0, 0x1
- negs r0, r0
- movs r1, 0
- str r1, [sp]
- movs r1, 0x3
- movs r2, 0x10
- movs r3, 0
- bl BeginNormalPaletteFade
- ldr r0, _081236A4 @ =0x000001a9
- movs r1, 0x1
- bl FadeInNewBGM
- movs r0, 0x1
- bl sub_8123FBC
- ldr r1, _081236A8 @ =gMain
- ldr r2, _081236AC @ =0x0000043c
- adds r1, r2
- ldrb r0, [r1]
- adds r0, 0x1
- b _0812370C
- .align 2, 0
-_081236A4: .4byte 0x000001a9
-_081236A8: .4byte gMain
-_081236AC: .4byte 0x0000043c
-_081236B0:
- ldr r3, _081236E4 @ =0x04000208
- ldrh r2, [r3]
- movs r0, 0
- strh r0, [r3]
- ldr r4, _081236E8 @ =0x04000200
- ldrh r0, [r4]
- movs r1, 0x1
- orrs r0, r1
- strh r0, [r4]
- strh r2, [r3]
- ldr r0, _081236EC @ =sub_8123C40
- bl SetVBlankCallback
- ldr r0, _081236F0 @ =sub_8123724
- bl SetMainCallback2
- ldr r0, _081236F4 @ =sub_8123878
- movs r1, 0
- bl CreateTask
- ldr r0, _081236F8 @ =gSpecialVar_0x8004
- ldrh r0, [r0]
- cmp r0, 0
- bne _08123700
- ldr r0, _081236FC @ =sub_81239E4
- b _08123702
- .align 2, 0
-_081236E4: .4byte 0x04000208
-_081236E8: .4byte 0x04000200
-_081236EC: .4byte sub_8123C40
-_081236F0: .4byte sub_8123724
-_081236F4: .4byte sub_8123878
-_081236F8: .4byte gSpecialVar_0x8004
-_081236FC: .4byte sub_81239E4
-_08123700:
- ldr r0, _0812371C @ =sub_8123AF8
-_08123702:
- movs r1, 0x1
- bl CreateTask
- ldr r1, _08123720 @ =gUnknown_02039274
- ldr r1, [r1]
-_0812370C:
- strb r0, [r1]
-_0812370E:
- add sp, 0x10
- pop {r3,r4}
- mov r8, r3
- mov r9, r4
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0812371C: .4byte sub_8123AF8
-_08123720: .4byte gUnknown_02039274
- thumb_func_end sub_8123244
-
thumb_func_start sub_8123724
sub_8123724: @ 8123724
push {lr}
diff --git a/data/cable_car.s b/data/cable_car.s
index 3075f7651..6523e0314 100644
--- a/data/cable_car.s
+++ b/data/cable_car.s
@@ -4,47 +4,6 @@
.section .rodata
.align 2
-gCableCarMtChimneyTilemap:: @ 8401820
- .incbin "graphics/misc/cable_car_mt_chimney_map.bin.lz"
-
- .align 2
-gCableCarTreeTilemap:: @ 8401978
- .incbin "graphics/misc/cable_car_tree_map.bin.lz"
-
- .align 2
-gCableCarMountainTilemap:: @ 8401AFC
- .incbin "graphics/misc/cable_car_mountain_map.bin.lz"
-
- .align 2
-gCableCarPylonHookTilemapEntries:: @ 8401CC0
- .2byte 0x3000
- .2byte 0x3001
- .2byte 0x3002
- .2byte 0x3003
- .2byte 0x3004
- .2byte 0x3005
- .2byte 0x3006
- .2byte 0x3007
- .2byte 0x3008
- .2byte 0x3009
-
- .align 2
-gCableCarPylonStemTilemap:: @ 8401CD4
- .incbin "graphics/misc/cable_car_pylon_stem_map.bin.lz"
-
- .align 2
-gUnknown_08401CF8:: @ 8401CF8
- obj_tiles gCableCar_Gfx, 0x800, 1
- obj_tiles gCableCarDoor_Gfx, 0x40, 2
- obj_tiles gCableCarCord_Gfx, 0x80, 3
- .space 8
-
- .align 2
-gUnknown_08401D18:: @ 8401D18
- obj_pal gCableCar_Pal, 1
- .space 8
-
- .align 2
gOamData_8401D28:: @ 8401D28
.2byte 0x0300
.2byte 0xC000
diff --git a/include/cable_car_util.h b/include/cable_car_util.h
new file mode 100644
index 000000000..0f50914c8
--- /dev/null
+++ b/include/cable_car_util.h
@@ -0,0 +1,12 @@
+#ifndef GUARD_CABLE_CAR_UTIL_H
+#define GUARD_CABLE_CAR_UTIL_H
+
+// Exported type declarations
+
+// Exported RAM declarations
+
+// Exported ROM declarations
+
+void sub_8124F08(u16 *dest, const u16 *src, u8 x, u8 y, u8 width, u8 height);
+
+#endif //GUARD_CABLE_CAR_UTIL_H
diff --git a/include/field_weather.h b/include/field_weather.h
index 409f76028..790fadaea 100644
--- a/include/field_weather.h
+++ b/include/field_weather.h
@@ -47,4 +47,64 @@ bool8 sub_807DDFC(void);
void SetWeather(u32);
void UpdateWeatherPerDay(u16);
+struct WeatherSubstruct {
+ u8 filler_0[5];
+ u8 unk_5_0:2;
+ u8 unk_5_2:2;
+ u8 unk_5_4:4;
+};
+
+struct Weather
+{
+ u8 filler_000[0xf0];
+ struct WeatherSubstruct *unk_0f0[20];
+ u8 filler_140[0xc0];
+ 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 struct Weather *const gUnknown_08396FC4;
+
#endif // GUARD_WEATHER_H
diff --git a/include/gba/macro.h b/include/gba/macro.h
index 1e0254806..71ff15590 100644
--- a/include/gba/macro.h
+++ b/include/gba/macro.h
@@ -118,4 +118,34 @@
#define DmaCopy16Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 16)
#define DmaCopy32Defvars(dmaNum, src, dest, size) DmaCopyDefvars(dmaNum, src, dest, size, 32)
+#define DmaFillLarge(dmaNum, fillval, dest, size, block, bit) \
+{ \
+ void *_dest = dest; \
+ u32 _size = (u32)(size); \
+ while (1) \
+ { \
+ DmaFill##bit(dmaNum, fillval, _dest, (block)); \
+ _dest += (block); \
+ _size -= (block); \
+ if (_size <= (block)) \
+ { \
+ DmaFill##bit(dmaNum, fillval, _dest, _size); \
+ break; \
+ } \
+ } \
+}
+
+#define DmaFill16Large(dmaNum, fillval, dest, size, block) DmaFillLarge(dmaNum, fillval, dest, size, block, 16)
+#define DmaFill32Large(dmaNum, fillval, dest, size, block) DmaFillLarge(dmaNum, fillval, dest, size, block, 32)
+
+#define DmaFillDefvars(dmaNum, fillval, dest, size, bit) \
+{ \
+ void *_dest = dest; \
+ u32 _size = (u##bit)(size); \
+ DmaFill##bit(dmaNum, fillval, _dest, _size); \
+}
+
+#define DmaFill16Defvars(dmaNum, fillval, dest, size) DmaFillDefvars(dmaNum, fillval, dest, size, 16)
+#define DmaFill32Defvars(dmaNum, fillval, dest, size) DmaFillDefvars(dmaNum, fillval, dest, size, 32)
+
#endif // GUARD_GBA_MACRO_H
diff --git a/include/global.h b/include/global.h
index f0eb7401f..4604c8cbb 100644
--- a/include/global.h
+++ b/include/global.h
@@ -799,5 +799,6 @@ struct HallOfFame
extern struct HallOfFame gHallOfFame;
extern struct SaveBlock2 gSaveBlock2;
+extern u8 ewram[];
#endif // GUARD_GLOBAL_H
diff --git a/ld_script.txt b/ld_script.txt
index 4b103324e..96dce388a 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -437,6 +437,7 @@ SECTIONS {
src/battle/battle_controller_linkpartner.o(.rodata);
data/battle_message.o(.rodata);
src/field/choose_party.o(.rodata);
+ src/scene/cable_car.o(.rodata);
data/cable_car.o(.rodata);
src/engine/save.o(.rodata);
src/field/field_effect_helpers.o(.rodata);
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;
+ }
+}
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 09351240f..94388dfd6 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -580,31 +580,7 @@ gAbilitiesPerBank: @ 203926C
.space 0x4
.include "src/field/choose_party.o"
-
-@ cable_car
-
- .align 2
-gUnknown_02039274: @ 2039274
- .space 0x4
-
-gUnknown_02039278: @ 2039278
- .space 0x1
-
-gUnknown_02039279: @ 2039279
- .space 0x1
-
-gUnknown_0203927A: @ 203927A
- .space 0x1
-
-gUnknown_0203927B: @ 203927B
- .space 0x1
-
-gUnknown_0203927C: @ 203927C
- .space 0x1
-
-gUnknown_0203927D: @ 203927D
- .space 0x7
-
+ .include "src/scene/cable_car.o"
.include "src/engine/save.o"
.include "src/engine/mystery_event_script.o"
.include "src/field/roamer.o"