Further work in translating/adding expansion fates.
authorJoe Wreschnig <joe.wreschnig@gmail.com>
Wed, 27 Aug 2014 00:12:25 +0000 (02:12 +0200)
committerJoe Wreschnig <joe.wreschnig@gmail.com>
Wed, 27 Aug 2014 00:12:25 +0000 (02:12 +0200)
Allow enabling/disabling helpful fates.

heroik.html
scenarios.js

index 8ede375fe5b2bcc780500ad46c2481f643d675c2..16f859bdc574005878e8f6d630a6a38404c30b13 100644 (file)
@@ -52,7 +52,9 @@
         <li><label><input type=checkbox data-flags=abunakkashii>Abunakkashii</label></li>
       </ul>
     </div>
-    <div style="font-size: 1.1em;">
+    <div style="font-size: 1.1em; line-height: 2em">
+      <label><input type=checkbox data-flags=helpful>Helpful fates</label>
+      <br>
       <label><input type=checkbox data-flags=noncanonical checked>Non-canonical fates</label>
     </div>
     <div>
@@ -80,7 +82,7 @@
         <a target=_blank href="http://www.asmodee.com/">Asmodee</a>.
         This tool is not affiliated with or authorized by either. Some
         events used are from <a target=_blank href="http://boardgamegeek.com/filepage/57107/random-scenario-generator">Sean Allen's random scenario
-          generator</a> and <a target=_blank href="http://docfox.free.fr/spip.php?article129">Stephane Renard's solo scenario</a>. Fonts used are <a target=_blank href="http://scholarsfonts.net/">David Perry's Cardo</a> and <a target=_blank href="http://pospelov.com/2012/08/01/oranienbaum-font/">Oleg
+          generator</a>. Fonts used are <a target=_blank href="http://scholarsfonts.net/">David Perry's Cardo</a> and <a target=_blank href="http://pospelov.com/2012/08/01/oranienbaum-font/">Oleg
         Pospelov</a> and <a target=_blank href="http://www.jovanny.ru/">Jovanny Lemonad's</a> Oranienbaum.
       </p>
     </div>
index ce36acc94525936a0557ccbdd07f368e585ed94c..035d492262e2947eb0e0a7c266069c1106547086 100644 (file)
@@ -27,6 +27,10 @@ var EVENTS = [
       effect: "Abunakkashii and his Offspring gain a bonus of +2 Strength.",
       requires: ["abunakkashii"],
       unique: true },
+    { name: "The start of a legend.",
+      effect: "Abunakkashii and his Offspring gain a bonus of +1 Strength.",
+      requires: ["abunakkashii"],
+      unique: true },
     { name: "Technological prowess.",
       effect: "Traps gain a bonus of +1 Strength.",
       requires: ["traps"] },
@@ -35,6 +39,8 @@ var EVENTS = [
       effect: "Psi monsters gain a bonus of +1 Strength.", },
     { name: "A cry in the night.",
       action: "An adventurer of your choice loses 1 Mana." },
