Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
10 kB
1
Indexable
Never
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Game.Challenge;
using Spine.Collections;
using UnityEngine;
using XCrew;
//using Event = XCrew.Event;

[Serializable]
public enum ChallengeTutorial
{
    Locked,
    Unlocked,
    Done,
}

public class ChallengeSave : UserData
{
    public static ChallengeSave Ins => LocalData.Get<ChallengeSave>();

    // private Dictionary<ChallengeDifficulty, Dictionary<int, ChallengeSaveData>> Data =
    //     new Dictionary<ChallengeDifficulty, Dictionary<int, ChallengeSaveData>>();

    public Dictionary<int, ChallengeSaveData> DataNormalChallenge = new Dictionary<int, ChallengeSaveData>();
    public Dictionary<int, ChallengeSaveData> DataHardChallenge = new Dictionary<int, ChallengeSaveData>();

    public ChallengeTutorial _ChallengeTutorial = ChallengeTutorial.Locked;


    public ChallengeSaveData GetOrCreateChallengeSaveData(ChallengeDifficulty difficulty, int level)
    {
        var challengeSaveList = GetChallengeSaveList(difficulty);

        //- if level not exist, create it
        if (!challengeSaveList.ContainsKey(level))
        {
            challengeSaveList.Add(level, new ChallengeSaveData(difficulty, level));
        }

        Save();
        return challengeSaveList[level];
    }

    /// <summary>
    /// Can be NULL
    /// </summary>
    public ChallengeSaveData GetChallengeSaveData(ChallengeDifficulty difficulty, int level)
    {
        var challengeSaveList = GetChallengeSaveList(difficulty);

        if (challengeSaveList.ContainsKey(level))
            return challengeSaveList[level];

        return null;
    }

    public Dictionary<int, ChallengeSaveData> GetChallengeSaveList(ChallengeDifficulty difficulty)
    {
        //- if difficulty not exist, create it

        if (difficulty == ChallengeDifficulty.Normal)
        {
            if (DataNormalChallenge == null)
            {
                DataNormalChallenge = new Dictionary<int, ChallengeSaveData>();
                Save();
            }

            return DataNormalChallenge;
        }
        else //- hard
        {
            if (DataHardChallenge == null)
            {
                DataHardChallenge = new Dictionary<int, ChallengeSaveData>();
                Save();
            }

            return DataHardChallenge;
        }
    }

    public int NumOfGames(ChallengeDifficulty difficulty, State state)
    {
        if (difficulty == ChallengeDifficulty.Normal)
        {
            if (DataNormalChallenge == null)
            {
                return 0;
            }

            return DataNormalChallenge.Count(save => save.Value.state == state);
        }
        else //- hard
        {
            if (DataHardChallenge == null)
            {
                return 0;
            }

            return DataHardChallenge.Count(save => save.Value.state == state);
        }
    }

    public int GetStartLevelToShowNineItems(ChallengeDifficulty difficulty)
    {
        //- old, search 0 -> end
        // var normalChallengeSaves = GetChallengeSaveList(ChallengeDifficulty.Normal);
        // var temp = normalChallengeSaves.ToList();
        // temp.Sort((a, b) => a.Key.CompareTo(b.Key));
        //
        // for (int i = 0; i < temp.Count; i += 9)
        // {
        //     if(temp[i].Value.state == State.Win)
        //     for (int j = 0; j < 9; ++j)
        //     {
        //         if (temp[i + j].Value.state != State.Win)
        //         {
        //             return i;
        //         }
        //     }
        // }

        try
        {
            if (difficulty == ChallengeDifficulty.Normal)
            {

                var challengeNormalGroupDone = UserProfileData.Ins.ChallengeNormalGroupDone;
                var startLevelToCheck = challengeNormalGroupDone * 9;
                var endLevelToCheck = startLevelToCheck + 8; //- 9 levels

                for (int i = startLevelToCheck; i <= endLevelToCheck; ++i)
                {
                    var challengeSave = GetChallengeSaveData(ChallengeDifficulty.Normal, level: i);
                    if (challengeSave == null)
                    {
                        return startLevelToCheck;
                    }

                    if (challengeSave.state != State.Win)
                    {
                        return startLevelToCheck;
                    }
                }

                UserProfileData.Ins.ChallengeNormalGroupDone += 1;
                Save();

                return UserProfileData.Ins.ChallengeNormalGroupDone * 9;
            }
            else //- hard
            {
                var challengeHardGroupDone = UserProfileData.Ins.ChallengeHardGroupDone;
                var startLevelToCheck = challengeHardGroupDone * 9;
                var endLevelToCheck = startLevelToCheck + 8; //- 9 levels

                for (int i = startLevelToCheck; i <= endLevelToCheck; ++i)
                {
                    var challengeSave = GetChallengeSaveData(ChallengeDifficulty.Hard, level: i);
                    if (challengeSave == null)
                    {
                        return startLevelToCheck;
                    }

                    if (challengeSave.state != State.Win)
                    {
                        return startLevelToCheck;
                    }
                }

                UserProfileData.Ins.ChallengeHardGroupDone += 1;
                Save();

                return UserProfileData.Ins.ChallengeHardGroupDone * 9;
            }
        }
        catch (Exception e)
        {
            Debug.LogError($"[Challenge] SOS! {e}");
            return -1;
        }
    }

