Esempio n. 1
0
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)
Esempio n. 2
0
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))
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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