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); } } }
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); } } } } }
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); }