diff options
Diffstat (limited to 'macros/scripts/maps.asm')
-rw-r--r-- | macros/scripts/maps.asm | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/macros/scripts/maps.asm b/macros/scripts/maps.asm new file mode 100644 index 00000000..2032629b --- /dev/null +++ b/macros/scripts/maps.asm @@ -0,0 +1,225 @@ +def_objects: MACRO + IF DEF(_NUM_OBJECTS) + PURGE _NUM_OBJECTS + ENDC +_NUM_OBJECTS EQUS "_NUM_OBJECTS_\@" + db _NUM_OBJECTS +_NUM_OBJECTS = 0 +ENDM + +;\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 + ELIF _NARG > 6 + db ITEM | \6 + db \7 + ELSE + db \6 + ENDC +_NUM_OBJECTS = _NUM_OBJECTS + 1 +ENDM + +def_warps: MACRO + IF DEF(_NUM_WARPS) + PURGE _NUM_WARPS + ENDC +_NUM_WARPS EQUS "_NUM_WARPS_\@" + db _NUM_WARPS +_NUM_WARPS = 0 +ENDM + +;\1 x position +;\2 y position +;\3 destination warp id +;\4 destination map (-1 = wLastMap) +warp: MACRO + db \2, \1, \3, \4 +_NUM_WARPS = _NUM_WARPS + 1 +; the Nth warp defines a corresponding Nth warp_to, stored in _WARP_TO_NUM_<N> +_WARP_TO_NAME EQUS "_WARP_TO_NUM_{d:{_NUM_WARPS}}" +_WARP_TO_NAME EQUS "warp_to \1, \2, _WARP_TO_WIDTH" + PURGE _WARP_TO_NAME +ENDM + +def_signs: MACRO + IF DEF(_NUM_SIGNS) + PURGE _NUM_SIGNS + ENDC +_NUM_SIGNS EQUS "_NUM_SIGNS_\@" + db _NUM_SIGNS +_NUM_SIGNS = 0 +ENDM + +;\1 x position +;\2 y position +;\3 sign id +sign: MACRO + db \2, \1, \3 +_NUM_SIGNS = _NUM_SIGNS + 1 +ENDM + +;\1 source map +def_warps_to: MACRO +; output and purge each _WARP_TO_NUM_<N> warp_to, from N=1 to _NUM_WARPS +_WARP_TO_WIDTH = \1_WIDTH +_WARP_TO_N = 1 + REPT _NUM_WARPS +_WARP_TO_NAME EQUS "_WARP_TO_NUM_{d:_WARP_TO_N}" + _WARP_TO_NAME +_WARP_TO_N = _WARP_TO_N + 1 +_PURGE_WARP_TO_NUM EQUS "PURGE {_WARP_TO_NAME}" + _PURGE_WARP_TO_NUM + PURGE _PURGE_WARP_TO_NUM + PURGE _WARP_TO_NAME + ENDR +ENDM + +;\1 x position +;\2 y position +;\3 map width +warp_to: MACRO + event_displacement \3, \1, \2 +ENDM + + +;\1 event flag +;\2 view range +;\3 TextBeforeBattle +;\4 TextAfterBattle +;\5 TextEndBattle +trainer: MACRO + IF _NARG > 5 + dbEventFlagBit \1, \2 + db (\3 << 4) + dwEventFlagAddress \1, \2 + SHIFT + ELSE + dbEventFlagBit \1 + db (\2 << 4) + dwEventFlagAddress \1 + ENDC + dw \3, \5, \4, \4 +ENDM + +;\1 x position +;\2 y position +;\3 movement data +map_coord_movement: MACRO + dbmapcoord \1, \2 + dw \3 +ENDM + + +;\1 map name +;\2 map id +;\3 tileset +;\4 connections: combo of NORTH, SOUTH, WEST, and/or EAST, or 0 for none +map_header: MACRO +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 + +; Comes after map_header and connection macros +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 +;\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) +connection: MACRO + +; Calculate tile offsets for source (current) and target maps +_src = 0 +_tgt = (\4) + 3 +IF _tgt < 2 +_src = -_tgt +_tgt = 0 +ENDC + +IF !STRCMP("\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 !STRCMP("\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 !STRCMP("\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 !STRCMP("\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 |