From c2c837b7789f86078204dbfc4298e02719e1bf8d Mon Sep 17 00:00:00 2001 From: sladecraven Date: Mon, 8 Mar 2021 22:46:33 +0100 Subject: [PATCH] Manage GM cards --- img/cards/hearth.webp | Bin 0 -> 3556 bytes img/icons/injury_generic.svg | 1 + module/actor.js | 20 ++++-- module/sos-flip-dialog.js | 24 +++---- module/sos-gm-deck.js | 124 +++++++++++++++++++++++++++++++++++ module/sos-main.js | 17 ++++- system.json | 4 +- template.json | 5 +- templates/chat-card.html | 2 + templates/gm-deck.html | 21 ++++++ 10 files changed, 193 insertions(+), 25 deletions(-) create mode 100644 img/cards/hearth.webp create mode 100644 img/icons/injury_generic.svg create mode 100644 module/sos-gm-deck.js create mode 100644 templates/chat-card.html create mode 100644 templates/gm-deck.html diff --git a/img/cards/hearth.webp b/img/cards/hearth.webp new file mode 100644 index 0000000000000000000000000000000000000000..46ece2d40707f9b29d97243db2fe6907d81c36fa GIT binary patch literal 3556 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 literal 0 HcmV?d00001 diff --git a/img/icons/injury_generic.svg b/img/icons/injury_generic.svg new file mode 100644 index 0000000..2225ed8 --- /dev/null +++ b/img/icons/injury_generic.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/module/actor.js b/module/actor.js index ab284c5..1623188 100644 --- a/module/actor.js +++ b/module/actor.js @@ -54,8 +54,12 @@ export class SoSActor extends Actor { super.prepareData(); if ( !this.cardDeck ) { - this.cardDeck = new SoSCardDeck(); - this.cardDeck.initCardDeck( this, this.data.data.internals.deck ); + if ( this.hasPlayerOwner) { + this.cardDeck = new SoSCardDeck(); + this.cardDeck.initCardDeck( this, this.data.data.internals.deck ); + } else { + this.cardDeck = game.system.sos.gmDeck; + } } this.controlScores(); } @@ -100,10 +104,14 @@ export class SoSActor extends Actor { /* -------------------------------------------- */ saveDeck( ) { let deck = { deck: duplicate(this.cardDeck.data.deck), - discard: duplicate(this.cardDeck.data.discard), - cardEdge: duplicate(this.cardDeck.data.cardEdge) - } - this.update( { 'data.internals.deck': deck }); + discard: duplicate(this.cardDeck.data.discard), + cardEdge: duplicate(this.cardDeck.data.cardEdge) + } + if ( this.hasPlayerOwner ) { + this.update( { 'data.internals.deck': deck }); + } else { + game.settings.set("foundryvtt-shadows-over-sol", "gmDeck", deck ); + } } /* -------------------------------------------- */ diff --git a/module/sos-flip-dialog.js b/module/sos-flip-dialog.js index 16a7daf..77ad360 100644 --- a/module/sos-flip-dialog.js +++ b/module/sos-flip-dialog.js @@ -89,19 +89,19 @@ export class SoSFlipDialog extends Dialog { this.updateScoreBase(); } - /* -------------------------------------------- */ - updateConsequenceBonus(event) { - this.flipData.consequencesSelected = $('#consequenceSelectBonus').val(); - let bonusConsequence = 0; - for (let consequenceId of this.flipData.consequencesSelected) { - let consequence = this.flipData.consequencesList.find( item => item._id == consequenceId); - console.log(consequence, consequenceId); - bonusConsequence += SoSUtility.getConsequenceBonus( consequence.data.severity ); - } - $('#consequence-bonus').text(bonusConsequence); - this.flipData.bonusConsequence = bonusConsequence; - this.updateScoreBase(); + /* -------------------------------------------- */ + updateConsequenceBonus(event) { + this.flipData.consequencesSelected = $('#consequenceSelectBonus').val(); + let bonusConsequence = 0; + for (let consequenceId of this.flipData.consequencesSelected) { + let consequence = this.flipData.consequencesList.find( item => item._id == consequenceId); + console.log(consequence, consequenceId); + bonusConsequence += SoSUtility.getConsequenceBonus( consequence.data.severity ); } + $('#consequence-bonus').text(bonusConsequence); + this.flipData.bonusConsequence = bonusConsequence; + this.updateScoreBase(); + } /* -------------------------------------------- */ activateListeners(html) { diff --git a/module/sos-gm-deck.js b/module/sos-gm-deck.js new file mode 100644 index 0000000..8831e87 --- /dev/null +++ b/module/sos-gm-deck.js @@ -0,0 +1,124 @@ +/* -------------------------------------------- */ +import { SoSUtility } from "./sos-utility.js"; +import { SoSCardDeck } from "./sos-card-deck.js"; + +/* -------------------------------------------- */ +export class SoSGMDeck extends Dialog { + + /* -------------------------------------------- */ + constructor(html) { + let conf = { + title: 'GM Deck Dialog', + content: html, + buttons: { + 'flip-close': { label: 'Cancel and Close', callback: html => this.onFlipClose() } + }, + default: 'flip' + }; + super(conf, { classes: ["sosdialog"], width: 640 }); + + let deckData = game.settings.get("foundryvtt-shadows-over-sol", "gmDeck" ); + if ( deckData == undefined || deckData.deck == undefined) { + deckData = {deck:[], discard: [], cardEdge:[] }; + } + + this.name = "GM Deck"; + this.GMdeck = new SoSCardDeck(); + this.GMdeck.initCardDeck( this, deckData ); + } + + /* -------------------------------------------- */ + onFlipClose() { + this.close(); + } + + /* -------------------------------------------- */ + saveDeck( ) { + let deck = { + deck: duplicate(this.GMdeck.data.deck), + discard: duplicate(this.GMdeck.data.discard), + cardEdge: duplicate(this.GMdeck.data.cardEdge) + } + game.settings.set("foundryvtt-shadows-over-sol", "gmDeck", deck ); + } + + /* -------------------------------------------- */ + async updateFlip( deckData) { + $('.view-deck').remove(); + $("#view-gm-deck").append(await this.GMdeck.getDeckHTML()); + + $('.view-edge').remove(); + $("#view-gm-edge").append(await this.GMdeck.getEdgeHTMLForFlip()); + + //this.flipData.GMdeck.drawFromDeck(); + + } + + /* -------------------------------------------- */ + async drawCard() { + let card = this.GMdeck.drawFromDeck(); + let cardPath = `systems/foundryvtt-shadows-over-sol/img/cards/${card.cardName}.webp`; + let cardData = { card: card, cardPath: cardPath }; + let html = await renderTemplate('systems/foundryvtt-shadows-over-sol/templates/chat-card.html', cardData ); + ChatMessage.create( { content: html, whisper: [ ChatMessage.getWhisperRecipients("GM") ] }); + //dialog.onFlipClose(); + } + + /* -------------------------------------------- */ + resetDeckFull( ) { + this.GMdeck.shuffleDeck(); + this.GMdeck.drawEdge( 3 ); + this.saveDeck(); + } + /* -------------------------------------------- */ + drawNewEdge( ) { + this.GMdeck.drawEdge( 1 ); + this.saveDeck(); + } + + /* -------------------------------------------- */ + discardEdge( cardName ) { + this.GMdeck.discardEdge( cardName ); + this.saveDeck(); + } + + /* -------------------------------------------- */ + resetDeck( ) { + this.GMdeck.resetDeck(); + this.saveDeck(); + } + + /* -------------------------------------------- */ + activateListeners(html) { + super.activateListeners(html); + + this.bringToTop(); + + var dialog = this; + + function onLoad() { + dialog.updateFlip(); + } + + // Setup everything onload + $(function () { onLoad(); }); + + html.find('.class-view-deck').click((event) => { + this.drawCard(); + }); + html.find('.reset-deck-full').click((event) => { + this.resetDeckFull(); + this.render(true); + }); + html.find('.draw-new-edge').click((event) => { + this.drawNewEdge(); + this.render(true); + }); + html.find('.reset-deck').click((event) => { + this.resetDeck(); + this.render(true); + }); + + } + +} \ No newline at end of file diff --git a/module/sos-main.js b/module/sos-main.js index 91f77ca..d882870 100644 --- a/module/sos-main.js +++ b/module/sos-main.js @@ -14,6 +14,7 @@ import { SoSActorSheet } from "./actor-sheet.js"; import { SoSUtility } from "./sos-utility.js"; import { SoSCombat } from "./sos-combat.js"; import { gearConverter } from "./gears_convert.js"; +import { SoSGMDeck } from "./sos-gm-deck.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -23,10 +24,24 @@ import { gearConverter } from "./gears_convert.js"; Hooks.once("init", async function () { console.log(`Initializing Shadows Over Sol System`); + /* -------------------------------------------- */ + game.settings.register("foundryvtt-shadows-over-sol", "gmDeck", { + name: "gmDeck", + scope: "world", + config: false, + type: Object + }); + + /* -------------------------------------------- */ // preload handlebars templates SoSUtility.preloadHandlebarsTemplates(); // Create useful storage space - game.system.sos = { } + let html = await renderTemplate('systems/foundryvtt-shadows-over-sol/templates/gm-deck.html', {} ); + let gmDeck = new SoSGMDeck(html); + gmDeck.render(true); + game.system.sos = { + gmDeck: gmDeck, + } /* -------------------------------------------- */ // Set an initiative formula for the system diff --git a/system.json b/system.json index 785e64a..b782801 100644 --- a/system.json +++ b/system.json @@ -2,11 +2,11 @@ "name": "foundryvtt-shadows-over-sol", "title": "Shadows over Sol", "description": "Shadows over Sol for FoundryVTT", - "version": "0.1.2", + "version": "0.1.4", "manifestPlusVersion": "1.0.0", "minimumCoreVersion": "0.7.5", "compatibleCoreVersion": "0.7.9", - "templateVersion": 17, + "templateVersion": 18, "author": "LeRatierBretonnien", "esmodules": [ "module/sos-main.js" ], "styles": ["styles/simple.css"], diff --git a/template.json b/template.json index f602ce4..81f75b3 100644 --- a/template.json +++ b/template.json @@ -1,6 +1,6 @@ { "Actor": { - "types": ["character", "npc"], + "types": ["character"], "templates": { "subactors": { "subactors": { @@ -133,9 +133,6 @@ }, "character": { "templates": [ "background", "common", "subactors" ] - }, - "npc": { - "templates": [ "background", "common" ] } }, "Item": { diff --git a/templates/chat-card.html b/templates/chat-card.html new file mode 100644 index 0000000..17acdbb --- /dev/null +++ b/templates/chat-card.html @@ -0,0 +1,2 @@ +

GM draws a card from its deck !

+ diff --git a/templates/gm-deck.html b/templates/gm-deck.html new file mode 100644 index 0000000..b904fec --- /dev/null +++ b/templates/gm-deck.html @@ -0,0 +1,21 @@ +
+ +
+
+ +
+ +
+ + +
+
+ +
+
+ +
\ No newline at end of file