-
Notifications
You must be signed in to change notification settings - Fork 4
/
GameProcessor.cs
166 lines (133 loc) · 4.98 KB
/
GameProcessor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
using Beamable;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Hats.Content;
using Hats.Simulation;
using JetBrains.Annotations;
using UnityEngine;
using Hats.Game.Data;
namespace Hats.Game
{
public class GameProcessor : MonoBehaviour
{
[CanBeNull] public static string RoomId;
[CanBeNull] public static List<long> Dbids;
public GameSimulation Simulation;
public BattleGridBehaviour BattleGridBehaviour;
public MultiplayerGameDriver MultiplayerGameDriver;
public string roomId = "room1";
public List<GameEventHandler> EventHandlers;
[SerializeField]
private Configuration _configuration = null;
[Header("Internals")]
[Hats.Simulation.ReadOnly]
[SerializeField]
private int currentTurn;
private Task _bootstrapTask;
private BeamContext _beamContext;
public BattleGrid BattleGrid => BattleGridBehaviour.BattleGrid;
public long LocalPlayerDBID => MultiplayerGameDriver.LocalPlayerDBID;
public HatsPlayerState CurrentLocalPlayerState => Simulation.GetCurrentTurn().GetPlayerState(LocalPlayerDBID);
public float SecondsLeftInTurn => Simulation.SecondsLeftInTurn;
public Task BootstrapTask { get => _bootstrapTask; }
public Configuration Configuration { get => _configuration; }
public void StartGame(List<long> dbids, BotProfileContent botProfileContent)
{
// TODO: Handle matchmaking
var messageQueue = MultiplayerGameDriver.Init(roomId, _configuration.FramesPerSecond, new List<long>());
var players = dbids.Select(dbid => new HatsPlayer
{
dbid = dbid
}).ToList();
Simulation = new GameSimulation(BattleGridBehaviour.BattleGrid, _configuration, players, botProfileContent, roomId.GetHashCode(), messageQueue);
BattleGridBehaviour.SetupInitialTileChanges();
StartCoroutine(PlayGame());
}
public HatsPlayerState GetCurrentPlayerState(long dbid)
{
return Simulation.GetCurrentTurn().GetPlayerState(dbid);
}
private void Start()
{
_bootstrapTask = BootstrapGame();
}
private async Task BootstrapGame()
{
roomId = RoomId ?? roomId;
Debug.Log($"Game Starting... with roomId=[{roomId}]");
_beamContext = BeamContext.Default;
await _beamContext.OnReady;
var botProfile = await _configuration.BotProfileRef.Resolve();
var dbids = Dbids ?? new List<long> { _beamContext.PlayerId };
StartGame(dbids, botProfile);
}
private IEnumerator PlayGame()
{
foreach (var evt in Simulation.PlayGame())
{
currentTurn = Simulation.CurrentTurnNumber;
if (evt == null)
{
yield return null;
continue;
}
if (!(evt is TickEvent))
{
Debug.Log($"Game Event: {evt}");
}
switch (evt)
{
case PlayerSpawnEvent spawnEvt:
yield return EventHandlers.Handle(this, spawnEvt, handler => handler.HandleSpawnEvent);
break;
case CollectablePowerupSpawnEvent puSpawnEvt:
yield return EventHandlers.Handle(this, puSpawnEvt, handler => handler.HandleCollectablePowerupSpawnEvent);
break;
case CollectablePowerupDestroyEvent puRemoveEvt:
yield return EventHandlers.Handle(this, puRemoveEvt, handler => handler.HandleCollectablePowerupDestroyEvent);
break;
case SuddenDeathStartedEvent sudden:
yield return EventHandlers.Handle(this, sudden, handler => handler.HandleSuddenDeathStartedEvent);
break;
case PlayerMoveEvent moveEvt:
yield return EventHandlers.Handle(this, moveEvt, handler => handler.HandleMoveEvent);
break;
case PlayerShieldEvent shieldEvt:
yield return EventHandlers.Handle(this, shieldEvt, handler => handler.HandleShieldEvent);
break;
case TurnReadyEvent turnEvt:
yield return EventHandlers.Handle(this, turnEvt, handler => handler.HandleTurnReadyEvent);
break;
case TurnOverEvent turnOverEvt:
yield return EventHandlers.Handle(this, turnOverEvt, handler => handler.HandleTurnOverEvent);
break;
case PlayerProjectileAttackEvent attackEvent:
yield return EventHandlers.Handle(this, attackEvent, handler => handler.HandleAttackEvent);
break;
case TickEvent tickEvt:
yield return EventHandlers.Handle(this, tickEvt, handler => handler.HandleTickEvent);
break;
case GameOverEvent gameOverEvt:
yield return EventHandlers.Handle(this, gameOverEvt, handler => handler.HandleGameOverEvent);
break;
case PlayerKilledEvent killEvt:
yield return EventHandlers.Handle(this, killEvt, handler => handler.HandlePlayerKilledEvent);
break;
case PlayerLeftEvent leftEvt:
yield return EventHandlers.Handle(this, leftEvt, handler => handler.HandlePlayerDroppedEvent);
break;
case SuddenDeathEvent suddenDeathEvt:
yield return EventHandlers.Handle(this, suddenDeathEvt, handler => handler.HandleSuddenDeathEvent);
break;
// nothing interesting happened; let the next frame happen
default:
yield return null;
break;
}
}
Debug.Log("Game Processor has finished processing game stream.");
}
}
}