From eb8708526c6a55f430b3c4473a040685ca3f3f4e Mon Sep 17 00:00:00 2001 From: sladecraven Date: Tue, 16 Aug 2022 22:29:27 +0200 Subject: [PATCH] v10 migration --- modules/crucible-actor-sheet.js | 17 +- modules/crucible-actor.js | 215 +++++++++++---------- modules/crucible-item-sheet.js | 25 +-- modules/crucible-utility.js | 89 ++++----- packs/weapons.db | 64 +++--- system.json | 56 +++--- template.json | 1 + templates/actor-sheet.html | 68 +++---- templates/chat-attack-defense-result.html | 2 +- templates/item-armor-sheet.html | 16 +- templates/item-condition-sheet.html | 2 +- templates/item-equipment-sheet.html | 6 +- templates/item-feat-sheet.html | 6 +- templates/item-money-sheet.html | 4 +- templates/item-shield-sheet.html | 8 +- templates/item-skill-sheet.html | 30 +-- templates/item-spell-sheet.html | 6 +- templates/item-weapon-sheet.html | 22 +-- templates/partial-actor-ability-block.html | 2 +- templates/partial-actor-equipment.html | 10 +- templates/partial-actor-status.html | 4 +- templates/partial-item-description.html | 2 +- 22 files changed, 326 insertions(+), 329 deletions(-) diff --git a/modules/crucible-actor-sheet.js b/modules/crucible-actor-sheet.js index c96ca4d..a5b7353 100644 --- a/modules/crucible-actor-sheet.js +++ b/modules/crucible-actor-sheet.js @@ -24,16 +24,15 @@ export class CrucibleActorSheet extends ActorSheet { /* -------------------------------------------- */ async getData() { - const objectData = CrucibleUtility.data(this.object); - - let actorData = duplicate(CrucibleUtility.templateData(this.object)); + const objectData = this.object.system + let actorData = duplicate(objectData) let formData = { title: this.title, - id: objectData.id, - type: objectData.type, - img: objectData.img, - name: objectData.name, + id: this.actor.id, + type: this.actor.type, + img: this.actor.img, + name: this.actor.name, editable: this.isEditable, cssClass: this.isEditable ? "editable" : "locked", data: actorData, @@ -200,9 +199,9 @@ export class CrucibleActorSheet extends ActorSheet { /* -------------------------------------------- */ async _onDropItem(event, dragData) { console.log(">>>>>> DROPPED!!!!") - let item = await CrucibleUtility.searchItem( dragData) + const item = fromUuidSync(dragData.uuid) if (item == undefined) { - item = this.actor.items.get( dragData.data._id ) + item = this.actor.items.get( item.id ) } let ret = await this.actor.preprocessItem( event, item, true ) if ( ret ) { diff --git a/modules/crucible-actor.js b/modules/crucible-actor.js index 6d67b7d..823aea9 100644 --- a/modules/crucible-actor.js +++ b/modules/crucible-actor.js @@ -63,22 +63,22 @@ export class CrucibleActor extends Actor { /* -------------------------------------------- */ computeHitPoints() { - let hp = duplicate(this.data.data.secondary.hp) - let max = (this.data.data.abilities.str.value + this.data.data.abilities.con.value) * 6 + let hp = duplicate(this.system.secondary.hp) + let max = (this.system.abilities.str.value + this.system.abilities.con.value) * 6 if (max != hp.max || hp.value > max) { hp.max = max hp.value = max // Init case - this.update({ 'data.secondary.hp': hp }) + this.update({ 'system.secondary.hp': hp }) } } /* -------------------------------------------- */ computeEffortPoints() { - let effort = duplicate(this.data.data.secondary.effort) - let max = (this.data.data.abilities.con.value + this.data.data.abilities.int.value) * 6 + let effort = duplicate(this.system.secondary.effort) + let max = (this.system.abilities.con.value + this.system.abilities.int.value) * 6 if (max != effort.max || effort.value > max) { effort.max = max effort.value = max // Init case - this.update({ 'data.secondary.effort': effort }) + this.update({ 'system.secondary.effort': effort }) } } @@ -86,7 +86,7 @@ export class CrucibleActor extends Actor { prepareDerivedData() { if (this.type == 'character' || game.user.isGM) { - this.data.data.encCapacity = this.getEncumbranceCapacity() + this.system.encCapacity = this.getEncumbranceCapacity() this.buildContainerTree() this.computeHitPoints() this.computeEffortPoints() @@ -108,46 +108,46 @@ export class CrucibleActor extends Actor { /* -------------------------------------------- */ getMoneys() { - let comp = this.data.items.filter(item => item.type == 'money'); + let comp = this.items.filter(item => item.type == 'money'); CrucibleUtility.sortArrayObjectsByName(comp) return comp; } /* -------------------------------------------- */ getFeats() { - let comp = duplicate(this.data.items.filter(item => item.type == 'feat') || []); + let comp = duplicate(this.items.filter(item => item.type == 'feat') || []); CrucibleUtility.sortArrayObjectsByName(comp) return comp; } /* -------------------------------------------- */ getFeatsWithDie() { - let comp = duplicate(this.data.items.filter(item => item.type == 'feat' && item.data.data.isfeatdie) || []); + let comp = duplicate(this.items.filter(item => item.type == 'feat' && item.system.isfeatdie) || []); CrucibleUtility.sortArrayObjectsByName(comp) return comp; } getFeatsWithSL() { - let comp = duplicate(this.data.items.filter(item => item.type == 'feat' && item.data.data.issl) || []); + let comp = duplicate(this.items.filter(item => item.type == 'feat' && item.system.issl) || []); CrucibleUtility.sortArrayObjectsByName(comp) return comp; } /* -------------------------------------------- */ getLore() { - let comp = duplicate(this.data.items.filter(item => item.type == 'spell') || []); + let comp = duplicate(this.items.filter(item => item.type == 'spell') || []); CrucibleUtility.sortArrayObjectsByName(comp) return comp; } getEquippedWeapons() { - let comp = duplicate(this.data.items.filter(item => item.type == 'weapon' && item.data.data.equipped) || []); + let comp = duplicate(this.items.filter(item => item.type == 'weapon' && item.system.equipped) || []); CrucibleUtility.sortArrayObjectsByName(comp) return comp; } /* -------------------------------------------- */ getArmors() { - let comp = duplicate(this.data.items.filter(item => item.type == 'armor') || []); + let comp = duplicate(this.items.filter(item => item.type == 'armor') || []); CrucibleUtility.sortArrayObjectsByName(comp) return comp; } getEquippedArmor() { - let comp = this.data.items.find(item => item.type == 'armor' && item.data.data.equipped) + let comp = this.items.find(item => item.type == 'armor' && item.system.equipped) if (comp) { return duplicate(comp) } @@ -155,12 +155,12 @@ export class CrucibleActor extends Actor { } /* -------------------------------------------- */ getShields() { - let comp = duplicate(this.data.items.filter(item => item.type == 'shield') || []); + let comp = duplicate(this.items.filter(item => item.type == 'shield') || []); CrucibleUtility.sortArrayObjectsByName(comp) return comp; } getEquippedShield() { - let comp = this.data.items.find(item => item.type == 'shield' && item.data.data.equipped) + let comp = this.items.find(item => item.type == 'shield' && item.system.equipped) if (comp) { return duplicate(comp) } @@ -168,7 +168,7 @@ export class CrucibleActor extends Actor { } /* -------------------------------------------- */ getRace() { - let race = this.data.items.filter(item => item.type == 'race') + let race = this.items.filter(item => item.type == 'race') return race[0] ?? []; } /* -------------------------------------------- */ @@ -185,25 +185,22 @@ export class CrucibleActor extends Actor { /* -------------------------------------------- */ getWeapons() { - let comp = duplicate(this.data.items.filter(item => item.type == 'weapon') || []); + let comp = duplicate(this.items.filter(item => item.type == 'weapon') || []); CrucibleUtility.sortArrayObjectsByName(comp) return comp; } /* -------------------------------------------- */ getItemById(id) { - let item = this.data.items.find(item => item.id == id); + let item = this.items.find(item => item.id == id); if (item) { item = duplicate(item) - if (item.type == 'specialisation') { - item.data.dice = CrucibleUtility.getDiceFromLevel(item.data.level); - } } return item; } /* -------------------------------------------- */ getSkills() { - let comp = duplicate(this.data.items.filter(item => item.type == 'skill') || []) + let comp = duplicate(this.items.filter(item => item.type == 'skill') || []) for (let skill of comp) { CrucibleUtility.updateSkill(skill) } @@ -213,30 +210,30 @@ export class CrucibleActor extends Actor { /* -------------------------------------------- */ getRelevantAbility(statKey) { - let comp = duplicate(this.data.items.filter(item => item.type == 'skill' && item.data.data.ability == ability) || []); + let comp = duplicate(this.items.filter(item => item.type == 'skill' && item.system.ability == ability) || []); return comp; } /* -------------------------------------------- */ async equipItem(itemId) { - let item = this.data.items.find(item => item.id == itemId) - if (item && item.data.data) { + let item = this.items.find(item => item.id == itemId) + if (item && item.system) { if (item.type == "armor") { - let armor = this.data.items.find(item => item.id != itemId && item.type == "armor" && item.data.data.equipped) + let armor = this.items.find(item => item.id != itemId && item.type == "armor" && item.system.equipped) if (armor) { ui.notifications.warn("You already have an armor equipped!") return } } if (item.type == "shield") { - let shield = this.data.items.find(item => item.id != itemId && item.type == "shield" && item.data.data.equipped) + let shield = this.items.find(item => item.id != itemId && item.type == "shield" && item.system.equipped) if (shield) { ui.notifications.warn("You already have a shield equipped!") return } } - let update = { _id: item.id, "data.equipped": !item.data.data.equipped }; + let update = { _id: item.id, "system.equipped": !item.system.equipped }; await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity } } @@ -254,11 +251,11 @@ export class CrucibleActor extends Actor { /* ------------------------------------------- */ getEquipments() { - return this.data.items.filter(item => item.type == 'shield' || item.type == 'armor' || item.type == "weapon" || item.type == "equipment"); + return this.items.filter(item => item.type == 'shield' || item.type == 'armor' || item.type == "weapon" || item.type == "equipment"); } /* ------------------------------------------- */ getEquipmentsOnly() { - return duplicate(this.data.items.filter(item => item.type == "equipment") || []) + return duplicate(this.items.filter(item => item.type == "equipment") || []) } /* ------------------------------------------- */ @@ -267,33 +264,33 @@ export class CrucibleActor extends Actor { reflex: { "label": "Reflex Save", "img": "systems/fvtt-crucible-rpg/images/icons/saves/reflex_save.webp", - "value": this.data.data.abilities.agi.value + this.data.data.abilities.wit.value + "value": this.system.abilities.agi.value + this.system.abilities.wit.value }, fortitude: { "label": "Fortitude Save", "img": "systems/fvtt-crucible-rpg/images/icons/saves/fortitude_save.webp", - "value": this.data.data.abilities.str.value + this.data.data.abilities.con.value + "value": this.system.abilities.str.value + this.system.abilities.con.value }, willpower: { "label": "Willpower Save", "img": "systems/fvtt-crucible-rpg/images/icons/saves/will_save.webp", - "value": this.data.data.abilities.int.value + this.data.data.abilities.cha.value + "value": this.system.abilities.int.value + this.system.abilities.cha.value } } } /* ------------------------------------------- */ async buildContainerTree() { - let equipments = duplicate(this.data.items.filter(item => item.type == "equipment") || []) + let equipments = duplicate(this.items.filter(item => item.type == "equipment") || []) for (let equip1 of equipments) { - if (equip1.data.iscontainer) { - equip1.data.contents = [] - equip1.data.contentsEnc = 0 + if (equip1.system.iscontainer) { + equip1.system.contents = [] + equip1.system.contentsEnc = 0 for (let equip2 of equipments) { - if (equip1._id != equip2._id && equip2.data.containerid == equip1._id) { - equip1.data.contents.push(equip2) - let q = equip2.data.quantity ?? 1 - equip1.data.contentsEnc += q * equip2.data.weight + if (equip1._id != equip2.id && equip2.system.containerid == equip1.id) { + equip1.system.contents.push(equip2) + let q = equip2.system.quantity ?? 1 + equip1.system.contentsEnc += q * equip2.system.weight } } } @@ -303,25 +300,25 @@ export class CrucibleActor extends Actor { let enc = 0 for (let item of equipments) { //item.data.idrDice = CrucibleUtility.getDiceFromLevel(Number(item.data.idr)) - if (item.data.equipped) { - if (item.data.iscontainer) { - enc += item.data.contentsEnc - } else if (item.data.containerid == "") { - let q = item.data.quantity ?? 1 - enc += q * item.data.weight + if (item.system.equipped) { + if (item.system.iscontainer) { + enc += item.system.contentsEnc + } else if (item.system.containerid == "") { + let q = item.system.quantity ?? 1 + enc += q * item.system.weight } } } - for (let item of this.data.items) { // Process items/shields/armors - if ((item.type == "weapon" || item.type == "shield" || item.type == "armor") && item.data.data.equipped) { - let q = item.data.data.quantity ?? 1 - enc += q * item.data.data.weight + for (let item of this.items) { // Process items/shields/armors + if ((item.type == "weapon" || item.type == "shield" || item.type == "armor") && item.system.equipped) { + let q = item.system.quantity ?? 1 + enc += q * item.system.weight } } // Store local values this.encCurrent = enc - this.containersTree = equipments.filter(item => item.data.containerid == "") // Returns the root of equipements without container + this.containersTree = equipments.filter(item => item.system.containerid == "") // Returns the root of equipements without container } @@ -338,36 +335,36 @@ export class CrucibleActor extends Actor { async incDecHP( formula ) { let dmgRoll = new Roll(formula).roll( {async: false}) await CrucibleUtility.showDiceSoNice(dmgRoll, game.settings.get("core", "rollMode")) - let hp = duplicate(this.data.data.secondary.hp) + let hp = duplicate(this.system.secondary.hp) hp.value = Number(hp.value) + Number(dmgRoll.total) - this.update( {'data.secondary.hp': hp }) + this.update( {'system.secondary.hp': hp }) return Number(dmgRoll.total) } /* -------------------------------------------- */ getAbility(abilKey) { - return this.data.data.abilities[abilKey]; + return this.system.abilities[abilKey]; } /* -------------------------------------------- */ async addObjectToContainer(itemId, containerId) { - let container = this.data.items.find(item => item.id == containerId && item.data.data.iscontainer) - let object = this.data.items.find(item => item.id == itemId) + let container = this.items.find(item => item.id == containerId && item.system.iscontainer) + let object = this.items.find(item => item.id == itemId) if (container) { - if (object.data.data.iscontainer) { + if (object.system.iscontainer) { ui.notifications.warn("Only 1 level of container allowed") return } - let alreadyInside = this.data.items.filter(item => item.data.data.containerid && item.data.data.containerid == containerId); - if (alreadyInside.length >= container.data.data.containercapacity) { + let alreadyInside = this.items.filter(item => item.system.containerid && item.system.containerid == containerId); + if (alreadyInside.length >= container.system.containercapacity) { ui.notifications.warn("Container is already full !") return } else { - await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'data.containerid': containerId }]) + await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': containerId }]) } - } else if (object && object.data.data.containerid) { // remove from container + } else if (object && object.system.containerid) { // remove from container console.log("Removeing: ", object) - await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'data.containerid': "" }]); + await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'system.containerid': "" }]); } } @@ -381,9 +378,9 @@ export class CrucibleActor extends Actor { /* -------------------------------------------- */ async equipGear(equipmentId) { - let item = this.data.items.find(item => item.id == equipmentId); - if (item && item.data.data) { - let update = { _id: item.id, "data.equipped": !item.data.data.equipped }; + let item = this.items.find(item => item.id == equipmentId); + if (item && item.system) { + let update = { _id: item.id, "system.equipped": !item.system.equipped }; await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity } } @@ -399,26 +396,26 @@ export class CrucibleActor extends Actor { /* -------------------------------------------- */ getSubActors() { let subActors = []; - for (let id of this.data.data.subactors) { + for (let id of this.system.subactors) { subActors.push(duplicate(game.actors.get(id))) } return subActors; } /* -------------------------------------------- */ async addSubActor(subActorId) { - let subActors = duplicate(this.data.data.subactors); + let subActors = duplicate(this.system.subactors); subActors.push(subActorId); - await this.update({ 'data.subactors': subActors }); + await this.update({ 'system.subactors': subActors }); } /* -------------------------------------------- */ async delSubActor(subActorId) { let newArray = []; - for (let id of this.data.data.subactors) { + for (let id of this.system.subactors) { if (id != subActorId) { newArray.push(id); } } - await this.update({ 'data.subactors': newArray }); + await this.update({ 'system.subactors': newArray }); } /* -------------------------------------------- */ @@ -429,7 +426,7 @@ export class CrucibleActor extends Actor { /* -------------------------------------------- */ getOneSkill(skillId) { - let skill = this.data.items.find(item => item.type == 'skill' && item.id == skillId) + let skill = this.items.find(item => item.type == 'skill' && item.id == skillId) if (skill) { skill = duplicate(skill); } @@ -438,13 +435,13 @@ export class CrucibleActor extends Actor { /* -------------------------------------------- */ async deleteAllItemsByType(itemType) { - let items = this.data.items.filter(item => item.type == itemType); + let items = this.items.filter(item => item.type == itemType); await this.deleteEmbeddedDocuments('Item', items); } /* -------------------------------------------- */ async addItemWithoutDuplicate(newItem) { - let item = this.data.items.find(item => item.type == newItem.type && item.name.toLowerCase() == newItem.name.toLowerCase()) + let item = this.items.find(item => item.type == newItem.type && item.name.toLowerCase() == newItem.name.toLowerCase()) if (!item) { await this.createEmbeddedDocuments('Item', [newItem]); } @@ -452,23 +449,23 @@ export class CrucibleActor extends Actor { /* -------------------------------------------- */ async incrementSkillExp(skillId, inc) { - let skill = this.data.items.get(skillId) + let skill = this.items.get(skillId) if (skill) { - await this.updateEmbeddedDocuments('Item', [{ _id: skill.id, 'data.exp': skill.data.data.exp + inc }]) + await this.updateEmbeddedDocuments('Item', [{ _id: skill.id, 'system.exp': skill.system.exp + inc }]) let chatData = { user: game.user.id, rollMode: game.settings.get("core", "rollMode"), whisper: [game.user.id].concat(ChatMessage.getWhisperRecipients('GM')), - content: `
${this.name} has gained 1 exp in the skill ${skill.name} (exp = ${skill.data.data.exp})${this.name} has gained 1 exp in the skill ${skill.name} (exp = ${skill.system.exp})= 25) { - await this.updateEmbeddedDocuments('Item', [{ _id: skill.id, 'data.exp': 0, 'data.explevel': skill.data.data.explevel + 1 }]) + if (skill.system.exp >= 25) { + await this.updateEmbeddedDocuments('Item', [{ _id: skill.id, 'system.exp': 0, 'system.explevel': skill.system.explevel + 1 }]) let chatData = { user: game.user.id, rollMode: game.settings.get("core", "rollMode"), whisper: [game.user.id].concat(ChatMessage.getWhisperRecipients('GM')), - content: `
${this.name} has gained 1 exp SL in the skill ${skill.name} (new exp SL : ${skill.data.data.explevel}) !${this.name} has gained 1 exp SL in the skill ${skill.name} (new exp SL : ${skill.system.explevel}) != 0) { - const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'data.quantity': newQ }]) // pdates one EmbeddedEntity + const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.quantity': newQ }]) // pdates one EmbeddedEntity } } } /* -------------------------------------------- */ async incDecAmmo(objetId, incDec = 0) { - let objetQ = this.data.items.get(objetId) + let objetQ = this.items.get(objetId) if (objetQ) { - let newQ = objetQ.data.data.ammocurrent + incDec; - if (newQ >= 0 && newQ <= objetQ.data.data.ammomax) { - const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'data.ammocurrent': newQ }]); // pdates one EmbeddedEntity + let newQ = objetQ.system.ammocurrent + incDec; + if (newQ >= 0 && newQ <= objetQ.system.ammomax) { + const updated = await this.updateEmbeddedDocuments('Item', [{ _id: objetQ.id, 'system.ammocurrent': newQ }]); // pdates one EmbeddedEntity } } } @@ -527,39 +524,46 @@ export class CrucibleActor extends Actor { rollAbility(abilityKey) { let rollData = this.getCommonRollData(abilityKey) rollData.mode = "ability" + if (rollData.target) { + ui.notifications.warn("You are targetting a token with a skill : please use a Weapon instead.") + return + } CrucibleUtility.rollCrucible(rollData) } /* -------------------------------------------- */ rollSkill(skillId) { - let skill = this.data.items.get(skillId) + let skill = this.items.get(skillId) if (skill) { - if (skill.data.islore && skill.data.level == 0) { + if (skill.system.islore && skill.system.level == 0) { ui.notifications.warn("You can't use Lore Skills with a SL of 0.") return } skill = duplicate(skill) CrucibleUtility.updateSkill(skill) - let abilityKey = skill.data.ability + let abilityKey = skill.system.ability let rollData = this.getCommonRollData(abilityKey) rollData.mode = "skill" rollData.skill = skill rollData.img = skill.img - + if (rollData.target) { + ui.notifications.warn("You are targetting a token with a skill : please use a Weapon instead.") + return + } this.startRoll(rollData) } } /* -------------------------------------------- */ rollWeapon(weaponId) { - let weapon = this.data.items.get(weaponId) + let weapon = this.items.get(weaponId) if (weapon) { weapon = duplicate(weapon) - let skill = this.data.items.find(item => item.name.toLowerCase() == weapon.data.skill.toLowerCase()) + let skill = this.items.find(item => item.name.toLowerCase() == weapon.system.skill.toLowerCase()) if (skill) { skill = duplicate(skill) CrucibleUtility.updateSkill(skill) - let abilityKey = skill.data.ability + let abilityKey = skill.system.ability let rollData = this.getCommonRollData(abilityKey) rollData.mode = "weapon" rollData.skill = skill @@ -575,14 +579,14 @@ export class CrucibleActor extends Actor { /* -------------------------------------------- */ rollDefenseMelee(attackRollData) { - let weapon = this.data.items.get(attackRollData.defenseWeaponId) + let weapon = this.items.get(attackRollData.defenseWeaponId) if (weapon) { weapon = duplicate(weapon) - let skill = this.data.items.find(item => item.name.toLowerCase() == weapon.data.skill.toLowerCase()) + let skill = this.items.find(item => item.name.toLowerCase() == weapon.system.skill.toLowerCase()) if (skill) { skill = duplicate(skill) CrucibleUtility.updateSkill(skill) - let abilityKey = skill.data.ability + let abilityKey = skill.system.ability let rollData = this.getCommonRollData(abilityKey) rollData.defenderTokenId = undefined // Cleanup rollData.mode = "weapondefense" @@ -651,12 +655,13 @@ export class CrucibleActor extends Actor { multiply = 2 } } - let diceColor = armor.data.absorprionroll + let diceColor = armor.system.absorprionroll let armorResult = await CrucibleUtility.getRollTableFromDiceColor( diceColor, false ) - let armorValue = (Number(armorResult.data.text) - reduce) * multiply + console.log("Armor log", armorResult) + let armorValue = (Number(armorResult.text) - reduce) * multiply if ( advantage || disadvantage) { let armorResult2 = await CrucibleUtility.getRollTableFromDiceColor( diceColor, false ) - let armorValue2 = (Number(armorResult2.data.text) - reduce) * multiply + let armorValue2 = (Number(armorResult2.text) - reduce) * multiply if ( advantage) { armorValue = (armorValue2 > armorValue) ? armorValue2 : armorValue messages.push(`Armor advantage - Roll 1 = ${armorValue} - Roll 2 = ${armorValue2}`) @@ -685,8 +690,10 @@ export class CrucibleActor extends Actor { let rollData = this.getCommonRollData() rollData.mode = "save" rollData.save = save - //rollData.img = skill.img - + if (rollData.target) { + ui.notifications.warn("You are targetting a token with a save roll - Not authorized.") + return + } this.startRoll(rollData) } diff --git a/modules/crucible-item-sheet.js b/modules/crucible-item-sheet.js index 5b8c9fa..2d5180c 100644 --- a/modules/crucible-item-sheet.js +++ b/modules/crucible-item-sheet.js @@ -48,19 +48,19 @@ export class CrucibleItemSheet extends ItemSheet { /* -------------------------------------------- */ async getData() { - const objectData = CrucibleUtility.data(this.object); - if ( objectData.type == "skill") { - console.log(objectData) - CrucibleUtility.updateSkill(objectData) + + if ( this.object.type == "skill") { + CrucibleUtility.updateSkill(this.object) } + let objectData = duplicate(this.object.system) - let itemData = foundry.utils.deepClone(CrucibleUtility.templateData(this.object)) + let itemData = objectData let formData = { title: this.title, id: this.id, - type: objectData.type, - img: objectData.img, - name: objectData.name, + type: this.object.type, + img: this.object.img, + name: this.object.name, editable: this.isEditable, cssClass: this.isEditable ? "editable" : "locked", weaponSkills: CrucibleUtility.getWeaponSkills(), @@ -72,7 +72,7 @@ export class CrucibleItemSheet extends ItemSheet { isGM: game.user.isGM } - this.options.editable = !(this.object.data.origin == "embeddedItem"); + this.options.editable = !(this.object.origin == "embeddedItem"); console.log("ITEM DATA", formData, this); return formData; } @@ -136,13 +136,6 @@ export class CrucibleItemSheet extends ItemSheet { this.deleteSubitem(ev); }); - html.find('.stat-choice-flag').click(ev => { - let idx = $(ev.currentTarget).data("stat-idx"); - let array = duplicate(this.object.data.data.statincreasechoice); - array[Number(idx)].flag = !array[Number(idx)].flag; - this.object.update({ "data.statincreasechoice": array }); - }); - // Update Inventory Item html.find('.item-delete').click(ev => { const li = $(ev.currentTarget).parents(".item"); diff --git a/modules/crucible-utility.js b/modules/crucible-utility.js index edc339b..89cbb4f 100644 --- a/modules/crucible-utility.js +++ b/modules/crucible-utility.js @@ -74,8 +74,8 @@ export class CrucibleUtility { static async ready() { const skills = await CrucibleUtility.loadCompendium("fvtt-crucible-rpg.skills") this.skills = skills.map(i => i.toObject()) - this.weaponSkills = duplicate(this.skills.filter(item => item.data.isweaponskill)) - this.shieldSkills = duplicate(this.skills.filter(item => item.data.isshieldskill)) + this.weaponSkills = duplicate(this.skills.filter(item => item.system.isweaponskill)) + this.shieldSkills = duplicate(this.skills.filter(item => item.system.isshieldskill)) const rollTables = await CrucibleUtility.loadCompendium("fvtt-crucible-rpg.rolltables") this.rollTables = rollTables.map(i => i.toObject()) @@ -96,56 +96,56 @@ export class CrucibleUtility { /* -------------------------------------------- */ static isArmorLight(armor) { - if (armor && (armor.data.armortype.includes("light") || armor.data.armortype.includes("clothes"))) { + if (armor && (armor.system.armortype.includes("light") || armor.system.armortype.includes("clothes"))) { return true } return false } /* -------------------------------------------- */ static isWeaponPenetrating(weapon) { - if (weapon && weapon.data.qualities.toLowerCase().includes("penetrating")) { + if (weapon && weapon.system.qualities.toLowerCase().includes("penetrating")) { return true } return false } /* -------------------------------------------- */ static isWeaponLight(weapon) { - if (weapon && weapon.data.qualities.toLowerCase().includes("light")) { + if (weapon && weapon.system.qualities.toLowerCase().includes("light")) { return true } return false } /* -------------------------------------------- */ static isWeaponHeavy(weapon) { - if (weapon && weapon.data.qualities.toLowerCase().includes("heavy")) { + if (weapon && weapon.system.qualities.toLowerCase().includes("heavy")) { return true } return false } /* -------------------------------------------- */ static isWeaponHack(weapon) { - if (weapon && weapon.data.qualities.toLowerCase().includes("hack")) { + if (weapon && weapon.system.qualities.toLowerCase().includes("hack")) { return true } return false } /* -------------------------------------------- */ static isWeaponUndamaging(weapon) { - if (weapon && weapon.data.qualities.toLowerCase().includes("undamaging")) { + if (weapon && weapon.system.qualities.toLowerCase().includes("undamaging")) { return true } return false } /* -------------------------------------------- */ static isWeaponDangerous(weapon) { - if (weapon && weapon.data.qualities.toLowerCase().includes("dangerous")) { + if (weapon && weapon.system.qualities.toLowerCase().includes("dangerous")) { return true } return false } /* -------------------------------------------- */ static isWeaponDeadly(weapon) { - if (weapon && weapon.data.qualities.toLowerCase().includes("deadly")) { + if (weapon && weapon.system.qualities.toLowerCase().includes("deadly")) { return true } return false @@ -168,7 +168,7 @@ export class CrucibleUtility { static async getCritical(level, weapon) { const pack = game.packs.get("fvtt-crucible-rpg.rolltables") - let tableName = "Crit " + level + " (" + this.upperFirst(weapon.data.damage) + ")" + let tableName = "Crit " + level + " (" + this.upperFirst(weapon.system.damage) + ")" const index = await pack.getIndex() const entry = index.find(e => e.name === tableName) let table = await pack.getDocument(entry._id) @@ -238,18 +238,6 @@ export class CrucibleUtility { return undefined; } - /* -------------------------------------------- */ - static templateData(it) { - return CrucibleUtility.data(it)?.data ?? {} - } - - /* -------------------------------------------- */ - static data(it) { - if (it instanceof Actor || it instanceof Item || it instanceof Combatant) { - return it.data; - } - return it; - } /* -------------------------------------------- */ static createDirectOptionList(min, max) { @@ -302,15 +290,16 @@ export class CrucibleUtility { /* -------------------------------------------- */ static async displayDefenseMessage(rollData) { - if (rollData.defenderTokenId) { + if (rollData.mode == "weapon" && rollData.defenderTokenId) { let defender = game.canvas.tokens.get(rollData.defenderTokenId).actor if (game.user.isGM || (game.user.character && game.user.character.id == defender.id)) { rollData.defender = defender rollData.defenderWeapons = defender.getEquippedWeapons() - rollData.isRollTarget = rollData.weapon?.data.isranged + rollData.isRollTarget = rollData.weapon?.system.isranged this.createChatWithRollMode(defender.name, { + name: defender.name, alias: defender.name, - user: defender.id, + //user: defender.id, content: await renderTemplate(`systems/fvtt-crucible-rpg/templates/chat-request-defense.html`, rollData), whisper: [defender.id].concat(ChatMessage.getWhisperRecipients('GM')), }) @@ -330,7 +319,7 @@ export class CrucibleUtility { return { result: "miss" } } if (rollData.sumSuccess == 0) { - if (rollData.attackRollData.weapon.data.isranged) { + if (rollData.attackRollData.weapon.system.isranged) { return { result: "target_space", aoe: true } } else { return { result: "clash", hack_vs_shields: true } @@ -375,7 +364,7 @@ export class CrucibleUtility { result.attackerHPLossValue = await attacker.incDecHP("-" + result.attackerHPLoss) } if (attacker && defender && result.defenderDamage) { - let dmgDice = (rollData.attackRollData.weapon.data.isranged) ? "d6" : "d8" + let dmgDice = (rollData.attackRollData.weapon.system.isranged) ? "d6" : "d8" result.damageWeaponFormula = result.defenderDamage + dmgDice result.defenderHPLossValue = await defender.incDecHP("-" + result.damageWeaponFormula) } @@ -385,7 +374,7 @@ export class CrucibleUtility { if (result.critical_1 || result.critical_2) { let isDeadly = CrucibleUtility.isWeaponDeadly(rollData.attackRollData.weapon) result.critical = await this.getCritical((result.critical_1) ? "I" : "II", rollData.attackRollData.weapon ) - result.criticalText = result.critical.data.text + result.criticalText = result.critical.text } this.createChatWithRollMode(rollData.alias, { content: await renderTemplate(`systems/fvtt-crucible-rpg/templates/chat-attack-defense-result.html`, rollData) @@ -486,9 +475,9 @@ export class CrucibleUtility { /* -------------------------------------------- */ static updateSkill(skill) { - skill.data.level = skill.data.background + skill.data.basic + skill.data.class + skill.data.explevel - if (skill.data.level > 7) { skill.data.level = 7 } - skill.data.skilldice = __skillLevel2Dice[skill.data.level] + skill.system.level = skill.system.background + skill.system.basic + skill.system.class + skill.system.explevel + if (skill.system.level > 7) { skill.system.level = 7 } + skill.system.skilldice = __skillLevel2Dice[skill.system.level] } /* -------------------------------------------- */ @@ -511,28 +500,28 @@ export class CrucibleUtility { // feat => 4 // bonus => 6 if (rollData.skill) { - let level = rollData.skill.data.level - if (rollData.skill.data.issl2) { + let level = rollData.skill.system.level + if (rollData.skill.system.issl2) { rollData.hasSLBonus = true level += 2 if (level > 7) { level = 7 } } - rollData.skill.data.skilldice = __skillLevel2Dice[level] - diceFormula += "+" + String(rollData.skill.data.skilldice) + "cs>=5" + rollData.skill.system.skilldice = __skillLevel2Dice[level] + diceFormula += "+" + String(rollData.skill.system.skilldice) + "cs>=5" - if (rollData.skill.data.skilltype == "complex" && rollData.skill.data.level == 0) { + if (rollData.skill.system.skilltype == "complex" && rollData.skill.system.level == 0) { rollData.complexSkillDisadvantage = true rollData.rollAdvantage = "roll-disadvantage" } - if (rollData.skill.data.isfeatdie) { + if (rollData.skill.system.isfeatdie) { rollData.hasFeatDie = true diceFormula += "+ 1d10cs>=5" } else { diceFormula += `+ 0d10cs>=5` } - if (rollData.skill.data.bonusdice != "none") { - rollData.hasBonusDice = rollData.skill.data.bonusdice + if (rollData.skill.system.bonusdice != "none") { + rollData.hasBonusDice = rollData.skill.system.bonusdice diceFormula += `+ ${rollData.hasBonusDice}cs>=5` } else { diceFormula += `+ 0d6cs>=5` @@ -564,11 +553,11 @@ export class CrucibleUtility { // armor => 12 let skillArmorPenalty = 0 for (let armor of rollData.armors) { - if (armor.data.equipped) { - skillArmorPenalty += armor.data.skillpenalty + if (armor.system.equipped) { + skillArmorPenalty += armor.system.skillpenalty } } - if (rollData.skill && rollData.skill.data.armorpenalty && skillArmorPenalty > 0) { + if (rollData.skill && rollData.skill.system.armorpenalty && skillArmorPenalty > 0) { rollData.skillArmorPenalty = skillArmorPenalty diceFormula += `- ${skillArmorPenalty}d8cs>=5` } else { @@ -577,7 +566,7 @@ export class CrucibleUtility { // shield => 14 if (rollData.useshield && rollData.shield) { - diceFormula += "+ 1" + String(rollData.shield.data.shielddie) + "cs>=5" + diceFormula += "+ 1" + String(rollData.shield.system.shielddie) + "cs>=5" } else { diceFormula += " + 0d6cs>=5" } @@ -603,11 +592,15 @@ export class CrucibleUtility { rollData.rollOrder = 2 let myRoll2 = new Roll(diceFormula).roll({ async: false }) await this.showDiceSoNice(myRoll2, game.settings.get("core", "rollMode")) + rollData.roll = myRoll2 // Tmp switch to display the proper results + rollData.nbSuccess = myRoll2.total this.createChatWithRollMode(rollData.alias, { content: await renderTemplate(`systems/fvtt-crucible-rpg/templates/chat-generic-result.html`, rollData) }) rollData.roll = myRoll // Revert the tmp switch + rollData.nbSuccess = myRoll.total + if (rollData.rollAdvantage == "roll-advantage") { if (myRoll2.total > rollData.nbSuccess) { hasChanged = true @@ -626,10 +619,10 @@ export class CrucibleUtility { rollData.isFirstRollAdvantage = false // Manage exp - if (rollData.skill && rollData.skill.data.level > 0) { + if (rollData.skill && rollData.skill.system.level > 0) { let nbSkillSuccess = rollData.roll.terms[2].total - if (nbSkillSuccess == 0 || nbSkillSuccess == rollData.skill.data.level) { - actor.incrementSkillExp(rollData.skill._id, 1) + if (nbSkillSuccess == 0 || nbSkillSuccess == rollData.skill.system.level) { + actor.incrementSkillExp(rollData.skill.id, 1) } } @@ -665,7 +658,7 @@ export class CrucibleUtility { /* -------------------------------------------- */ static getUsers(filter) { - return game.users.filter(filter).map(user => user.data._id); + return game.users.filter(filter).map(user => user.id); } /* -------------------------------------------- */ static getWhisperRecipients(rollMode, name) { diff --git a/packs/weapons.db b/packs/weapons.db index bef95be..8d15df9 100644 --- a/packs/weapons.db +++ b/packs/weapons.db @@ -1,33 +1,33 @@ -{"_id":"3QGyPwA2H8RwtFBr","name":"Hand Axe (Thrown)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Hand%20Axe.webp","data":{"ability":"dex","isproficient":false,"qualities":"","flaws":"Light","damage":"Slashing","range":"Same Zone","maxrange":"1 Zone","minstr":0,"cost":0,"equipped":false,"description":"

Hand Axe

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"3VT9Bgs1lpFRqgWt","name":"2-H Pick","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Pick.webp","data":{"ability":"str","isproficient":false,"qualities":"Heavy,Penetrating","flaws":"","damage":"Piercing","range":"Melee","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-H Pick

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"6B8kMi1FHv5njtbD","name":"2-H Flail","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Flail.webp","data":{"ability":"agi","isproficient":false,"qualities":"Heavy,Reach,Entangle","flaws":"Dangerous","damage":"Bludgeoning","range":"Melee","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-H Flail

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"A4O9ISnyCqtckanV","name":"Dagger (Melee)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Dagger.webp","data":{"ability":"agi","isproficient":false,"qualities":"","flaws":"Light","damage":"Piercing","range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Dagger

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"Czf55rIkPBsaLLfN","name":"Hammer (Thrown)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Hammer.webp","data":{"ability":"dex","isproficient":false,"qualities":"","flaws":"","damage":"Bludgeoning","range":"Same Zone","maxrange":"1 Zone","minstr":0,"cost":0,"equipped":false,"description":"

Hammer

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"GrjekQXKaFnFODXK","name":"Unarmed","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Unarmed.webp","data":{"ability":"agi","isproficient":false,"qualities":"","flaws":"Undamaging","damage":"Bludgeoning","range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Unarmed

\n

 

\n

As an UNDAMAGING attack the maximum Result is +2.

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"JXK1qP9uqlxvcnxB","name":"2-H Club","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Club.webp","data":{"ability":"str","isproficient":false,"qualities":"","flaws":"","damage":"Bludgeoning","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

2-H Club

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"LATr6R7cNOtYJgaO","name":"Hammer (Melee)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Hammer.webp","data":{"ability":"str","isproficient":false,"qualities":"","flaws":"","damage":"Bludgeoning","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Hammer

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"MpzJvauaq7UKdyi5","name":"Sling","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Sling.webp","data":{"ability":"dex","isproficient":false,"qualities":"","flaws":"","damage":"Bludgeoning","range":"2 Zones","maxrange":"3 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Sling

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"PDXDPlqck6VURcGB","name":"2-H Axe","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Axe.webp","data":{"ability":"str","isproficient":false,"qualities":"Heavy,Hack","flaws":"","damage":"Slashing","range":"","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-H Axe

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"Q4tpJZV4HAsyVAWT","name":"2-H Mace","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Mace.webp","data":{"ability":"str","isproficient":false,"qualities":"Heavy","flaws":"","damage":"Bludgeoning","range":"Melee","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-H Mace

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"QRMIOZHBrauWQjTb","name":"Bite","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Bite.webp","data":{"ability":"agi","isproficient":false,"qualities":"","flaws":"","damage":"Piercing","range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Bite - natural weapon

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"QzJZr6guDrUjsuTU","name":"Spear (1-H)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Spear.webp","data":{"ability":"agi","isproficient":false,"qualities":"Reach","flaws":"","damage":"Piercing","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Spear

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"Sm3Pze2LY6BnoTBq","name":"Mace","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Mace.webp","data":{"ability":"str","isproficient":false,"qualities":"","flaws":"","damage":"Bludgeoning","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Mace

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"VOg1kpjhJ7h3XsSk","name":"Club","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Club.webp","data":{"ability":"str","isproficient":false,"qualities":"","flaws":"Light","damage":"Bludgeoning","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Club

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"WvqALDHVEVt6TskF","name":"Javelin","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Javelin.webp","data":{"ability":"agi","isproficient":false,"qualities":"Penetrating","flaws":"","damage":"Piercing","range":"2 Zones","maxrange":"4 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Javelin

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"XTfw2cefPXucQgMG","name":"Crossbow","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Crossbow.webp","data":{"isproficient":false,"skill":"Axe","qualities":"Penetrating","flaws":"Reload","damage":"Piercing","range":"3 Zones","maxrange":"5 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Crossbow

\n

Requires 1 Action to reload after shooting - So you can only shoot every other Action Round.

","ability":"dex"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"XUAMSiOmPHi1LEHs","name":"2-H Hammer","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Hammer.webp","data":{"ability":"str","isproficient":false,"qualities":"Heavy","flaws":"","damage":"Bludgeoning","range":"Melee","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-H Hammer

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"ZfBqMaYjg5z8Kh97","name":"Hand Axe (Melee)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Hand%20Axe.webp","data":{"ability":"str","isproficient":false,"qualities":"Hack","flaws":"Light","damage":"Slashing","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Hand Axe

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"ZoooviRlvZIQR6d2","name":"Sting","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Sting.webp","data":{"ability":"agi","isproficient":false,"qualities":"","flaws":"","damage":"Piercing","range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Sting - natural weapon

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"cC3xXzzZ8UpDGONs","name":"2-H Sword","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Sword.webp","data":{"ability":"str","isproficient":false,"qualities":"Heavy,Reach,Hack","flaws":"","damage":"Slashing","range":"Melee","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-Handed Sword

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"cMMWV7HusxfUfL4E","name":"Flail","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Flail.webp","data":{"ability":"agi","isproficient":false,"qualities":"Entangle","flaws":"Dangerous","damage":"Bludgeoning","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Flail

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"fE5cUHjc5GYGRdty","name":"Spear (Thrown)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Spear.webp","data":{"ability":"agi","isproficient":false,"qualities":"Penetrating","flaws":"","damage":"Piercing","range":"2 Zones","maxrange":"3 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Spear

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"3QGyPwA2H8RwtFBr","name":"Hand Axe (Thrown)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Hand%20Axe.webp","data":{"isproficient":false,"skill":"Weapon - Hand Axe (Thrown)","qualities":"","flaws":"Light","damage":"Slashing","isranged":true,"range":"Same Zone","maxrange":"1 Zone","minstr":0,"cost":0,"equipped":false,"description":"

Hand Axe

","ability":"dex"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"3VT9Bgs1lpFRqgWt","name":"2-H Pick","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Pick.webp","data":{"isproficient":false,"skill":"Weapon - 2-H Pick","qualities":"Heavy,Penetrating","flaws":"","damage":"Piercing","isranged":false,"range":"Melee","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-H Pick

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"6B8kMi1FHv5njtbD","name":"2-H Flail","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Flail.webp","data":{"isproficient":false,"skill":"Weapon - 2-H Flail","qualities":"Heavy,Reach,Entangle","flaws":"Dangerous","damage":"Bludgeoning","isranged":false,"range":"Melee","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-H Flail

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"A4O9ISnyCqtckanV","name":"Dagger (Melee)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Dagger.webp","data":{"isproficient":false,"skill":"Weapon - Dagger (Melee)","qualities":"","flaws":"Light","damage":"Piercing","isranged":false,"range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Dagger

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"Czf55rIkPBsaLLfN","name":"Hammer (Thrown)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Hammer.webp","data":{"isproficient":false,"skill":"Weapon - Hammer (Thrown)","qualities":"","flaws":"","damage":"Bludgeoning","isranged":true,"range":"Same Zone","maxrange":"1 Zone","minstr":0,"cost":0,"equipped":false,"description":"

Hammer

","ability":"dex"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"GrjekQXKaFnFODXK","name":"Unarmed","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Unarmed.webp","data":{"isproficient":false,"skill":"Weapon - Unarmed","qualities":"","flaws":"Undamaging","damage":"Bludgeoning","isranged":false,"range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Unarmed

\n

 

\n

As an UNDAMAGING attack the maximum Result is +2.

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"JXK1qP9uqlxvcnxB","name":"2-H Club","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Club.webp","data":{"isproficient":false,"skill":"Weapon - 2-H Club","qualities":"","flaws":"","damage":"Bludgeoning","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

2-H Club

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"LATr6R7cNOtYJgaO","name":"Hammer (Melee)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Hammer.webp","data":{"isproficient":false,"skill":"Weapon - Hammer (Melee)","qualities":"","flaws":"","damage":"Bludgeoning","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Hammer

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"MpzJvauaq7UKdyi5","name":"Sling","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Sling.webp","data":{"isproficient":false,"skill":"Weapon - Sling","qualities":"","flaws":"","damage":"Bludgeoning","isranged":true,"range":"2 Zones","maxrange":"3 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Sling

","ability":"dex"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"PDXDPlqck6VURcGB","name":"2-H Axe","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Axe.webp","data":{"isproficient":false,"skill":"Weapon - 2-H Axe","qualities":"Heavy,Hack","flaws":"","damage":"Slashing","isranged":false,"range":"","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-H Axe

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"Q4tpJZV4HAsyVAWT","name":"2-H Mace","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Mace.webp","data":{"isproficient":false,"skill":"Weapon - 2-H Hammer","qualities":"Heavy","flaws":"","damage":"Bludgeoning","isranged":false,"range":"Melee","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-H Mace

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"QRMIOZHBrauWQjTb","name":"Bite","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Bite.webp","data":{"isproficient":false,"skill":"Weapon - Bite","qualities":"","flaws":"","damage":"Piercing","isranged":false,"range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Bite - natural weapon

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"QzJZr6guDrUjsuTU","name":"Spear (1-H)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Spear.webp","data":{"isproficient":false,"skill":"Weapon - Spear (1-H)","qualities":"Reach","flaws":"","damage":"Piercing","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Spear

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"Sm3Pze2LY6BnoTBq","name":"Mace","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Mace.webp","data":{"isproficient":false,"skill":"Weapon - Mace","qualities":"","flaws":"","damage":"Bludgeoning","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Mace

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"VOg1kpjhJ7h3XsSk","name":"Club","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Club.webp","data":{"isproficient":false,"skill":"Weapon - Club","qualities":"","flaws":"Light","damage":"Bludgeoning","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Club

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"WvqALDHVEVt6TskF","name":"Javelin","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Javelin.webp","data":{"isproficient":false,"skill":"Weapon - Javelin","qualities":"Penetrating","flaws":"","damage":"Piercing","isranged":true,"range":"2 Zones","maxrange":"4 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Javelin

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"XTfw2cefPXucQgMG","name":"Crossbow","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Crossbow.webp","data":{"isproficient":false,"skill":"Weapon - Crossbow","qualities":"Penetrating","flaws":"Reload","damage":"Piercing","isranged":true,"range":"3 Zones","maxrange":"5 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Crossbow

\n

Requires 1 Action to reload after shooting - So you can only shoot every other Action Round.

","ability":"dex"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"XUAMSiOmPHi1LEHs","name":"2-H Hammer","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Hammer.webp","data":{"isproficient":false,"skill":"Weapon - 2-H Hammer","qualities":"Heavy","flaws":"","damage":"Bludgeoning","isranged":false,"range":"Melee","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-H Hammer

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"ZfBqMaYjg5z8Kh97","name":"Hand Axe (Melee)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Hand%20Axe.webp","data":{"isproficient":false,"skill":"Weapon - Hand Axe (Melee)","qualities":"Hack","flaws":"Light","damage":"Slashing","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Hand Axe

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"ZoooviRlvZIQR6d2","name":"Sting","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Sting.webp","data":{"isproficient":false,"skill":"Weapon - Sting","qualities":"","flaws":"","damage":"Piercing","isranged":false,"range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Sting - natural weapon

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"cC3xXzzZ8UpDGONs","name":"2-H Sword","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/2-H%20Sword.webp","data":{"isproficient":false,"skill":"Weapon - 2-H Sword","qualities":"Heavy,Reach,Hack","flaws":"","damage":"Slashing","isranged":false,"range":"Melee","maxrange":"","minstr":2,"cost":0,"equipped":false,"description":"

2-Handed Sword

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"cMMWV7HusxfUfL4E","name":"Flail","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Flail.webp","data":{"isproficient":false,"skill":"Weapon - Flail","qualities":"Entangle","flaws":"Dangerous","damage":"Bludgeoning","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Flail

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"fE5cUHjc5GYGRdty","name":"Spear (Thrown)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Spear.webp","data":{"isproficient":false,"skill":"Weapon - Spear (Thrown)","qualities":"Penetrating","flaws":"","damage":"Piercing","isranged":true,"range":"2 Zones","maxrange":"3 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Spear

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} {"_id":"hR0EtMiIy5ybcS84","name":"Staff (2-H)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Staff.webp","data":{"ability":"str","isproficient":false,"qualities":"Reach","flaws":"","damage":"Bludgeoning","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Staff - always used 2-handed.

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"ivLgdf33xEk9IWAW","name":"Pick","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Pick.webp","data":{"ability":"str","isproficient":false,"qualities":"Penetrating","flaws":"","damage":"Piercing","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Pick

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"lH54F6LNWMYg5dNt","name":"Claw","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Claw.webp","data":{"ability":"agi","isproficient":false,"qualities":"","flaws":"","damage":"Slashing","range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Claw - natural weapon

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"mMCl8JZboWUYZgvB","name":"Dagger (Thrown)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Dagger.webp","data":{"ability":"dex","isproficient":false,"qualities":"","flaws":"Light","damage":"Piercing","range":"1 Zone","maxrange":"2 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Dagger

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"oSBtSHos9aQvbhfm","name":"Improvised (Thrown)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Improvised-_Thrown_.webp","data":{"ability":"dex","isproficient":false,"qualities":"","flaws":"Light","damage":"Bludgeoning","range":"Same Zone","maxrange":"1 Zone","minstr":0,"cost":0,"equipped":false,"description":"

An Improvised ranged weapon such as a bottle or a rock.

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"qz2f2DO4HOZFrv2k","name":"Spear (2-H)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Spear.webp","data":{"ability":"agi","isproficient":false,"qualities":"Heavy,Reach,Penetrating","flaws":"","damage":"Piercing","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Spear, used with both hands.

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"u4vvzNFSNluNdyn0","name":"Bow","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Bow.webp","data":{"ability":"dex","isproficient":false,"qualities":"Penetrating","flaws":"","damage":"Piercing","range":"4 Zones","maxrange":"6 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Bow with arrows

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"name":"Gore","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Gore.webp","data":{"ability":"agi","isproficient":false,"qualities":"Heavy","flaws":"","damage":"Piercing","range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Horns

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{"core":{"sourceId":"Item.h3ezFIKi5PR1POfT"}},"_id":"uCxCoRfH7KwVRt8d"} -{"_id":"uJs7IdVvomKVXlV9","name":"Improvised (Melee)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Improvised.webp","data":{"ability":"agi","isproficient":false,"qualities":"","flaws":"Light","damage":"Bludgeoning","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

An Improvised melee weapon such as a broken bottle, a chair leg, or a stick.

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} -{"_id":"x6wkZiE2G2QP41S2","name":"Sword","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Sword.webp","data":{"ability":"agi","isproficient":false,"qualities":"Deadly","flaws":"","damage":"Slashing","range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Sword

"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"ivLgdf33xEk9IWAW","name":"Pick","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Pick.webp","data":{"isproficient":false,"skill":"Weapon - Pick","qualities":"Penetrating","flaws":"","damage":"Piercing","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Pick

","ability":"str"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"lH54F6LNWMYg5dNt","name":"Claw","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Claw.webp","data":{"isproficient":false,"skill":"Weapon - Claw","qualities":"","flaws":"","damage":"Slashing","isranged":false,"range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Claw - natural weapon

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"mMCl8JZboWUYZgvB","name":"Dagger (Thrown)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Dagger.webp","data":{"isproficient":false,"skill":"Weapon - Dagger (Thrown)","qualities":"","flaws":"Light","damage":"Piercing","isranged":true,"range":"1 Zone","maxrange":"2 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Dagger

","ability":"dex"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"oSBtSHos9aQvbhfm","name":"Improvised (Thrown)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Improvised-_Thrown_.webp","data":{"isproficient":false,"skill":"Weapon - Improvised (Thrown)","qualities":"","flaws":"Light","damage":"Bludgeoning","isranged":true,"range":"Same Zone","maxrange":"1 Zone","minstr":0,"cost":0,"equipped":false,"description":"

An Improvised ranged weapon such as a bottle or a rock.

","ability":"dex"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"qz2f2DO4HOZFrv2k","name":"Spear (2-H)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Spear.webp","data":{"isproficient":false,"skill":"Weapon - Spear (2-H)","qualities":"Heavy,Reach,Penetrating","flaws":"","damage":"Piercing","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Spear, used with both hands.

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"u4vvzNFSNluNdyn0","name":"Bow","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Bow.webp","data":{"isproficient":false,"skill":"Weapon - Bow","qualities":"Penetrating","flaws":"","damage":"Piercing","isranged":true,"range":"4 Zones","maxrange":"6 Zones","minstr":0,"cost":0,"equipped":false,"description":"

Bow with arrows

","ability":"dex"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"uCxCoRfH7KwVRt8d","name":"Gore","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Gore.webp","data":{"isproficient":false,"skill":"Weapon - Gore","qualities":"Heavy","flaws":"","damage":"Piercing","isranged":false,"range":"Close","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Horns

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{"core":{"sourceId":"Item.h3ezFIKi5PR1POfT"}}} +{"_id":"uJs7IdVvomKVXlV9","name":"Improvised (Melee)","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Improvised.webp","data":{"isproficient":false,"skill":"Weapon - Improvised (Melee)","qualities":"","flaws":"Light","damage":"Bludgeoning","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

An Improvised melee weapon such as a broken bottle, a chair leg, or a stick.

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} +{"_id":"x6wkZiE2G2QP41S2","name":"Sword","type":"weapon","img":"systems/fvtt-crucible-rpg/images/icons/weapons/Sword.webp","data":{"isproficient":false,"skill":"Weapon - Sword","qualities":"Deadly","flaws":"","damage":"Slashing","isranged":false,"range":"Melee","maxrange":"","minstr":0,"cost":0,"equipped":false,"description":"

Sword

","ability":"agi"},"effects":[],"folder":null,"sort":0,"permission":{"default":0,"Up3b6rNa3VKAFQC3":3},"flags":{}} diff --git a/system.json b/system.json index cb673fb..54d27e6 100644 --- a/system.json +++ b/system.json @@ -1,6 +1,7 @@ { - "author": "Uberwald", - "compatibleCoreVersion": "9", + "authors": [ + {"name": "Uberwald"} + ], "description": "Crucible RPG system for FoundryVTT", "esmodules": [ "modules/crucible-main.js" @@ -16,13 +17,11 @@ ], "library": false, "license": "LICENSE.txt", - "manifestPlusVersion": "1.0.0", "media": [], - "minimumCoreVersion": "0.8.0", "name": "fvtt-crucible-rpg", "packs": [ { - "entity": "Item", + "type": "Item", "label": "Armors", "name": "armor", "path": "./packs/armor.db", @@ -32,7 +31,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Equipments", "name": "equipment", "path": "./packs/equipment.db", @@ -42,7 +41,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Shields", "name": "shields", "path": "./packs/shields.db", @@ -52,7 +51,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Weapons", "name": "weapons", "path": "./packs/weapons.db", @@ -62,7 +61,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Conditions", "name": "conditions", "path": "./packs/conditions.db", @@ -72,7 +71,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Currency", "name": "currency", "path": "./packs/currency.db", @@ -82,7 +81,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Lore - Air", "name": "lore-air", "path": "./packs/lore-air.db", @@ -92,7 +91,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Lore - Earth", "name": "lore-earth", "path": "./packs/lore-earth.db", @@ -102,7 +101,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Lore - Fire", "name": "lore-fire", "path": "./packs/lore-fire.db", @@ -112,7 +111,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Lore - Water", "name": "lore-water", "path": "./packs/lore-water.db", @@ -122,7 +121,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Lore - Shadow", "name": "lore-shadow", "path": "./packs/lore-shadow.db", @@ -132,7 +131,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Skills", "name": "skills", "path": "./packs/skills.db", @@ -142,7 +141,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Feats", "name": "feats", "path": "./packs/feats.db", @@ -152,7 +151,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Poisons", "name": "poisons", "path": "./packs/poisons.db", @@ -162,7 +161,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Powers - Class", "name": "classpowers", "path": "./packs/classpowers.db", @@ -172,7 +171,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Tricks & Traps", "name": "trickstraps", "path": "./packs/trickstraps.db", @@ -182,7 +181,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Action Tokens", "name": "action-tokens", "path": "./packs/action-tokens.db", @@ -192,7 +191,7 @@ ] }, { - "entity": "Item", + "type": "Item", "label": "Powers - Monsters", "name": "monster-powers", "path": "./packs/monster-powers.db", @@ -202,7 +201,7 @@ ] }, { - "entity": "RollTable", + "type": "RollTable", "label": "Rolltables", "name": "rolltables", "path": "./packs/rolltables.db", @@ -218,11 +217,16 @@ "styles": [ "styles/simple.css" ], - "templateVersion": 16, + "version": "10.0.1", + "compatibility": { + "minimum": "10", + "verified": "10.276", + "maximum": "10" + }, + "templateVersion": 18, "title": "Crucible RPG", "manifest": "https://www.uberwald.me/gitea/public/fvtt-crucible-rpg/raw/master/system.json", - "download": "https://www.uberwald.me/gitea/public/fvtt-crucible-rpg/archive/fvtt-crucible-rpg-v0.1.29.zip", + "download": "https://www.uberwald.me/gitea/public/fvtt-crucible-rpg/archive/fvtt-crucible-rpg-v10.0.0.zip", "url": "https://www.uberwald.me/gitea/public/fvtt-crucible-rpg", - "version": "0.1.29", "background" : "./images/ui/crucible_welcome_page.webp" } diff --git a/template.json b/template.json index 697a6e9..7c75699 100644 --- a/template.json +++ b/template.json @@ -8,6 +8,7 @@ "age": 0, "size": 0, "weight": "", + "height": "", "hair": "", "sex": "", "eyes": "", diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index fc28675..f2eddfe 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -22,7 +22,7 @@

Class

- {{#select data.biodata.class}} @@ -108,8 +108,8 @@ {{skill.name}} - {{upper skill.data.ability}} - {{skill.data.skilldice}} + {{upper skill.system.ability}} + {{skill.system.skilldice}}  - 
 
@@ -143,9 +143,9 @@ src="{{weapon.img}}" /> {{weapon.name}} - {{weapon.data.ability}} + {{weapon.system.ability}} - {{perk.data.range}} + {{perk.system.range}}
 
@@ -178,9 +178,9 @@ src="{{feat.img}}" /> {{feat.name}} - {{upperFirst feat.data.isfeatdie}} - {{upperFirst feat.data.issl}} - {{feat.data.sl}} + {{upperFirst feat.system.isfeatdie}} + {{upperFirst feat.system.issl}} + {{feat.system.sl}}
 
@@ -223,9 +223,9 @@ {{spell.name}} - {{upperFirst spell.data.lore}} - {{upperFirst spell.data.circle}} - {{upperFirst spell.data.range}} + {{upperFirst spell.system.lore}} + {{upperFirst spell.system.circle}} + {{upperFirst spell.system.range}}
 
@@ -273,16 +273,16 @@ {{money.name}} - + - {{#if money.data.idrDice}} - {{money.data.idrDice}} + {{#if money.system.idrDice}} + {{money.system.idrDice}} {{else}}  -  {{/if}} @@ -316,12 +316,12 @@ {{weapon.name}} - - + +
 
@@ -351,12 +351,12 @@ {{armor.name}} - {{upper armor.data.armortype}} - {{armor.data.absorprionroll}} + {{upper armor.system.armortype}} + {{armor.system.absorprionroll}}
 
@@ -382,11 +382,11 @@ {{shield.name}} - {{shield.data.levelDice}} + {{shield.system.levelDice}}
 
@@ -429,24 +429,24 @@
  • -
  • - +
  • - +
  • - +
  • - +
@@ -454,7 +454,7 @@
  • - {{#select data.biodata.size}} @@ -467,17 +467,17 @@
  • - +
  • -
  • - +
@@ -487,13 +487,13 @@

Background :

- {{editor content=data.biodata.description target="data.biodata.description" button=true owner=owner + {{editor data.biodata.description target="system.biodata.description" button=true owner=owner editable=editable}}

Notes :

- {{editor content=data.biodata.notes target="data.biodata.notes" button=true owner=owner editable=editable}} + {{editor data.biodata.notes target="system.biodata.notes" button=true owner=owner editable=editable}}

diff --git a/templates/chat-attack-defense-result.html b/templates/chat-attack-defense-result.html index 7868953..73bc1db 100644 --- a/templates/chat-attack-defense-result.html +++ b/templates/chat-attack-defense-result.html @@ -20,7 +20,7 @@
  • Fight result !
  • {{#if successDetails.fumbleDetails}} -
  • Fumble ! : {{successDetails.fumbleDetails}}
  • +
  • Fumble ! : {{successDetails.fumbleDetails.data.text}}
  • {{/if}} {{#if armorResult}} diff --git a/templates/item-armor-sheet.html b/templates/item-armor-sheet.html index 0522610..f4ebe36 100644 --- a/templates/item-armor-sheet.html +++ b/templates/item-armor-sheet.html @@ -19,7 +19,7 @@
    • - {{#select data.armortype}} @@ -35,7 +35,7 @@
    • - {{#select data.absorprionroll}} @@ -50,7 +50,7 @@
    • - {{#select data.damagedroll}} @@ -65,23 +65,23 @@
    • - +
    • - +
    • - +
    • - +
    • - +
    diff --git a/templates/item-condition-sheet.html b/templates/item-condition-sheet.html index 1410353..0c52977 100644 --- a/templates/item-condition-sheet.html +++ b/templates/item-condition-sheet.html @@ -14,7 +14,7 @@
    - {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} + {{editor data.description target="system.description" button=true owner=owner editable=editable}}
    diff --git a/templates/item-equipment-sheet.html b/templates/item-equipment-sheet.html index 0558259..68b2708 100644 --- a/templates/item-equipment-sheet.html +++ b/templates/item-equipment-sheet.html @@ -16,13 +16,13 @@
    • - +
    • - +
    • - +
    diff --git a/templates/item-feat-sheet.html b/templates/item-feat-sheet.html index b398d4b..0751e74 100644 --- a/templates/item-feat-sheet.html +++ b/templates/item-feat-sheet.html @@ -16,16 +16,16 @@
    • - +
    • - +
    • {{#if data.issl}}
    • - +
    • {{/if}} diff --git a/templates/item-money-sheet.html b/templates/item-money-sheet.html index dddfb3b..e2c11d1 100644 --- a/templates/item-money-sheet.html +++ b/templates/item-money-sheet.html @@ -16,10 +16,10 @@
      • - +
      • - +
      diff --git a/templates/item-shield-sheet.html b/templates/item-shield-sheet.html index e6a2f7f..985f820 100644 --- a/templates/item-shield-sheet.html +++ b/templates/item-shield-sheet.html @@ -19,7 +19,7 @@
      • - {{#select data.shielddie}} @@ -29,7 +29,7 @@
      • - {{#select data.skill}} {{#each shieldSkills as |skill idx|}} @@ -40,11 +40,11 @@
      • - +
      • - +
      diff --git a/templates/item-skill-sheet.html b/templates/item-skill-sheet.html index 7856e7b..5f7c68e 100644 --- a/templates/item-skill-sheet.html +++ b/templates/item-skill-sheet.html @@ -16,7 +16,7 @@
      • - {{#select data.ability}} {{> systems/fvtt-crucible-rpg/templates/partial-options-abilities.html}} {{/select}} @@ -24,18 +24,18 @@
      • - +
      • - +
      • - +
      • - {{#select data.skilltype}} @@ -44,19 +44,19 @@
      • - +
      • - +
      • - +
      • - +
      • - {{#select data.bonusdice}} @@ -80,23 +80,23 @@
      • - +
      • - +
      • - +
      • - +
      • - +
      diff --git a/templates/item-spell-sheet.html b/templates/item-spell-sheet.html index 6aa531f..61f5949 100644 --- a/templates/item-spell-sheet.html +++ b/templates/item-spell-sheet.html @@ -16,7 +16,7 @@
      • - {{#select data.lore}} @@ -28,7 +28,7 @@
      • - {{#select data.circle}} @@ -40,7 +40,7 @@
      • - +
      diff --git a/templates/item-weapon-sheet.html b/templates/item-weapon-sheet.html index e454491..490a3c3 100644 --- a/templates/item-weapon-sheet.html +++ b/templates/item-weapon-sheet.html @@ -27,11 +27,11 @@ -->
    • - +
    • - {{#select data.skill}} {{#each weaponSkills as |skill idx|}} @@ -41,39 +41,39 @@
    • - +
    • - +
    • - +
    • - +
    • {{#if data.isranged}}
    • - +
    • - +
    • {{/if}}
    • - +
    • - +
    • - +
    diff --git a/templates/partial-actor-ability-block.html b/templates/partial-actor-ability-block.html index 9525ac6..3e05740 100644 --- a/templates/partial-actor-ability-block.html +++ b/templates/partial-actor-ability-block.html @@ -2,7 +2,7 @@

    {{ability.label}}

    - + / {{data.secondary.hp.max}}
  • Effort

    - + / {{data.secondary.effort.max}}
  • diff --git a/templates/partial-item-description.html b/templates/partial-item-description.html index a78040b..c97c210 100644 --- a/templates/partial-item-description.html +++ b/templates/partial-item-description.html @@ -2,7 +2,7 @@
    - {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} + {{editor data.description target="system.description" button=true owner=owner editable=editable}}