Advertisement
SnowPhoenix347

Untitled

Mar 2nd, 2020
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.83 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine.SceneManagement;
  4. using UnityEngine;
  5.  
  6. namespace Assets.Scripts.Model
  7. {
  8.     public class Session
  9.     {
  10.  
  11.         private Stage[] _stages;
  12.         private Queue<Stage> _stagesQueue;
  13.         private int _goodAnswers, _badAnswers;
  14.         private int GoodAnswers
  15.         {
  16.             get
  17.             {
  18.                 return _goodAnswers;
  19.             }
  20.  
  21.             set
  22.             {
  23.                 _goodAnswers = value;
  24.                 OnGoodChoice?.Invoke();
  25.                 OnPrecentesChange?.Invoke(this);
  26.             }
  27.         }
  28.         private int BadAnswers
  29.         {
  30.             get
  31.             {
  32.                 return _badAnswers;
  33.             }
  34.  
  35.             set
  36.             {
  37.                 _badAnswers = value;
  38.                 OnBadChoice?.Invoke();
  39.                 OnPrecentesChange?.Invoke(this);
  40.             }
  41.         }
  42.         private Dictionary<Stage, float> _stagesTicks = new Dictionary<Stage, float>();
  43.         private float _maxStageTick = 15;
  44.  
  45.         public event Action<Session> OnPrecentesChange, OnFinite, OnStageChange, OnFailed;
  46.         public event Action<Stage, float> OnStageTick;
  47.         public event Action OnGoodChoice, OnBadChoice;
  48.  
  49.         public int GoodPrecent
  50.         {
  51.             get
  52.             {
  53.                 return Precents(GoodAnswers, BadAnswers).Item1;
  54.             }
  55.         }
  56.         public int BadPrecent
  57.         {
  58.             get
  59.             {
  60.                 return Precents(GoodAnswers, BadAnswers).Item2;
  61.             }
  62.         }
  63.         public bool IsFinite { get; private set; }
  64.         public bool IsFailed { get; private set; }
  65.         public bool IsEnded {
  66.             get
  67.             {
  68.                 return IsFinite || IsFailed;
  69.             }
  70.         }
  71.         public Stage CurrentStage {
  72.             get {
  73.                 if (_stagesQueue.Count > 0)
  74.                 {
  75.                     return _stagesQueue.Peek();
  76.                 }
  77.                 else
  78.                 {
  79.                     return null;
  80.                 }
  81.             }
  82.         }
  83.         public IEnumerable<Stage> Stages => _stages;
  84.  
  85.         public Session(params Stage[] stages)
  86.         {
  87.             if (stages.Length == 0)
  88.             {
  89.                 throw new ArgumentException("Need stages", "stages");
  90.             }
  91.  
  92.             _stages = stages;
  93.             _stagesQueue = new Queue<Stage>(_stages);
  94.  
  95.             foreach(var stage in _stages)
  96.             {
  97.                 _stagesTicks.Add(stage, 0);
  98.             }
  99.         }
  100.  
  101.         public bool Answer(int answer)
  102.         {
  103.             if (IsEnded)
  104.             {
  105.                 throw new InvalidOperationException();
  106.             }
  107.  
  108.             if (answer == CurrentStage.QuestedNumber)
  109.             {
  110.                 GoodAnswers++;
  111.                 return true;
  112.             }
  113.             else
  114.             {
  115.                 BadAnswers++;
  116.                 return false;
  117.             }
  118.         }
  119.  
  120.         public void ForceWrong()
  121.         {
  122.             if (IsEnded)
  123.             {
  124.                 throw new InvalidOperationException();
  125.             }
  126.  
  127.             BadAnswers++;
  128.         }
  129.  
  130.         public bool NextStage()
  131.         {
  132.             if (IsEnded)
  133.             {
  134.                 return false;
  135.             }
  136.  
  137.             if(GoodPrecent < BadPrecent)
  138.             {
  139.                 IsFailed = true;
  140.                 OnFailed?.Invoke(this);
  141.                 return false;
  142.             }
  143.  
  144.             if (_stagesQueue.Count > 1)
  145.             {
  146.                 _stagesQueue.Dequeue();
  147.                 OnStageChange?.Invoke(this);
  148.             }
  149.             else
  150.             {
  151.                 IsFinite = true;
  152.                 OnStageChange?.Invoke(this);
  153.                 OnFinite?.Invoke(this);
  154.             }
  155.            
  156.             return true;
  157.         }
  158.  
  159.         public IEnumerable<Stage> GetStages()
  160.         {
  161.             return _stagesQueue;
  162.         }
  163.  
  164.         public void SetStageTick(float tick)
  165.         {
  166.             _stagesTicks[CurrentStage] += tick;
  167.             if (_stagesTicks[CurrentStage] >= _maxStageTick)
  168.             {
  169.                 NextStage();
  170.             }
  171.  
  172.             OnStageTick?.Invoke(CurrentStage,
  173.                 Mathf.Clamp(_stagesTicks[CurrentStage] / _maxStageTick, 0, 1));
  174.         }
  175.  
  176.         private static Tuple<int, int> Precents(int val1, int val2)
  177.         {
  178.             if (val1 == 0 && val2 == 0)
  179.                 return new Tuple<int, int>(50, 50);
  180.             if(val1 == 0)
  181.                 return new Tuple<int, int>(0, 100);
  182.             if(val2 == 0)
  183.                 return new Tuple<int, int>(100, 0);
  184.  
  185.             float total = val1 + val2;
  186.             return new Tuple<int, int>(Mathf.RoundToInt(val1 / total * 100), Mathf.RoundToInt(val2 / total * 100));
  187.         }
  188.     }
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement