Advertisement
sebbu

tmx_converter.py patch

Feb 7th, 2013
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 7.44 KB | None | 0 0
  1. diff --git a/tools/tmx_converter.py b/tools/tmx_converter.py
  2. index a9dc929..bcfabd3 100755
  3. --- a/tools/tmx_converter.py
  4. +++ b/tools/tmx_converter.py
  5. @@ -49,7 +49,7 @@ other_warp_fields = (
  6.  )
  7.  
  8.  TILESIZE = 32
  9. -SEPARATOR = '|'
  10. +SEPARATOR = '\t'
  11.  MESSAGE = 'This file is generated automatically. All manually changes will be removed when running the Converter.'
  12.  CLIENT_MAPS = 'maps'
  13.  SERVER_WLK = 'data'
  14. @@ -111,6 +111,8 @@ class ContentHandler(xml.sax.ContentHandler):
  15.          'name',     # name property of the current map
  16.          'object',   # stores properties of the latest <object> tag
  17.          'mob_ids',  # set of all mob types that spawn here
  18. +        'collision_fgid', # first gid in collision tileset
  19. +        'collision_lgid', # last gid in collision tileset
  20.      )
  21.      def __init__(self, out, npc_dir, mobs, warps, imports):
  22.          xml.sax.ContentHandler.__init__(self)
  23. @@ -130,6 +132,8 @@ class ContentHandler(xml.sax.ContentHandler):
  24.          self.imports = imports
  25.          self.object = None
  26.          self.mob_ids = set()
  27. +        self.collision_fgid = 0
  28. +        self.collision_lgid = 0
  29.  
  30.      def setDocumentLocator(self, loc):
  31.          self.locator = loc
  32. @@ -162,6 +166,8 @@ class ContentHandler(xml.sax.ContentHandler):
  33.  
  34.              if name == u'tileset':
  35.                  self.tilesets.add(int(attr[u'firstgid']))
  36. +                if attr.get(u'name','').lower().startswith(u'collision'):
  37. +                    self.collision_fgid = int(attr[u'firstgid'])
  38.  
  39.              if name == u'layer' and attr[u'name'].lower().startswith(u'collision'):
  40.                  self.width = int(attr[u'width'])
  41. @@ -169,6 +175,8 @@ class ContentHandler(xml.sax.ContentHandler):
  42.                  self.out.write(struct.pack('<HH', self.width, self.height))
  43.                  self.state = State.LAYER
  44.          elif self.state is State.LAYER:
  45. +            if name == u'layer' and self.collision_lgid == 0:
  46. +                self.collision_lgid = int(attr[u'firstgid'])-1
  47.              if name == u'data':
  48.                  if attr.get(u'encoding','') not in (u'', u'csv', u'base64', u'xml'):
  49.                      print('Bad encoding:', attr.get(u'encoding',''))
  50. @@ -180,9 +188,19 @@ class ContentHandler(xml.sax.ContentHandler):
  51.                  self.compression = attr.get(u'compression','')
  52.                  self.state = State.DATA
  53.          elif self.state is State.DATA:
  54. -            self.out.write(chr(int(attr.get(u'gid',0)) not in self.tilesets))
  55. +            if name == u'tile':
  56. +                gid = int(attr.get(u'gid'))
  57. +                if (self.collision_lgid <> 0 and gid >= self.collision_lgid) or ( gid <> 0 and gid < self.collision_fgid):
  58. +                    print('bad gid in layer (xml)', self.collision_fgid, gid, self.collision_lgid)
  59. +                    return
  60. +                if gid <> 0:
  61. +                    self.out.write(chr(int(attr.get(u'gid',0)) - self.collision_fgid))
  62. +                else:
  63. +                    self.out.write(chr(0))
  64.          elif self.state is State.FINAL:
  65.              if name == u'object':
  66. +                if attr.get(u'type') == None:
  67. +                    return
  68.                  obj_type = attr[u'type'].lower()
  69.                  x = int(attr[u'x']) / TILESIZE;
  70.                  y = int(attr[u'y']) / TILESIZE;
  71. @@ -240,6 +258,8 @@ class ContentHandler(xml.sax.ContentHandler):
  72.          if name == u'object':
  73.              obj = self.object
  74.              if isinstance(obj, Mob):
  75. +                if not hasattr(obj, u'max_beings') or not hasattr(obj, u'ea_spawn') or not hasattr(obj, u'ea_death'):
  76. +                    return
  77.                  mob_id = obj.monster_id
  78.                  if mob_id < 1000:
  79.                      mob_id += 1002
  80. @@ -249,10 +269,13 @@ class ContentHandler(xml.sax.ContentHandler):
  81.                          '%s.gat,%d,%d,%d,%d' % (self.base, obj.x, obj.y, obj.w, obj.h),
  82.                          'monster',
  83.                          obj.name,
  84. -                        '%d,%d,%d,%d,Mob%s::On%d\n' % (mob_id, obj.max_beings, obj.ea_spawn, obj.ea_death, self.base, mob_id),
  85. +                        #'%d,%d,%d,%d,Mob%s::On%d\n' % (mob_id, obj.max_beings, obj.ea_spawn, obj.ea_death, self.base, mob_id),
  86. +                        '%d,%d,%d,%d\n' % (mob_id, obj.max_beings, obj.ea_spawn, obj.ea_death),
  87.                      ])
  88.                  )
  89.              elif isinstance(obj, Warp):
  90. +                if not hasattr(obj, u'dest_map') or not hasattr(obj, u'dest_x') or not hasattr(obj, u'dest_y'):
  91. +                    return
  92.                  self.warps.write(
  93.                      SEPARATOR.join([
  94.                          '%s.gat,%d,%d' % (self.base, obj.x, obj.y),
  95. @@ -266,7 +289,13 @@ class ContentHandler(xml.sax.ContentHandler):
  96.              if self.state is State.DATA:
  97.                  if self.encoding == u'csv':
  98.                      for x in self.buffer.split(','):
  99. -                        self.out.write(chr(int(x) not in self.tilesets))
  100. +                        if (self.collision_lgid <> 0 and x >= self.collision_lgid) or ( x <> 0 and x < self.collision_fgid):
  101. +                            print('bad gid in layer (csv)', self.collision_fgid, x, self.collision_lgid)
  102. +                            return
  103. +                        if x <> 0:
  104. +                            self.out.write(chr(int(x) - self.collision_fgid))
  105. +                        else:
  106. +                            self.out.write(chr(0))
  107.                  elif self.encoding == u'base64':
  108.                      data = base64.b64decode(str(self.buffer))
  109.                      if self.compression == u'zlib':
  110. @@ -274,14 +303,28 @@ class ContentHandler(xml.sax.ContentHandler):
  111.                      elif self.compression == u'gzip':
  112.                          data = zlib.decompressobj().decompress('x\x9c' + data[10:-8])
  113.                      for i in range(self.width*self.height):
  114. -                        self.out.write(chr(int(struct.unpack('<I',data[i*4:i*4+4])[0]) not in self.tilesets))
  115. +                        gid = int(struct.unpack('<I',data[i*4:i*4+4])[0])
  116. +                        if (self.collision_lgid <> 0 and gid >= self.collision_lgid) or ( gid <> 0 and gid < self.collision_fgid):
  117. +                            print('bad gid in layer (base64)', self.collision_fgid, gid, self.collision_lgid)
  118. +                            return
  119. +                        if gid <> 0:
  120. +                            self.out.write(chr(gid - self.collision_fgid))
  121. +                        else:
  122. +                            self.out.write(chr(0))
  123.                  self.state = State.FINAL
  124.  
  125.      def endDocument(self):
  126. -        self.mobs.write('\n\n%s.gat,0,0,0|script|Mob%s|-1,{\n' % (self.base, self.base))
  127. -        for mob_id in sorted(self.mob_ids):
  128. -            self.mobs.write('On%d:\n    set @mobID, %d;\n    callfunc "MobPoints";\n    end;\n\n' % (mob_id, mob_id))
  129. -        self.mobs.write('    end;\n}\n')
  130. +        #self.mobs.write(
  131. +        #    SEPARATOR.join([
  132. +        #        '\n\n%s.gat,0,0,0' % (self.base),
  133. +        #        'script',
  134. +        #        'Mob%s' % (self.base),
  135. +        #        '-1,{\n',
  136. +        #    ])
  137. +        #)
  138. +        #for mob_id in sorted(self.mob_ids):
  139. +        #    self.mobs.write('On%d:\n    set @mobID, %d;\n    callfunc "MobPoints";\n    end;\n\n' % (mob_id, mob_id))
  140. +        #self.mobs.write('    end;\n}\n')
  141.          self.imports.write('// Map %s: %s\n' % (self.base, self.name))
  142.          self.imports.write('// %s\n' % MESSAGE)
  143.          self.imports.write('map: %s.gat\n' % self.base)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement