ref: 814a720e9dccff4b90f1259dc91016a703c22d7e
parent: 375963349aa9d9eaa254257e36613f4c410b20cf
author: mid-kid <esteve.varela@gmail.com>
date: Sat Nov 10 19:32:05 EST 2018
Adapt macro based on suggestions
--- a/data/maps/attributes.asm
+++ b/data/maps/attributes.asm
@@ -21,73 +21,77 @@
;\1: direction
;\2: map name
;\3: map id
-;\4: x offset for east/west, y offset for north/south, of the target map
-; relative to the current map.
+;\4: offset of the target map relative to the current map
+; (x offset for east/west, y offset for north/south)
-; Figure out target and source offsets
-; Target meaning the offset where the tiles will be placed
-; Source meaning the offset where the tiles are fetched from
-_s = 0
-_t = (\4) + 3
-if _t < 0
-_s = -_t
-_t = 0
-endc
+; LEGACY: Support for old connection macro
+if _NARG == 6
+ connection \1, \2, \3, (\4) - (\5)
+else
-; Figure out whether we're using the width or the height as maximum size
-_st = 0
-_ss = 0
-if ("\1" == "north") || ("\1" == "south")
-_st = \3_WIDTH
-_ss = CURRENT_MAP_WIDTH
-elif ("\1" == "west") || ("\1" == "east")
-_st = \3_HEIGHT
-_ss = CURRENT_MAP_HEIGHT
+; Calculate tile offsets for source (current) and target maps
+_src = 0
+_tgt = (\4) + 3
+if _tgt < 0
+_src = -_tgt
+_tgt = 0
endc
-; Figure out the length of the strip to connect
-if ((\4) + _st) > (_ss + 3)
-_l = _ss + 3 - (\4) - _s
-else
-_l = _st - _s
+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
-if "\1" == "north"
- map_id \3
- dw \2_Blocks + \3_WIDTH * (\3_HEIGHT + -3) + _s
- dw wOverworldMapBlocks + _t
- db _l
- db \3_WIDTH
- db \3_HEIGHT * 2 - 1
- db (\4) * -2
- dw wOverworldMapBlocks + (\3_WIDTH + 6) * \3_HEIGHT + 1
elif "\1" == "south"
- map_id \3
- dw \2_Blocks + _s
- dw wOverworldMapBlocks + (CURRENT_MAP_WIDTH + 6) * (CURRENT_MAP_HEIGHT + 3) + _t
- db _l
- db \3_WIDTH
- db 0
- db (\4) * -2
- dw wOverworldMapBlocks + \3_WIDTH + 7
+_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"
- map_id \3
- dw \2_Blocks + (\3_WIDTH * _s) + \3_WIDTH + -3
- dw wOverworldMapBlocks + (CURRENT_MAP_WIDTH + 6) * _t
- db _l
- db \3_WIDTH
- db (\4) * -2
- db \3_WIDTH * 2 - 1
- dw wOverworldMapBlocks + (\3_WIDTH + 6) * 2 + -6
+_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
+
map_id \3
- dw \2_Blocks + (\3_WIDTH * _s)
- dw wOverworldMapBlocks + (CURRENT_MAP_WIDTH + 6) * _t + CURRENT_MAP_WIDTH + 3
- db _l
+ dw \2_Blocks + _blk
+ dw wOverworldMapBlocks + _map
+ db _len - _src
db \3_WIDTH
- db (\4) * -2
- db 0
- dw wOverworldMapBlocks + \3_WIDTH + 7
+ db _y, _x
+ dw wOverworldMapBlocks + _win
endc
ENDM