Пример #1
0
 public static EnumerableModKeySettingsVM Factory(SettingsParameters param, FieldMeta fieldMeta, object?defaultVal)
 {
     return(new EnumerableModKeySettingsVM(
                param.DetectedLoadOrder.Transform(x => x.Listing.ModKey),
                fieldMeta,
                defaultVal as IEnumerable <ModKey> ?? Enumerable.Empty <ModKey>()));
 }
Пример #2
0
 public static IEnumerable <MemberInfo> GetMemberInfos(SettingsParameters param)
 {
     return(param.TargetType.GetMembers()
            .Where(m => m.MemberType == MemberTypes.Property ||
                   m.MemberType == MemberTypes.Field)
            .Where(m =>
     {
         return m switch
         {
             PropertyInfo prop => !prop.IsStatic() && prop.GetSetMethod() != null,
             FieldInfo field => !field.IsStatic && !field.IsInitOnly,
             _ => true,
         };
     })
            .Where(m => m.GetCustomAttribute <SynthesisIgnoreSetting>() == null)
            .OrderBy(m =>
     {
         if (m.TryGetCustomAttribute <SynthesisOrder>(out var order))
         {
             return order.Order;
         }
         else
         {
             return int.MaxValue;
         }
     }));
 }
Пример #3
0
 public static SettingsNodeVM[] Factory(SettingsParameters param)
 {
     return(GetMemberInfos(param)
            .Select(m =>
     {
         try
         {
             var node = m switch
             {
                 PropertyInfo prop => MemberFactory(param with
                 {
                     TargetType = prop.PropertyType,
                     DefaultVal = param.DefaultVal == null ? null : prop.GetValue(param.DefaultVal)
                 }, prop),
                 FieldInfo field => MemberFactory(param with
                 {
                     TargetType = field.FieldType,
                     DefaultVal = param.DefaultVal == null ? null : field.GetValue(param.DefaultVal)
                 }, field),
                 _ => throw new ArgumentException(),
             };
             return node;
         }
         catch (Exception ex)
         {
             throw new Exception($"{param.TargetType} failed to retrieve property {m}", ex);
         }
     })
            .ToArray());
 }
Пример #4
0
 public ObjectSettingsVM(SettingsParameters param, string memberName, Type t)
     : base(memberName)
 {
     _nodes = Factory(param, t)
              .ToDictionary(x => x.MemberName);
     Nodes = new ObservableCollection <SettingsNodeVM>(_nodes.Values);
 }
Пример #5
0
    public void SoundButtonPressed()
    {
        SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_CLICK);
        myUniqueController.flipSoundSetting();

        SettingsParameters.SaveSettings();
    }
 public static SettingsNodeVM Factory(SettingsParameters param, string memberName, Type type, object?defaultVal)
 {
     return(new EnumerableFormLinkSettingsVM(
                param.LinkCache,
                type,
                memberName,
                defaultVal as IEnumerable <IFormLink> ?? Enumerable.Empty <IFormLink>()));
 }
    /*public void ValidateGameButtonPressed() {
     *      SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_CLICK);
     *      myUniqueController.setGameMode (AllGameParameters.GAME_MODE_CAMPAIGN);
     *      SceneManager.LoadScene ("WaitScreen");
     * }*/

    public void ExitButtonPressed()
    {
        SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_CLICK);

        // Save preferences
        SettingsParameters.SaveSettings();

        Application.Quit();
    }
    public void MainMenuButtonPressed()
    {
        SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_CLICK);

        // Save preferences
        SettingsParameters.SaveSettings();

        SceneManager.LoadScene("StartMenu");
    }
