private Player GetPlayer(string creatureId) { var creature = _creatureRegistry.GetById(creatureId); EnsureValidCreature(creatureId, creature); // Until creature base type gets it's own inventory slots, restrict to player only. var player = creature as Player; EnsureValidPlayer(player); return(player); }
private void Resolve(string attackerId, string targetId) { var attacker = _creatureRegistry.GetById(attackerId); var cell = _playArea.GameMap.GetCell(attacker.Position.X, attacker.Position.Y); var target = cell.Content.Entities.SingleOrDefault(i => (i.Type == "Creature" || i.Type == "Player") && i.Id == targetId) as Creature; if (target != null) { _combatSimulator.PerformAttack(attacker, target); } else { _logger.Warn($"Creature '{attacker.Name}' failed to attack target with id '{targetId}'. It was either not found, or was not cast correctly."); } }
private void Resolve(string creatureId) { var creature = _creatureRegistry.GetById(creatureId) as Player; // tmp cast; var cell = _playArea.GameMap.GetCell(creature.Position.X, creature.Position.Y); foreach (var item in cell.Content.Entities.Where(i => i.Type == "Item").Cast <Item>().ToList()) { if (item != null) { cell.Content.Entities.Remove(item); creature.Inventory.Items.Add(item); _logger.Info($"Player '{creature.Name}' looted item '{item.Name}'"); } } }
private void Resolve(string creatureId, MovementDirection direction) { var creature = _creatureRegistry.GetById(creatureId); var currentPosition = creature.Position.DeepCopy(); var futureX = 0; var futureY = 0; switch (direction) { case MovementDirection.West: futureX = -1; break; case MovementDirection.East: futureX = 1; break; case MovementDirection.North: futureY = -1; break; case MovementDirection.South: futureY = 1; break; default: _logger.Warn("Invalid movement direction: " + direction); return; } if (_combatRegistry.IsInCombat(creatureId)) { _messageDispatcher.Dispatch(new GameMessage(string.Empty, creature.Id, MessageTopic.MovementFailed, "You are locked in combat and cannot walk away.")); return; } if (IsValidPosition(currentPosition, futureX, futureY)) { creature.Position.Move(futureX, futureY); _playArea.GameMap.Remove(currentPosition.X, currentPosition.Y, creature); _playArea.GameMap.Add(creature.Position.X, creature.Position.Y, creature); } else { _messageDispatcher.Dispatch(new GameMessage(string.Empty, creature.Id, MessageTopic.MovementFailed, "You crashed into a wall!")); } }
private void Resolve(string creatureId, string itemId) { var creature = _creatureRegistry.GetById(creatureId) as Player; // tmp cast var cell = _playArea.GameMap.GetCell(creature.Position.X, creature.Position.Y); var item = cell.Content.Entities.SingleOrDefault(i => i.Type == "Item" && i.Id == itemId) as Item; if (item != null) { cell.Content.Entities.Remove(item); creature.Inventory.Items.Add(item); _logger.Info($"Player '{creature.Name}' looted item '{item.Name}'"); } else { _logger.Warn($"Player '{creature.Name}' failed to loot item with id '{itemId}'. It was either not found, or did not cast to item."); } }
public async Task StartAsync() { // who needs precision or quickness >_> var nextGameTick = DateTime.UtcNow; while (true) { var currentTime = DateTime.UtcNow; if (currentTime > nextGameTick) { var diff = currentTime - nextGameTick; nextGameTick = DateTime.UtcNow.AddMilliseconds(_gameConfiguration.GameTickMiliseconds) - diff; ResolveActionsForAutonomousEntities(); await _actionResolver.ResolveAsync().ConfigureAwait(false); var activeUsers = await _userRepository.GetActiveAsync().ConfigureAwait(false); foreach (var activeUser in activeUsers) { var player = _creatureRegistry.GetById(activeUser.Id) as Player; var response = TempCreateStatusResponse(player); await _socketServer.SendAsync(activeUser.Id, response).ConfigureAwait(false); // temp until refactor if (!player.IsAlive) { activeUser.GameState = GameState.PlayerDeath; await _userRepository.AddOrUpdateAsync(activeUser).ConfigureAwait(false); _creatureRegistry.Remove(player.Id); var gameOverResponse = new ServerResponse(ResponseType.GameState, activeUser.GameState.ToString()); await _socketServer.SendAsync(activeUser.Id, gameOverResponse).ConfigureAwait(false); } } } } }