Esempio n. 1
0
        public static SettingSize GetExtendedOptionSettingSize(ExtendedOptionTypes extendedOption)
        {
            switch (extendedOption)
            {
            case ExtendedOptionTypes.Wind:
            case ExtendedOptionTypes.MaximumCrateCount:
            case ExtendedOptionTypes.PetrolTurnDecay:
            case ExtendedOptionTypes.MaximumFlameletCount:
                return(SettingSize.TwoBytes);

            case ExtendedOptionTypes.DataVersion:
            case ExtendedOptionTypes.Gravity:
            case ExtendedOptionTypes.Friction:
            case ExtendedOptionTypes.MaximumProjectileSpeed:
            case ExtendedOptionTypes.MaximumRopeSpeed:
            case ExtendedOptionTypes.MaximumJetPackSpeed:
            case ExtendedOptionTypes.GameEngineSpeed:
            case ExtendedOptionTypes.RubberWormBounciness:
            case ExtendedOptionTypes.RubberWormAirViscosity:
            case ExtendedOptionTypes.RubberWormWindInfluence:
            case ExtendedOptionTypes.RubberWormGravityStrength:
                return(SettingSize.FourBytes);
            }

            return(SettingSize.Byte);
        }
Esempio n. 2
0
        public void AddExtendedOptionNotAvailable(XElement element, ExtendedOptionTypes extendedOptionType, int version)
        {
            string errorString = String.Format("Extended option '{0}' is not available in data version {1}.",
                                               extendedOptionType.ToString(), version);

            Add(errorString, element);
        }
Esempio n. 3
0
 void ParseExtendedOptionElement(XElement extendedOptionElement, ExtendedOptionTypes extendedOptionType)
 {
     if ((int)extendedOptionType <= SchemeTypes.GetExtendedOptionsSettingsCount(_schemeGenerator.ExtendedOptionsDataVersion))
     {
         ValueGenerator valueGenerator = CreateValueGenerator(extendedOptionElement, SchemeLimits.GetExtendedOptionLimits(extendedOptionType));
         _schemeGenerator.Set(extendedOptionType, valueGenerator);
     }
     else
     {
         _errorCollection.AddExtendedOptionNotAvailable(extendedOptionElement, extendedOptionType, _schemeGenerator.ExtendedOptionsDataVersion);
     }
 }
Esempio n. 4
0
        public Scheme(SchemeVersion version, int extendedOptionsDataVersion = 0, bool setUpDefaults = true)
        {
            Version = version;

            Settings = new Setting[SchemeTypes.NumberOfNonWeaponSettings];
            for (int i = 0; i < Settings.Length; ++i)
            {
                SettingTypes settingType = (SettingTypes)i;
                Settings[i] = new Setting(settingType.ToString(), SchemeLimits.GetSettingLimits(settingType));
            }

            int weaponsCount = version >= SchemeVersion.Armageddon2 ? SchemeTypes.NumberOfWeapons : SchemeTypes.NumberOfNonSuperWeapons;

            Weapons = new Weapon[weaponsCount];
            for (int i = 0; i < Weapons.Length; ++i)
            {
                Weapons[i] = new Weapon((WeaponTypes)i);
            }

            if (version >= SchemeVersion.Armageddon3)
            {
                int optionsCount = SchemeTypes.GetExtendedOptionsSettingsCount(extendedOptionsDataVersion);
                ExtendedOptions = new Setting[optionsCount];
                for (int i = 0; i < ExtendedOptions.Length; ++i)
                {
                    ExtendedOptionTypes extendedOption = (ExtendedOptionTypes)i;
                    ExtendedOptions[i] = new Setting(extendedOption.ToString(), SchemeLimits.GetExtendedOptionLimits(extendedOption), SchemeTypes.GetExtendedOptionSettingSize(extendedOption));
                }

                Access(ExtendedOptionTypes.DataVersion).SetValue(extendedOptionsDataVersion);
            }

            Access(SettingTypes.Version).SetValue(SchemeTypes.GetSchemeVersionNumber(version));
            Access(SettingTypes.BountyMode).SetValue(SchemeGeneratorMagicNumber);

            if (setUpDefaults)
            {
                SetUpDefaults();
            }
        }
Esempio n. 5
0
 public XElement Get(ExtendedOptionTypes extendedOptionType)
 {
     return(_extendedOptionTypes[extendedOptionType]);
 }
Esempio n. 6
0
 public void Add(ExtendedOptionTypes extendedOptionType, XElement element)
 {
     _extendedOptionTypes.Add(extendedOptionType, element);
 }