Пример #9
0
 public static EnumerableObjectSettingsVM Factory(SettingsParameters param, FieldMeta fieldMeta)
 {
     var proto = new ObjectSettingsVM(param with {
         DefaultVal = null
     }, FieldMeta.Empty with
     {
         Parent        = fieldMeta.Parent,
         MainVM        = fieldMeta.MainVM,
         IsPassthrough = true,
     });
Пример #10
0
        public static EnumerableObjectSettingsVM Factory <TItem, TWrapper>(SettingsParameters param, string memberName, object?defaultVal, Type t)
            where TWrapper : BasicSettingsVM <TItem>, new()
        {
            var ret = new EnumerableObjectSettingsVM(param, memberName, t);

            if (defaultVal != null)
            {
                throw new NotImplementedException();
            }
            return(ret);
        }
Пример #11
0
    // Use this for initialization
    void Start()
    {
        // Read preferences
        SettingsParameters.InitializeSettings();

        // Start to play the TITLE music
        myMusicController.startTheMusic(GameMusicController.MUSIC_GAME);

        // Set the score
        SetTextValue();
    }
Пример #12
0
    public void YesYesButtonPressed()
    {
        SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_COIN);
        SettingsParameters.ResetSettings();

        // Get rid of confirmation button
        Utils.ConfirmationPopUpRemove();

        // Start initialization parameters
        Start();
    }
Пример #13
0
    // Use this for initialization
    void Start()
    {
        // Read preferences
        SettingsParameters.InitializeSettings();

        // Reset score and levels
        myUniqueController.resetScore();
        myUniqueController.setCurrenLevel(0);

        // Start to play the TITLE music
        myMusicController.startTheMusic(GameMusicController.MUSIC_TITLE);
    }
    // Use this for initialization
    void Start()
    {
        // Initialize data
        SettingsParameters.InitializeSettings();

        levelToDisplay = (SettingsParameters.currentlyReachedLevel + 1);
        if (levelToDisplay > SettingsParameters.LEVEL_NUMBER)
        {
            levelToDisplay = SettingsParameters.LEVEL_NUMBER;
        }

        // by default, activate padlock (Cadenas)
        myCadena.SetActive(true);
    }
    //////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////

    //////////////////////////////////////////////////////////////////////////
    // Set all parameters at awake of the scene
    void Awake()
    {
        if (mySettingsParameters == null)
        {
            // Create the manager
            DontDestroyOnLoad(gameObject);
            mySettingsParameters = this;
        }
        else if (mySettingsParameters != this)
        {
            // Destroy it to have always only one manager (Singleton Design Pattern)
            Destroy(gameObject);
        }
    }
Пример #16
0
    // Use this for initialization
    void Start()
    {
        // Read preferences
        SettingsParameters.InitializeSettings();

        if (SettingsParameters.settingPlayMusic == true)
        {
            myMusicController.startTheMusic();
        }
        else
        {
            myMusicController.stopTheMusic();
        }
    }
Пример #17
0
 public ReflectionSettingsVM(
     SettingsParameters param,
     Type type,
     string nickname,
     string settingsFolder,
     string settingsSubPath)
 {
     Nickname        = nickname;
     SettingsFolder  = settingsFolder;
     SettingsSubPath = settingsSubPath;
     _nodes          = SettingsNodeVM.Factory(param, type)
                       .ToDictionary(x => x.MemberName);
     Nodes = new ObservableCollection <SettingsNodeVM>(_nodes.Values);
     CompositeDisposable.Add(_nodes.Values);
 }
Пример #18
0
    public void MusicButtonPressed()
    {
        myUniqueController.flipMusicSetting();

        if (SettingsParameters.settingPlayMusic == true)
        {
            myMusicController.startTheMusic();
        }
        else
        {
            myMusicController.stopTheMusic();
        }

        SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_CLICK);
        SettingsParameters.SaveSettings();
    }
        public static SettingsNodeVM Factory(SettingsParameters param, FieldMeta fieldMeta, string typeName, object?defaultVal)
        {
            var defaultKeys = new List <FormKey>();

            if (defaultVal is IEnumerable e)
            {
                var targetType = e.GetType().GenericTypeArguments[0];
                var getter     = targetType.GetProperty("FormKey") !;
                foreach (var item in e)
                {
                    defaultKeys.Add(FormKey.Factory(getter.GetValue(item) !.ToString()));
                }
            }
            return(new EnumerableFormLinkSettingsVM(
                       param.LinkCache,
                       fieldMeta: fieldMeta,
                       typeName: typeName,
                       defaultKeys));
        }