    public void Init()
    {
        /*var normalChallengeData = ChallengeController.Ins.GetChallengeGroupData(ChallengeDifficulty.Normal);
        for (int level = 0; level < normalChallengeData.challengeData.Count; ++level)
        {
            var save = GetChallengeSaveData(ChallengeDifficulty.Normal, level);
            if (save == null)//- not have save
            {
                GetChallengeSaveList(ChallengeDifficulty.Normal).Add(level, new ChallengeSaveData());
            }
        }*/
    }

    public void Save(State state, ChallengeDifficulty difficulty, int level)
    {
        var challenge = GetOrCreateChallengeSaveData(difficulty, level);

        //---- if last state is win, play again get lose -> dont save state
        if (state == State.Lose && challenge.state == State.Win)
        {
            return;
        }

        challenge.state = state;
        if (state == State.Win)
        {
            ++challenge.NumOfWins;
        }

        Save();

        var challengeItem = ChallengePanel.GetChallengeItem(difficulty, level);
        challengeItem?.UpdateState();
    }

    public void Seen(ChallengeDifficulty difficulty, int level)
    {
        var challenge = GetOrCreateChallengeSaveData(difficulty, level);
        challenge.HasSeen = true;
        Save();
    }

    public void CheckDoneTutorial()
    {
        if (_ChallengeTutorial != ChallengeTutorial.Unlocked)
            return;

        _ChallengeTutorial = ChallengeTutorial.Done;
        //GameUIController.Ins.TutorialDialogChallenge.ChallengeTutorial_OnEnd();
        Save();
    }

    public bool IsTutorialChallenge()
    {
        if (_ChallengeTutorial == ChallengeTutorial.Done)
            return false;
        
        var levelClassicNeedToUnlock = 
            ChallengeController.GetLevelRequiredToUnlock(ChallengeDifficulty.Normal, 0); //- get first 

        return UserProfileData.Ins.CurrentlevelClassic == levelClassicNeedToUnlock;
    }
    
    public bool CheckUnlockTutorial()
    {
        switch (_ChallengeTutorial)
        {
            case ChallengeTutorial.Unlocked:
            {
                Debug.Log($"[debug] add ChallengeTutorial_Show"); 
                /*UIDialogController.Instance.ActionOnEndStackDialog +=
                    GameUIController.Ins.TutorialDialogChallenge.ChallengeTutorial_Show;*/
                return true;
            }

            case ChallengeTutorial.Locked:
            {
                var levelClassicNeedToUnlock = 
                    ChallengeController.GetLevelRequiredToUnlock(ChallengeDifficulty.Normal, 0); //- get first 
            
                if(IsTutorialChallenge())
                {
                    _ChallengeTutorial = ChallengeTutorial.Unlocked;
                    Save();
                    goto case ChallengeTutorial.Unlocked;
                }
                else
                {
                    //GameUIController.Ins.TutorialDialogChallenge.Hide();
                    return false;
                }
                // GameUIController.Ins.TutorialDialogChallenge.ChallengeTutorial_OnEnd();
                break;
            }
            
            case ChallengeTutorial.Done:
            {
                //GameUIController.Ins.TutorialDialogChallenge.Hide();
                return false;
            }
        }

        return false;
    }
}

[Serializable]
public class ChallengeSaveData
{
    public State state = State.LockedByLevel;
    public int Level;
    public ChallengeDifficulty difficulty;
    public int NumOfWins = 0;
    
    /// <summary>
    /// Use for tracking new challenge has unlocked by level then notify on UI
    /// </summary>
    public bool HasSeen = false;

    public ChallengeSaveData(ChallengeDifficulty difficulty, int level)
    {
        Level = level;
        this.difficulty = difficulty;
    }
    
    public void Win()
    {
        
    }

    public void Lose()
    {
        
    }
    
}
//
// [Serializable]
// public class NormalSaveData : ChallengeSaveData
// {
//     
// }
//
// [Serializable]
// public class HardSaveData : ChallengeSaveData
// {
// }