import os import sys import xml.etree.ElementTree as ET def output_xml_tree(tree, path): with open(path, 'wt') as handle: handle.write('\n') def output_xml_node(node, handle, depth): indent = ' ' * depth attributes = '' for attribute_name in node.attrib.keys(): attributes += ' {}="{}"'.format(attribute_name, node.attrib[attribute_name]) if node.getchildren(): assert (node.text is None) or (not node.text.strip()) handle.write('{}<{}{}>\n'.format(indent, node.tag, attributes)) for child in node.getchildren(): output_xml_node(child, handle, depth + 1) handle.write('{}\n'.format(indent, node.tag)) else: if node.text is None: handle.write('{}<{}{}/>\n'.format(indent, node.tag, attributes)) else: handle.write('{}<{}{}>{}\n'.format(indent, node.tag, attributes, node.text, node.tag)) output_xml_node(tree.getroot(), handle, 0) def remove_terrain_materials(path): with open(path, 'rt') as handle: xml = handle.read() terrain_base = 'terrain_base.xml' in xml terrain_norm = 'terrain_norm.xml' in xml terrain_spec = 'terrain_spec.xml' in xml terrain_triplanar = 'terrain_triplanar.xml' in xml should_save = terrain_base or terrain_norm or terrain_spec or terrain_triplanar assert xml.count('') == 1 tree = ET.parse(path) root = tree.getroot() for element in root.getchildren(): if len(element.getchildren()) > 0: assert element.tag == 'textures' for child in element.getchildren(): assert child.tag == 'texture' if terrain_base or terrain_spec or terrain_triplanar: texture_element = ET.SubElement(element, 'texture') texture_element.set('name', 'normTex') texture_element.set('file', 'types/default_norm.png') if terrain_base or terrain_norm or terrain_triplanar: texture_element = ET.SubElement(element, 'texture') texture_element.set('name', 'specTex') texture_element.set('file', 'types/blackness.dds') elif element.tag == 'material': if terrain_base or terrain_norm or terrain_spec: element.text = 'terrain_norm_spec.xml' elif terrain_triplanar: element.text = 'terrain_triplanar_norm_spec.xml' if should_save: output_xml_tree(tree, path) def get_materials(): return { 'aura.xml': {'norm': False, 'spec': True, 'replacement': 'aura_norm_spec.xml'}, 'aura_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'aura_norm_spec.xml'}, 'basic_glow.xml': {'norm': False, 'spec': True, 'replacement': 'basic_glow_norm_spec.xml'}, 'basic_glow_norm.xml': {'norm': True, 'spec': True, 'replacement': 'basic_glow_norm_spec.xml'}, 'basic_glow_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'basic_glow_norm_spec.xml'}, 'basic_glow_wind.xml': {'norm': False, 'spec': True, 'replacement': 'basic_glow_wind_norm_spec.xml'}, 'basic_glow_wind_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'basic_glow_wind_norm_spec.xml'}, 'basic_specmap.xml': {'norm': False, 'spec': True, 'replacement': 'no_trans_norm_spec.xml'}, 'basic_trans.xml': {'norm': False, 'spec': False, 'replacement': 'basic_trans_norm_spec.xml'}, 'basic_trans_ao.xml': {'norm': False, 'spec': False, 'replacement': 'basic_trans_ao_norm_spec.xml'}, 'basic_trans_ao_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'basic_trans_ao_norm_spec.xml'}, 'basic_trans_ao_parallax_spec.xml': {'norm': True, 'spec': True, 'replacement': 'basic_trans_ao_parallax_spec.xml'}, 'basic_trans_ao_spec.xml': {'norm': False, 'spec': True, 'replacement': 'basic_trans_ao_norm_spec.xml'}, 'basic_trans_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'basic_trans_norm_spec.xml'}, 'basic_trans_parallax_spec.xml': {'norm': True, 'spec': True, 'replacement': 'basic_trans_parallax_spec.xml'}, 'basic_trans_spec.xml': {'norm': False, 'spec': True, 'replacement': 'basic_trans_norm_spec.xml'}, 'basic_trans_wind.xml': {'norm': False, 'spec': False, 'replacement': 'basic_trans_wind_norm_spec.xml'}, 'basic_trans_wind_grain.xml': {'norm': False, 'spec': False, 'replacement': 'basic_trans_wind_grain_norm_spec.xml'}, 'basic_trans_wind_grain_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'basic_trans_wind_grain_norm_spec.xml'}, 'basic_trans_wind_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'basic_trans_wind_norm_spec.xml'}, 'default.xml': {'norm': False, 'spec': False, 'replacement': 'no_trans_norm_spec.xml'}, 'no_trans_ao.xml': {'norm': False, 'spec': False, 'replacement': 'no_trans_ao_norm_spec.xml'}, 'no_trans_ao_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'no_trans_ao_norm_spec.xml'}, 'no_trans_ao_parallax_spec.xml': {'norm': True, 'spec': True, 'replacement': 'no_trans_ao_parallax_spec.xml'}, 'no_trans_ao_spec.xml': {'norm': False, 'spec': True, 'replacement': 'no_trans_ao_norm_spec.xml'}, 'no_trans_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'no_trans_norm_spec.xml'}, 'no_trans_parallax_ao.xml': {'norm': True, 'spec': False, 'replacement': 'no_trans_ao_parallax_spec.xml'}, 'no_trans_parallax_spec.xml': {'norm': True, 'spec': True, 'replacement': 'no_trans_parallax_spec.xml'}, 'no_trans_spec.xml': {'norm': False, 'spec': True, 'replacement': 'no_trans_norm_spec.xml'}, 'objectcolor.xml': {'norm': False, 'spec': False, 'replacement': 'objectcolor_norm_spec.xml'}, 'objectcolor_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'objectcolor_norm_spec.xml'}, 'objectcolor_specmap.xml': {'norm': False, 'spec': True, 'replacement': 'objectcolor_norm_spec.xml'}, 'player_trans.xml': {'norm': False, 'spec': False, 'replacement': 'player_trans_norm_spec.xml'}, 'player_trans_ao.xml': {'norm': False, 'spec': False, 'replacement': 'player_trans_ao_norm_spec.xml'}, 'player_trans_ao_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'player_trans_ao_norm_spec.xml'}, 'player_trans_ao_parallax.xml': {'norm': True, 'spec': False, 'replacement': 'player_trans_ao_parallax_spec.xml'}, 'player_trans_ao_parallax_spec.xml': {'norm': True, 'spec': True, 'replacement': 'player_trans_ao_parallax_spec.xml'}, 'player_trans_ao_spec.xml': {'norm': True, 'spec': True, 'replacement': 'player_trans_ao_spec.xml'}, 'player_trans_norm.xml': {'norm': True, 'spec': False, 'replacement': 'player_trans_norm_spec.xml'}, 'player_trans_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'player_trans_norm_spec.xml'}, 'player_trans_norm_spec_helmet.xml': {'norm': True, 'spec': True, 'replacement': 'player_trans_norm_spec_helmet.xml'}, 'player_trans_parallax.xml': {'norm': True, 'spec': False, 'replacement': 'player_trans_parallax_spec.xml'}, 'player_trans_parallax_spec.xml': {'norm': True, 'spec': True, 'replacement': 'player_trans_parallax_spec.xml'}, 'player_trans_parallax_spec_helmet.xml': {'norm': True, 'spec': True, 'replacement': 'player_trans_parallax_spec_helmet.xml'}, 'player_trans_spec.xml': {'norm': False, 'spec': True, 'replacement': 'player_trans_norm_spec.xml'}, 'player_trans_spec_helmet.xml': {'norm': False, 'spec': True, 'replacement': 'player_trans_norm_spec_helmet.xml'}, 'player_water.xml': {'norm': False, 'spec': False, 'replacement': 'player_water.xml'}, 'rock_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'rock_norm_spec.xml'}, 'rock_norm_spec_ao.xml': {'norm': True, 'spec': True, 'replacement': 'rock_norm_spec_ao.xml'}, 'rock_normstrong_spec.xml': {'norm': True, 'spec': True, 'replacement': 'rock_normstrong_spec.xml'}, 'rock_normstrong_spec_ao.xml': {'norm': True, 'spec': True, 'replacement': 'rock_normstrong_spec_ao.xml'}, 'terrain_base.xml': {'norm': False, 'spec': False, 'replacement': 'terrain_norm_spec.xml'}, 'terrain_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'terrain_norm_spec.xml'}, 'terrain_normstrong_spec.xml': {'norm': True, 'spec': True, 'replacement': 'terrain_normstrong_spec.xml'}, 'terrain_normweak_spec.xml': {'norm': True, 'spec': True, 'replacement': 'terrain_normweak_spec.xml'}, 'terrain_triplanar.xml': {'norm': False, 'spec': False, 'replacement': 'terrain_triplanar_norm_spec.xml'}, 'terrain_triplanar_norm_spec.xml': {'norm': True, 'spec': True, 'replacement': 'terrain_triplanar_norm_spec.xml'}, 'trans_wind.xml': {'norm': False, 'spec': False, 'replacement': 'basic_trans_wind_norm_spec.xml'}, 'waterfall.xml': {'norm': False, 'spec': False, 'replacement': 'waterfall.xml'}, } def get_material(material): return get_materials()[material] def remove_actor_materials(path): with open(path, 'rt') as handle: xml = handle.read() should_save = False tree = ET.parse(path) root = tree.getroot() material_name = None if '' in xml: assert xml.count('') == 1 if root.tag == 'actor': for child in root.getchildren(): if child.tag == 'material': material_name = child.text.strip() child.text = get_material(material_name)['replacement'] else: assert root.tag == 'qualitylevels' for root_child in root.getchildren(): assert root_child.tag == 'inline' or root_child.tag == 'actor' for child in root_child.getchildren(): if child.tag == 'material': material_name = child.text.strip() child.text = get_material(material_name)['replacement'] else: assert root.tag == 'actor' material_name = 'default.xml' material_element = ET.SubElement(root, 'material') material_element.text = get_material(material_name)['replacement'] assert material_name is not None material = get_material(material_name) if material_name == material['replacement']: return replacement_material = get_material(material['replacement']) assert (not material['norm']) or (not material['spec']) assert replacement_material['norm'] and replacement_material['spec'] if material['norm'] != ('normTex' in xml) or material['spec'] != ('specTex' in xml) or '