Compare commits

...

3 Commits

Author SHA1 Message Date
5f0361588a Add update message 2025-05-23 13:01:59 -04:00
5f031ffef4 Update cues 2025-05-23 13:00:45 -04:00
ae65b5750f Remove heat 2025-05-23 12:40:40 -04:00
6 changed files with 52 additions and 456 deletions

View File

@ -123,8 +123,6 @@ 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 }),
@ -144,10 +142,4 @@ export class BossDataModel extends foundry.abstract.TypeDataModel {
return this.updateSource(initMutation);
}
get tier() {
const divisor = 18 / 3;
return Math.ceil(this.heat / divisor);
}
}

View File

@ -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 = {
<li> You delete and recreate your deck, or update the Ace of Diamonds and add a joker. </li>
</ul>`,
},
[versions.DRAFT_2]: {
title: `Draft 2 update!`,
content: `The module is now compatible with Draft 2. Due to these changes, we recommend:
<ul>
<li> You create new character sheets for Henches and Bosses, and delete the old ones. </li>
<li> You delete and recreate your deck, as most cues have changed. </li>
</ul>
`,
}
};
function getWarningsSinceVersion(oldVersion) {

View File

@ -19,7 +19,6 @@ export class HenchActorSheet extends ActorSheet {
// TODO define system constants for these
context.maxStress = 8;
context.maxExp = 5;
context.maxHeat = 18;
context.minGear = 3;
context.maxGear = 5;

View File

@ -1,7 +1,7 @@
{
"name": "Hench Deck",
"type": "deck",
"description": "A standard 52-card deck of playing cards.",
"description": "The starting deck for Hench, dark mode.",
"img": "cards/backs/dark-gold.webp",
"cards": [
{
@ -46,48 +46,6 @@
"lastModifiedBy": null
}
},
{
"name": "Ace of Clubs",
"faces": [
{
"name": "Ace of Clubs",
"img": "cards/dark-gold/clubs-ace.webp",
"text": ""
}
],
"width": 2,
"height": 3,
"rotation": 0,
"type": "base",
"value": 1,
"suit": "clubs",
"_id": "KK1BiXxu1gg62jvZ",
"description": "",
"face": 0,
"drawn": false,
"sort": 21,
"flags": {},
"back": {
"name": "",
"text": "",
"img": null
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "A perfect piece for your master plan.",
"zone": "DECK"
},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"coreVersion": "12.331",
"systemId": "hench",
"systemVersion": "0.0.0",
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
}
},
{
"name": "Two of Clubs",
"faces": [
@ -116,7 +74,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You uncover hidden strings.",
"cue": "You discover a weakness.",
"zone": "DECK"
},
"_stats": {
@ -158,7 +116,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You see a weakness, just out of reach.",
"cue": "You miss some details.",
"zone": "DECK"
},
"_stats": {
@ -200,7 +158,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You miss some details.",
"cue": "Someone gets the drop on you.",
"zone": "DECK"
},
"_stats": {
@ -284,49 +242,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "Youve fallen for the trap.",
"zone": "DECK"
},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"coreVersion": "12.331",
"systemId": "hench",
"systemVersion": "0.0.0",
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
}
},
{
"name": "Ace of Spades",
"faces": [
{
"name": "Ace of Spades",
"img": "cards/dark-gold/spades-ace.webp",
"text": ""
}
],
"width": 2,
"height": 3,
"rotation": 0,
"type": "base",
"value": 1,
"suit": "spades",
"_id": "j6p6HBs1pACTX3a4",
"description": "",
"face": 0,
"drawn": false,
"sort": 12,
"flags": {},
"back": {
"name": "",
"text": "",
"img": null
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You are the beatdown.",
"cue": "The trap closes in around you.",
"zone": "DECK"
},
"_stats": {
@ -368,7 +284,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "They cower in fear.",
"cue": "You win without a struggle.",
"zone": "DECK"
},
"_stats": {
@ -410,7 +326,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You win without a fight.",
"cue": "The fight becomes fair.",
"zone": "DECK"
},
"_stats": {
@ -452,7 +368,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "Its an all-out brawl.",
"cue": "It's an all out brawl.",
"zone": "DECK"
},
"_stats": {
@ -494,7 +410,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You run from the pain.",
"cue": "You're down, but not yet out.",
"zone": "DECK"
},
"_stats": {
@ -536,49 +452,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "It breaks you.",
"zone": "DECK"
},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"coreVersion": "12.331",
"systemId": "hench",
"systemVersion": "0.0.0",
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
}
},
{
"name": "Ace of Diamonds",
"faces": [
{
"name": "Ace of Diamonds",
"img": "cards/dark-gold/diamonds-ace.webp",
"text": ""
}
],
"width": 2,
"height": 3,
"rotation": 0,
"type": "base",
"value": 1,
"suit": "diamonds",
"_id": "jSk55TE6sIwjA17y",
"description": "",
"face": 0,
"drawn": false,
"sort": 17,
"flags": {},
"back": {
"name": "",
"text": "",
"img": null
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You get exactly what you've been looking for.",
"cue": "The job breaks you.",
"zone": "DECK"
},
"_stats": {
@ -620,7 +494,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You take what you need.",
"cue": "You find something useful.",
"zone": "DECK"
},
"_stats": {
@ -662,7 +536,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You make it work with what you have.",
"cue": "You stop something that looks important.",
"zone": "DECK"
},
"_stats": {
@ -704,7 +578,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "The target slips your grasp.",
"cue": "You lose something of yours.",
"zone": "DECK"
},
"_stats": {
@ -746,7 +620,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You left something critical behind.",
"cue": "You break something you need.",
"zone": "DECK"
},
"_stats": {
@ -788,49 +662,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You lose your prized possession.",
"zone": "DECK"
},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"coreVersion": "12.331",
"systemId": "hench",
"systemVersion": "0.0.0",
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
}
},
{
"name": "Ace of Hearts",
"faces": [
{
"name": "Ace of Hearts",
"img": "cards/dark-gold/hearts-ace.webp",
"text": ""
}
],
"width": 2,
"height": 3,
"rotation": 0,
"type": "base",
"value": 1,
"suit": "hearts",
"_id": "BcXIqwaqGJLlhKhn",
"description": "",
"face": 0,
"drawn": false,
"sort": 4,
"flags": {},
"back": {
"name": "",
"text": "",
"img": null
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "Everyone will love you for this.",
"cue": "You fumble something dear to the boss.",
"zone": "DECK"
},
"_stats": {
@ -872,7 +704,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You earn their approval.",
"cue": "You exceed the Boss's expectations.",
"zone": "DECK"
},
"_stats": {
@ -914,7 +746,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You take on the danger for your friends.",
"cue": "You become the center of attention.",
"zone": "DECK"
},
"_stats": {
@ -956,7 +788,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You hurt the bystanders.",
"cue": "You besmirch your reputation.",
"zone": "DECK"
},
"_stats": {
@ -998,7 +830,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You besmirch your reputation.",
"cue": "You are faced with the worst possible choices.",
"zone": "DECK"
},
"_stats": {
@ -1072,7 +904,7 @@
"_stats": {
"coreVersion": "12.331",
"systemId": "hench",
"systemVersion": "0.0.0",
"systemVersion": "0.1.0",
"createdTime": 1735270640335,
"modifiedTime": 1735271619021,
"lastModifiedBy": "qwaGMJc5w5shBqR1"

View File

@ -1,7 +1,7 @@
{
"name": "Hench Deck",
"type": "deck",
"description": "A standard 52-card deck of playing cards.",
"description": "The starting deck for Hench, light mode.",
"img": "cards/backs/light-soft.webp",
"cards": [
{
@ -46,48 +46,6 @@
"lastModifiedBy": null
}
},
{
"name": "Ace of Clubs",
"faces": [
{
"name": "Ace of Clubs",
"img": "cards/light-soft/clubs-ace.webp",
"text": ""
}
],
"width": 2,
"height": 3,
"rotation": 0,
"type": "base",
"value": 1,
"suit": "clubs",
"_id": "KK1BiXxu1gg62jvZ",
"description": "",
"face": 0,
"drawn": false,
"sort": 21,
"flags": {},
"back": {
"name": "",
"text": "",
"img": null
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "A perfect piece for your master plan.",
"zone": "DECK"
},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"coreVersion": "12.331",
"systemId": "hench",
"systemVersion": "0.0.0",
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
}
},
{
"name": "Two of Clubs",
"faces": [
@ -116,7 +74,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You uncover hidden strings.",
"cue": "You discover a weakness.",
"zone": "DECK"
},
"_stats": {
@ -158,7 +116,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You see a weakness, just out of reach.",
"cue": "You miss some details.",
"zone": "DECK"
},
"_stats": {
@ -200,7 +158,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You miss some details.",
"cue": "Someone gets the drop on you.",
"zone": "DECK"
},
"_stats": {
@ -284,49 +242,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "Youve fallen for the trap.",
"zone": "DECK"
},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"coreVersion": "12.331",
"systemId": "hench",
"systemVersion": "0.0.0",
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
}
},
{
"name": "Ace of Spades",
"faces": [
{
"name": "Ace of Spades",
"img": "cards/light-soft/spades-ace.webp",
"text": ""
}
],
"width": 2,
"height": 3,
"rotation": 0,
"type": "base",
"value": 1,
"suit": "spades",
"_id": "j6p6HBs1pACTX3a4",
"description": "",
"face": 0,
"drawn": false,
"sort": 12,
"flags": {},
"back": {
"name": "",
"text": "",
"img": null
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You are the beatdown.",
"cue": "The trap closes in around you.",
"zone": "DECK"
},
"_stats": {
@ -368,7 +284,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "They cower in fear.",
"cue": "You win without a struggle.",
"zone": "DECK"
},
"_stats": {
@ -410,7 +326,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You win without a fight.",
"cue": "The fight becomes fair.",
"zone": "DECK"
},
"_stats": {
@ -452,7 +368,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "Its an all-out brawl.",
"cue": "It's an all out brawl.",
"zone": "DECK"
},
"_stats": {
@ -494,7 +410,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You run from the pain.",
"cue": "You're down, but not yet out.",
"zone": "DECK"
},
"_stats": {
@ -536,49 +452,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "It breaks you.",
"zone": "DECK"
},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"coreVersion": "12.331",
"systemId": "hench",
"systemVersion": "0.0.0",
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
}
},
{
"name": "Ace of Diamonds",
"faces": [
{
"name": "Ace of Diamonds",
"img": "cards/light-soft/diamonds-ace.webp",
"text": ""
}
],
"width": 2,
"height": 3,
"rotation": 0,
"type": "base",
"value": 1,
"suit": "diamonds",
"_id": "jSk55TE6sIwjA17y",
"description": "",
"face": 0,
"drawn": false,
"sort": 17,
"flags": {},
"back": {
"name": "",
"text": "",
"img": null
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You get exactly what you've been looking for.",
"cue": "The job breaks you.",
"zone": "DECK"
},
"_stats": {
@ -620,7 +494,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You take what you need.",
"cue": "You find something useful.",
"zone": "DECK"
},
"_stats": {
@ -662,7 +536,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You make it work with what you have.",
"cue": "You stop something that looks important.",
"zone": "DECK"
},
"_stats": {
@ -704,7 +578,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "The target slips your grasp.",
"cue": "You lose something of yours.",
"zone": "DECK"
},
"_stats": {
@ -746,7 +620,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You left something critical behind.",
"cue": "You break something you need.",
"zone": "DECK"
},
"_stats": {
@ -788,49 +662,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You lose your prized possession.",
"zone": "DECK"
},
"_stats": {
"compendiumSource": null,
"duplicateSource": null,
"coreVersion": "12.331",
"systemId": "hench",
"systemVersion": "0.0.0",
"createdTime": null,
"modifiedTime": null,
"lastModifiedBy": null
}
},
{
"name": "Ace of Hearts",
"faces": [
{
"name": "Ace of Hearts",
"img": "cards/light-soft/hearts-ace.webp",
"text": ""
}
],
"width": 2,
"height": 3,
"rotation": 0,
"type": "base",
"value": 1,
"suit": "hearts",
"_id": "BcXIqwaqGJLlhKhn",
"description": "",
"face": 0,
"drawn": false,
"sort": 4,
"flags": {},
"back": {
"name": "",
"text": "",
"img": null
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "Everyone will love you for this.",
"cue": "You fumble something dear to the boss.",
"zone": "DECK"
},
"_stats": {
@ -872,7 +704,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You earn their approval.",
"cue": "You exceed the Boss's expectations.",
"zone": "DECK"
},
"_stats": {
@ -914,7 +746,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You take on the danger for your friends.",
"cue": "You become the center of attention.",
"zone": "DECK"
},
"_stats": {
@ -956,7 +788,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You hurt the bystanders.",
"cue": "You besmirch your reputation.",
"zone": "DECK"
},
"_stats": {
@ -998,7 +830,7 @@
},
"origin": "ye4k4c8ILOXk4prz",
"system": {
"cue": "You besmirch your reputation.",
"cue": "You are faced with the worst possible choices.",
"zone": "DECK"
},
"_stats": {
@ -1072,7 +904,7 @@
"_stats": {
"coreVersion": "12.331",
"systemId": "hench",
"systemVersion": "0.0.0",
"systemVersion": "0.1.0",
"createdTime": 1735270640335,
"modifiedTime": 1735271619021,
"lastModifiedBy": "qwaGMJc5w5shBqR1"

View File

@ -54,76 +54,6 @@
{{/each}}
</div>
</div>
<!-- Heat -->
<div class="hench-row hench-flex-resizeable">
<div class="hench-box hench-box-stretch hench-d-grey hench-flex-resizeable hench-padding-narrow hench-gap-narrow">
<div class="hench-row hench-flex-fixed hench-padding-wide">
<div class="hench-centered hench-title hench-flex-resizeable">
Heat
</div>
</div>
<!-- tier 1 -->
<div class="hench-row hench-flex-resizeable">
<div class="hench-box hench-flex-resizeable hench-m-grey hench-padding-narrow hench-gap-narrow">
<div class="hench-row hench-centered hench-flex-resizeable">
<div class="hench-flex-resizeable hench-centered">
<strong>Tier I</strong>
</div>
</div>
<div class="hench-row hench-centered hench-flex-resizeable">
<div class="hench-flex-resizeable hench-centered">
<em>(Nuisance, low-stakes, local cops)</em>
</div>
</div>
<div class="hench-row hench-flex-resizeable hench-row-even hench-gap-narrow">
{{#partialint2checkbox maxHeat actor.system.heat 0 6}}
<input type="checkbox" class="hench-checkbox-int-field" data-field-path="system.heat" data-value="{{index}}" {{#if marked}} checked {{/if}} />
{{/partialint2checkbox}}
</div>
</div>
</div>
<!-- tier 2 -->
<div class="hench-row hench-flex-resizeable">
<div class="hench-box hench-flex-resizeable hench-m-grey hench-padding-narrow hench-gap-narrow">
<div class="hench-row hench-centered hench-flex-resizeable">
<div class="hench-flex-resizeable hench-centered">
<strong>Tier II</strong>
</div>
</div>
<div class="hench-row hench-centered hench-flex-resizeable">
<div class="hench-flex-resizeable hench-centered">
<em>(Full-time, classic stakes, local super)</em>
</div>
</div>
<div class="hench-row hench-flex-resizeable hench-row-even hench-gap-narrow">
{{#partialint2checkbox maxHeat actor.system.heat 6 12}}
<input type="checkbox" class="hench-checkbox-int-field" data-field-path="system.heat" data-value="{{index}}" {{#if marked}} checked {{/if}} />
{{/partialint2checkbox}}
</div>
</div>
</div>
<!-- tier 3 -->
<div class="hench-row hench-flex-resizeable">
<div class="hench-box hench-flex-resizeable hench-m-grey hench-padding-narrow hench-gap-narrow">
<div class="hench-row hench-centered hench-flex-resizeable">
<div class="hench-flex-resizeable hench-centered">
<strong>Tier III</strong>
</div>
</div>
<div class="hench-row hench-centered hench-flex-resizeable">
<div class="hench-flex-resizeable hench-centered">
<em>(Top-class, high-stakes, world's finest heroes)</em>
</div>
</div>
<div class="hench-row hench-flex-resizeable hench-row-even hench-gap-narrow">
{{#partialint2checkbox maxHeat actor.system.heat 12 18}}
<input type="checkbox" class="hench-checkbox-int-field" data-field-path="system.heat" data-value="{{index}}" {{#if marked}} checked {{/if}} />
{{/partialint2checkbox}}
</div>
</div>
</div>
</div>
</div>
<!-- Experience -->
<div class="hench-row hench-flex-resizeable">
<div class="hench-box hench-m-grey hench-flex-resizeable hench-padding-narrow hench-gap-narrow">