pokecrystal-board/data/maps/attributes.asm
2023-12-21 19:57:17 +01:00

128 lines
3.8 KiB
NASM

MACRO map_attributes
;\1: map name
;\2: map id
;\3: border block
;\4: connections: combo of NORTH, SOUTH, WEST, and/or EAST, or 0 for none
DEF CURRENT_MAP_WIDTH = \2_WIDTH
DEF CURRENT_MAP_HEIGHT = \2_HEIGHT
\1_MapAttributes::
db \3
db CURRENT_MAP_HEIGHT, CURRENT_MAP_WIDTH
db BANK(\1_Blocks)
dw \1_Blocks
db BANK(\1_MapScripts) ; aka BANK(\1_MapEvents), BANK(\1_MapSpaces)
dw \1_MapScripts
dw \1_MapEvents
dw \1_MapSpaces
db \4
ENDM
; Connections go in order: north, south, west, east
MACRO connection
;\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)
; LEGACY: Support for old connection macro
if _NARG == 6
connection \1, \2, \3, (\4) - (\5)
else
; Calculate tile offsets for source (current) and target maps
DEF _src = 0
DEF _tgt = (\4) + MAP_CONNECTION_PADDING_WIDTH
if _tgt < 0
DEF _src = -_tgt
DEF _tgt = 0
endc
if !STRCMP("\1", "north")
DEF _blk = \3_WIDTH * (\3_HEIGHT - MAP_CONNECTION_PADDING_WIDTH) + _src
DEF _map = _tgt
DEF _win = (\3_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2) * \3_HEIGHT + 1
DEF _y = \3_HEIGHT * 2 - 1
DEF _x = (\4) * -2
DEF _len = CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH - (\4)
if _len > \3_WIDTH
DEF _len = \3_WIDTH
endc
elif !STRCMP("\1", "south")
DEF _blk = _src
DEF _map = (CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2) * (CURRENT_MAP_HEIGHT + MAP_CONNECTION_PADDING_WIDTH) + _tgt
DEF _win = \3_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2 + 1
DEF _y = 0
DEF _x = (\4) * -2
DEF _len = CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH - (\4)
if _len > \3_WIDTH
DEF _len = \3_WIDTH
endc
elif !STRCMP("\1", "west")
DEF _blk = (\3_WIDTH * _src) + \3_WIDTH - MAP_CONNECTION_PADDING_WIDTH
DEF _map = (CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2) * _tgt
DEF _win = (\3_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2) * 2 - MAP_CONNECTION_PADDING_WIDTH * 2
DEF _y = (\4) * -2
DEF _x = \3_WIDTH * 2 - 1
DEF _len = CURRENT_MAP_HEIGHT + MAP_CONNECTION_PADDING_WIDTH - (\4)
if _len > \3_HEIGHT
DEF _len = \3_HEIGHT
endc
elif !STRCMP("\1", "east")
DEF _blk = (\3_WIDTH * _src)
DEF _map = (CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2) * _tgt + CURRENT_MAP_WIDTH + MAP_CONNECTION_PADDING_WIDTH
DEF _win = \3_WIDTH + MAP_CONNECTION_PADDING_WIDTH * 2 + 1
DEF _y = (\4) * -2
DEF _x = 0
DEF _len = CURRENT_MAP_HEIGHT + MAP_CONNECTION_PADDING_WIDTH - (\4)
if _len > \3_HEIGHT
DEF _len = \3_HEIGHT
endc
else
fail "Invalid direction for 'connection'."
endc
map_id \3
dw \2_Blocks + _blk
dw wOverworldMapBlocks + _map
db _len - _src
db \3_WIDTH
db \3_HEIGHT
db _y, _x
dw wOverworldMapBlocks + _win
endc
ENDM
map_attributes Level1_Map1, LEVEL_1_MAP_1, $00, SOUTH | NORTH
connection south, Level1_Map1, LEVEL_1_MAP_1, 0
connection north, Level1_Map1, LEVEL_1_MAP_1, 0
; map_attributes NewBarkTown, NEW_BARK_TOWN, $05, WEST | EAST
; connection west, Route29, ROUTE_29, 0
; connection east, Route27, ROUTE_27, 0
if DEF(_DEBUG)
map_attributes DebugLevel1_Map1, DEBUGLEVEL_1_MAP_1, $00, SOUTH | NORTH
connection south, DebugLevel1_Map1, DEBUGLEVEL_1_MAP_1, 0
connection north, DebugLevel1_Map1, DEBUGLEVEL_1_MAP_1, 0
map_attributes DebugLevel2_Map1, DEBUGLEVEL_2_MAP_1, $00, WEST
connection west, DebugLevel2_Map2, DEBUGLEVEL_2_MAP_2, 3
map_attributes DebugLevel2_Map2, DEBUGLEVEL_2_MAP_2, $00, EAST
connection east, DebugLevel2_Map1, DEBUGLEVEL_2_MAP_1, -3
map_attributes DebugLevel3_Map1, DEBUGLEVEL_3_MAP_1, $00, 0
map_attributes DebugLevel4_Map1, DEBUGLEVEL_4_MAP_1, $00, SOUTH
connection south, DebugLevel5_Map1, DEBUGLEVEL_5_MAP_1, -1
map_attributes DebugLevel5_Map1, DEBUGLEVEL_5_MAP_1, $00, NORTH
connection north, DebugLevel4_Map1, DEBUGLEVEL_4_MAP_1, 1
endc