Пример #20
0
 public ReflectionSettingsVM(
     SettingsParameters param,
     string nickname,
     string settingsFolder,
     string settingsSubPath)
 {
     Nickname        = nickname;
     SettingsFolder  = settingsFolder;
     SettingsSubPath = settingsSubPath;
     ObjVM           = new ObjectSettingsVM(
         param with
     {
         MainVM = this
     },
         FieldMeta.Empty with
     {
         DisplayName = "Top Level",
         MainVM      = this
     });
Пример #21
0
        public static DictionarySettingsVM Factory(SettingsParameters param, FieldMeta fieldMeta)
        {
            var vals  = GetDefaultValDictionary(param.DefaultVal);
            var proto = SettingsNodeVM.MemberFactory(param with {
                DefaultVal = null
            }, member: null);

            proto.WrapUp();
            return(new DictionarySettingsVM(
                       fieldMeta,
                       vals.Select(defVal =>
            {
                return new KeyValuePair <string, SettingsNodeVM>(
                    defVal.Key.ToString() !,
                    SettingsNodeVM.MemberFactory(param with {
                    DefaultVal = defVal.Value
                }, member: null));
            }).ToArray(),
                       prototype: proto));
        }
Пример #22
0
 public static IEnumerable <MemberInfo> GetMemberInfos(SettingsParameters param)
 {
     return(param.TargetType.GetMembers()
            .Where(m => m.MemberType == MemberTypes.Property ||
                   m.MemberType == MemberTypes.Field)
            .Where(m =>
     {
         return m switch
         {
             PropertyInfo prop => !Noggog.MemberInfoExt.IsStatic(prop) && prop.GetSetMethod() != null,
             FieldInfo field => !field.IsStatic && !field.IsInitOnly,
             _ => true,
         };
     })
            .Where(m => !m.TryGetCustomAttributeByName(nameof(SynthesisIgnoreSetting), out var _))
            .OrderBy(m =>
     {
         return m.GetCustomAttributeValueByName(nameof(SynthesisOrder), nameof(SynthesisOrder.Order), int.MaxValue);
     }));
 }
Пример #23
0
    // Use this for initialization
    void Start()
    {
        // Set the stars according to the time
        SetStarValues();

        // Save number of stars for this level in Campaign mode
        if (myUniqueController.getGameMode() == AllGameParameters.GAME_MODE_CAMPAIGN)
        {
            int curLevel = myUniqueController.getCurrenLevel();

            if (curLevel > 0)
            {
                if (curLevelStars > SettingsParameters.starsForLevel [curLevel - 1])
                {
                    // Save stars for this level
                    SettingsParameters.starsForLevel [curLevel - 1] = curLevelStars;
                    // Save parameters in persistant data
                    SettingsParameters.SaveSettings();
                }
            }
        }
    }
Пример #24
0
        public static SettingsNodeVM[] Factory(SettingsParameters param, Type type)
        {
            var defaultObj = Activator.CreateInstance(type);

            return(type.GetMembers()
                   .Where(m => m.MemberType == MemberTypes.Property ||
                          m.MemberType == MemberTypes.Field)
                   .Select(m =>
            {
                switch (m)
                {
                case PropertyInfo prop:
                    return MemberFactory(param, m.Name, prop.PropertyType, prop.GetValue(defaultObj));

                case FieldInfo field:
                    return MemberFactory(param, m.Name, field.FieldType, field.GetValue(defaultObj));

                default:
                    throw new ArgumentException();
                }
            })
                   .ToArray());
        }
        public static EnumDictionarySettingsVM Factory(SettingsParameters param, FieldMeta fieldMeta, Type enumType)
        {
            var vals  = GetDefaultValDictionary(param.DefaultVal);
            var proto = SettingsNodeVM.MemberFactory(param with {
                DefaultVal = null
            }, member: null);

            proto.WrapUp();
            return(new EnumDictionarySettingsVM(
                       fieldMeta,
                       Enum.GetNames(enumType).Select(e =>
            {
                if (!vals.TryGetValue(e, out var defVal))
                {
                    defVal = null;
                }
                return new KeyValuePair <string, SettingsNodeVM>(
                    e,
                    SettingsNodeVM.MemberFactory(param with {
                    DefaultVal = defVal
                }, member: null));
            }).ToArray(),
                       proto));
        }
Пример #26
0
 public void InitializeStarTime()
 {
     startTime = SettingsParameters.AdjustValueAccordingToDifficulty(AllGameParameters.TIME_START_MEDIUM, AllGameParameters.TIME_START_DIFFERENCE);
 }
Пример #27
0
    //////////////////////////////////////////////////////////////////////////////////
    // Update is called once per frame
    //////////////////////////////////////////////////////////////////////////////////
    void Update()
    {
        carafeObject sourceCarafe;
        carafeObject destinationCarafe;
        string       timeStr;

        timeStr = myUniqueController.timeMngt();
        if (timeStr == null)
        {
            // GAME OVER : Timeout !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_GAME_OVER);

            // Save score in GGPS (and level)
            GGPS_GameEndManagement(myUniqueController.getGameMode(), myUniqueController.getScore(), myUniqueController.getCurrenLevel());

            // Come back to main screen
            SceneManager.LoadScene("StartMenu");
        }
        else
        {
            // Check if bip for last 3 seconds
            BipForLast3Seconds();
        }

        // Update score text
        SetTextValue(timeStr);

        // MOUSE BUTTON DOWN
        if (Input.GetMouseButtonDown(0))
        {
            // Get the position when the mouse button was DOWN
            posDown = getMouseClick();
            // And get echiquier position
            clickPosDown = getEchiquerClick(posDown);
            SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_CLICK);
        }

        // MOUSE BUTTON UP
        if (Input.GetMouseButtonUp(0))
        {
            // Get the position when the mouse button was UP
            posUp = getMouseClick();
            int n = GetCadran(posDown, posUp);
            clickPosUp = GetPositionFromCadran(clickPosDown, n);

            // We have to load new Recipient and unload current one
            if ((GetPositionBoundaries(clickPosUp) == false) || (GetPositionBoundaries(clickPosDown) == false))
            {
                return;
            }

            sourceCarafe = theCases[clickPosDown.x, clickPosDown.y].getCaseCarafe();
            if (sourceCarafe.getCarafeVolume() == AllGameParameters.VOLUME_0)
            {
                return;
            }

            // Check if loading FinalCarafe
            if (checkFinalCarafeMovement())
            {
                // Yes, we load FinaleCarafe
                SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_COIN);

                int remainingVolume;
                remainingVolume = theFinalCarafe.loadCarafe(sourceCarafe.getCarafeVolume(), sourceCarafe.getCarafeColor());
                sourceCarafe.unloadCarafe(remainingVolume);

                // Check if carafe is ACID type
                if (sourceCarafe.getCarafeType() == AllGameParameters.LIQUID_TYPE_ACID)
                {
                    sourceCarafe.setCarafeVolume(AllGameParameters.VOLUME_0);
                    sourceCarafe.setCarafeType(AllGameParameters.LIQUID_TYPE_WATER);
                }
                if (theFinalCarafe.getCarafeVolume() >= 0)
                {
                    theFinalCarafe.setCarafeType(AllGameParameters.LIQUID_TYPE_WATER);
                }
                else
                {
                    // If volume is negative, it is an ACID bottle
                    theFinalCarafe.setCarafeType(AllGameParameters.LIQUID_TYPE_ACID);
                }

                // Update the display
                UpdateCarafeInPosition(sourceCarafe, clickPosDown.x, clickPosDown.y);
                UpdateFinalCarafe();

                // CHECK IF PLAYER HAS WIN !
                if ((theFinalCarafe.getCarafeColor() == theFinalCarafeTarget.getCarafeColor()) && (theFinalCarafe.getCarafeVolume() == theFinalCarafeTarget.getCarafeVolume()))
                {
                    // LEVEL FINISHED !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                    SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_FINISH);

                    // Give score (depends on remaining time)
                    myUniqueController.setTimeValue();
                    myUniqueController.increaseScore(myUniqueController.giveScoreBonus());

                    // Check if an Achievement (trophe) can be done for the time
                    GGPS_Manager.GGPS_GainTimeAchievement(myUniqueController.getPassedTimeInSecondsWithDecimal());

                    // Increment current Level value
                    myUniqueController.incrementCurrenLevel();

                    // Check if an Achievement (trophe) can be done for the level reached
                    GGPS_Manager.GGPS_GainAchievement(myUniqueController.getGameMode(), myUniqueController.getCurrenLevel());

                    // Save last reached level in Campaign mode
                    if (myUniqueController.getGameMode() == AllGameParameters.GAME_MODE_CAMPAIGN)
                    {
                        int curLevel = myUniqueController.getCurrenLevel();

                        // Debug.Log ("FINISHED !! - cureLevel=" + curLevel + " - currentlyReachedLevel=" + SettingsParameters.currentlyReachedLevel);
                        if (curLevel >= SettingsParameters.currentlyReachedLevel)
                        {
                            // Save new game level
                            SettingsParameters.currentlyReachedLevel = curLevel;
                        }

                        // Save parameters in persistant data
                        SettingsParameters.SaveSettings();

                        // Check if we reached last Screen in Campaign mode
                        if (curLevel == SettingsParameters.LEVEL_NUMBER)
                        {
                            // We reached last level ==> Finished
                            SceneManager.LoadScene("FinishScreen");
                            return;
                        }
                    }

                    // Load WaiScreen scene
                    SceneManager.LoadScene("WaitScreen");
                }

                return;
            }

            // Check if movement is possible (just around current position)
            if (checkMovement())
            {
                // Determine the source & destination carafes
                sourceCarafe      = theCases[clickPosDown.x, clickPosDown.y].getCaseCarafe();
                destinationCarafe = theCases[clickPosUp.x, clickPosUp.y].getCaseCarafe();

                // Check if source of destination is a WALL, in this case nothing happens
                if ((sourceCarafe.getCarafeType() == AllGameParameters.LIQUID_TYPE_WALL) || (destinationCarafe.getCarafeType() == AllGameParameters.LIQUID_TYPE_WALL))
                {
                    return;
                }

                // movement is OK
                SoundManager.gameSoundManager.PlaySound(SoundManager.SOUND_COIN);

                // We have to load new Recipient and unload current one
                int remainingVolume;
                remainingVolume = destinationCarafe.loadCarafe(sourceCarafe.getCarafeVolume(), sourceCarafe.getCarafeColor());
                sourceCarafe.unloadCarafe(remainingVolume);

                // Check if carafe is ACID type
                if (sourceCarafe.getCarafeType() == AllGameParameters.LIQUID_TYPE_ACID)
                {
                    sourceCarafe.setCarafeVolume(AllGameParameters.VOLUME_0);
                    sourceCarafe.setCarafeType(AllGameParameters.LIQUID_TYPE_WATER);
                }
                if (destinationCarafe.getCarafeVolume() >= 0)
                {
                    destinationCarafe.setCarafeType(AllGameParameters.LIQUID_TYPE_WATER);
                }
                else
                {
                    // If volume is negative, it is an ACID bottle
                    destinationCarafe.setCarafeType(AllGameParameters.LIQUID_TYPE_ACID);
                }

                // Update the display
                UpdateCarafeInPosition(sourceCarafe, clickPosDown.x, clickPosDown.y);
                UpdateCarafeInPosition(destinationCarafe, clickPosUp.x, clickPosUp.y);

                myUniqueController.increaseScore(1);
            }
            else
            {
                // Debug.LogWarning ("MOV KO"); // TO REMOVE
                clickPosDown = resetPosition();
                clickPosUp   = resetPosition();
            }
        }
    }
