Exemple #1
0
 public Task Initialize(InitialGameData data)
 {
     if (data == null)
     {
         throw new ArgumentNullException(nameof(data));
     }
     if (_state.IsStarted)
     {
         throw new InvalidOperationException("Expected game to be not started.");
     }
     _state.IsEnded   = false;
     _state.IsStarted = true;
     _state.Map       = data.Map;
     _state.Hub       = new HubState
     {
         Id      = _state.RoomId,
         Members = data.HubMembers
                   .ToDictionary(x => x.Key, x => new HubMemberState {
             ConnectionIds = x.Value
         }),
         JoinOrder = data.HubJoinOrder
     };
     _state.Players      = data.Players;
     _state.PlayerStates = data.Players
                           .ToDictionary(x => x.UserId, x => new PlayerGameState());
     _state.Turn = 0;
     _map        = new Map(_state.Map);
     _hub        = new Hub(_state.Hub, _topic);
     return(Task.CompletedTask);
 }
Exemple #2
0
        public async Task <IGame> CreateGame(Guid userId)
        {
            var game    = GrainFactory.GetGrain <IGameGrain>(this.GetPrimaryKeyString());
            var command = new InitialGameData(
                userId,
                State.MapEditor.Map,
                State.Players,
                State.Hub.Members.ToDictionary(x => x.Key, x => x.Value.ConnectionIds),
                State.Hub.JoinOrder
                );
            await game.Initialize(command);

            return(game);
        }
Exemple #3
0
        public async Task Initialize(InitialGameData data)
        {
            await _game.Initialize(data);

            var gameStarted = new GameStartedServer(this.AsReference <IGameGrain>());
            await _game.NotifyEverybodyExcept(data.InitiatorId, gameStarted);

            await WriteStateAsync();

            _logger.Information(
                "Game initialized. Map size is {MapWidth}x{MapHeight}. There are {PlayerCount} players.",
                data.Map.Width,
                data.Map.Height,
                data.Players.Count);
            ScheduleTimer();
        }