public GameAction(Game currentGame, Action action, string message, Combatant player = null) { CurrentGame = currentGame; Action = action; Message = message; Date = DateTime.Now; Combatant = player; }
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; }
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; }
private void RecordAction(Action action, string message, Combatant player = null) { CurrentGame.GameActions.Add(new GameAction(CurrentGame, action, $"{player?.Name}: {message}", player)); _db.SaveChanges(); }
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; }
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(); }