X-Git-Url: https://git.yukkurigames.com/?p=heroik.git;a=blobdiff_plain;f=scenarios.js;h=2b24e6f435bd8eaacf55c283df3a2e4cc5a8b7a9;hp=035d492262e2947eb0e0a7c266069c1106547086;hb=dff204dd481ca30605bf45af479e502eb550b165;hpb=fd1a99b3c704f04f9c8a3b7b27631fe84a78a2f6 diff --git a/scenarios.js b/scenarios.js index 035d492..2b24e6f 100644 --- a/scenarios.js +++ b/scenarios.js @@ -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.", @@ -210,13 +211,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)) + && !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) {