Пример #28
0
 public EnumerableObjectSettingsVM(SettingsParameters param, string memberName, Type t)
     : base(memberName)
 {
     _prototype = new ObjectSettingsVM(param, string.Empty, t);
     Init();
 }
Пример #29
0
        public static SettingsNodeVM MemberFactory(SettingsParameters param, MemberInfo?member)
        {
            string displayName = GetDisplayName(member);
            string diskName    = GetDiskName(member);

            string?tooltip = null;

            if (member != null && member.TryGetCustomAttribute <SynthesisTooltip>(out var toolTipAttr))
            {
                tooltip = toolTipAttr.Text;
            }

            var meta = new FieldMeta(
                DisplayName: displayName,
                DiskName: diskName,
                Tooltip: tooltip,
                MainVM: param.MainVM,
                Parent: param.Parent,
                IsPassthrough: false);

            switch (param.TargetType.Name)
            {
            case "Boolean":
                return(new BoolSettingsVM(meta, param.DefaultVal));

            case "SByte":
                return(new Int8SettingsVM(meta, param.DefaultVal));

            case "Int16":
                return(new Int16SettingsVM(meta, param.DefaultVal));

            case "Int32":
                return(new Int32SettingsVM(meta, param.DefaultVal));

            case "Int64":
                return(new Int64SettingsVM(meta, param.DefaultVal));

            case "Byte":
                return(new UInt8SettingsVM(meta, param.DefaultVal));

            case "UInt16":
                return(new UInt16SettingsVM(meta, param.DefaultVal));

            case "UInt32":
                return(new UInt32SettingsVM(meta, param.DefaultVal));

            case "UInt64":
                return(new UInt64SettingsVM(meta, param.DefaultVal));

            case "Double":
                return(new DoubleSettingsVM(meta, param.DefaultVal));

            case "Single":
                return(new FloatSettingsVM(meta, param.DefaultVal));

            case "Decimal":
                return(new DecimalSettingsVM(meta, param.DefaultVal));

            case "String":
                return(new StringSettingsVM(meta, param.DefaultVal));

            case "ModKey":
                return(new ModKeySettingsVM(param.DetectedLoadOrder.Transform(x => x.Listing.ModKey), meta, param.DefaultVal));

            case "FormKey":
                return(new FormKeySettingsVM(meta, param.DefaultVal));

            case "Array`1":
            case "List`1":
            case "IEnumerable`1":
            case "HashSet`1":
            {
                var firstGen = param.TargetType.GenericTypeArguments[0];
                switch (firstGen.Name)
                {
                case "SByte":
                    return(EnumerableNumericSettingsVM.Factory <sbyte, Int8SettingsVM>(meta, param.DefaultVal, new Int8SettingsVM()));

                case "Int16":
                    return(EnumerableNumericSettingsVM.Factory <short, Int16SettingsVM>(meta, param.DefaultVal, new Int16SettingsVM()));

                case "Int32":
                    return(EnumerableNumericSettingsVM.Factory <int, Int32SettingsVM>(meta, param.DefaultVal, new Int32SettingsVM()));

                case "Int64":
                    return(EnumerableNumericSettingsVM.Factory <long, Int64SettingsVM>(meta, param.DefaultVal, new Int64SettingsVM()));

                case "Byte":
                    return(EnumerableNumericSettingsVM.Factory <byte, UInt8SettingsVM>(meta, param.DefaultVal, new UInt8SettingsVM()));

                case "UInt16":
                    return(EnumerableNumericSettingsVM.Factory <ushort, UInt16SettingsVM>(meta, param.DefaultVal, new UInt16SettingsVM()));

                case "UInt32":
                    return(EnumerableNumericSettingsVM.Factory <uint, UInt32SettingsVM>(meta, param.DefaultVal, new UInt32SettingsVM()));

                case "UInt64":
                    return(EnumerableNumericSettingsVM.Factory <ulong, UInt64SettingsVM>(meta, param.DefaultVal, new UInt64SettingsVM()));

                case "Double":
                    return(EnumerableNumericSettingsVM.Factory <double, DoubleSettingsVM>(meta, param.DefaultVal, new DoubleSettingsVM()));

                case "Single":
                    return(EnumerableNumericSettingsVM.Factory <float, FloatSettingsVM>(meta, param.DefaultVal, new FloatSettingsVM()));

                case "Decimal":
                    return(EnumerableNumericSettingsVM.Factory <decimal, DecimalSettingsVM>(meta, param.DefaultVal, new DecimalSettingsVM()));

                case "ModKey":
                    return(EnumerableModKeySettingsVM.Factory(param, meta, param.DefaultVal));

                case "FormKey":
                    return(EnumerableFormKeySettingsVM.Factory(meta, param.DefaultVal));

                case "String":
                    return(EnumerableStringSettingsVM.Factory(meta, param.DefaultVal));

                default:
                {
                    if (firstGen.Name.Contains("FormLink") &&
                        firstGen.IsGenericType &&
                        firstGen.GenericTypeArguments.Length == 1)
                    {
                        var formLinkGen = firstGen.GenericTypeArguments[0];
                        return(EnumerableFormLinkSettingsVM.Factory(param, meta, formLinkGen.FullName ?? string.Empty, param.DefaultVal));
                    }
                    var foundType = param.Assembly.GetType(firstGen.FullName !);
                    if (foundType != null)
                    {
                        if (foundType.IsEnum)
                        {
                            return(EnumerableEnumSettingsVM.Factory(meta, param.DefaultVal, foundType));
                        }
                        else
                        {
                            return(EnumerableObjectSettingsVM.Factory(param with {
                                        TargetType = foundType
                                    }, meta));
                        }
                    }
                    return(new UnknownSettingsVM(meta));
                }
                }
            }

            case "Dictionary`2":
            {
                var firstGen  = param.TargetType.GenericTypeArguments[0];
                var secondGen = param.TargetType.GenericTypeArguments[1];
                if (member != null &&
                    firstGen.IsEnum &&
                    (!member.TryGetCustomAttribute <SynthesisStaticEnumDictionary>(out var staticEnumAttr) ||
                     staticEnumAttr.Enabled))
                {
                    return(EnumDictionarySettingsVM.Factory(param with {
                            TargetType = secondGen
                        }, meta, firstGen));
                }
Пример #30
0
        public static SettingsNodeVM MemberFactory(SettingsParameters param, string memberName, Type targetType, object?defaultVal)
        {
            switch (targetType.Name)
            {
            case "Boolean":
                return(new BoolSettingsVM(memberName, defaultVal));

            case "SByte":
                return(new Int8SettingsVM(memberName, defaultVal));

            case "Int16":
                return(new Int16SettingsVM(memberName, defaultVal));

            case "Int32":
                return(new Int32SettingsVM(memberName, defaultVal));

            case "Int64":
                return(new Int64SettingsVM(memberName, defaultVal));

            case "Byte":
                return(new UInt8SettingsVM(memberName, defaultVal));

            case "UInt16":
                return(new UInt16SettingsVM(memberName, defaultVal));

            case "UInt32":
                return(new UInt32SettingsVM(memberName, defaultVal));

            case "UInt64":
                return(new UInt64SettingsVM(memberName, defaultVal));

            case "Double":
                return(new DoubleSettingsVM(memberName, defaultVal));

            case "Single":
                return(new FloatSettingsVM(memberName, defaultVal));

            case "Decimal":
                return(new DecimalSettingsVM(memberName, defaultVal));

            case "ModKey":
                return(new ModKeySettingsVM(param.DetectedLoadOrder.Transform(x => x.Listing.ModKey), memberName, defaultVal));

            case "FormKey":
                return(new FormKeySettingsVM(memberName, defaultVal));

            case "Array`1":
            case "List`1":
            case "IEnumerable`1":
            {
                var firstGen = targetType.GenericTypeArguments[0];
                switch (firstGen.Name)
                {
                case "SByte":
                    return(EnumerableNumericSettingsVM.Factory <sbyte, Int8SettingsVM>(memberName, defaultVal, new Int8SettingsVM()));

                case "Int16":
                    return(EnumerableNumericSettingsVM.Factory <short, Int16SettingsVM>(memberName, defaultVal, new Int16SettingsVM()));

                case "Int32":
                    return(EnumerableNumericSettingsVM.Factory <int, Int32SettingsVM>(memberName, defaultVal, new Int32SettingsVM()));

                case "Int64":
                    return(EnumerableNumericSettingsVM.Factory <long, Int64SettingsVM>(memberName, defaultVal, new Int64SettingsVM()));

                case "Byte":
                    return(EnumerableNumericSettingsVM.Factory <byte, UInt8SettingsVM>(memberName, defaultVal, new UInt8SettingsVM()));

                case "UInt16":
                    return(EnumerableNumericSettingsVM.Factory <ushort, UInt16SettingsVM>(memberName, defaultVal, new UInt16SettingsVM()));

                case "UInt32":
                    return(EnumerableNumericSettingsVM.Factory <uint, UInt32SettingsVM>(memberName, defaultVal, new UInt32SettingsVM()));

                case "UInt64":
                    return(EnumerableNumericSettingsVM.Factory <ulong, UInt64SettingsVM>(memberName, defaultVal, new UInt64SettingsVM()));

                case "Double":
                    return(EnumerableNumericSettingsVM.Factory <double, DoubleSettingsVM>(memberName, defaultVal, new DoubleSettingsVM()));

                case "Single":
                    return(EnumerableNumericSettingsVM.Factory <float, FloatSettingsVM>(memberName, defaultVal, new FloatSettingsVM()));

                case "Decimal":
                    return(EnumerableNumericSettingsVM.Factory <decimal, DecimalSettingsVM>(memberName, defaultVal, new DecimalSettingsVM()));

                case "ModKey":
                    return(EnumerableModKeySettingsVM.Factory(param, memberName, defaultVal));

                case "FormKey":
                    return(EnumerableFormKeySettingsVM.Factory(memberName, defaultVal));

                default:
                {
                    if (firstGen.Name.Contains("FormLink") &&
                        firstGen.IsGenericType &&
                        firstGen.GenericTypeArguments.Length == 1)
                    {
                        var formLinkGen = firstGen.GenericTypeArguments[0];
                        if (!LoquiRegistration.TryGetRegister(formLinkGen, out var regis))
                        {
                            throw new ArgumentException($"Can't create a formlink control for type: {formLinkGen}");
                        }
                        return(EnumerableFormLinkSettingsVM.Factory(param, memberName, regis.GetterType, defaultVal));
                    }
                    var foundType = param.Assembly.GetType(firstGen.FullName !);
                    if (foundType != null)
                    {
                        return(new EnumerableObjectSettingsVM(param, memberName, foundType));
                    }
                }
                    return(new UnknownSettingsVM(memberName));
                }
            }

            case "HashSet`1":
            {
                var firstGen = targetType.GenericTypeArguments[0];
                switch (firstGen.Name)
                {
                case "ModKey":
                    return(EnumerableModKeySettingsVM.Factory(param, memberName, defaultVal));

                case "FormKey":
                    return(EnumerableFormKeySettingsVM.Factory(memberName, defaultVal));

                default:
                {
                    if (firstGen.Name.Contains("FormLink") &&
                        firstGen.IsGenericType &&
                        firstGen.GenericTypeArguments.Length == 1)
                    {
                        var formLinkGen = firstGen.GenericTypeArguments[0];
                        if (!LoquiRegistration.TryGetRegister(formLinkGen, out var regis))
                        {
                            throw new ArgumentException($"Can't create a formlink control for type: {formLinkGen}");
                        }
                        return(EnumerableFormLinkSettingsVM.Factory(param, memberName, regis.GetterType, defaultVal));
                    }
                    var foundType = param.Assembly.GetType(firstGen.FullName !);
                    if (foundType != null)
                    {
                        return(new EnumerableObjectSettingsVM(param, memberName, foundType));
                    }
                }
                    return(new UnknownSettingsVM(memberName));
                }
            }

            default:
            {
                if (targetType.Name.Contains("FormLink") &&
                    targetType.IsGenericType &&
                    targetType.GenericTypeArguments.Length == 1)
                {
                    return(new FormLinkSettingsVM(param.LinkCache, memberName, targetType));
                }
                var foundType = param.Assembly.GetType(targetType.FullName !);
                if (foundType != null)
                {
                    return(new ObjectSettingsVM(param, memberName, foundType));
                }
            }
                return(new UnknownSettingsVM(memberName));
            }
        }