diff --git a/module/boss.mjs b/module/boss.mjs index 83ac602..c6cc8af 100644 --- a/module/boss.mjs +++ b/module/boss.mjs @@ -35,6 +35,7 @@ const bossData = { moves: [ { marked: true, + locked: true, name: "Force of Will", description: `Whenever you act, do not draw. Simply declare what you do, and what happens after.`, hasWriteIn: false, @@ -85,14 +86,14 @@ const bossData = { { marked: false, name: "Exceptional Planning", - description: `At the start of each mission, remove one card from the deck. Any time one of your henches draws, you may replace the card they play with the removed card.`, + description: `At the start of each mission, remove one card from the deck, then shuffle. When one of your henches draws, you may replace the card they play with the removed card.`, hasWriteIn: false, writeIn: null, }, { marked: false, - name: "Limelight Lovers", - description: `If your heat is in Tier III, your henches can take 1 stress to take +1 card to any draw (possibly drawing 4).`, + name: "Push the Limits", + description: `Your henches can take 2 stress to take +1 card to any draw (possibly drawing 4).`, hasWriteIn: false, writeIn: null, }, @@ -113,7 +114,7 @@ const bossData = { { marked: false, name: "Guild Bigwig", - description: `During fallout, you may draw a second time and use that card instead. Explain who intervenes on your behalf, and how.`, + description: `During engagement, you may draw a second time and use that card instead.`, hasWriteIn: false, writeIn: null, }, diff --git a/module/data-models.mjs b/module/data-models.mjs index 1f2c630..4e2dde1 100644 --- a/module/data-models.mjs +++ b/module/data-models.mjs @@ -30,6 +30,7 @@ const cappedArrayField = (innerField, maxSize, defaultValue = undefined) => new const moveField = () => new SchemaField({ marked: new BooleanField({ required: true, initial: false }), + locked: new BooleanField({ required: false, initial: false }), name: textField(), description: textField(), hasWriteIn: new BooleanField({ required: true, initial: false }), @@ -123,12 +124,12 @@ export class BossDataModel extends foundry.abstract.TypeDataModel { details: cappedArrayField(promptField(), 4), storyline: new StringField({ required: true, blank: false, initial: nullStorylineKey, options: storylineKeys}), - heat: new NumberField({ required: true, integer: true, min: 0, initial: 0, max: 18}), - experienceTriggers: cappedArrayField(markableField(), 4), experience: new NumberField({ required: true, integer: true, min: 0, initial: 0, max: 5 }), moves: cappedArrayField(moveField(), 13), + + notes: textField(), }; } @@ -144,10 +145,4 @@ export class BossDataModel extends foundry.abstract.TypeDataModel { return this.updateSource(initMutation); } - - get tier() { - const divisor = 18 / 3; - - return Math.ceil(this.heat / divisor); - } } \ No newline at end of file diff --git a/module/helpers/update-helper.mjs b/module/helpers/update-helper.mjs index ce0edaf..a80453f 100644 --- a/module/helpers/update-helper.mjs +++ b/module/helpers/update-helper.mjs @@ -4,15 +4,17 @@ export const versions = { UNDEFINED: undefined, DRAFT_0: '0', DRAFT_1: '1', + DRAFT_2: '2', }; -export const CURRENT_VERSION = versions.DRAFT_1; +export const CURRENT_VERSION = versions.DRAFT_2; const updateMap = { [versions.UNDEFINED]: versions.DRAFT_0, [versions.EMPTY]: versions.DRAFT_0, [versions.NULL]: versions.DRAFT_0, [versions.DRAFT_0]: versions.DRAFT_1, + [versions.DRAFT_1]: versions.DRAFT_2, }; const updateWarnings = { @@ -24,6 +26,15 @@ const updateWarnings = {
  • You delete and recreate your deck, or update the Ace of Diamonds and add a joker.
  • `, }, + [versions.DRAFT_2]: { + title: `Draft 2 update!`, + content: `The module is now compatible with Draft 2. Due to these changes, we recommend: + + `, + } }; function getWarningsSinceVersion(oldVersion) { diff --git a/module/playbooks.mjs b/module/playbooks.mjs index 22f244b..5ca9896 100644 --- a/module/playbooks.mjs +++ b/module/playbooks.mjs @@ -151,12 +151,11 @@ const playbooks = { { marked: false, name: "Encyclopedic Knowledge", - description: `When you first meet a new heroic or villainous character, The Boss may ask you one of the following. You've heard of them before: answer. Whatever you state is true. + description: `When you first meet a new heroic or villainous character, you can decide you've heard of them before, and choose to answer one of the below. Whatever you state is true. `, hasWriteIn: false, writeIn: null, @@ -171,7 +170,7 @@ const playbooks = { { marked: false, name: "Just an Average Citizen", - description: `When you are out of uniform no one will suspect you are a henchman until you reveal yourself or act with violence.`, + description: `When you are out of uniform no one can identify you as a henchman until you reveal yourself or act with violence.`, hasWriteIn: false, writeIn: null, }, @@ -183,9 +182,10 @@ const playbooks = { writeIn: null, }, { - marked: false, + marked: true, + locked: true, name: "Forum Lurker", - description: `As a prep action you can trawl the web for information about a piece of the setting. State a single fact about this thing and draw. Ignore the cue, and use the rank: + description: `As a prep action you can trawl the web for information about a piece of the setting. State a single fact about this thing and draw 2. Ignore the cue, and use the rank: `, hasWriteIn: true, @@ -282,13 +282,14 @@ const playbooks = { writeIn: null, }, { - marked: false, - name: "Like Old Times", - description: `As a prep action, you can take an old friend out on the town. Describe how things were between you, back in the day and how you spend time with them now. Then, draw. Ignore the cue, and use the rank: + marked: true, + locked: true, + name: "Phone a Friend", + description: `As a prep action, you can ask an old friend to complete a favor. State what you want, then draw 2. Ignore the cue, and instead use the rank: `, hasWriteIn: false, writeIn: null, @@ -311,7 +312,7 @@ const playbooks = { "Doing something unexpected", ], missionPlanningQuestions: [ - "Present your new prototype weapon, which the target is probably weak to.", + "Explain an unconventional or secret weakness of the target.”", "State a fact about the target's defense systems.", "Ask the boss: what secret research is the target hiding?", ], @@ -344,28 +345,22 @@ const playbooks = { moves: [ { marked: false, - name: "Always Prepared", - description: `At the beginning of the action, write a new piece of gear in below. Choose one flaw. You may use this gear this mission, without counting towards your slots. At the end of the mission, erase it. - `, - hasWriteIn: true, - writeIn: "", - }, - { - marked: false, - name: "Wirey", - description: `Treat all played ♣ cards as -1 rank. Treat all played ♠ cards as +1 rank. (This won't turn a 1 into a 0, or a 6 into a 7).`, + name: "Unorthodox", + description: `When you use your gear in a manner other than its intended purpose, and you play a 2, 3, or face card, clear 3 stress.`, hasWriteIn: false, writeIn: null, }, { marked: false, - name: "Packmule", - description: `Gain +1 gear slot. Your teammates can mark gear from your sheet, if you let them.`, + name: "Wirey", + description: `Treat all played ♣ cards as -1 rank. Treat all played ♠ cards as +1 rank. (This won't turn a 2 into a 1, or a 6 into a 7).`, + hasWriteIn: false, + writeIn: null, + }, + { + marked: false, + name: "Hammerspace", + description: `You can mark any number of gear slots.`, hasWriteIn: false, writeIn: null, }, @@ -377,16 +372,24 @@ const playbooks = { writeIn: null, }, { - marked: false, - name: "Logistics", - description: `As a prep action you may tap your connections to procure something unusual. State what you're trying to find, then draw. Ignore the cue, and instead use the rank: + marked: true, + locked: true, + name: "Always Prepared", + description: `As a prep action, you can design a new prototype invention. Write it in below and pick 1 flaw. You may use it as gear this mission. Then, draw 2. Ignore the cue, and use the rank: +

    Flaws:

    + `, - hasWriteIn: false, - writeIn: null, + hasWriteIn: true, + writeIn: "", }, ], }, @@ -447,14 +450,14 @@ const playbooks = { { marked: false, name: "You're Dead, Kiddo", - description: `When you intimidate someone by describing a past villainous deed, treat any ♥ as -1 rank. (This won't turn an ace into a 0).`, + description: `When you intimidate someone by describing a past villainous deed, treat any ♥ as -1 rank. (This won't change the cue for a 2).`, hasWriteIn: false, writeIn: null, }, { marked: false, name: "I've Seen Worse", - description: `During The Action, you can help another character. Describe a similar memory from your past that has prepared you for this moment. They take +1 to their draw (possibly up to 4 cards), and you take one stress.`, + description: `When you team up with a fellow hench, describe a similar memory from your past that has prepared you for this moment. Take +1 to the draw (possibly up to 4 cards), and you take one stress.`, hasWriteIn: false, writeIn: null, }, @@ -466,13 +469,14 @@ const playbooks = { writeIn: null, }, { - marked: false, - name: "Friends in Low Places", - description: `As a prep action, you can ask an underworld contact to complete an unusual favor. State what you want, then draw. Ignore the cue, and instead use the rank: + marked: true, + locked: true, + name: "Like Old Times", + description: `As a prep action, you can take some henches on a minor crime spree. Explain your petty crimes, then draw 2. Ignore the cue, and instead use the rank: `, hasWriteIn: false, writeIn: null, @@ -527,7 +531,7 @@ const playbooks = { ], moves: [ { - marked: true, + marked: false, name: "Teacher's Pet", description: `You live at the base, and are specially favored by the boss. Describe a privilege that only you receive. You cannot clock out.`, hasWriteIn: true, @@ -550,14 +554,15 @@ const playbooks = { { marked: false, name: "Folie à Deux", - description: `At the beginning of the action, choose another hench. Whenever they help you or show support, clear 1 stress. Whenever they fail or are hurt, take 1 stress.`, + description: `At the beginning of the action, choose another hench. Whenever they help you or show support, clear 2 stress. Whenever they fail or are hurt, take 2 stress.`, hasWriteIn: false, writeIn: null, }, { - marked: false, + marked: true, + locked: true, name: "Eavesdropper", - description: `As a prep action, you can lurk around where you shouldn't be and listen for secrets. Choose a target or an ally, then draw. Ignore the cue, and instead use the rank: + description: `As a prep action, you can lurk around where you shouldn't be and listen for secrets. Choose a target or an ally, then draw 2. Ignore the cue, and instead use the rank: