예제 #1
0
        private void ParseConfig(ConfigFile configFile)
        {
            // Settings
            var startingSkillPointsPerAbilityPointConfig = new ConfigDefinition("main", "StartingSkillPointsPerAbilityPoint");
            var startingAbilityPointsConfig = new ConfigDefinition("main", "StartingAbilityPoints");
            var maxSkillValueAtCreation     = new ConfigDefinition("main", "MaximumSkillValueAtCreation");
            var skillPointsAbilityLimit     = new ConfigDefinition("main", "SkillPointsAbilityLimited");

            bool reload = false;

            if (configFile.GetSetting <int>(startingAbilityPointsConfig) == null)
            {
                configFile.AddSetting <int>(startingAbilityPointsConfig, 8, new ConfigDescription("The amount of Ability points you get at character creation. Default is 8."));
                configFile.Save();
                reload = true;
            }
            if (configFile.GetSetting <int>(startingSkillPointsPerAbilityPointConfig) == null)
            {
                configFile.AddSetting <int>(startingSkillPointsPerAbilityPointConfig, 5, new ConfigDescription("The amount of Skill points you get at character creation, per starting Ability point.\nFor example: the default value of 5, combined with the default value of 8 for starting Ability points, results in a total of 40 Skill points to spend at character creation."));
                configFile.Save();
                reload = true;
            }

            if (configFile.GetSetting <int>(maxSkillValueAtCreation) == null)
            {
                configFile.AddSetting <int>(maxSkillValueAtCreation, 6, new ConfigDescription("The maximum value of a Skill at character creation, regardless of Ability scores or total Skill points."));
                configFile.Save();
                reload = true;
            }

            if (configFile.GetSetting <int>(skillPointsAbilityLimit) == null)
            {
                configFile.AddSetting(skillPointsAbilityLimit, 1, new ConfigDescription("The manner in which skill point assignment is limited by Ability scores.\n1: For a given Ability, you can put skill points in a maximum number of skills tied to that Ability equal to the Ability's score (e.g. if you have Motorics 2, you can increase a maximum of 2 different Motorics skills).\n2: For a given Ability, you can distribute a maximum of StartingSkillPointsPerAbilityPoint times the Ability's value into Skills tied to that ability (e.g. if StartingSkillPointsPerAbilityPoint = 5 (default), and you have Motorics 2, you can distribute a total of 10 skill points in Motorics skills)\n0: No limit on skill points distribution based on Ability scores (not recommended).", new AcceptableValueRange <int>(0, 2)));
                configFile.Save();
                reload = true;
            }

            if (reload)
            {
                configFile.Reload();
            }

            _startingAbilityPoints = configFile.GetSetting <int>(startingAbilityPointsConfig).Value;
            _startingSkillPointsPerAbilityPoint = configFile.GetSetting <int>(startingSkillPointsPerAbilityPointConfig).Value;
            _maxSkillValue = configFile.GetSetting <int>(maxSkillValueAtCreation).Value;
            try
            {
                _abilityLimitSetting = (AbilityLimitationSetting)configFile.GetSetting <int>(skillPointsAbilityLimit).Value;
            }
            catch (Exception ex)
            {
                Console.WriteLine("ParseConfig: error parsing ability limit setting. Defaulting to 1.");
                _abilityLimitSetting = AbilityLimitationSetting.LIMIT_NR_OF_SKILLS;
            }

            Console.WriteLine("Advanced Character Creation Configuration:");
            Console.WriteLine($". Ability points at character creation: {_startingAbilityPoints}");
            Console.WriteLine($". Skill points per ability point at character creation: {_startingSkillPointsPerAbilityPoint}");
            Console.WriteLine($". => Total nr. of Skill points to spend on character creation: {_startingAbilityPoints * _startingSkillPointsPerAbilityPoint}");
            Console.WriteLine($". Maximum value of any Skill at character creation: {_maxSkillValue}");
            Console.WriteLine($". Ability score limitation on Skill point spending: {Enum.GetName(typeof(AbilityLimitationSetting), _abilityLimitSetting)}");
        }
