From 178ccbd12f711db4711d8ef7c0bf4a90fdc9abf9 Mon Sep 17 00:00:00 2001 From: sladecraven Date: Sat, 19 Mar 2022 09:30:00 +0100 Subject: [PATCH] First character sheet, wip --- modules/imperium5-actor-sheet.js | 45 +- modules/imperium5-actor.js | 1127 +------------------- modules/imperium5-combat.js | 19 +- modules/imperium5-commands.js | 20 +- modules/imperium5-item-sheet.js | 350 +----- modules/imperium5-item.js | 21 +- modules/imperium5-main.js | 76 +- modules/imperium5-roll-dialog.js | 203 +--- modules/imperium5-utility.js | 317 +----- styles/simple.css | 139 +-- system.json | 4 +- template.json | 470 ++------ templates/actor-partial-ames.html | 13 + templates/actor-partial-paradigmes.html | 16 + templates/actor-sheet.html | 617 ++++------- templates/chat-create-actor.html | 143 --- templates/chat-effect-used.html | 7 - templates/chat-opposed-damage.html | 15 - templates/chat-opposed-fail.html | 11 - templates/chat-perk-ready.html | 7 - templates/item-ability-sheet.html | 152 --- templates/item-armor-sheet.html | 63 -- templates/item-default-sheet.html | 31 + templates/item-effect-sheet.html | 149 --- templates/item-equipment-sheet.html | 86 -- templates/item-money-sheet.html | 33 - templates/item-perk-sheet.html | 112 -- templates/item-power-sheet.html | 136 --- templates/item-race-sheet.html | 134 --- templates/item-role-sheet.html | 114 -- templates/item-shield-sheet.html | 55 - templates/item-specialisation-sheet.html | 62 -- templates/item-weapon-sheet.html | 145 --- templates/npc-sheet.html | 184 ---- templates/partial-item-description.html | 2 +- templates/partial-item-nav.html | 5 - templates/partial-options-level.html | 14 - templates/partial-options-range.html | 15 - templates/partial-options-statistics.html | 22 - templates/partial-roll-select-effects.html | 102 -- 40 files changed, 602 insertions(+), 4634 deletions(-) create mode 100644 templates/actor-partial-ames.html create mode 100644 templates/actor-partial-paradigmes.html delete mode 100644 templates/chat-create-actor.html delete mode 100644 templates/chat-effect-used.html delete mode 100644 templates/chat-opposed-damage.html delete mode 100644 templates/chat-opposed-fail.html delete mode 100644 templates/chat-perk-ready.html delete mode 100644 templates/item-ability-sheet.html delete mode 100644 templates/item-armor-sheet.html create mode 100644 templates/item-default-sheet.html delete mode 100644 templates/item-effect-sheet.html delete mode 100644 templates/item-equipment-sheet.html delete mode 100644 templates/item-money-sheet.html delete mode 100644 templates/item-perk-sheet.html delete mode 100644 templates/item-power-sheet.html delete mode 100644 templates/item-race-sheet.html delete mode 100644 templates/item-role-sheet.html delete mode 100644 templates/item-shield-sheet.html delete mode 100644 templates/item-specialisation-sheet.html delete mode 100644 templates/item-weapon-sheet.html delete mode 100644 templates/npc-sheet.html delete mode 100644 templates/partial-item-nav.html delete mode 100644 templates/partial-options-level.html delete mode 100644 templates/partial-options-range.html delete mode 100644 templates/partial-options-statistics.html delete mode 100644 templates/partial-roll-select-effects.html diff --git a/modules/imperium5-actor-sheet.js b/modules/imperium5-actor-sheet.js index e3f8c6c..c1faf56 100644 --- a/modules/imperium5-actor-sheet.js +++ b/modules/imperium5-actor-sheet.js @@ -7,14 +7,14 @@ import { Imperium5Utility } from "./imperium5-utility.js"; import { Imperium5RollDialog } from "./imperium5-roll-dialog.js"; /* -------------------------------------------- */ -export class PegasusActorSheet extends ActorSheet { +export class Imperium5ActorSheet extends ActorSheet { /** @override */ static get defaultOptions() { return mergeObject(super.defaultOptions, { - classes: ["fvtt-pegasus-rpg", "sheet", "actor"], - template: "systems/fvtt-pegasus-rpg/templates/actor-sheet.html", + classes: ["fvtt-imperium5", "sheet", "actor"], + template: "systems/fvtt-imperium5/templates/actor-sheet.html", width: 920, height: 720, tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "combat" }], @@ -25,9 +25,9 @@ export class PegasusActorSheet extends ActorSheet { /* -------------------------------------------- */ async getData() { - const objectData = PegasusUtility.data(this.object); + const objectData = Imperium5Utility.data(this.object); - let actorData = duplicate(PegasusUtility.templateData(this.object)); + let actorData = duplicate(Imperium5Utility.templateData(this.object)); let formData = { title: this.title, @@ -38,28 +38,11 @@ export class PegasusActorSheet extends ActorSheet { editable: this.isEditable, cssClass: this.isEditable ? "editable" : "locked", data: actorData, + archetype: this.actor.getArchetype(), + specialites: this.actor.getSpecialites(), + familiarites: this.actor.getFamiliarites(), effects: this.object.effects.map(e => foundry.utils.deepClone(e.data)), limited: this.object.limited, - specs: this.actor.getSpecs( ), - optionsDiceList: PegasusUtility.getOptionsDiceList(), - optionsLevel: PegasusUtility.getOptionsLevel(), - weapons: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getWeapons()) ), - armors: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getArmors())), - shields: this.actor.checkAndPrepareEquipments( duplicate(this.actor.getShields()) ), - equipments: this.actor.checkAndPrepareEquipments(duplicate(this.actor.getEquipmentsOnly()) ), - perks: duplicate(this.actor.getPerks()), - abilities: duplicate(this.actor.getAbilities()), - activePerks: duplicate(this.actor.getActivePerks()), - powers: duplicate(this.actor.getPowers()), - subActors: duplicate(this.actor.getSubActors()), - race: duplicate(this.actor.getRace()), - role: duplicate(this.actor.getRole()), - effects: duplicate(this.actor.getEffects()), - moneys: duplicate(this.actor.getMoneys()), - encCapacity: this.actor.getEncumbranceCapacity(), - containersTree: this.actor.containersTree, - encCurrent: this.actor.encCurrent, - encHindrance: this.actor.encHindrance, options: this.options, owner: this.document.isOwner, editScore: this.options.editScore, @@ -73,13 +56,13 @@ export class PegasusActorSheet extends ActorSheet { /* -------------------------------------------- */ async openGenericRoll() { - let rollData = PegasusUtility.getBasicRollData() + let rollData = Imperium5Utility.getBasicRollData() rollData.alias = "Dice Pool Roll", rollData.mode = "generic" rollData.title = `Dice Pool Roll` rollData.img = "icons/dice/d12black.svg" - let rollDialog = await PegasusRollDialog.create( this.actor, rollData); + let rollDialog = await Imperium5RollDialog.create( this.actor, rollData); rollDialog.render( true ); } @@ -87,7 +70,7 @@ export class PegasusActorSheet extends ActorSheet { async rollIDR( itemId, diceValue) { let item = this.actor.data.items.get( itemId) ?? {name: "Unknown"} let myRoll = new Roll(diceValue+"x").roll({ async: false }) - await PegasusUtility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) + await Imperium5Utility.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")) let chatData = { user: game.user.id, rollMode: game.settings.get("core", "rollMode"), @@ -119,7 +102,7 @@ export class PegasusActorSheet extends ActorSheet { // Delete Inventory Item html.find('.item-delete').click(ev => { const li = $(ev.currentTarget).parents(".item"); - PegasusUtility.confirmDelete(this, li); + Imperium5Utility.confirmDelete(this, li); }); html.find('.spec-group-activate').click(ev => { @@ -337,11 +320,11 @@ export class PegasusActorSheet extends ActorSheet { /* -------------------------------------------- */ async _onDropItem(event, dragData) { console.log(">>>>>> DROPPED!!!!") - let item = await PegasusUtility.searchItem( dragData) + let item = await Imperium5Utility.searchItem( dragData) if (item == undefined) { item = this.actor.items.get( dragData.data._id ) } - this.actor.preprocessItem( event, item, true ) + //this.actor.preprocessItem( event, item, true ) super._onDropItem(event, dragData) } diff --git a/modules/imperium5-actor.js b/modules/imperium5-actor.js index 1a20422..14515d8 100644 --- a/modules/imperium5-actor.js +++ b/modules/imperium5-actor.js @@ -2,16 +2,12 @@ import { Imperium5Utility } from "./imperium5-utility.js"; import { Imperium5RollDialog } from "./imperium5-roll-dialog.js"; -/* -------------------------------------------- */ -const coverBonusTable = { "nocover": 0, "lightcover": 2, "heavycover": 4, "entrenchedcover": 6 }; -const statThreatLevel = [ "agi", "str", "phy", "com", "def", "per" ] -/* -------------------------------------------- */ /* -------------------------------------------- */ /** * Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system. * @extends {Actor} */ -export class PegasusActor extends Actor { +export class Imperium5Actor extends Actor { /* -------------------------------------------- */ /** @@ -38,10 +34,7 @@ export class PegasusActor extends Actor { } if (data.type == 'character') { - const skills = await PegasusUtility.loadCompendium("fvtt-weapons-of-the-gods.skills"); - data.items = skills.map(i => i.toObject()); - } - if (data.type == 'npc') { + } return super.create(data, options); @@ -60,11 +53,10 @@ export class PegasusActor extends Actor { prepareDerivedData() { if (this.type == 'character') { - this.computeNRGHealth(); - this.data.data.encCapacity = this.getEncumbranceCapacity() - this.buildContainerTree() + //this.data.data.encCapacity = this.getEncumbranceCapacity() + //this.buildContainerTree() } - + console.log("Acteur : ", this) super.prepareDerivedData(); } @@ -73,208 +65,30 @@ export class PegasusActor extends Actor { super._preUpdate(changed, options, user); } - + /* -------------------------------------------- */ - getEncumbranceCapacity() { - return this.data.data.statistics.str.value * 25 + getArchetype() { + let item = duplicate( this.data.items.find( it => it.type == "archetype") || []) + return item + } + getSpecialites() { + let item = duplicate(this.data.items.filter( it => it.type == "specialite") || [] ) + return item + } + getFamiliarites() { + let item = duplicate(this.data.items.filter( it => it.type == "familiarite") || [] ) + return item } - /* -------------------------------------------- */ - getActivePerks() { - let perks = this.data.items.filter(item => item.type == 'perk' && item.data.data.active); - return perks; - } - /* -------------------------------------------- */ - getAbilities() { - let ab = this.data.items.filter(item => item.type == 'ability'); - return ab; - } - /* -------------------------------------------- */ - getPerks() { - let comp = this.data.items.filter(item => item.type == 'perk'); - return comp; - } - /* -------------------------------------------- */ - getEffects() { - let comp = this.data.items.filter(item => item.type == 'effect'); - return comp; - } - /* -------------------------------------------- */ - getPowers() { - let comp = this.data.items.filter(item => item.type == 'power'); - return comp; - } - /* -------------------------------------------- */ - getMoneys() { - let comp = this.data.items.filter(item => item.type == 'money'); - return comp; - } - /* -------------------------------------------- */ - getArmors() { - let comp = duplicate(this.data.items.filter(item => item.type == 'armor') || []); - return comp; - } - /* -------------------------------------------- */ - getShields() { - let comp = this.data.items.filter(item => item.type == 'shield') - return comp; - } - getRace() { - let race = this.data.items.filter(item => item.type == 'race') - return race[0] ?? []; - } - getRole() { - let role = this.data.items.filter(item => item.type == 'role') - return role[0] ?? []; - } - /* -------------------------------------------- */ - checkAndPrepareEquipment(item) { - if ( item.data.resistance ) { - item.data.resistanceDice = PegasusUtility.getDiceFromLevel(item.data.resistance) - } - if ( item.data.idr ) { - item.data.idrDice = PegasusUtility.getDiceFromLevel(item.data.idr) - } - if ( item.data.damage) { - item.data.damageDice = PegasusUtility.getDiceFromLevel(item.data.damage) - } - if( item.data.level) { - item.data.levelDice = PegasusUtility.getDiceFromLevel(item.data.level) - } - } - - /* -------------------------------------------- */ - checkAndPrepareEquipments(listItem) { - for (let item of listItem) { - this.checkAndPrepareEquipment(item) - } - return listItem - } - - /* -------------------------------------------- */ - getWeapons() { - let comp = duplicate(this.data.items.filter(item => item.type == 'weapon') || []); - return comp; - } /* -------------------------------------------- */ getItemById(id) { - let item = this.data.items.find(item => item.id == id); + let item = this.data.items.find(item => item.id == id) if (item) { item = duplicate(item) - if (item.type == 'specialisation') { - item.data.dice = PegasusUtility.getDiceFromLevel(item.data.level); - } } return item; } - /* -------------------------------------------- */ - getSpecs() { - let comp = duplicate(this.data.items.filter(item => item.type == 'specialisation') || []); - for (let c of comp) { - c.data.dice = PegasusUtility.getDiceFromLevel(c.data.level); - } - return comp; - } - - /* -------------------------------------------- */ - async manageWorstFear(flag) { - if (flag) { - let effect = await PegasusUtility.getEffectFromCompendium("Worst Fear") - effect.data.worstfear = true - this.createEmbeddedDocuments('Item', [effect]) - } else { - let effect = this.data.items.find(item => item.type == "effect" && item.data.data.worstfear) - if (effect) { - this.deleteEmbeddedDocuments('Item', [effect.id]) - } - } - } - /* -------------------------------------------- */ - async manageDesires(flag) { - if (flag) { - let effect = await PegasusUtility.getEffectFromCompendium("Desires") - effect.data.desires = true - this.createEmbeddedDocuments('Item', [effect]) - } else { - let effect = this.data.items.find(item => item.type == "effect" && item.data.data.desires) - if (effect) { - this.deleteEmbeddedDocuments('Item', [effect.id]) - } - } - } - - /* -------------------------------------------- */ - getRelevantSpec(statKey) { - let comp = duplicate(this.data.items.filter(item => item.type == 'specialisation' && item.data.data.statistic == statKey) || []); - for (let c of comp) { - c.data.dice = PegasusUtility.getDiceFromLevel(c.data.level); - } - return comp; - } - - /* -------------------------------------------- */ - async activatePerk(perkId) { - let item = this.data.items.find(item => item.id == perkId); - if (item && item.data.data) { - let update = { _id: item.id, "data.active": !item.data.data.active }; - await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity - } - } - - /* -------------------------------------------- */ - async activatePower(itemId) { - let item = this.data.items.find(item => item.id == itemId) - if (item && item.data.data) { - - let nrg = duplicate(this.data.data.nrg) - if (!item.data.data.activated) { // Current value - - if (item.data.data.costspent > nrg.value || item.data.data.costspent > nrg.max) { - return ui.notifications.warn("Not enough NRG to activate the Power " + item.name) - } - nrg.activated += item.data.data.costspent - nrg.value -= item.data.data.costspent - nrg.max -= item.data.data.costspent - await this.update({ 'data.nrg': nrg }) - - let effects = [] - for (let effect of item.data.data.effectsgained) { - effect.data.powerId = itemId // Link to the perk, in order to dynamically remove them - effects.push(effect) - } - if (effects.length) { - await this.createEmbeddedDocuments('Item', effects) - } - } else { - nrg.activated -= item.data.data.costspent - nrg.max += item.data.data.costspent - await this.update({ 'data.nrg': nrg }) - - let toRem = [] - for (let item of this.data.items) { - if (item.type == 'effect' && item.data.data.powerId == itemId) { - toRem.push(item.id) - } - } - if (toRem.length) { - await this.deleteEmbeddedDocuments('Item', toRem) - } - } - let update = { _id: item.id, "data.activated": !item.data.data.activated } - await this.updateEmbeddedDocuments('Item', [update]) // Updates one EmbeddedEntity - } - } - - /* -------------------------------------------- */ - async equipItem(itemId) { - let item = this.data.items.find(item => item.id == itemId); - if (item && item.data.data) { - let update = { _id: item.id, "data.equipped": !item.data.data.equipped }; - await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity - } - } - /* -------------------------------------------- */ compareName(a, b) { if (a.name < b.name) { @@ -286,141 +100,6 @@ export class PegasusActor extends Actor { return 0; } - /* ------------------------------------------- */ - getEquipments() { - return this.data.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") || []) - } - - /* ------------------------------------------- */ - computeThreatLevel() { - let tl = 0 - for(let key of statThreatLevel) { // Init with concerned stats - tl += PegasusUtility.getDiceValue( this.data.data.statistics[key].value ) - } - let powers = duplicate( this.getPowers() || []) - if ( powers.length > 0 ) { // Then add some mental ones of powers - tl += PegasusUtility.getDiceValue( this.data.data.statistics.foc.value ) - tl += PegasusUtility.getDiceValue( this.data.data.statistics.mnd.value ) - } - tl += PegasusUtility.getDiceValue( this.data.data.mr.value ) - let specThreat = this.data.items.filter( it => it.type == "specialisation" && it.data.data.isthreatlevel) || [] - for (let spec of specThreat) { - tl += PegasusUtility.getDiceValue( spec.data.data.level ) - } - tl += this.data.data.nrg.absolutemax + this.data.data.secondary.health.max + this.data.data.secondary.delirium.max - tl += this.getPerks().length * 5 - - let weapons = this.getWeapons() - for(let weapon of weapons) { - tl += PegasusUtility.getDiceValue(weapon.data.damage) - } - let armors = this.getArmors() - for(let armor of armors) { - tl += PegasusUtility.getDiceValue(armor.data.resistance) - } - let shields = this.getShields() - for(let shield of shields) { - tl += PegasusUtility.getDiceValue(shield.data.level) - } - let abilities = duplicate(this.getAbilities()) - for (let ability of abilities) { - tl += ability.data.threatlevel - } - let equipments = this.getEquipmentsOnly() - for (let equip of equipments) { - tl += equip.data.threatlevel - } - if ( tl != this.data.data.biodata.threatlevel) { - this.update( {'data.biodata.threatlevel': tl} ) - } - } - - /* ------------------------------------------- */ - async buildContainerTree() { - let equipments = duplicate(this.data.items.filter(item => item.type == "equipment") || []) - for (let equip1 of equipments) { - if (equip1.data.iscontainer) { - equip1.data.contents = [] - equip1.data.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 - } - } - } - } - - // Compute whole enc - let enc = 0 - for (let item of equipments) { - item.data.idrDice = PegasusUtility.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 - } - } - } - 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 - } - } - - // Store local values - this.encCurrent = enc - this.containersTree = equipments.filter(item => item.data.containerid == "") // Returns the root of equipements without container - - // Manages slow effect - let overCapacity = Math.floor(this.encCurrent / this.getEncumbranceCapacity()) - this.encHindrance = Math.floor(this.encCurrent / this.getEncumbranceCapacity()) - - //console.log("Capacity", overCapacity, this.encCurrent / this.getEncumbranceCapacity() ) - let effect = this.data.items.find(item => item.type == "effect" && item.data.data.slow) - if (overCapacity >= 4) { - if (!effect) { - effect = await PegasusUtility.getEffectFromCompendium("Slowed") - effect.data.slow = true - this.createEmbeddedDocuments('Item', [effect]) - } - } else { - if (effect) { - this.deleteEmbeddedDocuments('Item', [effect.id]) - } - } - } - - /* -------------------------------------------- */ - modifyMomentum(incDec) { - let momentum = duplicate(this.data.data.momentum) - momentum.value += incDec - if (momentum.value >= 0 ) { - this.update({ 'data.momentum': momentum }) - let chatData = { - user: game.user.id, - rollMode: game.settings.get("core", "rollMode"), - whisper: [game.user.id].concat(ChatMessage.getWhisperRecipients('GM')) - } - if (incDec > 0) { - chatData.content = `
${this.name} has gained a Momentum${this.name} has used a Momentum true) { let array = Array.from(this.getEmbeddedCollection("ActiveEffect").values()); @@ -435,65 +114,6 @@ export class PegasusActor extends Actor { return this.getActiveEffects().find(it => it.id == id); } - /* -------------------------------------------- */ - getAttribute(attrKey) { - return this.data.data.attributes[attrKey]; - } - - /* -------------------------------------------- */ - 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) - console.log("Found", container, object) - if (container) { - if (object.data.data.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) { - ui.notifications.warn("Container is already full !") - return - } else { - await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'data.containerid': containerId }]) - } - } else if (object && object.data.data.containerid) { // remove from container - console.log("Removeing: ", object) - await this.updateEmbeddedDocuments("Item", [{ _id: object.id, 'data.containerid': "" }]); - } - } - - /* -------------------------------------------- */ - async preprocessItem(event, item, onDrop = false) { - console.log("Pre-process !!!", item) - if (item.data.type == 'race') { - this.applyRace(item.data) - } else if (item.data.type == 'ability') { - this.applyAbility(item.data, [], true) - if (!onDrop) { - await this.createEmbeddedDocuments('Item', [item.data]) - return - } - } else { - if (!onDrop) { - await this.createEmbeddedDocuments('Item', [item.data]) - return - } - } - - let dropID = $(event.target).parents(".item").attr("data-item-id") // Only relevant if container drop - let objectID = item.id || item._id - this.addObjectToContainer(objectID, dropID) - } - - /* -------------------------------------------- */ - 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 }; - await this.updateEmbeddedDocuments('Item', [update]); // Updates one EmbeddedEntity - } - } /* -------------------------------------------- */ getInitiativeScore(combatId, combatantId) { if (this.type == 'character') { @@ -530,261 +150,12 @@ export class PegasusActor extends Actor { /* -------------------------------------------- */ syncRoll(rollData) { - let linkedRollId = PegasusUtility.getDefenseState(this.id); + let linkedRollId = Imperium5Utility.getDefenseState(this.id); if (linkedRollId) { rollData.linkedRollId = linkedRollId; } this.lastRollId = rollData.rollId; - PegasusUtility.saveRollData(rollData); - } - - /* -------------------------------------------- */ - getStat(statKey) { - let stat - if (statKey == 'mr') { - stat = duplicate(this.data.data.mr); - } else { - stat = duplicate(this.data.data.statistics[statKey]); - } - stat.dice = PegasusUtility.getDiceFromLevel(stat.value); - return stat; - } - - /* -------------------------------------------- */ - getOneSpec(specId) { - let spec = this.data.items.find(item => item.type == 'specialisation' && item.id == specId) - if (spec) { - spec = duplicate(spec); - spec.data.dice = PegasusUtility.getDiceFromLevel(spec.data.level); - } - return spec; - } - - /* -------------------------------------------- */ - specPowerActivate(specId) { - let spec = this.getOneSpec(specId) - if (spec) { - let powers = [] - for (let power of spec.data.powers) { - power.data.specId = specId - powers.push(power) - } - if (powers.length > 0) { - this.createEmbeddedDocuments('Item', powers) - } - this.updateEmbeddedDocuments('Item', [{ _id: specId, 'data.powersactivated': true }]) - } - } - - /* -------------------------------------------- */ - specPowerDeactivate(specId) { - let toRem = [] - for (let power of this.data.items) { - if (power.type == "power" && power.data.data.specId && power.data.data.specId == specId) { - toRem.push(power.id) - } - } - if (toRem.length > 0) { - this.deleteEmbeddedDocuments('Item', toRem) - } - this.updateEmbeddedDocuments('Item', [{ _id: specId, 'data.powersactivated': false }]) - } - - /* -------------------------------------------- */ - equipActivate(itemId) { - let item = this.items.get(itemId) - if (item) { - let effects = [] - for (let effect of item.data.data.effects) { - effect.data.itemId = itemId // Keep link - effects.push(effect) - } - if (effects.length > 0) { - this.createEmbeddedDocuments('Item', effects) - } - this.updateEmbeddedDocuments('Item', [{ _id: itemId, 'data.activated': true }]) - } - } - - /* -------------------------------------------- */ - equipDeactivate(itemId) { - let toRem = [] - for (let item of this.data.items) { - if (item.data.data.itemId && item.data.data.itemId == itemId) { - toRem.push(item.id) - } - } - if (toRem.length > 0) { - this.deleteEmbeddedDocuments('Item', toRem) - } - this.updateEmbeddedDocuments('Item', [{ _id: itemId, 'data.activated': false }]) - } - - /* -------------------------------------------- */ - 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]) - } - } - - /* -------------------------------------------- */ - disableWeaverPerk(perk) { - if (perk.data.data.isweaver) { - for (let spec of this.data.items) { - if (spec.type == 'specialisation' && spec.data.data.ispowergroup) { - this.specPowerDeactivate(spec.id) - } - } - } - } - - /* -------------------------------------------- */ - enableWeaverPerk(perk) { - if (perk.data.data.isweaver) { - for (let spec of this.data.items) { - if (spec.type == 'specialisation' && spec.data.data.ispowergroup) { - this.specPowerActivate(spec.id) - } - } - } - } - - /* -------------------------------------------- */ - async cleanPerkEffects(itemId) { - 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 > 0) { - console.log("DELET!!!!", effects, this) - await this.deleteEmbeddedDocuments('Item', effects) - } - } - - /* -------------------------------------------- */ - async updatePerkUsed(itemId, index, checked) { - let item = this.items.get(itemId) - if (item && index) { - let key = "data.used" + index - await this.updateEmbeddedDocuments('Item', [{ _id: itemId, [`${key}`]: checked }]) - item = this.items.get(itemId) // Refresh - if (item.data.data.nbuse == "next1action" && item.data.data.used1) { - this.cleanPerkEffects(itemId) - } - if (item.data.data.nbuse == "next2action" && item.data.data.used1 && item.data.data.used2) { - this.cleanPerkEffects(itemId) - } - if (item.data.data.nbuse == "next3action" && item.data.data.used1 && item.data.data.used2 && item.data.data.used3) { - this.cleanPerkEffects(itemId) - } - } - } - - /* -------------------------------------------- */ - async updatePowerSpentCost(itemId, value) { - let item = this.items.get(itemId) - if (item && value) { - value = Number(value) || 0 - await this.updateEmbeddedDocuments('Item', [{ _id: itemId, 'data.costspent': value }]) - } - } - - /* -------------------------------------------- */ - async updatePerkStatus(itemId, status) { - let item = this.items.get(itemId) - if (item) { - - if (item.data.data.status == status) return;// Ensure we are really changing the status - - let updateOK = true - if (status == "ready") { - await this.cleanPerkEffects(itemId) - await this.updateEmbeddedDocuments('Item', [{ _id: itemId, 'data.used1': false, 'data.used2': false, 'data.used3': false }]) - if (item.data.data.features.nrgcost.flag) { - let nrg = duplicate(this.data.data.nrg) - nrg.activated -= item.data.data.features.nrgcost.value - nrg.max += item.data.data.features.nrgcost.value - await this.update({ 'data.nrg': nrg }) - } - if (item.data.data.features.bonushealth.flag) { - let health = duplicate(this.data.data.secondary.health) - health.value -= Number(item.data.data.features.bonushealth.value) || 0 - health.max -= Number(item.data.data.features.bonushealth.value) || 0 - await this.update({ 'data.secondary.health': health }) - } - if (item.data.data.features.bonusdelirium.flag) { - let delirium = duplicate(this.data.data.secondary.delirium) - delirium.value -= Number(item.data.data.features.bonusdelirium.value) || 0 - delirium.max -= Number(item.data.data.features.bonusdelirium.value) || 0 - await this.update({ 'data.secondary.delirium': delirium }) - } - if (item.data.data.features.bonusnrg.flag) { - let nrg = duplicate(this.data.data.nrg) - nrg.value -= Number(item.data.data.features.bonusnrg.value) || 0 - nrg.max -= Number(item.data.data.features.bonusnrg.value) || 0 - await this.update({ 'data.nrg': nrg }) - } - this.disableWeaverPerk(item) - PegasusUtility.createChatWithRollMode(item.name, { - content: await renderTemplate(`systems/fvtt-pegasus-rpg/templates/chat-perk-ready.html`, { name: this.name, perk: item }) - }); - - } - 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) && (this.data.data.nrg.max >= 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 - nrg.max -= item.data.data.features.nrgcost.value - await 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.value += Number(item.data.data.features.bonushealth.value) || 0 - health.max += Number(item.data.data.features.bonushealth.value) || 0 - await this.update({ 'data.secondary.health': health }) - } - if (item.data.data.features.bonusdelirium.flag) { - let delirium = duplicate(this.data.data.secondary.delirium) - delirium.value += Number(item.data.data.features.bonusdelirium.value) || 0 - delirium.max += Number(item.data.data.features.bonusdelirium.value) || 0 - await this.update({ 'data.secondary.delirium': delirium }) - } - if (item.data.data.features.bonusnrg.flag) { - let nrg = duplicate(this.data.data.nrg) - nrg.value += Number(item.data.data.features.bonusnrg.value) || 0 - nrg.max += Number(item.data.data.features.bonusnrg.value) || 0 - await this.update({ 'data.nrg': nrg }) - } - this.enableWeaverPerk(item) - } - if (updateOK) { - await this.updateEmbeddedDocuments('Item', [{ _id: item.id, 'data.status': status }]) - } - } + Imperium5Utility.saveRollData(rollData); } /* -------------------------------------------- */ @@ -801,125 +172,6 @@ export class PegasusActor extends Actor { } } - /* -------------------------------------------- */ - async computeNRGHealth() { - 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; - if (phyDiceValue != this.data.data.secondary.health.max) { - updates['data.secondary.health.max'] = phyDiceValue - } - if (this.computeValue) { - updates['data.secondary.health.value'] = phyDiceValue - } - let mndDiceValue = PegasusUtility.getDiceValue(this.data.data.statistics.mnd.value) + this.data.data.secondary.delirium.bonus + this.data.data.statistics.mnd.mod; - if (mndDiceValue != this.data.data.secondary.delirium.max) { - updates['data.secondary.delirium.max'] = mndDiceValue - } - if (this.computeValue) { - updates['data.secondary.delirium.value'] = mndDiceValue - } - let stlDiceValue = PegasusUtility.getDiceValue(this.data.data.statistics.stl.value) + this.data.data.secondary.stealthhealth.bonus + this.data.data.statistics.stl.mod; - if (stlDiceValue != this.data.data.secondary.stealthhealth.max) { - updates['data.secondary.stealthhealth.max'] = stlDiceValue - } - if (this.computeValue) { - updates['data.secondary.stealthhealth.value'] = stlDiceValue - } - - let socDiceValue = PegasusUtility.getDiceValue(this.data.data.statistics.soc.value) + this.data.data.secondary.socialhealth.bonus + this.data.data.statistics.soc.mod; - if (socDiceValue != this.data.data.secondary.socialhealth.max) { - updates['data.secondary.socialhealth.max'] = socDiceValue - } - if (this.computeValue) { - updates['data.secondary.socialhealth.value'] = socDiceValue - } - - let nrgValue = PegasusUtility.getDiceValue(this.data.data.statistics.foc.value) + this.data.data.nrg.mod + this.data.data.statistics.foc.mod - if (nrgValue != this.data.data.nrg.absolutemax) { - updates['data.nrg.absolutemax'] = nrgValue - } - if (this.computeValue) { - updates['data.nrg.max'] = nrgValue - updates['data.nrg.value'] = nrgValue - } - - nrgValue = PegasusUtility.getDiceValue(this.data.data.statistics.mnd.value) + this.data.data.statistics.mnd.mod; - if (nrgValue != this.data.data.combat.stunthreshold) { - updates['data.combat.stunthreshold'] = nrgValue - } - - let momentum = this.data.data.statistics.foc.value + this.data.data.statistics.foc.mod - if (momentum != this.data.data.momentum.max) { - updates['data.momentum.value'] = 0 - updates['data.momentum.max'] = momentum - } - - let mrLevel = (this.data.data.statistics.agi.value + this.data.data.statistics.str.value) - this.data.data.statistics.phy.value - mrLevel = (mrLevel < 1) ? 1 : mrLevel; - if (mrLevel != this.data.data.mr.value) { - updates['data.mr.value'] = mrLevel - } - - let race = this.getRace() - if (race && race.name && (race.name != this.data.data.biodata.racename)) { - updates['data.biodata.racename'] = race.name - } - let role = this.getRole() - if (role && role.name && (role.name != this.data.data.biodata.rolename)) { - updates['data.biodata.rolename'] = role.name - } - //console.log("UPD", updates, this.data.data.biodata) - await this.update(updates) - - this.computeThreatLevel() - } - - if (this.isOwner || game.user.isGM) { - // Update current hindrance level - let hindrance = this.data.data.combat.hindrancedice - if (this.data.data.secondary.health.value < 0) { - hindrance += Math.abs(this.data.data.secondary.health.value) - } - if (this.data.data.secondary.delirium.value < 0) { - hindrance += Math.abs(this.data.data.secondary.delirium.value) - } - this.data.data.combat.hindrancedice = hindrance - } - } - - /* -------------------------------------------- */ - async modStat(key, inc = 1) { - let stat = duplicate(this.data.data.statistics[key]) - stat.mod += parseInt(inc) - await this.update({ [`data.statistics.${key}`]: stat }) - } - - /* -------------------------------------------- */ - async valueStat(key, inc = 1) { - key = key.toLowerCase() - let stat = duplicate(this.data.data.statistics[key]) - stat.value += parseInt(inc) - await this.update({ [`data.statistics.${key}`]: stat }) - } - - /* -------------------------------------------- */ - async addIncSpec(spec, inc = 1) { - console.log("Using spec : ", spec, inc) - let specExist = this.data.items.find(item => item.type == 'specialisation' && item.name.toLowerCase() == spec.name.toLowerCase()) - if (specExist) { - specExist = duplicate(specExist) - specExist.data.level += inc; - let update = { _id: specExist._id, "data.level": specExist.data.level }; - await this.updateEmbeddedDocuments('Item', [update]); - } else { - spec.data.level += inc; - await this.createEmbeddedDocuments('Item', [spec]); - } - } - /* -------------------------------------------- */ async incDecQuantity(objetId, incDec = 0) { let objetQ = this.data.items.get(objetId) @@ -930,145 +182,6 @@ export class PegasusActor extends Actor { } } } - /* -------------------------------------------- */ - async incDecAmmo(objetId, incDec = 0) { - let objetQ = this.data.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 - } - } - } - - /* -------------------------------------------- */ - async applyAbility(ability, updates = [], directUpdate = false) { - // manage stat bonus - if (ability.data.affectedstat != "notapplicable") { - let stat = duplicate(this.data.data.statistics[ability.data.affectedstat]) - stat.mod += Number(ability.data.statmodifier) - updates[`data.statistics.${ability.data.affectedstat}`] = stat - } - // manage status bonus - if (ability.data.statusaffected != "notapplicable") { - if (ability.data.statusaffected == 'nrg') { - let nrg = duplicate(this.data.data.nrg) - nrg.mod += Number(ability.data.statusmodifier) - updates[`data.nrg`] = nrg - } - if (ability.data.statusaffected == 'health') { - let health = duplicate(this.data.data.secondary.health) - health.bonus += Number(ability.data.statusmodifier) - updates[`data.secondary.health`] = health - } - if (ability.data.statusaffected == 'delirium') { - let delirium = duplicate(this.data.data.secondary.delirium) - delirium.bonus += Number(ability.data.statusmodifier) - updates[`data.secondary.delirium`] = delirium - } - } - if (directUpdate) { - await this.update(updates) - } - let newItems = [] - if (ability.data.effectsgained) { - for (let effect of ability.data.effectsgained) { - newItems.push(effect); - } - } - if (ability.data.powersgained) { - for (let power of ability.data.powersgained) { - newItems.push(power); - } - } - if (ability.data.specialisations) { - for (let spec of ability.data.specialisations) { - newItems.push(spec); - } - } - if (ability.data.attackgained) { - for (let weapon of ability.data.attackgained) { - newItems.push(weapon); - } - } - if (ability.data.armorgained) { - for (let armor of ability.data.armorgained) { - newItems.push(armor); - } - } - await this.createEmbeddedDocuments('Item', newItems) - } - - /* -------------------------------------------- */ - async applyRace(race) { - let updates = { 'data.biodata.racename': race.name } - let newItems = [] - await this.deleteAllItemsByType('race') - newItems.push(race); - - for (let ability of race.data.abilities) { - newItems.push(ability) - this.applyAbility(ability, updates) - } - if (race.data.perksgained) { - for (let power of race.data.perks) { - newItems.push(power); - } - } - - await this.update(updates) - await this.createEmbeddedDocuments('Item', newItems) - console.log("Updates", updates, newItems) - console.log("Updated actor", this) - } - - /* -------------------------------------------- */ - getIncreaseStatValue(updates, statKey) { - let stat = duplicate(this.data.data.statistics[statKey]) - stat.value += 1; - updates[`data.statistics.${statKey}`] = stat - } - - /* -------------------------------------------- */ - async applyRole(role) { - console.log("ROLE", role) - - let updates = { 'data.biodata.rolename': role.name } - let newItems = [] - await this.deleteAllItemsByType('role') - newItems.push(role); - - this.getIncreaseStatValue(updates, role.data.statincrease1) - this.getIncreaseStatValue(updates, role.data.statincrease2) - - //newItems = newItems.concat(duplicate(role.data.specialisationsplus1)) - newItems = newItems.concat(duplicate(role.data.specialperk)) - - await this.update(updates) - await this.createEmbeddedDocuments('Item', newItems) - } - - - /* -------------------------------------------- */ - addHindrancesList(effectsList) { - if (this.data.data.combat.stunlevel > 0) { - effectsList.push({ label: "Stun Hindrance", type: "hindrance", applied: false, value: this.data.data.combat.stunlevel }) - } - if (this.data.data.combat.hindrancedice > 0) { - effectsList.push({ label: "Health/Delirium Hindrance", type: "hindrance", applied: false, value: this.data.data.combat.hindrancedice }) - } - let overCapacity = Math.floor(this.encCurrent / this.getEncumbranceCapacity()) - if (overCapacity > 0) { - effectsList.push({ label: "Encumbrance Hindrance", type: "hindrance", applied: false, value: overCapacity }) - } - let effects = this.data.items.filter(item => item.type == 'effect') - for (let effect of effects) { - effect = duplicate(effect) - if (effect.data.hindrance) { - effectsList.push({ label: effect.name, type: "effect", applied: false, effect: effect, value: effect.data.effectlevel }) - } - } - } /* -------------------------------------------- */ /* ROLL SECTION @@ -1090,214 +203,24 @@ export class PegasusActor extends Actor { } } - /* -------------------------------------------- */ - addArmorsShields(rollData, statKey = "none", useShield = false) { - if (statKey == 'phy') { - let armors = this.getArmors() - for (let armor of armors) { - rollData.armorsList.push({ label: `Armor ${armor.name}`, type: "other", applied: false, value: armor.data.resistance }) - } - } - if (useShield) { - let shields = this.data.items.filter(item => item.type == "shield" && item.data.data.equipped) - for (let sh of shields) { - rollData.armorsList.push({ label: `Shield ${sh.name}`, type: "other", applied: false, value: sh.data.data.level }) - } - } - } - addWeapons(rollData, statKey) { - let weapons = this.getWeapons() - for (let weapon of weapons) { - if (weapon.data.equipped && weapon.data.statistic == statKey) { - rollData.weaponsList.push({ label: `Attack ${weapon.name}`, type: "attack", applied: false, weapon: weapon, value: 0 }) - } - if (weapon.data.equipped && weapon.data.enhanced && weapon.data.enhancedstat == statKey) { - rollData.weaponsList.push({ label: `Enhanced Attack ${weapon.name}`, type: "enhanced", applied: false, weapon: weapon, value: weapon.data.enhancedlevel }) - } - if (weapon.data.equipped && weapon.data.damagestatistic == statKey) { - rollData.weaponsList.push({ label: `Damage ${weapon.name}`, type: "damage", applied: false, weapon: weapon, value: weapon.data.damage }) - } - } - } - addEquipments(rollData, statKey) { - let equipments = this.getEquipmentsOnly() - for (let equip of equipments) { - if (equip.data.equipped && equip.data.stataffected == statKey) { - rollData.equipmentsList.push({ label: `Item ${equip.name}`, type: "item", applied: false, equip: equip, value: equip.data.level }) - } - } - } - /* -------------------------------------------- */ getCommonRollData(statKey = undefined, useShield = false) { - let rollData = PegasusUtility.getBasicRollData() + let rollData = Imperium5Utility.getBasicRollData() rollData.alias = this.name rollData.actorImg = this.img rollData.actorId = this.id rollData.img = this.img - rollData.activePerks = duplicate(this.getActivePerks()) - - if (statKey) { - rollData.statKey = statKey - rollData.stat = this.getStat(statKey) - rollData.statDicesLevel = rollData.stat.value - rollData.statMod = rollData.stat.mod - rollData.specList = this.getRelevantSpec(statKey) - rollData.selectedSpec = "0" - if (statKey.toLowerCase() == "mr") { - rollData.img = "systems/fvtt-pegasus-rpg/images/icons/MR.webp" - } else { - rollData.img = `systems/fvtt-pegasus-rpg/images/icons/${rollData.stat.abbrev}.webp` - } - } - - this.addEffects(rollData) - this.addArmorsShields(rollData, statKey, useShield) - this.addWeapons(rollData, statKey, useShield) - this.addEquipments(rollData, statKey) return rollData } /* -------------------------------------------- */ async startRoll(rollData) { - this.syncRoll(rollData); - //console.log("ROLL DATA", rollData) - let rollDialog = await PegasusRollDialog.create(this, rollData); - console.log(rollDialog); - rollDialog.render(true); - + this.syncRoll(rollData) + let rollDialog = await Imperium5RollDialog.create(this, rollData) + console.log(rollDialog) + rollDialog.render(true) } - /* -------------------------------------------- */ - powerDmgRoll(itemId) { - let power = this.data.items.get(itemId) - if (power) { - power = duplicate(power) - this.rollPool(power.data.dmgstatistic) - } - } - /* -------------------------------------------- */ - rollPool(statKey, useShield = false) { - let stat = this.getStat(statKey) - if (stat) { - let rollData = this.getCommonRollData(statKey, useShield) - rollData.mode = "stat" - rollData.title = `Roll : ${stat.label} ` - rollData.img = "icons/dice/d12black.svg" - - this.startRoll(rollData) - } else { - ui.notifications.warn("Statistic not found !"); - } - } - - /* -------------------------------------------- */ - rollUnarmedAttack() { - let stat = this.getStat('com') - if (stat) { - let rollData = this.getCommonRollData(statKey) - rollData.mode = "stat" - rollData.title = `Unarmed Attack`; - rollData.damages = this.getStat('str'); - - this.startRoll(rollData); - } else { - ui.notifications.warn("Statistic not found !"); - } - } - - /*-------------------------------------------- */ - rollStat(statKey) { - let stat = this.getStat(statKey); - if (stat) { - let rollData = this.getCommonRollData(statKey) - rollData.mode = "stat" - rollData.title = `Stat ${stat.label}`; - - this.startRoll(rollData) - } else { - ui.notifications.warn("Statistic not found !"); - } - } - - /* -------------------------------------------- */ - async rollSpec(specId) { - let spec = this.getOneSpec(specId) - if (spec) { - let rollData = this.getCommonRollData(spec.data.statistic) - rollData.mode = "spec" - rollData.title = `Spec. : ${spec.name} ` - rollData.specList = [spec] - rollData.selectedSpec = spec._id - rollData.specName = spec.name - rollData.img = spec.img - rollData.specDicesLevel = spec.data.level - this.startRoll(rollData) - } else { - ui.notifications.warn("Specialisation not found !"); - } - } - - /* -------------------------------------------- */ - async rollMR(isInit = false, combatId = 0, combatantId = 0) { - let mr = duplicate(this.data.data.mr) - if (mr) { - mr.dice = PegasusUtility.getDiceFromLevel(mr.value); - - let rollData = this.getCommonRollData("mr") - rollData.mode = "MR" - rollData.img = "systems/fvtt-pegasus-rpg/images/icons/MR.webp" - rollData.isInit = isInit - rollData.combatId = combatId - rollData.combatantId = combatantId - console.log("MR ROLL", rollData) - this.startRoll(rollData); - } else { - ui.notifications.warn("MR not found !"); - } - } - - /* -------------------------------------------- */ - async rollArmor(armorId) { - let armor = this.data.items.get(armorId) - - if (armor) { - let rollData = this.getCommonRollData(armor.data.statistic) - - armor = duplicate(armor); - this.checkAndPrepareEquipment(armor); - - rollData.mode = "armor" - rollData.armor = armor - rollData.title = `Armor : ${armor.name}` - rollData.isResistance = true; - rollData.img = armor.img - rollData.otherDicesLevel = armor.data.resistance - - this.startRoll(rollData); - } else { - ui.notifications.warn("Armor not found !", weaponId); - } - } - - /* -------------------------------------------- */ - async rollPower(powerId) { - let power = this.data.items.get(powerId) - - if (power) { - power = duplicate(power) - let rollData = this.getCommonRollData(power.data.statistic) - - rollData.mode = "power" - rollData.power = power - rollData.title = `Power : ${power.name}` - rollData.img = power.img - - this.startRoll(rollData); - } else { - ui.notifications.warn("Power not found !", powerId); - } - } } diff --git a/modules/imperium5-combat.js b/modules/imperium5-combat.js index 352736f..44f2d6a 100644 --- a/modules/imperium5-combat.js +++ b/modules/imperium5-combat.js @@ -1,7 +1,7 @@ -import { Imperium5Utility } from "./imperium5pegasus-utility.js"; +import { Imperium5Utility } from "./imperium5-utility.js"; /* -------------------------------------------- */ -export class PegasusCombat extends Combat { +export class Imperium5Combat extends Combat { /* -------------------------------------------- */ async rollInitiative(ids, formula = undefined, messageOptions = {} ) { @@ -20,19 +20,4 @@ export class PegasusCombat extends Combat { _onUpdate(changed, options, userId) { } - /* -------------------------------------------- */ - static async checkTurnPosition() { - while (game.combat.turn > 0) { - await game.combat.previousTurn() - } - } - - /* -------------------------------------------- */ - static async decInitBy10( combatantId, value) { - const combatant = game.combat.combatants.get(combatantId) - let initValue = combatant.initiative + value - await game.combat.setInitiative(combatantId, initValue) - setTimeout( this.checkTurnPosition, 400) // The setInitiative is no more blocking for unknown reason - } - } diff --git a/modules/imperium5-commands.js b/modules/imperium5-commands.js index f332e11..beb795b 100644 --- a/modules/imperium5-commands.js +++ b/modules/imperium5-commands.js @@ -4,14 +4,13 @@ import { Imperium5Utility } from "./imperium5-utility.js"; import { Imperium5RollDialog } from "./imperium5-roll-dialog.js"; /* -------------------------------------------- */ -export class PegasusCommands { +export class Imperium5Commands { static init() { - if (!game.system.pegasus.commands) { - const pegasusCommands = new PegasusCommands(); - pegasusCommands.registerCommand({ path: ["/char"], func: (content, msg, params) => pegasusCommands.createChar(msg), descr: "Create a new character" }); - pegasusCommands.registerCommand({ path: ["/pool"], func: (content, msg, params) => pegasusCommands.poolRoll(msg), descr: "Generic Roll Window" }); - game.system.pegasus.commands = pegasusCommands; + if (!game.system.imperium5.commands) { + const imperium5Commands = new Imperium5Commands(); + //imperium5Commands.registerCommand({ path: ["/char"], func: (content, msg, params) => imperium5Commands.createChar(msg), descr: "Créer un personnnage" }); + game.system.imperium5.commands = imperium5Commands; } } constructor() { @@ -96,11 +95,6 @@ export class PegasusCommands { return false; } - /* -------------------------------------------- */ - async createChar(msg) { - game.system.pegasus.creator = new PegasusActorCreate(); - game.system.pegasus.creator.start(); - } /* -------------------------------------------- */ static _chatAnswer(msg, content) { @@ -111,12 +105,12 @@ export class PegasusCommands { /* -------------------------------------------- */ async poolRoll( msg) { - let rollData = PegasusUtility.getBasicRollData() + let rollData = Imperium5Utility.getBasicRollData() rollData.alias = "Dice Pool Roll", rollData.mode = "generic" rollData.title = `Dice Pool Roll`; - let rollDialog = await PegasusRollDialog.create( this, rollData); + let rollDialog = await Imperium5RollDialog.create( this, rollData); rollDialog.render( true ); } diff --git a/modules/imperium5-item-sheet.js b/modules/imperium5-item-sheet.js index 014076d..b902708 100644 --- a/modules/imperium5-item-sheet.js +++ b/modules/imperium5-item-sheet.js @@ -1,17 +1,19 @@ import { Imperium5Utility } from "./imperium5-utility.js"; +/* -------------------------------------------- */ /** * Extend the basic ItemSheet with some very simple modifications * @extends {ItemSheet} */ -export class PegasusItemSheet extends ItemSheet { +export class Imperium5ItemSheet extends ItemSheet { + /* -------------------------------------------- */ /** @override */ static get defaultOptions() { return mergeObject(super.defaultOptions, { - classes: ["fvtt-pegasus-rpg", "sheet", "item"], - template: "systems/fvtt-pegasus-rpg/templates/item-sheet.html", + classes: ["fvtt-imperium5", "sheet", "item"], + template: "systems/fvtt-imperium5/templates/item-sheet.html", dragDrop: [{ dragSelector: null, dropSelector: null }], width: 620, height: 550, @@ -48,9 +50,9 @@ export class PegasusItemSheet extends ItemSheet { /* -------------------------------------------- */ async getData() { - const objectData = PegasusUtility.data(this.object); + const objectData = Imperium5Utility.data(this.object); - let itemData = foundry.utils.deepClone(PegasusUtility.templateData(this.object)); + let itemData = foundry.utils.deepClone(Imperium5Utility.templateData(this.object)); let formData = { title: this.title, id: this.id, @@ -59,13 +61,10 @@ export class PegasusItemSheet extends ItemSheet { name: objectData.name, editable: this.isEditable, cssClass: this.isEditable ? "editable" : "locked", - optionsDiceList: PegasusUtility.getOptionsDiceList(), - optionsStatusList: PegasusUtility.getOptionsStatusList(), data: itemData, limited: this.object.limited, options: this.options, owner: this.document.isOwner, - mr: (this.object.type == 'specialisation'), isGM: game.user.isGM } @@ -88,13 +87,13 @@ export class PegasusItemSheet extends ItemSheet { /* -------------------------------------------- */ postItem() { - let chatData = duplicate(PegasusUtility.data(this.item)); + let chatData = duplicate( Imperium5Utility.data(this.item) ) if (this.actor) { - chatData.actor = { id: this.actor.id }; + chatData.actor = { id: this.actor.id } } // Don't post any image for the item (which would leave a large gap) if the default image is used if (chatData.img.includes("/blank.png")) { - chatData.img = null; + chatData.img = null } // JSON object for easy creation chatData.jsondata = JSON.stringify( @@ -103,8 +102,8 @@ export class PegasusItemSheet extends ItemSheet { payload: chatData, }); - renderTemplate('systems/fvtt-pegasus-rpg/templates/post-item.html', chatData).then(html => { - let chatOptions = PegasusUtility.chatDataSetup(html); + renderTemplate('systems/fvtt-imperium5/templates/post-item.html', chatData).then(html => { + let chatOptions = Imperium5Utility.chatDataSetup(html); ChatMessage.create(chatOptions) }); } @@ -117,7 +116,7 @@ export class PegasusItemSheet extends ItemSheet { if (itemData.name != 'None') { let spec = await Item.create(itemData, { temporary: true }); spec.data.origin = "embeddedItem"; - new PegasusItemSheet(spec).render(true); + new Imperium5ItemSheet(spec).render(true); } } @@ -144,7 +143,7 @@ export class PegasusItemSheet extends ItemSheet { if (itemData.name != 'None') { let spec = await Item.create(itemData, { temporary: true }); spec.data.origin = "embeddedItem"; - new PegasusItemSheet(spec).render(true); + new Imperium5ItemSheet(spec).render(true); } } @@ -162,343 +161,30 @@ export class PegasusItemSheet extends ItemSheet { const li = $(ev.currentTarget).parents(".item"); const item = this.object.options.actor.getOwnedItem(li.data("item-id")); item.sheet.render(true); - }); - - html.find('.delete-spec').click(ev => { - this.object.update({ "data.specialisation": [{ name: 'None' }] }); - }); + }) html.find('.delete-subitem').click(ev => { 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"); let itemId = li.data("item-id"); let itemType = li.data("item-type"); - }); - - html.find('.view-subitem').click(ev => { - this.viewSubitem(ev); - }); - - html.find('.view-spec').click(ev => { - this.manageSpec(); - }); + }) } - /* -------------------------------------------- */ - async addAbility(event, item, dataItem) { - let newItem = duplicate(item.data); - newItem._id = randomID(dataItem.id.length); - console.log("ABB", event, item, dataItem) - if (event.toElement.className == 'drop-abilities') { - let abilityArray = duplicate(this.object.data.data.abilities); - abilityArray.push(newItem); - await this.object.update({ 'data.abilities': abilityArray }); - } - if (event.toElement.className == 'drop-optionnal-abilities') { - let abilityArray = duplicate(this.object.data.data.optionnalabilities); - abilityArray.push(newItem); - await this.object.update({ 'data.optionnalabilities': abilityArray }); - } - } - - /* -------------------------------------------- */ - async addRacePerk(event, item, dataItem) { - let newItem = duplicate(item.data); - newItem._id = randomID(dataItem.id.length); - if (event.toElement.className == 'drop-race-perk') { - let perkArray = duplicate(this.object.data.data.perks); - perkArray.push(newItem); - await this.object.update({ 'data.perks': perkArray }); - } - } - - /* -------------------------------------------- */ - async addSpecialisation(item, dataItem) { - let newItem = duplicate(item.data); - newItem._id = randomID(dataItem.id.length); - let specArray = [newItem]; - await this.object.update({ 'data.specialisation': specArray }); - } - - /* -------------------------------------------- */ - async addRoleSpecialisation(event, item, dataItem) { - let newItem = duplicate(item.data); - newItem._id = randomID(dataItem.id.length); - console.log("Add spec", event, newItem); - if (event.toElement.className == 'drop-spec1') { - let specArray = duplicate(this.object.data.data.specialisationsplus1); - specArray.push(newItem); - await this.object.update({ 'data.specialisationsplus1': specArray }); - } - if (event.toElement.className == 'drop-spec2') { - let specArray = duplicate(this.object.data.data.specincrease); - specArray.push(newItem); - await this.object.update({ 'data.specincrease': specArray }); - } - } - - /* -------------------------------------------- */ - async addRolePerk(event, item, dataItem) { - let newItem = duplicate(item.data); - newItem._id = randomID(dataItem.id.length); - console.log("Add spec", event, newItem); - if (event.toElement.className == 'drop-perk2') { - let perkArray = duplicate(this.object.data.data.perks); - perkArray.push(newItem); - await this.object.update({ 'data.perks': perkArray }); - } - if (event.toElement.className == 'drop-specialperk1') { - let perkArray = duplicate(this.object.data.data.specialperk); - perkArray.push(newItem); - await this.object.update({ 'data.specialperk': perkArray }); - } - } - - /* -------------------------------------------- */ - async addPower(event, item, dataItem) { - let newItem = duplicate(item.data); - newItem._id = randomID(dataItem.id.length); - if (event.toElement.className == 'drop-spec-power') { - let powArray = duplicate(this.object.data.data.powers); - powArray.push(newItem); - await this.object.update({ 'data.powers': powArray }); - } - } - - /* -------------------------------------------- */ - async addAbilityPower(event, item, dataItem) { - let newItem = duplicate(item.data); - newItem._id = randomID(dataItem.id.length); - if (event.toElement.className == 'drop-ability-power') { - let powArray = duplicate(this.object.data.data.powersgained); - powArray.push(newItem); - await this.object.update({ 'data.powersgained': powArray }); - } - } - /* -------------------------------------------- */ - async addAbilityEffect(event, item, dataItem) { - let newItem = duplicate(item.data); - newItem._id = randomID(dataItem.id.length); - if (event.toElement.className == 'drop-ability-effect') { - let powArray = duplicate(this.object.data.data.effectsgained); - powArray.push(newItem); - await this.object.update({ 'data.effectsgained': powArray }); - } - } - - /* -------------------------------------------- */ - async addAbilitySpec(event, item, dataItem) { - let newItem = duplicate(item.data); - newItem._id = randomID(dataItem.id.length); - if (event.toElement.className == 'drop-ability-spec') { - let powArray = duplicate(this.object.data.data.specialisations); - powArray.push(newItem); - await this.object.update({ 'data.specialisations': powArray }); - } - } - /* -------------------------------------------- */ - async addAbilityWeaponArmor(event, item, dataItem) { - let newItem = duplicate(item.data); - newItem._id = randomID(dataItem.id.length); - if (event.toElement.className == 'drop-ability-weapon') { - let weaponArray = duplicate(this.object.data.data.attackgained); - weaponArray.push(newItem); - await this.object.update({ 'data.attackgained': weaponArray }); - } - if (event.toElement.className == 'drop-ability-armor') { - let armorArray = duplicate(this.object.data.data.armorgained); - armorArray.push(newItem); - await this.object.update({ 'data.armorgained': armorArray }); - } - } - - /* -------------------------------------------- */ - async addPerkSpecialisation(event, item, dataItem) { - let newItem = duplicate(item.data); - if (event.toElement.className == 'drop-spec-perk') { - //console.log("PER SPEC", event) - let key = event.toElement.dataset["key"]; - if (key == 'affectedspec') { - await this.object.update({ 'data.features.affectedspec.value': newItem.name }); - } else { - await this.object.update({ 'data.features.gainspecdice.value': newItem.name }); - } - } - } - - /* -------------------------------------------- */ - 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 addEffectPower(event, item, dataItem) { - let newItem = duplicate(item.data) - if (event.toElement.className == 'drop-power-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); - if (event.toElement.className == 'drop-effect-spec') { - let specArray = duplicate(this.object.data.data.recoveryrollspec); - specArray.push(newItem); - await this.object.update({ 'data.recoveryrollspec': specArray }); - } - if (event.toElement.className == 'drop-effect-specaffected') { - let specArray = duplicate(this.object.data.data.specaffected); - specArray.push(newItem); - await this.object.update({ 'data.specaffected': specArray }); - } - } - - /* -------------------------------------------- */ - async addEffectItem(event, item, dataItem) { - let newItem = duplicate(item.data); - if (event.toElement.className == 'drop-equipment-effect') { - let effectArray = duplicate(this.object.data.data.effects); - effectArray.push(newItem); - await this.object.update({ 'data.effects': effectArray }); - } - } /* -------------------------------------------- */ async _onDrop(event) { - - if (this.object.type == 'weapon' || this.object.type == 'armor' || this.object.type == 'shield' - || this.object.type == 'equipment') { - let data = event.dataTransfer.getData('text/plain'); - if (data) { - let dataItem = JSON.parse(data); - let item = await PegasusUtility.searchItem(dataItem); - if (item.data.type == 'effect') { - return this.addEffectItem(event, item, dataItem); - } - } - } - - if (this.object.type == 'power') { - let data = event.dataTransfer.getData('text/plain'); - if (data) { - let dataItem = JSON.parse(data); - let item = await PegasusUtility.searchItem(dataItem); - if (item.data.type == 'effect') { - return this.addEffectPower(event, item, dataItem); - } - } - } - - if (this.object.type == 'effect') { - let data = event.dataTransfer.getData('text/plain'); - if (data) { - let dataItem = JSON.parse(data); - let item = await PegasusUtility.searchItem(dataItem); - if (item.data.type == 'specialisation') { - return this.addEffectSpec(event, item, dataItem); - } - } - } - - if (this.object.type == 'race') { - let data = event.dataTransfer.getData('text/plain'); - if (data) { - let dataItem = JSON.parse(data); - let item = await PegasusUtility.searchItem(dataItem); - if (item.data.type == 'ability') { - return this.addAbility(event, item, dataItem); - } - if (item.data.type == 'perk') { - return this.addRacePerk(event, item, dataItem); - } - } - } - - if (this.object.type == 'perk') { - let data = event.dataTransfer.getData('text/plain') - if (data) { - let dataItem = JSON.parse(data); - let item = await PegasusUtility.searchItem(dataItem) - if (item.data.type == 'specialisation') { - return this.addPerkSpecialisation(event, item, dataItem) - } - if (item.data.type == 'effect') { - return this.addPerkEffect(event, item, dataItem); - } - } - } - - if (this.object.type == 'specialisation') { - let data = event.dataTransfer.getData('text/plain'); - if (data) { - let dataItem = JSON.parse(data); - let item = await PegasusUtility.searchItem(dataItem); - if (item.data.type == 'power') { - return this.addPower(event, item, dataItem); - } - } - } - if (this.object.type == 'ability') { - let data = event.dataTransfer.getData('text/plain'); - if (data) { - let dataItem = JSON.parse(data); - let item = await PegasusUtility.searchItem(dataItem); - if (item.data.type == 'effect') { - return this.addAbilityEffect(event, item, dataItem); - } - if (item.data.type == 'power') { - return this.addAbilityPower(event, item, dataItem); - } - if (item.data.type == 'specialisation') { - return this.addAbilitySpec(event, item, dataItem); - } - if (item.data.type == 'weapon' || item.data.type == 'armor') { - return this.addAbilityWeaponArmor(event, item, dataItem); - } - } - } - - if (this.object.type == 'role') { - let data = event.dataTransfer.getData('text/plain'); - if (data) { - let dataItem = JSON.parse(data); - let item = await PegasusUtility.searchItem(dataItem); - if (item.data.type == 'specialisation') { - return this.addRoleSpecialisation(event, item, dataItem); - } - if (item.data.type == 'perk') { - return this.addRolePerk(event, item, dataItem); - } - } - } - - ui.notifications.warn("This item can not be dropped over another item"); } /* -------------------------------------------- */ get template() { let type = this.item.type; - return `systems/fvtt-pegasus-rpg/templates/item-${type}-sheet.html`; + return `systems/fvtt-imperium5/templates/item-default-sheet.html`; } /* -------------------------------------------- */ diff --git a/modules/imperium5-item.js b/modules/imperium5-item.js index ffdcd82..bd61122 100644 --- a/modules/imperium5-item.js +++ b/modules/imperium5-item.js @@ -1,32 +1,19 @@ export const defaultItemImg = { - specialisation: "systems/fvtt-pegasus-rpg/images/icons/icon_spec.webp", - perk: "systems/fvtt-pegasus-rpg/images/icons/icon_perk.webp", - ability: "systems/fvtt-pegasus-rpg/images/icons/icon_raceability.webp", - armor: "systems/fvtt-pegasus-rpg/images/icons/icon_armour.webp", - weapon: "systems/fvtt-pegasus-rpg/images/icons/icon_weapon.webp", - equipment: "systems/fvtt-pegasus-rpg/images/icons/icon_equipment.webp", - effect: "systems/fvtt-pegasus-rpg/images/icons/icon_effect.webp", - race: "systems/fvtt-pegasus-rpg/images/icons/icon_race.webp", - power: "systems/fvtt-pegasus-rpg/images/icons/icon_power.webp", - armour: "systems/fvtt-pegasus-rpg/images/icons/icon_armour.webp", - equipment: "systems/fvtt-pegasus-rpg/images/icons/icon_equipment.webp", - weapon: "systems/fvtt-pegasus-rpg/images/icons/icon_meleeweapon.webp", - shield: "systems/fvtt-pegasus-rpg/images/icons/icon_shield.webp", - money: "systems/fvtt-pegasus-rpg/images/icons/icon_money.webp", + archetype: "systems/fvtt-imperium5/images/icons/archetype.webp", } /** * Extend the basic ItemSheet with some very simple modifications * @extends {ItemSheet} */ -export class PegasusItem extends Item { +export class Imperium5Item extends Item { constructor(data, context) { if (!data.img) { - data.img = defaultItemImg[data.type]; + data.img = defaultItemImg[data.type] } - super(data, context); + super(data, context) } } diff --git a/modules/imperium5-main.js b/modules/imperium5-main.js index e76dac8..ff9996e 100644 --- a/modules/imperium5-main.js +++ b/modules/imperium5-main.js @@ -21,21 +21,11 @@ import { Imperium5Item } from "./imperium5-item.js"; /************************************************************************************/ Hooks.once("init", async function () { - console.log(`Initializing Pegasus RPG`); + console.log(`Initializing Imperium5 RPG`); /* -------------------------------------------- */ // preload handlebars templates - PegasusUtility.preloadHandlebarsTemplates(); - - /* -------------------------------------------- */ - game.settings.register("fvtt-pegasus-rpg", "dice-max-level", { - name: "Maximum level value for dices lists", - hint: "Se the maximum level value for dices lists", - scope: "world", - config: true, - default: 20, - type: Number - }); + Imperium5Utility.preloadHandlebarsTemplates(); /* -------------------------------------------- */ // Set an initiative formula for the system @@ -45,30 +35,28 @@ Hooks.once("init", async function () { }; /* -------------------------------------------- */ - game.socket.on("system.fvtt-pegasus-rpg", data => { - PegasusUtility.onSocketMesssage(data) + game.socket.on("system.fvtt-imperium5", data => { + Imperium5Utility.onSocketMesssage(data) }); /* -------------------------------------------- */ // Define custom Entity classes - CONFIG.Combat.documentClass = PegasusCombat - CONFIG.Actor.documentClass = PegasusActor - CONFIG.Item.documentClass = PegasusItem - //CONFIG.Token.objectClass = PegasusToken - game.system.pegasus = { }; + CONFIG.Combat.documentClass = Imperium5Combat + CONFIG.Actor.documentClass = Imperium5Actor + CONFIG.Item.documentClass = Imperium5Item + game.system.imperium5 = { } /* -------------------------------------------- */ // Register sheet application classes - Actors.unregisterSheet("core", ActorSheet); - Actors.registerSheet("fvtt-pegasus", PegasusActorSheet, { types: ["character"], makeDefault: true }); - Actors.registerSheet("fvtt-pegasus", PegasusNPCSheet, { types: ["npc"], makeDefault: false }); + Actors.unregisterSheet("core", ActorSheet) + Actors.registerSheet("fvtt-imperium5", Imperium5ActorSheet, { types: ["character"], makeDefault: true }) - Items.unregisterSheet("core", ItemSheet); - Items.registerSheet("fvtt-pegasus", PegasusItemSheet, { makeDefault: true }); + Items.unregisterSheet("core", ItemSheet) + Items.registerSheet("fvtt-imperium5", Imperium5ItemSheet, { makeDefault: true } ) - PegasusUtility.init(); + Imperium5Utility.init() -}); +}) /* -------------------------------------------- */ function welcomeMessage() { @@ -76,15 +64,7 @@ function welcomeMessage() { user: game.user.id, whisper: [game.user.id], content: `
- Welcome to the Pegasus Engine CORE RPG. -
Created by GMD Online -

The Pegasus Engine is a available for free on our website. It is also available as a PDF and in Print format at an affordable price.

-

This project has been made possible thanks to all the Official GMD Members and Patreon Members that have supported me and as a result made it possible to supply this interface for free.

-

In return I have made available a fully detailed Compendium for FREE for all members, which can be obtained from the Members page on my website.

-

You too can become a supporter for future projects and enjoy amazing rewards. -
Sign up Here : https://www.gmdonline.co.uk/gmdmemberspage/

-

GMD Online, GMD CORE RPG logo are © 2018 CORE Worlds and Game Rules © 2001. Interface © 2021 All rights reserved.

-

Enjoy and become the hero you were born to be!

+ Bienvenue dans Imperium5 ! ` }); } @@ -93,36 +73,36 @@ function welcomeMessage() { /* -------------------------------------------- */ Hooks.once("ready", function () { - PegasusUtility.ready(); - // User warning + Imperium5Utility.ready() + if (!game.user.isGM && game.user.character == undefined) { - ui.notifications.info("Warning ! No character linked to your user !"); + ui.notifications.info("Attention ! Aucun personnage n'est relié !") ChatMessage.create({ - content: "WARNING The player " + game.user.name + " is not linked to a character !", + content: "WARNING Le joueur " + game.user.name + " n'est pas connecté à un personnage !", user: game.user._id }); } // CSS patch for v9 if (game.version) { - let sidebar = document.getElementById("sidebar"); - sidebar.style.width = "min-content"; + let sidebar = document.getElementById("sidebar") + sidebar.style.width = "min-content" } - welcomeMessage(); -}); + welcomeMessage() +}) /* -------------------------------------------- */ /* Foundry VTT Initialization */ /* -------------------------------------------- */ Hooks.on("chatMessage", (html, content, msg) => { if (content[0] == '/') { - let regExp = /(\S+)/g; - let commands = content.match(regExp); - if (game.system.pegasus.commands.processChatCommand(commands, content, msg)) { - return false; + let regExp = /(\S+)/g + let commands = content.match(regExp) + if (game.system.imperium5.commands.processChatCommand(commands, content, msg)) { + return false } } - return true; + return true }); diff --git a/modules/imperium5-roll-dialog.js b/modules/imperium5-roll-dialog.js index a963c69..c347238 100644 --- a/modules/imperium5-roll-dialog.js +++ b/modules/imperium5-roll-dialog.js @@ -1,20 +1,20 @@ import { Imperium5Utility } from "./imperium5-utility.js"; -export class PegasusRollDialog extends Dialog { +export class Imperium5RollDialog extends Dialog { /* -------------------------------------------- */ static async create(actor, rollData ) { - let options = { classes: ["PegasusDialog"], width: 620, height: 380, 'z-index': 99999 }; - let html = await renderTemplate('systems/fvtt-pegasus-rpg/templates/roll-dialog-generic.html', rollData); + let options = { classes: ["Imperium5Dialog"], width: 620, height: 380, 'z-index': 99999 } + let html = await renderTemplate('systems/fvtt-imperium5/templates/roll-dialog-generic.html', rollData) - return new PegasusRollDialog(actor, rollData, html, options ); + return new Imperium5RollDialog(actor, rollData, html, options ) } /* -------------------------------------------- */ constructor(actor, rollData, html, options, close = undefined) { let conf = { - title: (rollData.mode == "skill") ? "Skill" : "Roll", + title:"Jet", content: html, buttons: { roll: { @@ -38,202 +38,17 @@ export class PegasusRollDialog extends Dialog { /* -------------------------------------------- */ roll () { - PegasusUtility.rollPegasus( this.rollData ) + Imperium5Utility.rollImperium5( this.rollData ) } - /* -------------------------------------------- */ - manageEffects( effectIdx, toggled) { - let effect = this.rollData.effectsList[effectIdx] - if (effect) { - effect.applied = toggled - - let level, genre, idVal - if (effect.type == 'hindrance' ) { - level = effect.value - genre = 'positive' - idVal = "#hindranceDicesLevel" - } - if (effect.type == 'effect' ) { - let effectData = effect.effect - level = effectData.data.effectlevel - genre = effectData.data.genre - effectData.data.isUsed = toggled - if (effectData.data.bonusdice) { - idVal = "#bonusDicesLevel" - } - if (effectData.data.reducedicevalue || effectData.data.statdice) { - idVal = "#statDicesLevel" - } - if (effectData.data.otherdice) { - idVal = "#otherDicesLevel" - } - if (effectData.data.hindrance) { - idVal = "#hindranceDicesLevel" - genre = 'positive' // Dynamic fix - } - } - // Now process the dice level update - let newLevel = Number($(idVal).val()) - console.log("Ongoing", newLevel, toggled, idVal ) - if (toggled) { - if ( genre == 'positive') { - newLevel += Number(level) - }else { - newLevel -= Number(level) - } - }else { - if ( genre == 'positive') { - newLevel -= Number(level) - }else { - newLevel += Number(level) - } - } - newLevel = (newLevel<0) ? 0 : newLevel - $(idVal).val(newLevel) - } - //console.log("Effect", effect, toggled) - this.rollData.statDicesLevel = Number($('#statDicesLevel').val()) - this.rollData.specDicesLevel = Number($('#specDicesLevel').val()) - this.rollData.bonusDicesLevel = Number($('#bonusDicesLevel').val()) - this.rollData.hindranceDicesLevel = Number($('#hindranceDicesLevel').val()) - this.rollData.otherDicesLevel = Number($('#otherDicesLevel').val()) - } - - /* -------------------------------------------- */ - manageArmors( armorIdx, toggled) { - let armor = this.rollData.armorsList[armorIdx] - if (armor) { - armor.applied = toggled - if (armor.type == 'other' ) { - if (toggled) { - this.rollData.otherDicesLevel += Number(armor.value) - } else { - this.rollData.otherDicesLevel -= Number(armor.value) - this.rollData.otherDicesLevel = (this.rollData.otherDicesLevel<0) ? 0 : this.rollData.otherDicesLevel - } - $("#otherDicesLevel").val(this.rollData.otherDicesLevel) - } - } - console.log("Armor", armorIdx, toggled) - } - - /* -------------------------------------------- */ - manageWeapons( weaponIdx, toggled) { - let weapon = this.rollData.weaponsList[weaponIdx] - if (weapon) { - if (toggled) { - this.rollData.weaponName = weapon.weapon.name - } else { - this.rollData.weaponName = undefined - } - weapon.applied = toggled - if (weapon.type == 'damage' || weapon.type == 'enhanced' ) { - if (toggled) { - this.rollData.otherDicesLevel += Number(weapon.value) - } else { - this.rollData.weaponName = undefined - this.rollData.otherDicesLevel -= Number(weapon.value) - this.rollData.otherDicesLevel = (this.rollData.otherDicesLevel<0) ? 0 : this.rollData.otherDicesLevel - } - $("#otherDicesLevel").val(this.rollData.otherDicesLevel) - } - } - console.log("Weapon", weaponIdx, toggled, this.rollData.otherDicesLevel, weapon) - } - - /* -------------------------------------------- */ - manageEquip( equipIdx, toggled) { - let equip = this.rollData.equipmentsList[equipIdx] - if (equip) { - equip.applied = toggled - let idVal = "#otherDicesLevel" // Default - if (equip.equip.data.bonusdice) { - idVal = "#bonusDicesLevel" - } - if (equip.equip.data.statdice) { - idVal = "#statDicesLevel" - } - if (equip.equip.data.otherdice) { - idVal = "#otherDicesLevel" - } - let newLevel = Number($(idVal).val()) - if (toggled) { - newLevel += Number(equip.value) - } else { - newLevel -= Number(equip.value) - } - newLevel = (newLevel <0) ? 0 : newLevel - $(idVal).val(newLevel) - // Then refresh - this.rollData.statDicesLevel = Number($('#statDicesLevel').val()) - this.rollData.specDicesLevel = Number($('#specDicesLevel').val()) - this.rollData.bonusDicesLevel = Number($('#bonusDicesLevel').val()) - this.rollData.hindranceDicesLevel = Number($('#hindranceDicesLevel').val()) - this.rollData.otherDicesLevel = Number($('#otherDicesLevel').val()) - } - } - /* -------------------------------------------- */ activateListeners(html) { - super.activateListeners(html); + super.activateListeners(html) - var dialog = this; + var dialog = this function onLoad() { } - $(function () { onLoad(); }); - - html.find('#specList').change(async (event) => { - this.rollData.selectedSpec = event.currentTarget.value - let spec = this.rollData.specList.find(item => item._id == this.rollData.selectedSpec) - if ( spec) { - this.rollData.specDiceLevel = spec.data.level - this.rollData.specName = spec.name - $('#specDicesLevel').val(this.rollData.specDiceLevel) - } else { - this.rollData.specName = undefined - $('#specDicesLevel').val(0) - } - const content = await renderTemplate("systems/fvtt-pegasus-rpg/templates/roll-dialog-generic.html", this.rollData) - this.data.content = content - this.render(true) - }); - html.find('#statDicesLevel').change((event) => { - this.rollData.statDicesLevel = Number(event.currentTarget.value) - }); - html.find('#specDicesLevel').change((event) => { - this.rollData.specDicesLevel = Number(event.currentTarget.value) - }); - html.find('#bonusDicesLevel').change((event) => { - this.rollData.bonusDicesLevel = Number(event.currentTarget.value) - }); - html.find('#hindranceDicesLevel').change((event) => { - this.rollData.hindranceDicesLevel = Number(event.currentTarget.value) - }); - html.find('#otherDicesLevel').change((event) => { - this.rollData.otherDicesLevel = Number(event.currentTarget.value) - }); - html.find('.effect-clicked').change((event) => { - let toggled = event.currentTarget.checked - let effectIdx = $(event.currentTarget).data("effect-idx") - this.manageEffects( effectIdx, toggled) - }); - html.find('.armor-clicked').change((event) => { - let toggled = event.currentTarget.checked - let armorIdx = $(event.currentTarget).data("armor-idx") - this.manageArmors( armorIdx, toggled) - }); - html.find('.weapon-clicked').change((event) => { - let toggled = event.currentTarget.checked - let weaponIdx = $(event.currentTarget).data("weapon-idx") - this.manageWeapons( weaponIdx, toggled) - }); - html.find('.equip-clicked').change((event) => { - let toggled = event.currentTarget.checked - let equipIdx = $(event.currentTarget).data("equip-idx") - this.manageEquip( equipIdx, toggled) - }); - - + $(function () { onLoad(); }) } } \ No newline at end of file diff --git a/modules/imperium5-utility.js b/modules/imperium5-utility.js index c7e49aa..9976b12 100644 --- a/modules/imperium5-utility.js +++ b/modules/imperium5-utility.js @@ -12,21 +12,16 @@ export class Imperium5Utility { /* -------------------------------------------- */ static async init() { - Hooks.on('renderChatLog', (log, html, data) => PegasusUtility.chatListeners(html)); + Hooks.on('renderChatLog', (log, html, data) => Imperium5Utility.chatListeners(html)); + Hooks.on("getCombatTrackerEntryContext", (html, options) => { - PegasusUtility.pushInitiativeOptions(html, options); - }); - Hooks.on("dropCanvasData", (canvas, data) => { - PegasusUtility.dropItemOnToken(canvas, data) - }); + Imperium5Utility.pushInitiativeOptions(html, options); + }) this.rollDataStore = {} this.defenderStore = {} - this.diceList = []; - this.diceFoundryList = []; - this.optionsDiceList = ""; - this.buildDiceLists(); - PegasusCommands.init(); + this.diceList = [] + Imperium5Commands.init(); Handlebars.registerHelper('count', function (list) { return list.length; @@ -50,23 +45,18 @@ export class Imperium5Utility { Handlebars.registerHelper('mul', function (a, b) { return parseInt(a) * parseInt(b); }) + Handlebars.registerHelper('exists', function (val) { + return val != null && val != undefined; + }) } /* -------------------------------------------- */ 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); } }) - } - - /* -------------------------------------------- */ - static getSpecs() { - return this.specs; } /* -------------------------------------------- */ static async ready() { - const specs = await PegasusUtility.loadCompendium("fvtt-pegasus-rpg.specialisations"); - this.specs = specs.map(i => i.toObject()); + } /* -------------------------------------------- */ @@ -81,30 +71,6 @@ export class Imperium5Utility { ChatMessage.create(chatData); } - /* -------------------------------------------- */ - 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) - if (game.user.isGM || token.actor.isOwner) { - this.addItemDropToActor(token.actor, item) - } else { - game.socket.emit("system.fvtt-pegasus-rpg", { name: "msg_gm_item_drop", data: { actorId: token.actor.id, itemId: item.id, isPack: item.pack } }) - } - return - } - } - } - /* -------------------------------------------- */ static async loadCompendiumData(compendium) { const pack = game.packs.get(compendium); @@ -113,106 +79,31 @@ export class Imperium5Utility { /* -------------------------------------------- */ static async loadCompendium(compendium, filter = item => true) { - let compendiumData = await PegasusUtility.loadCompendiumData(compendium); + let compendiumData = await Imperium5Utility.loadCompendiumData(compendium); return compendiumData.filter(filter); } - /* -------------------------------------------- */ - static buildDiceLists() { - let maxLevel = game.settings.get("fvtt-pegasus-rpg", "dice-max-level"); - let diceList = ["0"]; - let diceValues = [0]; - let diceFoundryList = ["d0"]; - let diceLevel = 1; - let concat = ""; - let concatFoundry = ""; - let optionsDiceList = ''; - let optionsLevel = ''; - for (let i = 1; i <= maxLevel; i++) { - let currentDices = concat + __level2Dice[diceLevel]; - diceList.push(currentDices); - diceFoundryList.push(concatFoundry + __level2Dice[diceLevel] + "x"); - if (__level2Dice[diceLevel] == "d12") { - concat = concat + "d12 "; - concatFoundry = concatFoundry + "d12x, "; - diceLevel = 1; - } else { - diceLevel++; - } - optionsDiceList += ``; - optionsLevel += ``; - } - this.diceList = diceList; - this.diceFoundryList = diceFoundryList; - this.optionsDiceList = optionsDiceList; - this.optionsLevel = optionsLevel; - - this.optionsStatusList = ''; - - } - /* -------------------------------------------- */ static getOptionsStatusList() { return this.optionsStatusList; } - /* -------------------------------------------- */ - static getOptionsDiceList() { - return this.optionsDiceList; - } - /* -------------------------------------------- */ - static getOptionsLevel() { - return this.optionsLevel; - } - - /* -------------------------------------------- */ - static computeAttackDefense(defenseRollId) { - let defenseRollData = this.getRollData(defenseRollId); - let attackRollData = this.getRollData(defenseRollData.linkedRollId); - let defender = game.actors.get(defenseRollData.actorId); - defender.processDefenseResult(defenseRollData, attackRollData); - } - - /* -------------------------------------------- */ - static applyDamage(defenseRollId) { - let defenseRollData = this.getRollData(defenseRollId); - let defender = game.actors.get(defenseRollData.actorId); - defender.applyDamageLoss(defenseRollData.finalDamage); - } - - /* -------------------------------------------- */ - static applyNoDefense(actorId, attackRollId) { - let attackRollData = this.getRollData(attackRollId); - let defender = game.actors.get(actorId); - defender.processNoDefense(attackRollData); - } /* -------------------------------------------- */ static async chatListeners(html) { - html.on("click", '.chat-create-actor', event => { - game.system.pegasus.creator.processChatEvent(event); - }); html.on("click", '.view-item-from-chat', event => { game.system.pegasus.creator.openItemView(event) - }); + }) } /* -------------------------------------------- */ static async preloadHandlebarsTemplates() { const templatePaths = [ - 'systems/fvtt-pegasus-rpg/templates/editor-notes-gm.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', - 'systems/fvtt-pegasus-rpg/templates/partial-options-range.html', - 'systems/fvtt-pegasus-rpg/templates/partial-options-equipment-types.html', - 'systems/fvtt-pegasus-rpg/templates/partial-equipment-effects.html', - 'systems/fvtt-pegasus-rpg/templates/partial-actor-stat-block.html', - 'systems/fvtt-pegasus-rpg/templates/partial-actor-status.html', - 'systems/fvtt-pegasus-rpg/templates/partial-item-nav.html', - 'systems/fvtt-pegasus-rpg/templates/partial-item-description.html', - 'systems/fvtt-pegasus-rpg/templates/partial-actor-equipment.html' + 'systems/fvtt-imperium5/templates/editor-notes-gm.html', + 'systems/fvtt-imperium5/templates/actor-partial-ames.html', + 'systems/fvtt-imperium5/templates/actor-partial-paradigmes.html', + 'systems/fvtt-imperium5/templates/partial-item-description.html', ] return loadTemplates(templatePaths); } @@ -241,15 +132,15 @@ export class Imperium5Utility { } static findChatMessageId(current) { - return PegasusUtility.getChatMessageId(PegasusUtility.findChatMessage(current)); + return Imperium5Utility.getChatMessageId(Imperium5Utility.findChatMessage(current)) } static getChatMessageId(node) { - return node?.attributes.getNamedItem('data-message-id')?.value; + return node?.attributes.getNamedItem('data-message-id')?.value } static findChatMessage(current) { - return PegasusUtility.findNodeMatching(current, it => it.classList.contains('chat-message') && it.attributes.getNamedItem('data-message-id')); + return Imperium5Utility.findNodeMatching(current, it => it.classList.contains('chat-message') && it.attributes.getNamedItem('data-message-id')) } static findNodeMatching(current, predicate) { @@ -257,14 +148,14 @@ export class Imperium5Utility { if (predicate(current)) { return current; } - return PegasusUtility.findNodeMatching(current.parentElement, predicate); + return Imperium5Utility.findNodeMatching(current.parentElement, predicate) } return undefined; } /* -------------------------------------------- */ static templateData(it) { - return PegasusUtility.data(it)?.data ?? {} + return Imperium5Utility.data(it)?.data ?? {} } /* -------------------------------------------- */ @@ -275,29 +166,6 @@ export class Imperium5Utility { return it; } - /* -------------------------------------------- */ - static getDiceValue(level = 0) { - let diceString = this.diceList[level] - let diceTab = diceString.split(" ") - let diceValue = 0 - for (let dice of diceTab) { - diceValue += __name2DiceValue[dice] - } - return diceValue - } - - /* -------------------------------------------- */ - static getDiceFromLevel(level = 0) { - level = Number(level) - return this.diceList[level]; - } - /* -------------------------------------------- */ - static getFoundryDiceFromLevel(level = 0) { - level = Number(level) - //console.log(this.diceFoundryList); - return this.diceFoundryList[level]; - } - /* -------------------------------------------- */ static createDirectOptionList(min, max) { let options = {}; @@ -326,29 +194,6 @@ export class Imperium5Utility { return undefined; } - /* -------------------------------------------- */ - static getDefenseState(actorId) { - return this.defenderStore[actorId]; - } - - /* -------------------------------------------- */ - static async updateDefenseState(defenderId, rollId) { - this.defenderStore[defenderId] = rollId; - if (game.user.character && game.user.character.id == defenderId) { - let defender = game.actors.get(defenderId); - let chatData = { - user: game.user.id, - alias: defender.name, - rollMode: game.settings.get("core", "rollMode"), - whisper: [game.user.id].concat(ChatMessage.getWhisperRecipients('GM')), - content: `
${defender.name} is under attack. He must roll a skill/weapon/technique to defend himself or suffer damages (button below). - u.id); - if (chatData.rollMode === "blindroll") chatData["blind"] = true; - else if (chatData.rollMode === "selfroll") chatData["whisper"] = [game.user]; + if (["gmroll", "blindroll"].includes(chatData.rollMode)) chatData["whisper"] = ChatMessage.getWhisperRecipients("GM").map(u => u.id) + if (chatData.rollMode === "blindroll") chatData["blind"] = true + else if (chatData.rollMode === "selfroll") chatData["whisper"] = [game.user] if (forceWhisper) { // Final force ! - chatData["speaker"] = ChatMessage.getSpeaker(); - chatData["whisper"] = ChatMessage.getWhisperRecipients(forceWhisper); + chatData["speaker"] = ChatMessage.getSpeaker() + chatData["whisper"] = ChatMessage.getWhisperRecipients(forceWhisper) } return chatData; @@ -444,28 +276,13 @@ export class Imperium5Utility { whisper = [game.user.id]; break; } - await game.dice3d.showForRoll(roll, game.user, true, whisper, blind); + await game.dice3d.showForRoll(roll, game.user, true, whisper, blind) } } } /* -------------------------------------------- */ - 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) { + static async rollImperium5(rollData) { 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) { @@ -477,7 +294,7 @@ export class Imperium5Utility { } if (rollData.selectedSpec && rollData.selectedSpec != "0") { rollData.spec = rollData.specList.find(item => item._id == rollData.selectedSpec); - rollData.spec.data.dice = PegasusUtility.getDiceFromLevel(rollData.spec.data.level); + rollData.spec.data.dice = Imperium5Utility.getDiceFromLevel(rollData.spec.data.level); } if (rollData.spec) { dicePool[1].level += Number(rollData.spec.data.level); @@ -521,7 +338,7 @@ export class Imperium5Utility { } this.createChatWithRollMode(rollData.alias, { - content: await renderTemplate(`systems/fvtt-pegasus-rpg/templates/chat-generic-result.html`, rollData) + content: await renderTemplate(`systems/fvtt-imperium5/templates/chat-generic-result.html`, rollData) }); // Init stuf @@ -536,29 +353,23 @@ export class Imperium5Utility { this.saveRollData(rollData); } - /* -------------------------------------------- */ - static getDamageDice(result) { - if (result < 0) return 0; - return Math.floor(result / 5) + 1; - } - /* ------------------------- ------------------- */ static async updateRoll(rollData) { - let diceResults = rollData.diceResults; - let sortedRoll = []; + let diceResults = rollData.diceResults + let sortedRoll = [] for (let i = 0; i < 10; i++) { sortedRoll[i] = 0; } for (let dice of diceResults) { - sortedRoll[dice.result]++; + sortedRoll[dice.result]++ } let index = 0; let bestRoll = 0; for (let i = 0; i < 10; i++) { if (sortedRoll[i] > bestRoll) { - bestRoll = sortedRoll[i]; - index = i; + bestRoll = sortedRoll[i] + index = i } } let bestScore = (bestRoll * 10) + index @@ -574,33 +385,21 @@ export class Imperium5Utility { /* ------------------------- ------------------- */ static async rerollDice(actorId, diceIndex = -1) { - let actor = game.actors.get(actorId); - let rollData = actor.getRollData(); + let actor = game.actors.get(actorId) + let rollData = actor.getRollData() - if (diceIndex == -1) { - rollData.hasWillpower = actor.decrementWillpower(); - rollData.roll = undefined; - } else { - let myRoll = new Roll("1d6").roll({ async: false }); - await this.showDiceSoNice(myRoll, game.settings.get("core", "rollMode")); - console.log("Result: ", myRoll); - - rollData.roll.dice[0].results[diceIndex].result = myRoll.total; // Patch - rollData.nbStrongHitUsed++; - } - this.rollFraggedKingdom(rollData); } /* -------------------------------------------- */ static getUsers(filter) { - return game.users.filter(filter).map(user => user.data._id); + return game.users.filter(filter).map(user => user.data._id) } /* -------------------------------------------- */ static getWhisperRecipients(rollMode, name) { switch (rollMode) { - case "blindroll": return this.getUsers(user => user.isGM); - case "gmroll": return this.getWhisperRecipientsAndGMs(name); - case "selfroll": return [game.user.id]; + case "blindroll": return this.getUsers(user => user.isGM) + case "gmroll": return this.getWhisperRecipientsAndGMs(name) + case "selfroll": return [game.user.id] } return undefined; } @@ -614,7 +413,7 @@ export class Imperium5Utility { static blindMessageToGM(chatOptions) { let chatGM = duplicate(chatOptions); chatGM.whisper = this.getUsers(user => user.isGM); - chatGM.content = "Blinde message of " + game.user.name + "
" + chatOptions.content; + chatGM.content = "Message en aveugle à " + game.user.name + "
" + chatOptions.content; console.log("blindMessageToGM", chatGM); game.socket.emit("system.fvtt-pegasus-rgp", { msg: "msg_gm_chat_message", data: chatGM }); } @@ -653,17 +452,17 @@ export class Imperium5Utility { switch (rollMode) { case "blindroll": // GM only if (!game.user.isGM) { - this.blindMessageToGM(chatOptions); + this.blindMessageToGM(chatOptions) chatOptions.whisper = [game.user.id]; - chatOptions.content = "Message only to the GM"; + chatOptions.content = "Message only to the GM" } else { - chatOptions.whisper = this.getUsers(user => user.isGM); + chatOptions.whisper = this.getUsers(user => user.isGM) } break; default: - chatOptions.whisper = this.getWhisperRecipients(rollMode, name); + chatOptions.whisper = this.getWhisperRecipients(rollMode, name) break; } chatOptions.alias = chatOptions.alias || name; @@ -675,49 +474,43 @@ export class Imperium5Utility { let rollData = { rollId: randomID(16), rollMode: game.settings.get("core", "rollMode"), - bonusDicesLevel: 0, - hindranceDicesLevel: 0, - otherDicesLevel: 0, - statDicesLevel: 0, - specDicesLevel: 0, effectsList: [], armorsList: [], weaponsList: [], equipmentsList: [], - optionsDiceList: PegasusUtility.getOptionsDiceList() + optionsDiceList: Imperium5Utility.getOptionsDiceList() } - PegasusUtility.updateWithTarget(rollData) + Imperium5Utility.updateWithTarget(rollData) return rollData } /* -------------------------------------------- */ static updateWithTarget(rollData) { let objectDefender - let target = PegasusUtility.getTarget(); + let target = Imperium5Utility.getTarget() if (target) { let defenderActor = game.actors.get(target.data.actorId) - objectDefender = PegasusUtility.data(defenderActor) + objectDefender = Imperium5Utility.data(defenderActor) objectDefender = mergeObject(objectDefender, target.data.actorData) rollData.defender = objectDefender rollData.attackerId = this.id rollData.defenderId = objectDefender._id - defenderActor.addHindrancesList(rollData.effectsList) } } /* -------------------------------------------- */ static createChatWithRollMode(name, chatOptions) { - this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions); + this.createChatMessage(name, game.settings.get("core", "rollMode"), chatOptions) } /* -------------------------------------------- */ static async confirmDelete(actorSheet, li) { let itemId = li.data("item-id"); - let msgTxt = "

Are you sure to remove this Item ?"; + let msgTxt = "

Etes vous certain de vouloir supprimer cet objet ?"; let buttons = { delete: { icon: '', - label: "Yes, remove it", + label: "Oui", callback: () => { actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]); li.slideUp(200, () => actorSheet.render(false)); @@ -725,12 +518,12 @@ export class Imperium5Utility { }, cancel: { icon: '', - label: "Cancel" + label: "Annuler" } } msgTxt += "

"; let d = new Dialog({ - title: "Confirm removal", + title: "Confirmer la suppression", content: msgTxt, buttons: buttons, default: "cancel" diff --git a/styles/simple.css b/styles/simple.css index c562fa5..b57faec 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -193,7 +193,7 @@ table {border: 1px solid #7a7971;} /* Styles limited to foundryvtt-vadentis sheets */ -.fvtt-pegasus-rpg .sheet-header { +.fvtt-imperium5 .sheet-header { -webkit-box-flex: 0; -ms-flex: 0 0 210px; flex: 0 0 210px; @@ -213,15 +213,16 @@ table {border: 1px solid #7a7971;} margin-bottom: 10px; } -.fvtt-pegasus-rpg .sheet-header .profile-img { +.fvtt-imperium5 .sheet-header .profile-img { -webkit-box-flex: 0; -ms-flex: 0 0 128px; flex: 0 0 128px; - width: 196px; + width: 64px; height: auto; - max-height:260px; + max-height:128px; margin-top: 0px; margin-right: 10px; + margin-right: 10px; object-fit: cover; object-position: 50% 0; } @@ -255,34 +256,34 @@ table {border: 1px solid #7a7971;} vertical-align: bottom; } -.fvtt-pegasus-rpg .sheet-header .header-fields { +.fvtt-imperium5 .sheet-header .header-fields { -webkit-box-flex: 1; -ms-flex: 1; flex: 1; } -.fvtt-pegasus-rpg .sheet-header h1.charname { +.fvtt-imperium5 .sheet-header h1.charname { height: 50px; padding: 0px; margin: 5px 0; border-bottom: 0; } -.fvtt-pegasus-rpg .sheet-header h1.charname input { +.fvtt-imperium5 .sheet-header h1.charname input { width: 100%; height: 100%; margin: 0; } -.fvtt-pegasus-rpg .sheet-tabs { +.fvtt-imperium5 .sheet-tabs { -webkit-box-flex: 0; -ms-flex: 0; flex: 0; } -.fvtt-pegasus-rpg .sheet-body, -.fvtt-pegasus-rpg .sheet-body .tab, -.fvtt-pegasus-rpg .sheet-body .tab .editor { +.fvtt-imperium5 .sheet-body, +.fvtt-imperium5 .sheet-body .tab, +.fvtt-imperium5 .sheet-body .tab .editor { height: 100%; font-size: 0.8rem; } @@ -305,70 +306,70 @@ table {border: 1px solid #7a7971;} padding: 0 3px; } -.fvtt-pegasus-rpg .tox .tox-editor-container { +.fvtt-imperium5 .tox .tox-editor-container { background: #fff; } -.fvtt-pegasus-rpg .tox .tox-edit-area { +.fvtt-imperium5 .tox .tox-edit-area { padding: 0 8px; } -.fvtt-pegasus-rpg .resource-label { +.fvtt-imperium5 .resource-label { font-weight: bold; text-transform: uppercase; } -.fvtt-pegasus-rpg .tabs { +.fvtt-imperium5 .tabs { height: 40px; border-top: 1px solid #AAA; border-bottom: 1px solid #AAA; color: #000000; } -.fvtt-pegasus-rpg .tabs .item { +.fvtt-imperium5 .tabs .item { line-height: 40px; font-weight: bold; } -.fvtt-pegasus-rpg .tabs .item.active { +.fvtt-imperium5 .tabs .item.active { text-decoration: underline; text-shadow: none; } -.fvtt-pegasus-rpg .items-list { +.fvtt-imperium5 .items-list { list-style: none; margin: 1px 0; padding: 0; overflow-y: auto; } -.fvtt-pegasus-rpg .items-list .item-header { +.fvtt-imperium5 .items-list .item-header { font-weight: bold; } -.fvtt-pegasus-rpg .items-list .item { +.fvtt-imperium5 .items-list .item { height: 30px; line-height: 24px; padding: 1px 0; border-bottom: 1px solid #BBB; } -.fvtt-pegasus-rpg .items-list .item .item-image { +.fvtt-imperium5 .items-list .item .item-image { -webkit-box-flex: 0; -ms-flex: 0 0 24px; flex: 0 0 24px; margin-right: 5px; } -.fvtt-pegasus-rpg .items-list .item img { +.fvtt-imperium5 .items-list .item img { display: block; } -.fvtt-pegasus-rpg .items-list .item-name { +.fvtt-imperium5 .items-list .item-name { margin: 0; } -.fvtt-pegasus-rpg .items-list .item-controls { +.fvtt-imperium5 .items-list .item-controls { -webkit-box-flex: 0; -ms-flex: 0 0 86px; flex: 0 0 86px; @@ -379,7 +380,8 @@ table {border: 1px solid #7a7971;} /* ======================================== */ /* Sheet */ .window-app.sheet .window-content .sheet-header{ - background: url("../images/ui/pc_sheet_bg.webp") + color: rgba(168, 139, 139, 0.5); + /*background: url("../images/ui/pc_sheet_bg.webp")*/ } /* background: #011d33 url("../images/ui/fond1.webp") repeat left top;*/ /*color: rgba(168, 139, 139, 0.5);*/ @@ -410,10 +412,10 @@ table {border: 1px solid #7a7971;} .window-app .window-content, .window-app.sheet .window-content .sheet-body{ font-size: 0.8rem; - background: url("../images/ui/pc_sheet_bg.webp") repeat left top; + background: rgba(245,245,240,0.6); + /*background: url("../images/ui/pc_sheet_bg.webp") repeat left top;.*/ } -/* background: rgba(245,245,240,0.6) url("../images/ui/sheet_background.webp") left top;*/ section.sheet-body{padding: 0.25rem 0.5rem;} @@ -605,7 +607,7 @@ ul, li { .devotion-label, .sort-label, .technique-label, -.stat-label, +.ame-label, .arme-label, .armure-label, .equipement-label, @@ -720,7 +722,7 @@ ul, li { flex-shrink: 1; flex-grow: 0; } -.npc-stat-label { +.npc-ame-label { flex-grow: 2; } @@ -739,7 +741,7 @@ ul, li { margin-left: 0.25rem; } -.stats-table { +.ames-table { align-content: flex-start; } @@ -926,7 +928,7 @@ ul, li { height: 64px; } -.stat-icon { +.ame-icon { border: 0; padding: 2px 2px 2px 2px; max-width:32px; @@ -934,7 +936,7 @@ ul, li { width: auto; height: auto; } -.small-stat-icon { +.small-ame-icon { border: 0; padding: 2px 2px 2px 2px; max-width:16px; @@ -1260,64 +1262,19 @@ ul, li { } /* =================== 1. ACTOR SHEET FONT STYLES =========== *//* -Agility AGI: #02a41d Also Used for Ranged Damage -Mind MND: #a100fe -Social SOC: #fd7100 -Strength STR: #5f3d00 Also Used For Melee Damage -Physique PHY: #990304 Also used For Damage Resistance -Combat COM: 0136ff Also Used for Melee Attack -Defence DEF: #88826a Also used in the Defence on Combat Tab -Stealth STL: #505050 -Perception PER: #f9c801 Also Used for Ranged Damage -Focus FOC: #ff0084 */ +.sheet-box { + border-radius: 5%; + background-color: #403f3eB0; + border-width: 1px; + padding: 0.4rem; + margin: 0.2rem; +} + .color-class-black { background-color: black; background: black; } -.color-class-agi, -.color-class-range { - background-color: #02a41d; - background: #02a41d; -} -.color-class-pool { - background-color:#c5c3c3; -} -.color-class-mnd { - background-color: #a100fe; -} -.color-class-soc { - background-color: #fd7100; -} -.color-class-str, -.color-class-meleedmg { - background-color: #5f3d00; -} -.color-class-phy, -.color-class-dmgres { - background-color: #990304; -} -.color-class-mr { - background-color: #050505; -} -.color-class-com, -.color-class-melee { - background-color: #0136ff; -} -.color-class-def, -.color-class-defence { - background-color: #88826a; -} -.color-class-stl { - background-color: #505050; -} -.color-class-per, -.color-class-ranged { - background-color: #f9c801; -} -.color-class-foc { - background-color: #ff0084; -} .color-class-common { background: rgba(185, 183, 40, 0.45); } @@ -1343,15 +1300,15 @@ Focus FOC: #ff0084 max-width: 128px; justify-content: flex-start; } -.stat-item { +.ame-item { flex-grow: 1; justify-content: flex-start; margin: 2px; } -.stat-block { +.ame-block { min-width: 160px; } -.stat-margin { +.ame-margin { margin-left: 4px; margin-top: 5px; } @@ -1359,14 +1316,14 @@ Focus FOC: #ff0084 margin-left: 4px; margin-top: 3px; } -.stat-text-white { +.ame-text-white { color: white; } -.item-stat-roll { +.item-ame-roll { max-height: 42px; min-height: 36px; } -.item-stat-roll select, .item-stat-roll input { +.item-ame-roll select, .item-ame-roll input { margin-top: 4px; margin-right: 2px; } diff --git a/system.json b/system.json index 842fdf2..e6abb86 100644 --- a/system.json +++ b/system.json @@ -30,9 +30,9 @@ "styles": [ "styles/simple.css" ], - "templateVersion": 1, + "templateVersion": 4, "title": "Imperium5 RPG", "url": "https://www.uberwald.me/data/files/fvtt-imperium5", - "version": "0.0.1", + "version": "0.0.4", "background" : "./images/ui/imperium5_welcome_page.webp" } diff --git a/template.json b/template.json index 2557e41..9f2b86f 100644 --- a/template.json +++ b/template.json @@ -1,424 +1,154 @@ { "Actor": { - "types": ["character", "npc"], + "types": [ + "character" + ], "templates": { "biodata": { "biodata": { - "name": "", "age": 0, "size": "", "weight": "", "hair": "", "sex": "", "eyes": "", + "appactual": "", + "traits": "", + "identities": "", + "admid": "", + "memories": "", + "whoami": "", "description": "", - "worstfear": "", - "worstfearactive": false, - "desires": "", - "desiresactive": false, - "preferredhand": "", - "catchphrase": "", - "catchphraseused": false, - "catchphrasetrigger": "", - "charactervalue": 0, - "level": 0, - "threatlevel": 0, - "cdp": 0, - "cdpused": 0, - "notes": "", - "gmnotes": "", - "racename": "", - "rolename": "" + "gmnotes": "" } }, "core": { - "race": [], - "abilities": [], "subactors": [], - "statistics": { - "agi":{ - "label": "Agility", - "abbrev": "AGI", - "level": 1, - "value": 1, - "mod": 0, - "col": 1 + "ames": { + "brutalite": { + "label": "Brutalité", + "type": "physique", + "value": 0, + "cohesion": 0 }, - "mnd":{ - "label": "Mind", - "abbrev": "MND", - "level": 1, - "value": 1, - "col": 1, - "mod": 0 + "dynamisme": { + "label": "Dynamisme", + "type": "physique", + "value": 0, + "cohesion": 0 }, - "soc":{ - "label": "Social", - "abbrev": "SOC", - "level": 1, - "value": 1, - "col": 1, - "mod": 0 + "autorite": { + "label": "Autorité", + "type": "social", + "value": 0, + "cohesion": 0 }, - "str":{ - "label": "Strength", - "abbrev": "STR", - "level": 1, - "value": 1, - "col": 1, - "mod": 0 + "simulacre": { + "label": "Simulacre", + "type": "social", + "value": 0, + "cohesion": 0 }, - "phy":{ - "label": "Physique", - "abbrev": "PHY", - "level": 1, - "value": 1, - "col": 1, - "mod": 0 + "savoir": { + "label": "Savoir", + "type": "mental", + "value": 0, + "cohesion": 0 }, - "com":{ - "label": "Combat", - "abbrev": "COM", - "level": 1, - "value": 1, - "col": 2, - "mod": 0 - }, - "def":{ - "label": "Defence", - "abbrev": "DEF", - "level": 1, - "value": 1, - "col": 2, - "mod": 0 - }, - "stl":{ - "label": "Stealth", - "abbrev": "STL", - "level": 1, - "value": 1, - "col": 2, - "mod": 0 - }, - "per":{ - "label": "Perception", - "abbrev": "PER", - "level": 1, - "value": 1, - "col": 2, - "mod": 0 - }, - "foc":{ - "label": "Focus", - "abbrev": "FOC", - "level": 1, - "value": 1, - "col": 2, - "mod": 0 + "creativite": { + "label": "Créativité", + "type": "mental", + "value": 0, + "cohesion": 0 } }, - "nrg": { - "label": "NRG", - "type": "value", - "absolutemax": 0, - "value": 0, - "max": 0, - "mod": 0, - "activated": 0 - }, - "mr": { - "label": "MR (Initiative)", - "type": "dice", - "value": 0, - "mod": 0 - }, - "momentum": { - "label": "Momentum", - "type": "value", - "value": 0, - "max": 0 - }, - "secondary": { - "health": { - "label": "Health", + "paradigmes": { + "humanite": { + "label": "Humanité", "value": 0, - "type": "value", - "ismax": true, - "iscombat": true, - "bonus": 0, - "max": 0 + "editable": false }, - "delirium": { - "label": "Delirium", + "punk": { + "label": "Punk", "value": 0, - "type": "value", - "ismax": true, - "iscombat": true, - "bonus": 0, - "max": 0 + "editable": false }, - "stealthhealth": { - "label": "STL Health", - "type": "value", + "cyber": { + "label": "Cyber", "value": 0, - "ismax": true, - "bonus": 0, - "max": 0 - }, - "socialhealth": { - "label": "SOC Health", - "type": "value", + "editable": false + }, + "virtuel": { + "label": "Virtuel", "value": 0, - "ismax": true, - "bonus": 0, - "max": 0 + "editable": false + }, + "perso": { + "label": "Perso", + "value": 0, + "editable": true } }, - "combat": { - "bonusdice": 0, - "otherdice": 0, - "hindrancedice": 0, - "stunlevel": 0, - "stunthreshold": 0 + "entropie": { + "label": "Entropie", + "seuil": 0, + "reserve": 0 } - }, - "npccore": { - "npctype": "", - "description": "" } }, "character": { - "templates": [ "biodata", "core" ] - }, - "npc": { - "templates": [ "npccore" ] - } + "templates": [ + "biodata", + "core" + ] + } }, "Item": { - "types": [ "race", "role", "ability", "specialisation", "perk", "power" , "armor", "shield", "equipment", "weapon", "effect", "money"], - "effect": { - "type": "", - "genre": "", - "effectlevel": 0, - "reducedicevalue": false, - "stataffected": "", - "specaffected": [], - "statdice": false, - "bonusdice": false, - "otherdice": false, - "hindrance" : false, - "resistedby": "", - "recoveryroll": false, - "recoveryrollstat": "", - "recoveryrollspec": [], - "effectstatlevel": false, - "effectstat": "", + "types": [ + "archetype", + "specialite", + "familiarite", + "nature", + "trait", + "symbiose", + "ressource", + "capacite", + "singularite", + "contact" + ], + "archetype": { "description": "" }, - "race": { - "description": "", - "environment": "", - "society_culture": "", - "outlook": "", - "selectablestats": false, - "statsonlyonce": false, - "numberstats": 0, - "abilities": [], - "optionnalabilities": [], - "nboptionnal": 0, - "perksgained": false, - "perksall": false, - "perksnumber": 0, - "perks": [], - "statistics": "" - }, - "role": { - "statincrease1": "", - "statincrease2": "", - "messagespecplus1": "", - "specialisationsplus1": [], - "powers1": [], - "MR": 0, - "specialperk": [], - "specincrease": [], - "perks": [], + "specialite": { "description": "" }, - "ability": { - "affectedstat": "str", - "statmodifier": 1, - "statlevelincrease": 0, - "statusaffected": "", - "statusmodifier": 0, - "powersgained": [], - "specialisations": [], - "effectsgained": [], - "aoe": "", - "affectedcircumstances": "", - "affectedspecialisations": "", - "nrgcost": 0, - "opponenthindrance": 0, - "attackgained": [], - "armorgained": [], - "threatlevel": 0, + "familiarite": { "description": "" }, - "specialisation": { - "statistic": "", - "level": 1, - "ispowergroup": false, - "powersource": "", - "powersactivated": false, - "powers": [], - "isthreatlevel": false, + "nature": { "description": "" }, - "perk": { - "level": 1, - "active": false, - "duration": "", - "isweaver": false, - "effectsgained": [], - "features": { - "nrgcost": { - "label": "NRG cost to use", - "flag": false, - "type": "number", - "isvalid": true, - "value": 0 - }, - "range": { - "label": "Range", - "flag": false, - "type": "range", - "isvalid": true, - "value": "" - }, - "nbtargets": { - "label": "# Targets", - "flag": false, - "type": "string", - "isvalid": true, - "value": "" - }, - "bonushealth": { - "label": "Bonus to Health", - "flag": false, - "type": "string", - "isvalid": true, - "value": "" - }, - "bonusnrg": { - "label": "Bonus to NRG", - "flag": false, - "type": "string", - "isvalid": true, - "value": "" - }, - "bonusdelirium": { - "label": "Bonus to Delirium", - "flag": false, - "type": "string", - "isvalid": true, - "value": "" - } - }, - "status": "", - "nbuse": "", - "used1":false, - "used2":false, - "used3":false - }, - "power": { - "rollneeded": false, - "statistic": "", - "cost": 0, - "costspent": 0, - "range": "", - "action": "", - "type": "", - "powersource": "", - "effects": "", - "activated": false, - "purchasedeffects": "", - "effectsgained": [], - "dmgroll": false, - "dmgstatistic": "", + "trait": { "description": "" - }, - "armor": { - "statistic": "", - "resistance": "", - "weight": 0, - "cost": 0, - "idr": "", - "equipped": false, - "locationprotected": "", - "effects": [], - "activated": false, - "description":"" }, - "shield": { - "deftype": "", - "level": "", - "weight": 0, - "cost": 0, - "idr": "", - "equipped": false, - "effects": [], - "activated": false, - "description":"" + "symbiose": { + "description": "" }, - "equipment": { - "type": "", - "cost": 0, - "weight": 0, - "idr": "", - "quantity": 0, - "equipped": false, - "stataffected": "", - "level": 0, - "statdice": false, - "bonusdice": false, - "otherdice": false, - "effects": [], - "activated": false, - "iscontainer": false, - "containercapacity": 0, - "containerid": "", - "threatlevel": 0, - "description":"" - }, - "money" : { + "ressource": { "value": 0, - "quantity": 0, - "weight": 0, - "idr":"", "description": "" }, - "weapon": { - "statistic": "", - "damagestatistic": "", - "damage": "", - "cost": 0, - "weight": 0, - "idr": "", - "range": "", - "maxrange": "", - "ao": "", - "enhanced": false, - "enhancedstat": "", - "enhancedlevel": 0, - "damagetype": "", - "damagetypelevel": 0, - "vehicledamagetype": "", - "vehicledamagetypelevel": 0, - "ammocurrent": 0, - "ammomax": 0, - "equipped": false, - "effects": [], - "activated": false, + "capacite": { + "type": "", + "description": "" + }, + "singularite": { + "value": 0, + "description": "" + }, + "contact": { + "value": 0, "description": "" } } -} +} \ No newline at end of file diff --git a/templates/actor-partial-ames.html b/templates/actor-partial-ames.html new file mode 100644 index 0000000..2bf1b00 --- /dev/null +++ b/templates/actor-partial-ames.html @@ -0,0 +1,13 @@ +{{#each data.ames as |ame key|}} + {{#if (eq ame.type ../typeame)}} +
  • + +

    {{ame.label}}

    +
    + + +
  • + {{/if}} +{{/each}} diff --git a/templates/actor-partial-paradigmes.html b/templates/actor-partial-paradigmes.html new file mode 100644 index 0000000..f0597f5 --- /dev/null +++ b/templates/actor-partial-paradigmes.html @@ -0,0 +1,16 @@ +{{#each data.paradigmes as |para key|}} +
  • + + {{#if para.editable}} +

    + +

    + {{else}} +

    {{para.label}}

    + {{/if}} +
    + +
  • +{{/each}} diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index efa57a7..943036e 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -3,330 +3,148 @@ {{!-- Sheet Header --}}
    -

    - -
    - -
    -
    -
      - {{#each data.statistics as |stat key|}} - {{#if (eq stat.col 1)}} - {{> systems/fvtt-pegasus-rpg/templates/partial-actor-stat-block.html stat=stat key=key}} - {{/if}} - {{/each}} -
    • - - - - -

      Dice Pool

      -
      -
    • -
    -
    - -
    -
      - {{#each data.statistics as |stat key|}} - {{#if (eq stat.col 2)}} - {{> systems/fvtt-pegasus-rpg/templates/partial-actor-stat-block.html stat=stat key=key}} - {{/if}} - {{/each}} -
    • - - - - -

      MR

      -
      - - -
    • -
    -
    - -
    - {{> systems/fvtt-pegasus-rpg/templates/partial-actor-status.html}} -
    - - - -
    +
    +

    + {{!-- Sheet Tab Navigation --}} +
    -
    + +
    - {{!-- Sheet Tab Navigation --}} - - {{!-- Sheet Body --}}
    {{!-- Combat Tab --}} -
    -
    - -
    - +
    -
    -
      -
    • - - - - Ranged Attack - -
    • -
    • - - - - Ranged Damage - -
    • +
      + +
      +
      +

      Physique

      +
        + {{>systems/fvtt-imperium5/templates/actor-partial-ames.html typeame="physique"}}
      -
      - -
      -
      - - -
      - -

      Stun

      -
      -
        -
      • - Current - - Threshold - -
      • +

        Mental

        +
          + {{>systems/fvtt-imperium5/templates/actor-partial-ames.html typeame="mental"}}
      -
      -
        -
      • - -

        -
        - - - - - - - - - - - - - - - - - - - - - - - - +
        +
        +

        Archetype

        +
          +
        • + + {{archetype.name}} +
           
          +
          + + +
        • - {{#each perks as |perk key|}} -
        • - - {{perk.name}} - - {{perk.data.level}} - - {{#if perk.data.features.range.flag}} - {{perk.data.features.range.value}} - {{else}} -  -  - - {{/if}} - {{#if perk.data.features.nbtargets.flag}} - {{perk.data.features.nbtargets.value}} - {{else}} -  -  - {{/if}} - - - - +
        + +

        Spécialités

        +
          + {{#each specialites as |spec key|}} +
        • + + {{spec.name}} +
           
          +
          + + +
          +
        • + {{/each}} +
        - {{#if (ne perk.data.status "ready")}} - {{#if (eq perk.data.nbuse "next1action")}} - -   -   - {{/if}} - {{#if (eq perk.data.nbuse "next2action")}} - - -   - {{/if}} - {{#if (eq perk.data.nbuse "next3action")}} - - - - {{/if}} - {{else}} - - - - {{/if}} -
         
        -
        - -
        -
      • - {{/each}} -
      +

      Familiarités :

      +
        + {{#each familiarites as |fami key|}} +
      • + + {{fami.name}} +
         
        +
        + + +
        +
      • + {{/each}} +
      + +
      +
      +
      +
      +

      Paradigmes

      +
        + {{> systems/fvtt-imperium5/templates/actor-partial-paradigmes.html}} +
      +
      - -
        -
      • - -

        -
        - - - - - - - - - - - - -
      • - {{#each effects as |effect key|}} -
      • - - {{effect.name}} - {{effect.data.effectlevel}} - {{upperFirst effect.data.type}} - {{upperFirst effect.data.genre}} - {{upper effect.data.stataffected}} -
         
        -
        - -
        -
      • - {{/each}} -
    {{!-- Other Tab --}}
    -
      -
    • - -

      -
      - - - - - - - - - -
    • - {{#each specs as |spec key|}} -
    • - - {{spec.name}} - {{upper spec.data.statistic}} - {{spec.data.dice}} - {{#if spec.data.ispowergroup}} - {{#if spec.data.powersactivated}} - Deactivate - {{else}} - Activate - {{/if}} - {{else}} -  -  - {{/if}} -
       
      -
      - -
      -
    • - {{/each}} -
    -
    +
      +
    • + +

      +
      + + + + + + + + + +
    • + {{#each specs as |spec key|}} +
    • + + {{spec.name}} + {{upper spec.data.statistic}} + {{spec.data.dice}} + {{#if spec.data.ispowergroup}} + {{#if spec.data.powersactivated}} + Deactivate + {{else}} + Activate + {{/if}} + {{else}} +  -  + {{/if}} +
       
      +
      + +
      +
    • + {{/each}} +
    +
    @@ -339,11 +157,21 @@
    • -

      {{data.nrg.label}}

      - Activated -  Current -  Mod -  Max + +

      {{data.nrg.label}}

      +
      + Activated +  Current +  Mod +  Max / {{data.nrg.absolutemax}}
    @@ -375,7 +203,8 @@ {{#each powers as |power key|}}
  • - + {{#if power.data.rollneeded}} {{power.name}} @@ -386,33 +215,34 @@ {{upperFirst power.data.type}} - + - {{upperFirst power.data.action}} + {{upperFirst power.data.action}} - {{#if power.data.dmgroll}} - {{upper power.data.dmgstatistic}} - {{else}} -  -  - {{/if}} - + {{#if power.data.dmgroll}} + {{upper power.data.dmgstatistic}} + {{else}} +  -  + {{/if}} + - {{power.data.cost}} + {{power.data.cost}} - +
     
    {{#if power.data.activated}}{{else}}{{/if}} + class="fas fa-circle">{{else}}{{/if}}
  • @@ -436,10 +266,11 @@ - + {{#each abilities as |ability key|}}
  • - + {{ability.name}} {{upper ability.data.affectedstat}} @@ -454,7 +285,7 @@
  • {{/each}} - +
    @@ -482,20 +313,21 @@ - + {{#each moneys as |money key|}}
  • - + {{money.name}} - + - + {{money.data.quantity}} + ( -/+) + + - + {{#if money.data.idrDice}} {{money.data.idrDice}} @@ -527,45 +359,46 @@ - + - + -
  • + {{#each weapons as |weapon key|}}
  • - + {{weapon.name}} - + {{#if (gt weapon.data.ammomax 0)}} - - + -
  • + {{#each armors as |armor key|}}
  • - + {{armor.name}} - {{upper armor.data.statistic}} + {{upper armor.data.statistic}} {{armor.data.resistanceDice}} {{armor.data.locationprotected}} {{#if (count armor.data.effects)}} - {{#if armor.data.activated}} - Deactivate - {{else}} - Activate - {{/if}} + {{#if armor.data.activated}} + Deactivate {{else}} -  -  + Activate + {{/if}} + {{else}} +  -  {{/if}} @@ -646,7 +480,7 @@ class="fas fa-circle">{{else}}{{/if}}
  • - + {{/each}} @@ -662,27 +496,28 @@ - + - + {{#each shields as |shield key|}}
  • - + {{shield.name}} {{shield.data.levelDice}} {{#if (count shield.data.effects)}} - {{#if shield.data.activated}} - Deactivate - {{else}} - Activate - {{/if}} + {{#if shield.data.activated}} + Deactivate {{else}} -  -  + Activate + {{/if}} + {{else}} +  -  {{/if}} @@ -716,22 +551,22 @@ - + -
  • + {{#each containersTree as |equip key|}} - {{> systems/fvtt-pegasus-rpg/templates/partial-actor-equipment.html equip=equip level=1}} - + {{> systems/fvtt-pegasus-rpg/templates/partial-actor-equipment.html equip=equip level=1}} + {{/each}} - +
    @@ -777,12 +612,14 @@
  • - -
  • + +
  • - +
    @@ -790,7 +627,8 @@
  • - +
    @@ -803,14 +641,18 @@

    Catchphrase :

    @@ -827,7 +669,8 @@
  • - +
  • @@ -840,13 +683,11 @@
  • - +
  • - +
  • @@ -857,7 +698,7 @@ -
  • +
    diff --git a/templates/chat-create-actor.html b/templates/chat-create-actor.html deleted file mode 100644 index 3b2a9af..0000000 --- a/templates/chat-create-actor.html +++ /dev/null @@ -1,143 +0,0 @@ -
    - {{alias}} -

    {{name}}

    -
    - -
    -
    - - {{#if (eq step "select-race")}} -
    Select a race from the list below
    - - {{#each races as |race index|}} - - - - - {{/each}} -
    {{race.name}}Select it !
    - {{/if}} - - {{#if (eq step "select-race-optionnal")}} -
    The selected Race has some optionnal abilities. Select one ability by clicking the relevant button below
    - Remaining abilities to select : {{nboptionnal}} -
    - - {{#each optionnalabilities as |ability index|}} - - - - - {{/each}} -
    {{ability.name}}Select it !
    - {{/if}} - - {{#if (eq step "select-race-stats")}} -
    Select Stats to gain +1 modifier :
    - Remaining stats to select : {{numberstats}} -
    - - {{#each stats as |stat key|}} - {{#if @root.statsonlyonce}} - {{#if stat.used}} - {{else}} - - - - - {{/if}} - {{else}} - - - - - {{/if}} - {{/each}} -
    {{stat.label}} ({{stat.abbrev}})Select it !
    {{stat.label}} ({{stat.abbrev}})Select it !
    - {{/if}} - - {{#if (eq step "select-race-perks")}} -
    Now select {{nbraceperks}} Perk(s) for your character -
    - - {{#each raceperks as |perk index|}} - - - - - {{/each}} -
    {{perk.name}}Select it !
    - {{/if}} - - {{#if (eq step "select-role")}} -
    Now select a Role for your character. -
    - - {{#each roles as |role index|}} - - - - - {{/each}} -
    {{role.name}}Select it !
    - {{/if}} - - {{#if (eq step "select-role-start-spec")}} -
    Choose 1 Specialisation at +1DT : -
    - - {{#each rolestartspec as |spec index|}} - - - - - {{/each}} -
    {{spec.name}}Select it !
    - {{/if}} - - {{#if (eq step "select-role-stat")}} -
    Choose 1 Stat at +1DT : -
    - - {{#each rolestats as |rolestat key|}} - - - - - {{/each}} -
    {{rolestat.label}}Select it !
    - {{/if}} - - {{#if (eq step "select-role-spec")}} -
    Now select a specialisation at +{{dt}}DT. -
    - - {{#each rolespec as |spec index|}} - - - - - {{/each}} -
    {{spec.name}}Select it !
    - {{/if}} - - {{#if (eq step "select-role-perk")}} -
    Now select a Perk. -
    - - {{#each roleperks as |perk index|}} - - - - - {{/each}} -
    {{perk.name}}Select it !
    - {{/if}} - - {{#if (eq step "character-end")}} -
    Follow the next steps from the rulebook page 50 !. You can now spend 150 CDPs to customise your character. -
    - {{/if}} - - -
    diff --git a/templates/chat-effect-used.html b/templates/chat-effect-used.html deleted file mode 100644 index f7c166e..0000000 --- a/templates/chat-effect-used.html +++ /dev/null @@ -1,7 +0,0 @@ -
    -

    {{name}}

    - {{#if img}} - - {{/if}} -
    Effect {{name}} has ben used and removed from the available effects.
    -
    diff --git a/templates/chat-opposed-damage.html b/templates/chat-opposed-damage.html deleted file mode 100644 index e6f27a6..0000000 --- a/templates/chat-opposed-damage.html +++ /dev/null @@ -1,15 +0,0 @@ -
    - {{alias}} -

    {{defenderName}}

    -
    - -
    - -
    - -
    diff --git a/templates/chat-opposed-fail.html b/templates/chat-opposed-fail.html deleted file mode 100644 index 4e71d14..0000000 --- a/templates/chat-opposed-fail.html +++ /dev/null @@ -1,11 +0,0 @@ -
    - {{alias}} -

    {{defenderName}}

    -
    - -
    -
    - {{defenderName}} wins the opposition against {{attackerName}} ! -
    - - diff --git a/templates/chat-perk-ready.html b/templates/chat-perk-ready.html deleted file mode 100644 index 8925b2a..0000000 --- a/templates/chat-perk-ready.html +++ /dev/null @@ -1,7 +0,0 @@ -
    -

    {{name}}

    - {{#if img}} - - {{/if}} -
    {{name}} has Just Deactivated the Perk: {{perk.name}}, make sure to manually delete all Effects provided by this Perk from Targets.
    -
    diff --git a/templates/item-ability-sheet.html b/templates/item-ability-sheet.html deleted file mode 100644 index ef9da6c..0000000 --- a/templates/item-ability-sheet.html +++ /dev/null @@ -1,152 +0,0 @@ -
    -
    - -
    -

    -
    -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-description.html}} - -
    -
      -
    • - -
    • -
    • - -
    • - -
    • - -
    • -
    • - -
    • - -
    • -
    • -
    • -
        -
      • -
      • - {{#each data.effectsgained as |effect idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    • - -
    • -
    • -
    • -
        -
      • -
      • - {{#each data.powersgained as |power idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    • - -
    • -
    • -
        -
      • -
      • - {{#each data.specialisations as |spec idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    • - - - - -
    • - -
    • - -
    • -
    • -
        -
      • -
      • - {{#each data.attackgained as |weapon idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    • - - -
    • -
    • -
        -
      • -
      • - {{#each data.armorgained as |armor idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    • - - -
    -
    - -
    -
    diff --git a/templates/item-armor-sheet.html b/templates/item-armor-sheet.html deleted file mode 100644 index b6fd3c2..0000000 --- a/templates/item-armor-sheet.html +++ /dev/null @@ -1,63 +0,0 @@ -
    -
    - -
    -

    -
    -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - - {{!-- Sheet Body --}} -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-description.html}} - -
    - -
    -
      -
    • - -
    • - -
    • - -
    • -
    • - -
    • - - {{> systems/fvtt-pegasus-rpg/templates/partial-equipment-effects.html}} - -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    -
    -
    - -
    -
    diff --git a/templates/item-default-sheet.html b/templates/item-default-sheet.html new file mode 100644 index 0000000..b559558 --- /dev/null +++ b/templates/item-default-sheet.html @@ -0,0 +1,31 @@ +
    +
    + +
    +

    +
    +
    + + {{!-- Sheet Body --}} +
    + +
    + {{#if (exists data.type)}} + + + + + {{/if}} + {{#if (exists data.value)}} + + + + + {{/if}} + {{> systems/fvtt-imperium5/templates/partial-item-description.html}} +
    + +
    +
    diff --git a/templates/item-effect-sheet.html b/templates/item-effect-sheet.html deleted file mode 100644 index 48fe87f..0000000 --- a/templates/item-effect-sheet.html +++ /dev/null @@ -1,149 +0,0 @@ -
    -
    - -
    -

    - -

    -
    -
    - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-description.html}} - -
    -
      -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - - {{#if data.effectstatlevel}} -
    • - -
    • - {{else}} -
    • - -
    • - {{/if}} - -
    • -
    • -
        -
      • -
      • - {{#each data.specaffected as |spec idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    • - -
    • - -
    • - - {{#if (eq data.genre "positive")}} - -
    • -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - - {{else}} - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - - {{#if data.recoveryroll}} -
    • - -
    • -
    • -
        -
      • - -
      • -
      • -
      • - {{#each data.recoveryrollspec as |spec idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    • - {{/if}} - - {{/if}} - -
    -
    - -
    -
    diff --git a/templates/item-equipment-sheet.html b/templates/item-equipment-sheet.html deleted file mode 100644 index 0d66d2d..0000000 --- a/templates/item-equipment-sheet.html +++ /dev/null @@ -1,86 +0,0 @@ -
    -
    - -
    -

    -
    -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-description.html}} - -
    -
      -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - - {{> systems/fvtt-pegasus-rpg/templates/partial-equipment-effects.html}} - -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    • - -
    • - {{#if data.iscontainer}} -
    • - -
    • - {{/if}} -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    -
    - -
    -
    diff --git a/templates/item-money-sheet.html b/templates/item-money-sheet.html deleted file mode 100644 index da8430c..0000000 --- a/templates/item-money-sheet.html +++ /dev/null @@ -1,33 +0,0 @@ -
    -
    - -
    -

    -
    -
    - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - {{> systems/fvtt-pegasus-rpg/templates/partial-item-description.html}} - -
    -
      -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    -
    - -
    -
    diff --git a/templates/item-perk-sheet.html b/templates/item-perk-sheet.html deleted file mode 100644 index d353c99..0000000 --- a/templates/item-perk-sheet.html +++ /dev/null @@ -1,112 +0,0 @@ -
    -
    - -
    -

    -
    -
    - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - {{> systems/fvtt-pegasus-rpg/templates/partial-item-description.html}} - -
    -
      -
    • - -
    • - -
    • - -
    • -
    • - -
    • -
    • - -
    • - -
    • -
    • -
    • -
        -
      • -
      • - {{#each data.effectsgained as |effect idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    • - - {{#each data.features as |feature key|}} - {{#if feature.isvalid}} -
    • - - -
    • - {{#if feature.flag}} -
        -
      • - {{#if (eq feature.type "statdice")}} - - {{/if}} - {{#if (eq feature.type "range")}} - - {{/if}} - {{#if (eq feature.type "number")}} - - {{/if}} - {{#if (eq feature.type "string")}} - - {{/if}} - {{#if (eq feature.type "dropspec")}} -
          -
        • -
        • - -
        - {{/if}} - {{#if (eq feature.type "text")}} -
        - {{editor content=features.value target="data.features.{{key}}.value" button=true owner=owner editable=editable}} -
        - {{/if}} -
      • -
      - {{/if}} - {{/if}} - {{/each}} -
    - -
    - -
    -
    diff --git a/templates/item-power-sheet.html b/templates/item-power-sheet.html deleted file mode 100644 index abb84fb..0000000 --- a/templates/item-power-sheet.html +++ /dev/null @@ -1,136 +0,0 @@ -
    -
    - -
    -

    -
    -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - -
    -
    - - {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} -
    -
    - - {{editor content=data.effects target="data.effects" button=true owner=owner editable=editable}} -
    -
    - - {{editor content=data.purchasedeffects target="data.purchasedeffects" button=true owner=owner - editable=editable}} -
    -
    - -
    -
      -
    • - -
    • - {{#if data.rollneeded}} -
    • - -
    • - {{/if}} - -
    • - - -
    • - -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    • - -
    • - -
    • - - -
    • - {{#if data.dmgroll}} -
    • - -
    • - {{/if}} - -
    • -
    • -
    • -
        -
      • -
        -
      • - {{#each data.effectsgained as |effect idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    • - -
    -
    - -
    -
    \ No newline at end of file diff --git a/templates/item-race-sheet.html b/templates/item-race-sheet.html deleted file mode 100644 index ec9bb16..0000000 --- a/templates/item-race-sheet.html +++ /dev/null @@ -1,134 +0,0 @@ -
    -
    - -
    -

    -
    -
    - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - -
    - - -
    - {{editor content=data.description target="data.description" button=true owner=owner editable=editable}} -
    - -
    - {{editor content=data.environment target="data.environment" button=true owner=owner editable=editable}} -
    - -
    - {{editor content=data.society_culture target="data.society_culture" button=true owner=owner editable=editable}} -
    - -
    - {{editor content=data.outlook target="data.outlook" button=true owner=owner editable=editable}} -
    -
    - -
    -
      -
    • -
    • -
        -
      • -
        -
      • - {{#each data.abilities as |ability idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    - -
      -
    • - -
    • - {{#if data.selectablestats}} -
    • - -
    • -
    • - -
    • - {{/if}} -
    - -
      -
    • - -
    • - -
    • -
    • -
        -
      • -
        -
      • - {{#each data.optionnalabilities as |ability idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    - -
      -
    • - -
    • - {{#if data.perksgained}} -
    • - -
    • -
    • - -
    • - {{#if data.perksall}} - {{else}} -
        -
      • -
        -
      • - {{#each data.perks as |perk idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      - {{/if}} - {{/if}} -
    - -
    - -
    -
    \ No newline at end of file diff --git a/templates/item-role-sheet.html b/templates/item-role-sheet.html deleted file mode 100644 index b0aa6eb..0000000 --- a/templates/item-role-sheet.html +++ /dev/null @@ -1,114 +0,0 @@ -
    -
    - -
    -

    - -

    -
    -
    - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-description.html}} - -
    -
      -
    • - -
    • -
    • - -
    • -
    • - -
    • -
        -
      • - -
      • -
      • - -
      • -
      • -
      • - {{#each data.specialisationsplus1 as |spec idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      -
    • - -
    • -
        -
      • -
      • - {{#each data.specialperk as |perk idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      - -
    • -
    • -
        -
      • - {{#each data.statincreasechoice as |stat idx|}} - - - {{/each}} -
      • -
      -
    • -
    • -
        -
      • -
      • - {{#each data.specincrease as |spec idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      - -
    • -
    • -
        -
      • -
      • - {{#each data.perks as |perk idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      - -
    -
    - -
    -
    diff --git a/templates/item-shield-sheet.html b/templates/item-shield-sheet.html deleted file mode 100644 index 5614e11..0000000 --- a/templates/item-shield-sheet.html +++ /dev/null @@ -1,55 +0,0 @@ -
    -
    - -
    -

    -
    -
    - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-description.html}} - -
    -
      -
    • - -
    • -
    • - -
    • - - {{> systems/fvtt-pegasus-rpg/templates/partial-equipment-effects.html}} - -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    -
    - -
    -
    diff --git a/templates/item-specialisation-sheet.html b/templates/item-specialisation-sheet.html deleted file mode 100644 index c5c7c1c..0000000 --- a/templates/item-specialisation-sheet.html +++ /dev/null @@ -1,62 +0,0 @@ -
    -
    - -
    -

    -
    -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-description.html}} - -
    -
      -
    • - -
    • - -
    • - -
    • -
    • - -
    • - {{#if data.ispowergroup}} -
    • - -
    • -
    • -
    • -
        -
      • -
      • - {{#each data.powers as |power idx|}} -
      • - -
        - -
        -
      • - {{/each}} -
      - - {{/if}} -
    • - -
    • -
    -
    -
    -
    diff --git a/templates/item-weapon-sheet.html b/templates/item-weapon-sheet.html deleted file mode 100644 index 3341e46..0000000 --- a/templates/item-weapon-sheet.html +++ /dev/null @@ -1,145 +0,0 @@ -
    -
    - -
    -

    -
    -
    - {{> systems/fvtt-pegasus-rpg/templates/partial-item-nav.html}} - - {{!-- Sheet Body --}} -
    - - {{> systems/fvtt-pegasus-rpg/templates/partial-item-description.html}} - -
    -
      -
    • - -
    • - -
    • - -
    • - -
    • - -
    • -
    • - -
    • -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - - {{> systems/fvtt-pegasus-rpg/templates/partial-equipment-effects.html}} - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - -
    • - {{#if data.enhanced}} -
    • - -
    • -
    • - -
    • - {{/if}} - -
    • - -
    • -
    • - -
    • -
    • - -
    • -
    -
    - -
    -
    diff --git a/templates/npc-sheet.html b/templates/npc-sheet.html deleted file mode 100644 index 6bfa5f1..0000000 --- a/templates/npc-sheet.html +++ /dev/null @@ -1,184 +0,0 @@ -
    - - {{!-- Sheet Header --}} -
    -
    -
    - -

    -
    -
    -
    - - {{!-- Sheet Tab Navigation --}} - - - {{!-- Sheet Body --}} -
    - - {{!-- Carac Tab --}} -
    - Unlocked/Locked{{#if editScore}}Unlocked{{else}}Locked{{/if}} - -
    -
    - -

    Type

    -
    - - - -
    -

    Traits List

    -
      - {{#each traits as |trait key|}} -
    • - - {{trait.name}} - {{trait.data.data.type}} -
      - - -
      -
    • - {{/each}} -
    -
    - -
    - -
    -

    Stats & Numbers

    -
      - {{#each data.spec as |spec key|}} -
    • - {{spec.label}} - -
    • - {{/each}} -
    -
    - -
    -
    - - - {{!-- Defence Tab --}} -
    -
    - -
    - {{#each data.fight as |fight key|}} -
      -
    • - {{fight.label}} - -
    • - {{#each fight.derivated as |derivated keydev|}} -
    • - {{derivated.label}} - -
    • - {{/each}} -
    - {{/each}} -
    - -

    Weapons

    - - -
    -
    - - {{!-- Traits Tab --}} -
    - - -
    - - {{!-- Features Tab --}} -
    -
    - -

    Equipment

    - - -
    -
    - - {{!-- Notes Tab --}} -
    -
    -

    Description :

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

    Notes :

    -
    - {{editor content=data.notes target="data.notes" button=true owner=owner editable=editable}} -
    -
    - {{>"systems/fvtt-fragged-kingdom/templates/editor-notes-gm.html"}} -
    -
    - -
    -
    - diff --git a/templates/partial-item-description.html b/templates/partial-item-description.html index a78040b..2ab61fd 100644 --- a/templates/partial-item-description.html +++ b/templates/partial-item-description.html @@ -1,4 +1,4 @@ -
    +
    diff --git a/templates/partial-item-nav.html b/templates/partial-item-nav.html deleted file mode 100644 index 95b52cd..0000000 --- a/templates/partial-item-nav.html +++ /dev/null @@ -1,5 +0,0 @@ -{{!-- Sheet Tab Navigation --}} - diff --git a/templates/partial-options-level.html b/templates/partial-options-level.html deleted file mode 100644 index 0fb86c0..0000000 --- a/templates/partial-options-level.html +++ /dev/null @@ -1,14 +0,0 @@ -{{#if notapplicable}} - -{{/if}} - - - - - - - - - - - diff --git a/templates/partial-options-range.html b/templates/partial-options-range.html deleted file mode 100644 index e08a1e5..0000000 --- a/templates/partial-options-range.html +++ /dev/null @@ -1,15 +0,0 @@ -{{#if notapplicable}} - -{{/if}} - - - - - - - - - - - - diff --git a/templates/partial-options-statistics.html b/templates/partial-options-statistics.html deleted file mode 100644 index a187abf..0000000 --- a/templates/partial-options-statistics.html +++ /dev/null @@ -1,22 +0,0 @@ -{{#if notapplicable}} - -{{/if}} -{{#if all}} - -{{/if}} -{{#if all}} - -{{/if}} - - - - - - - - - - -{{#if mr}} - -{{/if}} diff --git a/templates/partial-roll-select-effects.html b/templates/partial-roll-select-effects.html deleted file mode 100644 index b324929..0000000 --- a/templates/partial-roll-select-effects.html +++ /dev/null @@ -1,102 +0,0 @@ - -{{#if (notEmpty effectsList)}} - -
      - {{#each effectsList as |effect idx|}} - - {{#if effect.effect.data.hindrance}} -
    • - - -
    • - {{else}} - {{#if (eq type "hindrance")}} -
    • - - -
    • - {{else}} - {{#if (count effect.effect.data.specaffected)}} - {{#each effect.effect.data.specaffected as |spec idx|}} - {{#if (eq @root.specName spec.name)}} -
    • - - {{#if effect.effect}} - - {{else}} - - {{/if}} -
    • - {{/if}} - {{/each}} - {{else}} - {{#if (eq @root.statKey effect.effect.data.stataffected)}} -
    • - - {{#if effect.effect}} - - {{else}} - - {{/if}} -
    • - {{else}} - {{#if (eq effect.effect.data.stataffected "all")}} -
    • - - {{#if effect.effect}} - - {{else}} - - {{/if}} -
    • - {{/if}} - {{/if}} - {{/if}} - {{/if}} - {{/if}} - - {{/each}} -
    -{{/if}} - -{{#if (notEmpty armorsList)}} - -
      - - {{#each armorsList as |armor idx|}} -
    • - - -
    • - {{/each}} - -
    -{{/if}} - -{{#if (notEmpty weaponsList)}} - -
      - - {{#each weaponsList as |weapon idx|}} -
    • - - -
    • - {{/each}} - -
    -{{/if}} - -{{#if (notEmpty equipmentsList)}} - -
      - - {{#each equipmentsList as |equip idx|}} -
    • - - -
    • - {{/each}} - -
    -{{/if}}