예제 #1
0
        public override void ApplyGuarantee(Scheme scheme, Random rng)
        {
            Setting godWormsSetting    = scheme.Access(SettingTypes.GodWorms);
            Setting indyTerrainSetting = scheme.Access(SettingTypes.IndestructibleTerrain);

            if (godWormsSetting.Value == 0 || indyTerrainSetting.Value == 0)
            {
                return;
            }

            //If one of the value generators could have produced a zero, force that.
            bool godWormsCouldBeFalse    = godWormsSetting.ValueGenerator != null && godWormsSetting.ValueGenerator.DoesValueRangeOverlap(0, 0);
            bool indyTerrainCouldBeFalse = indyTerrainSetting.ValueGenerator != null && godWormsSetting.ValueGenerator.DoesValueRangeOverlap(0, 0);

            if (godWormsCouldBeFalse && !indyTerrainCouldBeFalse)
            {
                godWormsSetting.SetValue(0);
            }
            else if (!godWormsCouldBeFalse && indyTerrainCouldBeFalse)
            {
                indyTerrainSetting.SetValue(0);
            }
            //Select one at random to become zero.
            else
            {
                if (rng.NextDouble() < 0.5)
                {
                    godWormsSetting.SetValue(0);
                }
                else
                {
                    indyTerrainSetting.SetValue(0);
                }
            }
        }
예제 #2
0
        public override void ApplyGuarantee(Scheme scheme, Random rng)
        {
            if (_valueGenerator == null)
            {
                return;
            }

            int weaponCount = _valueGenerator.GenerateValue(rng);

            for (int i = 0; i < (int)WeaponFunctionKeys.Count; ++i)
            {
                List <Weapon> availableWeapons = new List <Weapon>();
                foreach (WeaponTypes weaponType in SchemeTypes.GetWeaponsForFunctionKey((WeaponFunctionKeys)i))
                {
                    Weapon weapon = scheme.Access(weaponType);
                    if (weapon.CanAppearAtAll())
                    {
                        availableWeapons.Add(weapon);
                    }
                }

                if (availableWeapons.Count > weaponCount)
                {
                    for (int j = availableWeapons.Count - 1; j >= 1; --j)
                    {
                        int    randomIndex = rng.Next(j);
                        Weapon temp        = availableWeapons[j];
                        availableWeapons[j]           = availableWeapons[randomIndex];
                        availableWeapons[randomIndex] = temp;
                    }

                    for (int j = weaponCount; j < availableWeapons.Count; ++j)
                    {
                        Weapon weapon = availableWeapons[j];
                        weapon.Ammo.SetValue(0);

                        if (SchemeTypes.CanApplyWeaponSetting(weapon.WeaponType, WeaponSettings.Crate))
                        {
                            weapon.Crate.SetValue(0);
                        }
                    }
                }
            }
        }
예제 #3
0
        public Scheme GenerateScheme(Random rng, SchemeVersion version)
        {
            Scheme scheme = new Scheme(version, ExtendedOptionsDataVersion);

            //Generate values for every setting.
            int settingsCount = Math.Min(scheme.Settings.Length, _settingGenerators.Length);

            for (int i = 0; i < settingsCount; ++i)
            {
                ValueGenerator valueGenerator = _settingGenerators[i];

                if (valueGenerator != null)
                {
                    SettingTypes settingType = (SettingTypes)i;
                    Setting      setting     = scheme.Access(settingType);
                    Debug.Assert(setting != null);

                    setting.SetValue(valueGenerator.GenerateValue(rng), valueGenerator);
                }
            }

            //Generate values for every weapon.
            int weaponsCount = Math.Min(scheme.Weapons.Length, _weaponGenerators.Length);

            for (int i = 0; i < weaponsCount; ++i)
            {
                WeaponGenerator weaponGenerator = _weaponGenerators[i];

                for (int j = 0; j < (int)WeaponSettings.Count; ++j)
                {
                    WeaponSettings weaponSetting  = (WeaponSettings)j;
                    ValueGenerator valueGenerator = weaponGenerator.Get(weaponSetting);

                    if (valueGenerator != null)
                    {
                        WeaponTypes weaponType = (WeaponTypes)i;
                        Weapon      weapon     = scheme.Access(weaponType);
                        Debug.Assert(weapon != null);

                        Setting setting = weapon.Access(weaponSetting);
                        Debug.Assert(setting != null);

                        //Check value generator range (range check is not done at XML parsing-time for default values).
                        if (!valueGenerator.IsValueRangeWithinLimits(setting.Limits))
                        {
                            throw new Exception(String.Format("Generatable values for setting '{0}' must be within the range(s): {1}.",
                                                              setting.Name, setting.Limits.ToString()));
                        }

                        setting.SetValue(valueGenerator.GenerateValue(rng), valueGenerator);
                    }
                }
            }

            //Generate values for every extended option.
            if (version >= SchemeVersion.Armageddon3)
            {
                int optionsCount = Math.Min(scheme.ExtendedOptions.Length, _extendedOptionGenerators.Length);
                for (int i = 0; i < optionsCount; ++i)
                {
                    ValueGenerator valueGenerator = _extendedOptionGenerators[i];
                    if (valueGenerator != null)
                    {
                        ExtendedOptionTypes extendedOption = (ExtendedOptionTypes)i;
                        Setting             setting        = scheme.Access(extendedOption);
                        Debug.Assert(setting != null);

                        setting.SetValue(valueGenerator.GenerateValue(rng), valueGenerator);
                    }
                }
            }

            //Handle guarantees.
            foreach (Guarantee guarantee in _guarantees)
            {
                guarantee.ApplyGuarantee(scheme, rng);
            }

            return(scheme);
        }