예제 #1
0
    public static PPIDailyRewards Fix(this PPIDailyRewards @this)
    {
        PPIDailyRewards rewards = @this ?? new PPIDailyRewards();

        // fix instant rewards
        if (rewards.Instant == null || rewards.Instant.Length != PPIDailyRewards.DAYS_PER_CYCLE)
        {
            rewards.Instant = new PPIDailyRewards.Day[PPIDailyRewards.DAYS_PER_CYCLE];
        }
        for (int idx = 0; idx < PPIDailyRewards.DAYS_PER_CYCLE; ++idx)
        {
            rewards.Instant[idx] = rewards.Instant[idx] ?? new PPIDailyRewards.Day();
        }

        // fix conditional rewards
        if (rewards.Conditional == null || rewards.Conditional.Length != PPIDailyRewards.DAYS_PER_CYCLE)
        {
            rewards.Conditional = new PPIDailyRewards.Day[PPIDailyRewards.DAYS_PER_CYCLE];
        }
        for (int idx = 0; idx < PPIDailyRewards.DAYS_PER_CYCLE; ++idx)
        {
            rewards.Conditional[idx] = rewards.Conditional[idx] ?? new PPIDailyRewards.Day();
        }

        return(rewards);
    }
예제 #2
0
    IEnumerator ShowCurrentRewards_Coroutine(PPIDailyRewards rewards, bool instant, bool conditional)
    {
        int      currDay = rewards.CurrentDay;
        DateTime date    = CloudDateTime.UtcNow.Date - TimeSpan.FromDays(currDay);

        DayInfo[] infos = new DayInfo[PPIDailyRewards.DAYS_PER_CYCLE];
        for (int idx = 0; idx < PPIDailyRewards.DAYS_PER_CYCLE; ++idx)
        {
            E_Status status = E_Status.Idle;
            if (idx < currDay)
            {
                status = E_Status.Gained;
            }
            else if (idx == currDay)
            {
                status = E_Status.Current;
            }

            infos[idx] = new DayInfo()
            {
                Date        = date + TimeSpan.FromDays(idx),
                Status      = status,
                Scale       = Vector2.one,
                Instant     = rewards.Instant[idx].DeepCopy(),
                Conditional = rewards.Conditional[idx].DeepCopy()
            };
            infos[idx].Instant.Received = idx <= currDay ? true : false;
        }

        UpdateDays(infos);

        yield return(new WaitForSeconds(0.5f));

        if (MFGuiManager.Instance != null)
        {
            MFGuiManager.Instance.PlayOneShot(m_GainedAudio);
        }

        // highlight current reward
        if (instant == true || conditional == true)
        {
            bool blinkInstant     = instant;
            bool blinkConditional = conditional;

            for (int idx = 0; idx < 6; ++idx)
            {
                yield return(new WaitForSeconds(0.15f));

                m_Days[currDay].SetHighlight(blinkInstant, blinkConditional);

                blinkInstant     = instant ? !blinkInstant : false;
                blinkConditional = conditional ? !blinkConditional : false;
            }

            m_Days[currDay].SetHighlight(instant, conditional);
        }
    }
예제 #3
0
 public static PPIDailyRewards.Day GetCurrentConditionalDay(this PPIDailyRewards @this)
 {
     if (@this.Conditional == null)
     {
         return(new PPIDailyRewards.Day());
     }
     if (@this.Conditional.Length <= @this.CurrentDay)
     {
         return(new PPIDailyRewards.Day());
     }
     return(@this.Conditional[@this.CurrentDay] ?? new PPIDailyRewards.Day());
 }
예제 #4
0
 public static PPIDailyRewards.Day GetCurrentInstantDay(this PPIDailyRewards @this)
 {
     if (@this.Instant == null)
     {
         return(new PPIDailyRewards.Day());
     }
     if (@this.Instant.Length <= @this.CurrentDay)
     {
         return(new PPIDailyRewards.Day());
     }
     return(@this.Instant[@this.CurrentDay] ?? new PPIDailyRewards.Day());
 }
예제 #5
0
    // PRIVATE METHODS

    IEnumerator ShowRewards_Coroutine(PPIDailyRewards newRewards,
                                      bool instant,
                                      bool conditional,
                                      PPIDailyRewards oldRewards,
                                      DateTime oldRewardsDate)
    {
        if (oldRewards != null)
        {
            yield return(StartCoroutine(ShowMissedRewards_Coroutine(newRewards, oldRewards, oldRewardsDate)));
        }

        yield return(StartCoroutine(ShowCurrentRewards_Coroutine(newRewards, instant, conditional)));
    }
