public FreeActionDiceRoll(int n) { for (; n > 0; n--) { switch (D6.roll()) { case 1: case 2: ++Characters; break; case 3: ++Musters; break; case 4: ++ArmyMusters; break; case 5: ++Events; break; case 6: ++WillOfTheWests; break; } } }
public ShadowActionDiceRoll(int rolled, int eyesPlaced) { Eyes = eyesPlaced; for (; rolled > 0; rolled--) { switch (D6.roll()) { case 1: ++Armies; break; case 2: ++Characters; break; case 3: ++Musters; break; case 4: ++ArmyMusters; break; case 5: ++Events; break; case 6: ++Eyes; break; } } }
public Quest FromRivendell() { for (Turns = 1; ; Turns++) { if (AtTheGatesOfMordor()) { EnterMordor(); return(MordorTrack()); } ShadowActionDiceRoll shadowDice = new ShadowActionDiceRoll(7 + Minions, ShadowHuntAllocated); int freeHuntBoxDiceCount = 0; var freeDice = new FreeActionDiceRoll(FreeActionDiceCount); Log.Log($"Turn {Turns}: {shadowDice.Eyes} eyes, {freeDice}"); while (freeDice.CharacterOrWills > 0 || StriderCanHide(freeDice)) { if (PromoteGandalfIfAble(freeDice)) { // do nothing } else if (StriderCanHide(freeDice)) { Revealed = false; Log.Log($" Strider hide"); freeDice.SpendMostUselessDie(); } else if (Revealed) { Revealed = false; Log.Log($" hide"); freeDice.SpendCharacterOrWill(); } else if (AtTheGatesOfMordor()) { EnterMordor(); return(MordorTrack()); } else { int hits = D6.CountHits(shadowDice.Eyes, 6 - freeHuntBoxDiceCount); if (hits > 0) { var tile = HuntBag.DrawTile(); int huntValue = tile.Value(hits); bool wasRevealed = Revealed; Log.Log($" walk {EffectiveDistanceFromRivendell + 1} {Pluralize("step", EffectiveDistanceFromRivendell + 1)} from Rivendell - {hits} {Pluralize("hit", hits)} - {tile}"); FreeStrategy.Hunt(huntValue, tile.Reveal(), tile, this); ++Progress; bool freshlyRevealed = (!wasRevealed) && Revealed; if (freshlyRevealed) { RevealFellowshipOutsideMordorAndResolveStrongholdTiles(); } ++freeHuntBoxDiceCount; Log.Log($" corruption {Corruption}, {shadowDice.Eyes} eyes"); } else { Progress++; Log.Log($" walk {EffectiveDistanceFromRivendell} {Pluralize("step", EffectiveDistanceFromRivendell)} from Rivendell"); } freeDice.SpendCharacterOrWill(); } if (IsOver()) { return(this); } } } }