Skip to content

Commit e92815e

Browse files
committed
Add timeout player
1 parent 563d718 commit e92815e

4 files changed

Lines changed: 124 additions & 46 deletions

File tree

TurnBase.KaNoBu.Godot/Presentation/UI.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,11 @@ public IPlayer<KaNoBuInitModel, KaNoBuInitResponseModel, KaNoBuMoveModel, KaNoBu
150150
return new PlayerLoose<KaNoBuInitModel, KaNoBuInitResponseModel, KaNoBuMoveModel, KaNoBuMoveResponseModel, KaNoBuMoveNotificationModel>();
151151
case 1:
152152
// Human
153-
return field;
153+
return new TimeoutPlayer<KaNoBuInitModel, KaNoBuInitResponseModel, KaNoBuMoveModel, KaNoBuMoveResponseModel, KaNoBuMoveNotificationModel>(
154+
field,
155+
async (delay) => await this.ToSignal(this.GetTree().CreateTimer(delay / 1000f), "timeout"),
156+
1000,
157+
60000);
154158
case 2:
155159
// Computer Easy
156160
var playerEasy = new KaNoBuPlayerEasy();
@@ -162,7 +166,12 @@ public IPlayer<KaNoBuInitModel, KaNoBuInitResponseModel, KaNoBuMoveModel, KaNoBu
162166
case 3:
163167
// Remote
164168
this.server.StartServer();
165-
return new ServerPlayer<KaNoBuInitModel, KaNoBuInitResponseModel, KaNoBuMoveModel, KaNoBuMoveResponseModel, KaNoBuMoveNotificationModel>(server, gameId);
169+
var player = new ServerPlayer<KaNoBuInitModel, KaNoBuInitResponseModel, KaNoBuMoveModel, KaNoBuMoveResponseModel, KaNoBuMoveNotificationModel>(server, gameId);
170+
return new TimeoutPlayer<KaNoBuInitModel, KaNoBuInitResponseModel, KaNoBuMoveModel, KaNoBuMoveResponseModel, KaNoBuMoveNotificationModel>(
171+
player,
172+
async (delay) => await this.ToSignal(this.GetTree().CreateTimer(delay / 1000f), "timeout"),
173+
1000,
174+
60000);
166175
case 4:
167176
// Computer Medium
168177
var playerMedium = new KaNoBuPlayerMedium();
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System.Collections.Generic;
2+
3+
namespace TurnBase
4+
{
5+
public class PassThroughListener<TMoveNotificationModel> : IGameEventListener<TMoveNotificationModel>
6+
{
7+
private readonly IGameEventListener<TMoveNotificationModel> listener;
8+
9+
public PassThroughListener(IGameEventListener<TMoveNotificationModel> listener)
10+
{
11+
this.listener = listener;
12+
}
13+
14+
public void GameStarted()
15+
{
16+
this.listener.GameStarted();
17+
}
18+
19+
public void GamePlayerDisconnected(int playerNumber)
20+
{
21+
this.listener.GamePlayerDisconnected(playerNumber);
22+
}
23+
24+
public void GamePlayerInit(int playerNumber, string playerName)
25+
{
26+
this.listener.GamePlayerInit(playerNumber, playerName);
27+
}
28+
29+
public void PlayersInitialized()
30+
{
31+
this.listener.PlayersInitialized();
32+
}
33+
34+
public void GameLogCurrentField(IField field)
35+
{
36+
this.listener.GameLogCurrentField(field);
37+
}
38+
39+
public void GamePlayerTurn(int playerNumber, TMoveNotificationModel notification)
40+
{
41+
this.listener.GamePlayerTurn(playerNumber, notification);
42+
}
43+
44+
public void GameTurnFinished()
45+
{
46+
this.listener.GameTurnFinished();
47+
}
48+
49+
public void GameFinished(List<int> winners)
50+
{
51+
this.listener.GameFinished(winners);
52+
}
53+
}
54+
}

TurnBase/Players/DelayedPlayer.cs

