From 6a7dbc5473b36c61ebbfca1eb86e8061083a91ab Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Sun, 28 Feb 2021 17:47:41 +0100 Subject: convert map definition to YAML We don't use our own map definition syntax which was not documented and fragile. YAML is more common and is easier to parse. --- maps/2P-ring-street.map | 18 ----------------- maps/2P-ring-street.yml | 22 +++++++++++++++++++++ maps/2P-river-king.map | 20 ------------------- maps/2P-river-king.yml | 24 +++++++++++++++++++++++ maps/3P-ring-street.map | 22 --------------------- maps/3P-ring-street.yml | 23 ++++++++++++++++++++++ maps/4P-islands.map | 35 --------------------------------- maps/4P-islands.yml | 36 ++++++++++++++++++++++++++++++++++ maps/Makefile | 6 +++--- maps/the-kraken.map | 28 --------------------------- maps/the-kraken.yml | 29 ++++++++++++++++++++++++++++ scripts/generate_map_img.py | 47 +++++++++++---------------------------------- 12 files changed, 148 insertions(+), 162 deletions(-) delete mode 100644 maps/2P-ring-street.map create mode 100644 maps/2P-ring-street.yml delete mode 100644 maps/2P-river-king.map create mode 100644 maps/2P-river-king.yml delete mode 100644 maps/3P-ring-street.map create mode 100644 maps/3P-ring-street.yml delete mode 100644 maps/4P-islands.map create mode 100644 maps/4P-islands.yml delete mode 100644 maps/the-kraken.map create mode 100644 maps/the-kraken.yml diff --git a/maps/2P-ring-street.map b/maps/2P-ring-street.map deleted file mode 100644 index 1802c5f7..00000000 --- a/maps/2P-ring-street.map +++ /dev/null @@ -1,18 +0,0 @@ -T H HT - FSSSSS2H - SHSH HS - S SST S -H HFH H - S TSS S - SH HSHS -H1SSSSSF -TH H T - -T := tower -H := house -F := farm -S := street -1 := spawn player 1 -2 := spawn player 2 - -kings := (1,9) (9,1) diff --git a/maps/2P-ring-street.yml b/maps/2P-ring-street.yml new file mode 100644 index 00000000..ca70147e --- /dev/null +++ b/maps/2P-ring-street.yml @@ -0,0 +1,22 @@ +map: |1+ + T H HT + FSSSSS2H + SHSH HS + S SST S + H HFH H + S TSS S + SH HSHS + H1SSSSSF + TH H T + +symbols: + T: tower + H: house + F: farm + S: street + 1: spawn player 1 + 2: spawn player 2 + +kings: + - (1,9) + - (9,1) diff --git a/maps/2P-river-king.map b/maps/2P-river-king.map deleted file mode 100644 index 0fa00e15..00000000 --- a/maps/2P-river-king.map +++ /dev/null @@ -1,20 +0,0 @@ - H HH F T -WDFSSSSSH1 -WWT STWWH -WWWWWSWWWWW -WWWWWSWWWWW -WWWWWSWWWWW - HWWTS TWW - 2HSSSSSFDW -T F HH H - -T := tower -H := house -F := farm -W := deep water -S := street -D := docks -1 := spawn player 1 -2 := spawn player 2 - -kings := (1,11) (11,1) diff --git a/maps/2P-river-king.yml b/maps/2P-river-king.yml new file mode 100644 index 00000000..d0dd7ebd --- /dev/null +++ b/maps/2P-river-king.yml @@ -0,0 +1,24 @@ +map: |1+ + H HH F T + WDFSSSSSH1 + WWT STWWH + WWWWWSWWWWW + WWWWWSWWWWW + WWWWWSWWWWW + HWWTS TWW + 2HSSSSSFDW + T F HH H + +symbols: + T: tower + H: house + F: farm + W: deep water + S: street + D: docks + 1: spawn player 1 + 2: spawn player 2 + +kings: + - (1,11) + - (11,1) diff --git a/maps/3P-ring-street.map b/maps/3P-ring-street.map deleted file mode 100644 index 32bdd02e..00000000 --- a/maps/3P-ring-street.map +++ /dev/null @@ -1,22 +0,0 @@ -##### F ##### -### 2 ### -## T ## -# H S H # -# HSSSH # - H SSHSS H - F S HS F - 1TSSST*TSSST3 - SHF S - SSSSS -# H # - -T := tower -H := house -F := farm -S := street -1 := spawn player 1 -2 := spawn player 2 -3 := spawn player 3 -* := stick of victory -# := not part of the map - diff --git a/maps/3P-ring-street.yml b/maps/3P-ring-street.yml new file mode 100644 index 00000000..47b9d88f --- /dev/null +++ b/maps/3P-ring-street.yml @@ -0,0 +1,23 @@ +map: |1+ + XXXXX F XXXXX + XXX 2 XXX + XX T XX + X H S H X + X HSSSH X + H SSHSS H + F S HS F + 1TSSST$TSSST3 + SHF S + SSSSS + X H X + +symbols: + T: tower + H: house + F: farm + S: street + 1: spawn player 1 + 2: spawn player 2 + 3: spawn player 3 + $: stick of victory + X: not part of the map diff --git a/maps/4P-islands.map b/maps/4P-islands.map deleted file mode 100644 index 09c0a1c5..00000000 --- a/maps/4P-islands.map +++ /dev/null @@ -1,35 +0,0 @@ - WWWWWWWWWWW - 4 TWWWWWWWWWWWT 3 - HDWWW WWWWWWDH - WWW TSSSS#WWWW -WWWWWHFSSHHW##WWWWW -WWWW#SSS#WWWWSH WWW -WWW##WW##WWWWSF WW -WWWSWWWW W#SST WW -WWWSHWW T T ##SS WW -WW SHWW * WWHS WW -WW SS## T T WWHSWWW -WW TSS#W WWWWSWWW -WW FSWWWW##WW##WWW -WWW HSWWWW#SSS#WWWW -WWWWW##WHHSSFHWWWWW - WWWW#SSSST WWW - HDWWWWWW WWWDH - 1 TWWWWWWWWWWWT 2 - WWWWWWWWWWW - -* := stick of victory -# := shallow water -W := deep water -D := docks -T := tower -H := house -F := farm -W := deep water -S := street -D := docks -1 := spawn player 1 -2 := spawn player 2 -3 := spawn player 3 -4 := spawn player 4 - diff --git a/maps/4P-islands.yml b/maps/4P-islands.yml new file mode 100644 index 00000000..5f8dd6f4 --- /dev/null +++ b/maps/4P-islands.yml @@ -0,0 +1,36 @@ +map: |1+ + WWWWWWWWWWW + 4 TWWWWWWWWWWWT 3 + HDWWW WWWWWWDH + WWW TSSSSwWWWW + WWWWWHFSSHHWwwWWWWW + WWWWwSSSwWWWWSH WWW + WWWwwWWwwWWWWSF WW + WWWSWWWW WwSST WW + WWWSHWW T T wwSS WW + WW SHWW $ WWHS WW + WW SSww T T WWHSWWW + WW TSSwW WWWWSWWW + WW FSWWWWwwWWwwWWW + WWW HSWWWWwSSSwWWWW + WWWWWwwWHHSSFHWWWWW + WWWWwSSSST WWW + HDWWWWWW WWWDH + 1 TWWWWWWWWWWWT 2 + WWWWWWWWWWW + +symbols: + $: stick of victory + w: shallow water + W: deep water + D: docks + T: tower + H: house + F: farm + W: deep water + S: street + D: docks + 1: spawn player 1 + 2: spawn player 2 + 3: spawn player 3 + 4: spawn player 4 diff --git a/maps/Makefile b/maps/Makefile index 45254c04..98fac22e 100644 --- a/maps/Makefile +++ b/maps/Makefile @@ -2,17 +2,17 @@ .DEFAULT_GOAL = all -MAPS = $(shell find . -name "*.map") +MAPS = $(shell find . -name "*.yml") VERBOSE = @ -PNGS = $(MAPS:.map=.png) +PNGS = $(MAPS:.yml=.png) MAKEFILE_LIST = Makefile all: $(PNGS) -%.png : %.map $(MAKEFILE_LIST) +%.png : %.yml $(MAKEFILE_LIST) @echo "generate map › $@" $(VERBOSE) python3 ../scripts/generate_map_img.py $< diff --git a/maps/the-kraken.map b/maps/the-kraken.map deleted file mode 100644 index 51b39b3d..00000000 --- a/maps/the-kraken.map +++ /dev/null @@ -1,28 +0,0 @@ -WWW4WWW -W HK TW -W 312 W -WWWWWWW -WWWWW W -WWWW SW -W WWDHW -WSTWW W -WF WWWW -W WWWWW -WWWWWWW -WW DWW -WS * W - *** - -K := the kraken -T := tower -H := house -F := farm -W := deep water -S := store -D := docks -1 := deep water spawn 1 -2 := deep water spawn 2 -3 := deep water spawn 3 -4 := deep water spawn 4 -* := player spawn - diff --git a/maps/the-kraken.yml b/maps/the-kraken.yml new file mode 100644 index 00000000..becd909d --- /dev/null +++ b/maps/the-kraken.yml @@ -0,0 +1,29 @@ +map: |1+ + WWW4WWW + W HK TW + W 312 W + WWWWWWW + WWWWW W + WWWW SW + W WWDHW + WSTWW W + WF WWWW + W WWWWW + WWWWWWW + WW DWW + WS 0 W + 000 + +symbols: + K: the kraken + T: tower + H: house + F: farm + W: deep water + S: store + D: docks + 1: deep water spawn 1 + 2: deep water spawn 2 + 3: deep water spawn 3 + 4: deep water spawn 4 + 0: player spawn diff --git a/scripts/generate_map_img.py b/scripts/generate_map_img.py index f4e29148..84a72abb 100755 --- a/scripts/generate_map_img.py +++ b/scripts/generate_map_img.py @@ -5,6 +5,7 @@ import pathlib import numpy import os from typing import MutableMapping +import yaml MAP_ROOT = pathlib.Path(os.getcwd()) TILES_DIR = MAP_ROOT / '../assets/tiles' @@ -14,24 +15,15 @@ def get_tile_path(tile: str) -> pathlib.Path: """Return the corresponding image file name for a tile""" return TILES_DIR / f'{tile.lower().replace(" ", "_")}.png' -def read_map(map_path: pathlib.Path) -> MutableMapping: - """Read and parse a map file""" - map_definition = {'symbols': {}, 'rules': {}} +def generate_img(map_path: pathlib.Path): + """Generate a image from a map file""" with open(map_path, 'r') as map_file: - lines = [l[:-1] for l in map_file.readlines()] # remove new lines - - # sections in map files are seperated by an empty line - section_end = lines.index('') - map_string = '\n'.join(lines[:section_end]) - lines = lines [section_end+1:] # consume map string + map_definition = yaml.full_load(map_file) - section_end = lines.index('') - for symbol_def in lines[:section_end]: - symbol, tile = symbol_def.split(':=') - symbol = symbol.strip() - tile = tile.strip() - map_definition['symbols'][symbol] = tile - lines = lines[section_end + 1:] # consume symbol definitions + # remove the trailing new line + map_string = map_definition['map'][:-1] + # ensure that all keys are actually strings + symbols = {str(k): v for k, v in map_definition['symbols'].items()} # build up tiles tiles = [] @@ -40,30 +32,13 @@ def read_map(map_path: pathlib.Path) -> MutableMapping: for symbol in line: tile = "neutral" if symbol != ' ': - if symbol not in map_definition['symbols']: + if symbol not in symbols: print(f'WARNING unknown symbol "{symbol}"') else: - tile = map_definition['symbols'][symbol] + tile = symbols[symbol] row.append(tile) tiles.append(row) - map_definition['tiles'] = tiles - - for rule in lines: - name, rule = symbol_def.split(':=') - name = name.strip() - rule = rule.strip() - map_definition['rules'][name] = rule - - return map_definition - - -def generate_img(map_path: pathlib.Path): - """Generate a image from a map file""" - map_definition = read_map(map_path) - - tiles = map_definition['tiles'] - rows_imgs = [] for i, row in enumerate(tiles): tile_imgs = [] @@ -140,7 +115,7 @@ def main(): map_path = pathlib.Path(args.map_input) map_files = [map_path] if map_path.is_dir(): - map_files = map_path.glob('*.map') + map_files = map_path.glob('*.yml') for m in map_files: generate_img(m) -- cgit v1.2.3