Пример #1
0
 public GameAction(Game currentGame, Action action, string message, Combatant player = null)
 {
     CurrentGame = currentGame;
     Action = action;
     Message = message;
     Date = DateTime.Now;
     Combatant = player;
 }
Пример #2
0
        public PlayerMoveResult PlayerMove(int newX, int newY, Combatant attacker)
        {
            var result = new PlayerMoveResult
            {
                EventType = EventType.None,
                TurnOrder = CurrentGame.CurrentTurnOrder,
                TurnNumber = CurrentGame.CurrentTurnNumber
            };

            var to = CurrentGame.Tiles.GetTile(newX, newY);

            if (to.Combatant != null && to.Combatant != attacker)
            {
                //attack logic
                var didAttack = TryAttack(attacker, attacker.Tile, to);
                _db.SaveChanges();

                if (didAttack)
                {
                    ChangePlayer();
                    return result;
                }
            }

            var tileType = attacker.Tile.Type;
            result.EventType = tileType;

            if (attacker.Tile != to)
            {
                attacker.Tile.Combatant = null;
                attacker.Tile = to;
                RecordAction(Action.Move, $"Moved from {attacker.Tile.X},{attacker.Tile.Y} to {newX},{newY}.");
                result.EventType = @to.Type;
                tileType = @to.Type;
            }

            if (@to.Type != EventType.None)
            {
                DrawEventCard(CurrentPlayer, tileType);
            }

            ChangePlayer();

            _db.SaveChanges();

            return result;
        }
Пример #3
0
        private bool TryAttack(Combatant attacker, Tile @from, Tile @to)
        {
            var distance = @from.Distance(to);
            var defender = @to.Combatant;
            var weapon = attacker.Items.FirstOrDefault(x => x.IsWeapon);

            var range = 1.5;

            if (weapon != null)
            {
                range = weapon.WeaponRange + 0.5;
            }

            if (distance > range + 0.5)
            {
                return false;
            }

            var attackerRoll = GameHelpers.RollDie(attacker.Threat);
            var defenderRoll = GameHelpers.RollDie(defender.Survivability);
            var healthloss = 0;

            if (attackerRoll.Sum() > defenderRoll.Sum())
            {
                healthloss = attackerRoll.Sum() - defenderRoll.Sum();
                defender.Health -= healthloss;
            }

            attacker.Results.Add(new Result(CurrentGame.CurrentTurnNumber, CurrentGame.CurrentTurnOrder)
            {
                Rolls = attackerRoll.ConvertNumberListToString(),
                IsAttack = true
            });

            defender.Results.Add(new Result(CurrentGame.CurrentTurnNumber, CurrentGame.CurrentTurnOrder)
            {
                Healthloss = healthloss,
                Rolls = defenderRoll.ConvertNumberListToString(),
                IsAttack = true
            });

            if (defender.Health <= 0)
            {
                defender.Killer = attacker;
                RecordAction(Action.Kill, $"Killed {to.Combatant.Name} at {@to.X},{@to.Y}.", attacker);

            }
            else
            {
                RecordAction(Action.Attack, $"Attacked {to.Combatant.Name} at {@to.X},{@to.Y}.", attacker);

            }

            _db.SaveChanges();

            return true;
        }
Пример #4
0
 private void RecordAction(Action action, string message, Combatant player = null)
 {
     CurrentGame.GameActions.Add(new GameAction(CurrentGame, action, $"{player?.Name}: {message}", player));
     _db.SaveChanges();
 }
Пример #5
0
        private ICollection<Combatant> GenerateCombatants(int num)
        {
            var combatants = new List<Combatant>();

            var player = new Combatant("Player 1", true)
            {
                Strength = 4,
                Speed = 2,
                Sanity = 4,
                Perception = 3,
                TurnOrder = 1
            };

            var knife = new Item
            {
                Combatant = player,
                GraphicName = "SmallKnife.png",
                Name = "Knife",
                IsWeapon = true,
                WeaponRange = 1,
                ThreatBonus = 1,
            };

            player.Items.Add(knife);

            combatants.Add(player);

            for (var i = 0; i < num; i++)
            {
                var enemy = new Combatant("Player " + (i + 2), false)
                {
                    Strength = 4,
                    Speed = 2,
                    Sanity = 5,
                    Perception = 3,
                    TurnOrder = 2 + i
                };

                combatants.Add(enemy);
            }

            return combatants;
        }
Пример #6
0
        private void DrawEventCard(Combatant player, EventType type)
        {
            var possibleEvents = CurrentGame.Events.OrderBy(x => Guid.NewGuid()).ToList();
            var eventCard = possibleEvents.FirstOrDefault(x => x.Type == type);

            var numOfDice = 0;
            switch (eventCard.RequiredStat)
            {
                case Stat.Strength:
                    numOfDice = player.Strength;
                    break;
                case Stat.Speed:
                    numOfDice = player.Speed;
                    break;
                case Stat.Sanity:
                    numOfDice = player.Sanity;
                    break;
                case Stat.Perception:
                    numOfDice = player.Perception;
                    break;
                case Stat.Threat:
                    numOfDice = player.Threat;
                    break;
                case Stat.Survivability:
                    numOfDice = player.Survivability;
                    break;
            }

            var dieResults = GameHelpers.RollDie(numOfDice);
            var successfulRoll = dieResults.Sum() >= eventCard.TargetNumber;

            //var flip = failedRoll ? -1 : 1;
            var statReward = eventCard.StatReward; //* flip; Not implementing at this time

            if (statReward > 0)
            {
                switch (eventCard.RequiredStat)
                {
                    case Stat.Strength:
                        player.Strength += eventCard.StatReward; // * flip;
                        break;
                    case Stat.Speed:
                        player.Speed += eventCard.StatReward; // * flip;
                        break;
                    case Stat.Sanity:
                        player.Sanity += eventCard.StatReward; // * flip;
                        break;
                    case Stat.Perception:
                        player.Perception += eventCard.StatReward; // * flip;
                        break;
                }
            }

            if (successfulRoll && eventCard.ItemReward != null)
            {
                var itemReward = eventCard.ItemReward;
                itemReward.Combatant = player;

                if (itemReward.IsWeapon)
                {
                    var weapons = player.Items.Where(x => x.IsWeapon);
                    foreach (var w in weapons)
                    {
                        player.Items.Remove(w);
                    }
                    player.Items.Add(itemReward);
                }
                else
                {
                    if (player.ItemsEquippedCount >= player.MaxEquip)
                    {
                        var lowestItem =
                            player.Items.Where(x => !x.IsWeapon).OrderBy(x => x.SurvivalBonus).FirstOrDefault();
                        player.Items.Remove(lowestItem);
                    }
                    player.Items.Add(itemReward);
                }
            }

            player.Results.Add(new Result(CurrentGame.CurrentTurnNumber, CurrentGame.CurrentTurnOrder)
            {
                Event = eventCard,
                Rolls = dieResults.ConvertNumberListToString(),
                StatReward = statReward
            });

            //TODO Record draw event card.
            RecordAction(Action.DrawEventCard, "TODO", player);
            _db.SaveChanges();
        }