Lines changed: 5 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
namespace TurnBase.KaNoBu
66
{
7-
public class DelayedPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResponseModel, TMoveNotificationModel> :
7+
public class DelayedPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResponseModel, TMoveNotificationModel> :
8+
PassThroughListener<TMoveNotificationModel>,
89
IPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResponseModel, TMoveNotificationModel>
910
{
1011
private IPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResponseModel, TMoveNotificationModel> player;
@@ -13,10 +14,10 @@ public class DelayedPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResp
1314
private readonly int turnDelay;
1415

1516
public DelayedPlayer(
16-
IPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResponseModel, TMoveNotificationModel> originalPlayer,
17+
IPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResponseModel, TMoveNotificationModel> originalPlayer,
1718
Func<int, Task> delayAction,
18-
int initDelay,
19-
int turnDelay)
19+
int initDelay,
20+
int turnDelay) : base(originalPlayer)
2021
{
2122
this.player = originalPlayer;
2223
this.delayAction = delayAction;
@@ -35,45 +36,5 @@ public async Task<MakeTurnResponseModel<TMoveResponseModel>> MakeTurn(MakeTurnMo
3536
await delayAction(this.turnDelay);
3637
return await this.player.MakeTurn(model);
3738
}
38-
39-
public void GameStarted()
40-
{
41-
this.player.GameStarted();
42-
}
43-
44-
public void GamePlayerInit(int playerNumber, string playerName)
45-
{
46-
this.player.GamePlayerInit(playerNumber, playerName);
47-
}
48-
49-
public void PlayersInitialized()
50-
{
51-
this.player.PlayersInitialized();
52-
}
53-
54-
public void GameLogCurrentField(IField field)
55-
{
56-
this.player.GameLogCurrentField(field);
57-
}
58-
59-
public void GamePlayerTurn(int playerNumber, TMoveNotificationModel notification)
60-
{
61-
this.player.GamePlayerTurn(playerNumber, notification);
62-
}
63-
64-
public void GameTurnFinished()
65-
{
66-
this.player.GameTurnFinished();
67-
}
68-
69-
public void GamePlayerDisconnected(int playerNumber)
70-
{
71-
this.player.GamePlayerDisconnected(playerNumber);
72-
}
73-
74-
public void GameFinished(List<int> winners)
75-
{
76-
this.player.GameFinished(winners);
77-
}
7839
}
7940
}

TurnBase/Players/TimeoutPlayer.cs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Threading.Tasks;
4+
5+
namespace TurnBase.KaNoBu
6+
{
7+
public class TimeoutPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResponseModel, TMoveNotificationModel> :
8+
PassThroughListener<TMoveNotificationModel>,
9+
IPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResponseModel, TMoveNotificationModel>
10+
{
11+
private IPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResponseModel, TMoveNotificationModel> player;
12+
private readonly Func<int, Task> delayAction;
13+
private readonly int initDelay;
14+
private readonly int turnDelay;
15+
16+
public TimeoutPlayer(
17+
IPlayer<TInitModel, TInitResponseModel, TMoveModel, TMoveResponseModel, TMoveNotificationModel> originalPlayer,
18+
Func<int, Task> delayAction,
19+
int initDelay,
20+
int turnDelay) : base(originalPlayer)
21+
{
22+
this.player = originalPlayer;
23+
this.delayAction = delayAction;
24+
this.initDelay = initDelay;
25+
this.turnDelay = turnDelay;
26+
}
27+
28+
public async Task<InitResponseModel<TInitResponseModel>> Init(InitModel<TInitModel> model)
29+
{
30+
var task1 = delayAction(this.initDelay);
31+
var task2 = this.player.Init(model);
32+
var task = await Task.WhenAny(task1, task2);
33+
if (task == task2)
34+
{
35+
return await task2;
36+
}
37+
38+
return new InitResponseModel<TInitResponseModel>();
39+
}
40+
41+
public async Task<MakeTurnResponseModel<TMoveResponseModel>> MakeTurn(MakeTurnModel<TMoveModel> model)
42+
{
43+
var task1 = delayAction(this.turnDelay);
44+
var task2 = this.player.MakeTurn(model);
45+
var task = await Task.WhenAny(task1, task2);
46+
if (task == task2)
47+
{
48+
return await task2;
49+
}
50+
51+
return new MakeTurnResponseModel<TMoveResponseModel>();
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)