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); }
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); }
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(); }