Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pret
GitHub Repository: pret/pokered
Path: blob/master/macros/scripts/maps.asm
1271 views
1
MACRO def_object_events
2
REDEF _NUM_OBJECT_EVENTS EQUS "_NUM_OBJECT_EVENTS_\@"
3
db {_NUM_OBJECT_EVENTS}
4
DEF {_NUM_OBJECT_EVENTS} = 0
5
ENDM
6
7
;\1 x position
8
;\2 y position
9
;\3 sprite id
10
;\4 movement (WALK/STAY)
11
;\5 range or direction
12
;\6 text id
13
;\7 items only: item id
14
;\7 trainers only: trainer class/pokemon id
15
;\8 trainers only: trainer number/pokemon level
16
MACRO object_event
17
db \3
18
db \2 + 4
19
db \1 + 4
20
db \4
21
db \5
22
IF _NARG > 7
23
db TRAINER | \6
24
db \7
25
db \8
26
ELIF _NARG > 6
27
db ITEM | \6
28
db \7
29
ELSE
30
db \6
31
ENDC
32
; items and trainers don't use a typical text id
33
IF _NARG > 6
34
REDEF _OBJECT_EVENT_{d:{_NUM_OBJECT_EVENTS}}_TEXT_ID EQUS "0"
35
ELSE
36
REDEF _OBJECT_EVENT_{d:{_NUM_OBJECT_EVENTS}}_TEXT_ID EQUS "\6"
37
ENDC
38
DEF {_NUM_OBJECT_EVENTS} += 1
39
ENDM
40
41
MACRO def_warp_events
42
REDEF _NUM_WARP_EVENTS EQUS "_NUM_WARP_EVENTS_\@"
43
db {_NUM_WARP_EVENTS}
44
DEF {_NUM_WARP_EVENTS} = 0
45
ENDM
46
47
;\1 x position
48
;\2 y position
49
;\3 destination map (-1 = wLastMap)
50
;\4 destination warp id; starts at 1 (internally at 0)
51
MACRO warp_event
52
db \2, \1, \4 - 1, \3
53
DEF _WARP_{d:{_NUM_WARP_EVENTS}}_X = \1
54
DEF _WARP_{d:{_NUM_WARP_EVENTS}}_Y = \2
55
DEF {_NUM_WARP_EVENTS} += 1
56
ENDM
57
58
MACRO def_bg_events
59
REDEF _NUM_BG_EVENTS EQUS "_NUM_BG_EVENTS_\@"
60
db {_NUM_BG_EVENTS}
61
DEF {_NUM_BG_EVENTS} = 0
62
ENDM
63
64
;\1 x position
65
;\2 y position
66
;\3 sign id
67
MACRO bg_event
68
db \2, \1, \3
69
REDEF _BG_EVENT_{d:{_NUM_BG_EVENTS}}_TEXT_ID EQUS "\3"
70
DEF {_NUM_BG_EVENTS} += 1
71
ENDM
72
73
;\1 source map
74
MACRO def_warps_to
75
ASSERT {_NUM_WARP_EVENTS} <= MAX_WARP_EVENTS, \
76
"Too many warp_events (above {d:MAX_WARP_EVENTS})!"
77
ASSERT {_NUM_BG_EVENTS} <= MAX_BG_EVENTS, \
78
"Too many bg_events (above {d:MAX_BG_EVENTS})!"
79
ASSERT {_NUM_OBJECT_EVENTS} <= MAX_OBJECT_EVENTS, \
80
"Too many object_events (above {d:MAX_OBJECT_EVENTS})!"
81
; text ID values are significant (see DisplayTextID in home/text_scripts.asm)
82
FOR n, {_NUM_BG_EVENTS}
83
ASSERT {_BG_EVENT_{d:n}_TEXT_ID} > {_NUM_OBJECT_EVENTS}, \
84
"A bg_event has text ID {_BG_EVENT_{d:n}_TEXT_ID} expected for an object_event ({d:{_NUM_OBJECT_EVENTS}} or below)"
85
ENDR
86
FOR n, {_NUM_OBJECT_EVENTS}
87
ASSERT {_OBJECT_EVENT_{d:n}_TEXT_ID} <= {_NUM_OBJECT_EVENTS}, \
88
"An object_event has text ID {_OBJECT_EVENT_{d:n}_TEXT_ID} expected for a bg_event (above {d:{_NUM_OBJECT_EVENTS}})"
89
ENDR
90
FOR n, {_NUM_WARP_EVENTS}
91
warp_to _WARP_{d:n}_X, _WARP_{d:n}_Y, \1_WIDTH
92
ENDR
93
ENDM
94
95
;\1 x position
96
;\2 y position
97
;\3 map width
98
MACRO warp_to
99
event_displacement \3, \1, \2
100
ENDM
101
102
103
;\1 first bit offset / first object id
104
MACRO def_trainers
105
IF _NARG == 1
106
DEF CURRENT_TRAINER_BIT = \1
107
ELSE
108
DEF CURRENT_TRAINER_BIT = 1
109
ENDC
110
ENDM
111
112
;\1 event flag
113
;\2 view range
114
;\3 TextBeforeBattle
115
;\4 TextEndBattle
116
;\5 TextAfterBattle
117
MACRO trainer
118
DEF _ev_bit = \1 % 8
119
DEF _cur_bit = CURRENT_TRAINER_BIT % 8
120
ASSERT _ev_bit == _cur_bit, \
121
"Expected \1 to be bit {d:_cur_bit}, got {d:_ev_bit}"
122
db CURRENT_TRAINER_BIT
123
db \2 << 4
124
dw wEventFlags + (\1 - CURRENT_TRAINER_BIT) / 8
125
dw \3, \5, \4, \4
126
DEF CURRENT_TRAINER_BIT += 1
127
ENDM
128
129
;\1 x position
130
;\2 y position
131
;\3 movement data
132
MACRO map_coord_movement
133
dbmapcoord \1, \2
134
dw \3
135
ENDM
136
137
138
;\1 map name
139
;\2 map id
140
;\3 tileset
141
;\4 connections: combo of NORTH, SOUTH, WEST, and/or EAST, or 0 for none
142
MACRO map_header
143
DEF CURRENT_MAP_WIDTH = \2_WIDTH
144
DEF CURRENT_MAP_HEIGHT = \2_HEIGHT
145
DEF CURRENT_MAP_OBJECT EQUS "\1_Object"
146
\1_h::
147
db \3
148
db CURRENT_MAP_HEIGHT, CURRENT_MAP_WIDTH
149
dw \1_Blocks
150
dw \1_TextPointers
151
dw \1_Script
152
db \4
153
ENDM
154
155
; Comes after map_header and connection macros
156
MACRO end_map_header
157
dw {CURRENT_MAP_OBJECT}
158
PURGE CURRENT_MAP_WIDTH, CURRENT_MAP_HEIGHT, CURRENT_MAP_OBJECT
159
ENDM
160
161
; Connections go in order: north, south, west, east
162
;\1 direction
163
;\2 map name
164
;\3 map id
165
;\4 offset of the target map relative to the current map
166
; (x offset for east/west, y offset for north/south)
167
MACRO connection
168
169
; Calculate tile offsets for source (current) and target maps
170
DEF _src = 0
171
DEF _tgt = (\4) + 3
172
IF _tgt < 2
173
DEF _src = -_tgt
174
DEF _tgt = 0
175
ENDC
176
177
IF !STRCMP("\1", "north")
178
DEF _blk = \3_WIDTH * (\3_HEIGHT - 3) + _src
179
DEF _map = _tgt
180
DEF _win = (\3_WIDTH + 6) * \3_HEIGHT + 1
181
DEF _y = \3_HEIGHT * 2 - 1
182
DEF _x = (\4) * -2
183
DEF _len = CURRENT_MAP_WIDTH + 3 - (\4)
184
IF _len > \3_WIDTH
185
DEF _len = \3_WIDTH
186
ENDC
187
188
ELIF !STRCMP("\1", "south")
189
DEF _blk = _src
190
DEF _map = (CURRENT_MAP_WIDTH + 6) * (CURRENT_MAP_HEIGHT + 3) + _tgt
191
DEF _win = \3_WIDTH + 7
192
DEF _y = 0
193
DEF _x = (\4) * -2
194
DEF _len = CURRENT_MAP_WIDTH + 3 - (\4)
195
IF _len > \3_WIDTH
196
DEF _len = \3_WIDTH
197
ENDC
198
199
ELIF !STRCMP("\1", "west")
200
DEF _blk = (\3_WIDTH * _src) + \3_WIDTH - 3
201
DEF _map = (CURRENT_MAP_WIDTH + 6) * _tgt
202
DEF _win = (\3_WIDTH + 6) * 2 - 6
203
DEF _y = (\4) * -2
204
DEF _x = \3_WIDTH * 2 - 1
205
DEF _len = CURRENT_MAP_HEIGHT + 3 - (\4)
206
IF _len > \3_HEIGHT
207
DEF _len = \3_HEIGHT
208
ENDC
209
210
ELIF !STRCMP("\1", "east")
211
DEF _blk = (\3_WIDTH * _src)
212
DEF _map = (CURRENT_MAP_WIDTH + 6) * _tgt + CURRENT_MAP_WIDTH + 3
213
DEF _win = \3_WIDTH + 7
214
DEF _y = (\4) * -2
215
DEF _x = 0
216
DEF _len = CURRENT_MAP_HEIGHT + 3 - (\4)
217
IF _len > \3_HEIGHT
218
DEF _len = \3_HEIGHT
219
ENDC
220
221
ELSE
222
fail "Invalid direction for 'connection'."
223
ENDC
224
225
db \3
226
dw \2_Blocks + _blk
227
dw wOverworldMap + _map
228
db _len - _src
229
db \3_WIDTH
230
db _y, _x
231
dw wOverworldMap + _win
232
ENDM
233
234
MACRO def_script_pointers
235
const_def
236
ENDM
237
238
MACRO def_text_pointers
239
const_def 1
240
ENDM
241
242
MACRO object_const_def
243
const_def 1
244
ENDM
245
246