Example #1
0
        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);
        }
Example #2
0
        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.");
            }
        }
Example #3
0
        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}'");
                }
            }
        }
Example #4
0
        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!"));
            }
        }
Example #5
0
        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.");
            }
        }
Example #6
0
        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);
                        }
                    }
                }
            }
        }