1+ using System ;
2+ using CodeConcussion . KVL . Entities ;
3+ using CodeConcussion . KVL . Utilities . Messages ;
4+
5+ namespace CodeConcussion . KVL . Utilities . Game
6+ {
7+ public sealed class GameManager
8+ {
9+ public GameManager ( MessageDispatch dispatcher )
10+ {
11+ _dispatcher = dispatcher ;
12+ }
13+
14+ private readonly MessageDispatch _dispatcher ;
15+
16+ public Deck Deck { get ; private set ; }
17+ public Card CurrentCard { get ; private set ; }
18+ public Card PreviewCard { get ; private set ; }
19+ public bool IsPlaying { get ; private set ; }
20+ public DateTime ? StartedAt { get ; private set ; }
21+ public decimal Elapsed { get ; private set ; }
22+ public int Progress { get ; private set ; }
23+
24+ public bool CheckAnswer ( string guess )
25+ {
26+ var answer = int . Parse ( "0" + guess . Trim ( ) ) ;
27+ return answer == CurrentCard . Answer ;
28+ }
29+
30+ public void Deal ( )
31+ {
32+ Progress ++ ;
33+ if ( PreviewCard == null ) CurrentCard = null ;
34+
35+ if ( CurrentCard != null )
36+ {
37+ _dispatcher . PublishMessage ( MessageType . DealCard ) ;
38+ CurrentCard = PreviewCard ;
39+ PreviewCard = Deck . Deal ( ) ;
40+ }
41+ else
42+ {
43+ FinishGame ( ) ;
44+ }
45+ }
46+
47+ public void StartGame ( Deck deck )
48+ {
49+ Deck = deck ;
50+ Deck . Shuffle ( ) ;
51+ CurrentCard = Deck . Deal ( ) ;
52+ PreviewCard = Deck . Deal ( ) ;
53+
54+ Elapsed = 0 ;
55+ Progress = 1 ;
56+ IsPlaying = true ;
57+ StartedAt = DateTime . Now ;
58+ _dispatcher . PublishMessage ( MessageType . StartGame ) ;
59+ }
60+
61+ public void StopGame ( )
62+ {
63+ if ( ! IsPlaying ) return ;
64+ Elapsed = ( decimal ) ( DateTime . Now - StartedAt . GetValueOrDefault ( ) ) . TotalSeconds ;
65+ Progress = 0 ;
66+ IsPlaying = false ;
67+ StartedAt = null ;
68+ _dispatcher . PublishMessage ( MessageType . StopGame ) ;
69+ }
70+
71+ public void FinishGame ( )
72+ {
73+ StopGame ( ) ;
74+
75+ var seconds = decimal . Round ( Elapsed , 1 , MidpointRounding . AwayFromZero ) ;
76+ var record = new Record ( Deck , seconds ) ;
77+ var isNewRecord = Context . User . UpdateRecord ( record ) ;
78+ if ( isNewRecord ) UserStorage . SaveUser ( Context . User ) ;
79+
80+ var type = isNewRecord ? MessageType . NewRecord : MessageType . NoRecord ;
81+ _dispatcher . PublishMessage ( type , record ) ;
82+ }
83+ }
84+ }
0 commit comments