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" \n" # Power2Weight # Power2Fuel for engine in sorted(engines, key=lambda x: x.Torque): truck_content += ( f" " f"" f"" f"" f"" f"\n" ) truck_content += f"
NamePriceTorqueBase Fuel ConsumptionUnlock By
{engine.get_translated_ui_name(language)}{engine.GameData.Price}" f"{engine.Torque}{engine.FuelConsumption}{engine.GameData.get_unlock_str()}
\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" \n" truck_content += f" \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" \n" truck_content += f"
 Friction
NamePriceMassWidthAsphaltOff-RoadMud
{tt.get_translated_ui_name(language)}{tt.GameData.Price}{mass}kg{width}cm{tt.WheelFriction.BodyFrictionAsphalt}{tt.WheelFriction.BodyFriction}{tt.WheelFriction.SubstanceFriction}
\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" \n" for reference, truck in sorted(truck_types[truck_type], key=lambda v: v[1].get_translated_ui_name(language)): index_content += f" \n" index_content += f"
Name
{truck.get_translated_ui_name(language)}
\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)