From: Joe Wreschnig Date: Wed, 27 Aug 2014 10:05:08 +0000 (+0200) Subject: Implement anti-magic zone. X-Git-Url: https://git.yukkurigames.com/?p=heroik.git;a=commitdiff_plain;h=dff204dd481ca30605bf45af479e502eb550b165;ds=sidebyside Implement anti-magic zone. --- diff --git a/heroik.js b/heroik.js index 401268b..bca710e 100644 --- a/heroik.js +++ b/heroik.js @@ -58,6 +58,10 @@ function choice (seq) { return seq[(Math.random() * seq.length) | 0]; } +function not (f) { + return function () { return !f.apply(this, arguments); }; +} + function contains (element) { return this.indexOf(element) >= 0; } 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) {