Esempio n. 7
0
 public bool Contains(ExtendedOptionTypes extendedOptionType)
 {
     return(_extendedOptionTypes.ContainsKey(extendedOptionType));
 }
Esempio n. 8
0
 /// <summary>
 /// Gets the given extended option by reference.
 /// </summary>
 public Setting Access(ExtendedOptionTypes extendedOption)
 {
     Debug.Assert(extendedOption < ExtendedOptionTypes.Count);
     return(ExtendedOptions[(int)extendedOption]);
 }
Esempio n. 9
0
 public static SettingLimits GetExtendedOptionLimits(ExtendedOptionTypes extendedOption)
 {
     Debug.Assert(extendedOption < ExtendedOptionTypes.Count);
     return(extendedOption < ExtendedOptionTypes.Count ? _extendedOptionLimits[(int)extendedOption] : null);
 }
Esempio n. 10
0
        static SettingLimits InitialiseExtendedOptionLimit(ExtendedOptionTypes extendedOption)
        {
            switch (extendedOption)
            {
            case ExtendedOptionTypes.DataVersion:
                return(new SettingLimits(0, 0));

            //Boolean properties.
            case ExtendedOptionTypes.ConstantWind:
            case ExtendedOptionTypes.UnrestrictRope:
            case ExtendedOptionTypes.AutoPlaceWormsByAlly:
            case ExtendedOptionTypes.SuddenDeathDisablesWormSelect:
            case ExtendedOptionTypes.CircularAim:
            case ExtendedOptionTypes.AntiLockAim:
            case ExtendedOptionTypes.AntiLockPower:
            case ExtendedOptionTypes.WormSelectionDoesntEndHotSeat:
            case ExtendedOptionTypes.WormSelectionNeverCancelled:
            case ExtendedOptionTypes.BattyRope:
            case ExtendedOptionTypes.KeepControlAfterBumpingHead:
            case ExtendedOptionTypes.FallDamageTriggeredByExplosions:
            case ExtendedOptionTypes.PauseTimerWhileFiring:
            case ExtendedOptionTypes.LossOfControlDoesntEndTurn:
            case ExtendedOptionTypes.WeaponUseDoesntEndTurn:
            case ExtendedOptionTypes.WeaponUseDoesntEndTurnDoesntBlockWeapons:
            case ExtendedOptionTypes.GirderRadiusAssist:
            case ExtendedOptionTypes.JetPackBungeeGlitch:
            case ExtendedOptionTypes.AngleCheatGlitch:
            case ExtendedOptionTypes.GlideGlitch:
            case ExtendedOptionTypes.FloatingWeaponGlitch:
            case ExtendedOptionTypes.RubberWormAirViscosityAppliesToWorms:
            case ExtendedOptionTypes.RubberWormWindInfluenceAppliesToWorms:
            case ExtendedOptionTypes.RubberWormCrateShower:
            case ExtendedOptionTypes.RubberWormAntiSink:
            case ExtendedOptionTypes.RubberWormRememberWeapons:
            case ExtendedOptionTypes.RubberWormExtendedFuses:
            case ExtendedOptionTypes.RubberWormAntiLockAim:
            case ExtendedOptionTypes.FractionalRoundTimer:
            case ExtendedOptionTypes.AutomaticEndOfTurnRetreat:
            case ExtendedOptionTypes.ConserveInstantUtilities:
            case ExtendedOptionTypes.ExpediteInstantUtilities:
                return(new SettingLimits(0, 1));

            //Tri-state properties.
            case ExtendedOptionTypes.ExplosionsPushAllObjects:
            case ExtendedOptionTypes.UndeterminedCrates:
            case ExtendedOptionTypes.UndeterminedFuses:
            case ExtendedOptionTypes.PneumaticDrillImpartsVelocity:
            case ExtendedOptionTypes.IndianRopeGlitch:
            case ExtendedOptionTypes.HerdDoublingGlitch:
            case ExtendedOptionTypes.TerrainOverlapPhasingGlitch:
                return(new SettingLimits((int)ExtendedOptionsTriState.False, (int)ExtendedOptionsTriState.True,
                                         (int)ExtendedOptionsTriState.Default, (int)ExtendedOptionsTriState.Default));

            //Byte properties.
            case ExtendedOptionTypes.WindBias:
            case ExtendedOptionTypes.RopeKnocking:
            case ExtendedOptionTypes.BloodLevel:
            case ExtendedOptionTypes.SuddenDeathWormDamagePerTurn:
            case ExtendedOptionTypes.RubberWormCrateRate:
            case ExtendedOptionTypes.DoubleTimeStackLimit:
                return(new SettingLimits(Byte.MinValue, Byte.MaxValue));

            //Integer-wide properties.
            case ExtendedOptionTypes.Wind:
                return(new SettingLimits(Int16.MinValue, Int16.MaxValue));

            case ExtendedOptionTypes.MaximumCrateCount:
            case ExtendedOptionTypes.PetrolTurnDecay:
                return(new SettingLimits(UInt16.MinValue, UInt16.MaxValue));

            //Enum properties.
            case ExtendedOptionTypes.AlliedPhasedWorms:
            case ExtendedOptionTypes.EnemyPhasedWorms:
                return(new SettingLimits(0, (int)PhasedWormsModes.Count - 1));

            case ExtendedOptionTypes.RopeRollDrops:
                return(new SettingLimits(0, (int)RopeRollDropModes.Count - 1));

            case ExtendedOptionTypes.XImpactLossOfControl:
                return(new SettingLimits((int)XImpactLossOfControlModes.LossOfControl, (int)XImpactLossOfControlModes.LossOfControl,
                                         (int)XImpactLossOfControlModes.NoLossOfControl, (int)XImpactLossOfControlModes.NoLossOfControl));

            case ExtendedOptionTypes.KeepControlAfterSkimming:
                return(new SettingLimits(0, (int)KeepControlAfterSkimmingModes.Count - 1));

            case ExtendedOptionTypes.Skipwalking:
                return(new SettingLimits(0, (int)SkipwalkingModes.Faciliated,
                                         (int)SkipwalkingModes.Disabled, (int)SkipwalkingModes.Disabled));

            case ExtendedOptionTypes.BlockRoofing:
                return(new SettingLimits(0, (int)BlockRoofingModes.Count - 1));

            case ExtendedOptionTypes.RubberWormGravityType:
                return(new SettingLimits(0, (int)RubberWormGravityTypes.Count - 1));

            case ExtendedOptionTypes.HealthCratesCurePoison:
                return(new SettingLimits(0, (int)HealthCratesCurePoisonModes.Allies,
                                         (int)HealthCratesCurePoisonModes.None, (int)HealthCratesCurePoisonModes.None));

            case ExtendedOptionTypes.RubberWormKaosMod:
                return(new SettingLimits(0, (int)RubberWormKaosMods.Count - 1));

            //Speed properties.
            case ExtendedOptionTypes.MaximumProjectileSpeed:
            case ExtendedOptionTypes.MaximumRopeSpeed:
            case ExtendedOptionTypes.MaximumJetPackSpeed:
                return(new SettingLimits(0, 0x7FFFFFFF));

            //Other properties.
            case ExtendedOptionTypes.Gravity:
                return(new SettingLimits(0x01, 0xC80000));

            case ExtendedOptionTypes.Friction:
                return(new SettingLimits(0, 0x28CCC));

            case ExtendedOptionTypes.NoCrateProbability:
                return(new SettingLimits(0, 100, 255, 255));

            case ExtendedOptionTypes.PetrolTouchDecay:
                return(new SettingLimits(1, Byte.MaxValue));

            case ExtendedOptionTypes.MaximumFlameletCount:
                return(new SettingLimits(1, UInt16.MaxValue));

            case ExtendedOptionTypes.GameEngineSpeed:
                return(new SettingLimits(0x1000, 0x800000));

            case ExtendedOptionTypes.RubberWormBounciness:
            case ExtendedOptionTypes.RubberWormWindInfluence:
                return(new SettingLimits(0, 0x10000));

            case ExtendedOptionTypes.RubberWormAirViscosity:
                return(new SettingLimits(0, 0x4000));

            case ExtendedOptionTypes.RubberWormGravityStrength:
                return(new SettingLimits(-0x40000000, 0x40000000));

            case ExtendedOptionTypes.SheepHeavensGate:
                return(new SettingLimits(1, 7));
            }

            Debug.Fail("InitialiseExtendedOptionLimit - Invalid extended option " + extendedOption.ToString());
            return(null);
        }
Esempio n. 11
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);
        }
Esempio n. 12
0
        /// <summary>
        /// Sets the given extended option's value generator.
        /// </summary>
        public void Set(ExtendedOptionTypes extendedOption, ValueGenerator valueGenerator)
        {
            Debug.Assert(extendedOption < ExtendedOptionTypes.Count);

            _extendedOptionGenerators[(int)extendedOption] = valueGenerator;
        }