+    { name: "Vague psi.",
+      action: "Lose all your Mana tokens." },
     { name: "It's an ambush!",
       action: "Place a Tenacity token on each monster that does not have one." },
     { name: "The alarm is sounded.",
@@ -57,14 +63,45 @@ var EVENTS = [
       unique: true },
     { name: "Red herring.",
       action: "Shuffle the remaining corridors together and redistribute the cards as if you were setting up the game." },
+    { name: "The torch has gone out.",
+      action: "The next dungeon card is placed face-down.", },
 
+    { name: "Anti-psi zone.",
+      effect: "You do not gain Mana tokens for the next three creatures you defeat, even if they have a Mana icon.",
+      unique: true },
+      
+    { name: "Necromancy.",
+      action: "Return a random defeated dungeon card to the lowest corridor and shuffle it." },
+    { name: "Reanimation.",
+      action: "Return a random defeated dungeon card to the highest corridor and shuffle it." },
+
+    { name: "Malediction.",
+      action: "Discard a quest or a magic item." },
+
+    { name: "False brethren.",
+      effect: "All Demons gain Immunity 5 and Immunity 7.",
+      requires: ["demons"],
+      unique: true },
+
+    { name: "Psi assault.",
+      effect: "You cannot use ultimate powers.",
+      unique: true },
+/*  TODO: Figure out how to implement this well.
+    { name: "Entering an anti-magic zone.",
+      effect: "You cannot use ultimate powers.",
+      unique: true,
+      duration: 3,
+      later: { name: "Leaving the anti-magic zone.",
+               effect: "You may use ultimate powers again." }
+    },
+*/
     // Events from Sean Allen's random scenario generator.
     // http://boardgamegeek.com/filepage/57107/random-scenario-generator
     { name: "Fire from above.",
       effect: "Dragons gain a bonus of +1 Strength.",
       requires: ["dragons", "noncanonical"],
       unique: true },
-    { name: "Bad dreams.",
+    { name: "Overwhelming fear.",
       action: "Lose 1 extra Courage token. (The dungeon does not gain another Fear token.)",
       requires: ["noncanonical"],
       unique: true },
@@ -72,26 +109,17 @@ var EVENTS = [
       effect: "Any monster with a Tenacity token is also <strong>Fierce</strong>.",
       requires: ["noncanonical"],
       unique: true },
-    { name: "Surrounded.",
+    { name: "The tide has turned.",
       effect: "All monsters have <strong>Supremacy</strong>.",
       requires: ["noncanonical"],
       unique: true },
-    { name: "The torch has gone out.",
-      action: "The next dungeon card is placed face-down.", },
-
-    // Events from Stephane Renard's scenario.
-    // http://docfox.free.fr/spip.php?article129
-    { name: "Malediction.",
-      action: "Discard all quests.",
-      requires: ["noncanonical"],
-      unique: true },
-    { name: "Reanimation.",
-      action: "Return a random spent dungeon card to the smallest corridor and shuffle it. (If you haven't spent any cards, nothing happens.)",
+    { name: "Lost.",
+      action: "Shuffle the remaining corridors together and redistribute the cards as if you were setting up the game.",
       requires: ["noncanonical"] },
-    { name: "Zone of silence.",
-      effect: "Temporary and Ultimate Powers cannot be used until you reveal a new card.",
+    { name: "Into the darkness.",
+      effect: "Choose one corridor. Its cards are now always placed face-down.",
       requires: ["noncanonical"] },
-
+    
     // Events of my own devising.
     { name: "Unwanted attention.",
       effect: "Unique monsters gain a bonus of +1 Strength.",
@@ -101,7 +129,7 @@ var EVENTS = [
       effect: "Greenskins have 1d8 Strength.",
       requires: ["noncanonical"],
       unique: true },
-    { name: "Lost in the fog.",
+    { name: "Twisty passages.",
       effect: "After defeating a card, roll a die. On an odd number its replacement is placed face-down.",
       requires: ["noncanonical"],
       unique: true },
@@ -144,10 +172,34 @@ var EVENTS = [
       effect: "Bubbleyes have <strong>Veil of Shadow</strong>.",
       requires: ["noncanonical", "bubbleyes"],
       unique: true },
+    { name: "Leeched power.",
+      action: "A random adventurer loses a Mana token.",
+      requires: ["noncanonical"] },
 
 ];
 
-var NOTHING = { name: "Nothing happens." };
+var NOP = [
+    { name: "Nothing happens." },
+    { name: "A draft blows down the hallway.",
+      requires: ["noncanonical"] },
+    { name: "You sneeze.",
+      requires: ["noncanonical"] },
+    { name: "There's a skittering in the distance.",
+      requires: ["noncanonical"] },
+];
+
+var HELPFUL = [
+    { name: "It cuts both ways.",
+      action: "Next time you roll a 1, put a Tenacity token on all face-up monsters and roll again.",
+      requires: ["helpful"] },
+    { name: "Breached their defense.",
+      action: "Gain 2 Courage tokens and the dungeon gains 1 Fear token and the Fate Chart advances; <em>or</em> gain 1 Mana token.",
+      requires: ["helpful"], unique: true },
+    { name: "Mana ritual.",
+      action: "Discard up to 2 Mana tokens. For each one discarded, gain 1 Courage token.",
+      requires: ["helpful"] }
+];
+    
 var LOSE = { name: "Your adventuring party is defeated!" };
 
 function randrange (a, b) {
@@ -166,8 +218,20 @@ function generate (flags, events, nop) {
     for (i = 0; i < events; ++i)
         chosen.push(choice(EVENTS.filter(canStillHappen)));
 
-    for (i = 0; i < nop; ++i)
-        chosen.splice(randrange(0, chosen.length), 0, NOTHING);
+    
+    for (i = 0; i < nop / 2; ++i) {
+        var helpful = HELPFUL.filter(canStillHappen);
+        var neutral = NOP.filter(canStillHappen);
+        chosen.splice(
+            randrange(0, chosen.length), 0,
+            choice(helpful.length ? helpful : neutral));
+                           
+    }
+    for (;i < nop; ++i) {
+        var neutral = NOP.filter(canStillHappen);
+        chosen.splice(randrange(0, chosen.length), 0, choice(neutral));
+                           
+    }
 
     chosen.push(LOSE);
     return chosen;