def handle_tile_layer(layer: minidom.Node, builder: flatbuffers.Builder) -> int: width = int(layer.getAttribute('width')) height = int(layer.getAttribute('height')) tilewidth = float(layer.parentNode.getAttribute('tilewidth')) tileheight = float(layer.parentNode.getAttribute('tileheight')) dataNode = layer.getElementsByTagName('data')[0] if dataNode.firstChild is None: return dataString = dataNode.firstChild.nodeValue rows = dataString.splitlines() data = [] for row in rows: for tile in row.split(','): if tile == '': continue data.append(int(tile)) FlatBuffGenerated.Tilelayer.TilelayerStartTiledataVector( builder, len(data)) for tile in reversed(data): builder.PrependInt16(tile) dataOffset = builder.EndVector(len(data)) FlatBuffGenerated.Tilelayer.TilelayerStart(builder) FlatBuffGenerated.Tilelayer.TilelayerAddWidth(builder, width) FlatBuffGenerated.Tilelayer.TilelayerAddHeight(builder, height) tilesize = FlatBuffGenerated.Vec2.CreateVec2(builder, tilewidth, tileheight) FlatBuffGenerated.Tilelayer.TilelayerAddTilesize(builder, tilesize) FlatBuffGenerated.Tilelayer.TilelayerAddTiledata(builder, dataOffset) return FlatBuffGenerated.Tilelayer.TilelayerEnd(builder)
def handle_tileset(ts: minidom.Node, objs: GameObjects, builder: flatbuffers.Builder): firstgid = int(ts.getAttribute('firstgid')) for t in ts.getElementsByTagName('tile'): gid = int(t.getAttribute('id')) + firstgid name = os.path.basename( t.getElementsByTagName('image')[0].getAttribute('source')) fbname = builder.CreateString(name) FlatBuffGenerated.Tileinfo.TileinfoStart(builder) FlatBuffGenerated.Tileinfo.TileinfoAddName(builder, fbname) FlatBuffGenerated.Tileinfo.TileinfoAddGid(builder, gid) objs.tileinfo.append(FlatBuffGenerated.Tileinfo.TileinfoEnd(builder))
def create_element(handle: IO[bytes], element: Node, tokens: Dict[str, int], depth: int) -> bool: if element.tagName == "_var": return create_text(handle, element.firstChild, tokens, depth) # Open a new element() macros handle.write(b"\t" * depth) handle.write(b"element(\n") # First argument -- the tag name of the element handle.write(b"\t" * (depth + 1)) handle.write(f'"{element.tagName}",\n'.encode("utf-8")) # Second argument -- list of attributes attrs = element.attributes handle.write(b"\t" * (depth + 1)) if attrs: # Start the attrs() macro handle.write(b"attrs( ") for key in attrs.keys(): val = element.getAttribute(key) # Attribute values that start with $ are replacements # with the replacement token being the rest of the value. if val[0] == "$": tokens[val[1:]] = 1 handle.write(f'at_rep( "{key}", {val[1:]} ), '.encode("utf-8")) # Otherwise, the value is taken as a literal string else: handle.write(f'at_str( "{key}", "{val}" ), '.encode("utf-8")) # Each attribute above ends in ", ". To end the macro, we must # remove this and put the closing bracket. handle.seek(-2, SEEK_CUR) handle.write(b" ),\n") # No attributes just has this list point to NULL else: handle.write(b"NULL,\n") # Third argument: the list of child nodes handle.write(b"\t" * (depth + 1)) if element.hasChildNodes(): handle.write(b"children(\n") for child in element.childNodes: if create_node(handle, child, tokens, depth + 2): handle.seek(-1, SEEK_CUR) handle.write(b",\n") handle.seek(-2, SEEK_CUR) handle.write(b"\n") handle.write(b"\t" * (depth + 1)) handle.write(b")\n") else: handle.write(b"NULL\n") # End the element() macro handle.write(b"\t" * depth) handle.write(b")\n") # We create new code return True
def get_dim(o: minidom.Node) -> (float, float): w = float(o.getAttribute('width') or 0) h = float(o.getAttribute('height') or 0) return w, h
def get_pos(o: minidom.Node) -> (float, float, float): x = float(o.getAttribute('x')) y = float(o.getAttribute('y')) rotation = float(o.getAttribute('rotation') or 0) return x, y, rotation