summaryrefslogtreecommitdiff
path: root/home/overworld.asm
blob: ee111a87c94cdfb55c846938de8d4d4c31c79536 (plain)
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
INCLUDE "constants.asm"


SECTION "home/overworld.asm@Startmenu and Select Button Check", ROM0

OverworldStartButtonCheck::
	ldh a, [hJoyState]
	bit START_F, a
	ret z
	and (START | B_BUTTON)
	cp (START | B_BUTTON)
	jr nz, .regularMenu
	ld a, [wDebugFlags]
	bit DEBUG_FIELD_F, a
	ret z              ; debug disabled
	callba FieldDebugMenu
	jr CheckStartmenuSelectHook
.regularMenu
	callba DisplayStartMenu
	jr CheckStartmenuSelectHook
SelectButtonFunction::
	callab CheckRegisteredItem
CheckStartmenuSelectHook:
	ldh a, [hStartmenuCloseAndSelectHookEnable]
	and a
	ret z          ; hook is disabled
	ld hl, wQueuedScriptAddr
	ld a, [hli]
	ld h, [hl]
	ld l, a
	ld a, [wQueuedScriptBank]
	call FarCall_hl
	ld hl, hStartmenuCloseAndSelectHookEnable
	xor a
	ld [hli], a    ; clear hook enable and ???
	ld [hl], a
	dec a
	ret

Function2c4a:
; copy of Function2ba8
; calling Functiond4e6 instead of Functiond6e4
.loop
	call Function2c5a
	and a
	ld a, [$cb6e]
	bit 5, a
	ret z
	bit 6, a
	jr z, .loop
	scf
	ret

Function2c5a:
	ldh a, [hROMBank]
	push af
	ld a, BANK(Function50b9)
	call Bankswitch
	call Function50b9
	call Function18a0
	ld a, BANK(Functiond4e6)
	call Bankswitch
	call Functiond4e6
	ld a, BANK(_UpdateSprites)
	call Bankswitch
	call _UpdateSprites
	call DelayFrame
	call UpdateToolgear
	ld hl, wToolgearFlags
	set 2, [hl]
	call DelayFrame
	pop af
	call Bankswitch
	ret

UpdateAndTransferToolgear:
	call DelayFrame
	call UpdateToolgear
	ld hl, wToolgearFlags
	set 2, [hl] ;  ; transfer toolgear to window
	call DelayFrame
	ret

ScheduleNorthRowRedraw:
	coord hl, 0, 0
	call CopyToRedrawRowOrColumnSrcTiles
	ld a, [wBGMapAnchor]
	ldh [hRedrawRowOrColumnDest], a
	ld a, [wBGMapAnchor + 1]
	ldh [hRedrawRowOrColumnDest + 1], a
	ld a, REDRAW_ROW
	ldh [hRedrawRowOrColumnMode], a
	ret

ScheduleSouthRowRedraw:
	coord hl, 0, SCREEN_HEIGHT - 2
	call CopyToRedrawRowOrColumnSrcTiles
	ld a, [wBGMapAnchor]
	ld l, a
	ld a, [wBGMapAnchor + 1]
	ld h, a
	ld bc, BG_MAP_WIDTH * (SCREEN_HEIGHT - 2)
	add hl, bc
	; the following 4 lines wrap us from bottom to top if necessary
	ld a, h
	and HIGH(vBGMap1 - vBGMap0 - $01)
	or HIGH(vBGMap0)
	ldh [hRedrawRowOrColumnDest + 1], a
	ld a, l
	ldh [hRedrawRowOrColumnDest], a
	ld a, REDRAW_ROW
	ldh [hRedrawRowOrColumnMode], a
	ret

ScheduleEastColumnRedraw:
	coord hl, SCREEN_WIDTH - 2, 0
	call ScheduleColumnRedrawHelper
	ld a, [wBGMapAnchor]
	ld c, a
	and ($FF ^ (BG_MAP_WIDTH - 1))  ; mask upper address bits
	ld b, a
	ld a, c
	add SCREEN_WIDTH - 2
	and BG_MAP_WIDTH - 1            ; mask lower address bits
	or b
	ldh [hRedrawRowOrColumnDest], a
	ld a, [wBGMapAnchor + 1]
	ldh [hRedrawRowOrColumnDest + 1], a
	ld a, REDRAW_COL
	ldh [hRedrawRowOrColumnMode], a
	ret

ScheduleWestColumnRedraw:
	coord hl, 0, 0
	call ScheduleColumnRedrawHelper
	ld a, [wBGMapAnchor]
	ldh [hRedrawRowOrColumnDest], a
	ld a, [wBGMapAnchor + 1]
	ldh [hRedrawRowOrColumnDest + 1], a
	ld a, REDRAW_COL
	ldh [hRedrawRowOrColumnMode], a
	ret

CopyToRedrawRowOrColumnSrcTiles:
	ld de, wRedrawRowOrColumnSrcTiles
	ld c, 2 * SCREEN_WIDTH
.loop
	ld a, [hli]
	ld [de], a
	inc de
	dec c
	jr nz, .loop
	ret

ScheduleColumnRedrawHelper:
	ld de, wRedrawRowOrColumnSrcTiles
	ld c, SCREEN_HEIGHT
.loop
	ld a, [hli]
	ld [de], a
	inc de
	ld a, [hl]
	ld [de], a
	inc de
	ld a, SCREEN_WIDTH - 1
	add l
	ld l, a
	jr nc, .noCarry
	inc h
.noCarry
	dec c
	jr nz, .loop
	ret


SECTION "home/overworld.asm@QueueScript", ROM0

QueueScript::
; Install a function that is called as soon as
; the start menu is closed or directly after
; the select button function ran
	ld [wQueuedScriptBank], a
	ld a, l
	ld [wQueuedScriptAddr], a
	ld a, h
	ld [wQueuedScriptAddr + 1], a
	ret