def sd2blocklist(cls, sd: Sidedef, sectors): blocklist = [ Assignment("sector", sectors[sd.sector][0]), Assignment("texturemiddle", sd.texturemiddle), ] if sd.offsetx: blocklist.append(Assignment("offsetx", sd.offsetx)) if sd.offsety: blocklist.append(Assignment("offsety", sd.offsety)) return blocklist
def _to_block(cls, dct, ld, vertices): lists = [] lists += [ Assignment("v1", vertices[ld.v1]), Assignment("v2", vertices[ld.v2]), Assignment("sidefront", dct['sidefront']), ] if "sideback" in dct: lists.append(Assignment("sideback", dct["sideback"])) lists += [Assignment("blocking", ld.blocking)] return lists
def _add_things(self, textmap: Textmap): # TODO multiplicity things = { t: Block("thing", [ Assignment("x", Decimal("{0:.3f}".format(t.x))), Assignment("y", Decimal("{0:.3f}".format(t.y))), Assignment("type", t.type), ]) for t in textmap.things } return list(things.values()) + self._add_vertices(textmap)
def _add_vertices(self, textmap: Textmap): vertices = { v: Block("vertex", [ Assignment("x", Decimal("{0:.3f}".format(v.x))), Assignment("y", Decimal("{0:.3f}".format(v.y))), ]) for i, v in enumerate( sorted(textmap.vertices, key=lambda e: (e.y, e.x))) } vertex_list = sorted(vertices.items(), key=lambda e: (e[0].y, e[0].x)) vertex_list = [b for _, b in vertex_list] return vertex_list + self._add_linedefs(textmap)
def _s2blocklist(cls, s: Sector): blocklist = [ Assignment("heightceiling", s.heightceiling), Assignment("texturefloor", s.texturefloor), Assignment("textureceiling", s.textureceiling), ] if s.heightfloor: blocklist.append(Assignment("heightfloor", s.heightfloor)) if s.xscalefloor != 1.0: blocklist.append( Assignment("xscalefloor", Decimal("{0:.6f}".format(s.xscalefloor)))) if s.yscalefloor != 1.0: blocklist.append( Assignment("yscalefloor", Decimal("{0:.6f}".format(s.yscalefloor)))) if s.xscaleceiling != 1.0: blocklist.append( Assignment("xscaleceiling", Decimal("{0:.6f}".format(s.xscaleceiling)))) if s.yscaleceiling != 1.0: blocklist.append( Assignment("yscaleceiling", Decimal("{0:.6f}".format(s.yscaleceiling)))) return list(sorted(blocklist, key=lambda a: a.identifier))
def textmap2ast(self, textmap: Textmap) -> TranslationUnit: assignments = [ Assignment("namespace", textmap.namespace), ] global_exprs = assignments + self._add_things(textmap) assert not any(e is None for e in global_exprs) return TranslationUnit(*global_exprs)
def _to_sidedefs(cls, cycles_sides, linedef_list): cycle_to_sectorid = cls._assign_cycle_to_sectorid( linedef_list, cycles_sides) front_sector_ids = cls._ld2sdid(linedef_list, cycle_to_sectorid) sidefronts = [ Block("sidedef", [ Assignment("sector", sector_id), Assignment("texturemiddle", "MARBFACE"), ]) for sector_id in front_sector_ids ] back_sector_ids = cls._ld2sdid_back(linedef_list, cycle_to_sectorid) sidebacks = [ Block("sidedef", [ Assignment("sector", sector_id), Assignment("texturemiddle", "MARBFACE"), ]) for sector_id in back_sector_ids ] return sidefronts + sidebacks
def parse_udmf(textmap_string: str): """ translation_unit := global_expr_list global_expr_list := global_expr global_expr_list global_expr := block | assignment_expr block := identifier '{' expr_list '}' expr_list := assignment_expr expr_list assignment_expr := identifier '=' value ';' | nil identifier := [A-Za-z_]+[A-Za-z0-9_]* value := integer | float | quoted_string | keyword integer := [+-]?[1-9]+[0-9]* | 0[0-9]+ | 0x[0-9A-Fa-f]+ float := [+-]?[0-9]+'.'[0-9]*([eE][+-]?[0-9]+)? quoted_string := "([^"\\]*(\\.[^"\\]*)*)" keyword := [^{}();"'\n\t ]+ :param textmap_string: :return: pyparsing instance parsed from @textmap_string """ _plusorminus = Literal('+') | Literal('-') identifier = Word(alphas + '_', alphanums + '_') _uinteger = Word(nums) # TODO hexadecimal, octal integers _integer = Combine(Optional(_plusorminus) + _uinteger) _float = Combine(_integer + Optional(Literal('.') + Optional(_uinteger))) keyword = Word(alphas) # [^{}();"'\n\t ]+ value = _float | QuotedString('"') | keyword assignment_expr = Assignment.group(identifier + '=' + value + ';') expr_list = ZeroOrMore(assignment_expr) block = Block.group(identifier + '{' + expr_list + '}') global_expr = block | assignment_expr global_expr_list = ZeroOrMore(global_expr) translation_unit = TranslationUnit.group(global_expr_list) ast = translation_unit.parseString(textmap_string)[0] return ast
def ast(self) -> TranslationUnit: return TranslationUnit( Assignment("namespace", "zdoom"), Block("thing", [ Assignment("x", Decimal('32.000')), Assignment("y", Decimal('32.000')), Assignment("type", 1), ]), Block("vertex", [ Assignment("x", Decimal('0.000')), Assignment("y", Decimal('0.000')), ]), Block("vertex", [ Assignment("x", Decimal('64.000')), Assignment("y", Decimal('0.000')), ]), Block("vertex", [ Assignment("x", Decimal('128.000')), Assignment("y", Decimal('0.000')), ]), Block("vertex", [ Assignment("x", Decimal('0.000')), Assignment("y", Decimal('64.000')), ]), Block("vertex", [ Assignment("x", Decimal('64.000')), Assignment("y", Decimal('64.000')), ]), Block("vertex", [ Assignment("x", Decimal('128.000')), Assignment("y", Decimal('64.000')), ]), Block("vertex", [ Assignment("x", Decimal('0.000')), Assignment("y", Decimal('128.000')), ]), Block("vertex", [ Assignment("x", Decimal('64.000')), Assignment("y", Decimal('128.000')), ]), Block("vertex", [ Assignment("x", Decimal('128.000')), Assignment("y", Decimal('128.000')), ]), Block("linedef", [ Assignment("v1", 0), Assignment("v2", 3), Assignment("sidefront", 0), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 1), Assignment("v2", 0), Assignment("sidefront", 1), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 2), Assignment("v2", 1), Assignment("sidefront", 2), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 3), Assignment("v2", 4), Assignment("sidefront", 3), Assignment("sideback", 12), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 3), Assignment("v2", 6), Assignment("sidefront", 4), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 4), Assignment("v2", 1), Assignment("sidefront", 5), Assignment("sideback", 13), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 4), Assignment("v2", 5), Assignment("sidefront", 6), Assignment("sideback", 14), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 5), Assignment("v2", 2), Assignment("sidefront", 7), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 6), Assignment("v2", 7), Assignment("sidefront", 8), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 7), Assignment("v2", 4), Assignment("sidefront", 9), Assignment("sideback", 15), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 7), Assignment("v2", 8), Assignment("sidefront", 10), Assignment("blocking", True), ]), Block("linedef", [ Assignment("v1", 8), Assignment("v2", 5), Assignment("sidefront", 11), Assignment("blocking", True), ]), Block("sidedef", [ Assignment("sector", 0), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 0), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 1), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 0), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 2), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 0), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 1), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 1), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 2), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 2), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 3), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 3), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 2), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 1), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 3), Assignment("texturemiddle", "MARBFACE"), ]), Block("sidedef", [ Assignment("sector", 3), Assignment("texturemiddle", "MARBFACE"), ]), Block("sector", [ Assignment("heightceiling", 128), Assignment("textureceiling", "CEIL3_3"), Assignment("texturefloor", "CEIL3_3"), ]), Block("sector", [ Assignment("heightceiling", 128), Assignment("textureceiling", "CEIL3_3"), Assignment("texturefloor", "CEIL3_3"), ]), Block("sector", [ Assignment("heightceiling", 128), Assignment("textureceiling", "CEIL3_3"), Assignment("texturefloor", "CEIL3_3"), ]), Block("sector", [ Assignment("heightceiling", 128), Assignment("textureceiling", "CEIL3_3"), Assignment("texturefloor", "CEIL3_3"), ]), )