diff --git a/modules/pegasus-actor-sheet.js b/modules/pegasus-actor-sheet.js index 7d79568..6cee296 100644 --- a/modules/pegasus-actor-sheet.js +++ b/modules/pegasus-actor-sheet.js @@ -104,11 +104,16 @@ export class PegasusActorSheet extends ActorSheet { const li = $(ev.currentTarget).parents(".item"); PegasusUtility.confirmDelete(this, li); }); - - html.find('.park-round-count').change(ev => { + + html.find('.effect-used').click(ev => { const li = $(ev.currentTarget).parents(".item"); let itemId = li.data("item-id"); - this.actor.updatePerkRounds( itemId, Number(event.currentTarget.value)) + this.actor.perkEffectUsed( itemId) + }); + html.find('.perk-status').change(ev => { + const li = $(ev.currentTarget).parents(".item"); + let itemId = li.data("item-id"); + this.actor.updatePerkStatus( itemId, ev.currentTarget.value) }); html.find('.subactor-edit').click(ev => { diff --git a/modules/pegasus-actor.js b/modules/pegasus-actor.js index aa2ce23..7b7e5fc 100644 --- a/modules/pegasus-actor.js +++ b/modules/pegasus-actor.js @@ -343,10 +343,98 @@ export class PegasusActor extends Actor { } /* -------------------------------------------- */ - updatePerkRounds(itemId, roundValue) { + async perkEffectUsed( itemId) { + let effect = this.items.get(itemId) + if (effect) { + PegasusUtility.createChatWithRollMode(effect.name, { + content: await renderTemplate(`systems/fvtt-pegasus-rpg/templates/chat-effect-used.html`, effect.data) + }); + + this.deleteEmbeddedDocuments('Item', [ effect.id] ) + } + } + + /* -------------------------------------------- */ + async updatePerkStatus(itemId, status) { let item = this.items.get(itemId) if (item) { - this.updateEmbeddedDocuments('Item', [{ _id: item.id, 'data.roundcount': roundValue }]); + + if (item.data.data.status == status) return;// Ensure we are really changing the status + + let updateOK = true + if ( status == "ready") { + let effects = [] + for( let item of this.data.items) { + if ( item.type == "effect" && item.data.data.perkId == itemId) { + effects.push( item.id) + } + } + if ( effects.length) { + await this.deleteEmbeddedDocuments('Item', effects ) + } + if ( item.data.data.features.nrgcost.flag ) { + let nrg = duplicate(this.data.data.nrg) + nrg.activated -= item.data.data.features.nrgcost.value + this.update( {'data.nrg': nrg } ) + } + if (item.data.data.features.bonushealth.flag) { + let health = duplicate(this.data.data.secondary.health) + health.bonus -= item.data.data.features.bonushealth.value + this.update( {'data.secondary.health': health } ) + } + if (item.data.data.features.bonusdelirium.flag) { + let delirium = duplicate(this.data.data.delirium.delirium) + delirium.bonus -= item.data.data.features.bonusdelirium.value + this.update( {'data.secondary.delirium': delirium } ) + } + if (item.data.data.features.bonusnrg.flag) { + let nrg = duplicate(this.data.data.nrg) + nrg.mod -= item.data.data.features.bonusnrg.value + this.update( {'data.nrg': nrg } ) + } + } + if ( status == "activated") { + // Add effects linked to the perk + let effects = [] + for( let effect of item.data.data.effectsgained) { + effect.data.perkId = itemId // Link to the perk, in order to dynamically remove them + effect.data.isUsed = false // Flag to indicate removal when used in a roll window + effects.push( effect ) + } + if ( effects.length) { + await this.createEmbeddedDocuments('Item', effects ) + } + // Manage additional flags + if ( item.data.data.features.nrgcost.flag ) { + if (this.data.data.nrg.value >= item.data.data.features.nrgcost.value) { + let nrg = duplicate(this.data.data.nrg) + nrg.activated += item.data.data.features.nrgcost.value + nrg.value -= item.data.data.features.nrgcost.value + this.update( {'data.nrg': nrg } ) + } else { + updateOK = false + ui.notifications.warn("Not enough NRG to activate the Perk " + item.name) + } + } + if (item.data.data.features.bonushealth.flag) { + let health = duplicate(this.data.data.secondary.health) + health.bonus += item.data.data.features.bonushealth.value + this.update( {'data.secondary.health': health } ) + } + if (item.data.data.features.bonusdelirium.flag) { + let delirium = duplicate(this.data.data.delirium.delirium) + delirium.bonus += item.data.data.features.bonusdelirium.value + this.update( {'data.secondary.delirium': delirium } ) + } + if (item.data.data.features.bonusnrg.flag) { + let nrg = duplicate(this.data.data.nrg) + nrg.mod += item.data.data.features.bonusnrg.value + this.update( {'data.nrg': nrg } ) + } + } + if (updateOK) { + this.updateEmbeddedDocuments('Item', [{ _id: item.id, 'data.status': status }]) + } } } diff --git a/modules/pegasus-item-sheet.js b/modules/pegasus-item-sheet.js index 177d9f8..bf33645 100644 --- a/modules/pegasus-item-sheet.js +++ b/modules/pegasus-item-sheet.js @@ -88,7 +88,6 @@ export class PegasusItemSheet extends ItemSheet { /* -------------------------------------------- */ postItem() { - console.log(this.item); let chatData = duplicate(PegasusUtility.data(this.item)); if (this.actor) { chatData.actor = { id: this.actor.id }; @@ -105,7 +104,7 @@ export class PegasusItemSheet extends ItemSheet { }); renderTemplate('systems/fvtt-pegasus-rpg/templates/post-item.html', chatData).then(html => { - let chatOptions = WotGUtility.chatDataSetup(html); + let chatOptions = PegasusUtility.chatDataSetup(html); ChatMessage.create(chatOptions) }); } @@ -324,8 +323,7 @@ export class PegasusItemSheet extends ItemSheet { await this.object.update( { 'data.armorgained': armorArray} ); } } - - + /* -------------------------------------------- */ async addPerkSpecialisation( event, item, dataItem) { let newItem = duplicate(item.data); @@ -340,6 +338,16 @@ export class PegasusItemSheet extends ItemSheet { } } + /* -------------------------------------------- */ + async addPerkEffect( event, item, dataItem) { + let newItem = duplicate(item.data) + if ( event.toElement.className == 'drop-perk-effect') { + let effectArray = duplicate(this.object.data.data.effectsgained) + effectArray.push( newItem ) + await this.object.update( { 'data.effectsgained': effectArray} ) + } + } + /* -------------------------------------------- */ async addEffectSpec( event, item, dataItem) { let newItem = duplicate(item.data); @@ -384,13 +392,16 @@ export class PegasusItemSheet extends ItemSheet { } if (this.object.type == 'perk' ) { - let data = event.dataTransfer.getData('text/plain'); + let data = event.dataTransfer.getData('text/plain') if (data) { let dataItem = JSON.parse( data ); - let item = await PegasusUtility.searchItem( dataItem); + let item = await PegasusUtility.searchItem( dataItem) if ( item.data.type == 'specialisation') { - return this.addPerkSpecialisation( event, item, dataItem); + return this.addPerkSpecialisation( event, item, dataItem) } + if ( item.data.type == 'effect') { + return this.addPerkEffect( event, item, dataItem); + } } } diff --git a/modules/pegasus-roll-dialog.js b/modules/pegasus-roll-dialog.js index 976ffb6..28da81d 100644 --- a/modules/pegasus-roll-dialog.js +++ b/modules/pegasus-roll-dialog.js @@ -57,6 +57,7 @@ export class PegasusRollDialog extends Dialog { let effectData = effect.effect level = effectData.data.effectlevel genre = effectData.data.genre + effectData.data.isUsed = toggled if (effectData.data.bonusdice) { idVal = "#bonusDicesLevel" } diff --git a/modules/pegasus-utility.js b/modules/pegasus-utility.js index 2971d1b..0e29ff4 100644 --- a/modules/pegasus-utility.js +++ b/modules/pegasus-utility.js @@ -403,12 +403,24 @@ export class PegasusUtility { } } + /* -------------------------------------------- */ + static removeUsedPerkEffects( rollData) { + // De-actived used effects from perks + let toRem = [] + for(let effect of rollData.effectsList) { + if (effect.effect.data.perkId && effect.effect.data.isUsed) { + toRem.push( effect.effect._id) + } + } + if (toRem.length > 0) { + let actor = game.actors.get(rollData.actorId) + actor.deleteEmbeddedDocuments('Item', toRem) + } + } /* -------------------------------------------- */ static async rollPegasus(rollData) { - let actor = game.actors.get(rollData.actorId); - let dicePool = [{ name: "stat", level: 0, statmod: 0 }, { name: "spec", level: 0 }, { name: "bonus", level: 0 }, { name: "hindrance", level: 0 }, { name: "other", level: 0 }]; if (rollData.stat) { dicePool[0].level += Number(rollData.stat.value); @@ -476,6 +488,9 @@ export class PegasusUtility { let combat = game.combats.get(rollData.combatId) combat.updateEmbeddedDocuments("Combatant", [{ _id: rollData.combatantId, initiative: rollData.finalScore }]); } + + //this.removeUsedPerkEffects( rollData) // Unused for now + // And save the roll this.saveRollData(rollData); } diff --git a/styles/simple.css b/styles/simple.css index baa299e..53bab3b 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -1163,6 +1163,7 @@ ul, li { .ul-level1 { padding-left: 2rem; } +.drop-perk-effect, .drop-ability-effect, .drop-effect-specaffected, .drop-effect-spec, diff --git a/system.json b/system.json index 76992a0..f8ee8b1 100644 --- a/system.json +++ b/system.json @@ -180,9 +180,9 @@ "styles": [ "styles/simple.css" ], - "templateVersion": 66, + "templateVersion": 69, "title": "Pegasus RPG", "url": "https://www.uberwald.me/data/files/fvtt-pegasus-rpg", - "version": "0.4.0", + "version": "0.4.2", "background" : "./images/ui/pegasus_welcome_page.webp" } diff --git a/template.json b/template.json index 202167c..11afc09 100644 --- a/template.json +++ b/template.json @@ -258,6 +258,7 @@ "level": 1, "active": false, "duration": "", + "effectsgained": [], "features": { "nrgcost": { "label": "NRG cost to use", @@ -277,60 +278,6 @@ "type": "string", "value": "" }, - "gainstatdice": { - "label": "Gain Stat Dice Level to Pool", - "flag": false, - "type": "string", - "value": "" - }, - "gainspecdice": { - "label": "Gain Specialisation Dice Level", - "flag": false, - "type": "dropspec", - "value": "" - }, - "gainbonusdice": { - "label": "Gain Bonus Dice Level to Pool", - "flag": false, - "type": "string", - "value": "" - }, - "gainotherdice": { - "label": "Gain Other Dice Level", - "flag": false, - "type": "string", - "value": "" - }, - "targethindrance": { - "label": "Apply Hindrance Level to Target", - "flag": false, - "type": "string", - "value": "" - }, - "sufferindrance": { - "label": "Perk User suffers Hindrance", - "flag": false, - "type": "string", - "value": "" - }, - "affectedstat": { - "label": "Affected Stat", - "flag": false, - "type": "string", - "value": "" - }, - "affectedspec": { - "label": "Affected Specialisation", - "flag": false, - "type": "dropspec", - "value": "" - }, - "affectspecial": { - "label": "Affects Special", - "flag": false, - "type": "string", - "value": "" - }, "bonushealth": { "label": "Bonus to Health", "flag": false, @@ -348,45 +295,9 @@ "flag": false, "type": "string", "value": "" - }, - "gainmomentum": { - "label": "Gain Momentum", - "flag": false, - "type": "string", - "value": "" - }, - "applyeffect": { - "label": "Apply Effect", - "flag": false, - "type": "string", - "value": "" - }, - "removeeffect": { - "label": "Remove Effect", - "flag": false, - "type": "string", - "value": "" - }, - "specialrule": { - "label": "Special Rule", - "flag": false, - "type": "text", - "value": "" - }, - "upgrade1": { - "label": "Upgrade 1", - "flag": false, - "type": "string", - "value": "" - }, - "upgrade2": { - "label": "Upgrade 2", - "flag": false, - "type": "string", - "value": "" } }, - "roundcount": 0, + "status": "", "nbuse": "" }, "power": { diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 2ae4e0f..10ad216 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -222,6 +222,11 @@ {{upperFirst effect.data.genre}} Lvl:{{effect.data.effectlevel}} {{upper effect.data.stataffected}} + {{#if effect.data.perkId}} + Used? + {{else}} +   + {{/if}}
@@ -240,19 +245,17 @@ {{perk.name}} Lvl:{{perk.data.level}} - Rounds: - + {{#select perk.data.status}} + + + + {{/select}}
- {{#if perk.data.active}}{{else}}{{/if}}
diff --git a/templates/chat-effect-used.html b/templates/chat-effect-used.html new file mode 100644 index 0000000..f7c166e --- /dev/null +++ b/templates/chat-effect-used.html @@ -0,0 +1,7 @@ +
+

{{name}}

+ {{#if img}} + + {{/if}} +
Effect {{name}} has ben used and removed from the available effects.
+
diff --git a/templates/item-perk-sheet.html b/templates/item-perk-sheet.html index 7ed4cb9..ae57301 100644 --- a/templates/item-perk-sheet.html +++ b/templates/item-perk-sheet.html @@ -17,13 +17,13 @@
  • -
  • - + {{#select data.status}} + + + + {{/select}}
  • @@ -37,7 +37,24 @@ {{/select}} - + +
  • +
  • +
  • + +
  • + {{#each data.features as |feature key|}}
  • diff --git a/templates/post-item.html b/templates/post-item.html index 4680560..1bad9c8 100644 --- a/templates/post-item.html +++ b/templates/post-item.html @@ -3,26 +3,6 @@ {{#if img}} {{/if}} - - {{#if (eq type "weapon")}} - {{#each data.weaponstats as |weaponstat rootkey|}} - {{#if weaponstat.deleted}} - {{else}} -

    Stats for {{weaponstat.name}}

    - {{> "systems/fvtt-fragged-kingdom/templates/weapon-stats-section-tchat.html" stats=weaponstat.data.statstotal isfinal=false header=false}} - {{/if}} - {{/each}} - {{else}} - - {{#if data.statstotal}} - {{> "systems/fvtt-fragged-kingdom/templates/weapon-stats-section-tchat.html" stats=data.statstotal isfinal=false title="" header=true}} - {{else}} - {{#if data.stats}} - {{> "systems/fvtt-fragged-kingdom/templates/weapon-stats-section-tchat.html" stats=data.stats isfinal=false title="" header=true}} - {{/if}} - {{/if}} - {{/if}} - -

    Description :

    +

    Description :

    {{{data.description}}}