diff --git a/docs/technical/vfs.md b/docs/technical/ue.md similarity index 69% rename from docs/technical/vfs.md rename to docs/technical/ue.md index abe1e5414..3247ef6a5 100644 --- a/docs/technical/vfs.md +++ b/docs/technical/ue.md @@ -5,3 +5,5 @@ `Blitz/Config/DefaultDlc.ini` contains DLC info; essentially extra `pak` containers `Blitz/Content/TanksStuff/Common/DT_TankClasses.uasset` seems to have all tank classes + +`C:\Users\coola\AppData\Local\Blitz\Saved\PersistentDownloadDir\http\dl-wotblitz-gc.wargaming.net\dlc\p14y73c7_p5e_b10gg3RS_big_play\ue_localizations\development\general` has all localization files diff --git a/packages/core/src/protos/i18n.proto b/packages/core/src/protos/i18n.proto index 2c31070df..772718b29 100644 --- a/packages/core/src/protos/i18n.proto +++ b/packages/core/src/protos/i18n.proto @@ -2,6 +2,6 @@ syntax = "proto2"; package blitzkit; -message I18nString { +message I18n { map locales = 1; } \ No newline at end of file diff --git a/packages/core/src/protos/tank.proto b/packages/core/src/protos/tank.proto index 230bf9f5e..806fb3930 100644 --- a/packages/core/src/protos/tank.proto +++ b/packages/core/src/protos/tank.proto @@ -1,83 +1,82 @@ syntax = "proto2"; +import "packages/core/src/protos/i18n.proto"; + package blitzkit; message Tank { - required ModuleHealth turret_rotator_health = 1; - required ModuleHealth surveying_device_health = 2; - required ModuleHealth gun_health = 3; - required ModuleHealth chassis_health = 4; - required ModuleHealth ammo_bay_health = 5; - required ModuleHealth engine_health = 6; - required ModuleHealth fuel_tank_health = 7; + required string id = 1; + required I18n name = 2; + required string set = 3; + required string class = 4; + // nations have been renamed to factions + required string faction = 5; - map crew_healths = 8; + required ModuleHealth turret_rotator_health = 6; + required ModuleHealth surveying_device_health = 7; + required ModuleHealth gun_health = 8; + required ModuleHealth chassis_health = 9; + required ModuleHealth ammo_bay_health = 10; + required ModuleHealth engine_health = 11; + required ModuleHealth fuel_tank_health = 12; + map crew_health = 13; + required float max_health = 14; + required float health_burn_per_second = 15; + required float fire_starting_chance = 16; + + required float concealment_stationary = 17; + required float concealment_moving = 18; + required float concealment_factor_on_shot = 19; + + required float turret_turn_rate = 20; + required float circular_vision_radius = 21; - required float max_health = 9; - required float concealment_stationary = 10; - required float concealment_moving = 11; - required float concealment_on_shot = 12; - - repeated PitchLimit up_pitch_limits = 13; - repeated PitchLimit down_pitch_limits = 14; - - required float turret_turn_rate = 15; - required float spotting_range = 16; - - repeated Shell shells = 17; - - required float reload_time = 18; - - required float dispersion_stationary = 19; - required float dispersion_turret_rotation = 20; - required float dispersion_moving = 21; - required float dispersion_hull_rotation = 22; - - required float gun_turn_rate = 23; - required float mass = 24; - required float engine_power = 25; - required float max_speed_forwards = 26; - required float max_speed_backwards = 27; - required float rotation_speed = 28; - - required float terrain_resistance_hard = 29; - required float terrain_resistance_medium = 30; - required float terrain_resistance_soft = 31; - - required float brake_force = 32; + repeated Shell shells = 22; + required float reload_time = 23; + required float dispersion_angle = 24; + required float shot_dispersion_factor = 25; + required float turret_rotation_dispersion_factor = 26; + required float aiming_time = 27; + required float gun_turn_rate = 28; + + required float mass = 29; + required float engine_power = 30; + required float forward_max_speed = 31; + required float backward_max_speed = 32; + required float rotation_speed = 33; + required float terrain_resistance_hard = 34; + required float brake_force = 35; + required bool b_rotation_is_around_center = 36; } message Shell { required float speed = 1; - required float armor_damage = 2; - required float module_damage = 3; - required float caliber = 4; - required float penetration = 5; - required float penetration_500m = 6; - required float normalization = 7; - required float range = 8; - required float ricochet = 9; - required float penetration_loss_by_distance = 10; - required float explosion_radius = 11; - required int32 max_count = 12; -} - -message PitchLimit { - required float angle = 1; - required float value = 2; + required float gravity = 2; + required float armor_damage = 3; + required float module_damage = 4; + required float caliber = 5; + required float piercing_power = 6; + required float piercing_power_500m = 7; + required float normalization = 8; + required float max_distance = 9; + required float ricochet_angle = 10; + required float piercing_power_loss_factor_by_distance = 11; + required float explosion_radius = 12; + required int32 max_count = 13; } message ModuleHealth { // max health, assigned by default at the start of the battle - required float max = 1; + required float max_health = 1; // max health reached as the module regenerates after breaking - required float max_regen = 2; + required float max_regen_health = 2; // the range from 0 to this where the module is "red" and doesn't function // all the while healing; after surpassing this, the "yellow" phase is reached - required float hysteresis = 3; + required float hysteresis_health = 3; // the heal rate (per second); this won't apply if the health is at or above // max_regen hence always leaving it in the "yellow" phase until repaired - required float heal_rate = 4; - // damage received (per second) to the modules when caught on fire - required float burn_rate = 5; + required float health_regen_per_second = 4; + // damage received (per second) to the modules when caught on fire; this can + // be undefined for some modules like the gun or chassis + optional float health_burn_per_second = 5; } \ No newline at end of file diff --git a/src/BlitzKit.CLI/Functions/Mangler.cs b/src/BlitzKit.CLI/Functions/Mangler.cs index 9102f839f..20f2748d0 100644 --- a/src/BlitzKit.CLI/Functions/Mangler.cs +++ b/src/BlitzKit.CLI/Functions/Mangler.cs @@ -1,6 +1,9 @@ +using Blitzkit; using BlitzKit.CLI.Models; using BlitzKit.CLI.Utils; using CUE4Parse.FileProvider.Objects; +using Google.Protobuf; +using Newtonsoft.Json.Linq; namespace BlitzKit.CLI.Functions { @@ -8,6 +11,7 @@ namespace BlitzKit.CLI.Functions { public static void Mangle() { + Tanks tanks = new(); BlitzProvider provider = new(); foreach (var nation in provider.RootDirectory.GetDirectory("Blitz/Content/Tanks").Directories) @@ -20,13 +24,14 @@ namespace BlitzKit.CLI.Functions if (tank.Key != "R90_IS_4") continue; + tanks.Tanks_.Add(tank.Key); var attributeFileName = $"DA_{tank.Key}_Attributes.uasset"; var hasAttributesFile = tank.Value.HasFile(attributeFileName); - GameFile? attributes = null; + GameFile? attributesFile = null; if (hasAttributesFile) { - attributes = tank.Value.GetFile(attributeFileName); + attributesFile = tank.Value.GetFile(attributeFileName); } else { @@ -38,12 +43,12 @@ namespace BlitzKit.CLI.Functions { if (file.Key.EndsWith("_Attributes.uasset")) { - attributes = file.Value; + attributesFile = file.Value; break; } } - if (attributes == null) + if (attributesFile == null) { PrettyLog.Error( $"No suffixed attributes file found for {nation.Key}/{tank.Key}; skipping..." @@ -52,20 +57,18 @@ namespace BlitzKit.CLI.Functions } } - var objects = provider.LoadAllObjects(attributes.Path); - var objectsCount = objects.Count(); + var exports = provider.LoadAllObjects(attributesFile.Path); - if (objectsCount != 1) - { - throw new Exception($"Expected 1 object for attribute objects, got {objectsCount}"); - } + var tankAttributesDataAsset = + exports.First((export) => export.ExportType == "TankAttributesDataAsset") + ?? throw new Exception("TankAttributesDataAsset not found"); + var attr = JObject.FromObject(tankAttributesDataAsset); - foreach (var obj in objects) - { - Console.WriteLine(obj.Properties); - } + Console.WriteLine(attr); } } + + var tanksBytes = tanks.ToByteArray(); } } } diff --git a/src/BlitzKit.CLI/Models/BlitzProvider.cs b/src/BlitzKit.CLI/Models/BlitzProvider.cs index c7b864c63..978b029e3 100644 --- a/src/BlitzKit.CLI/Models/BlitzProvider.cs +++ b/src/BlitzKit.CLI/Models/BlitzProvider.cs @@ -76,7 +76,7 @@ namespace BlitzKit.CLI.Models var directory = directoryPath == null || directoryPath.Length == 0 ? this : GetDirectory(directoryPath); - return directory.Files[name]; + return directory.Files[fileName]; } public bool HasDirectory(string name) => Directories.ContainsKey(name);