11using System ;
2- using System . Collections . Generic ;
3- using System . Threading . Tasks ;
42using model . player ;
53using model . timing ;
64using model . zones ;
@@ -11,143 +9,24 @@ public class Game
119 {
1210 public readonly Corp corp ;
1311 public readonly Runner runner ;
12+ public readonly Timing Timing ;
1413 private readonly Zone playArea ;
15- public readonly Checkpoint checkpoint ;
16- public event Action < ITurn > CurrentTurn = delegate { } ;
17- public event Action < ITurn > NextTurn = delegate { } ;
18- public event Action < GameFinish > Finished = delegate { } ;
19- private bool ended = false ;
20- private Queue < ITurn > turns = new Queue < ITurn > ( ) ;
2114 private Shuffling shuffling ;
2215
2316 public Game ( IPilot corpPilot , IPilot runnerPilot , Shuffling shuffling )
2417 {
2518 this . shuffling = shuffling ;
2619 playArea = new Zone ( "Play area" , true ) ;
27- corp = CreateCorp ( corpPilot ) ;
28- runner = CreateRunner ( runnerPilot ) ;
29- this . checkpoint = new Checkpoint ( this ) ;
30- corp . zones . rd . Decked += DeckCorp ;
31- runner . zones . score . StolenEnough += StealEnough ;
32- }
33-
34- private Corp CreateCorp ( IPilot pilot )
35- {
36- var turn = new timing . corp . CorpTurn ( this ) ;
37- var paidWindow = new PaidWindow ( "corp" ) ;
38- return new Corp ( pilot , turn , paidWindow , playArea , shuffling , new Random ( ) ) ;
39- }
40-
41- private Runner CreateRunner ( IPilot pilot )
42- {
43- var turn = new timing . runner . RunnerTurn ( this ) ;
44- var paidWindow = new PaidWindow ( "runner" ) ;
45- return new Runner ( pilot , turn , paidWindow , playArea , shuffling , this ) ;
20+ corp = new Corp ( corpPilot , playArea , shuffling , new Random ( ) ) ;
21+ runner = new Runner ( runnerPilot , playArea , shuffling , this ) ;
22+ this . Timing = new Timing ( this ) ;
4623 }
4724
4825 async public void Start ( Deck corpDeck , Deck runnerDeck )
4926 {
5027 await corp . Start ( this , corpDeck ) ;
5128 await runner . Start ( this , runnerDeck ) ;
52- await StartTurns ( ) ;
53- }
54-
55- async private Task StartTurns ( )
56- {
57- turns . Enqueue ( corp . turn ) ;
58- turns . Enqueue ( runner . turn ) ;
59- try
60- {
61- while ( ! ended )
62- {
63- turns . Enqueue ( corp . turn ) ;
64- turns . Enqueue ( runner . turn ) ;
65- await StartNextTurn ( ) ;
66- await StartNextTurn ( ) ;
67- }
68- }
69- catch ( Exception e )
70- {
71- if ( ended )
72- {
73- UnityEngine . Debug . Log ( "The game is over! " + e . Message ) ;
74- }
75- else
76- {
77- throw new Exception ( "Failed a turn" , e ) ;
78- }
79- }
80- }
81-
82- private async Task StartNextTurn ( )
83- {
84- var currentTurn = turns . Dequeue ( ) ;
85- CurrentTurn ( currentTurn ) ;
86- NextTurn ( turns . Peek ( ) ) ;
87- await currentTurn . Start ( ) ;
88- }
89-
90- async public Task OpenPaidWindow ( PaidWindow acting , PaidWindow reacting )
91- {
92- var bothPlayersCouldAct = false ;
93- while ( true )
94- {
95- var actingDeclined = await acting . AwaitPass ( ) ;
96- if ( actingDeclined && bothPlayersCouldAct )
97- {
98- break ;
99- }
100- var reactingDeclined = await reacting . AwaitPass ( ) ;
101- bothPlayersCouldAct = true ;
102- if ( reactingDeclined && bothPlayersCouldAct )
103- {
104- break ;
105- }
106- }
107- }
108-
109- private void DeckCorp ( Corp corp )
110- {
111- Finish ( new GameFinish (
112- winner : "The Runner" ,
113- loser : "The Corp" ,
114- reason : "Corp R&D is empty"
115- ) ) ;
116- }
117-
118- private void StealEnough ( )
119- {
120- Finish ( new GameFinish (
121- winner : "The Runner" ,
122- loser : "The Corp" ,
123- reason : "Runner has stolen enough"
124- ) ) ;
125- }
126-
127- private void Finish ( GameFinish finish )
128- {
129- ended = true ;
130- Finished ( finish ) ;
131- throw new Exception ( "Game over, " + finish . reason ) ;
132- }
133-
134- async public Task Checkpoint ( )
135- {
136- await checkpoint . Check ( ) ;
137- }
138- }
139-
140- public class GameFinish
141- {
142- public string winner ;
143- public string loser ;
144- public string reason ;
145-
146- public GameFinish ( string winner , string loser , string reason )
147- {
148- this . winner = winner ;
149- this . loser = loser ;
150- this . reason = reason ;
29+ await Timing . StartTurns ( ) ;
15130 }
15231 }
15332}
0 commit comments