1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
|
PrepareForSpecialWarp::
call LoadSpecialWarpData
predef LoadTilesetHeader
ld hl, wStatusFlags6
bit BIT_FLY_OR_DUNGEON_WARP, [hl]
res BIT_FLY_OR_DUNGEON_WARP, [hl]
jr z, .debugNewGameWarp
ld a, [wDestinationMap]
jr .next
.debugNewGameWarp
bit BIT_DEBUG_MODE, [hl]
jr z, .setNewGameMatWarp ; apply to StartNewGameDebug only
call PrepareNewGameDebug
.setNewGameMatWarp
; This is called by OakSpeech during StartNewGame and
; loads the first warp event for the specified map index.
ld a, PALLET_TOWN
.next
ld b, a
ld a, [wStatusFlags3]
and a ; ???
jr nz, .next2
ld a, b
.next2
ld hl, wStatusFlags6
bit BIT_DUNGEON_WARP, [hl]
ret nz
ld [wLastMap], a
ret
LoadSpecialWarpData:
ld a, [wCableClubDestinationMap]
cp TRADE_CENTER
jr nz, .notTradeCenter
ld hl, TradeCenterPlayerWarp
ldh a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK
jr z, .copyWarpData
ld hl, TradeCenterFriendWarp
jr .copyWarpData
.notTradeCenter
cp COLOSSEUM
jr nz, .notColosseum
ld hl, ColosseumPlayerWarp
ldh a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK
jr z, .copyWarpData
ld hl, ColosseumFriendWarp
jr .copyWarpData
.notColosseum
ld a, [wStatusFlags6]
bit BIT_DEBUG_MODE, a
; warp to wLastMap (PALLET_TOWN) for StartNewGameDebug
jr nz, .notNewGameWarp
bit BIT_FLY_OR_DUNGEON_WARP, a
jr nz, .notNewGameWarp
ld hl, NewGameWarp
.copyWarpData
ld de, wCurMap
ld c, $7
.copyWarpDataLoop
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .copyWarpDataLoop
ld a, [hli]
ld [wCurMapTileset], a
xor a
jr .done
.notNewGameWarp
ld a, [wLastMap] ; this value is overwritten before it's ever read
ld hl, wStatusFlags6
bit BIT_DUNGEON_WARP, [hl]
jr nz, .usedDungeonWarp
bit BIT_ESCAPE_WARP, [hl]
res BIT_ESCAPE_WARP, [hl]
jr z, .otherDestination
ld a, [wLastBlackoutMap]
jr .usedFlyWarp
.usedDungeonWarp
ld hl, wStatusFlags3
res BIT_ON_DUNGEON_WARP, [hl]
ld a, [wDungeonWarpDestinationMap]
ld b, a
ld [wCurMap], a
ld a, [wWhichDungeonWarp]
ld c, a
ld hl, DungeonWarpList
ld de, 0
ld a, 6
ld [wDungeonWarpDataEntrySize], a
.dungeonWarpListLoop
ld a, [hli]
cp b
jr z, .matchedDungeonWarpDestinationMap
inc hl
jr .nextDungeonWarp
.matchedDungeonWarpDestinationMap
ld a, [hli]
cp c
jr z, .matchedDungeonWarpID
.nextDungeonWarp
ld a, [wDungeonWarpDataEntrySize]
add e
ld e, a
jr .dungeonWarpListLoop
.matchedDungeonWarpID
ld hl, DungeonWarpData
add hl, de
jr .copyWarpData2
.otherDestination
ld a, [wDestinationMap]
.usedFlyWarp
ld b, a
ld [wCurMap], a
ld hl, FlyWarpDataPtr
.flyWarpDataPtrLoop
ld a, [hli]
inc hl
cp b
jr z, .foundFlyWarpMatch
inc hl
inc hl
jr .flyWarpDataPtrLoop
.foundFlyWarpMatch
ld a, [hli]
ld h, [hl]
ld l, a
.copyWarpData2
ld de, wCurrentTileBlockMapViewPointer
ld c, $6
.copyWarpDataLoop2
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .copyWarpDataLoop2
xor a ; OVERWORLD
ld [wCurMapTileset], a
.done
ld [wYOffsetSinceLastSpecialWarp], a
ld [wXOffsetSinceLastSpecialWarp], a
ld a, -1 ; exclude normal warps
ld [wDestinationWarpID], a
ret
INCLUDE "data/maps/special_warps.asm"
|