ref: 710c3275fc6a4caeeff3ad89c029a05984cf8388
dir: /macros/data_macros.asm/
; Constant enumeration is useful for monsters, items, moves, etc. const_def: MACRO if _NARG >= 1 const_value = \1 else const_value = 0 endc ENDM const: MACRO \1 EQU const_value const_value = const_value + 1 ENDM ; data format macros percent EQUS "* $ff / 100" bcd2: MACRO dn ((\1) / 1000) % 10, ((\1) / 100) % 10 dn ((\1) / 10) % 10, (\1) % 10 ENDM bcd3: MACRO dn ((\1) / 100000) % 10, ((\1) / 10000) % 10 dn ((\1) / 1000) % 10, ((\1) / 100) % 10 dn ((\1) / 10) % 10, (\1) % 10 ENDM coins equs "bcd2" money equs "bcd3" ;\1 = Map Width ;\2 = Rows above (Y-blocks) ;\3 = X movement (X-blocks) EVENT_DISP: MACRO dw (wOverworldMap + 7 + (\1) + ((\1) + 6) * ((\2) >> 1) + ((\3) >> 1)) ; Ev.Disp db \2,\3 ;Y,X ENDM FLYWARP_DATA: MACRO EVENT_DISP \1,\2,\3 db ((\2) & $01) ;sub-block Y db ((\3) & $01) ;sub-block X ENDM ; external map entry macro EMAP: MACRO ; emap x-coordinate,y-coordinate,textpointer ; the appearance of towns and routes in the town map, indexed by map id ; nybble: y-coordinate ; nybble: x-coordinate ; word : pointer to map name dn \2, \1 dw \3 ENDM ; internal map entry macro IMAP: MACRO ; imap mapid_less_than,x-coordinate,y-coordinate,textpointer ; the appearance of buildings and dungeons in the town map ; byte : maximum map id subject to this rule ; nybble: y-coordinate ; nybble: x-coordinate ; word : pointer to map name db \1 + 1 dn \3, \2 dw \4 ENDM ; tilesets' headers macro tileset: MACRO db BANK(\2) ; BANK(GFX) dw \1, \2, \3 ; Block, GFX, Coll db \4, \5, \6 ; counter tiles db \7 ; grass tile db \8 ; permission (indoor, cave, outdoor) ENDM INDOOR EQU 0 CAVE EQU 1 OUTDOOR EQU 2 RGB: MACRO dw (\3 << 10 | \2 << 5 | \1) ENDM WALK EQU $FE STAY EQU $FF DOWN EQU $D0 UP EQU $D1 LEFT EQU $D2 RIGHT EQU $D3 NONE EQU $FF ;\1 sprite id ;\2 x position ;\3 y position ;\4 movement (WALK/STAY) ;\5 range or direction ;\6 text id ;\7 items only: item id ;\7 trainers only: trainer class/pokemon id ;\8 trainers only: trainer number/pokemon level object: MACRO db \1 db \3 + 4 db \2 + 4 db \4 db \5 IF (_NARG > 7) db TRAINER | \6 db \7 db \8 ELSE IF (_NARG > 6) db ITEM | \6 db \7 ELSE db \6 ENDC ENDC ENDM ;\1 x position ;\2 y position ;\3 destination warp id ;\4 destination map (-1 = wLastMap) warp: MACRO db \2, \1, \3, \4 ENDM ;\1 x position ;\2 y position ;\3 sign id sign: MACRO db \2, \1, \3 ENDM ;\1 x position ;\2 y position ;\3 map width warp_to: MACRO EVENT_DISP \3, \2, \1 ENDM map_header: MACRO ;\1: map name ;\2: map id ;\3: tileset ;\4: connections: combo of NORTH, SOUTH, WEST, and/or EAST, or 0 for none CURRENT_MAP_WIDTH = \2_WIDTH CURRENT_MAP_HEIGHT = \2_HEIGHT CURRENT_MAP_OBJECT EQUS "\1_Object" \1_h:: db \3 db CURRENT_MAP_HEIGHT, CURRENT_MAP_WIDTH dw \1_Blocks dw \1_TextPointers dw \1_Script db \4 ENDM end_map_header: MACRO dw CURRENT_MAP_OBJECT PURGE CURRENT_MAP_WIDTH PURGE CURRENT_MAP_HEIGHT PURGE CURRENT_MAP_OBJECT ENDM ; Connections go in order: north, south, west, east connection: MACRO ;\1: direction ;\2: map name ;\3: map id ;\4: offset of the target map relative to the current map ; (x offset for east/west, y offset for north/south) ; Calculate tile offsets for source (current) and target maps _src = 0 _tgt = (\4) + 3 if _tgt < 2 _src = -_tgt _tgt = 0 endc if "\1" == "north" _blk = \3_WIDTH * (\3_HEIGHT - 3) + _src _map = _tgt _win = (\3_WIDTH + 6) * \3_HEIGHT + 1 _y = \3_HEIGHT * 2 - 1 _x = (\4) * -2 _len = CURRENT_MAP_WIDTH + 3 - (\4) if _len > \3_WIDTH _len = \3_WIDTH endc elif "\1" == "south" _blk = _src _map = (CURRENT_MAP_WIDTH + 6) * (CURRENT_MAP_HEIGHT + 3) + _tgt _win = \3_WIDTH + 7 _y = 0 _x = (\4) * -2 _len = CURRENT_MAP_WIDTH + 3 - (\4) if _len > \3_WIDTH _len = \3_WIDTH endc elif "\1" == "west" _blk = (\3_WIDTH * _src) + \3_WIDTH - 3 _map = (CURRENT_MAP_WIDTH + 6) * _tgt _win = (\3_WIDTH + 6) * 2 - 6 _y = (\4) * -2 _x = \3_WIDTH * 2 - 1 _len = CURRENT_MAP_HEIGHT + 3 - (\4) if _len > \3_HEIGHT _len = \3_HEIGHT endc elif "\1" == "east" _blk = (\3_WIDTH * _src) _map = (CURRENT_MAP_WIDTH + 6) * _tgt + CURRENT_MAP_WIDTH + 3 _win = \3_WIDTH + 7 _y = (\4) * -2 _x = 0 _len = CURRENT_MAP_HEIGHT + 3 - (\4) if _len > \3_HEIGHT _len = \3_HEIGHT endc else fail "Invalid direction for 'connection'." endc db \3 dw \2_Blocks + _blk dw wOverworldMap + _map db _len - _src db \3_WIDTH db _y, _x dw wOverworldMap + _win ENDM tmlearn: MACRO x = 0 REPT _NARG IF \1 != 0 x = x | (1 << ((\1 - 1) % 8)) ENDC SHIFT ENDR db x ENDM