55
66namespace TurnBase
77{
8- public class Game < TInitModel , TInitResponseModel , TMoveModel , TMoveResponseModel , TMoveNotificationModel > :
8+ public class Game < TInitModel , TInitResponseModel , TMoveModel , TMoveResponseModel , TMoveNotificationModel > :
99 IGame < TInitModel , TInitResponseModel , TMoveModel , TMoveResponseModel , TMoveNotificationModel >
1010 {
1111 private class PlayerData
@@ -47,7 +47,7 @@ public AddPlayerStatus AddPlayer(IPlayer<TInitModel, TInitResponseModel, TMoveMo
4747 }
4848
4949 this . players . Add (
50- new PlayerFailProtection < TInitModel , TInitResponseModel , TMoveModel , TMoveResponseModel , TMoveNotificationModel > ( player ) ,
50+ new PlayerFailProtection < TInitModel , TInitResponseModel , TMoveModel , TMoveResponseModel , TMoveNotificationModel > ( player ) ,
5151 new PlayerData { IsInGame = true , PlayerNumber = this . players . Count } ) ;
5252 return AddPlayerStatus . OK ;
5353 }
@@ -94,12 +94,7 @@ async Task SingleAction(IPlayer<TInitModel, TInitResponseModel, TMoveModel, TMov
9494 return ;
9595 }
9696
97- //TODO: Handle disconnect player in memorization and game field.
98- var playerData = this . players [ p ] ;
99- playerData . IsInGame = false ;
100- this . rules . PlayerDisconnected ( this . mainField , playerData . PlayerNumber ) ;
101- this . players . Keys . ToList ( ) . ForEach ( a => a . GamePlayerDisconnected ( playerData . PlayerNumber ) ) ;
102- this . gameLogListeners . GamePlayerDisconnected ( playerData . PlayerNumber ) ;
97+ this . Disconnect ( p ) ;
10398 }
10499
105100 return Task . WhenAll (
@@ -218,5 +213,20 @@ private async Task<bool> MovePlayer(IPlayer<TInitModel, TInitResponseModel, TMov
218213 this . gameLogListeners . GameLogCurrentField ( this . mainField . copyForPlayer ( - 1 ) ) ;
219214 return true ;
220215 }
216+
217+ public void Disconnect ( IGameEventListener < TMoveNotificationModel > listener )
218+ {
219+ //TODO: Handle disconnect player in memorization and game field.
220+ if ( listener is IPlayer < TInitModel , TInitResponseModel , TMoveModel , TMoveResponseModel , TMoveNotificationModel > player && this . players . ContainsKey ( player ) )
221+ {
222+ var playerData = this . players [ player ] ;
223+ playerData . IsInGame = false ;
224+ this . rules . PlayerDisconnected ( this . mainField , playerData . PlayerNumber ) ;
225+ this . players . Keys . ToList ( ) . ForEach ( a => a . GamePlayerDisconnected ( playerData . PlayerNumber ) ) ;
226+ this . gameLogListeners . GamePlayerDisconnected ( playerData . PlayerNumber ) ;
227+ }
228+
229+ this . gameLogListeners . Remove ( listener ) ;
230+ }
221231 }
222232}
0 commit comments