diff LightTools/build.py @ 46:a379bce1aeb1

Rename map.py to build.py; Add release script
author koryspansel
date Thu, 22 Sep 2011 14:35:35 -0700
parents LightTools/Map.py@50def8c971d9
children efd2b1ca5b77
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LightTools/build.py	Thu Sep 22 14:35:35 2011 -0700
@@ -0,0 +1,89 @@
+#
+# build
+#
+
+import sys
+import string
+import struct
+import os
+import functools
+
+class MapDefinition:
+    Parse = functools.partial(string.split, sep=',')
+
+    def __init__(self, size, position, direction, fcount, functions, grid):
+        self.Size = self._ParseVector(size)
+        self.Position = self._ParseVector(position)
+        self.Direction = self._ParseVector(direction)
+        self.Count = self._ParseVector(fcount)
+        self.Functions = self._ParseList(functions)
+        self.Grid = self._ParseList(grid)
+
+    def Write(self, filename):
+        with open(filename, 'wb') as handle:
+            handle.write(struct.pack('i' * len(self.Size),      *self.Size))            # 8
+            handle.write(struct.pack('i' * len(self.Position),  *self.Position))        # 8
+            handle.write(struct.pack('i' * len(self.Direction), *self.Direction))       # 4
+            handle.write(struct.pack('i' * len(self.Count),     *self.Count))           # 4
+
+            for function in self.Functions:
+                handle.write(struct.pack('i' * len(function), *function))               # 4 * Count
+
+            for tower in self.Grid:
+                handle.write(struct.pack('i' * len(tower), *tower))                     # 8 * Size.X * Size.Y
+
+    def _ParseVector(self, line):
+        return map(int, self.Parse(line))
+
+    def _ParseList(self, lines):
+        return [self._ParseVector(line) for line in lines]
+
+def ReadDefinition(filename):
+    def FilterLines(lines):
+        for line in map(string.strip, lines):
+            if line and not line.startswith('#'):
+                yield line.split('#')[0]
+
+    with open(filename, 'rt') as handle:
+        lines = handle.readlines()
+
+    definition = tuple(FilterLines(lines))
+
+    offset = 0
+    size = definition[offset]
+    offset += 1
+    position = definition[offset]
+    offset += 1
+    direction = definition[offset]
+    offset += 1
+    fcount = definition[offset]
+    offset += 1
+    length = int(fcount)
+    functions = definition[offset:offset+length]
+    offset += length
+    grid = definition[offset:]
+
+    return MapDefinition(size, position, direction, fcount, functions, grid)
+        
+if __name__ == '__main__':
+    path_root   = os.path.dirname(sys.argv[0])
+    path_assets = os.path.abspath(os.path.join(path_root, '..', 'Assets', 'Maps'))
+    path_build  = os.path.abspath(os.path.join(path_root, '..', 'Data', 'Maps'))
+
+    if os.path.isdir(path_assets):
+        for filename in os.listdir(path_assets):
+            if not filename.endswith('.def'):
+                continue
+
+            definition = ReadDefinition(os.path.join(path_assets, filename))
+            if not definition:
+                continue
+
+            output = os.path.join(path_build, os.path.splitext(filename)[0] + '.map')
+            folder = os.path.dirname(output)
+
+            if not os.path.isdir(folder):
+                os.makedirs(folder)
+
+            print 'Building %s from %s' % (os.path.basename(output), os.path.basename(filename))
+            definition.Write(output)