From 409d7c1b91364b2723f930ee3ca89299153a0a84 Mon Sep 17 00:00:00 2001 From: walcutt Date: Thu, 26 Dec 2024 22:36:56 -0500 Subject: [PATCH] Add deck editing --- hench.mjs | 7 ++ module/sheets/hench-cards-sheet.mjs | 17 ++++ module/sheets/hench-deck-editor.mjs | 145 +++++++++++++++++++++++++++ module/sheets/hench-discard-view.mjs | 26 +++++ templates/cards/cards.hbs | 34 +++---- templates/cards/deck.hbs | 56 +++++++++++ templates/cards/view.hbs | 32 ++++++ 7 files changed, 300 insertions(+), 17 deletions(-) create mode 100644 module/sheets/hench-deck-editor.mjs create mode 100644 module/sheets/hench-discard-view.mjs create mode 100644 templates/cards/deck.hbs create mode 100644 templates/cards/view.hbs diff --git a/hench.mjs b/hench.mjs index f139194..a2aadac 100644 --- a/hench.mjs +++ b/hench.mjs @@ -64,6 +64,13 @@ Hooks.once("init", () => { }; CONFIG.Cards.documentClass = HenchCards; + // ABSOLUTE FUCKING CLUDGE: + // For some reason, the Card embedded doc in Cards is filed under "cards" and not "Card", + // And/or the lookup to create embedded documents is fucked beyond belief. + CONFIG.cards = { + documentClass: HenchCard, + }; + console.log(CONFIG); Actors.unregisterSheet('core', ActorSheet); diff --git a/module/sheets/hench-cards-sheet.mjs b/module/sheets/hench-cards-sheet.mjs index 5afb581..48043c8 100644 --- a/module/sheets/hench-cards-sheet.mjs +++ b/module/sheets/hench-cards-sheet.mjs @@ -1,4 +1,6 @@ import { CARD_ZONES } from "../cards/hench-card.mjs"; +import { HenchDeckEditor } from "./hench-deck-editor.mjs"; +import { HenchDiscardView } from "./hench-discard-view.mjs"; export class HenchCardsSheet extends CardsConfig { /** @override */ @@ -31,6 +33,11 @@ export class HenchCardsSheet extends CardsConfig { await this.document.sendCards(this.document.spread, CARD_ZONES.DECK, CONST.CARD_DRAW_MODES.BOTTOM); }); + html.find('.hench-card-action-play-held').on('click', async (event) => { + // play the card! + await this.document.sendCards(this.document.held.slice(0, 1), CARD_ZONES.DISCARD, CONST.CARD_DRAW_MODES.TOP); + }); + html.find('.hench-cards-action-draw-bottom').on('click', (event) => { if(this.document.spread.length < 5) { this.document.drawSpread(1, CONST.CARD_DRAW_MODES.BOTTOM); @@ -44,6 +51,16 @@ export class HenchCardsSheet extends CardsConfig { html.find('.hench-cards-action-return-spread').on('click', (event) => { this.document.sendCards(this.document.spread, CARD_ZONES.DECK, CONST.CARD_DRAW_MODES.BOTTOM); }); + + html.find('.hench-cards-action-edit-deck').on('click', (event) => { + const editor = new HenchDeckEditor(this.document); + editor.render(true); + }); + + html.find('.hench-cards-action-view-discard').on('click', (event) => { + const discard = new HenchDiscardView(this.document); + discard.render(true); + }); } /** @override */ diff --git a/module/sheets/hench-deck-editor.mjs b/module/sheets/hench-deck-editor.mjs new file mode 100644 index 0000000..eaa2b61 --- /dev/null +++ b/module/sheets/hench-deck-editor.mjs @@ -0,0 +1,145 @@ +import { CARD_ZONES } from "../cards/hench-card.mjs"; +import { updateField } from "../helpers/mutation-helper.mjs"; + +export class HenchDeckEditor extends CardsConfig { + /** @override */ + get template() { + return `systems/hench/templates/cards/deck.hbs`; + } + + /** @override */ + getData() { + return super.getData(); + } + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + + html.find('.hench-text-input').on('change', async (event) => { + const element = event.currentTarget; + const path = element.dataset.fieldPath; + const value = element.value; + + await updateField(this.document, path, value); + }); + + html.find('.hench-reset-deck').on('click', (event) => { + this.document.resetDeck(); + }); + + html.find('.hench-add-card').on('click', (event) => { + this.document.createEmbeddedDocuments("cards", [ + { + name: 'New Card', + faces: [ + { + name: 'New Card', + img: '', + } + ], + face: 0, + height: 3, + sort: 0, + system: { + cue: "Default cue" + } + } + ]); + }); + + html.find('.hench-card-img-input').on('click', async (event) => { + const element = event.currentTarget; + const id = element.dataset.cardId; + + const card = this.document.cards.get(id); + let face = card.currentFace; + + const filePicker = new FilePicker(); + filePicker.callback = (file) => { + face.img = file; + + const mutation = [ + { + _id: id, + faces: [ + face + ], + } + ]; + + this.document.updateCards(mutation); + }; + + const fullPath = filePicker._inferCurrentDirectory(face.img); + + filePicker.activeSource = fullPath[0]; + + await filePicker.browse(face.img); + + await filePicker.render(); + }); + + html.find('.hench-card-name-input').on('change', async (event) => { + const element = event.currentTarget; + const id = element.dataset.cardId; + + const value = element.value; + const subPath = element.dataset.field; + + const card = this.document.cards.get(id); + let face = card.currentFace; + face.name = value; + + const mutation = [ + { + _id: id, + faces: [face], + } + ]; + + await this.document.updateCards(mutation); + }); + + html.find('.hench-card-text-input').on('change', async (event) => { + const element = event.currentTarget; + const id = element.dataset.cardId; + + const value = element.value; + const subPath = element.dataset.field; + + const mutation = [ + { + _id: id, + [subPath]: value, + } + ]; + + await this.document.updateCards(mutation); + }); + + html.find('.hench-card-hold-button').on('click', (event) => { + const element = event.currentTarget; + const id = element.dataset.cardId; + + const card = this.document.cards.get(id); + + this.document.sendCards([card], CARD_ZONES.HELD); + }); + + html.find('.hench-card-delete-button').on('click', async (event) => { + const element = event.currentTarget; + const id = element.dataset.cardId; + + await this.document.deleteEmbeddedDocuments("cards", [id]); + await this.document.realignSorting(); + }); + } + + /** @override */ + static get defaultOptions() { + let opts = super.defaultOptions; + + return opts; + } +} \ No newline at end of file diff --git a/module/sheets/hench-discard-view.mjs b/module/sheets/hench-discard-view.mjs new file mode 100644 index 0000000..1197086 --- /dev/null +++ b/module/sheets/hench-discard-view.mjs @@ -0,0 +1,26 @@ +import { CARD_ZONES } from "../cards/hench-card.mjs"; +import { updateField } from "../helpers/mutation-helper.mjs"; + +export class HenchDiscardView extends CardsConfig { + /** @override */ + get template() { + return `systems/hench/templates/cards/view.hbs`; + } + + /** @override */ + getData() { + return super.getData(); + } + + /** @override */ + activateListeners(html) { + super.activateListeners(html); + } + + /** @override */ + static get defaultOptions() { + let opts = super.defaultOptions; + + return opts; + } +} \ No newline at end of file diff --git a/templates/cards/cards.hbs b/templates/cards/cards.hbs index 5ee248b..1fbaaa7 100644 --- a/templates/cards/cards.hbs +++ b/templates/cards/cards.hbs @@ -13,40 +13,40 @@ {{/topCard}}
-
- +
+ Draw
-
- - View deck +
+ + Edit deck
-
- +
+ Draw from Bottom
-
- {{#topCard document "HELD"}} - - {{/topCard}} + {{#topCard document "HELD"}} +
+
+ {{/topCard}}
-
- +
+ Reset
-
- +
+ View discard
-
- +
+ Return Spread
diff --git a/templates/cards/deck.hbs b/templates/cards/deck.hbs new file mode 100644 index 0000000..9cee4af --- /dev/null +++ b/templates/cards/deck.hbs @@ -0,0 +1,56 @@ +
+
+
+
+
+ + +
+
+
+ Shuffle Cards +
+
+ + Card +
+
+
+
+
+
+ Deck +
+
+ {{#each document.deck}} +
+
+ +
+
+
+ + +
+
+ + +
+
+
+
+
+ Hold +
+
+ Delete +
+
+
+
+ {{/each}} +
+
+
+
\ No newline at end of file diff --git a/templates/cards/view.hbs b/templates/cards/view.hbs new file mode 100644 index 0000000..31546dc --- /dev/null +++ b/templates/cards/view.hbs @@ -0,0 +1,32 @@ +
+
+
+
+
+
+ Discard +
+
+ {{#each document.discard}} +
+
+ +
+
+
+ + {{this.name}} +
+
+ + {{this.system.cue}} +
+
+
+ {{/each}} +
+
+
+
\ No newline at end of file