private CombatRoundResult ResolveRoundOfCombat(List<Hunter> huntersFighting, List<ItemDetail> combatCards, List<ItemDetail> hunterBasicCards, CombatRoundResult result, bool hunterMoved, int enemyType, UserInterface ui) { string targetHunterName; string newEnemyCardUsed = Dracula.ChooseCombatCardAndTarget(huntersFighting, combatCards, result, NameOfHunterAlly(), out targetHunterName).Name; string newHunterCardUsed = "nothing"; foreach (Hunter h in huntersFighting) { do { newHunterCardUsed = ui.GetCombatCardFromHunter(h.Name); if (GetItemByNameFromItemDeck(newHunterCardUsed).Name == "Unknown item") { if (GetItemByNameFromList(newHunterCardUsed, hunterBasicCards).Name == "Unknown item") { ui.TellUser("I didn't recognise that item name"); } } } while (GetItemByNameFromItemDeck(newHunterCardUsed).Name == "Unknown item" && GetItemByNameFromList(newHunterCardUsed, hunterBasicCards).Name == "Unknown item"); if (newHunterCardUsed != "Punch" && newHunterCardUsed != "Dodge" && newHunterCardUsed != "Escape") { if (h.ItemsKnownToDracula.FindIndex(it => it.Name == newHunterCardUsed) == -1) { h.ItemsKnownToDracula.Add(GetItemByNameFromItemDeck(newHunterCardUsed)); } else if (newHunterCardUsed == h.LastItemUsedInCombat) { List<ItemDetail> copyOfHunterItemsKnown = new List<ItemDetail>(); copyOfHunterItemsKnown.AddRange(h.ItemsKnownToDracula); copyOfHunterItemsKnown.Remove(copyOfHunterItemsKnown.Find(it => it.Name == newHunterCardUsed)); if (copyOfHunterItemsKnown.FindIndex(it => it.Name == newHunterCardUsed) == -1) { h.ItemsKnownToDracula.Add(GetItemByNameFromItemDeck(newHunterCardUsed)); } } h.LastItemUsedInCombat = newHunterCardUsed; } } ui.TellUser("Enemy chose " + newEnemyCardUsed + " against " + targetHunterName); if (NameOfHunterAlly() == "Sister Agatha" && enemyType == 6) { if (newEnemyCardUsed == "Fangs" || newEnemyCardUsed == "Escape (Man)" || newEnemyCardUsed == "Escape (Bat)" || newEnemyCardUsed == "Escape (Mist)") { ui.TellUser("Dracula spent two blood to play his card"); Dracula.Blood -= 2; } } string newOutcome = ui.GetCombatRoundOutcome(); CombatRoundResult newResult = new CombatRoundResult(); newResult.enemyCardUsed = newEnemyCardUsed; newResult.outcome = newOutcome; newResult.hunterTargeted = targetHunterName; return newResult; }
internal string ResolveCombat(Hunter hunter, int enemyInCombat, bool hunterMoved, UserInterface ui) { List<ItemDetail> enemyCombatCards = new List<ItemDetail>(); List<ItemDetail> hunterBasicCards = new List<ItemDetail>(); List<Hunter> huntersInCombat = new List<Hunter>(); if (hunterMoved) { foreach (HunterName h in hunter.HuntersInGroup) { huntersInCombat.Add(Hunters[(int)h]); } } else { foreach (Hunter h in Hunters) { if (h.CurrentLocation == Hunters[hunterIndex].CurrentLocation) { huntersInCombat.Add(h); } } } hunterBasicCards.Add(new ItemDetail("Punch")); hunterBasicCards.Add(new ItemDetail("Escape")); bool trapPlayed = false; int rageRounds = 0; string enemyName = "nobody"; switch (enemyInCombat) { case 1: { enemyName = "Dracula"; enemyCombatCards.Add(new ItemDetail("Claws")); enemyCombatCards.Add(new ItemDetail("Escape (Man)")); if (TimeIndex > 2) { enemyCombatCards.Add(new ItemDetail("Strength")); enemyCombatCards.Add(new ItemDetail("Escape (Bat)")); enemyCombatCards.Add(new ItemDetail("Escape (Mist)")); enemyCombatCards.Add(new ItemDetail("Fangs")); enemyCombatCards.Add(new ItemDetail("Mesmerize")); } break; } case 2: { enemyName = "Minion with Knife"; enemyCombatCards.Add(new ItemDetail("Punch")); enemyCombatCards.Add(new ItemDetail("Knife")); break; } case 3: { enemyName = "Minion with Knife and Pistol"; enemyCombatCards.Add(new ItemDetail("Punch")); enemyCombatCards.Add(new ItemDetail("Knife")); enemyCombatCards.Add(new ItemDetail("Pistol")); break; } case 4: { enemyName = "Minion with Knife and Rifle"; enemyCombatCards.Add(new ItemDetail("Punch")); enemyCombatCards.Add(new ItemDetail("Knife")); enemyCombatCards.Add(new ItemDetail("Rifle")); break; } case 5: { enemyName = "Assassin"; enemyCombatCards.Add(new ItemDetail("Punch")); enemyCombatCards.Add(new ItemDetail("Knife")); enemyCombatCards.Add(new ItemDetail("Pistol")); enemyCombatCards.Add(new ItemDetail("Rifle")); break; } case 6: { enemyName = "New Vampire"; enemyCombatCards.Add(new ItemDetail("Claws")); enemyCombatCards.Add(new ItemDetail("Escape (Man)")); if (TimeIndex > 2) { enemyCombatCards.Add(new ItemDetail("Strength")); enemyCombatCards.Add(new ItemDetail("Escape (Bat)")); enemyCombatCards.Add(new ItemDetail("Escape (Mist)")); enemyCombatCards.Add(new ItemDetail("Fangs")); enemyCombatCards.Add(new ItemDetail("Mesmerize")); } break; } } ui.TellUser(Hunters[hunterIndex].Name + " is entering combat against " + enemyName + (huntersInCombat.Count() > 1 ? " with " + huntersInCombat[1].Name : "") + (huntersInCombat.Count() > 2 ? " and " + huntersInCombat[2].Name : "") + (huntersInCombat.Count() > 3 ? " and " + huntersInCombat[3].Name : "")); EventDetail draculaEventCard = null; do { draculaEventCard = Dracula.PlayEventCardAtStartOfCombat(this, trapPlayed, hunterMoved, enemyInCombat); if (draculaEventCard != null) { DiscardEventFromDracula(draculaEventCard.name); switch (draculaEventCard.name) { case "Trap": PlayTrap(ui); int hunterPlayingGoodluck = ui.AskWhichHunterIsUsingGoodLuckToCancelEvent(); if (hunterPlayingGoodluck > -1) { DiscardEventFromHunterAtIndex("Good Luck", hunterPlayingGoodluck, ui); } else { trapPlayed = true; break; } break; case "Rage": PlayRage(huntersInCombat, ui); int hunterPlayingGoodluckB = ui.AskWhichHunterIsUsingGoodLuckToCancelEvent(); if (hunterPlayingGoodluckB > -1) { DiscardEventFromHunterAtIndex("Good Luck", hunterPlayingGoodluckB, ui); } else { rageRounds = 3; try { enemyCombatCards.Remove(enemyCombatCards.Find(card => card.Name == "Escape (Man)")); } catch (Exception e) { } try { enemyCombatCards.Remove(enemyCombatCards.Find(card => card.Name == "Escape (Bat)")); } catch (Exception e) { } try { enemyCombatCards.Remove(enemyCombatCards.Find(card => card.Name == "Escape (Mist)")); } catch (Exception e) { } } break; case "Wild Horses": PlayWildHorses(huntersInCombat, ui); return "Wild Horses"; } } } while (draculaEventCard != null); bool[] hunterPlayedCard = new bool[4] { true, true, true, true }; int hunterPlayingCard = 0; while (hunterPlayedCard[0] || hunterPlayedCard[1] || hunterPlayedCard[2] || hunterPlayedCard[3]) { if (ui.GetHunterPlayingCard(Hunters[hunterPlayingCard].Name)) { string cardName = ""; do { cardName = ui.GetNameOfHunterCardPlayedAtStartOfCombat(Hunters[hunterPlayingCard].Name); } while (GetEventByNameFromEventDeck(cardName).name == "Unknown event" && GetItemByNameFromItemDeck(cardName).Name == "Unknown item" && cardName.ToLower() != "cancel"); if (cardName != "cancel") { hunterPlayedCard[hunterPlayingCard] = true; switch (cardName) { case "Advance Planning": DiscardEventFromHunterAtIndex(cardName, hunterPlayingCard, ui); draculaEventCard = Dracula.WillPlayDevilishPower(this, ui); bool eventIsCancelled = false; if (draculaEventCard != null) { switch (draculaEventCard.name) { case "DevilishPower": ui.TellUser("Dracula played Devilish power to cancel this event"); DiscardEventFromDracula("Devilish Power"); int hunterPlayingGoodluck = ui.AskWhichHunterIsUsingGoodLuckToCancelEvent(); if (hunterPlayingGoodluck > -1) { DiscardEventFromHunterAtIndex("Good Luck", hunterPlayingGoodluck, ui); } else { eventIsCancelled = true; } break; } } if (!eventIsCancelled) { PlayAdvancePlanningInCombat(ui); } break; case "Escape Route": DiscardEventFromHunterAtIndex(cardName, hunterPlayingCard, ui); draculaEventCard = Dracula.WillPlayDevilishPower(this, ui); bool eventIsCancelledB = false; if (draculaEventCard != null) { switch (draculaEventCard.name) { case "DevilishPower": ui.TellUser("Dracula played Devilish power to cancel this event"); DiscardEventFromDracula("Devilish Power"); int hunterPlayingGoodluck = ui.AskWhichHunterIsUsingGoodLuckToCancelEvent(); if (hunterPlayingGoodluck > -1) { DiscardEventFromHunterAtIndex("Good Luck", hunterPlayingGoodluck, ui); } else { eventIsCancelledB = true; } break; } } if (!eventIsCancelledB) { PlayEscapeRouteInCombat(hunterPlayingCard, ui); return "Escape Route"; } break; case "Heroic Leap": DiscardEventFromHunterAtIndex(cardName, hunterPlayingCard, ui); draculaEventCard = Dracula.WillPlayDevilishPower(this, ui); bool eventIsCancelledC = false; if (draculaEventCard != null) { switch (draculaEventCard.name) { case "DevilishPower": ui.TellUser("Dracula played Devilish power to cancel this event"); DiscardEventFromDracula("Devilish Power"); int hunterPlayingGoodluck = ui.AskWhichHunterIsUsingGoodLuckToCancelEvent(); if (hunterPlayingGoodluck > -1) { DiscardEventFromHunterAtIndex("Good Luck", hunterPlayingGoodluck, ui); } else { eventIsCancelledC = true; } break; } } if (!eventIsCancelledC) { PlayHeroicLeapInCombat(hunterPlayingCard, ui); } break; case "Garlic": rageRounds = 3; if (enemyCombatCards.FindIndex(card => card.Name == "Escape (Man)") > -1) { enemyCombatCards.Remove(enemyCombatCards.Find(card => card.Name == "Escape (Man)")); } if (enemyCombatCards.FindIndex(card => card.Name == "Escape (Bat)") > -1) { enemyCombatCards.Remove(enemyCombatCards.Find(card => card.Name == "Escape (Bat)")); } if (enemyCombatCards.FindIndex(card => card.Name == "Escape (Mist)") > -1) { enemyCombatCards.Remove(enemyCombatCards.Find(card => card.Name == "Escape (Mist)")); } DiscardItemFromHunterAtIndex(cardName, hunterPlayingCard, ui); break; } } } else { hunterPlayedCard[hunterPlayingCard] = false; } hunterPlayingCard = (hunterPlayingCard + 1) % 4; } CombatRoundResult roundResult = new CombatRoundResult(); roundResult = ResolveRoundOfCombat(huntersInCombat, enemyCombatCards, hunterBasicCards, roundResult, hunterMoved, enemyInCombat, ui); rageRounds--; if (rageRounds == 0) { enemyCombatCards.Add(new ItemDetail("Escape (Man)")); if (TimeIndex > 2) { enemyCombatCards.Add(new ItemDetail("Escape (Bat)")); enemyCombatCards.Add(new ItemDetail("Escape (Mist)")); } } enemyCombatCards.Add(new ItemDetail("Dodge")); hunterBasicCards.Add(new ItemDetail("Dodge")); while (roundResult.outcome != "Bite" && roundResult.outcome != "Enemy killed" && roundResult.outcome != "Hunter killed" && roundResult.outcome != "End") { if (roundResult.outcome == "Hunter wounded") { if (ui.AskIfHunterIsUsingGreatStrengthToCancelDamage(roundResult.hunterTargeted)) { DiscardEventFromHunterAtIndex("Great Strength", Array.FindIndex(Hunters, h => h.Name == roundResult.hunterTargeted), ui); draculaEventCard = Dracula.WillPlayDevilishPower(this, ui); if (draculaEventCard != null) { switch (draculaEventCard.name) { case "DevilishPower": ui.TellUser("Dracula played Devilish power to cancel this event"); DiscardEventFromDracula("Devilish Power"); int hunterPlayingGoodluck = ui.AskWhichHunterIsUsingGoodLuckToCancelEvent(); if (hunterPlayingGoodluck > -1) { DiscardEventFromHunterAtIndex("Good Luck", hunterPlayingGoodluck, ui); } break; } } } } roundResult = ResolveRoundOfCombat(huntersInCombat, enemyCombatCards, hunterBasicCards, roundResult, hunterMoved, enemyInCombat, ui); } foreach (Hunter h in huntersInCombat) { h.Health -= ui.GetHunterHealthLost(h.Name); } if (enemyInCombat == 1) { Dracula.Blood -= ui.GetDraculaBloodLost(); } ui.TellUser("Be sure to discard any items that were destroyed/consumed in this combat"); if (roundResult.outcome == "Bite" || roundResult.outcome == "Enemy killed" || roundResult.outcome == "Hunter killed" || roundResult.outcome == "End") { switch (roundResult.outcome) { case "Bite": ApplyBiteToHunter(Array.FindIndex(Hunters, hunt => hunt.Name == roundResult.hunterTargeted), ui); HandleDraculaEscape(ui); break; case "End": if (TimeIndex > 2) { HandleDraculaEscape(ui); } break; } return roundResult.outcome; } return ui.GetCombatRoundOutcome(); }