Пример #1
0
        public static bool?GetBoolAndRemoveOrNull(this JsonDict json, string key)
        {
            if (!json.ContainsKey(key))
            {
                return(null);
            }
            var result = json[key].GetBool();

            json.Remove(key);
            return(result);
        }
Пример #2
0
        public WdRadio(string id, JsonDict radio, WdData data)
        {
            Raw  = radio;
            Id   = id;
            Name = data.ResolveString(radio["userString"].WdString());

            Level     = (radio.ContainsKey("Level") ? radio["Level"] : radio["level"]).WdInt(); // "Level" used in older clients for at least one radio
            Price     = radio["price"].WdInt();
            Mass      = radio["weight"].WdInt();
            HitPoints = radio["maxHealth"].WdInt();
            Distance  = radio["distance"].WdInt();
        }
Пример #3
0
        public override bool Matches(KtaneModuleInfo module, JsonDict json)
        {
            var flags = (int)GetValue(module);

            foreach (var opt in Options)
            {
                bool hasFlag = (flags & opt.Value) != 0;
                if (json.ContainsKey(opt.Name) && ((json[opt.Name].GetString() == "y" && !hasFlag) || (json[opt.Name].GetString() == "n" && hasFlag)))
                {
                    return(false);
                }
            }
            return(true);
        }
Пример #4
0
        public override bool Matches(KtaneModuleInfo module, JsonDict json)
        {
            var str = GetValue(module)?.ToString();

            return(str == null || (json.ContainsKey(str) && json[str].GetBool()) || json.All(v => !v.Value.GetBool()));
        }
Пример #5
0
        /// <remarks>
        ///     This method requires the shell data to already be fully loaded.</remarks>
        /// <param name="initialize">
        ///     Forces all parameters to be loaded, producing an exception if anything important is missing.</param>
        internal void UpdateFrom(JsonDict gun, WdCountry country, bool initialize = false)
        {
            // Not sure if this is the easiest way to correctly load the data on guns... but seems to do the job
            // The idea appears to be that there is a base gun definition, but each specific turret may override certain gun parameters

            if (initialize || gun.ContainsKey("level"))
            {
                Level = gun["level"].WdInt();
            }
            if (initialize || gun.ContainsKey("price"))
            {
                Price = gun["price"].WdInt();
            }
            if (initialize || gun.ContainsKey("mass"))
            {
                Mass = gun["weight"].WdInt();
            }
            if (initialize || gun.ContainsKey("maxHealth"))
            {
                HitPoints = gun["maxHealth"].WdInt();
            }

            if (initialize || gun.ContainsKey("pitchLimits"))
            {
                if (gun["pitchLimits"] is JsonDict)
                {
                    // new-style limits in 0.9.9 and later
                    if (gun["pitchLimits"].ContainsKey("minPitch"))
                    {
                        PitchUpLimit = (gun["pitchLimits"]["minPitch"].WdString() == "") ? 0 : -gun["pitchLimits"]["minPitch"].WdString().Split(' ').Select(x => (x == "") ? 0 : decimal.Parse(x, NumberStyles.Float, CultureInfo.InvariantCulture)).Min();
                    }
                    if (gun["pitchLimits"].ContainsKey("maxPitch"))
                    {
                        PitchDownLimit = (gun["pitchLimits"]["maxPitch"].WdString() == "") ? 0 : -gun["pitchLimits"]["maxPitch"].WdString().Split(' ').Select(x => (x == "") ? 0 : decimal.Parse(x, NumberStyles.Float, CultureInfo.InvariantCulture)).Max();
                    }
                }
                else
                {
                    // old-style limits before 0.9.9
                    var parts = gun["pitchLimits"].WdString().Split(' ').Select(x => decimal.Parse(x, NumberStyles.Float, CultureInfo.InvariantCulture)).ToArray();
                    PitchUpLimit   = -parts[0];
                    PitchDownLimit = -parts[1];
                }
            }
            if (gun.ContainsKey("turretYawLimits")) // earlier game versions have this in the turret data
            {
                var parts = gun["turretYawLimits"].WdString().Split(' ').Select(x => decimal.Parse(x, NumberStyles.Float, CultureInfo.InvariantCulture)).ToArray();
                YawLeftLimit  = parts[0]; // not too sure about which is which
                YawRightLimit = parts[1];
            }

            if (initialize || gun.ContainsKey("rotationSpeed"))
            {
                RotationSpeed = gun["rotationSpeed"].WdDecimal();
            }
            if (initialize || gun.ContainsKey("reloadTime"))
            {
                ReloadTime = gun["reloadTime"].WdDecimal();
            }
            if (initialize || gun.ContainsKey("maxAmmo"))
            {
                MaxAmmo = gun["maxAmmo"].WdInt();
            }
            if (initialize || gun.ContainsKey("aimingTime"))
            {
                AimTime = gun["aimingTime"].WdDecimal();
            }

            if (initialize)
            {
                HasDrum = gun.ContainsKey("clip");
            }
            else if (gun.ContainsKey("clip"))
            {
                HasDrum = true;
            }

            // Load the shell types - not sure how the overrides are supposed to work here, so just clear the entire list in that case
            if (gun.ContainsKey("shots"))
            {
                Shells.Clear();
                foreach (var kvp in gun["shots"].GetDict())
                {
                    var shell = country.Shells[kvp.Key].Clone();
                    shell.AddGunSpecific(kvp.Value.GetDict());
                    Shells.Add(shell);
                }
            }
        }