예제 #2
0
        internal bool LoadFrom(string keyword)
        {
            init_cv();

            var type   = typeof(Settings).GetType();
            var fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
            var props  = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

            var cf = new ConfigFile(keyword);

            cf.AddSetting("Priority", new Value(50), "Priority",
                          "The priority of profile. Higher value means profile is loaded later and will overwrite others.");
            cf.AddSetting("Group", new Value(0), "Group",
                          "The group of profile. Multiple profiles with same group ID can not be active at the same time. Only one profile (highest priority) from same group will be active (or none).");

            var cf2 = new ConfigFile(keyword);

            if (!cf2.Load())
            {
                return(false);
            }

            var valid = new List <Tuple <ConfigEntry, FieldInfo, PropertyInfo> >();

            foreach (var f in fields)
            {
                var attrs = f.GetCustomAttributes(typeof(ConfigValueAttribute), true);
                if (attrs == null || attrs.Length == 0)
                {
                    continue;
                }

                var a = attrs[0] as ConfigValueAttribute;
                if (a == null)
                {
                    continue;
                }

                if (cf2.GetValue(a.Keyword) == null)
                {
                    continue;
                }

                var val     = ToValue(f.FieldType, f.GetValue(Settings.Instance));
                var setting = cf.AddSetting(a.Keyword, val, a.Name, a.Description, a.Flags);
                valid.Add(new Tuple <ConfigEntry, FieldInfo, PropertyInfo>(setting, f, null));
            }

            foreach (var p in props)
            {
                var attrs = p.GetCustomAttributes(typeof(ConfigValueAttribute), true);
                if (attrs == null || attrs.Length == 0)
                {
                    continue;
                }

                var a = attrs[0] as ConfigValueAttribute;
                if (a == null)
                {
                    continue;
                }

                if (p.GetMethod == null || p.SetMethod == null)
                {
                    continue;
                }

                if (cf2.GetValue(a.Keyword) == null)
                {
                    continue;
                }

                var val     = ToValue(p.PropertyType, p.GetValue(Settings.Instance));
                var setting = cf.AddSetting(a.Keyword, val, a.Name, a.Description, a.Flags);
                valid.Add(new Tuple <ConfigEntry, FieldInfo, PropertyInfo>(setting, null, p));
            }

            if (valid.Count == 0)
            {
                return(false);
            }

            if (!cf.Load())
            {
                return(false);
            }

            foreach (var t in valid)
            {
                var val = t.Item1.CurrentValue;
                if (val == null)
                {
                    continue;
                }

                var dv = 0.0;
                if (!val.TryToDouble(out dv))
                {
                    continue;
                }

                var t2      = cf2.GetValue(t.Item1.Keyword + "_Type");
                var settype = CameraValueModifier.ModifierTypes.Set;
                if (t2 != null)
                {
                    var tx = t2.ToString().ToLowerInvariant().Trim();
                    switch (tx)
                    {
                    case "set":
                        settype = CameraValueModifier.ModifierTypes.Set;
                        break;

                    case "add":
                        settype = CameraValueModifier.ModifierTypes.Add;
                        break;

                    case "multiply":
                        settype = CameraValueModifier.ModifierTypes.Multiply;
                        break;

                    case "force":
                        settype = CameraValueModifier.ModifierTypes.Force;
                        break;

                    case "setifpreviousishigherthanthis":
                        settype = CameraValueModifier.ModifierTypes.SetIfPreviousIsHigherThanThis;
                        break;

                    case "setifpreviousislowerthanthis":
                        settype = CameraValueModifier.ModifierTypes.SetIfPreviousIsLowerThanThis;
                        break;
                    }
                }

                long removeDelay = 0;
                t2 = cf2.GetValue(t.Item1.Keyword + "_RemoveDelay");
                if (t2 != null)
                {
                    long nx = 0;
                    if (t2.TryToInt64(out nx) && nx >= 0)
                    {
                        removeDelay = nx;
                    }
                }

                AddSetter(t.Item1.Keyword, dv, settype, removeDelay);
            }

            foreach (var pair in _cond_map)
            {
                var kw  = "Condition_" + pair.Key;
                var val = cf2.GetValue(kw);
                if (val == null)
                {
                    continue;
                }

                var amt = 0.0;
                if (!val.TryToDouble(out amt))
                {
                    continue;
                }

                conditions.Add(new Tuple <double, _ConditionDelegate>(amt, pair.Value));
            }

            foreach (var pair in _cond_map2)
            {
                var kw  = "Condition_" + pair.Key;
                var val = cf2.GetValue(kw);
                if (val == null)
                {
                    continue;
                }

                var amt = val.ToString();
                conditions2.Add(new Tuple <string, _ConditionDelegate2>(amt, pair.Value));
            }

            return(true);
        }