summaryrefslogtreecommitdiff
path: root/event
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2015-11-16 21:46:36 -0500
committerPikalaxALT <PikalaxALT@gmail.com>2015-11-16 21:46:36 -0500
commit042fc4bfe5f55df87712d33b6f832a591b136f1a (patch)
tree6709cb7a5b303aadaa094ce216c86e7f5f117ba0 /event
parentba871547eda6e17e988f4e1dfa7b899050205d5e (diff)
Split up some more banks in main.asm
Diffstat (limited to 'event')
-rw-r--r--event/buena.asm2
-rwxr-xr-xevent/daycare.asm768
-rwxr-xr-xevent/field_moves.asm312
-rwxr-xr-xevent/magnet_train.asm485
4 files changed, 1566 insertions, 1 deletions
diff --git a/event/buena.asm b/event/buena.asm
index 3662f110d..7079c0259 100644
--- a/event/buena.asm
+++ b/event/buena.asm
@@ -11,7 +11,7 @@ SpecialBuenasPassword: ; 8af6b
add $2
ld [wMenuBorderRightCoord], a
call BackUpTiles
- call Function1e5d ; menu
+ call DoNthMenu ; menu
callba Function4ae5e
ld b, $0
ld a, [MenuSelection]
diff --git a/event/daycare.asm b/event/daycare.asm
new file mode 100755
index 000000000..3ea64d38c
--- /dev/null
+++ b/event/daycare.asm
@@ -0,0 +1,768 @@
+Special_DayCareMan: ; 166d6
+ ld hl, wDaycareMan
+ bit 0, [hl]
+ jr nz, .asm_166fe
+ ld hl, wDaycareMan
+ ld a, $0
+ call Function1678f
+ jr c, .asm_16724
+ call Function16798
+ jr c, .asm_16721
+ callba Functionde2a
+ ld hl, wDaycareMan
+ set 0, [hl]
+ call Function167f6
+ call Function16a3b
+ ret
+
+.asm_166fe
+ callba Functione698
+ ld hl, wBreedMon1Nick
+ call Function1686d
+ call Function16807
+ jr c, .asm_16721
+ callba Functiondd21
+ call Function16850
+ ld hl, wDaycareMan
+ res 0, [hl]
+ res 5, [hl]
+ jr .asm_16724
+
+.asm_16721
+ call Function1689b
+
+.asm_16724
+ ld a, $13
+ call Function1689b
+ ret
+; 1672a
+
+Special_DayCareLady: ; 1672a
+ ld hl, wDaycareLady
+ bit 0, [hl]
+ jr nz, .asm_16752
+ ld hl, wDaycareLady
+ ld a, $2
+ call Function16781
+ jr c, .asm_1677b
+ call Function16798
+ jr c, .asm_16778
+ callba Functionde37
+ ld hl, wDaycareLady
+ set 0, [hl]
+ call Function167f6
+ call Function16a3b
+ ret
+
+.asm_16752
+ callba Functione6b3
+ ld hl, wBreedMon2Nick
+ call Function1686d
+ call Function16807
+ jr c, .asm_16778
+ callba Functiondd42
+ call Function16850
+ ld hl, wDaycareLady
+ res 0, [hl]
+ ld hl, wDaycareMan
+ res 5, [hl]
+ jr .asm_1677b
+
+.asm_16778
+ call Function1689b
+
+.asm_1677b
+ ld a, $13
+ call Function1689b
+ ret
+; 16781
+
+Function16781: ; 16781
+ bit 7, [hl]
+ jr nz, .asm_16788
+ set 7, [hl]
+ inc a
+
+.asm_16788
+ call Function1689b
+ call YesNoBox
+ ret
+; 1678f
+
+Function1678f: ; 1678f
+ set 7, [hl]
+ call Function1689b
+ call YesNoBox
+ ret
+; 16798
+
+Function16798: ; 16798
+ ld a, [PartyCount]
+ cp 2
+ jr c, .asm_167e5
+ ld a, 4
+ call Function1689b
+ ld b, 6
+ callba Function5001d
+ jr c, .asm_167dd
+ ld a, [CurPartySpecies]
+ cp EGG
+ jr z, .asm_167e1
+ callba CheckCurPartyMonFainted
+ jr c, .asm_167e9
+ ld hl, PartyMon1Item
+ ld bc, PARTYMON_STRUCT_LENGTH
+ ld a, [CurPartyMon]
+ call AddNTimes
+ ld d, [hl]
+ callba ItemIsMail
+ jr c, .asm_167ed
+ ld hl, PartyMonNicknames
+ ld a, [CurPartyMon]
+ call GetNick
+ and a
+ ret
+
+.asm_167dd
+ ld a, $12
+ scf
+ ret
+
+.asm_167e1
+ ld a, $6
+ scf
+ ret
+
+.asm_167e5
+ ld a, $7
+ scf
+ ret
+
+.asm_167e9
+ ld a, $8
+ scf
+ ret
+
+.asm_167ed
+ ld a, $a
+ scf
+ ret
+; 167f1
+
+UnknownText_0x167f1: ; 0x167f1
+ ;
+ text_jump UnknownText_0x1bdaa7
+ db "@"
+; 0x167f6
+
+Function167f6: ; 167f6
+ ld a, $5
+ call Function1689b
+ ld a, [CurPartySpecies]
+ call PlayCry
+ ld a, $9
+ call Function1689b
+ ret
+; 16807
+
+Function16807: ; 16807
+ ld a, [StringBuffer2 + 1]
+ and a
+ jr nz, .asm_16819
+ ld a, $f
+ call Function1689b
+ call YesNoBox
+ jr c, .asm_16844
+ jr .asm_1682d
+
+.asm_16819
+ ld a, $b
+ call Function1689b
+ call YesNoBox
+ jr c, .asm_16844
+ ld a, $c
+ call Function1689b
+ call YesNoBox
+ jr c, .asm_16844
+
+.asm_1682d
+ ld de, Money
+ ld bc, StringBuffer2 + 2
+ callba CompareMoney
+ jr c, .asm_16848
+ ld a, [PartyCount]
+ cp $6
+ jr nc, .asm_1684c
+ and a
+ ret
+
+.asm_16844
+ ld a, $12
+ scf
+ ret
+
+.asm_16848
+ ld a, $11
+ scf
+ ret
+
+.asm_1684c
+ ld a, $10
+ scf
+ ret
+; 16850
+
+Function16850: ; 16850
+ ld bc, StringBuffer2 + 2
+ ld de, Money
+ callba TakeMoney
+ ld a, $d
+ call Function1689b
+ ld a, [CurPartySpecies]
+ call PlayCry
+ ld a, $e
+ call Function1689b
+ ret
+; 1686d
+
+Function1686d: ; 1686d
+ ld a, b
+ ld [StringBuffer2], a
+ ld a, d
+ ld [StringBuffer2 + 1], a
+ ld de, StringBuffer1
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ld hl, 0
+ ld bc, $64
+ ld a, [StringBuffer2 + 1]
+ call AddNTimes
+ ld de, $64
+ add hl, de
+ xor a
+ ld [StringBuffer2 + 2], a
+ ld a, h
+ ld [StringBuffer2 + 3], a
+ ld a, l
+ ld [StringBuffer2 + 4], a
+ ret
+; 1689b
+
+Function1689b: ; 1689b
+ ld e, a
+ ld d, 0
+ ld hl, TextTable_168aa
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call PrintText
+ ret
+; 168aa
+
+TextTable_168aa: ; 168aa
+ dw UnknownText_0x168d2
+ dw UnknownText_0x168d7
+ dw UnknownText_0x168dc
+ dw UnknownText_0x168e1
+ dw UnknownText_0x168e6
+ dw UnknownText_0x168ff
+ dw UnknownText_0x168f0
+ dw UnknownText_0x168eb
+ dw UnknownText_0x168fa
+ dw UnknownText_0x16904
+ dw UnknownText_0x168f5
+ dw UnknownText_0x16909
+ dw UnknownText_0x1690e
+ dw UnknownText_0x16913
+ dw UnknownText_0x16918
+ dw UnknownText_0x1691d
+ dw UnknownText_0x16922
+ dw UnknownText_0x16927
+ dw UnknownText_0x1692c
+ dw UnknownText_0x16931
+; 168d2
+
+UnknownText_0x168d2: ; 0x168d2
+ ; I'm the DAY-CARE MAN. Want me to raise a #MON?
+ text_jump UnknownText_0x1bdaa9
+ db "@"
+; 0x168d7
+
+UnknownText_0x168d7: ; 0x168d7
+ ; I'm the DAY-CARE MAN. Do you know about EGGS? I was raising #MON with my wife, you see. We were shocked to find an EGG! How incredible is that? So, want me to raise a #MON?
+ text_jump UnknownText_0x1bdad8
+ db "@"
+; 0x168dc
+
+UnknownText_0x168dc: ; 0x168dc
+ ; I'm the DAY-CARE LADY. Should I raise a #MON for you?
+ text_jump UnknownText_0x1bdb85
+ db "@"
+; 0x168e1
+
+UnknownText_0x168e1: ; 0x168e1
+ ; I'm the DAY-CARE LADY. Do you know about EGGS? My husband and I were raising some #MON, you see. We were shocked to find an EGG! How incredible could that be? Should I raise a #MON for you?
+ text_jump UnknownText_0x1bdbbb
+ db "@"
+; 0x168e6
+
+UnknownText_0x168e6: ; 0x168e6
+ ; What should I raise for you?
+ text_jump UnknownText_0x1bdc79
+ db "@"
+; 0x168eb
+
+UnknownText_0x168eb: ; 0x168eb
+ ; Oh? But you have just one #MON.
+ text_jump UnknownText_0x1bdc97
+ db "@"
+; 0x168f0
+
+UnknownText_0x168f0: ; 0x168f0
+ ; Sorry, but I can't accept an EGG.
+ text_jump UnknownText_0x1bdcb8
+ db "@"
+; 0x168f5
+
+UnknownText_0x168f5: ; 0x168f5
+ ; Remove MAIL before you come see me.
+ text_jump UnknownText_0x1bdcda
+ db "@"
+; 0x168fa
+
+UnknownText_0x168fa: ; 0x168fa
+ ; If you give me that, what will you battle with?
+ text_jump UnknownText_0x1bdcff
+ db "@"
+; 0x168ff
+
+UnknownText_0x168ff: ; 0x168ff
+ ; OK. I'll raise your @ .
+ text_jump UnknownText_0x1bdd30
+ db "@"
+; 0x16904
+
+UnknownText_0x16904: ; 0x16904
+ ; Come back for it later.
+ text_jump UnknownText_0x1bdd4b
+ db "@"
+; 0x16909
+
+UnknownText_0x16909: ; 0x16909
+ ; Are we geniuses or what? Want to see your @ ?
+ text_jump UnknownText_0x1bdd64
+ db "@"
+; 0x1690e
+
+UnknownText_0x1690e: ; 0x1690e
+ ; Your @ has grown a lot. By level, it's grown by @ . If you want your #MON back, it will cost ¥@ .
+ text_jump UnknownText_0x1bdd96
+ db "@"
+; 0x16913
+
+UnknownText_0x16913: ; 0x16913
+ ; Perfect! Here's your #MON.
+ text_jump UnknownText_0x1bde04
+ db "@"
+; 0x16918
+
+UnknownText_0x16918: ; 0x16918
+ ; got back @ .
+ text_jump UnknownText_0x1bde1f
+ db "@"
+; 0x1691d
+
+UnknownText_0x1691d: ; 0x1691d
+ ; Huh? Back already? Your @ needs a little more time with us. If you want your #MON back, it will cost ¥100.
+ text_jump UnknownText_0x1bde32
+ db "@"
+; 0x16922
+
+UnknownText_0x16922: ; 0x16922
+ ; You have no room for it.
+ text_jump UnknownText_0x1bdea2
+ db "@"
+; 0x16927
+
+UnknownText_0x16927: ; 0x16927
+ ; You don't have enough money.
+ text_jump UnknownText_0x1bdebc
+ db "@"
+; 0x1692c
+
+UnknownText_0x1692c: ; 0x1692c
+ ; Oh, fine then.
+ text_jump UnknownText_0x1bded9
+ db "@"
+; 0x16931
+
+UnknownText_0x16931: ; 0x16931
+ ; Come again.
+ text_jump UnknownText_0x1bdee9
+ db "@"
+; 0x16936
+
+Special_DayCareManOutside: ; 16936
+ ld hl, wDaycareMan
+ bit 6, [hl]
+ jr nz, Function16949
+ ld hl, UnknownText_0x16944
+ call PrintText
+ ret
+
+UnknownText_0x16944: ; 0x16944
+ ; Not yet…
+ text_jump UnknownText_0x1bdef6
+ db "@"
+; 0x16949
+
+Function16949: ; 16949
+ ld hl, UnknownText_0x16993
+ call PrintText
+ call YesNoBox
+ jr c, .asm_1697c
+ ld a, [PartyCount]
+ cp PARTY_LENGTH
+ jr nc, .asm_16987
+ call Function169ac
+ ld hl, wDaycareMan
+ res 6, [hl]
+ call Function16a3b
+ ld hl, UnknownText_0x16998
+ call PrintText
+ ld de, SFX_GET_EGG_FROM_DAYCARE_LADY
+ call PlaySFX
+ ld c, 120
+ call DelayFrames
+ ld hl, UnknownText_0x1699d
+ jr .asm_1697f
+
+.asm_1697c
+ ld hl, UnknownText_0x169a2
+
+.asm_1697f
+ call PrintText
+ xor a
+ ld [ScriptVar], a
+ ret
+
+.asm_16987
+ ld hl, UnknownText_0x169a7
+ call PrintText
+ ld a, $1
+ ld [ScriptVar], a
+ ret
+; 16993
+
+UnknownText_0x16993: ; 0x16993
+ ; Ah, it's you! We were raising your #MON, and my goodness, were we surprised! Your #MON had an EGG! We don't know how it got there, but your #MON had it. You want it?
+ text_jump UnknownText_0x1bdf00
+ db "@"
+; 0x16998
+
+UnknownText_0x16998: ; 0x16998
+ ; received the EGG!
+ text_jump UnknownText_0x1bdfa5
+ db "@"
+; 0x1699d
+
+UnknownText_0x1699d: ; 0x1699d
+ ; Take good care of it.
+ text_jump UnknownText_0x1bdfba
+ db "@"
+; 0x169a2
+
+UnknownText_0x169a2: ; 0x169a2
+ ; Well then, I'll keep it. Thanks!
+ text_jump UnknownText_0x1bdfd1
+ db "@"
+; 0x169a7
+
+UnknownText_0x169a7: ; 0x169a7
+ ; You have no room in your party. Come back later.
+ text_jump UnknownText_0x1bdff2
+ db "@"
+; 0x169ac
+
+Function169ac: ; 169ac
+ ld a, [wEggMonLevel]
+ ld [CurPartyLevel], a
+ ld hl, PartyCount
+ ld a, [hl]
+ cp PARTY_LENGTH
+ jr nc, .asm_16a2f
+ inc a
+ ld [hl], a
+ ld c, a
+ ld b, 0
+ add hl, bc
+ ld a, EGG
+ ld [hli], a
+ ld a, [wEggMonSpecies]
+ ld [CurSpecies], a
+ ld [CurPartySpecies], a
+ ld a, $ff
+ ld [hl], a
+ ld hl, PartyMonNicknames
+ ld bc, PKMN_NAME_LENGTH
+ call Function16a31
+ ld hl, wEggNick
+ call CopyBytes
+ ld hl, PartyMonOT
+ ld bc, NAME_LENGTH
+ call Function16a31
+ ld hl, wEggOT
+ call CopyBytes
+ ld hl, PartyMon1
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call Function16a31
+ ld hl, wEggMon
+ ld bc, wEggMonEnd - wEggMon
+ call CopyBytes
+ call GetBaseData
+ ld a, [PartyCount]
+ dec a
+ ld hl, PartyMon1
+ ld bc, PARTYMON_STRUCT_LENGTH
+ call AddNTimes
+ ld b, h
+ ld c, l
+ ld hl, MON_ID + 1
+ add hl, bc
+ push hl
+ ld hl, MON_MAXHP
+ add hl, bc
+ ld d, h
+ ld e, l
+ pop hl
+ push bc
+ ld b, $0
+ predef CalcPkmnStats
+ pop bc
+ ld hl, MON_HP
+ add hl, bc
+ xor a
+ ld [hli], a
+ ld [hl], a
+ and a
+ ret
+
+.asm_16a2f
+ scf
+ ret
+; 16a31
+
+Function16a31: ; 16a31
+ ld a, [PartyCount]
+ dec a
+ call AddNTimes
+ ld d, h
+ ld e, l
+ ret
+; 16a3b
+
+Function16a3b: ; 16a3b
+ ld a, [wDaycareLady]
+ bit 0, a
+ ret z
+ ld a, [wDaycareMan]
+ bit 0, a
+ ret z
+ callab Function16e1d
+ ld a, [wd265]
+ and a
+ ret z
+ inc a
+ ret z
+ ld hl, wDaycareMan
+ set 5, [hl]
+.asm_16a59
+ call Random
+ cp 150
+ jr c, .asm_16a59
+ ld [wStepsToEgg], a
+ jp Function16a66
+; 16a66
+
+Function16a66: ; 16a66
+ xor a
+ ld hl, wEggMon
+ ld bc, wEggMonEnd - wEggMon
+ call ByteFill
+ ld hl, wEggNick
+ ld bc, PKMN_NAME_LENGTH
+ call ByteFill
+ ld hl, wEggOT
+ ld bc, NAME_LENGTH
+ call ByteFill
+ ld a, [wBreedMon1DVs]
+ ld [TempMonDVs], a
+ ld a, [wBreedMon1DVs + 1]
+ ld [TempMonDVs + 1], a
+ ld a, [wBreedMon1Species]
+ ld [CurPartySpecies], a
+ ld a, $3
+ ld [MonType], a
+ ld a, [wBreedMon1Species]
+ cp DITTO
+ ld a, $1
+ jr z, .asm_16ab6
+ ld a, [wBreedMon2Species]
+ cp DITTO
+ ld a, $0
+ jr z, .asm_16ab6
+ callba GetGender
+ ld a, $0
+ jr z, .asm_16ab6
+ inc a
+
+.asm_16ab6
+ ld [wDittoInDaycare], a
+ and a
+ ld a, [wBreedMon1Species]
+ jr z, .asm_16ac2
+ ld a, [wBreedMon2Species]
+
+.asm_16ac2
+ ld [CurPartySpecies], a
+ callab GetPreEvolution
+ callab GetPreEvolution
+ ld a, EGG_LEVEL
+ ld [CurPartyLevel], a
+
+ ld a, [CurPartySpecies]
+ cp NIDORAN_F
+ jr nz, .asm_16ae8
+ call Random
+ cp $80
+ ld a, NIDORAN_F
+ jr c, .asm_16ae8
+ ld a, NIDORAN_M
+.asm_16ae8
+ ld [CurPartySpecies], a
+ ld [CurSpecies], a
+ ld [wEggMonSpecies], a
+
+ call GetBaseData
+ ld hl, wEggNick
+ ld de, String_16be0
+ call CopyName2
+ ld hl, PlayerName
+ ld de, wEggOT
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ xor a
+ ld [wEggMonItem], a
+ ld de, wEggMonMoves
+ xor a
+ ld [Buffer1], a
+ predef FillMoves
+ callba Function170bf
+ ld hl, wEggMonID
+ ld a, [PlayerID]
+ ld [hli], a
+ ld a, [PlayerID + 1]
+ ld [hl], a
+ ld a, [CurPartyLevel]
+ ld d, a
+ callab CalcExpAtLevel
+ ld hl, wEggMonExp
+ ld a, [hMultiplicand]
+ ld [hli], a
+ ld a, [$ffb5]
+ ld [hli], a
+ ld a, [$ffb6]
+ ld [hl], a
+ xor a
+ ld b, $a
+ ld hl, wEggMonStatExp
+.asm_16b46
+ ld [hli], a
+ dec b
+ jr nz, .asm_16b46
+ ld hl, wEggMonDVs
+ call Random
+ ld [hli], a
+ ld [TempMonDVs], a
+ call Random
+ ld [hld], a
+ ld [TempMonDVs + 1], a
+ ld de, wBreedMon1DVs
+ ld a, [wBreedMon1Species]
+ cp DITTO
+ jr z, .asm_16b98
+ ld de, wBreedMon2DVs
+ ld a, [wBreedMon2Species]
+ cp DITTO
+ jr z, .asm_16b98
+ ld a, $3
+ ld [MonType], a
+ push hl
+ callba GetGender
+ pop hl
+ ld de, wBreedMon1DVs
+ ld bc, wBreedMon2DVs
+ jr c, .asm_16bab
+ jr z, .asm_16b90
+ ld a, [wDittoInDaycare]
+ and a
+ jr z, .asm_16b98
+ ld d, b
+ ld e, c
+ jr .asm_16b98
+
+.asm_16b90
+ ld a, [wDittoInDaycare]
+ and a
+ jr nz, .asm_16b98
+ ld d, b
+ ld e, c
+
+.asm_16b98
+ ld a, [de]
+ inc de
+ and $f
+ ld b, a
+ ld a, [hl]
+ and $f0
+ add b
+ ld [hli], a
+ ld a, [de]
+ and $7
+ ld b, a
+ ld a, [hl]
+ and $f8
+ add b
+ ld [hl], a
+
+.asm_16bab
+ ld hl, StringBuffer1
+ ld de, wd050
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ld hl, wEggMonMoves
+ ld de, wEggMonPP
+ predef FillPP
+ ld hl, wd050
+ ld de, StringBuffer1
+ ld bc, NAME_LENGTH
+ call CopyBytes
+ ld a, [BaseEggSteps]
+ ld hl, wEggMonHappiness
+ ld [hli], a
+ xor a
+rept 2
+ ld [hli], a
+endr
+ ld [hl], a
+ ld a, [CurPartyLevel]
+ ld [wEggMonLevel], a
+ ret
+; 16be0
+
+String_16be0: ; 16be0
+ db "EGG@"
+; 16be4
diff --git a/event/field_moves.asm b/event/field_moves.asm
new file mode 100755
index 000000000..d6fa4a0bb
--- /dev/null
+++ b/event/field_moves.asm
@@ -0,0 +1,312 @@
+PlayWhirlpoolSound: ; 8c7d4
+ call WaitSFX
+ ld de, SFX_SURF
+ call PlaySFX
+ call WaitSFX
+ ret
+; 8c7e1
+
+BlindingFlash: ; 8c7e1
+ callba FadeOutPalettes
+ ld hl, StatusFlags
+ set 2, [hl]
+ callba Function8c0e5
+ callba Function8c001
+ ld b, SCGB_09
+ call GetSGBLayout
+ callba Function49409
+ callba FadeInPalettes
+ ret
+; 8c80a
+
+ShakeHeadbuttTree: ; 8c80a
+ callba Function8cf53
+ ld de, CutGrassGFX
+ ld hl, VTiles1
+ lb bc, BANK(CutGrassGFX), 4
+ call Request2bpp
+ ld de, HeadbuttTreeGFX
+ ld hl, VTiles1 tile $04
+ lb bc, BANK(HeadbuttTreeGFX), 8
+ call Request2bpp
+ call Function8cad3
+ ld a, SPRITE_ANIM_INDEX_1B
+ call _InitSpriteAnimStruct
+ ld hl, $3
+ add hl, bc
+ ld [hl], $84
+ ld a, $90
+ ld [wc3b5], a
+ callba Function8cf7a
+ call GetHeadbuttTreeRelativeLocation
+ ld a, $20
+ ld [wcf64], a
+ call WaitSFX
+ ld de, SFX_SANDSTORM
+ call PlaySFX
+.loop
+ ld hl, wcf64
+ ld a, [hl]
+ and a
+ jr z, .done
+ dec [hl]
+ ld a, $90
+ ld [wc3b5], a
+ callba Function8cf7a
+ call DelayFrame
+ jr .loop
+
+.done
+ call OverworldTextModeSwitch
+ call WaitBGMap
+ xor a
+ ld [hBGMapMode], a
+ callba Function8cf53
+ ld hl, Sprites + $90
+ ld bc, $10
+ xor a
+ call ByteFill
+ ld de, Font
+ ld hl, VTiles1
+ lb bc, BANK(Font), $c
+ call Get1bpp
+ call ReplaceKrisSprite
+ ret
+; 8c893
+
+HeadbuttTreeGFX: ; 8c893
+INCBIN "gfx/unknown/08c893.2bpp"
+; 8c913
+
+GetHeadbuttTreeRelativeLocation: ; 8c913
+ xor a
+ ld [hBGMapMode], a
+ ld a, [PlayerDirection]
+ and %00001100
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, TreeRelativeLocationTable
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ ld a, $5
+ ld [hli], a
+ ld [hld], a
+ ld bc, SCREEN_WIDTH
+ add hl, bc
+ ld [hli], a
+ ld [hld], a
+ call WaitBGMap
+ xor a
+ ld [hBGMapMode], a
+ ret
+; 8c938
+
+TreeRelativeLocationTable: ; 8c938
+ dwcoord 8, 8 + 2 ; RIGHT
+ dwcoord 8, 8 - 2 ; LEFT
+ dwcoord 8 - 2, 8 ; DOWN
+ dwcoord 8 + 2, 8 ; UP
+; 8c940
+
+OWCutAnimation: ; 8c940
+ ld a, e
+ and $1
+ ld [wJumptableIndex], a
+ call .LoadCutGFX
+ call WaitSFX
+ ld de, SFX_PLACE_PUZZLE_PIECE_DOWN
+ call PlaySFX
+.loop
+ ld a, [wJumptableIndex]
+ bit 7, a
+ jr nz, .finish
+ ld a, $90
+ ld [wc3b5], a
+ callab Function8cf7a
+ call OWCutJumptable
+ call DelayFrame
+ jr .loop
+
+.finish
+ ret
+; 8c96d
+
+.LoadCutGFX: ; 8c96d
+ callab Function8cf53 ; pointless to farcall
+ ld de, CutGrassGFX
+ ld hl, VTiles1
+ lb bc, BANK(CutGrassGFX), 4
+ call Request2bpp
+ ld de, CutTreeGFX
+ ld hl, VTiles1 tile $4
+ lb bc, BANK(CutTreeGFX), 4
+ call Request2bpp
+ ret
+; 8c98c
+
+CutTreeGFX: ; c898c
+INCBIN "gfx/misc/cut_tree.2bpp"
+; c89cc
+
+CutGrassGFX: ; 8c9cc
+INCBIN "gfx/misc/cut_grass.2bpp"
+; 8ca0c
+
+OWCutJumptable: ; 8ca0c
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, .jumptable
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 8ca1b
+
+
+.jumptable: ; 8ca1b (23:4a1b)
+ dw Function8ca23
+ dw Function8ca3c
+ dw Function8ca5c
+ dw Function8ca64
+
+
+Function8ca23: ; 8ca23 (23:4a23)
+ call Function8cad3
+ ld a, SPRITE_ANIM_INDEX_17 ; leaf
+ call _InitSpriteAnimStruct
+ ld hl, $3
+ add hl, bc
+ ld [hl], $84
+ ld a, $20
+ ld [wcf64], a
+ ld hl, wJumptableIndex
+rept 2
+ inc [hl]
+endr
+ ret
+
+Function8ca3c: ; 8ca3c (23:4a3c)
+ call Function8ca8e
+ xor a
+ call Function8ca73
+ ld a, $10
+ call Function8ca73
+ ld a, $20
+ call Function8ca73
+ ld a, $30
+ call Function8ca73
+ ld a, $20
+ ld [wcf64], a
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+
+Function8ca5c: ; 8ca5c (23:4a5c)
+ ld a, $1
+ ld [hBGMapMode], a
+ ld hl, wJumptableIndex
+ inc [hl]
+
+Function8ca64: ; 8ca64 (23:4a64)
+ ld hl, wcf64
+ ld a, [hl]
+ and a
+ jr z, .asm_8ca6d
+ dec [hl]
+ ret
+.asm_8ca6d
+ ld hl, wJumptableIndex
+ set 7, [hl]
+ ret
+
+Function8ca73: ; 8ca73 (23:4a73)
+ push de
+ push af
+ ld a, SPRITE_ANIM_INDEX_16 ; fly takeoff
+ call _InitSpriteAnimStruct
+ ld hl, $3
+ add hl, bc
+ ld [hl], $80
+ ld hl, $e
+ add hl, bc
+ ld [hl], $4
+ pop af
+ ld hl, $c
+ add hl, bc
+ ld [hl], a
+ pop de
+ ret
+
+Function8ca8e: ; 8ca8e (23:4a8e)
+ ld de, 0
+ ld a, [wd197]
+ bit 0, a
+ jr z, .asm_8ca9a
+ set 0, e
+.asm_8ca9a
+ ld a, [wd196]
+ bit 0, a
+ jr z, .asm_8caa3
+ set 1, e
+.asm_8caa3
+ ld a, [PlayerDirection]
+ and $c
+ add e
+ ld e, a
+ ld hl, Unknown_8cab3
+rept 2
+ add hl, de
+endr
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ret
+; 8cab3 (23:4ab3)
+
+Unknown_8cab3: ; 8cab3
+ db $58, $60
+ db $48, $60
+ db $58, $70
+ db $48, $70
+ db $58, $40
+ db $48, $40
+ db $58, $50
+ db $48, $50
+ db $38, $60
+ db $48, $60
+ db $38, $50
+ db $48, $50
+ db $58, $60
+ db $68, $60
+ db $58, $50
+ db $68, $50
+; 8cad3
+
+Function8cad3: ; 8cad3 (23:4ad3)
+ ld a, [PlayerDirection]
+ and $c
+ srl a
+ ld e, a
+ ld d, 0
+ ld hl, Unknown_8cae5
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ret
+; 8cae5 (23:4ae5)
+
+Unknown_8cae5: ; 8cae5
+ db $50, $68
+ db $50, $48
+ db $40, $58
+ db $60, $58
+; 8caed
diff --git a/event/magnet_train.asm b/event/magnet_train.asm
new file mode 100755
index 000000000..2c215ee63
--- /dev/null
+++ b/event/magnet_train.asm
@@ -0,0 +1,485 @@
+Special_MagnetTrain: ; 8cc04
+ ld a, [ScriptVar]
+ and a
+ jr nz, .ToGoldenrod
+ ld a, 1 ; forwards
+ lb bc, $40, $60
+ ld de, $fca0
+ jr .continue
+
+.ToGoldenrod
+ ld a, -1 ; backwards
+ lb bc, $c0, $a0
+ ld de, $b460
+
+.continue
+ ld h, a
+ ld a, [rSVBK]
+ push af
+ ld a, $5
+ ld [rSVBK], a
+ ld a, h
+ ld [w5_d191], a
+ ld a, c
+ ld [w5_d192], a
+ ld a, b
+ ld [w5_d193], a
+ ld a, e
+ ld [w5_d194], a
+ ld a, d
+ ld [w5_d195], a
+ ld a, [hSCX]
+ push af
+ ld a, [hSCY]
+ push af
+ call Function8ccc9
+ ld hl, hVBlank
+ ld a, [hl]
+ push af
+ ld [hl], $1
+.loop
+ ld a, [wJumptableIndex]
+ and a
+ jr z, .initialize
+ bit 7, a
+ jr nz, .done
+ callab Function8cf69
+ call Function8cdf7
+ call Function8cc99
+ call Function3b0c
+ call DelayFrame
+ jr .loop
+
+.initialize
+ call Function8ceae
+ jr .loop
+
+.done
+ pop af
+ ld [hVBlank], a
+ call ClearBGPalettes
+ xor a
+ ld [hLCDStatCustom], a
+ ld [hLCDStatCustom + 1], a
+ ld [hLCDStatCustom + 2], a
+ ld [hSCX], a
+ ld [Requested2bppSource], a
+ ld [Requested2bppSource + 1], a
+ ld [Requested2bppDest], a
+ ld [Requested2bppDest + 1], a
+ ld [Requested2bpp], a
+ call ClearTileMap
+ pop af
+ ld [hSCY], a
+ pop af
+ ld [hSCX], a
+ xor a
+ ld [hBGMapMode], a
+ pop af
+ ld [rSVBK], a
+ ret
+; 8cc99
+
+Function8cc99: ; 8cc99
+ ld hl, LYOverridesBackup
+ ld c, $2f
+ ld a, [wcf64]
+ add a
+ ld [hSCX], a
+ call Function8ccc4
+ ld c, $30
+ ld a, [wcf65]
+ call Function8ccc4
+ ld c, $31
+ ld a, [wcf64]
+ add a
+ call Function8ccc4
+ ld a, [wd191]
+ ld d, a
+ ld hl, wcf64
+ ld a, [hl]
+rept 2
+ add d
+endr
+ ld [hl], a
+ ret
+; 8ccc4
+
+Function8ccc4: ; 8ccc4
+.asm_8ccc4
+ ld [hli], a
+ dec c
+ jr nz, .asm_8ccc4
+ ret
+; 8ccc9
+
+Function8ccc9: ; 8ccc9
+ call ClearBGPalettes
+ call ClearSprites
+ call DisableLCD
+ callab Function8cf53
+ call SetMagnetTrainPals
+ call DrawMagnetTrain
+ ld a, $90
+ ld [hWY], a
+ call EnableLCD
+ xor a
+ ld [hBGMapMode], a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld a, [rSVBK]
+ push af
+ ld a, $1
+ ld [rSVBK], a
+ callba GetPlayerIcon
+ pop af
+ ld [rSVBK], a
+ ld hl, VTiles0
+ ld c, $4
+ call Request2bpp
+ ld hl, $c0
+ add hl, de
+ ld d, h
+ ld e, l
+ ld hl, VTiles0 tile $04
+ ld c, $4
+ call Request2bpp
+ call Function8cda6
+ ld hl, wJumptableIndex
+ xor a
+ ld [hli], a
+ ld a, [wd192]
+rept 3
+ ld [hli], a
+endr
+ ld de, MUSIC_MAGNET_TRAIN
+ call PlayMusic2
+ ret
+; 8cd27
+
+DrawMagnetTrain: ; 8cd27
+ ld hl, VBGMap0
+ xor a
+.asm_8cd2b
+ call GetMagnetTrainBGTiles
+ ld b, 32 / 2
+ call .FillAlt
+ inc a
+ cp $12
+ jr c, .asm_8cd2b
+ ld hl, VBGMap0 tile $0c
+ ld de, MagnetTrainTilemap1
+ ld c, 20
+ call .FillLine
+ ld hl, VBGMap0 tile $0e
+ ld de, MagnetTrainTilemap2
+ ld c, 20
+ call .FillLine
+ ld hl, VBGMap0 tile $10
+ ld de, MagnetTrainTilemap3
+ ld c, 20
+ call .FillLine
+ ld hl, VBGMap0 tile $12
+ ld de, MagnetTrainTilemap4
+ ld c, 20
+ call .FillLine
+ ret
+; 8cd65
+
+.FillLine ; 8cd65
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .FillLine
+ ret
+; 8cd6c
+
+.FillAlt ; 8cd6c
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ inc hl
+ dec b
+ jr nz, .FillAlt
+ ret
+; 8cd74
+
+GetMagnetTrainBGTiles: ; 8cd74
+ push hl
+ ld e, a
+ ld d, 0
+ ld hl, MagnetTrainBGTiles
+rept 2
+ add hl, de
+endr
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ pop hl
+ ret
+; 8cd82
+
+MagnetTrainBGTiles: ; 8cd82
+; Alternating tiles for each line
+; of the Magnet Train tilemap.
+ db $4c, $4d ; bush
+ db $5c, $5d ; bush
+ db $4c, $4d ; bush
+ db $5c, $5d ; bush
+ db $08, $08 ; fence
+ db $18, $18 ; fence
+ db $1f, $1f ; track
+ db $31, $31 ; track
+ db $11, $11 ; track
+ db $11, $11 ; track
+ db $0d, $0d ; track
+ db $31, $31 ; track
+ db $04, $04 ; fence
+ db $18, $18 ; fence
+ db $4c, $4d ; bush
+ db $5c, $5d ; bush
+ db $4c, $4d ; bush
+ db $5c, $5d ; bush
+; 8cda6
+
+Function8cda6: ; 8cda6
+ ld hl, LYOverrides
+ ld bc, $90
+ ld a, [wd192]
+ call ByteFill
+ ld hl, LYOverridesBackup
+ ld bc, $90
+ ld a, [wd192]
+ call ByteFill
+ ld a, $43
+ ld [hLCDStatCustom], a
+ ret
+; 8cdc3
+
+SetMagnetTrainPals: ; 8cdc3
+ ld a, $1
+ ld [rVBK], a
+
+ ; bushes
+ ld hl, VBGMap0
+ ld bc, 8 tiles
+ ld a, $2
+ call ByteFill
+
+ ; train
+ ld hl, VBGMap0 tile $08
+ ld bc, 20 tiles
+ xor a
+ call ByteFill
+
+ ; more bushes
+ ld hl, VBGMap0 tile $1c
+ ld bc, 8 tiles
+ ld a, $2
+ call ByteFill
+
+ ; train window
+ ld hl, VBGMap0 tile $10 + 7
+ ld bc, 6
+ ld a, $4
+ call ByteFill
+
+ ld a, $0
+ ld [rVBK], a
+ ret
+; 8cdf7
+
+Function8cdf7: ; 8cdf7
+ ld a, [wJumptableIndex]
+ ld e, a
+ ld d, 0
+ ld hl, Jumptable_8ce06
+rept 2
+ add hl, de
+endr
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+; 8ce06
+
+Jumptable_8ce06: ; 8ce06
+ dw Function8ce19
+ dw Function8ce6d
+ dw Function8ce47
+ dw Function8ce6d
+ dw Function8ce7a
+ dw Function8ce6d
+ dw Function8cea2
+; 8ce14
+
+Function8ce14: ; 8ce14
+ ld hl, wJumptableIndex
+ inc [hl]
+ ret
+; 8ce19
+
+Function8ce19: ; 8ce19
+ ld d, $55
+ ld a, [wd194 + 1]
+ ld e, a
+ ld b, SPRITE_ANIM_INDEX_15
+ ld a, [rSVBK]
+ push af
+ ld a, $1
+ ld [rSVBK], a
+ ld a, [PlayerGender]
+ bit 0, a
+ jr z, .asm_8ce31
+ ld b, SPRITE_ANIM_INDEX_1F
+
+.asm_8ce31
+ pop af
+ ld [rSVBK], a
+ ld a, b
+ call _InitSpriteAnimStruct
+ ld hl, $3
+ add hl, bc
+ ld [hl], $0
+ call Function8ce14
+ ld a, $80
+ ld [wcf66], a
+ ret
+; 8ce47
+
+Function8ce47: ; 8ce47
+ ld hl, wd193
+ ld a, [wcf65]
+ cp [hl]
+ jr z, .asm_8ce64
+ ld e, a
+ ld a, [wd191]
+ xor $ff
+ inc a
+ add e
+ ld [wcf65], a
+ ld hl, wc3c0
+ ld a, [wd191]
+ add [hl]
+ ld [hl], a
+ ret
+
+.asm_8ce64
+ call Function8ce14
+ ld a, $80
+ ld [wcf66], a
+ ret
+; 8ce6d
+
+Function8ce6d: ; 8ce6d
+ ld hl, wcf66
+ ld a, [hl]
+ and a
+ jr z, .asm_8ce76
+ dec [hl]
+ ret
+
+.asm_8ce76
+ call Function8ce14
+ ret
+; 8ce7a
+
+Function8ce7a: ; 8ce7a
+ ld hl, wd194
+ ld a, [wcf65]
+ cp [hl]
+ jr z, .asm_8ce9e
+ ld e, a
+ ld a, [wd191]
+ xor $ff
+ inc a
+ ld d, a
+ ld a, e
+rept 2
+ add d
+endr
+ ld [wcf65], a
+ ld hl, wc3c0
+ ld a, [wd191]
+ ld d, a
+ ld a, [hl]
+rept 2
+ add d
+endr
+ ld [hl], a
+ ret
+
+ ret
+
+.asm_8ce9e
+ call Function8ce14
+ ret
+; 8cea2
+
+Function8cea2: ; 8cea2
+ ld a, $80
+ ld [wJumptableIndex], a
+ ld de, SFX_TRAIN_ARRIVED
+ call PlaySFX
+ ret
+; 8ceae
+
+Function8ceae: ; 8ceae
+ callba Function8cf69
+ call Function8cdf7
+ call Function8cc99
+ call Function3b0c
+ call DelayFrame
+ ld a, [rSVBK]
+ push af
+ ld a, $1
+ ld [rSVBK], a
+ ld a, [TimeOfDayPal]
+ push af
+ ld a, [wPermission]
+ push af
+ ld a, [TimeOfDay]
+ and $3
+ ld [TimeOfDayPal], a
+ ld a, $1
+ ld [wPermission], a
+ ld b, SCGB_09
+ call GetSGBLayout
+ call UpdateTimePals
+ ld a, [rBGP]
+ ld [wcfc7], a
+ ld a, [rOBP0]
+ ld [wcfc8], a
+ ld a, [rOBP1]
+ ld [wcfc9], a
+ pop af
+ ld [wPermission], a
+ pop af
+ ld [TimeOfDayPal], a
+ pop af
+ ld [rSVBK], a
+ ret
+; 8ceff
+
+MagnetTrainTilemap1:
+ db $1f, $05, $06, $0a, $0a
+ db $0a, $09, $0a, $0a, $0a
+ db $0a, $0a, $0a, $09, $0a
+ db $0a, $0a, $0b, $0c, $1f
+MagnetTrainTilemap2:
+ db $14, $15, $16, $1a, $1a
+ db $1a, $19, $1a, $1a, $1a
+ db $1a, $1a, $1a, $19, $1a
+ db $1a, $1a, $1b, $1c, $1d
+MagnetTrainTilemap3:
+ db $24, $25, $26, $27, $07
+ db $2f, $29, $28, $28, $28
+ db $28, $28, $28, $29, $07
+ db $2f, $2a, $2b, $2c, $2d
+MagnetTrainTilemap4:
+ db $20, $1f, $2e, $1f, $17
+ db $00, $2e, $1f, $1f, $1f
+ db $1f, $1f, $1f, $2e, $17
+ db $00, $1f, $2e, $1f, $0f
+; 8cf4f