diff --git a/modules/pegasus-actor-sheet.js b/modules/pegasus-actor-sheet.js index f9b3110..3bc3840 100644 --- a/modules/pegasus-actor-sheet.js +++ b/modules/pegasus-actor-sheet.js @@ -222,19 +222,11 @@ export class PegasusActorSheet extends ActorSheet { sheetBody.css("height", bodyHeight); return position; } - + /* -------------------------------------------- */ - async _onDrop(event) { - let data = event.dataTransfer.getData('text/plain'); - if (data) { - let dataItem = JSON.parse( data); - let npc = game.actors.get( dataItem.id); - if ( npc ) { - this.actor.addSubActor( dataItem.id); - return; - } - } - super._onDrop(event); + async _onDropItem(event, dragData) { + let item = await PegasusUtility.searchItem( dragData) + this.actor.preprocessItem( event, item, true ) } /* -------------------------------------------- */ diff --git a/modules/pegasus-actor.js b/modules/pegasus-actor.js index 80f64a0..06167cc 100644 --- a/modules/pegasus-actor.js +++ b/modules/pegasus-actor.js @@ -255,8 +255,24 @@ export class PegasusActor extends Actor { getAttribute(attrKey) { return this.data.data.attributes[attrKey]; } - /* -------------------------------------------- */ + /* -------------------------------------------- */ + async preprocessItem( event, item, onDrop = false) { + if ( item.data.type == 'race') { + this.applyRace(item.data) + } else if ( item.data.type == 'ability') { + this.applyAbility(item.data, [], true) + await this.createEmbeddedDocuments('Item', [item.data] ) + } else { + if ( onDrop) { + await super._onDropItem(event, dragData) + } else { + await this.createEmbeddedDocuments('Item', [item.data] ) + } + } + } + + /* -------------------------------------------- */ async equipGear(equipmentId) { let item = this.data.items.find(item => item.id == equipmentId); if (item && item.data.data) { @@ -354,7 +370,7 @@ export class PegasusActor extends Actor { /* -------------------------------------------- */ async computeNRGHealth() { - if ( this.isToken) return + if ( this.isToken ) return if (this.isOwner || game.user.isGM) { let updates = {} let phyDiceValue = PegasusUtility.getDiceValue(this.data.data.statistics.phy.value) + this.data.data.secondary.health.bonus + this.data.data.statistics.phy.mod; @@ -454,12 +470,15 @@ export class PegasusActor extends Actor { } /* -------------------------------------------- */ - applyAbility(ability, updates = []) { + applyAbility(ability, updates = [], directUpdate = false) { if (ability.data.affectedstat != "notapplicable") { let stat = duplicate(this.data.data.statistics[ability.data.affectedstat]) stat.value += parseInt(ability.data.statlevelincrease) stat.mod += parseInt(ability.data.statmodifier) updates[`data.statistics.${ability.data.affectedstat}`] = stat + if(directUpdate) { + this.update(updates) + } } } /* -------------------------------------------- */ @@ -470,7 +489,7 @@ export class PegasusActor extends Actor { newItems.push(race); for (let ability of race.data.abilities) { - newItems.push(ability); + newItems.push(ability) this.applyAbility(ability, updates) } if (race.data.powersgained) { diff --git a/modules/pegasus-item-sheet.js b/modules/pegasus-item-sheet.js index 655ffb4..9ad76c3 100644 --- a/modules/pegasus-item-sheet.js +++ b/modules/pegasus-item-sheet.js @@ -197,16 +197,6 @@ export class PegasusItemSheet extends ItemSheet { } - /* -------------------------------------------- */ - async searchItem( dataItem) { - let item; - if (dataItem.pack) { - item = await fromUuid("Compendium."+dataItem.pack+"."+dataItem.id); - } else { - item = game.items.get(dataItem.id ) - } - return item; - } /* -------------------------------------------- */ async addAbility(event, item, dataItem) { let newItem = duplicate(item.data); @@ -362,7 +352,7 @@ export class PegasusItemSheet extends ItemSheet { let data = event.dataTransfer.getData('text/plain'); if (data) { let dataItem = JSON.parse( data ); - let item = await this.searchItem( dataItem); + let item = await PegasusUtility.searchItem( dataItem); if ( item.data.type == 'specialisation') { return this.addEffectSpec( event, item, dataItem); } @@ -373,7 +363,7 @@ export class PegasusItemSheet extends ItemSheet { let data = event.dataTransfer.getData('text/plain'); if (data) { let dataItem = JSON.parse( data ); - let item = await this.searchItem( dataItem); + let item = await PegasusUtility.searchItem( dataItem); if ( item.data.type == 'ability') { return this.addAbility( event, item, dataItem); } @@ -387,7 +377,7 @@ export class PegasusItemSheet extends ItemSheet { let data = event.dataTransfer.getData('text/plain'); if (data) { let dataItem = JSON.parse( data ); - let item = await this.searchItem( dataItem); + let item = await PegasusUtility.searchItem( dataItem); if ( item.data.type == 'specialisation') { return this.addPerkSpecialisation( event, item, dataItem); } @@ -398,7 +388,7 @@ export class PegasusItemSheet extends ItemSheet { let data = event.dataTransfer.getData('text/plain'); if (data) { let dataItem = JSON.parse( data ); - let item = await this.searchItem( dataItem); + let item = await PegasusUtility.searchItem( dataItem); if ( item.data.type == 'power') { return this.addPower( event, item, dataItem); } @@ -408,7 +398,7 @@ export class PegasusItemSheet extends ItemSheet { let data = event.dataTransfer.getData('text/plain'); if (data) { let dataItem = JSON.parse( data ); - let item = await this.searchItem( dataItem); + let item = await PegasusUtility.searchItem( dataItem); if ( item.data.type == 'power') { return this.addAbilityPower( event, item, dataItem); } @@ -425,7 +415,7 @@ export class PegasusItemSheet extends ItemSheet { let data = event.dataTransfer.getData('text/plain'); if (data) { let dataItem = JSON.parse( data ); - let item = await this.searchItem( dataItem); + let item = await PegasusUtility.searchItem( dataItem); if ( item.data.type == 'specialisation') { return this.addRoleSpecialisation( event, item, dataItem); } diff --git a/modules/pegasus-main.js b/modules/pegasus-main.js index 2a112e2..76bdf04 100644 --- a/modules/pegasus-main.js +++ b/modules/pegasus-main.js @@ -15,6 +15,7 @@ import { PegasusNPCSheet } from "./pegasus-npc-sheet.js"; import { PegasusUtility } from "./pegasus-utility.js"; import { PegasusCombat } from "./pegasus-combat.js"; import { PegasusItem } from "./pegasus-item.js"; +import { PegasusToken } from "./pegasus-token.js"; /* -------------------------------------------- */ /* Foundry VTT Initialization */ @@ -52,9 +53,10 @@ Hooks.once("init", async function () { /* -------------------------------------------- */ // Define custom Entity classes - CONFIG.Combat.documentClass = PegasusCombat; - CONFIG.Actor.documentClass = PegasusActor; - CONFIG.Item.documentClass = PegasusItem; + CONFIG.Combat.documentClass = PegasusCombat + CONFIG.Actor.documentClass = PegasusActor + CONFIG.Item.documentClass = PegasusItem + //CONFIG.Token.objectClass = PegasusToken game.system.pegasus = { }; /* -------------------------------------------- */ diff --git a/modules/pegasus-token.js b/modules/pegasus-token.js new file mode 100644 index 0000000..e4c96aa --- /dev/null +++ b/modules/pegasus-token.js @@ -0,0 +1,6 @@ +import { PegasusUtility } from "./pegasus-utility.js"; + +/* -------------------------------------------- */ +export class PegasusToken extends Token { + +} diff --git a/modules/pegasus-utility.js b/modules/pegasus-utility.js index e3c906c..2971d1b 100644 --- a/modules/pegasus-utility.js +++ b/modules/pegasus-utility.js @@ -17,6 +17,10 @@ export class PegasusUtility { Hooks.on("getCombatTrackerEntryContext", (html, options) => { PegasusUtility.pushInitiativeOptions(html, options); }); + Hooks.on("dropCanvasData", (canvas, data) => { + PegasusUtility.dropItemOnToken(canvas, data) + }); + this.rollDataStore = {} this.defenderStore = {} this.diceList = []; @@ -34,14 +38,14 @@ export class PegasusUtility { }); Handlebars.registerHelper('notEmpty', function (list) { return list.length > 0; - }); + }); } /* -------------------------------------------- */ static pushInitiativeOptions(html, options) { console.log('Option pushed....') - options.push( { name: "Apply -10", condition: true, icon: '', callback: target => { PegasusCombat.decInitBy10(target.data('combatant-id'), -10); } } ) + options.push({ name: "Apply -10", condition: true, icon: '', callback: target => { PegasusCombat.decInitBy10(target.data('combatant-id'), -10); } }) } /* -------------------------------------------- */ @@ -55,6 +59,27 @@ export class PegasusUtility { this.specs = specs.map(i => i.toObject()); } + /* -------------------------------------------- */ + static async dropItemOnToken(canvas, data) { + if (data.type != "Item") { + return + } + + const position = canvas.grid.getTopLeft(data.x, data.y) + let x = position[0] + let y = position[1] + const tokensList = [...canvas.tokens.placeables] + for(let token of tokensList) { + if ( x >= token.x && x <= (token.x + token.width) + && y >= token.y && y <= (token.y + token.height) ) { + let item = await this.searchItem(data) + token.actor.preprocessItem("none", item, false ) + console.log("Dropped !!!", item, token) + return + } + } + } + /* -------------------------------------------- */ static async loadCompendiumData(compendium) { const pack = game.packs.get(compendium); @@ -152,7 +177,6 @@ export class PegasusUtility { const templatePaths = [ 'systems/fvtt-pegasus-rpg/templates/editor-notes-gm.html', - 'systems/fvtt-pegasus-rpg/templates/partial-roll-common-dices.html', 'systems/fvtt-pegasus-rpg/templates/partial-roll-select-effects.html', 'systems/fvtt-pegasus-rpg/templates/partial-options-statistics.html', 'systems/fvtt-pegasus-rpg/templates/partial-options-level.html', @@ -449,8 +473,8 @@ export class PegasusUtility { } // Init stuf if (rollData.isInit) { - let combat = game.combats.get( rollData.combatId) - combat.updateEmbeddedDocuments("Combatant", [ { _id: rollData.combatantId, initiative: rollData.finalScore } ]); + let combat = game.combats.get(rollData.combatId) + combat.updateEmbeddedDocuments("Combatant", [{ _id: rollData.combatantId, initiative: rollData.finalScore }]); } // And save the roll this.saveRollData(rollData); @@ -539,6 +563,17 @@ export class PegasusUtility { game.socket.emit("system.fvtt-weapons-of-the-gods", { msg: "msg_gm_chat_message", data: chatGM }); } + /* -------------------------------------------- */ + static async searchItem(dataItem) { + let item; + if (dataItem.pack) { + item = await fromUuid("Compendium." + dataItem.pack + "." + dataItem.id); + } else { + item = game.items.get(dataItem.id) + } + return item; + } + /* -------------------------------------------- */ static split3Columns(data) { @@ -580,7 +615,7 @@ export class PegasusUtility { /* -------------------------------------------- */ static getBasicRollData() { - let rollData = { + let rollData = { rollId: randomID(16), rollMode: game.settings.get("core", "rollMode"), bonusDicesLevel: 0, @@ -592,7 +627,7 @@ export class PegasusUtility { armorsList: [], weaponsList: [], equipmentsList: [], - optionsDiceList: PegasusUtility.getOptionsDiceList() + optionsDiceList: PegasusUtility.getOptionsDiceList() } PegasusUtility.updateWithTarget(rollData) return rollData diff --git a/system.json b/system.json index 05e5355..06c83e9 100644 --- a/system.json +++ b/system.json @@ -183,6 +183,6 @@ "templateVersion": 64, "title": "Pegasus RPG", "url": "https://www.uberwald.me/data/files/fvtt-pegasus-rpg", - "version": "0.2.7", + "version": "0.3.0", "background" : "./images/ui/pegasus_welcome_page.webp" }