<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.militaryconflictvietnam.com/index.php?action=history&amp;feed=atom&amp;title=WeaponScriptToWiki.py</id>
	<title>WeaponScriptToWiki.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.militaryconflictvietnam.com/index.php?action=history&amp;feed=atom&amp;title=WeaponScriptToWiki.py"/>
	<link rel="alternate" type="text/html" href="https://wiki.militaryconflictvietnam.com/index.php?title=WeaponScriptToWiki.py&amp;action=history"/>
	<updated>2026-04-26T21:53:58Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.militaryconflictvietnam.com/index.php?title=WeaponScriptToWiki.py&amp;diff=9764&amp;oldid=prev</id>
		<title>Skizmophonic at 00:50, 3 September 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.militaryconflictvietnam.com/index.php?title=WeaponScriptToWiki.py&amp;diff=9764&amp;oldid=prev"/>
		<updated>2025-09-03T00:50:28Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://wiki.militaryconflictvietnam.com/index.php?title=WeaponScriptToWiki.py&amp;amp;diff=9764&amp;amp;oldid=9231&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Skizmophonic</name></author>
	</entry>
	<entry>
		<id>https://wiki.militaryconflictvietnam.com/index.php?title=WeaponScriptToWiki.py&amp;diff=9231&amp;oldid=prev</id>
		<title>Skizmophonic: Created page with &quot;import os import re  # Utility functions for conversions def kg_to_g(kg):     return round(kg * 1000, 2)  def kg_to_grains(kg):     return round(kg * 15432.36, 2)  def kg_to_lbs(kg):     return round(kg * 2.20462, 2)  # Load the template file def load_template(template_path):     with open(template_path, &quot;r&quot;, encoding=&quot;utf-8&quot;) as f:         return f.read()  # Parse key-value pairs from script file def parse_file(file_path):     variables = {}     with open(file_path, &quot;r&quot;...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.militaryconflictvietnam.com/index.php?title=WeaponScriptToWiki.py&amp;diff=9231&amp;oldid=prev"/>
		<updated>2025-01-09T02:55:38Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;import os import re  # Utility functions for conversions def kg_to_g(kg):     return round(kg * 1000, 2)  def kg_to_grains(kg):     return round(kg * 15432.36, 2)  def kg_to_lbs(kg):     return round(kg * 2.20462, 2)  # Load the template file def load_template(template_path):     with open(template_path, &amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:         return f.read()  # Parse key-value pairs from script file def parse_file(file_path):     variables = {}     with open(file_path, &amp;quot;r&amp;quot;...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;import os&lt;br /&gt;
import re&lt;br /&gt;
&lt;br /&gt;
# Utility functions for conversions&lt;br /&gt;
def kg_to_g(kg):&lt;br /&gt;
    return round(kg * 1000, 2)&lt;br /&gt;
&lt;br /&gt;
def kg_to_grains(kg):&lt;br /&gt;
    return round(kg * 15432.36, 2)&lt;br /&gt;
&lt;br /&gt;
def kg_to_lbs(kg):&lt;br /&gt;
    return round(kg * 2.20462, 2)&lt;br /&gt;