예제 #6
0
    public static void Store(this PPIDailyRewards @this, string primaryKey, string filename = "rewards")
    {
        DictionaryFile file = GetFile(primaryKey, filename);

        if (file == null)
        {
            return;
        }

        file.SetString("rewards", JsonMapper.ToJson(@this));
        file.SetString("date", CloudDateTime.UtcNow.Date.ToString());

        file.Save();
    }
예제 #7
0
    IEnumerator ShowMissedRewards_Coroutine(PPIDailyRewards newRewards, PPIDailyRewards oldRewards, DateTime oldRewardsDate)
    {
        int      currDay = oldRewards.CurrentDay;
        int      lastDay = PPIDailyRewards.DAYS_PER_CYCLE - 1;
        DateTime date    = oldRewardsDate - TimeSpan.FromDays(currDay);

        DayInfo[] infos = new DayInfo[PPIDailyRewards.DAYS_PER_CYCLE];
        for (int idx = 0; idx < PPIDailyRewards.DAYS_PER_CYCLE; ++idx)
        {
            infos[idx] = new DayInfo()
            {
                Date        = date + TimeSpan.FromDays(idx),
                Status      = idx <= currDay ? E_Status.Gained : E_Status.Idle,
                Scale       = Vector2.one,
                Instant     = oldRewards.Instant[idx].DeepCopy(),
                Conditional = oldRewards.Conditional[idx].DeepCopy()
            };
        }

        // display current status
        UpdateDays(infos);

        yield return(new WaitForSeconds(0.5f));

        // show missed days
        int day = currDay;

        while (day < lastDay)
        {
            yield return(new WaitForSeconds(0.25f * m_AnimationSpeed));

            day += 1;

            DayInfo info = infos[day];
            info.Status = E_Status.Missed;
            infos[day]  = info;

            if (MFGuiManager.Instance != null)
            {
                MFGuiManager.Instance.PlayOneShot(m_MissedAudio);
            }

            UpdateDays(infos);
        }

        yield return(new WaitForSeconds(0.5f * m_AnimationSpeed));

        date = CloudDateTime.UtcNow.Date - TimeSpan.FromDays(newRewards.CurrentDay);
        day  = Mathf.Min(day, lastDay);

        // rollback to the first day
        while (true)
        {
            if (MFGuiManager.Instance != null)
            {
                MFGuiManager.Instance.PlayOneShot(m_RollbackAudio);
            }

            int frames = 3;
            for (int frame = 0; frame < frames; ++frame)
            {
                DayInfo info = infos[day];
                info.Scale.x = 1.0f - 1.0f * (frame / (float)(frames - 1));
                infos[day]   = info;

                UpdateDays(infos);

                yield return(new WaitForEndOfFrame());
            }

            infos[day] = new DayInfo()
            {
                Date        = date + TimeSpan.FromDays(day),
                Status      = E_Status.Idle,
                Scale       = Vector2.one,
                Instant     = newRewards.Instant[day].DeepCopy(),
                Conditional = newRewards.Conditional[day].DeepCopy()
            };

            for (int frame = 0; frame < frames; ++frame)
            {
                DayInfo info = infos[day];
                info.Scale.x = 1.0f * (frame / (float)(frames - 1));
                infos[day]   = info;

                UpdateDays(infos);

                yield return(new WaitForEndOfFrame());
            }

            day -= 1;
            if (day < 0)
            {
                break;
            }

            yield return(new WaitForSeconds(0.1f * m_AnimationSpeed));
        }

        yield return(new WaitForSeconds(0.5f * m_AnimationSpeed));
    }
예제 #8
0
    // PUBLIC METHODS

    public void SetData(PPIDailyRewards newRewards, bool instant, bool conditional, PPIDailyRewards oldRewards, DateTime oldRewardsDate)
    {
        StartCoroutine(ShowRewards_Coroutine(newRewards, instant, conditional, oldRewards, oldRewardsDate));
    }
예제 #9
0
    // number of days player logged in row
    //public long    DailyRewardInRow; // the same as CurrentDay

    public static PPIDailyRewards Create()
    {
        PPIDailyRewards rewards = new PPIDailyRewards();

        return(rewards.Fix());
    }