Compare commits
21 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
3e8ad38b9b | ||
![]() |
1679fda3e0 | ||
![]() |
839d3632ab | ||
![]() |
996c59ef12 | ||
![]() |
4b3ccaa4a4 | ||
![]() |
924569d3c8 | ||
![]() |
5fa4288ea9 | ||
![]() |
4268937ed1 | ||
![]() |
1a1cc758f2 | ||
![]() |
8eb78c4c36 | ||
![]() |
c555906a69 | ||
![]() |
8928a1efa9 | ||
![]() |
f47e5f85d1 | ||
![]() |
707e215ab5 | ||
![]() |
bcda593e81 | ||
![]() |
6a807c43f5 | ||
![]() |
84b8234e3a | ||
![]() |
98ea07c908 | ||
![]() |
60021edefc | ||
![]() |
ece263c69e | ||
![]() |
8cfe7acefd |
@ -6,14 +6,14 @@ Discord Link: TESTING NOT YET OPEN.
|
||||
|
||||
## Release Tracker
|
||||
### Current Release Version:
|
||||
Draft 0
|
||||
Draft 1
|
||||
|
||||
### Next Target Release Version:
|
||||
Draft 1
|
||||
Draft 2
|
||||
|
||||
## How to Use
|
||||
### Installation
|
||||
You can install the sytem using the latest manifest file, found [here]().
|
||||
You can install the sytem using the latest manifest file, found [here](https://raw.githubusercontent.com/walcutt/hench/refs/heads/develop/system.json).
|
||||
|
||||
### Gameplay
|
||||
- Make sure to add a deck in the cards section, using one of the presets.
|
||||
|
22
hench.mjs
22
hench.mjs
@ -1,6 +1,7 @@
|
||||
import { HenchCard, HenchCardDataModel } from "./module/cards/hench-card.mjs";
|
||||
import { HenchCards, HenchCardsDataModel } from "./module/cards/hench-cards.mjs";
|
||||
import { BossDataModel, HenchDataModel } from "./module/data-models.mjs";
|
||||
import { CURRENT_VERSION, showUpdateWarningDialogue } from "./module/helpers/update-helper.mjs";
|
||||
|
||||
import { HenchActorSheet } from "./module/sheets/hench-actor-sheet.mjs";
|
||||
import { HenchCardsSheet } from "./module/sheets/hench-cards-sheet.mjs";
|
||||
@ -101,4 +102,25 @@ Hooks.once("init", () => {
|
||||
// remove other card stack types...
|
||||
CardStacks.unregisterSheet('core', CardsHand);
|
||||
CardStacks.unregisterSheet('core', CardsPile);
|
||||
|
||||
// prepare version checker
|
||||
game.settings.register('hench', 'version', {
|
||||
name: 'Version',
|
||||
scope: 'world',
|
||||
config: false,
|
||||
type: String,
|
||||
});
|
||||
});
|
||||
|
||||
Hooks.once("ready", () => {
|
||||
// update version and alert if updated
|
||||
const existingVersion = game.settings.get('hench', 'version');
|
||||
|
||||
// TODO: don't alert on null/undefined after draft 1 cut.
|
||||
if(existingVersion !== CURRENT_VERSION) {
|
||||
console.log(`Showing warnings from ${existingVersion} -> ${CURRENT_VERSION}`);
|
||||
showUpdateWarningDialogue(existingVersion);
|
||||
}
|
||||
|
||||
game.settings.set('hench', 'version', CURRENT_VERSION);
|
||||
});
|
@ -54,20 +54,6 @@ const bossData = {
|
||||
hasWriteIn: false,
|
||||
writeIn: null,
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
name: "Rotating Armorment II",
|
||||
description: `Erase the write-in gear from any number of your henches' sheets, and write in a new equipment.`,
|
||||
hasWriteIn: false,
|
||||
writeIn: null,
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
name: "Rotating Armorment III",
|
||||
description: `Erase the write-in gear from any number of your henches' sheets, and write in a new equipment.`,
|
||||
hasWriteIn: false,
|
||||
writeIn: null,
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
name: "Specialized Training",
|
||||
@ -82,6 +68,20 @@ const bossData = {
|
||||
hasWriteIn: false,
|
||||
writeIn: null,
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
name: "Retro-Action",
|
||||
description: `Your henches may mark 1 stress to draw from the bottom of the deck, rather than the top.`,
|
||||
hasWriteIn: false,
|
||||
writeIn: null,
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
name: "Russian Roulette",
|
||||
description: `Add one extra joker to the deck. Add two face cards of your choice to the deck.`,
|
||||
hasWriteIn: false,
|
||||
writeIn: null,
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
name: "Exceptional Planning",
|
||||
|
@ -15,6 +15,10 @@ export class HenchCardDataModel extends foundry.abstract.TypeDataModel {
|
||||
zone: new StringField({required: true, blank: false, initial: CARD_ZONES.DECK, options: CARD_ZONES}),
|
||||
};
|
||||
}
|
||||
|
||||
static migrateData(source) {
|
||||
return super.migrateData(source);
|
||||
}
|
||||
}
|
||||
|
||||
// Document Class
|
||||
|
@ -7,6 +7,10 @@ export class HenchCardsDataModel extends foundry.abstract.TypeDataModel {
|
||||
static defineSchema() {
|
||||
return {};
|
||||
}
|
||||
|
||||
static migrateData(source) {
|
||||
return super.migrateData(source);
|
||||
}
|
||||
}
|
||||
|
||||
// Document Class
|
||||
|
@ -56,12 +56,12 @@ export class HenchDataModel extends foundry.abstract.TypeDataModel {
|
||||
levelThree: cappedArrayField(markableField(), 1, { marked: false, description: "" }),
|
||||
levelFour: cappedArrayField(markableField(), 1, { marked: false, description: "" }),
|
||||
}),
|
||||
stress: new NumberField({ required: true, integer: true, min: 0, initial: 0, max: 12 }),
|
||||
stress: new NumberField({ required: true, integer: true, min: 0, initial: 3, max: 8 }),
|
||||
|
||||
moves: cappedArrayField(moveField(), 5),
|
||||
customMove: moveField(),
|
||||
|
||||
experienceTriggers: cappedArrayField(markableField(), 4),
|
||||
experienceTriggers: cappedArrayField(markableField(), 5),
|
||||
experience: new NumberField({ required: true, integer: true, min: 0, initial: 0, max: 5 }),
|
||||
|
||||
baseAdvancements: cappedArrayField(markableField(), 5),
|
||||
@ -72,7 +72,10 @@ export class HenchDataModel extends foundry.abstract.TypeDataModel {
|
||||
}
|
||||
|
||||
static migrateData(source) {
|
||||
// No migrations yet - base case.
|
||||
// New stress cap
|
||||
if(source.stress) {
|
||||
source.stress = Math.min(source.stress, 8);
|
||||
}
|
||||
|
||||
return super.migrateData(source);
|
||||
}
|
||||
@ -130,8 +133,6 @@ export class BossDataModel extends foundry.abstract.TypeDataModel {
|
||||
}
|
||||
|
||||
static migrateData(source) {
|
||||
// no migrations yet
|
||||
|
||||
return super.migrateData(source);
|
||||
}
|
||||
|
||||
|
76
module/helpers/update-helper.mjs
Normal file
76
module/helpers/update-helper.mjs
Normal file
@ -0,0 +1,76 @@
|
||||
export const versions = {
|
||||
EMPTY: '',
|
||||
NULL: null,
|
||||
UNDEFINED: undefined,
|
||||
DRAFT_0: '0',
|
||||
DRAFT_1: '1',
|
||||
};
|
||||
|
||||
export const CURRENT_VERSION = versions.DRAFT_1;
|
||||
|
||||
const updateMap = {
|
||||
[versions.UNDEFINED]: versions.DRAFT_0,
|
||||
[versions.EMPTY]: versions.DRAFT_0,
|
||||
[versions.NULL]: versions.DRAFT_0,
|
||||
[versions.DRAFT_0]: versions.DRAFT_1,
|
||||
};
|
||||
|
||||
const updateWarnings = {
|
||||
[versions.DRAFT_1]: {
|
||||
title: `Draft 1 Update!`,
|
||||
content: `The module is now compatible with Draft 1. 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, or update the Ace of Diamonds and add a joker. </li>
|
||||
</ul>`,
|
||||
},
|
||||
};
|
||||
|
||||
function getWarningsSinceVersion(oldVersion) {
|
||||
|
||||
const next_v = updateMap[oldVersion];
|
||||
|
||||
if(next_v) {
|
||||
const next_w = updateWarnings[next_v];
|
||||
|
||||
if(next_w) {
|
||||
return [...getWarningsSinceVersion(next_v), next_w];
|
||||
} else {
|
||||
return getWarningsSinceVersion(next_v);
|
||||
}
|
||||
} else {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export function showUpdateWarningDialogue(oldVersion) {
|
||||
const warnings = getWarningsSinceVersion(oldVersion);
|
||||
|
||||
if(warnings?.length > 0) {
|
||||
const header = ``;
|
||||
|
||||
const content = warnings.reduce((prev, next) => {
|
||||
return prev + `
|
||||
<div>
|
||||
<h2>${next.title}</h2>
|
||||
<p>${next.content}</p>
|
||||
</div>`;
|
||||
}, header);
|
||||
|
||||
const dialogue = new Dialog({
|
||||
title: 'Update Notice',
|
||||
content: content,
|
||||
buttons: {
|
||||
one: {
|
||||
label: 'OK',
|
||||
callback: () => null,
|
||||
}
|
||||
},
|
||||
default: "one",
|
||||
});
|
||||
|
||||
dialogue.render(true);
|
||||
|
||||
return dialogue;
|
||||
}
|
||||
}
|
@ -4,7 +4,7 @@ export const playbookKeys = [
|
||||
nullPlaybookKey,
|
||||
"SUPERFAN",
|
||||
"BADASS",
|
||||
"LABMAN",
|
||||
"INVENTOR",
|
||||
"DEMOTED",
|
||||
"OUTCAST",
|
||||
"USURPER",
|
||||
@ -104,7 +104,7 @@ const playbooks = {
|
||||
SUPERFAN: {
|
||||
details: [
|
||||
{
|
||||
question: "What's the coolest thing you've ever done?",
|
||||
question: "What's the coolest part of being a hench?",
|
||||
answer: "",
|
||||
},
|
||||
{
|
||||
@ -185,11 +185,11 @@ const playbooks = {
|
||||
{
|
||||
marked: false,
|
||||
name: "Forum Lurker",
|
||||
description: `As a downtime move 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. Ignore the cue, and use the rank:
|
||||
<ul class="hench-list-1-col">
|
||||
<li>1-2 — You learn your information is correct but flawed.</li>
|
||||
<li>3-6 — You learn your information is false but holds a kernel of truth.</li>
|
||||
<li>5-6 — Someone takes notice of your search and will interfere with your next obligation or mission.</li>
|
||||
<li>5-6 — Someone takes notice of your search and will interfere with your next home life or mission.</li>
|
||||
</ul>`,
|
||||
hasWriteIn: false,
|
||||
writeIn: null,
|
||||
@ -199,7 +199,7 @@ const playbooks = {
|
||||
BADASS: {
|
||||
details: [
|
||||
{
|
||||
question: "Have you killed on the job? If so, what was your first?",
|
||||
question: "What's the worst fight you ever got into?",
|
||||
answer: "",
|
||||
},
|
||||
{
|
||||
@ -214,7 +214,7 @@ const playbooks = {
|
||||
missionPlanningQuestions: [
|
||||
"You've fought the target before. State where they left a scar, and how they did it.",
|
||||
"The target is an old friend. State how you met, and how it ended.",
|
||||
"Ask the boss: can we kill the target?",
|
||||
"Ask the boss: what are we not allowed to break?",
|
||||
],
|
||||
expTrigger: {
|
||||
marked: false,
|
||||
@ -284,7 +284,7 @@ const playbooks = {
|
||||
{
|
||||
marked: false,
|
||||
name: "Like Old Times",
|
||||
description: `As a downtime move, 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:
|
||||
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:
|
||||
<ul class="hench-list-1-col">
|
||||
<li>1-2 — They want back on your good side. What is the same? What is different now?</li>
|
||||
<li>3-4 — They might forgive you. What did you do to hurt them?</li>
|
||||
@ -295,7 +295,7 @@ const playbooks = {
|
||||
},
|
||||
],
|
||||
},
|
||||
LABMAN: {
|
||||
INVENTOR: {
|
||||
details: [
|
||||
{
|
||||
question: "What was your first invention?",
|
||||
@ -326,7 +326,7 @@ const playbooks = {
|
||||
gear: [
|
||||
{
|
||||
marked: false,
|
||||
description: "Futuristic Weapon",
|
||||
description: "Remote Tracker",
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
@ -372,14 +372,14 @@ const playbooks = {
|
||||
{
|
||||
marked: false,
|
||||
name: "I'm a PROFESSIONAL.",
|
||||
description: `When you take the tinker downtime action, mark 2 ticks instead of one.`,
|
||||
description: `When you take the tinker prep action, mark 2 ticks instead of one.`,
|
||||
hasWriteIn: false,
|
||||
writeIn: null,
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
name: "Logistics",
|
||||
description: `As a downtime 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:
|
||||
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:
|
||||
<ul class="hench-list-1-col">
|
||||
<li>1-2 — You find a source in ample supply. However much you need, you got.</li>
|
||||
<li>3-4 — You're able to squeeze out a sample. You have barely enough to work with.</li>
|
||||
@ -406,7 +406,7 @@ const playbooks = {
|
||||
"Attempting to reclaim your status",
|
||||
],
|
||||
missionPlanningQuestions: [
|
||||
"The target's clearly a rookie. State an obvious flaw with their approach or gimmick.",
|
||||
"The target is sloppy. State an obvious flaw with their approach or gimmick.",
|
||||
"You've bested the target before. State how, and why you can't just do that again.",
|
||||
"Ask the boss: why hasn't the Guild taken out the target?",
|
||||
],
|
||||
@ -468,7 +468,7 @@ const playbooks = {
|
||||
{
|
||||
marked: false,
|
||||
name: "Friends in Low Places",
|
||||
description: `As a downtime move, 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:
|
||||
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:
|
||||
<ul class="hench-list-1-col">
|
||||
<li>1-2 — They phone it in, but they do it.</li>
|
||||
<li>3-4 — They do it sloppily. A new complication arises.</li>
|
||||
@ -557,7 +557,7 @@ const playbooks = {
|
||||
{
|
||||
marked: false,
|
||||
name: "Eavesdropper",
|
||||
description: `As a downtime move, 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. Ignore the cue, and instead use the rank:
|
||||
<ul class="hench-list-1-col">
|
||||
<li>1-2 — You overhear something no one else knows - a future plan, a haunting deed, or their shame.</li>
|
||||
<li>3-4 — You overhear a common rumor - a worst held secret, a trick they've pulled, or a romantic tryst.</li>
|
||||
@ -646,7 +646,7 @@ const playbooks = {
|
||||
{
|
||||
marked: false,
|
||||
name: "Understudy",
|
||||
description: `As a downtime action, you can take some henches on a minor crime spree. Explain your petty crimes, then draw. Ignore the cue, and instead use the rank:
|
||||
description: `As a prep action, you can take some henches on a minor crime spree. Explain your petty crimes, then draw. Ignore the cue, and instead use the rank:
|
||||
<ul class="hench-list-1-col">
|
||||
<li>1-2 — You stir up some recognition and pride. Clear 1 heat, and mark 1 tick on one of your tinker clocks.</li>
|
||||
<li>3-4 — The night is a blur. Describe something you've lost, and something you've gained.</li>
|
||||
@ -700,7 +700,7 @@ const playbooks = {
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
description: "A Harmless Weapon",
|
||||
description: "Household Tool",
|
||||
},
|
||||
],
|
||||
moves: [
|
||||
@ -734,12 +734,12 @@ const playbooks = {
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
name: "Understudy",
|
||||
description: `As a downtime move, you can invite a fellow hench to join you in your hobby. Name the hobby, and how they're involved, then draw. Ignore the cue, and instead use the rank:
|
||||
name: "Hobbyist",
|
||||
description: `As a prep action, you can invite a fellow hench to join you in your hobby. Name the hobby, and how they're involved, then draw. Ignore the cue, and instead use the rank:
|
||||
<ul class="hench-list-1-col">
|
||||
<li>1-2 — You have a wonderful time and brighten each others' spirits. Gain +1 card to your next obligation draw.</li>
|
||||
<li>3-4 — They don't have a good time. Explain what goes wrong, and take 1 stress.</li>
|
||||
<li>5-6 — You completely lose track of time. Lose a remaining downtime move, or take 1 harm "sleep deprived."</li>
|
||||
<li>1-2 — You have a wonderful time and brighten each others' spirits. Gain +1 card to your next home life draw.</li>
|
||||
<li>3-4 — You have a pleasant, but ordinary, time. Clear 1 stress; they mark 1 experience.</li>
|
||||
<li>5-6 — You completely lose track of time. Lose a remaining prep action, or take 1 harm "sleep deprived."</li>
|
||||
</ul>`,
|
||||
hasWriteIn: false,
|
||||
writeIn: null,
|
||||
@ -794,6 +794,10 @@ export function getExpTriggers(playbookTrigger) {
|
||||
marked: false,
|
||||
description: "You made the boss proud.",
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
description: "You got on the boss's nerves.",
|
||||
},
|
||||
{
|
||||
marked: false,
|
||||
description: "Your home life interfered with the mission.",
|
||||
|
@ -17,7 +17,7 @@ export class HenchActorSheet extends ActorSheet {
|
||||
context.storylineKeys = storylineKeys.map((k) => ({ key: k, selected: k === this.actor.system.storyline}));
|
||||
|
||||
// TODO define system constants for these
|
||||
context.maxStress = 12;
|
||||
context.maxStress = 8;
|
||||
context.maxExp = 5;
|
||||
context.maxHeat = 18;
|
||||
|
||||
|
@ -4,6 +4,48 @@
|
||||
"description": "A standard 52-card deck of playing cards.",
|
||||
"img": "cards/backs/dark-gold.webp",
|
||||
"cards": [
|
||||
{
|
||||
"name": "Joker",
|
||||
"faces": [
|
||||
{
|
||||
"name": "Joker",
|
||||
"img": "cards/dark-gold/joker.webp",
|
||||
"text": ""
|
||||
}
|
||||
],
|
||||
"width": 2,
|
||||
"height": 3,
|
||||
"rotation": 0,
|
||||
"type": "base",
|
||||
"value": 6,
|
||||
"suit": "clubs",
|
||||
"_id": "KK1BiXxu1gg62jvZ",
|
||||
"description": "",
|
||||
"face": 0,
|
||||
"drawn": false,
|
||||
"sort": 53,
|
||||
"flags": {},
|
||||
"back": {
|
||||
"name": "",
|
||||
"text": "",
|
||||
"img": null
|
||||
},
|
||||
"origin": "ye4k4c8ILOXk4prz",
|
||||
"system": {
|
||||
"cue": "You completely fail, in the most comical way possible.",
|
||||
"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 Clubs",
|
||||
"faces": [
|
||||
@ -536,7 +578,7 @@
|
||||
},
|
||||
"origin": "ye4k4c8ILOXk4prz",
|
||||
"system": {
|
||||
"cue": "Treasure, beyond your wildest dreams.",
|
||||
"cue": "You get exactly what you've been looking for.",
|
||||
"zone": "DECK"
|
||||
},
|
||||
"_stats": {
|
||||
|
@ -4,6 +4,48 @@
|
||||
"description": "A standard 52-card deck of playing cards.",
|
||||
"img": "cards/backs/light-soft.webp",
|
||||
"cards": [
|
||||
{
|
||||
"name": "Joker",
|
||||
"faces": [
|
||||
{
|
||||
"name": "Joker",
|
||||
"img": "cards/light-soft/joker.webp",
|
||||
"text": ""
|
||||
}
|
||||
],
|
||||
"width": 2,
|
||||
"height": 3,
|
||||
"rotation": 0,
|
||||
"type": "base",
|
||||
"value": 6,
|
||||
"suit": "clubs",
|
||||
"_id": "KK1BiXxu1gg62jvZ",
|
||||
"description": "",
|
||||
"face": 0,
|
||||
"drawn": false,
|
||||
"sort": 53,
|
||||
"flags": {},
|
||||
"back": {
|
||||
"name": "",
|
||||
"text": "",
|
||||
"img": null
|
||||
},
|
||||
"origin": "ye4k4c8ILOXk4prz",
|
||||
"system": {
|
||||
"cue": "You completely fail, in the most comical way possible.",
|
||||
"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 Clubs",
|
||||
"faces": [
|
||||
@ -536,7 +578,7 @@
|
||||
},
|
||||
"origin": "ye4k4c8ILOXk4prz",
|
||||
"system": {
|
||||
"cue": "Treasure, beyond your wildest dreams.",
|
||||
"cue": "You get exactly what you've been looking for.",
|
||||
"zone": "DECK"
|
||||
},
|
||||
"_stats": {
|
||||
|
@ -2,7 +2,7 @@
|
||||
"id": "hench",
|
||||
"title": "HENCH",
|
||||
"description": "HENCH (2025)",
|
||||
"version": "0.0.0",
|
||||
"version": "0.0.3",
|
||||
"compatibility": {
|
||||
"minimum": "12",
|
||||
"verified": "12"
|
||||
@ -33,5 +33,5 @@
|
||||
},
|
||||
"url": "https://github.com/walcutt/hench",
|
||||
"manifest": "https://raw.githubusercontent.com/walcutt/hench/refs/heads/develop/system.json",
|
||||
"download": "https://github.com/walcutt/hench/archive/refs/tags/0.0.2.zip"
|
||||
"download": "https://github.com/walcutt/hench/archive/refs/tags/0.0.3.zip"
|
||||
}
|
19
todo.md
19
todo.md
@ -1,18 +1 @@
|
||||
- [x] Define Move Model
|
||||
- [x] Define Hench Model
|
||||
- [x] Define Boss Model
|
||||
- [x] Define Prompt Model (DEFUNCT)
|
||||
- [] Define Storyline Model
|
||||
- [] ? Define Table Model
|
||||
- [x] Implement baseline hench sheet
|
||||
- [x] Implement baseline boss sheet
|
||||
- [x] Design Hench sheet
|
||||
- [x] Design Boss sheet
|
||||
- [x] Implement Hench sheet
|
||||
- [x] Implement Boss sheet
|
||||
- [x] Add deck page
|
||||
- [x] Allow drawing, playing, discarding cards
|
||||
- [x] Allow deck editing
|
||||
- [X] Send messages for played cards
|
||||
- [] ? Macro for stress
|
||||
- [x] Set up default data
|
||||
- [] write next todo list
|
Loading…
x
Reference in New Issue
Block a user