Пример #6
0
        public WdTank(string id, JsonDict json, WdCountry country, WdData data)
        {
            RawId   = id;
            Country = country;
            Raw     = json;

            var tags1 = Raw["tags"].WdString().Split("\r\n").Select(s => s.Trim()).ToHashSet();
            var tags2 = Raw["tags"].WdString().Split(' ').Select(s => s.Trim()).ToHashSet();

            Tags      = tags1.Count > tags2.Count ? tags1 : tags2;
            NotInShop = Raw.ContainsKey("notInShop") && Raw["notInShop"].GetBool();
            Price     = Raw["price"] is JsonDict ? Raw["price"][""].WdInt() : Raw["price"].WdInt();
            Gold      = Raw["price"] is JsonDict && Raw["price"].ContainsKey("gold");

            if (Tags.Contains("lightTank"))
            {
                Class = "lightTank";
            }
            else if (Tags.Contains("mediumTank"))
            {
                Class = "mediumTank";
            }
            else if (Tags.Contains("heavyTank"))
            {
                Class = "heavyTank";
            }
            else if (Tags.Contains("SPG"))
            {
                Class = "SPG";
            }
            else if (Tags.Contains("AT-SPG"))
            {
                Class = "AT-SPG";
            }
            else
            {
                Class = null;
            }

            Tier   = Raw["level"].WdInt();
            Secret = Tags.Contains("secret");
            string scriptsFolder = string.IsNullOrEmpty(data.VersionConfig.PathSourceScripts) ? @"res\scripts" : data.VersionConfig.PathSourceScripts;

            var path = WotFileExporter.CombinePaths(data.Installation.Path, scriptsFolder,
                                                    @"item_defs\vehicles\{0}\{1}.xml".Fmt(Country.Name, id));

            using (var stream = WotFileExporter.GetFileStream(path))
            {
                RawExtra = BxmlReader.ReadFile(stream);
            }

            FullName    = data.ResolveString(Raw["userString"].WdString());
            ShortName   = Raw.ContainsKey("shortUserString") ? data.ResolveString(Raw["shortUserString"].WdString()) : FullName;
            Description = data.ResolveString(Raw["description"].WdString());

            MaxSpeedForward = RawExtra["speedLimits"]["forward"].WdDecimal();
            MaxSpeedReverse = RawExtra["speedLimits"]["backward"].WdDecimal();

            RepairCost = RawExtra["repairCost"].WdDecimal();

            Hull = new WdHull(RawExtra["hull"].GetDict());

            Chassis = new List <WdChassis>();
            Turrets = new List <WdTurret>();
            Engines = new List <WdEngine>();
            Radios  = new List <WdRadio>();
            // these lists are populated once all the tanks are loaded, since some shared modules occur before the non-shared "definition" of the module.

            foreach (var kvp in RawExtra["chassis"].GetDict())
            {
                if (kvp.Value.GetStringLenientSafe() != "shared" && kvp.Value.Safe[""].GetStringSafe() != "shared" && !kvp.Value.ContainsKey("shared"))
                {
                    Country.Chassis.Add(kvp.Key, new WdChassis(kvp.Key, kvp.Value.GetDict(), data));
                }
            }
            foreach (var kvp in RawExtra["turrets0"].GetDict())
            {
                if (kvp.Value.GetStringLenientSafe() != "shared" && kvp.Value.Safe[""].GetStringSafe() != "shared" && !kvp.Value.ContainsKey("shared"))
                {
                    Country.Turrets.Add(kvp.Key, new WdTurret(kvp.Key, kvp.Value.GetDict(), data));
                }
            }
            // RawExtra["engines"] and RawExtra["radios"] only contain information about unlocks; the rest is contained in separate files parsed in WdCountry.
        }