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()