from __future__ import annotations
import os
from loader import InitialPakLoader, LanguageLoader, SnowrunnerGameObjectType, SnowrunnerClass, GameData
from logging import getLogger
logger = getLogger(__name__)
def get_head(language: LanguageLoader, category: str, name: str | None = None) -> str:
return f"""\n\n""" + (
f"""
SnowRunnerDB - {category}"""
+ (f""" - {name}""" if name is not None else "")
+ f"""
"""
)
def get_footer():
return f"""
\n\n
"""
def write_html(
file_path: str | os.PathLike, language: LanguageLoader, content: str, category: str, name: str | None = None
):
with open(file_path, "w") as f:
f.write(get_head(language=language, category=category, name=name))
f.write(content)
f.write(get_footer())
def write_trucks(pak: InitialPakLoader, destination_directory: str, language: LanguageLoader):
index_table = ""
truck_types = {}
for reference, truck in pak.get_sorted_object_list(SnowrunnerGameObjectType.TRUCK, language):
if truck.Type != "Truck":
continue
if truck.TruckData.TruckType not in truck_types:
truck_types[truck.TruckData.TruckType] = [(reference, truck)]
else:
truck_types[truck.TruckData.TruckType].append((reference, truck))
truck_file = os.path.join(destination_directory, reference + ".html")
truck_content = f" {truck.get_translated_ui_name(language)}
"
# Engines
truck_content += f" Engines
\n"
engines = [x for y in truck.TruckData.Engines for x in y.Engines]
truck_content += f" \n"
truck_content += f" | Name | Price | Torque | Base Fuel Consumption | Unlock By |
\n"
# Power2Weight
# Power2Fuel
for engine in sorted(engines, key=lambda x: x.Torque):
truck_content += (
f" "
f"| {engine.get_translated_ui_name(language)} | "
f"{engine.GameData.Price}"
f" | {engine.Torque} | "
f"{engine.FuelConsumption} | "
f"{engine.GameData.get_unlock_str()} | "
f"
\n"
)
truck_content += f"
\n"
# Gearboxes
truck_content += f" Gearboxes
\n"
# Suspensions
truck_content += f" Suspensions
\n"
# Winches
truck_content += f" Winches
\n"
# Wheels
truck_content += f" Wheels
\n"
wheel_cat = {}
scales = set()
for cw in truck.TruckData.CompatibleWheels:
scales.add(cw.get_size_in_inches())
damage_cap = cw.TruckWheels.DamageCapacity
width = int(cw.TruckWheels.Width * cw.Scale * 100)
mass = cw.TruckWheels.Mass
# FIXME: cw.TruckWheels.GameData.ReadMassScale (affects the truck mass for dualies)
for tt in cw.TruckWheels.TruckTires.TruckTire:
if tt.Mass > 0:
mass = tt.Mass
if tt.Width > 0:
width = int(tt.Width * cw.Scale * 100)
cat = tt.WheelFriction.get_translated_ui_name(language)
if cat not in wheel_cat:
wheel_cat[cat] = {}
wheel_cat[cat][tt.UiName] = (damage_cap, width, mass, tt)
# Mud_Performance=
# Truck_Weight / (Tire_Count×(Tire_Diameter×Width×Softness)) * Tire_Mud_Rating
for cat in sorted(wheel_cat):
truck_content += f" {cat}
\n"
truck_content += f" \n"
truck_content += f" | | Friction |
\n"
truck_content += f" | Name | Price | Mass | Width | Asphalt | Off-Road | Mud |
\n"
for damage_cap, width, mass, tt in sorted(
wheel_cat[cat].values(), key=lambda v: v[3].get_translated_ui_name(language)
):
truck_content += f" | {tt.get_translated_ui_name(language)} | {tt.GameData.Price} | {mass}kg | {width}cm | {tt.WheelFriction.BodyFrictionAsphalt} | {tt.WheelFriction.BodyFriction} | {tt.WheelFriction.SubstanceFriction} |
\n"
truck_content += f"
\n"
scales = ", ".join(['%d"' % x for x in sorted(scales)])
truck_content += f" Available Tire Sizes: {scales}
\n"
write_html(
truck_file,
language=language,
content=truck_content,
category="Trucks",
name=truck.get_translated_ui_name(language),
)
index_content = " Trucks
\n"
for truck_type in sorted(truck_types):
index_content += f" {truck_type}
\n"
index_content += f" \n"
index_content += f" | Name |
\n"
for reference, truck in sorted(truck_types[truck_type], key=lambda v: v[1].get_translated_ui_name(language)):
index_content += f" | {truck.get_translated_ui_name(language)} |
\n"
index_content += f"
\n"
write_html(
os.path.join(destination_directory, "index.html"), language=language, content=index_content, category="Trucks"
)
def create_html(pak: InitialPakLoader, destination_directory: str = "output/"):
if not os.path.exists(destination_directory):
os.mkdir(destination_directory)
logger.info("Writing HTML Output")
for language_name, language_data in pak.languages.items():
logger.info(f" - {language_name}")
language_path = os.path.join(destination_directory, language_name)
if not os.path.exists(language_path):
os.mkdir(language_path)
write_trucks(pak=pak, destination_directory=language_path, language=language_data)