&lt;br /&gt;
# Load the template file&lt;br /&gt;
def load_template(template_path):&lt;br /&gt;
    with open(template_path, &amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        return f.read()&lt;br /&gt;
&lt;br /&gt;
# Parse key-value pairs from script file&lt;br /&gt;
def parse_file(file_path):&lt;br /&gt;
    variables = {}&lt;br /&gt;
    with open(file_path, &amp;quot;r&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
        for line in f:&lt;br /&gt;
            match = re.match(r&amp;#039;\s*&amp;quot;(.+?)&amp;quot;\s+&amp;quot;(.+?)&amp;quot;&amp;#039;, line)&lt;br /&gt;
            if match:&lt;br /&gt;
                key, value = match.groups()&lt;br /&gt;
                variables[key.lower()] = value&lt;br /&gt;
    return variables&lt;br /&gt;
&lt;br /&gt;
# Retrieve the printnameenglish value from the vietnam_english.txt file&lt;br /&gt;
def get_printname_english(printname):&lt;br /&gt;
    file_path = r&amp;quot;C:\Program Files (x86)\Steam\steamapps\common\Military Conflict - Vietnam\vietnam\resource\vietnam_english.txt&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
    # Remove the leading &amp;quot;#&amp;quot; from printname&lt;br /&gt;
    printname = printname.lstrip(&amp;#039;#&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
    # Try opening the file with different encodings&lt;br /&gt;
    encodings = [&amp;quot;utf-8&amp;quot;, &amp;quot;utf-16&amp;quot;, &amp;quot;latin-1&amp;quot;]&lt;br /&gt;
    for enc in encodings:&lt;br /&gt;
        try:&lt;br /&gt;
            with open(file_path, &amp;quot;r&amp;quot;, encoding=enc) as f:&lt;br /&gt;
                for line in f:&lt;br /&gt;
                    line = line.strip()&lt;br /&gt;
                    # Ensure the line is in the format we expect (e.g. &amp;quot;weapon_ammobox&amp;quot; &amp;quot;Ammunition Box&amp;quot;)&lt;br /&gt;
                    match = re.match(r&amp;#039;^\s*&amp;quot;(.+?)&amp;quot;\s+&amp;quot;(.+?)&amp;quot;\s*$&amp;#039;, line)&lt;br /&gt;
                    if match:&lt;br /&gt;
                        key, value = match.groups()&lt;br /&gt;
                        # If the key matches the printname, return the corresponding value&lt;br /&gt;
                        if key.lower() == printname.lower():&lt;br /&gt;
                            return value&lt;br /&gt;
        except UnicodeDecodeError:&lt;br /&gt;
            continue  # Try the next encoding if decoding fails&lt;br /&gt;
    print(f&amp;quot;Error: Unable to decode the file or find the key &amp;#039;{printname}&amp;#039;&amp;quot;)&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
# Get the origin value and process it&lt;br /&gt;
def get_origin(origin):&lt;br /&gt;
    # Remove leading &amp;quot;#&amp;quot; and any other unwanted characters&lt;br /&gt;
    origin = origin.lstrip(&amp;#039;#&amp;#039;).replace(&amp;quot;_&amp;quot;, &amp;quot; &amp;quot;).title()&lt;br /&gt;
    return origin&lt;br /&gt;
&lt;br /&gt;
# Preprocess calculations for the template&lt;br /&gt;
def preprocess_calculations(variables, file_name, folder_path):&lt;br /&gt;
    calculations = {}&lt;br /&gt;
&lt;br /&gt;
    # Retrieve damage-related values (set default to 0 if not found)&lt;br /&gt;
    damage_generic = float(variables.get(&amp;quot;damagegeneric&amp;quot;, &amp;quot;0&amp;quot;))&lt;br /&gt;
    damage_head_multiplier = float(variables.get(&amp;quot;damageheadmultiplier&amp;quot;, &amp;quot;1&amp;quot;))&lt;br /&gt;
    damage_chest_multiplier = float(variables.get(&amp;quot;damagechestmultiplier&amp;quot;, &amp;quot;1&amp;quot;))&lt;br /&gt;
    damage_stomach_multiplier = float(variables.get(&amp;quot;damagestomachmultiplier&amp;quot;, &amp;quot;1&amp;quot;))&lt;br /&gt;
    damage_leg_multiplier = float(variables.get(&amp;quot;damagelegmultiplier&amp;quot;, &amp;quot;1&amp;quot;))&lt;br /&gt;
    damage_arm_multiplier = float(variables.get(&amp;quot;damagearmmultiplier&amp;quot;, &amp;quot;1&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    # Calculate damage multipliers (only if damage_generic is greater than 0)&lt;br /&gt;
    if damage_generic &amp;gt; 0:&lt;br /&gt;
        calculations[&amp;quot;damagegenericxdamageheadmultiplier&amp;quot;] = round(damage_generic * damage_head_multiplier, 2)&lt;br /&gt;
        calculations[&amp;quot;damagegenericxdamagechestmultiplier&amp;quot;] = round(damage_generic * damage_chest_multiplier, 2)&lt;br /&gt;
        calculations[&amp;quot;damagegenericxdamagestomachmultiplier&amp;quot;] = round(damage_generic * damage_stomach_multiplier, 2)&lt;br /&gt;
        calculations[&amp;quot;damagegenericxdamagelegmultiplier&amp;quot;] = round(damage_generic * damage_leg_multiplier, 2)&lt;br /&gt;
        calculations[&amp;quot;damagegenericxdamagearmmultiplier&amp;quot;] = round(damage_generic * damage_arm_multiplier, 2)&lt;br /&gt;
    else:&lt;br /&gt;
        calculations[&amp;quot;damagegenericxdamageheadmultiplier&amp;quot;] = &amp;quot;N/A&amp;quot;&lt;br /&gt;
        calculations[&amp;quot;damagegenericxdamagechestmultiplier&amp;quot;] = &amp;quot;N/A&amp;quot;&lt;br /&gt;
        calculations[&amp;quot;damagegenericxdamagestomachmultiplier&amp;quot;] = &amp;quot;N/A&amp;quot;&lt;br /&gt;
        calculations[&amp;quot;damagegenericxdamagelegmultiplier&amp;quot;] = &amp;quot;N/A&amp;quot;&lt;br /&gt;
        calculations[&amp;quot;damagegenericxdamagearmmultiplier&amp;quot;] = &amp;quot;N/A&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Bayonet check&lt;br /&gt;
    has_bayonet = variables.get(&amp;quot;hasbayonet&amp;quot;, &amp;quot;0&amp;quot;) == &amp;quot;1&amp;quot;&lt;br /&gt;
    calculations[&amp;quot;hasbayonet&amp;quot;] = &amp;quot;YES&amp;quot; if has_bayonet else &amp;quot;NO&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Rifle grenade file check&lt;br /&gt;
    file_base_name = os.path.splitext(file_name)[0]&lt;br /&gt;
    rifle_grenade_file = os.path.join(folder_path, f&amp;quot;{file_base_name}_riflegrenade.txt&amp;quot;)&lt;br /&gt;
    has_rifle_grenade = os.path.exists(rifle_grenade_file)&lt;br /&gt;
    calculations[&amp;quot;hasriflegrenade&amp;quot;] = &amp;quot;YES&amp;quot; if has_rifle_grenade else &amp;quot;NO&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # Weight conversions&lt;br /&gt;
    bullet_weight = float(variables.get(&amp;quot;bullet_weight&amp;quot;, &amp;quot;0&amp;quot;))&lt;br /&gt;
    weight = float(variables.get(&amp;quot;weight&amp;quot;, &amp;quot;0&amp;quot;))&lt;br /&gt;
    print(f&amp;quot;DEBUG: Bullet weight in kg: {bullet_weight}&amp;quot;)  # Debug print&lt;br /&gt;
&lt;br /&gt;
    calculations[&amp;quot;bullet_weight&amp;quot;] = kg_to_g(bullet_weight)&lt;br /&gt;
    calculations[&amp;quot;bullet_weightingr&amp;quot;] = kg_to_grains(bullet_weight)  # Ensure conversion to grains&lt;br /&gt;
    calculations[&amp;quot;weightinlbs&amp;quot;] = kg_to_lbs(weight)&lt;br /&gt;
&lt;br /&gt;
    # ExtraBulletChamber check&lt;br /&gt;
    calculations[&amp;quot;extrabulletchamber&amp;quot;] = variables.get(&amp;quot;extrabulletchamber&amp;quot;, &amp;quot;0&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    # File name replacement (ensure base name without extension)&lt;br /&gt;
    calculations[&amp;quot;filename&amp;quot;] = file_base_name&lt;br /&gt;
&lt;br /&gt;
    # Get the printname and replace with the appropriate english translation if found&lt;br /&gt;
    printname = variables.get(&amp;quot;printname&amp;quot;, &amp;quot;&amp;quot;).lstrip(&amp;quot;#&amp;quot;)  # Strip the leading &amp;quot;#&amp;quot; here as well&lt;br /&gt;
    printname_english = get_printname_english(printname)&lt;br /&gt;
    if printname_english:&lt;br /&gt;
        calculations[&amp;quot;printnameenglish&amp;quot;] = printname_english&lt;br /&gt;
    else:&lt;br /&gt;
        calculations[&amp;quot;printnameenglish&amp;quot;] = printname&lt;br /&gt;
&lt;br /&gt;
    # Get the origin and process it&lt;br /&gt;
    origin = variables.get(&amp;quot;origin&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    calculations[&amp;quot;origin&amp;quot;] = get_origin(origin)&lt;br /&gt;
&lt;br /&gt;
    return calculations&lt;br /&gt;
&lt;br /&gt;
# Replace placeholders in the template&lt;br /&gt;
def replace_placeholders(template, variables, calculations):&lt;br /&gt;
    result = template&lt;br /&gt;
&lt;br /&gt;
    # Replace placeholders with variables or calculations&lt;br /&gt;
    for placeholder in re.findall(r&amp;#039;&amp;quot;&amp;quot;([^&amp;quot;]+)&amp;quot;&amp;quot;&amp;#039;, result):&lt;br /&gt;
        # Check if placeholder is &amp;quot;FILENAME&amp;quot; and replace it with the file base name&lt;br /&gt;
        if placeholder.lower() == &amp;quot;filename&amp;quot;:&lt;br /&gt;
            value = calculations[&amp;quot;filename&amp;quot;]&lt;br /&gt;
        elif placeholder.lower() == &amp;quot;bullet_weightingr&amp;quot;:  # Ensure correct grains conversion handling&lt;br /&gt;
            value = str(calculations[&amp;quot;bullet_weightingr&amp;quot;])  # Correct grains replacement&lt;br /&gt;
        elif placeholder.lower() == &amp;quot;extrabulletchamber&amp;quot;:&lt;br /&gt;
            # Only add [[]] if extra_bullet_chamber is not &amp;quot;0&amp;quot;&lt;br /&gt;
            extra_bullet_chamber = calculations.get(&amp;quot;extrabulletchamber&amp;quot;, &amp;quot;0&amp;quot;)&lt;br /&gt;
            if extra_bullet_chamber == &amp;quot;0&amp;quot;:&lt;br /&gt;
                value = &amp;quot;&amp;quot;  # Remove the [[]] if the chamber is not present&lt;br /&gt;
            else:&lt;br /&gt;
                value = &amp;quot;[[]]&amp;quot;  # Keep the [[]] if ExtraBulletChamber is set&lt;br /&gt;
        else:&lt;br /&gt;
            value = calculations.get(placeholder.lower(), variables.get(placeholder.lower(), &amp;quot;N/A&amp;quot;))&lt;br /&gt;
        # Replace the placeholder correctly (ensuring the exact match with quotes)&lt;br /&gt;
        result = result.replace(f&amp;#039;&amp;quot;&amp;quot;{placeholder}&amp;quot;&amp;quot;&amp;#039;, str(value))&lt;br /&gt;
&lt;br /&gt;
    # Handle ammo column, ensuring the proper format (no extra [[]] and correct ammo count)&lt;br /&gt;
    result = re.sub(r&amp;quot;(\d+)/(\d+)(\[\[\]\])?&amp;quot;, lambda m: m.group(1) + (&lt;br /&gt;
        f&amp;quot;[[+{calculations[&amp;#039;extrabulletchamber&amp;#039;]}]]&amp;quot; if calculations[&amp;quot;extrabulletchamber&amp;quot;] == &amp;quot;2&amp;quot; else&lt;br /&gt;
        f&amp;quot;[[+1]]&amp;quot; if calculations[&amp;quot;extrabulletchamber&amp;quot;] == &amp;quot;1&amp;quot; else &amp;quot;&amp;quot;) &lt;br /&gt;
        + &amp;quot;/&amp;quot; + m.group(2), result)&lt;br /&gt;
&lt;br /&gt;
    return result&lt;br /&gt;
&lt;br /&gt;
# Process all script files&lt;br /&gt;
def process_files(template, scripts_path, output_path):&lt;br /&gt;
    for root, _, files in os.walk(scripts_path):&lt;br /&gt;
        for file in files:&lt;br /&gt;
            if not file.endswith(&amp;quot;.txt&amp;quot;):&lt;br /&gt;
                continue&lt;br /&gt;
&lt;br /&gt;
            input_file = os.path.join(root, file)&lt;br /&gt;
            file_name = os.path.basename(file)&lt;br /&gt;
            variables = parse_file(input_file)&lt;br /&gt;
            calculations = preprocess_calculations(variables, file_name, root)&lt;br /&gt;
            processed_template = replace_placeholders(template, variables, calculations)&lt;br /&gt;
&lt;br /&gt;
            # Save processed template to output&lt;br /&gt;
            output_file = os.path.join(output_path, file_name)&lt;br /&gt;
            with open(output_file, &amp;quot;w&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;) as f:&lt;br /&gt;
                f.write(processed_template)&lt;br /&gt;
&lt;br /&gt;
# Paths&lt;br /&gt;
template_path = r&amp;quot;C:\MCV\wiki\WikiTemplate.txt&amp;quot;&lt;br /&gt;
scripts_path = r&amp;quot;C:\Program Files (x86)\Steam\steamapps\common\Military Conflict - Vietnam\vietnam\scripts&amp;quot;&lt;br /&gt;
output_path = r&amp;quot;C:\MCV\wiki\output&amp;quot;&lt;br /&gt;
os.makedirs(output_path, exist_ok=True)&lt;br /&gt;
&lt;br /&gt;
# Main execution&lt;br /&gt;
template = load_template(template_path)&lt;br /&gt;
process_files(template, scripts_path, output_path)&lt;br /&gt;
&lt;br /&gt;
def remove_hash_from_files(directory):&lt;br /&gt;
    # Check if the directory exists&lt;br /&gt;
    if not os.path.exists(directory):&lt;br /&gt;
        print(f&amp;quot;The directory &amp;#039;{directory}&amp;#039; does not exist.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
    &lt;br /&gt;
    # Iterate through all files in the directory&lt;br /&gt;
    for filename in os.listdir(directory):&lt;br /&gt;
        # Full path of the file&lt;br /&gt;
        file_path = os.path.join(directory, filename)&lt;br /&gt;
        &lt;br /&gt;
        # Process only text files&lt;br /&gt;
        if os.path.isfile(file_path) and filename.endswith(&amp;#039;.txt&amp;#039;):&lt;br /&gt;
            try:&lt;br /&gt;
                # Read the file contents&lt;br /&gt;
                with open(file_path, &amp;#039;r&amp;#039;, encoding=&amp;#039;utf-8&amp;#039;) as file:&lt;br /&gt;
                    content = file.read()&lt;br /&gt;
                &lt;br /&gt;
                # Remove &amp;#039;#&amp;#039; characters&lt;br /&gt;
                updated_content = content.replace(&amp;#039;#&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
                &lt;br /&gt;
                # Write the updated content back to the file&lt;br /&gt;
                with open(file_path, &amp;#039;w&amp;#039;, encoding=&amp;#039;utf-8&amp;#039;) as file:&lt;br /&gt;
                    file.write(updated_content)&lt;br /&gt;
                &lt;br /&gt;
                print(f&amp;quot;Processed file: {filename}&amp;quot;)&lt;br /&gt;
            except Exception as e:&lt;br /&gt;
                print(f&amp;quot;Error processing file {filename}: {e}&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Define the directory&lt;br /&gt;
directory = r&amp;quot;C:\MCV\wiki\output&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Call the function&lt;br /&gt;
remove_hash_from_files(directory)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Processing complete.&amp;quot;)&lt;/div&gt;</summary>
		<author><name>Skizmophonic</name></author>
	</entry>
</feed>