public void DiscardEncounterFromCardSlot_EncounterInList_EncounterIsMovedToEncounterPool() { var encounterPool = new List<EncounterTile>(); dracula.Trail[0] = new DraculaCardSlot(); var batsTile = new EncounterTile(Encounter.Bats); dracula.Trail[0].EncounterTiles.Add(batsTile); dracula.DiscardEncounterTileFromCardSlot(batsTile, dracula.Trail[0], encounterPool); Assert.AreEqual(false, dracula.Trail[0].EncounterTiles.Contains(batsTile)); Assert.AreEqual(true, encounterPool.Contains(batsTile)); }
/// <summary> /// Resolves an Encounter on a group of Hunters /// </summary> /// <param name="game">The GameState</param> /// <param name="encounterTileBeingResolved">The Encounter being resolved</param> /// <param name="trailIndex">The Index of the Trail slot (0-5), or Catacombs slot (6-8) where the Encounter is being resolved, or -1 if being resolved from Dracula's hand</param> /// <returns>True if the Hunters can continue resolving Encounters</returns> private static bool ResolveEncounterTile(GameState game, EncounterTile encounterTileBeingResolved, List<Hunter> huntersInvolved, DecisionMaker logic, int trailIndex) { Console.WriteLine("Resolving {0} with {1}{2}", encounterTileBeingResolved.Encounter.Name(), huntersInvolved.First().Name(), huntersInvolved.Count() > 1 ? " and his group" : ""); var continueEncounters = true; var discardEncounterTile = true; foreach (var h in huntersInvolved) { Console.WriteLine("Will {0} play Secret Weapon?", h.Name()); var line = ""; do { line = Console.ReadLine(); } while (!"yes".StartsWith(line.ToLower()) && !"no".StartsWith(line.ToLower())); if ("yes".StartsWith(line.ToLower())) { game.Hunters[(int)h].DiscardEvent(game, Event.SecretWeapon); if (DraculaIsPlayingDevilishPowerToCancelEvent(game, Event.SecretWeapon, Event.SecretWeapon, logic, game.Hunters[(int)h])) { Console.WriteLine("Secret Weapon cancelled"); } else { DiscardUnknownItemFromHunter(game, game.Hunters[(int)h]); Console.WriteLine("What is the name of the Item being retrieved from the discard pile?"); var itemRetrieved = Item.None; while (itemRetrieved == Item.None) { itemRetrieved = Enumerations.GetItemFromString(Console.ReadLine()); } var itemCardRetrieved = game.ItemDiscard.Find(card => card.Item == itemRetrieved); game.ItemDiscard.Remove(itemCardRetrieved); game.Hunters[(int)h].ItemsKnownToDracula.Add(itemCardRetrieved); game.Hunters[(int)h].DrawItemCard(); } } } foreach (var h in huntersInvolved) { Console.WriteLine("Will {0} play Forewarned?", h.Name()); var line = ""; do { line = Console.ReadLine(); } while (!"yes".StartsWith(line.ToLower()) && !"no".StartsWith(line.ToLower())); if ("yes".StartsWith(line.ToLower())) { game.Hunters[(int)h].DiscardEvent(game, Event.Forewarned); if (DraculaIsPlayingDevilishPowerToCancelEvent(game, Event.SecretWeapon, Event.SecretWeapon, logic, game.Hunters[(int)h])) { Console.WriteLine("Forewarned cancelled"); } else { Console.WriteLine("Encounter cancelled"); game.EncounterPool.Add(encounterTileBeingResolved); if (trailIndex > -1) { game.Dracula.Trail[trailIndex].EncounterTiles.Remove(encounterTileBeingResolved); } return true; } } } switch (encounterTileBeingResolved.Encounter) { case Encounter.Ambush: continueEncounters = ResolveAmbush(game, huntersInvolved, logic); break; case Encounter.Assassin: continueEncounters = ResolveAssassin(game, huntersInvolved, logic); break; case Encounter.Bats: discardEncounterTile = false; game.Hunters[(int)huntersInvolved.First()].EncountersInFrontOfPlayer.Add(encounterTileBeingResolved); if (trailIndex > -1) { game.Dracula.Trail[trailIndex].EncounterTiles.Remove(encounterTileBeingResolved); } else { game.Dracula.EncounterHand.Remove(encounterTileBeingResolved); } return false; case Encounter.DesecratedSoil: continueEncounters = ResolveDesecratedSoil(game, huntersInvolved, logic); break; case Encounter.Fog: discardEncounterTile = false; game.Hunters[(int)huntersInvolved.First()].EncountersInFrontOfPlayer.Add(encounterTileBeingResolved); if (trailIndex > -1) { game.Dracula.Trail[trailIndex].EncounterTiles.Remove(encounterTileBeingResolved); } else { game.Dracula.EncounterHand.Remove(encounterTileBeingResolved); } return false; case Encounter.MinionWithKnife: continueEncounters = ResolveMinionWithKnife(game, huntersInvolved, logic); break; case Encounter.MinionWithKnifeAndPistol: continueEncounters = ResolveMinionWithKnifeAndPistol(game, huntersInvolved, logic); break; case Encounter.MinionWithKnifeAndRifle: continueEncounters = ResolveMinionWithKnifeAndRifle(game, huntersInvolved, logic); break; case Encounter.Hoax: continueEncounters = ResolveHoax(game, huntersInvolved); break; case Encounter.Lightning: continueEncounters = ResolveLightning(game, huntersInvolved); break; case Encounter.Peasants: continueEncounters = ResolvePeasants(game, huntersInvolved); break; case Encounter.Plague: continueEncounters = ResolvePlague(game, huntersInvolved); break; case Encounter.Rats: continueEncounters = ResolveRats(game, huntersInvolved); break; case Encounter.Saboteur: continueEncounters = ResolveSaboteur(game, huntersInvolved); break; case Encounter.Spy: continueEncounters = ResolveSpy(game, huntersInvolved); break; case Encounter.Thief: continueEncounters = ResolveThief(game, huntersInvolved, logic); break; case Encounter.NewVampire: var seductionPlayed = false; continueEncounters = ResolveNewVampire(game, huntersInvolved, logic, out discardEncounterTile, out seductionPlayed); if (seductionPlayed) { game.Dracula.EncounterHand.Add(encounterTileBeingResolved); while (game.Dracula.EncounterHand.Count() > game.Dracula.EncounterHandSize) { game.Dracula.DiscardEncounterTile(game, logic.ChooseEncounterTileToDiscardFromEncounterHand(game)); } if (trailIndex > -1) { game.Dracula.Trail[trailIndex].EncounterTiles.Remove(encounterTileBeingResolved); } else { game.Dracula.EncounterHand.Remove(encounterTileBeingResolved); } } break; case Encounter.Wolves: continueEncounters = ResolveWolves(game, huntersInvolved); break; default: return false; } if (discardEncounterTile) { game.EncounterPool.Add(encounterTileBeingResolved); if (trailIndex > -1) { game.Dracula.Trail[trailIndex].EncounterTiles.Remove(encounterTileBeingResolved); } else { game.Dracula.EncounterHand.Remove(encounterTileBeingResolved); } } return continueEncounters; }
/// <summary> /// Matures an Encounter /// </summary> /// <param name="game">The GameState</param> /// <param name="encounterTileBeingMatured">The EncounterTile being matured</param> /// <param name="logic">The artificial intelligence component</param> private static void MatureEncounter(GameState game, EncounterTile encounterTileBeingMatured, DecisionMaker logic) { switch (encounterTileBeingMatured.Encounter) { case Encounter.Ambush: Console.WriteLine("Dracula matured Ambush"); var hunterToAmbush = logic.ChooseHunterToAmbush(game); if (hunterToAmbush != Hunter.Nobody) { var encounterToAmbushWith = logic.ChooseEncounterTileToAmbushHunterWith(game, hunterToAmbush); ResolveEncounterTile(game, encounterToAmbushWith, new List<Hunter> { hunterToAmbush }, logic, -1); game.Dracula.DiscardEncounterTile(game, encounterToAmbushWith); game.EncounterPool.Add(encounterToAmbushWith); } break; case Encounter.DesecratedSoil: Console.WriteLine("Dracula matured Desecrated Soil"); game.Dracula.ClearTrailDownTo(game, 3); logic.TrimAllPossibleTrails(3); for (var i = 0; i < 2; i++) { Console.WriteLine( "Draw an Event card. If it is a Hunter card, name it, otherwise type \"take\""); var line = ""; var eventDrawn = Event.None; do { line = Console.ReadLine(); eventDrawn = Enumerations.GetEventFromString(line); } while (eventDrawn == Event.None && !"take".StartsWith(line.ToLower())); if (eventDrawn == Event.None) { var eventPlayedByDracula = game.Dracula.TakeEvent(game.EventDeck, game.EventDiscard); PlayImmediatelyDraculaCard(game, eventPlayedByDracula, logic); if (game.Dracula.EventHand.Count() > game.Dracula.EventHandSize) { Console.WriteLine("Dracula discarded {0}", game.Dracula.DiscardEvent(logic.ChooseEventToDiscard(game), game.EventDiscard).Name()); } } else { var eventCardDiscarded = game.EventDeck.Find(card => card.Event == eventDrawn); game.EventDeck.Remove(eventCardDiscarded); game.EventDiscard.Add(eventCardDiscarded); } } break; case Encounter.NewVampire: Console.WriteLine("Dracula matured a New Vampire"); game.AdjustVampires(2); game.Dracula.ClearTrailDownTo(game, 1); logic.TrimAllPossibleTrails(1); break; } game.EncounterPool.Add(encounterTileBeingMatured); }
public void PlaceEncounterTileOnCard(EncounterTile encounterToPlace, DraculaCardSlot card) { if (encounterToPlace != null) { card.EncounterTiles.Add(encounterToPlace); EncounterHand.Remove(encounterToPlace); } }
public void DiscardEncounterTileFromCardSlot(EncounterTile encounterTileToDiscard, DraculaCardSlot draculaCardSlot, List<EncounterTile> encounterPool) { draculaCardSlot.EncounterTiles.Remove(encounterTileToDiscard); encounterPool.Add(encounterTileToDiscard); }
public void DiscardEncounterTile(GameState game, EncounterTile encounterToDiscard) { game.EncounterPool.Add(encounterToDiscard); EncounterHand.Remove(encounterToDiscard); }