shithub: pokecrystal

ref: 213dcc70d77ade7cf587d57016cc5bb405494fe8
dir: /macros/map.asm/

View raw version
map: macro
;\1: map id
	db GROUP_\1, MAP_\1
endm

maptrigger: macro
;\1: script pointer
	dw \1, 0
endm

warp_def: macro
;\1: y: top to bottom, starts at 0
;\2: x: left to right, starts at 0
;\3: warp destination: starts at 1
;\4: map id: from constants/map_constants.asm
	db \1, \2, \3
	map \4
endm

xy_trigger: macro
;\1: number: controlled by dotrigger/domaptrigger
;\2: y: top to bottom, starts at 0
;\3: x: left to right, starts at 0
;\4: unknown1: $0
;\5: script pointer
;\6: unknown2: $0
;\7: unknown3: $0
	db \1, \2, \3, \4
	dw \5
	db \6, \7
endm

signpost: macro
;\1: y: top to bottom, starts at 0
;\2: x: left to right, starts at 0
;\3: function: a SIGNPOST_* constant
;\4: script pointer
	db \1, \2, \3
	dw \4
endm

person_event: macro
;\1: sprite: a SPRITE_* constant
;\2: y: top to bottom, starts at 0
;\3: x: left to right, starts at 0
;\4: movement function: a SPRITEMOVEDATA_* constant
;\5, \6: movement radius: y, x
;\7: clock hour: ???
;\8: clock daytime: sum of MORN, DAY, and/or NITE, or 0 for always
;\9: color: a PAL_NPC_* constant, or 0 for sprite default
;\10: function: a PERSONTYPE_* constant
;\11: sight range: applies to PERSONTYPE_TRAINER
;\12: script pointer
;\13: event flag: an EVENT_* constant, or 0 for always
	db \1, \2 + 4, \3 + 4, \4
	dn \5, \6
	db \7, \8
	shift
	dn \8, \9
	shift
	db \9
	shift
	dw \9
	shift
	dw \9
endm


newgroup: macro
const_value = const_value + 1
	enum_start 1
endm

mapgroup: macro
;\1: map id
;\2: height: in blocks
;\3: width: in blocks
GROUP_\1 EQU const_value
	enum MAP_\1
\1_HEIGHT EQU \2
\1_WIDTH EQU \3
endm


map_header: macro
;\1: map label
;\2: tileset: a TILESET_* constant
;\3: permission: TOWN, ROUTE, INDOOR, CAVE, PERM_5, GATE, or DUNGEON
;\4: location: from constants/landmark_constants.asm
;\5: music: a MUSIC_* constant
;\6: phone service flag: 1 to prevent phone calls
;\7: time of day: a PALETTE_* constant
;\8: fishing group: a FISHGROUP_* constant
\1_MapHeader:
	db BANK(\1_SecondMapHeader), \2, \3
	dw \1_SecondMapHeader
	db \4, \5
	dn \6, \7
	db \8
endm


map_header_2: macro
;\1: map label
;\2: map id
;\3: border block
;\4: connections: sum of NORTH, SOUTH, WEST, and/or EAST, or 0 for none
\1_SecondMapHeader::
	db \3
	db \2_HEIGHT, \2_WIDTH
	db BANK(\1_BlockData)
	dw \1_BlockData
	db BANK(\1_MapScriptHeader)
	dw \1_MapScriptHeader
	dw \1_MapEventHeader
	db \4
endm

connection: macro
if "\1" == "north"
;\2: map id
;\3: map label (eventually will be rolled into map id)
;\4: x
;\5: offset?
;\6: strip length
;\7: this map id
	map \2
	dw \3_BlockData + \2_WIDTH * (\2_HEIGHT - 3) + \5
	dw OverworldMap + \4 + 3
	db \6
	db \2_WIDTH
	db \2_HEIGHT * 2 - 1
	db (\4 - \5) * -2
	dw OverworldMap + \2_HEIGHT * (\2_WIDTH + 6) + 1
endc

if "\1" == "south"
;\2: map id
;\3: map label (eventually will be rolled into map id)
;\4: x
;\5: offset?
;\6: strip length
;\7: this map id
	map \2
	dw \3_BlockData + \5
	dw OverworldMap + (\7_HEIGHT + 3) * (\7_WIDTH + 6) + \4 + 3
	db \6
	db \2_WIDTH
	db 0
	db (\4 - \5) * -2
	dw OverworldMap + \2_WIDTH + 7
endc

if "\1" == "west"
;\2: map id
;\3: map label (eventually will be rolled into map id)
;\4: y
;\5: offset?
;\6: strip length
;\7: this map id
	map \2
	dw \3_BlockData + (\2_WIDTH * \5) + \2_WIDTH - 3
	dw OverworldMap + (\7_WIDTH + 6) * (\4 + 3)
	db \6
	db \2_WIDTH
	db (\4 - \5) * -2
	db \2_WIDTH * 2 - 1
	dw OverworldMap + \2_WIDTH * 2 + 6
endc

if "\1" == "east"
;\2: map id
;\3: map label (eventually will be rolled into map id)
;\4: y
;\5: offset?
;\6: strip length
;\7: this map id
	map \2
	dw \3_BlockData + (\2_WIDTH * \5)
	dw OverworldMap + (\7_WIDTH + 6) * (\4 + 3 + 1) - 3
	db \6
	db \2_WIDTH
	db (\4 - \5) * -2
	db 0
	dw OverworldMap + \2_WIDTH + 7
endc
endm


itemball: macro
;\1: item: from constants/item_constants.asm
;\2: quantity: default 1
if _NARG == 2
	db \1, \2
else
	db \1, 1
endc
endm

elevfloor: macro
;\1: floor: a FLOOR_* constant
;\2: warp destination: starts at 1
;\3: map id
	db \1, \2
	map \3
ENDM

stonetable: macro
;\1: warp id
;\2: person_event id
;\3: script pointer
	db \1, \2
	dw \3
endm