castleraider
changeset 320:a73fcec69709
Updated the map drawing utility to handle the latest level format.
| author | David Boddie <david@boddie.org.uk> |
|---|---|
| date | Fri Oct 03 00:12:15 2014 +0200 |
| parents | 5b852b0c64bc |
| children | 876c2709d378 |
| files | utilities/make_map_overview.py |
| diffstat | 1 files changed, 98 insertions(+), 40 deletions(-) [+] |
line diff
1.1 --- a/utilities/make_map_overview.py Wed Oct 01 00:27:48 2014 +0200 1.2 +++ b/utilities/make_map_overview.py Fri Oct 03 00:12:15 2014 +0200 1.3 @@ -5,37 +5,32 @@ 1.4 1.5 from tools import makelevels 1.6 1.7 +colours = { 1.8 + "black": (0,0,0), 1.9 + "red": (255,0,0), 1.10 + "green": (0,255,0), 1.11 + "yellow": (255,255,0), 1.12 + "blue": (0,0,255), 1.13 + "magenta": (255,0,255), 1.14 + "cyan": (0,255,255), 1.15 + "white": (255,255,255) 1.16 + } 1.17 + 1.18 if __name__ == "__main__": 1.19 1.20 if not 2 <= len(sys.argv) <= 3: 1.21 1.22 - sys.stderr.write("Usage: %s <image file> [level file]\n" % sys.argv[0]) 1.23 + sys.stderr.write("Usage: %s <output directory> [level file]\n" % sys.argv[0]) 1.24 sys.exit(1) 1.25 1.26 - output_path = sys.argv[1] 1.27 + output_dir = sys.argv[1] 1.28 + if not os.path.exists(output_dir): 1.29 + os.mkdir(output_dir) 1.30 1.31 - if len(sys.argv) == 2: 1.32 - level_file = "levels/default.txt" 1.33 - else: 1.34 - level_file = sys.argv[2] 1.35 - 1.36 - level, special = makelevels.load_level(level_file) 1.37 - 1.38 - width = 0 1.39 - height = len(level) + 6 1.40 - 1.41 - for row in level: 1.42 - width = max(len(row), width) 1.43 - 1.44 - level_image = Image.new("P", (width * 4 * 2, height * 8), 0) 1.45 - 1.46 - black = (0,0,0) 1.47 - red = (255,0,0) 1.48 - green = (0,255,0) 1.49 - yellow = (255,255,0) 1.50 - level_image.putpalette(black + red + green + yellow) 1.51 - 1.52 - palette = {black: 0, red: 1, green: 2, yellow: 3} 1.53 + palette = {colours["black"]: 0, 1.54 + colours["red"]: 1, 1.55 + colours["green"]: 2, 1.56 + colours["yellow"]: 3} 1.57 1.58 tile_images = {} 1.59 for key, path in makelevels.tile_ref.items(): 1.60 @@ -53,28 +48,91 @@ 1.61 i += 3 1.62 1.63 tile_image = Image.fromstring("P", (4 * 2, 8), n) 1.64 - tile_image.putpalette(black + red + green + yellow) 1.65 + #tile_image.putpalette(black + red + green + yellow) 1.66 tile_images[key] = tile_image 1.67 1.68 - y = 8 * 6 1.69 - for row in level: 1.70 + monster_images = {} 1.71 + for key, path in makelevels.monster_ref.items(): 1.72 1.73 - x = 0 1.74 - for tile in row: 1.75 + im = Image.open(path) 1.76 + im = im.convert("RGB") 1.77 + s = im.tostring() 1.78 1.79 - if tile in special: 1.80 - n, flags, initial = special[tile] 1.81 - if initial: 1.82 - tile = n 1.83 - else: 1.84 + n = "" 1.85 + i = 0 1.86 + while i < len(s): 1.87 + 1.88 + v = tuple(map(ord, s[i:i+3])) 1.89 + n += chr(palette[v]) + chr(palette[v]) 1.90 + i += 3 1.91 + 1.92 + image = Image.fromstring("P", (8 * 2, 8), n) 1.93 + #tile_image.putpalette(black + red + green + yellow) 1.94 + monster_images[key] = image 1.95 + 1.96 + if len(sys.argv) == 2: 1.97 + level_file = "levels/default.txt" 1.98 + else: 1.99 + level_file = sys.argv[2] 1.100 + 1.101 + levels, special, portals, finish = makelevels.load_level(level_file) 1.102 + 1.103 + for name, rows in levels: 1.104 + 1.105 + width = 0 1.106 + height = len(rows) + 6 1.107 + 1.108 + for row in rows: 1.109 + width = max(len(row), width) 1.110 + 1.111 + level_image = Image.new("P", (width * 4 * 2, height * 8), 0) 1.112 + 1.113 + y = 8 * 6 1.114 + colours_used = {} 1.115 + for row in rows: 1.116 + 1.117 + x = 0 1.118 + was_monster = False 1.119 + for tile in row: 1.120 + 1.121 + skip = False 1.122 + 1.123 + if tile in monster_images: 1.124 + image = monster_images[tile] 1.125 + level_image.paste(image, (x, y)) 1.126 + was_monster = True 1.127 + 1.128 + elif was_monster: 1.129 + # Skip this cell if we just plotted a monster. 1.130 + was_monster = False 1.131 + skip = True 1.132 + 1.133 + elif tile in special: 1.134 + n, flags, initial = special[tile] 1.135 + if initial: 1.136 + tile = n 1.137 + else: 1.138 + tile = "." 1.139 + 1.140 + elif tile in portals: 1.141 + portal_colour = portals[tile][-1] 1.142 + colours_used[portal_colour] = colours_used.get(portal_colour, 0) + 1 1.143 tile = "." 1.144 + 1.145 + if not skip and tile in tile_images: 1.146 + image = tile_images[tile] 1.147 + level_image.paste(image, (x, y)) 1.148 + 1.149 + x += 4 * 2 1.150 1.151 - tile_image = tile_images[tile] 1.152 - level_image.paste(tile_image, (x, y)) 1.153 - 1.154 - x += 4 * 2 1.155 + y += 8 1.156 1.157 - y += 8 1.158 + colours_used = map(lambda (c, f): (f, c), colours_used.items()) 1.159 + colours_used.sort() 1.160 + colour = colours[colours_used[-1][1]] 1.161 + 1.162 + level_image.putpalette(colours["black"] + colours["red"] + colour + \ 1.163 + colours["yellow"]) 1.164 + level_image.save(os.path.join(output_dir, name + ".png")) 1.165 1.166 - level_image.save(output_path) 1.167 sys.exit()
