X-Git-Url: https://git.yukkurigames.com/?p=heroik.git;a=blobdiff_plain;f=scenarios.js;h=fd280c04f13d88b2b84aa35438656790eabbf0c3;hp=035d492262e2947eb0e0a7c266069c1106547086;hb=25421fabdd36629c3bcab15491897cbb9b582f28;hpb=5b2feaf09e2767f845af03d74e13cebfe8b61baa diff --git a/scenarios.js b/scenarios.js index 035d492..fd280c0 100644 --- a/scenarios.js +++ b/scenarios.js @@ -23,12 +23,12 @@ var EVENTS = [ { name: "Stronger than ever.", effect: "Undead gain a bonus of +1 Strength.", requires: ["undead"] }, - { name: "Meeting with Abunakkashi.", - effect: "Abunakkashii and his Offspring gain a bonus of +2 Strength.", + { name: "Encounter with Abunakkashi.", + 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.", + effect: "Abunakkashii and his offspring gain a bonus of +1 Strength.", requires: ["abunakkashii"], unique: true }, { name: "Technological prowess.", @@ -39,7 +39,7 @@ 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.", + { name: "Psi wave.", action: "Lose all your Mana tokens." }, { name: "It's an ambush!", action: "Place a Tenacity token on each monster that does not have one." }, @@ -56,7 +56,7 @@ var EVENTS = [ unique: true }, { name: "Destruction.", - action: "All equipment and items are destroyed.", + action: "All of your weapons and armor are destroyed.", unique: true }, { name: "Epic combat.", effect: "The Final Monster gains a bonus of +3 Strength.", @@ -76,7 +76,7 @@ var EVENTS = [ action: "Return a random defeated dungeon card to the highest corridor and shuffle it." }, { name: "Malediction.", - action: "Discard a quest or a magic item." }, + action: "Discard a quest or a magic object." }, { name: "False brethren.", effect: "All Demons gain Immunity 5 and Immunity 7.", @@ -85,16 +85,17 @@ var EVENTS = [ { name: "Psi assault.", effect: "You cannot use ultimate powers.", + lock: ["ultimates"], unique: true }, -/* TODO: Figure out how to implement this well. { name: "Entering an anti-magic zone.", effect: "You cannot use ultimate powers.", - unique: true, + lock: ["ultimates"], duration: 3, later: { name: "Leaving the anti-magic zone.", - effect: "You may use ultimate powers again." } + effect: "You may use ultimate powers again.", + clear: ["ultimates"] } }, -*/ + // Events from Sean Allen's random scenario generator. // http://boardgamegeek.com/filepage/57107/random-scenario-generator { name: "Fire from above.", @@ -113,9 +114,6 @@ var EVENTS = [ effect: "All monsters have Supremacy.", requires: ["noncanonical"], unique: true }, - { name: "Lost.", - action: "Shuffle the remaining corridors together and redistribute the cards as if you were setting up the game.", - requires: ["noncanonical"] }, { name: "Into the darkness.", effect: "Choose one corridor. Its cards are now always placed face-down.", requires: ["noncanonical"] }, @@ -150,26 +148,26 @@ var EVENTS = [ unique: true }, { name: "Infighting.", effect: "Greenskins have Undead +1, Demons -1. Demons have Greenskins +1, Undead -1. Undead have Demons +1, Greenskins -1.", - requires: ["noncanonical"], + requires: ["noncanonical", "demons", "undead"], unique: true }, { name: "New moon.", - effect: "Demons have Veil of Shadow.", + effect: "Demons have Shrouded.", requires: ["noncanonical", "demons"], unique: true }, { name: "Camouflage.", - effect: "Greenskins have Veil of Shadow.", + effect: "Greenskins have Shrouded.", requires: ["noncanonical"], unique: true }, { name: "Cryptic shades.", - effect: "Undead have Veil of Shadow.", + effect: "Undead have Shrouded.", requires: ["noncanonical", "undead"], unique: true }, { name: "Lingering smoke.", - effect: "Dragons have Veil of Shadow.", + effect: "Dragons have Shrouded.", requires: ["noncanonical", "dragons"], unique: true }, { name: "Hypnotizing gaze.", - effect: "Bubbleyes have Veil of Shadow.", + effect: "Bubbleyes have Shrouded.", requires: ["noncanonical", "bubbleyes"], unique: true }, { name: "Leeched power.", @@ -181,11 +179,15 @@ var EVENTS = [ var NOP = [ { name: "Nothing happens." }, { name: "A draft blows down the hallway.", - requires: ["noncanonical"] }, + unique: true, requires: ["noncanonical"] }, { name: "You sneeze.", - requires: ["noncanonical"] }, + unique: true, requires: ["noncanonical"] }, { name: "There's a skittering in the distance.", - requires: ["noncanonical"] }, + unique: true, requires: ["noncanonical"] }, + { name: "The torch flickers.", + unique: true, requires: ["noncanonical"] }, + { name: "Shadows dance across the walls.", + unique: true, requires: ["noncanonical"] }, ]; var HELPFUL = [ @@ -210,13 +212,34 @@ function generate (flags, events, nop) { var chosen = []; var i; + var pending = []; + var locks = []; + var event; + + function pend (event, i) { + while (pending[i]) ++i + pending[i] = event; + } + function canStillHappen (event) { return issubset(event.requires || [], flags) - && !(event.unique && contains.call(chosen, event)); + && !(event.unique && contains.call(chosen, event)) + && !(event.lock && intersects(event.lock || [], locks)); + } + + for (i = 0; i < events; ++i) { + event = pending.shift() + || choice(EVENTS.filter(canStillHappen)); + chosen.push(event); + if (event.later) + pend(event.later, (Math.random() * chosen[i].duration) | 0); + locks = locks.concat(event.lock || []) + .filter(not(contains), event.clear || []); } - for (i = 0; i < events; ++i) - chosen.push(choice(EVENTS.filter(canStillHappen))); + for (i = 0; i < pending.length; ++i) + if (pending[i]) + chosen.push(pending[i]); for (i = 0; i < nop / 2; ++i) {