From 83542002eda7f1b79b7049c85bc0be7b82c0f10b Mon Sep 17 00:00:00 2001 From: alzer <> Date: Wed, 12 Aug 2026 12:37:30 +0200 Subject: [PATCH] Nettoyage : suppression de fichiers orphelins, activation de wh4_de.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Suppression de fr-actor-wfrp4e.js (ancien fork de la classe Actor du système, remplacé par Babele), potion-ingredients.js (doublon des anciennes données Gaben-der-Rhya déjà migrées vers wfrp4e-risikogruppe) et 2 images non référencées. - wh4_de.js (enregistrement de "de" dans supportedLanguages pour wfrp4e/eis) n'était référencé dans aucun esmodule et ne s'exécutait donc jamais. Déplacé dans modules/ et ajouté aux esmodules. --- images/astuce_acteur_arme.webp | Bin 108968 -> 0 bytes images/astuce_acteur_macro.webp | Bin 118984 -> 0 bytes module.json | 5 +- modules/fr-actor-wfrp4e.js | 3610 ------------------------------- modules/potion-ingredients.js | 77 - wh4_de.js => modules/wh4_de.js | 0 6 files changed, 3 insertions(+), 3689 deletions(-) delete mode 100644 images/astuce_acteur_arme.webp delete mode 100644 images/astuce_acteur_macro.webp delete mode 100644 modules/fr-actor-wfrp4e.js delete mode 100644 modules/potion-ingredients.js rename wh4_de.js => modules/wh4_de.js (100%) diff --git a/images/astuce_acteur_arme.webp b/images/astuce_acteur_arme.webp deleted file mode 100644 index 8296fe20d2b108141beef602aefc75700f11b28e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108968 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 OnM9VQa#&0qbie>}Tl69T diff --git a/images/astuce_acteur_macro.webp b/images/astuce_acteur_macro.webp deleted file mode 100644 index 34d8e12003f05e007adf1ab3986d60a7cabd1233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118984 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

N& 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ΞUijouAtg~siVJ# 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�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 B)06-J diff --git a/module.json b/module.json index 9429702..0c67500 100644 --- a/module.json +++ b/module.json @@ -8,12 +8,13 @@ } ], "url": "https://gitea.palmenalzer.de/alzer/wfrp-4e-de", - "version": "8.6.116", + "version": "8.6.117", "esmodules": [ "modules/babele-register.js", "modules/addon-register.js", "modules/import-stat-2.js", - "modules/loadScripts.js" + "modules/loadScripts.js", + "modules/wh4_de.js" ], "styles": [ "patch-styles.css" diff --git a/modules/fr-actor-wfrp4e.js b/modules/fr-actor-wfrp4e.js deleted file mode 100644 index 74c288b..0000000 --- a/modules/fr-actor-wfrp4e.js +++ /dev/null @@ -1,3610 +0,0 @@ -/** - * Provides the main Actor data computation and organization. - * - * ActorWfrp4e contains all the preparation data and methods used for preparing an actor: - * going through each Owned Item, preparing them for display based on characteristics. - * Additionally, it handles all the different types of roll requests, setting up the - * test dialog, how each test is displayed, etc. - * - * - * @see ActorSheetWfrp4e - Base sheet class - * @see ActorSheetWfrp4eCharacter - Character sheet class - * @see ActorSheetWfrp4eNPC - NPC sheet class - * @see ActorSheetWfrp4eCreature - Creature sheet class - * @see DiceWFRP4e - Sends test data to roll tests. - */ -export default class ActorWfrp4e_fr extends Actor { - - /** - * Override the create() function to provide additional WFRP4e functionality. - * - * This overrided create() function adds initial items and flags to an actor - * upon creation. Namely: Basic skills, the 3 default coin values (brass - * pennies, silver shillings, gold crowns) at a quantity of 0, and setting - * up the default Automatic Calculation flags to be true. We still want to - * use the upstream create method, so super.create() is called at the end. - * Additionally - See the preCreateActor hook for more initial settings - * upon creation - * - * @param {Object} data Barebones actor data which this function adds onto. - * @param {Object} options (Unused) Additional options which customize the creation workflow. - * - */ - static async create(data, options) { - // If the created actor has items (only applicable to duplicated actors) bypass the new actor creation logic - if (data.items) { - return super.create(data, options); - } - - // Initialize empty items - data.items = []; - - // Default auto calculation to true - data.flags = - { - autoCalcRun: true, - autoCalcWalk: true, - autoCalcWounds: true, - autoCalcCritW: true, - autoCalcCorruption: true, - autoCalcEnc: true, - autoCalcSize: true, - } - let basicSkills = await game.wfrp4e.utility.allBasicSkills() || []; - let moneyItems = await game.wfrp4e.utility.allMoneyItems() || []; - moneyItems = moneyItems.sort((a, b) => (a.data.coinValue.value > b.data.coinValue.value) ? -1 : 1); - - // If character, automatically add basic skills and money items - if (data.type == "character") { - data.items = data.items.concat(basicSkills); - - // Set all money items to 0, add to actor - data.items = data.items.concat(moneyItems.map(m => { - m.data.quantity.value = 0 - return m - })) - super.create(data, options); // Follow through the the rest of the Actor creation process upstream - } - // If not a character, ask the user whether they want to add basic skills / money - else if (data.type == "npc" || data.type == "creature") { - new Dialog({ - title: game.i18n.localize("ACTOR.BasicSkillsTitle"), - content: `

${game.i18n.localize("ACTOR.BasicSkillsPrompt")}

`, - buttons: { - yes: { - label: game.i18n.localize("Yes"), - callback: async dlg => { - data.items = data.items.concat(basicSkills); - - // Set all money items to 0, add to actor - data.items = data.items.concat(moneyItems.map(m => { - m.data.quantity.value = 0 - return m - })) - super.create(data, options); // Follow through the the rest of the Actor creation process upstream - } - }, - no: { - label: game.i18n.localize("No"), - callback: async dlg => { - super.create(data, options); // Do not add new items, continue with the rest of the Actor creation process upstream - } - }, - }, - default: 'yes' - }).render(true); - } - } - - - - prepareBaseData() { - // For each characteristic, calculate the total and bonus value - for (let ch of Object.values(this.data.data.characteristics)) { - ch.value = ch.initial + ch.advances + (ch.modifier || 0); - ch.bonus = Math.floor(ch.value / 10) - ch.cost = game.wfrp4e.utility._calculateAdvCost(ch.advances, "characteristic") - } - } - - /** - * Calculates simple dynamic data when actor is updated. - * - * prepareData() is called when actor data is updated to recalculate values such as Characteristic totals, bonus (e.g. - * this is how Strength total and Strength Bonus gets updated whenever the user changes the Strength characteristic), - * movement values, and encumbrance. Some of these may or may not actually be calculated, depending on the user choosing - * not to have them autocalculated. These values are relatively simple, more complicated calculations that require items - * can be found in the sheet's getData() function. - * - * NOTE: NOT TO BE CONFUSED WITH prepare() - that function is called upon rendering to organize and process actor data - * - * @see ActorSheetWfrp4e.getData() - */ - prepareData() { - try { - super.prepareData(); - const data = this.data; - - if (this.data.type == "character") - this.prepareCharacter(); - if (this.data.type == "creature") - this.prepareCreature(); - - // Only characters have experience - if (data.type === "character") - data.data.details.experience.current = data.data.details.experience.total - data.data.details.experience.spent; - - // Auto calculation values - only calculate if user has not opted to enter ther own values - if (data.flags.autoCalcWalk) - data.data.details.move.walk = parseInt(data.data.details.move.value) * 2; - - if (data.flags.autoCalcRun) - data.data.details.move.run = parseInt(data.data.details.move.value) * 4; - - if (data.flags.autoCalcEnc) - data.data.status.encumbrance.max = data.data.characteristics.t.bonus + data.data.characteristics.s.bonus; - - if (game.settings.get("wfrp4e", "capAdvantageIB")) - data.data.status.advantage.max = data.data.characteristics.i.bonus - else - data.data.status.advantage.max = 10; - - - if (!hasProperty(this, "data.flags.autoCalcSize")) - data.flags.autoCalcSize = true; - - - // Find size based on Traits/Talents - let size; - let trait = data.items.find(t => t.type == "trait" && t.name.toLowerCase().includes(game.i18n.localize("NAME.Size").toLowerCase())); - if (this.data.type == "creature") { - trait = data.items.find(t => t.type == "trait" && t.included && t.name.toLowerCase().includes(game.i18n.localize("NAME.Size").toLowerCase())) - } - if (trait) - size = trait.data.specification.value; - else { - size = data.items.find(x => x.type == "talent" && x.name.toLowerCase() == game.i18n.localize("NAME.Small").toLowerCase()); - if (size) - size = size.name; - else - size = game.i18n.localize("SPEC.Average") - } - - // If the size has been changed since the last known value, update the value - data.data.details.size.value = game.wfrp4e.utility.findKey(size, game.wfrp4e.config.actorSizes) || "avg" - - // Now that we have size, calculate wounds and token size - if (data.flags.autoCalcWounds) { - let wounds = this._calculateWounds() - if (data.data.status.wounds.max != wounds) // If change detected, reassign max and current wounds - { - data.data.status.wounds.max = wounds; - data.data.status.wounds.value = wounds; - } - } - - if (data.flags.autoCalcSize) { - //let tokenSize = WFRP4E.tokenSizes[data.data.details.size.value] - let tokenSize = game.wfrp4e.config.tokenSizes[data.data.details.size.value] - if (this.isToken) { - this.token.update({"height" : tokenSize, "width" : tokenSize }); - } - data.token.height = tokenSize; - data.token.width = tokenSize; - } - - // Auto calculation flags - if the user hasn't disabled various autocalculated values, calculate them - if (data.flags.autoCalcRun) { - // This is specifically for the Stride trait - if (data.items.find(t => t.type == "trait" && t.name.toLowerCase() == game.i18n.localize("NAME.Stride").toLowerCase())) - data.data.details.move.run += data.data.details.move.walk; - } - - let talents = data.items.filter(t => t.type == "talent") - // talentTests is used to easily reference talent bonuses (e.g. in setupTest function and dialog) - // instead of iterating through every item again to find talents when rolling - data.flags.talentTests = []; - for (let talent of talents) // For each talent, if it has a Tests value, push it to the talentTests array - if (talent.data.tests.value) - data.flags.talentTests.push({ talentName: talent.name, test: talent.data.tests.value, SL: talent.data.advances.value }); - - // ------------------------ Talent Modifications ------------------------ - // These consist of Strike Mighty Blow, Accurate Shot, and Robust. Each determines - // how many advances there are according to preparedData, then modifies the flag value - // if there's any difference. - - // Strike Mighty Blow Talent - let smb = talents.filter(t => t.name.toLowerCase() == game.i18n.localize("NAME.SMB").toLowerCase()).reduce((advances, talent) => advances + talent.data.advances.value, 0) - if (smb) - data.flags.meleeDamageIncrease = smb - else if (!smb) - data.flags.meleeDamageIncrease = 0 - - // Accurate Shot Talent - let accshot = talents.filter(t => t.name.toLowerCase() == game.i18n.localize("NAME.AS").toLowerCase()).reduce((advances, talent) => advances + talent.data.advances.value, 0) - if (accshot) - data.flags.rangedDamageIncrease = accshot; - else if (!accshot) - data.flags.rangedDamageIncrease = 0 - - // Robust Talent - let robust = talents.filter(t => t.name.toLowerCase() == game.i18n.localize("NAME.Robust").toLowerCase()).reduce((advances, talent) => advances + talent.data.advances.value, 0) - if (robust) - data.flags.robust = robust; - else - data.flags.robust = 0 - - let ambi = talents.filter(t => t.name.toLowerCase() == game.i18n.localize("NAME.Ambi").toLowerCase()).reduce((advances, talent) => advances + talent.data.advances.value, 0) - data.flags.ambi = ambi; - - } - catch (error) { - console.error("Something went wrong with preparing actor data: " + error) - ui.notifications.error(game.i18n.localize("ACTOR.PreparationError") + error) - } - } - - /** - * Augments actor preparation with additional calculations for Characters. - * - * Characters have more features and so require more calculation. Specifically, - * this will add pure soul talent advances to max corruption, as well as display - * current career values (details, advancement indicatiors, etc.). - * - * Note that this functions requires actorData to be prepared, by this.prepare(). - * - * @param {Object} actorData prepared actor data to augment - */ - prepareCharacter() { - if (this.data.type != "character") - return; - - let tb = this.data.data.characteristics.t.bonus; - let wpb = this.data.data.characteristics.wp.bonus; - - // If the user has not opted out of auto calculation of corruption, add pure soul value - if (this.data.flags.autoCalcCorruption) { - this.data.data.status.corruption.max = tb + wpb; - let pureSoulTalent = this.data.items.find(x => x.type == "talent" && x.name.toLowerCase() == (game.i18n.localize("NAME.PS")).toLowerCase()) - if (pureSoulTalent) - this.data.data.status.corruption.max += pureSoulTalent.data.advances.value; - } - } - - - prepareNPC() { - - } - - - /** - * Augments actor preparation with additional calculations for Creatures. - * - * preparing for Creatures mainly involves excluding traits that were marked to be excluded, - * then replacing the traits array with only the included traits (which is used by prepare()). - * - * Note that this functions requires actorData to be prepared, by this.prepare(). - * - * @param {Object} actorData prepared actor data to augment - */ - prepareCreature() { - if (this.data.type != "creature") - return; - - // mark each trait as included or not - for (let trait of this.data.items.filter(i => i.type == "trait")) { - if (this.data.data.excludedTraits.includes(trait._id)) - trait.included = false; - else - trait.included = true; - } - - } - - /* --------------------------------------------------------------------------------------------------------- */ - /* Setting up Rolls - /* - /* All "setup______" functions gather the data needed to roll a certain test. These are in 3 main objects. - /* These 3 objects are then given to DiceWFRP.setupDialog() to show the dialog, see that function for its usage. - /* - /* The 3 Main objects: - /* testData - Data associated with modifications to rolling the test itself, or results of the test. - /* Examples of this are whether hit locations are found, Weapon qualities that may cause - criticals/fumbles more often or ingredients for spells that cancel miscasts. - dialogOptions - Data for rendering the dialog that's important for a specific test type. - Example: when casting or channelling, there should be an option for Malignant - Influences, but only for those tests. - cardOptions - Which card to use, the title of the card, the name of the actor, etc. - /* --------------------------------------------------------------------------------------------------------- */ - - /** - * Setup a Characteristic Test. - * - * Characteristics tests are the simplest test, all that needs considering is the target number of the - * characteristic being tested, and any modifiers the user enters. - * - * @param {String} characteristicId The characteristic id (e.g. "ws") - id's can be found in config.js - * - */ - setupCharacteristic(characteristicId, options = {}) { - let char = this.data.data.characteristics[characteristicId]; - let title = game.i18n.localize(char.label) + " " + game.i18n.localize("Test"); - - let testData = { - target: char.value, - hitLocation: false, - extra: { - size : this.data.data.details.size.value, - actor : this.data, - options: options - } - }; - - if (options.rest) - testData.extra.options["tb"] = char.bonus; - - // Default a WS or BS test to have hit location checked - if (characteristicId == "ws" || characteristicId == "bs") - testData.hitLocation = true; - - // Setup dialog data: title, template, buttons, prefilled data - let dialogOptions = { - title: title, - template: "/systems/wfrp4e/templates/dialog/characteristic-dialog.html", - // Prefilled dialog data - data: { - hitLocation: testData.hitLocation, - talents: this.data.flags.talentTests, - advantage: this.data.data.status.advantage.value || 0, - rollMode: options.rollMode - }, - callback: (html) => { - // When dialog confirmed, fill testData dialog information - // Note that this does not execute until DiceWFRP.setupDialog() has finished and the user confirms the dialog - cardOptions.rollMode = html.find('[name="rollMode"]').val(); - testData.testModifier = Number(html.find('[name="testModifier"]').val()); - testData.testDifficulty = game.wfrp4e.config.difficultyModifiers[html.find('[name="testDifficulty"]').val()]; - testData.successBonus = Number(html.find('[name="successBonus"]').val()); - testData.slBonus = Number(html.find('[name="slBonus"]').val()); - // Target value is the final value being tested against, after all modifiers and bonuses are added - testData.target = testData.target + testData.testModifier + testData.testDifficulty; - testData.hitLocation = html.find('[name="hitLocation"]').is(':checked'); - let talentBonuses = html.find('[name = "talentBonuses"]').val(); - - // Combine all Talent Bonus values (their times taken) into one sum - testData.successBonus += talentBonuses.reduce(function (prev, cur) { - return prev + Number(cur) - }, 0) - return { testData, cardOptions }; - } - }; - - if (options.corruption) { - title = `Corrupting Influence - ${game.i18n.localize(char.label)} Test` - dialogOptions.title = title; - dialogOptions.data.testDifficulty = "challenging" - } - if (options.mutate) { - title = `Dissolution of Body and Mind - ${game.i18n.localize(char.label)} Test` - dialogOptions.title = title; - dialogOptions.data.testDifficulty = "challenging" - } - - if (options.rest) { - dialogOptions.data.testDifficulty = "average" - } - - // Call the universal cardOptions helper - let cardOptions = this._setupCardOptions("systems/wfrp4e/templates/chat/roll/characteristic-card.html", title) - - // Provide these 3 objects to setupDialog() to create the dialog and assign the roll function - return game.wfrp4e.dice.setupDialog({ - dialogOptions: dialogOptions, - testData: testData, - cardOptions: cardOptions - }); - } - - /** - * Setup a Skill Test. - * - * Skill tests are much like Characteristic Tests in their simplicity, just with another layer of modifiers (skill advances). - * However, there is more complication if the skill is instead for an Income test, which adds computation after the roll is - * completed. - * - * @param {Object} skill The skill item being tested. Skill items contain the advancements and the base characteristic, see template.json for more information. - * @param {bool} income Whether or not the skill is being tested to determine Income. - */ - setupSkill(skill, options = {}) { - let title = skill.name + " " + game.i18n.localize("Test"); - let testData = { - hitLocation: false, - income: options.income, - target: this.data.data.characteristics[skill.data.characteristic.value].value + skill.data.advances.value, - extra: { - size: this.data.data.details.size.value, - actor : this.data, - options: options, - skill: skill - } - }; - - // Default a WS, BS, Melee, or Ranged to have hit location checked - if (skill.data.characteristic.value == "ws" || - skill.data.characteristic.value == "bs" || - skill.name.includes(game.i18n.localize("NAME.Melee")) || - skill.name.includes(game.i18n.localize("NAME.Ranged"))) { - testData.hitLocation = true; - } - - // Setup dialog data: title, template, buttons, prefilled data - let dialogOptions = { - title: title, - template: "/systems/wfrp4e/templates/dialog/skill-dialog.html", - // Prefilled dialog data - - data: { - hitLocation: testData.hitLocation, - talents: this.data.flags.talentTests, - characteristicList: game.wfrp4e.config.characteristics, - characteristicToUse: skill.data.characteristic.value, - advantage: this.data.data.status.advantage.value || 0, - rollMode: options.rollMode - }, - callback: (html) => { - // When dialog confirmed, fill testData dialog information - // Note that this does not execute until DiceWFRP.setupDialog() has finished and the user confirms the dialog - cardOptions.rollMode = html.find('[name="rollMode"]').val(); - testData.testModifier = Number(html.find('[name="testModifier"]').val()); - testData.testDifficulty = game.wfrp4e.config.difficultyModifiers[html.find('[name="testDifficulty"]').val()]; - testData.successBonus = Number(html.find('[name="successBonus"]').val()); - testData.slBonus = Number(html.find('[name="slBonus"]').val()); - let characteristicToUse = html.find('[name="characteristicToUse"]').val(); - // Target value is the final value being tested against, after all modifiers and bonuses are added - testData.target = - this.data.data.characteristics[characteristicToUse].value - + testData.testModifier - + testData.testDifficulty - + skill.data.advances.value - + skill.data.modifier.value - - testData.hitLocation = html.find('[name="hitLocation"]').is(':checked'); - let talentBonuses = html.find('[name = "talentBonuses"]').val(); - - // Combine all Talent Bonus values (their times taken) into one sum - testData.successBonus += talentBonuses.reduce(function (prev, cur) { - return prev + Number(cur) - }, 0) - - return { testData, cardOptions }; - } - }; - - // If Income, use the specialized income roll handler and set testDifficulty to average - if (testData.income) { - dialogOptions.data.testDifficulty = "average"; - } - if (options.corruption) { - title = `Corrupting Influence - ${skill.name} Test` - dialogOptions.title = title; - dialogOptions.data.testDifficulty = "challenging" - } - if (options.mutate) { - title = `Dissolution of Body and Mind - ${skill.name} Test` - dialogOptions.title = title; - dialogOptions.data.testDifficulty = "challenging" - } - - // If Rest & Recover, set testDifficulty to average - if (options.rest) { dialogOptions.data.testDifficulty = "average"; } - - // Call the universal cardOptions helper - let cardOptions = this._setupCardOptions("systems/wfrp4e/templates/chat/roll/skill-card.html", title) - if (options.corruption) - cardOptions.rollMode = "gmroll" - - // Provide these 3 objects to setupDialog() to create the dialog and assign the roll function - return game.wfrp4e.dice.setupDialog({ - dialogOptions: dialogOptions, - testData: testData, - cardOptions: cardOptions - }); - } - - /** - * Setup a Weapon Test. - * - * Probably the most complicated type of Test, weapon tests' complexity comes from all the different - * factors and variables of the different weapons available and how they might affect test results, - * as well as ammo usage, the effects of using different skills etc. - * - * @param {Object} weapon The weapon Item being used. - * @param {bool} event The event that called this Test, used to determine if attack is melee or ranged. - */ - setupWeapon(weapon, options = {}) { - let skillCharList = []; // This array is for the different options available to roll the test (Skills and characteristics) - let slBonus = 0 // Used when wielding Defensive weapons - let modifier = 0; // Used when attacking with Accurate weapons - let successBonus = 0; - let title = game.i18n.localize("WeaponTest") + " - " + weapon.name; - - // Prepare the weapon to have the complete data object, including qualities/flaws, damage value, etc. - let wep = this.prepareWeaponCombat(foundry.utils.duplicate(weapon)); - let testData = { - target: 0, - hitLocation: true, - extra: { // Store this extra weapon/ammo data for later use - weapon: wep, - size: this.data.data.details.size.value, - actor : this.data, - champion: !!this.items.find(i => i.data.name.toLowerCase() == game.i18n.localize("NAME.Champion").toLowerCase() && i.type == "trait"), - riposte: !!this.items.find(i => i.data.name.toLowerCase() == game.i18n.localize("NAME.Riposte").toLowerCase() && i.type == "talent"), - options: options - } - }; - - if (wep.attackType == "melee") - skillCharList.push(game.i18n.localize("Weapon Skill")) - - else if (wep.attackType == "ranged") { - // If Ranged, default to Ballistic Skill, but check to see if the actor has the specific skill for the weapon - skillCharList.push(game.i18n.localize("Ballistic Skill")) - if (weapon.data.weaponGroup.value != "throwing" && weapon.data.weaponGroup.value != "explosives" && weapon.data.weaponGroup.value != "entangling") { - // Check to see if they have ammo if appropriate - testData.extra.ammo = foundry.utils.duplicate(this.getEmbeddedEntity("OwnedItem", weapon.data.currentAmmo.value)) - if (!testData.extra.ammo || weapon.data.currentAmmo.value == 0 || testData.extra.ammo.data.quantity.value == 0) { - AudioHelper.play({ src: "systems/wfrp4e/sounds/no.wav" }, false) - ui.notifications.error(game.i18n.localize("Error.NoAmmo")) - return - } - } - else if (weapon.data.weaponGroup.value != "entangling" && weapon.data.quantity.value == 0) { - // If this executes, it means it uses its own quantity for ammo (e.g. throwing), which it has none of - AudioHelper.play({ src: "systems/wfrp4e/sounds/no.wav" }, false) - ui.notifications.error(game.i18n.localize("Error.NoAmmo")) - return; - } - else { - // If this executes, it means it uses its own quantity for ammo (e.g. throwing) - testData.extra.ammo = weapon; - } - } - - let defaultSelection // The default skill/characteristic being used - if (wep.skillToUse) { - // If the actor has the appropriate skill, default to that. - skillCharList.push(wep.skillToUse.name) - defaultSelection = skillCharList.indexOf(wep.skillToUse.name) - testData.target = this.data.data.characteristics[wep.skillToUse.data.characteristic.value].value + wep.skillToUse.data.advances.value; - - } - - // Bypass macro default values - if (!testData.target) - testData.target = wep.attackType == "melee" ? this.data.data.characteristics["ws"].value : this.data.data.characteristics["bs"].value - - // ***** Automatic Test Data Fill Options ****** - - // If offhand and should apply offhand penalty (should apply offhand penalty = not parry, not defensive, and not twohanded) - if (getProperty(wep, "data.offhand.value") && !wep.data.twohanded.value && !(weapon.data.weaponGroup.value == "parry" && wep.properties.qualities.includes(game.i18n.localize("PROPERTY.Defensive")))) - { - modifier = -20 - modifier += Math.min(20, this.data.flags.ambi * 10) - } - - // Try to automatically fill the dialog with values based on context - // If the auto-fill setting is true, and there is combat.... - if (game.settings.get("wfrp4e", "testAutoFill") && (game.combat && game.combat.data.round != 0 && game.combat.turns)) { - try { - let currentTurn = game.combat.turns[game.combat.current.turn] - - - // If actor is a token - if (this.data.token.actorLink) { - // If it is NOT the actor's turn - if (currentTurn && this.data.token != currentTurn.token) - slBonus = this.data.flags.defensive; // Prefill Defensive values (see prepareItems() for how defensive flags are assigned) - - else // If it is the actor's turn - { - // Prefill dialog according to qualities/flaws - if (wep.properties.qualities.includes(game.i18n.localize("PROPERTY.Accurate"))) - modifier += 10; - if (wep.properties.qualities.includes(game.i18n.localize("PROPERTY.Precise"))) - successBonus += 1; - if (wep.properties.flaws.includes(game.i18n.localize("PROPERTY.Imprecise"))) - slBonus -= 1; - } - } - else // If the actor is not a token - { - // If it is NOT the actor's turn - if (currentTurn && currentTurn.tokenId != this.token.data._id) - slBonus = this.data.flags.defensive; - - else // If it is the actor's turn - { - // Prefill dialog according to qualities/flaws - if (wep.properties.qualities.includes(game.i18n.localize("PROPERTY.Accurate"))) - modifier += 10; - if (wep.properties.qualities.includes(game.i18n.localize("PROPERTY.Precise"))) - successBonus += 1; - if (wep.properties.flaws.includes(game.i18n.localize("PROPERTY.Imprecise"))) - slBonus -= 1; - } - } - } - catch // If something went wrong, default to 0 for all prefilled data - { - slBonus = 0; - successBonus = 0; - modifier = 0; - } - } - - // Setup dialog data: title, template, buttons, prefilled data - let dialogOptions = { - title: title, - template: "/systems/wfrp4e/templates/dialog/weapon-dialog.html", - // Prefilled dialog data - data: { - hitLocation: testData.hitLocation, - talents: this.data.flags.talentTests, - skillCharList: skillCharList, - slBonus: slBonus || 0, - successBonus: successBonus || 0, - testDifficulty: options.difficulty, - modifier: modifier || 0, - defaultSelection: defaultSelection, - advantage: this.data.data.status.advantage.value || 0, - rollMode: options.rollMode - }, - callback: (html) => { - // When dialog confirmed, fill testData dialog information - // Note that this does not execute until DiceWFRP.setupDialog() has finished and the user confirms the dialog - cardOptions.rollMode = html.find('[name="rollMode"]').val(); - testData.testModifier = Number(html.find('[name="testModifier"]').val()); - testData.testDifficulty = game.wfrp4e.config.difficultyModifiers[html.find('[name="testDifficulty"]').val()]; - testData.successBonus = Number(html.find('[name="successBonus"]').val()); - testData.slBonus = Number(html.find('[name="slBonus"]').val()); - let skillSelected = skillCharList[Number(html.find('[name="skillSelected"]').val())]; - - // Determine final target if a characteristic was selected - if (skillSelected == game.i18n.localize("CHAR.WS") || skillSelected == game.i18n.localize("CHAR.BS")) { - if (skillSelected == game.i18n.localize("CHAR.WS")) - testData.target = this.data.data.characteristics.ws.value - else if (skillSelected == game.i18n.localize("CHAR.BS")) - testData.target = this.data.data.characteristics.bs.value - - testData.target += testData.testModifier + testData.testDifficulty; - } - else // If a skill was selected - { - // If using the appropriate skill, set the target number to characteristic value + advances + modifiers - // Target value is the final value being tested against, after all modifiers and bonuses are added - let skillUsed = testData.extra.weapon.skillToUse; - - testData.target = - this.data.data.characteristics[skillUsed.data.characteristic.value].value - + testData.testModifier - + testData.testDifficulty - + skillUsed.data.advances.value - + skillUsed.data.modifier.value - } - - testData.hitLocation = html.find('[name="hitLocation"]').is(':checked'); - - let talentBonuses = html.find('[name = "talentBonuses"]').val(); - - // Combine all Talent Bonus values (their times taken) into one sum - testData.successBonus += talentBonuses.reduce(function (prev, cur) { - return prev + Number(cur) - }, 0) - - return { testData, cardOptions }; - } - - }; - - // Call the universal cardOptions helper - let cardOptions = this._setupCardOptions("systems/wfrp4e/templates/chat/roll/weapon-card.html", title) - - // Provide these 3 objects to setupDialog() to create the dialog and assign the roll function - return game.wfrp4e.dice.setupDialog({ - dialogOptions: dialogOptions, - testData: testData, - cardOptions: cardOptions - }); - } - - - /** - * Setup a Casting Test. - * - * Casting tests are more complicated due to the nature of spell miscasts, ingredients, etc. Whatever ingredient - * is selected will automatically be used and negate one miscast. For the spell rolling logic, see DiceWFRP.rollCastTest - * where all this data is passed to in order to calculate the roll result. - * - * @param {Object} spell The spell Item being Casted. The spell item has information like CN, lore, and current ingredient ID - * - */ - setupCast(spell, options = {}) { - let title = game.i18n.localize("CastingTest") + " - " + spell.name; - - // castSkill array holds the available skills/characteristics to cast with - Casting: Intelligence - let castSkills = [{ key: "int", name: game.i18n.localize("CHAR.Int") }] - - // if the actor has Language (Magick), add it to the array. - castSkills = castSkills.concat(this.items.filter(i => i.name.toLowerCase() == `${game.i18n.localize("Language")} (${game.i18n.localize("Magick")})`.toLowerCase() && i.type == "skill")) - - // Default to Language Magick if it exists - let defaultSelection = castSkills.findIndex(i => i.name.toLowerCase() == `${game.i18n.localize("Language")} (${game.i18n.localize("Magick")})`.toLowerCase()) - - // Whether the actor has Instinctive Diction is important in the test rolling logic - let instinctiveDiction = (this.data.flags.talentTests.findIndex(x => x.talentName.toLowerCase() == game.i18n.localize("NAME.ID").toLowerCase()) > -1) // instinctive diction boolean - - // Prepare the spell to have the complete data object, including damage values, range values, CN, etc. - let preparedSpell = this.prepareSpellOrPrayer(spell); - let testData = { - target: 0, - extra: { // Store this data to be used by the test logic - spell: preparedSpell, - malignantInfluence: false, - ingredient: false, - ID: instinctiveDiction, - size: this.data.data.details.size.value, - actor : this.data, - options: options - } - }; - - // If the spell does damage, default the hit location to checked - if (preparedSpell.damage) - testData.hitLocation = true; - - // Setup dialog data: title, template, buttons, prefilled data - let dialogOptions = { - title: title, - template: "/systems/wfrp4e/templates/dialog/spell-dialog.html", - // Prefilled dialog data - data: { - hitLocation: testData.hitLocation, - malignantInfluence: testData.malignantInfluence, - talents: this.data.flags.talentTests, - advantage: this.data.data.status.advantage.value || 0, - defaultSelection: defaultSelection, - castSkills: castSkills, - rollMode: options.rollMode - - }, - callback: (html) => { - // When dialog confirmed, fill testData dialog information - // Note that this does not execute until DiceWFRP.setupDialog() has finished and the user confirms the dialog - cardOptions.rollMode = html.find('[name="rollMode"]').val(); - testData.testModifier = Number(html.find('[name="testModifier"]').val()); - testData.testDifficulty = game.wfrp4e.config.difficultyModifiers[html.find('[name="testDifficulty"]').val()]; - testData.successBonus = Number(html.find('[name="successBonus"]').val()); - testData.slBonus = Number(html.find('[name="slBonus"]').val()); - - let skillSelected = castSkills[Number(html.find('[name="skillSelected"]').val())]; - - // If an actual skill (Language Magick) was selected, use that skill to calculate the target number - if (skillSelected.key != "int") { - testData.target = this.data.data.characteristics[skillSelected.data.data.characteristic.value].value - + skillSelected.data.data.advances.value - + skillSelected.data.data.modifier.value - + testData.testDifficulty - + testData.testModifier; - } - else // if a characteristic was selected, use just the characteristic - { - testData.target = this.data.data.characteristics.int.value - + testData.testDifficulty - + testData.testModifier; - } - - testData.hitLocation = html.find('[name="hitLocation"]').is(':checked'); - testData.extra.malignantInfluence = html.find('[name="malignantInfluence"]').is(':checked'); - - let talentBonuses = html.find('[name = "talentBonuses"]').val(); - // Combine all Talent Bonus values (their times taken) into one sum - testData.successBonus += talentBonuses.reduce(function (prev, cur) { - return prev + Number(cur) - }, 0) - - return { testData, cardOptions }; - } - }; - - // Call the universal cardOptions helper - let cardOptions = this._setupCardOptions("systems/wfrp4e/templates/chat/roll/spell-card.html", title) - - // Provide these 3 objects to setupDialog() to create the dialog and assign the roll function - return game.wfrp4e.dice.setupDialog({ - dialogOptions: dialogOptions, - testData: testData, - cardOptions: cardOptions - }); - } - - /** - * Setup a Channelling Test. - * - * Channelling tests are more complicated due to the nature of spell miscasts, ingredients, etc. Whatever ingredient - * is selected will automatically be used and mitigate miscasts. For the spell rolling logic, see DiceWFRP.rollChannellTest - * where all this data is passed to in order to calculate the roll result. - * - * @param {Object} spell The spell Item being Channelled. The spell item has information like CN, lore, and current ingredient ID - * This spell SL will then be updated accordingly. - * - */ - setupChannell(spell, options = {}) { - let title = game.i18n.localize("ChannellingTest") + " - " + spell.name; - - // channellSkills array holds the available skills/characteristics to with - Channelling: Willpower - let channellSkills = [{ key: "wp", name: game.i18n.localize("CHAR.WP") }] - - // if the actor has any channel skills, add them to the array. - channellSkills = channellSkills.concat(this.items.filter(i => i.name.toLowerCase().includes(game.i18n.localize("NAME.Channelling").toLowerCase()) && i.type == "skill")) - - // Find the spell lore, and use that to determine the default channelling selection - let spellLore = spell.data.lore.value; - let defaultSelection - if (spell.data.wind && spell.data.wind.value) { - defaultSelection = channellSkills.indexOf(channellSkills.find(x => x.name.includes(spell.data.wind.value))) - if (defaultSelection == -1) { - let customChannellSkill = this.items.find(i => i.name.toLowerCase().includes(spell.data.wind.value.toLowerCase()) && i.type == "skill"); - if (customChannellSkill) { - channellSkills.push(customChannellSkill) - defaultSelection = channellSkills.length - 1 - } - } - } - else { - defaultSelection = channellSkills.indexOf(channellSkills.find(x => x.name.includes(game.wfrp4e.config.magicWind[spellLore]))); - } - - if (spellLore == "witchcraft") - defaultSelection = channellSkills.indexOf(channellSkills.find(x => x.name.toLowerCase().includes(game.i18n.localize("NAME.Channelling").toLowerCase()))) - - // Whether the actor has Aethyric Attunement is important in the test rolling logic - let aethyricAttunement = (this.data.flags.talentTests.findIndex(x => x.talentName.toLowerCase() == game.i18n.localize("NAME.AA").toLowerCase()) > -1) // aethyric attunement boolean - - let testData = { - target: 0, - extra: { // Store data to be used by the test logic - spell: this.prepareSpellOrPrayer(spell), - malignantInfluence: false, - actor : this.data, - ingredient: false, - AA: aethyricAttunement, - size: this.data.data.details.size.value, - options: options - } - }; - - // Setup dialog data: title, template, buttons, prefilled data - let dialogOptions = { - title: title, - template: "/systems/wfrp4e/templates/dialog/channel-dialog.html", - // Prefilled dialog data - data: { - malignantInfluence: testData.malignantInfluence, - channellSkills: channellSkills, - defaultSelection: defaultSelection, - talents: this.data.flags.talentTests, - advantage: "N/A", - rollMode: options.rollMode - - }, - callback: (html) => { - // When dialog confirmed, fill testData dialog information - // Note that this does not execute until DiceWFRP.setupDialog() has finished and the user confirms the dialog - cardOptions.rollMode = html.find('[name="rollMode"]').val(); - testData.testModifier = Number(html.find('[name="testModifier"]').val()); - testData.testDifficulty = game.wfrp4e.config.difficultyModifiers[html.find('[name="testDifficulty"]').val()]; - testData.successBonus = Number(html.find('[name="successBonus"]').val()); - testData.slBonus = Number(html.find('[name="slBonus"]').val()); - testData.extra.malignantInfluence = html.find('[name="malignantInfluence"]').is(':checked'); - - let skillSelected = channellSkills[Number(html.find('[name="skillSelected"]').val())]; - // If an actual Channelling skill was selected, use that skill to calculate the target number - if (skillSelected.key != "wp") { - testData.target = testData.testModifier + testData.testDifficulty - + this.data.data.characteristics[skillSelected.data.data.characteristic.value].value - + skillSelected.data.data.advances.value - + skillSelected.data.data.modifier.value - testData.extra.channellSkill = skillSelected.data - } - else // if the ccharacteristic was selected, use just the characteristic - testData.target = testData.testModifier + testData.testDifficulty + this.data.data.characteristics.wp.value - - let talentBonuses = html.find('[name = "talentBonuses"]').val(); - // Combine all Talent Bonus values (their times taken) into one sum - testData.successBonus += talentBonuses.reduce(function (prev, cur) { - return prev + Number(cur) - }, 0) - - return { testData, cardOptions }; - - } - }; - - // Call the universal cardOptions helper - let cardOptions = this._setupCardOptions("systems/wfrp4e/templates/chat/roll/channel-card.html", title) - - // Provide these 3 objects to setupDialog() to create the dialog and assign the roll function - return game.wfrp4e.dice.setupDialog({ - dialogOptions: dialogOptions, - testData: testData, - cardOptions: cardOptions - }); - } - - /** - * Setup a Prayer Test. - * - * Prayer tests are fairly simple, with the main complexity coming from sin and wrath of the gods, - * the logic of which can be found in DiceWFRP.rollPrayerTest, where all this data here is passed - * to in order to calculate the roll result. - * - * @param {Object} prayer The prayer Item being used, compared to spells, not much information - * from the prayer itself is needed. - */ - setupPrayer(prayer, options = {}) { - let title = game.i18n.localize("PrayerTest") + " - " + prayer.name; - - // ppraySkills array holds the available skills/characteristics to pray with - Prayers: Fellowship - let praySkills = [{ key: "fel", name: game.i18n.localize("CHAR.Fel") }] - - // if the actor has the Pray skill, add it to the array. - praySkills = praySkills.concat(this.items.filter(i => i.name.toLowerCase() == game.i18n.localize("NAME.Pray").toLowerCase() && i.type == "skill")); - - // Default to Pray skill if available - let defaultSelection = praySkills.findIndex(i => i.name.toLowerCase() == game.i18n.localize("NAME.Pray").toLowerCase()) - - // Prepare the prayer to have the complete data object, including damage values, range values, etc. - let preparedPrayer = this.prepareSpellOrPrayer(prayer); - let testData = { // Store this data to be used in the test logic - target: 0, - hitLocation: false, - target: defaultSelection != -1 ? this.data.data.characteristics[praySkills[defaultSelection].data.data.characteristic.value].value + praySkills[defaultSelection].data.data.advances.value : this.data.data.characteristics.fel.value, - extra: { - prayer: preparedPrayer, - size: this.data.data.details.size.value, - actor : this.data, - sin: this.data.data.status.sin.value, - options: options, - rollMode: options.rollMode - } - }; - - - // If the spell does damage, default the hit location to checked - if (preparedPrayer.damage) - testData.hitLocation = true; - - // Setup dialog data: title, template, buttons, prefilled data - let dialogOptions = { - title: title, - template: "/systems/wfrp4e/templates/dialog/prayer-dialog.html", - // Prefilled dialog data - data: { - hitLocation: testData.hitLocation, - talents: this.data.flags.talentTests, - advantage: this.data.data.status.advantage.value || 0, - praySkills: praySkills, - defaultSelection: defaultSelection - }, - callback: (html) => { - // When dialog confirmed, fill testData dialog information - // Note that this does not execute until DiceWFRP.setupDialog() has finished and the user confirms the dialog - cardOptions.rollMode = html.find('[name="rollMode"]').val(); - testData.testModifier = Number(html.find('[name="testModifier"]').val()); - testData.testDifficulty = game.wfrp4e.config.difficultyModifiers[html.find('[name="testDifficulty"]').val()]; - testData.successBonus = Number(html.find('[name="successBonus"]').val()); - testData.slBonus = Number(html.find('[name="slBonus"]').val()); - - let skillSelected = praySkills[Number(html.find('[name="skillSelected"]').val())]; - // If an actual skill (Pray) was selected, use that skill to calculate the target number - if (skillSelected.key != "fel") { - testData.target = this.data.data.characteristics[skillSelected.data.data.characteristic.value].value - + skillSelected.data.data.advances.value - + testData.testDifficulty - + testData.testModifier; - + skillSelected.data.data.modifier.value - } - else // if a characteristic was selected, use just the characteristic - { - testData.target = this.data.data.characteristics.fel.value - + testData.testDifficulty - + testData.testModifier; - } - - testData.hitLocation = html.find('[name="hitLocation"]').is(':checked'); - - let talentBonuses = html.find('[name = "talentBonuses"]').val(); - // Combine all Talent Bonus values (their times taken) into one sum - testData.successBonus += talentBonuses.reduce(function (prev, cur) { - return prev + Number(cur) - }, 0) - - return { testData, cardOptions }; - } - }; - - // Call the universal cardOptions helper - let cardOptions = this._setupCardOptions("systems/wfrp4e/templates/chat/roll/prayer-card.html", title) - - // Provide these 3 objects to setupDialog() to create the dialog and assign the roll function - return game.wfrp4e.dice.setupDialog({ - dialogOptions: dialogOptions, - testData: testData, - cardOptions: cardOptions - }); - } - - /** - * Setup a Trait Test. - * - * Some traits are rollable, and so are assigned a rollable characteristic, this is where - * rolling those characteristics is setup. Additonally, sometimes these traits have a - * "Bonus characteristic" which in most all cases means what characteristic bonus to add - * to determine damage. See the logic in traitTest. - * - * @param {Object} trait The trait Item being used, containing which characteristic/bonus characteristic to use - */ - setupTrait(trait, options = {}) { - if (!trait.data.rollable.value) - return; - let title = game.wfrp4e.config.characteristics[trait.data.rollable.rollCharacteristic] + ` ${game.i18n.localize("Test")} - ` + trait.name; - let testData = { - hitLocation: false, - target: this.data.data.characteristics[trait.data.rollable.rollCharacteristic].value, - extra: { // Store this trait data for later use - trait: trait, - size: this.data.data.details.size.value, - actor : this.data, - champion: !!this.items.find(i => i.data.name.toLowerCase() == game.i18n.localize("NAME.Champion").toLowerCase()), - options: options, - rollMode: options.rollMode - } - }; - - // Default hit location checked if the rollable trait's characteristic is WS or BS - if (trait.data.rollable.rollCharacteristic == "ws" || trait.data.rollable.rollCharacteristic == "bs") - testData.hitLocation = true; - - // Setup dialog data: title, template, buttons, prefilled data - let dialogOptions = { - title: title, - template: "/systems/wfrp4e/templates/dialog/skill-dialog.html", // Reuse skill dialog - // Prefilled dialog data - data: { - hitLocation: testData.hitLocation, - talents: this.data.flags.talentTests, - characteristicList: game.wfrp4e.config.characteristics, - characteristicToUse: trait.data.rollable.rollCharacteristic, - advantage: this.data.data.status.advantage.value || 0, - testDifficulty: trait.data.rollable.defaultDifficulty - }, - callback: (html) => { - // When dialog confirmed, fill testData dialog information - // Note that this does not execute until DiceWFRP.setupDialog() has finished and the user confirms the dialog - cardOptions.rollMode = html.find('[name="rollMode"]').val(); - testData.testModifier = Number(html.find('[name="testModifier"]').val()); - testData.testDifficulty = game.wfrp4e.config.difficultyModifiers[html.find('[name="testDifficulty"]').val()]; - testData.successBonus = Number(html.find('[name="successBonus"]').val()); - testData.slBonus = Number(html.find('[name="slBonus"]').val()); - let characteristicToUse = html.find('[name="characteristicToUse"]').val(); - // Target value is the final value being tested against, after all modifiers and bonuses are added - testData.target = this.data.data.characteristics[characteristicToUse].value - + testData.testModifier - + testData.testDifficulty - testData.hitLocation = html.find('[name="hitLocation"]').is(':checked'); - let talentBonuses = html.find('[name = "talentBonuses"]').val(); - - // Combine all Talent Bonus values (their times taken) into one sum - testData.successBonus += talentBonuses.reduce(function (prev, cur) { - return prev + Number(cur) - }, 0) - - return { testData, cardOptions }; - } - }; - - // Call the universal cardOptions helper - let cardOptions = this._setupCardOptions("systems/wfrp4e/templates/chat/roll/skill-card.html", title) - - // Provide these 3 objects to setupDialog() to create the dialog and assign the roll function - return game.wfrp4e.dice.setupDialog({ - dialogOptions: dialogOptions, - testData: testData, - cardOptions: cardOptions - }); - } - - - /** - * Universal card options for setup functions. - * - * The setup_____() functions all use the same cardOptions, just different templates. So this is - * a standardized helper function to maintain DRY code. - * - * @param {string} template Fileptah to the template being used - * @param {string} title Title of the Test to be displayed on the dialog and card - */ - _setupCardOptions(template, title) { - let cardOptions = { - speaker: { - alias: this.data.token.name, - actor: this.data._id, - }, - title: title, - template: template, - flags: { img: this.data.token.randomImg ? this.data.img : this.data.token.img } - // img to be displayed next to the name on the test card - if it's a wildcard img, use the actor image - } - - // If the test is coming from a token sheet - if (this.token) { - cardOptions.speaker.alias = this.token.data.name; // Use the token name instead of the actor name - cardOptions.speaker.token = this.token.data._id; - cardOptions.speaker.scene = canvas.scene._id - cardOptions.flags.img = this.token.data.img; // Use the token image instead of the actor image - } - else // If a linked actor - use the currently selected token's data if the actor id matches - { - let speaker = ChatMessage.getSpeaker() - if (speaker.actor == this.data._id) { - cardOptions.speaker.alias = speaker.alias - cardOptions.speaker.token = speaker.token - cardOptions.speaker.scene = speaker.scene - cardOptions.flags.img = speaker.token ? canvas.tokens.get(speaker.token).data.img : cardOptions.flags.img - } - } - - return cardOptions - } - - /* --------------------------------------------------------------------------------------------------------- */ - /* --------------------------------------------- Roll Overides --------------------------------------------- */ - /* --------------------------------------------------------------------------------------------------------- */ - /** - * Roll overrides are specialized functions for different types of rolls. In each override, DiceWFRP is called - * to perform the test logic, which has its own specialized functions for different types of tests. For exapmle, - * weaponTest() calls DiceWFRP.rollWeaponTest(). Additionally, any post-roll logic that needs to be performed - * is done here. For example, Income tests use incomeTest, which determines how much money is made after the - * roll is completed. A normal Skill Test does not go through this process, instead using basicTest override, - * however both overrides just use the standard DiceWFRP.rollTest(). - * - /* --------------------------------------------------------------------------------------------------------- */ - - /** - * Default Roll override, the standard rolling method for general tests. - * - * basicTest is the default roll override (see DiceWFRP.setupDialog() for where it's assigned). This follows - * the basic steps. Call DiceWFRP.rollTest for standard test logic, send the result and display data to - * if(!options.suppressMessage) -DiceWFRP.renderRollCard() as well as handleOpposedTarget(). - * - * @param {Object} testData All the data needed to evaluate test results - see setupSkill/Characteristic - * @param {Object} cardOptions Data for the card display, title, template, etc. - * @param {Object} rerenderMessage The message to be updated (used if editing the chat card) - */ - async basicTest({ testData, cardOptions }, options = {}) { - testData = await game.wfrp4e.dice.rollDices(testData, cardOptions); - let result = game.wfrp4e.dice.rollTest(testData); - - result.postFunction = "basicTest"; - if (testData.extra) - foundry.utils.mergeObject(result, testData.extra); - - if (result.options.corruption) { - this.handleCorruptionResult(result); - } - if (result.options.mutate) { - this.handleMutationResult(result) - } - - if (result.options.extended) - { - this.handleExtendedTest(result) - } - - try { - let contextAudio = await game.wfrp4e.audio.MatchContextAudio(game.wfrp4e.audio.FindContext(result)) - cardOptions.sound = contextAudio.file || cardOptions.sound - } - catch - { } - Hooks.call("wfrp4e:rollTest", result, cardOptions) - - if (game.user.targets.size) { - cardOptions.title += ` - ${game.i18n.localize("Opposed")}`; - cardOptions.isOpposedTest = true - } - - if (!options.suppressMessage) - if (!options.suppressMessage) - game.wfrp4e.dice.renderRollCard(cardOptions, result, options.rerenderMessage).then(msg => { - game.wfrp4e.opposed.handleOpposedTarget(msg) // Send to handleOpposed to determine opposed status, if any. - }) - return {result, cardOptions}; - } - - /** - * incomeTest is used to add income calculation to Skill tests. - * - * Normal skill Tests just use basicTest() override, however, when testing Income, this override is used instead - * because it adds 'post processing' in the form of determining how much money was earned. See this.setupSkill() - * for how this override is assigned. - * - * @param {Object} testData All the data needed to evaluate test results - see setupSkill() - * @param {Object} cardOptions Data for the card display, title, template, etc. - * @param {Object} rerenderMessage The message to be updated (used if editing the chat card) - */ - async incomeTest({ testData, cardOptions }, options = {}) { - testData = await game.wfrp4e.dice.rollDices(testData, cardOptions); - let result = game.wfrp4e.dice.rollTest(testData); - result.postFunction = "incomeTest" - - Hooks.call("wfrp4e:rollIncomeTest", result, cardOptions) - - - if (game.user.targets.size) { - cardOptions.title += ` - ${game.i18n.localize("Opposed")}`, - cardOptions.isOpposedTest = true - } - - let status = testData.income.value.split(' ') - - let dieAmount = game.wfrp4e.config.earningValues[game.wfrp4e.utility.findKey(status[0], game.wfrp4e.config.statusTiers)][0] // b, s, or g maps to 2d10, 1d10, or 1 respectively (takes the first letter) - dieAmount = Number(dieAmount) * status[1]; // Multilpy that first letter by your standing (Brass 4 = 8d10 pennies) - let moneyEarned; - if (game.wfrp4e.utility.findKey(status[0], game.wfrp4e.config.statusTiers) != "g") // Don't roll for gold, just use standing value - { - dieAmount = dieAmount + "d10"; - moneyEarned = new Roll(dieAmount).roll().total; - } - else - moneyEarned = dieAmount; - - // After rolling, determined how much, if any, was actually earned - if (result.description.includes("Success")) { - result.incomeResult = game.i18n.localize("INCOME.YouEarn") + " " + moneyEarned; - switch (game.wfrp4e.utility.findKey(status[0], game.wfrp4e.config.statusTiers)) { - case "b": - result.incomeResult += ` ${game.i18n.localize("NAME.BPPlural").toLowerCase()}.` - break; - case "s": - result.incomeResult += ` ${game.i18n.localize("NAME.SSPlural").toLowerCase()}.` - break; - case "g": - if (moneyEarned > 1) - result.incomeResult += ` ${game.i18n.localize("NAME.GC").toLowerCase()}.` - else - result.incomeResult += ` ${game.i18n.localize("NAME.GCPlural").toLowerCase()}.` - break; - } - } - else if (Number(result.SL) > -6) { - moneyEarned /= 2; - result.incomeResult = game.i18n.localize("INCOME.YouEarn") + " " + moneyEarned; - switch (game.wfrp4e.utility.findKey(status[0], game.wfrp4e.config.statusTiers)) { - case "b": - result.incomeResult += ` ${game.i18n.localize("NAME.BPPlural").toLowerCase()}.` - break; - case "s": - result.incomeResult += ` ${game.i18n.localize("NAME.SSPlural").toLowerCase()}.` - break; - case "g": - if (moneyEarned > 1) - result.incomeResult += ` ${game.i18n.localize("NAME.GC").toLowerCase()}.` - else - result.incomeResult += ` ${game.i18n.localize("NAME.GCPlural").toLowerCase()}.` - break; - } - } - else { - result.incomeResult = game.i18n.localize("INCOME.Failure") - moneyEarned = 0; - } - // let contextAudio = await WFRP_Audio.MatchContextAudio(WFRP_Audio.FindContext(result)) - // cardOptions.sound = contextAudio.file || cardOptions.sound - result.moneyEarned = moneyEarned + game.wfrp4e.utility.findKey(status[0], game.wfrp4e.config.statusTiers); - if (!options.suppressMessage) - game.wfrp4e.dice.renderRollCard(cardOptions, result, options.rerenderMessage).then(msg => { - game.wfrp4e.opposed.handleOpposedTarget(msg) - }) - return {result, cardOptions}; - } - - /** - * weaponTest is used for weapon tests, see setupWeapon for how it's assigned. - * - * weaponTest doesn't add any special functionality, it's main purpose being to call - * DiceWFRP.rollWeaponTest() instead of the generic DiceWFRP.rollTest() - * - * @param {Object} testData All the data needed to evaluate test results - see setupWeapon() - * @param {Object} cardOptions Data for the card display, title, template, etc. - * @param {Object} rerenderMessage The message to be updated (used if editing the chat card) - */ - async weaponTest({ testData, cardOptions }, options = {}) { - if (game.user.targets.size) { - cardOptions.title += ` - ${game.i18n.localize("Opposed")}`, - cardOptions.isOpposedTest = true - } - testData = await game.wfrp4e.dice.rollDices(testData, cardOptions); - let result = game.wfrp4e.dice.rollWeaponTest(testData); - result.postFunction = "weaponTest"; - - // Reduce ammo if necessary - if (result.ammo && result.weapon.data.weaponGroup.value != game.i18n.localize("SPEC.Entangling").toLowerCase()) { - result.ammo.data.quantity.value--; - this.updateEmbeddedEntity("OwnedItem", { _id: result.ammo._id, "data.quantity.value": result.ammo.data.quantity.value }); - } - - try { - let contextAudio = await game.wfrp4e.audio.MatchContextAudio(game.wfrp4e.audio.FindContext(result)) - cardOptions.sound = contextAudio.file || cardOptions.sound - } - catch - { } - Hooks.call("wfrp4e:rollWeaponTest", result, cardOptions) - - - if (!options.suppressMessage) - game.wfrp4e.dice.renderRollCard(cardOptions, result, options.rerenderMessage).then(msg => { - game.wfrp4e.opposed.handleOpposedTarget(msg) // Send to handleOpposed to determine opposed status, if any. - }) - return {result, cardOptions}; - } - - /** - * castTest is used for casting tests, see setupCast for how it's assigned. - * - * The only special functionality castTest adds is reseting spell SL channelled back to 0, other than that, - * it's main purpose is to call DiceWFRP.rollCastTest() instead of the generic DiceWFRP.rollTest(). - * - * @param {Object} testData All the data needed to evaluate test results - see setupCast() - * @param {Object} cardOptions Data for the card display, title, template, etc. - * @param {Object} rerenderMessage The message to be updated (used if editing the chat card) - */ - async castTest({ testData, cardOptions }, options = {}) { - if (game.user.targets.size) { - cardOptions.title += ` - ${game.i18n.localize("Opposed")}`, - cardOptions.isOpposedTest = true - } - testData = await game.wfrp4e.dice.rollDices(testData, cardOptions); - let result = game.wfrp4e.dice.rollCastTest(testData); - result.postFunction = "castTest"; - - - // Find ingredient being used, if any - let ing = foundry.utils.duplicate(this.getEmbeddedEntity("OwnedItem", testData.extra.spell.data.currentIng.value)) - if (ing) { - // Decrease ingredient quantity - testData.extra.ingredient = true; - ing.data.quantity.value--; - this.updateEmbeddedEntity("OwnedItem", ing); - } - // If quantity of ingredient is 0, disregard the ingredient - else if (!ing || ing.data.data.quantity.value <= 0) - testData.extra.ingredient = false; - - try { - let contextAudio = await game.wfrp4e.audio.MatchContextAudio(game.wfrp4e.audio.FindContext(result)) - cardOptions.sound = contextAudio.file || cardOptions.sound - } - catch - { } - Hooks.call("wfrp4e:rollCastTest", result, cardOptions) - - - // Update spell to reflect SL from channelling resetting to 0 - game.wfrp4e.utility.getSpeaker(cardOptions.speaker).updateEmbeddedEntity("OwnedItem", { _id: testData.extra.spell._id, 'data.cn.SL': 0 }); - - - if (!options.suppressMessage) - game.wfrp4e.dice.renderRollCard(cardOptions, result, options.rerenderMessage).then(msg => { - game.wfrp4e.opposed.handleOpposedTarget(msg) // Send to handleOpposed to determine opposed status, if any. - }) - return {result, cardOptions}; - } - - /** - * channelTest is used for casting tests, see setupCast for how it's assigned. - * - * channellOveride doesn't add any special functionality, it's main purpose being to call - * DiceWFRP.rollChannellTest() instead of the generic DiceWFRP.rollTest() - * - * @param {Object} testData All the data needed to evaluate test results - see setupChannell() - * @param {Object} cardOptions Data for the card display, title, template, etc. - * @param {Object} rerenderMessage The message to be updated (used if editing the chat card) - */ - async channelTest({ testData, cardOptions }, options = {}) { - if (game.user.targets.size) { - cardOptions.title += ` - ${game.i18n.localize("Opposed")}`, - cardOptions.isOpposedTest = true - } - testData = await game.wfrp4e.dice.rollDices(testData, cardOptions); - let result = game.wfrp4e.dice.rollChannellTest(testData, game.wfrp4e.utility.getSpeaker(cardOptions.speaker)); - result.postFunction = "channelTest"; - - // Find ingredient being used, if any - let ing = foundry.utils.duplicate(this.getEmbeddedEntity("OwnedItem", testData.extra.spell.data.currentIng.value)) - if (ing) { - // Decrease ingredient quantity - testData.extra.ingredient = true; - ing.data.quantity.value--; - this.updateEmbeddedEntity("OwnedItem", ing); - } - // If quantity of ingredient is 0, disregard the ingredient - else if (!ing || ing.data.data.quantity.value <= 0) - testData.extra.ingredient = false; - - try { - let contextAudio = await game.wfrp4e.audio.MatchContextAudio(game.wfrp4e.audio.FindContext(result)) - cardOptions.sound = contextAudio.file || cardOptions.sound - } - catch - { } - Hooks.call("wfrp4e:rollChannelTest", result, cardOptions) - - if (!options.suppressMessage) - DiceWFRP.renderRollCard(cardOptions, result, options.rerenderMessage).then(msg => { - game.wfrp4e.opposed.handleOpposedTarget(msg) // Send to handleOpposed to determine opposed status, if any. - }) - return {result, cardOptions}; - } - - /** - * prayerTest is used for casting tests, see setupCast for how it's assigned. - * - * prayerTest doesn't add any special functionality, it's main purpose being to call - * DiceWFRP.rollPrayerTest() instead of the generic DiceWFRP.rollTest() - * - * @param {Object} testData All the data needed to evaluate test results - see setupPrayer() - * @param {Object} cardOptions Data for the card display, title, template, etc. - * @param {Object} rerenderMessage The message to be updated (used if editing the chat card) - */ - async prayerTest({ testData, cardOptions }, options = {}) { - if (game.user.targets.size) { - cardOptions.title += ` - ${game.i18n.localize("Opposed")}`, - cardOptions.isOpposedTest = true - } - testData = await game.wfrp4e.dice.rollDices(testData, cardOptions); - let result = game.wfrp4e.dice.rollPrayTest(testData, game.wfrp4e.utility.getSpeaker(cardOptions.speaker)); - result.postFunction = "prayerTest"; - - try { - let contextAudio = await game.wfrp4e.audio.MatchContextAudio(game.wfrp4e.audio.FindContext(result)) - cardOptions.sound = contextAudio.file || cardOptions.sound - } - catch - { } - Hooks.call("wfrp4e:rollPrayerTest", result, cardOptions) - - if (!options.suppressMessage) - game.wfrp4e.dice.renderRollCard(cardOptions, result, options.rerenderMessage).then(msg => { - game.wfrp4e.opposed.handleOpposedTarget(msg) // Send to handleOpposed to determine opposed status, if any. - }) - return {result, cardOptions}; - } - - /** - * traitTest is used for Trait tests, see setupTrait for how it's assigned. - * - * Since traitTest calls the generic DiceWFRP.rollTest(), which does not consider damage, - * some post processing must be done to calculate damage values. - * - * @param {Object} testData All the data needed to evaluate test results - see setupTrait() - * @param {Object} cardOptions Data for the card display, title, template, etc. - * @param {Object} rerenderMessage The message to be updated (used if editing the chat card) - */ - async traitTest({ testData, cardOptions }, options = {}) { - if (game.user.targets.size) { - cardOptions.title += ` - ${game.i18n.localize("Opposed")}`, - cardOptions.isOpposedTest = true - } - testData = await game.wfrp4e.dice.rollDices(testData, cardOptions); - let result = game.wfrp4e.dice.rollTest(testData); - result.postFunction = "traitTest"; - try { - // If the specification of a trait is a number, it's probably damage. (Animosity (Elves) - not a number specification: no damage) - if (!isNaN(testData.extra.trait.data.specification.value) || testData.extra.trait.data.rollable.rollCharacteristic == "ws" || testData.extra.trait.data.rollabble.rollCharacteristic == "bs") // (Bite 7 - is a number specification, do damage) - { - testData.extra.damage = Number(result.SL) // Start damage off with SL - testData.extra.damage += Number(testData.extra.trait.data.specification.value) || 0 - - if (testData.extra.trait.data.rollable.bonusCharacteristic) // Add the bonus characteristic (probably strength) - testData.extra.damage += Number(this.data.data.characteristics[testData.extra.trait.data.rollable.bonusCharacteristic].bonus) || 0; - } - } - catch (error) { - ui.notifications.error(game.i18n.localize("CHAT.DamageError") + " " + error) - } // If something went wrong calculating damage, do nothing and still render the card - - if (testData.extra) - foundry.utils.mergeObject(result, testData.extra); - - try { - let contextAudio = await game.wfrp4e.audio.MatchContextAudio(game.wfrp4e.audio.FindContext(result)) - cardOptions.sound = contextAudio.file || cardOptions.sound - } - catch - { } - Hooks.call("wfrp4e:rollTraitTest", result, cardOptions) - - if (!options.suppressMessage) - game.wfrp4e.dice.renderRollCard(cardOptions, result, options.rerenderMessage).then(msg => { - game.wfrp4e.opposed.handleOpposedTarget(msg) // Send to handleOpposed to determine opposed status, if any. - }) - return {result, cardOptions}; - } - - - /* --------------------------------------------------------------------------------------------------------- */ - /* --------------------------------- Preparation & Calculation Functions ----------------------------------- */ - /* --------------------------------------------------------------------------------------------------------- */ - /** - * Preparation function takes raw item data and processes it with actor data, typically using the calculate - * functions to do so. For example, A weapon passed into prepareWeaponCombat will turn the weapon's damage - * from "SB + 4" to the actual damage value by using the actor's strength bonus. See the specific functions - * below for more details on what exactly is processed. These functions are used when rolling a test - * (determining a weapon's base damage) or setting up the actor sheet to be displayed (displaying the damage - * in the combat tab). - * - /* --------------------------------------------------------------------------------------------------------- */ - - /** - * Prepares actor data for display and other features. - * - * prepare() is the principal function behind taking every aspect of an actor and processing them - * for display (getData() - see ActorSheetWfrp4e) and other needs. This is where all items (call to - * prepareItems()) are prepared and organized, then used to calculate different Actor features, - * such as the Size trait influencing wounds and token size, or how talents might affect damage. - * In many areas here, these talents/traits that affect some calculation are updated only if a - * difference is detected to avoid infinite loops, I would like an alternative but I'm not sure - * where to go instead. - * - * NOTE: THIS FUNCTION IS NOT TO BE CONFUSED WITH prepareData(). That function is called upon updating - * an actor. This function is called whenever the sheet is rendered. - */ - prepare() { - let preparedData = foundry.utils.duplicate(this.data) - // Call prepareItems first to organize and process OwnedItems - foundry.utils.mergeObject(preparedData, this.prepareItems()) - - // Add speciality functions for each Actor type - if (preparedData.type == "character") - this.prepareCharacter(preparedData) - - if (preparedData.type == "npc") - this.prepareNPC(preparedData) - - if (preparedData.type == "creature") - this.prepareCreature(preparedData) - - return preparedData; - } - - - /** - * Iterates through the Owned Items, processes them and organizes them into containers. - * - * This behemoth of a function goes through all Owned Items, separating them into individual arrays - * that the html templates use. Before adding them into the array, they are typically processed with - * the actor data, which can either be a large function itself (see prepareWeaponCombat) or not, such - * as career items which have minimal processing. These items, as well as some auxiliary data (e.g. - * encumbrance, AP) are bundled into an return object - * - */ - prepareItems() { - let actorData = foundry.utils.duplicate(this.data) - // These containers are for the various different tabs - const careers = []; - const basicSkills = []; - const advancedOrGroupedSkills = []; - const talents = []; - const traits = []; - const weapons = []; - const armour = []; - const injuries = []; - const grimoire = []; - const petty = []; - const blessings = []; - const miracles = []; - const psychology = []; - const mutations = []; - const diseases = []; - const criticals = []; - const extendedTests = []; - let penalties = { - [game.i18n.localize("Armour")]: { - value: "" - }, - [game.i18n.localize("Injury")]: { - value: "" - }, - [game.i18n.localize("Mutation")]: { - value: "" - }, - [game.i18n.localize("Criticals")]: { - value: "" - }, - }; - - const AP = { - head: { - value: 0, - layers: [], - label : game.i18n.localize("Head"), - show: true, - }, - body: { - value: 0, - layers: [], - label : game.i18n.localize("Body"), - show: true - }, - rArm: { - value: 0, - layers: [], - label : game.i18n.localize("Left Arm"), - show: true - }, - lArm: { - value: 0, - layers: [], - label : game.i18n.localize("Right Arm"), - show: true - }, - rLeg: { - value: 0, - layers: [], - label : game.i18n.localize("Right Leg"), - show: true - - }, - lLeg: { - value: 0, - layers: [], - label : game.i18n.localize("Left Leg"), - show: true - }, - shield: 0 - } - - for(let loc in AP) - { - if (loc == "shield") - continue - let row = game.wfrp4e.tables[actorData.data.details.hitLocationTable.value].rows.find(r => r.result == loc) - if (row) - AP[loc].label = game.i18n.localize(row.description) - else - AP[loc].show = false; - } - - - // Inventory object is for the Trappings tab - each sub object is for an individual inventory section - const inventory = { - weapons: { - label: game.i18n.localize("WFRP4E.TrappingType.Weapon"), // Label - what is displayed in the inventory section header - items: [], // Array of items in the section - toggle: true, // Is there a toggle in the section? (Equipped, worn, etc.) - toggleName: game.i18n.localize("Equipped"), // What is the name of the toggle in the header - show: false, // Should this section be shown (if an item exists in this list, it is set to true) - dataType: "weapon" // What type of FVTT Item is in this section (used by the + button to add an item of this type) - }, - armor: { - label: game.i18n.localize("WFRP4E.TrappingType.Armour"), - items: [], - toggle: true, - toggleName: game.i18n.localize("Worn"), - show: false, - dataType: "armour" - }, - ammunition: { - label: game.i18n.localize("WFRP4E.TrappingType.Ammunition"), - items: [], - show: false, - dataType: "ammunition" - }, - clothingAccessories: { - label: game.i18n.localize("WFRP4E.TrappingType.ClothingAccessories"), - items: [], - toggle: true, - toggleName: game.i18n.localize("Worn"), - show: false, - dataType: "trapping" - }, - booksAndDocuments: { - label: game.i18n.localize("WFRP4E.TrappingType.BooksDocuments"), - items: [], - show: false, - dataType: "trapping" - }, - toolsAndKits: { - label: game.i18n.localize("WFRP4E.TrappingType.ToolsKits"), - items: [], - show: false, - dataType: "trapping" - }, - foodAndDrink: { - label: game.i18n.localize("WFRP4E.TrappingType.FoodDrink"), - items: [], - show: false, - dataType: "trapping" - }, - drugsPoisonsHerbsDraughts: { - label: game.i18n.localize("WFRP4E.TrappingType.DrugsPoisonsHerbsDraughts"), - items: [], - show: false, - dataType: "trapping" - }, - misc: { - label: game.i18n.localize("WFRP4E.TrappingType.Misc"), - items: [], - show: true, - dataType: "trapping" - } - }; - - // Money and ingredients are not in inventory object because they need more customization - note in actor-inventory.html that they do not exist in the main inventory loop - const ingredients = { - label: game.i18n.localize("WFRP4E.TrappingType.Ingredient"), - items: [], - show: false, - dataType: "trapping" - }; - const money = { - coins: [], - total: 0, // Total coinage value - show: true - }; - const containers = { - items: [], - show: false - }; - const inContainers = []; // inContainers is the temporary storage for items within a container - - - let totalEnc = 0; // Total encumbrance of items - let hasSpells = false; // if the actor has atleast a single spell - used to display magic tab - let hasPrayers = false; // if the actor has atleast a single prayer - used to display religion tab - let showOffhand = true; // Show offhand checkboxes if no offhand equipped - let defensiveCounter = 0; // Counter for weapons with the defensive quality - - actorData.items = actorData.items.sort((a, b) => (a.sort || 0) - (b.sort || 0)) - - // Iterate through items, allocating to containers - // Items that need more intense processing are sent to a specialized function (see preparation functions below) - // Physical items are also placed into containers instead of the inventory object if their 'location' is not 0 - // A location of 0 means not in a container, otherwise, the location corresponds to the id of the container the item is in - for (let i of actorData.items) { - try { - i.img = i.img || DEFAULT_TOKEN; - - // *********** TALENTS *********** - if (i.type === "talent") { - this.prepareTalent(i, talents); - } - - // *********** Skills *********** - else if (i.type === "skill") { - this.prepareSkill(i); - if (i.data.grouped.value == "isSpec" || i.data.advanced.value == "adv") - advancedOrGroupedSkills.push(i) - else - basicSkills.push(i); - } - - // *********** Ammunition *********** - else if (i.type === "ammunition") { - i.encumbrance = (i.data.encumbrance.value * i.data.quantity.value).toFixed(2); - if (i.data.location.value == 0) { - inventory.ammunition.items.push(i); - inventory.ammunition.show = true - totalEnc += Number(i.encumbrance); - } - else { - inContainers.push(i); - } - } - - // *********** Weapons *********** - // Weapons are "processed" at the end for efficency - else if (i.type === "weapon") { - i.encumbrance = Math.floor(i.data.encumbrance.value * i.data.quantity.value); - if (i.data.location.value == 0) { - i.toggleValue = i.data.equipped || false; - inventory.weapons.items.push(i); - inventory.weapons.show = true; - totalEnc += i.encumbrance; - } - else { - inContainers.push(i); - } - } - - // *********** Armour *********** - // Armour is prepared only if it is worn, otherwise, it is just pushed to inventory and encumbrance is calculated - else if (i.type === "armour") { - i.encumbrance = Math.floor(i.data.encumbrance.value * i.data.quantity.value); - if (i.data.location.value == 0) { - i.toggleValue = i.data.worn.value || false; - if (i.data.worn.value) { - i.encumbrance = i.encumbrance - 1; - i.encumbrance = i.encumbrance < 0 ? 0 : i.encumbrance; - } - inventory.armor.items.push(i); - inventory.armor.show = true; - totalEnc += i.encumbrance; - } - else { - inContainers.push(i); - } - - if (i.data.worn.value) - armour.push(this.prepareArmorCombat(i, AP)); - - } - // *********** Injuries *********** - else if (i.type == "injury") { - injuries.push(i); - penalties[game.i18n.localize("Injury")].value += i.data.penalty.value; - } - - // *********** Criticals *********** - else if (i.type == "critical") { - criticals.push(i); - penalties[game.i18n.localize("Criticals")].value += i.data.modifier.value; - } - - // *********** Containers *********** - // Items within containers are organized at the end - else if (i.type === "container") { - i.encumbrance = i.data.encumbrance.value; - - if (i.data.location.value == 0) { - if (i.data.worn.value) { - i.encumbrance = i.encumbrance - 1; - i.encumbrance = i.encumbrance < 0 ? 0 : i.encumbrance; - } - totalEnc += i.encumbrance; - } - else { - inContainers.push(i); - } - containers.items.push(i); - containers.show = true; - } - - // *********** Trappings *********** - // Trappings have several sub-categories, most notably Ingredients - // The trappings tab does not have a "Trappings" section, but sections for each type of trapping instead - else if (i.type === "trapping") { - i.encumbrance = i.data.encumbrance.value * i.data.quantity.value; - if (i.data.location.value == 0) { - // Push ingredients to a speciality array for futher customization in the trappings tab - if (i.data.trappingType.value == "ingredient") { - ingredients.items.push(i) - } - // The trapping will fall into one of these if statements and set the array accordingly - else if (i.data.trappingType.value == "clothingAccessories") { - i.toggleValue = i.data.worn || false; - inventory[i.data.trappingType.value].items.push(i); - inventory[i.data.trappingType.value].show = true; - if (i.data.worn) { - i.encumbrance = i.encumbrance - 1; // Since some trappings are worn, they need special treatment - i.encumbrance = i.encumbrance < 0 ? 0 : i.encumbrance; // This if statement is specific to worn clothing Trappings - } - } - else if (i.data.trappingType.value == "tradeTools") { - inventory["toolsAndKits"].items.push(i) // I decided not to separate "Trade Tools" and "Tools and Kits" - inventory["toolsAndKits"].show = true; // Instead, merging them both into "Tools and Kits" - } - else if (i.data.trappingType.value) { - inventory[i.data.trappingType.value].items.push(i); // Generic - add anything else to their appropriate array - inventory[i.data.trappingType.value].show = true; - } - else { - inventory.misc.items.push(i); // If somehow it didn't fall into the other categories (it should) - inventory.misc.show = true; // Just push it to miscellaneous - } - totalEnc += i.encumbrance; - } - else { - inContainers.push(i); - } - } - - // *********** Spells *********** - // See this.prepareSpellOrPrayer() for how these items are processed - else if (i.type === "spell") { - hasSpells = true; - if (i.data.lore.value == "petty") - petty.push(this.prepareSpellOrPrayer(i)); - else - grimoire.push(this.prepareSpellOrPrayer(i)); - } - // *********** Prayers *********** - // See this.prepareSpellOrPrayer() for how these items are processed - else if (i.type === "prayer") { - hasPrayers = true; - if (i.data.type.value == "blessing") - blessings.push(this.prepareSpellOrPrayer(i)); - else - miracles.push(this.prepareSpellOrPrayer(i)); - } - - // *********** Careers *********** - else if (i.type === "career") { - careers.push(i); - } - - // *********** Trait *********** - // Display Traits as Trait-Name (Specification) - // Such as Animosity (Elves) - else if (i.type === "trait") { - if (i.data.specification.value) { - if (i.data.rollable.bonusCharacteristic) // Bonus characteristic adds to the specification (Weapon +X includes SB for example) - { - i.data.specification.value = parseInt(i.data.specification.value) || 0 - i.data.specification.value += actorData.data.characteristics[i.data.rollable.bonusCharacteristic].bonus; - } - i.name = i.name + " (" + i.data.specification.value + ")"; - } - traits.push(i); - } - - // *********** Psychologies *********** - else if (i.type === "psychology") { - psychology.push(i); - } - - // *********** Diseases *********** - // .roll is the roll result. If it doesn't exist, show the formula instead - else if (i.type === "disease") { - i.data.incubation.roll = i.data.incubation.roll || i.data.incubation.value; - i.data.duration.roll = i.data.duration.roll || i.data.duration.value; - diseases.push(i); - } - - // *********** Mutations *********** - // Some mutations have modifiers - see the penalties section below - else if (i.type === "mutation") { - mutations.push(i); - if (i.data.modifiesSkills.value) - penalties[game.i18n.localize("Mutation")].value += i.data.modifier.value; - } - - // *********** Money *********** - // Keep a running total of the coin value the actor has outside of containers - else if (i.type === "money") { - i.encumbrance = (i.data.encumbrance.value * i.data.quantity.value).toFixed(2); - if (i.data.location.value == 0) { - money.coins.push(i); - totalEnc += Number(i.encumbrance); - } - else { - inContainers.push(i); - } - money.total += i.data.quantity.value * i.data.coinValue.value; - } - - else if (i.type === "extendedTest") { - i.pct = 0; - if (i.data.SL.target > 0) - i.pct = i.data.SL.current / i.data.SL.target * 100 - if (i.pct > 100) - i.pct = 100 - if (i.pct < 0) - i.pct = 0; - - extendedTests.push(i); - } - } - catch (error) { - console.error("Something went wrong with preparing item " + i.name + ": " + error) - ui.notifications.error("Something went wrong with preparing item " + i.name + ": " + error) - // ui.notifications.error("Deleting " + i.name); - // this.deleteEmbeddedEntity("OwnedItem", i._id); - } - } // END ITEM SORTING - - // Prepare weapons for combat after items passthrough for efficiency - weapons need to know the ammo possessed, so instead of iterating through - // all items to find, iterate through the inventory.ammo array we just made - let totalShieldDamage = 0; // Used for damage tooltip - let eqpPoints = 0 // Weapon equipment value, only 2 one handed weapons or 1 two handed weapon - for (let wep of inventory.weapons.items) { - // We're only preparing equipped items here - this is for displaying weapons in the combat tab after all - if (wep.data.equipped) { - if (getProperty(wep, "data.offhand.value")) - showOffhand = false; // Don't show offhand checkboxes if a weapon is offhanded - // Process weapon taking into account actor data, skills, and ammo - weapons.push(this.prepareWeaponCombat(wep, inventory.ammo, basicSkills.concat(advancedOrGroupedSkills))); - // Add shield AP to AP object - let shieldProperty = wep.properties.qualities.find(q => q.toLowerCase().includes(game.i18n.localize("PROPERTY.Shield").toLowerCase())) - if (shieldProperty) { - let shieldDamage = wep.data.APdamage || 0; - AP.shield += (parseInt(shieldProperty.split(" ")[1]) - shieldDamage); - totalShieldDamage += shieldDamage; - } - // Keep a running total of defensive weapons equipped - if (wep.properties.qualities.find(q => q.toLowerCase().includes(game.i18n.localize("PROPERTY.Defensive").toLowerCase()))) { - defensiveCounter++; - } - eqpPoints += wep.data.twohanded.value ? 2 : 1 - } - } - - this.data.flags.eqpPoints = eqpPoints - - - // If you have no spells, just put all ingredients in the miscellaneous section, otherwise, setup the ingredients to be available - if (grimoire.length > 0 && ingredients.items.length > 0) { - ingredients.show = true; - // For each spell, set available ingredients to ingredients that have been assigned to that spell - for (let s of grimoire) - s.data.ingredients = ingredients.items.filter(i => i.data.spellIngredient.value == s._id && i.data.quantity.value > 0) - } - else - inventory.misc.items = inventory.misc.items.concat(ingredients.items); - - - - // ******************************** Container Setup *********************************** - - // containerMissing is an array of items whose container does not exist (needed for when a container is deleted) - var containerMissing = inContainers.filter(i => !containers.items.find(c => c._id == i.data.location.value)); - for (var itemNoContainer of containerMissing) // Reset all items without container references (items that were removed from a contanier) - itemNoContainer.data.location.value = 0; - - // If there were missing containers, reset the items that are orphaned - if (containerMissing.length) - this.updateEmbeddedEntity("OwnedItem", containerMissing) - - for (var cont of containers.items) // For each container - { - // All items referencing (inside) that container - var itemsInside = inContainers.filter(i => i.data.location.value == cont._id); - itemsInside.map(function (item) { // Add category of item to be displayed - if (item.type == "trapping") - item.type = game.wfrp4e.config.trappingCategories[item.data.trappingType.value]; - else - item.type = game.wfrp4e.config.trappingCategories[item.type]; - }) - cont["carrying"] = itemsInside.filter(i => i.type != "Container"); // cont.carrying -> items the container is carrying - cont["packsInside"] = itemsInside.filter(i => i.type == "Container"); // cont.packsInside -> containers the container is carrying - cont["holding"] = itemsInside.reduce(function (prev, cur) { // cont.holding -> total encumbrance the container is holding - return Number(prev) + Number(cur.encumbrance); - }, 0); - cont.holding = Math.floor(cont.holding) - } - - containers.items = containers.items.filter(c => c.data.location.value == 0); // Do not show containers inside other containers as top level (a location value of 0 means not inside a container) - - - // ******************************** Penalties Setup *********************************** - - // Penalties box setup - // If too much text, divide the penalties into groups - let penaltyOverflow = false; - penalties[game.i18n.localize("Armour")].value += this.calculateArmorPenalties(armour); - if ((penalties[game.i18n.localize("Armour")].value + penalties[game.i18n.localize("Mutation")].value + penalties[game.i18n.localize("Injury")].value + penalties[game.i18n.localize("Criticals")].value).length > 50) // ~50 characters is when the text box overflows - { // When that happens, break it up into categories - penaltyOverflow = true; - for (let penaltyType in penalties) { - if (penalties[penaltyType].value) - penalties[penaltyType].show = true; - else - penalties[penaltyType].show = false; // Don't show categories without any penalties - } - } - - // Penalties flag is teh string that shows when the actor's turn in combat starts - let penaltiesFlag = penalties[game.i18n.localize("Armour")].value + " " + penalties[game.i18n.localize("Mutation")].value + " " + penalties[game.i18n.localize("Injury")].value + " " + penalties[game.i18n.localize("Criticals")].value + " " + this.data.data.status.penalties.value - penaltiesFlag = penaltiesFlag.trim(); - - // This is for the penalty string in flags, for combat turn message - if (this.data.flags.modifier != penaltiesFlag) - this.update({ "flags.modifier": penaltiesFlag }) - - // Add armor trait to AP object - let armorTrait = traits.find(t => t.name.toLowerCase().includes(game.i18n.localize("NAME.Armour").toLowerCase())) - if (armorTrait && (!this.data.data.excludedTraits || !this.data.data.excludedTraits.includes(armorTrait._id))) { - for (let loc in AP) { - try { - let traitDamage = 0; - if (armorTrait.APdamage) - traitDamage = armorTrait.APdamage[loc] || 0; - if (loc != "shield") - AP[loc].value += (parseInt(armorTrait.data.specification.value) || 0) - traitDamage; - } - catch {//ignore armor traits with invalid values - } - } - } - - // keep defensive counter in flags to use for test auto fill (see setupWeapon()) - this.data.flags.defensive = defensiveCounter; - - // Encumbrance is initially calculated in prepareItems() - this area augments it based on talents - if (actorData.flags.autoCalcEnc) { - let strongBackTalent = talents.find(t => t.name.toLowerCase() == game.i18n.localize("NAME.StrongBack").toLowerCase()) - let sturdyTalent = talents.find(t => t.name.toLowerCase() == game.i18n.localize("NAME.Sturdy").toLowerCase()) - - if (strongBackTalent) - actorData.data.status.encumbrance.max += strongBackTalent.data.advances.value; - if (sturdyTalent) - actorData.data.status.encumbrance.max += sturdyTalent.data.advances.value * 2; - } - - - // enc used for encumbrance bar in trappings tab - let enc; - totalEnc = Math.floor(totalEnc); - enc = { - max: actorData.data.status.encumbrance.max, - value: Math.round(totalEnc * 10) / 10, - }; - // percentage of the bar filled - enc.pct = Math.min(enc.value * 100 / enc.max, 100); - enc.state = enc.value / enc.max; // state is how many times over you are max encumbrance - if (enc.state > 3) { - enc["maxEncumbered"] = true - enc.penalty = game.wfrp4e.config.encumbrancePenalties["maxEncumbered"]; - } - else if (enc.state > 2) { - enc["veryEncumbered"] = true - enc.penalty = game.wfrp4e.config.encumbrancePenalties["veryEncumbered"]; - } - else if (enc.state > 1) { - enc["encumbered"] = true - enc.penalty = game.wfrp4e.config.encumbrancePenalties["encumbered"]; - } - else - enc["notEncumbered"] = true; - - // Return all processed objects - return { - inventory, - containers, - basicSkills: basicSkills.sort(game.wfrp4e.utility.nameSorter), - advancedOrGroupedSkills: advancedOrGroupedSkills.sort(game.wfrp4e.utility.nameSorter), - talents, - traits, - weapons, - diseases, - mutations, - armour, - penalties, - penaltyOverflow, - AP, - injuries, - grimoire, - petty, - careers: careers.reverse(), - blessings, - miracles, - money, - psychology, - criticals, - criticalCount: criticals.length, - encumbrance: enc, - ingredients, - totalShieldDamage, - extendedTests, - hasSpells, - hasPrayers, - showOffhand - } - } - - /** - * Prepares a skill Item. - * - * Preparation of a skill is simply determining the `total` value, which is the base characteristic + advances. - * - * @param {Object} skill 'skill' type Item - * @return {Object} skill Processed skill, with total value calculated - */ - prepareSkill(skill) { - let actorData = this.data - skill.data.characteristic.num = actorData.data.characteristics[skill.data.characteristic.value].value; - if (skill.data.modifier) - { - if (skill.data.modifier.value > 0) - skill.modified = "positive"; - else if (skill.data.modifier.value < 0) - skill.modified = "negative" - } - skill.data.characteristic.abrev = game.wfrp4e.config.characteristicsAbbrev[skill.data.characteristic.value]; - skill.data.cost = game.wfrp4e.utility._calculateAdvCost(skill.data.advances.value, "skill", skill.data.advances.costModifier) - return skill - } - - /** - * - * Prepares a talent Item. - * - * Prepares a talent with actor data and other talents. Two different ways to prepare a talent: - * - * 1. If a talent with the same name is already prepared, don't prepare this talent and instead - * add to the advancements of the existing talent. - * - * 2. If the talent does not exist yet, turn its "Max" value into "numMax", in other words, turn - * "Max: Initiative Bonus" into an actual number value. - * - * @param {Object} talent 'talent' type Item. - * @param {Array} talentList List of talents prepared so far. Prepared talent is pushed here instead of returning. - */ - prepareTalent(talent, talentList) { - let actorData = this.data - - // Find an existing prepared talent with the same name - let existingTalent = talentList.find(t => t.name == talent.name) - if (existingTalent) // If it exists - { - if (!existingTalent.numMax) // If for some reason, it does not have a numMax, assign it one - talent["numMax"] = actorData.data.characteristics[talent.data.max.value].bonus; - // Add an advancement to the existing talent - existingTalent.data.advances.value++; - existingTalent.cost = (existingTalent.data.advances.value + 1) * 100 - } - else // If a talent of the same name does not exist - { - switch (talent.data.max.value) // Turn its max value into "numMax", which is an actual numeric value - { - case '1': - talent["numMax"] = 1; - break; - - case '2': - talent["numMax"] = 2; - break; - - case 'none': - talent["numMax"] = "-"; - break; - - default: - talent["numMax"] = actorData.data.characteristics[talent.data.max.value].bonus; - } - talent.cost = 200; - talentList.push(talent); // Add the prepared talent to the talent list - } - } - - /** - * Prepares a weapon Item. - * - * Prepares a weapon using actor data, ammunition, properties, and flags. The weapon's raw - * data is turned into more user friendly / meaningful data with either config values or - * calculations. Also turns all qualities/flaws into a more structured object. - * - * @param {Object} weapon 'weapon' type Item - * @param {Array} ammoList array of 'ammo' type Items - * @param {Array} skills array of 'skill' type Items - * - * @return {Object} weapon processed weapon - */ - prepareWeaponCombat(weapon, ammoList, skills) { - let actorData = this.data - - if (!skills) // If a skill list isn't provided, filter all items to find skills - skills = actorData.items.filter(i => i.type == "skill"); - - weapon.attackType = game.wfrp4e.config.groupToType[weapon.data.weaponGroup.value] - weapon.data.reach.value = game.wfrp4e.config.weaponReaches[weapon.data.reach.value]; - weapon.data.weaponGroup.value = game.wfrp4e.config.weaponGroups[weapon.data.weaponGroup.value] || "basic"; - - // Attach the available skills to use to the weapon. - weapon.skillToUse = skills.find(x => x.name.toLowerCase().includes(`(${weapon.data.weaponGroup.value.toLowerCase()})`)) - - // prepareQualitiesFlaws turns the comma separated qualities/flaws string into a string array - // Does not include qualities if no skill could be found above - weapon["properties"] = game.wfrp4e.utility._prepareQualitiesFlaws(weapon, !!weapon.skillToUse); - - // Special flail rule - if no skill could be found, add the Dangerous property - if (weapon.data.weaponGroup.value == game.i18n.localize("SPEC.Flail") && !weapon.skillToUse && !weapon.properties.includes(game.i18n.localize("PROPERTY.Dangerous"))) - weapon.properties.push(game.i18n.localize("PROPERTY.Dangerous")); - - // Turn range into a numeric value (important for ranges including SB, see the function for details) - weapon.data.range.value = this.calculateRangeOrDamage(weapon.data.range.value); - - // Melee Damage calculation - if (weapon.attackType == "melee") { - weapon["meleeWeaponType"] = true; - // Turn melee damage formula into a numeric value (SB + 4 into a number) Melee damage increase flag comes from Strike Mighty Blow talent - weapon.data.damage.value = this.calculateRangeOrDamage(weapon.data.damage.value) + (actorData.flags.meleeDamageIncrease || 0); - - // Very poor wording, but if the weapon has suffered damage (weaponDamage), subtract that amount from meleeValue (melee damage the weapon deals) - if (weapon.data.weaponDamage) - weapon.data.damage.value -= weapon.data.weaponDamage - else - weapon.data["weaponDamage"] = 0; - } - // Ranged Damage calculation - else { - weapon["rangedWeaponType"] = true; - - // Turn ranged damage formula into numeric value, same as melee Ranged damage increase flag comes from Accurate Shot - weapon.data.damage.value = this.calculateRangeOrDamage(weapon.data.damage.value) + (actorData.flags.rangedDamageIncrease || 0) - // Very poor wording, but if the weapon has suffered damage (weaponDamage), subtract that amount from rangedValue (ranged damage the weapon deals) - if (weapon.data.weaponDamage) - weapon.data.damage.value -= weapon.data.weaponDamage - else - weapon.data["weaponDamage"] = 0; - } - - // If the weapon uses ammo... - if (weapon.data.ammunitionGroup.value != "none") { - weapon["ammo"] = []; - // If a list of ammo has been provided, filter it by ammo that is compatible with the weapon type - if (ammoList) { - weapon.ammo = ammoList.filter(a => a.data.ammunitionType.value == weapon.data.ammunitionGroup.value) - } - else // If no ammo has been provided, filter through all items and find ammo that is compaptible - for (let a of actorData.items) - if (a.type == "ammunition" && a.data.ammunitionType.value == weapon.data.ammunitionGroup.value) // If is ammo and the correct type of ammo - weapon.ammo.push(a); - - // Send to prepareWeaponWithAmmo for further calculation (Damage/range modifications based on ammo) - this.prepareWeaponWithAmmo(weapon); - } - // If throwing or explosive weapon, its ammo is its own quantity - else if (weapon.data.weaponGroup.value == game.i18n.localize("SPEC.Throwing") || weapon.data.weaponGroup.value == game.i18n.localize("SPEC.Explosives")) { - weapon.data.ammunitionGroup.value = ""; - } - // If entangling, it has no ammo - else if (weapon.data.weaponGroup.value == game.i18n.localize("SPEC.Entangling")) { - weapon.data.ammunitionGroup.value = ""; - } - // Separate qualities and flaws into their own arrays: weapon.properties.qualities/flaws - weapon.properties = game.wfrp4e.utility._separateQualitiesFlaws(weapon.properties); - - if (weapon.properties.spec) - { - for(let prop of weapon.properties.spec) - { - let spec - if (prop == game.i18n.localize("Special")) - weapon.properties.special = weapon.data.special.value; - if (prop == game.i18n.localize("Special Ammo")) - weapon.properties.specialammo = weapon.ammo.find(a => a._id == weapon.data.currentAmmo.value).data.special.value - } - - } - return weapon; - } - - /** - * Prepares an armour Item. - * - * Takes a an armour item, along with a persistent AP object to process the armour - * into a useable format. Adding AP values and qualities to the AP object to be used - * in display and opposed tests. - * - * @param {Object} armor 'armour' type item - * @param {Object} AP Object consisting of numeric AP value for each location and a layer array to represent each armour layer - * @return {Object} armor processed armor item - */ - prepareArmorCombat(armor, AP) { - // Turn comma separated qualites/flaws into a more structured 'properties.qualities/flaws` string array - armor.properties = game.wfrp4e.utility._separateQualitiesFlaws(game.wfrp4e.utility._prepareQualitiesFlaws(armor)); - - // Iterate through armor locations covered - for (let apLoc in armor.data.currentAP) { - // -1 is what all newly created armor's currentAP is initialized to, so if -1: currentAP = maxAP (undamaged) - if (armor.data.currentAP[apLoc] == -1) { - armor.data.currentAP[apLoc] = armor.data.maxAP[apLoc]; - } - } - // If the armor protects a certain location, add the AP value of the armor to the AP object's location value - // Then pass it to addLayer to parse out important information about the armor layer, namely qualities/flaws - if (armor.data.maxAP.head > 0) { - armor["protectsHead"] = true; - AP.head.value += armor.data.currentAP.head; - game.wfrp4e.utility.addLayer(AP, armor, "head") - } - if (armor.data.maxAP.body > 0) { - armor["protectsBody"] = true; - AP.body.value += armor.data.currentAP.body; - game.wfrp4e.utility.addLayer(AP, armor, "body") - } - if (armor.data.maxAP.lArm > 0) { - armor["protectslArm"] = true; - AP.lArm.value += armor.data.currentAP.lArm; - game.wfrp4e.utility.addLayer(AP, armor, "lArm") - } - if (armor.data.maxAP.rArm > 0) { - armor["protectsrArm"] = true; - AP.rArm.value += armor.data.currentAP.rArm; - game.wfrp4e.utility.addLayer(AP, armor, "rArm") - } - if (armor.data.maxAP.lLeg > 0) { - armor["protectslLeg"] = true; - AP.lLeg.value += armor.data.currentAP.lLeg; - game.wfrp4e.utility.addLayer(AP, armor, "lLeg") - } - if (armor.data.maxAP.rLeg > 0) { - armor["protectsrLeg"] = true - AP.rLeg.value += armor.data.currentAP.rLeg; - game.wfrp4e.utility.addLayer(AP, armor, "rLeg") - } - return armor; - } - - - /** - * Augments a prepared weapon based on its equipped ammo. - * - * Ammo can provide bonuses or penalties to the weapon using it, this function - * takes a weapon, finds its current ammo, and applies those modifiers to the - * weapon stats. For instance, if ammo that halves weapon range is equipped, - * this is where it modifies the range of the weapon - * - * @param {Object} weapon A *prepared* weapon item - * @return {Object} weapon Augmented weapon item - */ - prepareWeaponWithAmmo(weapon) { - // Find the current ammo equipped to the weapon, if none, return - let ammo = weapon.ammo.find(a => a._id == weapon.data.currentAmmo.value); - if (!ammo) - return; - - let ammoProperties = game.wfrp4e.utility._prepareQualitiesFlaws(ammo); - // If ammo properties include a "special" value, rename the property as "Special Ammo" to not overlap - // with the weapon's "Special" property - let specialPropInd = ammoProperties.indexOf(ammoProperties.find(p => p && p.toLowerCase() == game.i18n.localize("Special").toLowerCase())); - if (specialPropInd != -1) - ammoProperties[specialPropInd] = game.i18n.localize("Special Ammo") - - let ammoRange = ammo.data.range.value || "0"; - let ammoDamage = ammo.data.damage.value || "0"; - - // If range modification was handwritten, process it - if (ammoRange.toLowerCase() == "as weapon") { } - // Do nothing to weapon's range - else if (ammoRange.toLowerCase() == "half weapon") - weapon.data.range.value /= 2; - else if (ammoRange.toLowerCase() == "third weapon") - weapon.data.range.value /= 3; - else if (ammoRange.toLowerCase() == "quarter weapon") - weapon.data.range.value /= 4; - else if (ammoRange.toLowerCase() == "twice weapon") - weapon.data.range.value *= 2; - else // If the range modification is a formula (supports +X -X /X *X) - { - try // Works for + and - - { - ammoRange = eval(ammoRange); - weapon.data.range.value = Math.floor(eval(weapon.data.range.value + ammoRange)); - } - catch // if *X and /X - { // eval (50 + "/5") = eval(50/5) = 10 - weapon.data.range.value = Math.floor(eval(weapon.data.range.value + ammoRange)); - } - } - - try // Works for + and - - { - ammoDamage = eval(ammoDamage); - weapon.data.damage.value = Math.floor(eval(weapon.data.damage.value + ammoDamage)); - } - catch // if *X and /X - { // eval (5 + "*2") = eval(5*2) = 10 - weapon.data.damage.value = Math.floor(eval(weapon.data.damage.value + ammoDamage)); // Eval throws exception for "/2" for example. - } - - // The following code finds qualities or flaws of the ammo that add to the weapon's qualities - // Example: Blast +1 should turn a weapon's Blast 4 into Blast 5 - ammoProperties = ammoProperties.filter(p => p != undefined); - let propertyChange = ammoProperties.filter(p => p.includes("+") || p.includes("-")); // Properties that increase or decrease another (Blast +1, Blast -1) - - // Normal properties (Impale, Penetrating) from ammo that need to be added to the equipped weapon - let propertiesToAdd = ammoProperties.filter(p => !(p.includes("+") || p.includes("-"))); - - - for (let change of propertyChange) { - // Using the example of "Blast +1" to a weapon with "Blast 3" - let index = change.indexOf(" "); - let property = change.substring(0, index).trim(); // "Blast" - let value = change.substring(index, change.length); // "+1" - - if (weapon.properties.find(p => p.includes(property))) // Find the "Blast" quality in the main weapon - { - let basePropertyIndex = weapon.properties.findIndex(p => p.includes(property)) - let baseValue = weapon.properties[basePropertyIndex].split(" ")[1]; // Find the Blast value of the weapon (3) - let newValue = eval(baseValue + value) // Assign the new value of Blast 4 - - weapon.properties[basePropertyIndex] = `${property} ${newValue}`; // Replace old Blast - } - else // If the weapon does not have the Blast quality to begin with - { - propertiesToAdd.push(property + " " + Number(value)); // Add blast as a new quality (Blast 1) - } - } - // Add the new Blast property to the rest of the qualities the ammo adds to the weapon - weapon.properties = weapon.properties.concat(propertiesToAdd); - } - - /** - * Prepares a 'spell' or 'prayer' Item type. - * - * Calculates many aspects of spells/prayers defined by characteristics - range, duration, damage, aoe, etc. - * See the calculation function used for specific on how it processes these attributes. - * - * @param {Object} item 'spell' or 'prayer' Item - * @return {Object} item Processed spell/prayer - */ - prepareSpellOrPrayer(item) { - // Turns targets and duration into a number - (e.g. Willpower Bonus allies -> 4 allies, Willpower Bonus Rounds -> 4 rounds, Willpower Yards -> 46 yards) - item['target'] = this.calculateSpellAttributes(item.data.target.value, item.data.target.aoe); - item['duration'] = this.calculateSpellAttributes(item.data.duration.value); - item['range'] = this.calculateSpellAttributes(item.data.range.value); - - item.overcasts = { - available: 0, - range: undefined, - duration: undefined, - target: undefined, - } - - if (parseInt(item.target)) { - item.overcasts.target = { - label: "Target", - count: 0, - AoE: false, - initial: parseInt(item.target) || item.target, - current: parseInt(item.target) || item.target, - unit: "" - } - } - else if (item.target.includes("AoE")) { - let aoeValue = item.target.substring(item.target.indexOf("(") + 1, item.target.length - 1) - item.overcasts.target = { - label: "AoE", - count: 0, - AoE: true, - initial: parseInt(aoeValue) || aoeValue, - current: parseInt(aoeValue) || aoeValue, - unit: aoeValue.split(" ")[1] - } - } - if (parseInt(item.duration)) { - item.overcasts.duration = { - label: "Duration", - count: 0, - initial: parseInt(item.duration) || item.duration, - current: parseInt(item.duration) || item.duration, - unit: item.duration.split(" ")[1] - } - } - if (parseInt(item.range)) { - item.overcasts.range = { - label: "Range", - count: 0, - initial: parseInt(item.range) || aoeValue, - current: parseInt(item.range) || aoeValue, - unit: item.range.split(" ")[1] - } - } - - // Add the + to the duration if it's extendable - if (item.data.duration.extendable) - item.duration += "+"; - - // Calculate the damage different if it's a Magic Misile spell versus a prayer - if (item.type == "spell") - item['damage'] = this.calculateSpellDamage(item.data.damage.value, item.data.magicMissile.value); - else - item['damage'] = this.calculateSpellDamage(item.data.damage.value, false); - - // If it's a spell, augment the description (see _spellDescription() and CN based on memorization) - if (item.type == "spell") { - item.data.description.value = game.wfrp4e.utility._spellDescription(item); - if (!item.data.memorized.value) - item.data.cn.value *= 2; - } - - return item; - } - - - /** - * Turns a formula into a processed string for display - * - * Turns a spell attribute such as "Willpower Bonus Rounds" into a more user friendly, processed value - * such as "4 Rounds". If the aoe is checked, it wraps the result in AoE (Result). - * - * @param {String} formula Formula to process - "Willpower Bonus Rounds" - * @param {boolean} aoe Whether or not it's calculating AoE (changes string return) - * @returns {String} formula processed formula - */ - calculateSpellAttributes(formula, aoe=false) - { - console.log("Compute FR") - let actorData = this.data - formula = formula.toLowerCase(); - - // Do not process these special values - if (formula != game.i18n.localize("You").toLowerCase() && formula != game.i18n.localize("Special").toLowerCase() && formula != game.i18n.localize("Instant").toLowerCase()) - { - // Specific case, to avoid wrong matching with "Force" - if (formula.includes("force mentale")) - { - // Determine if it's looking for the bonus or the value - if (formula.includes('bonus')) { - formula = formula.replace( "bonus de force mentale", actorData.data.characteristics["wp"].bonus); - formula = formula.replace( "force mentale bonus", actorData.data.characteristics["wp"].bonus); - } - else - formula = formula.replace("force mentale", actorData.data.characteristics["wp"].value); - } - if (formula.includes("yard") ) - formula = formula.replace('yard', "mètre" ); - if (formula.includes("yds") ) - formula = formula.replace('yds', "m." ); - // Iterate through remaining characteristics - for(let ch in actorData.data.characteristics) - { - // If formula includes characteristic name - //console.log("Testing :", ch, WFRP4E.characteristics[ch].toLowerCase()); - if (formula.includes(game.wfrp4e.config.characteristics[ch].toLowerCase())) - { - // Determine if it's looking for the bonus or the value - if (formula.includes('bonus')) { - formula = formula.replace("bonus de " + game.wfrp4e.config.characteristics[ch].toLowerCase(), actorData.data.characteristics[ch].bonus); - formula = formula.replace(game.wfrp4e.config.characteristics[ch].toLowerCase() + " bonus", actorData.data.characteristics[ch].bonus); - } - else - formula = formula.replace(game.wfrp4e.config.characteristics[ch].toLowerCase(), actorData.data.characteristics[ch].value); - } - } - } - - // If AoE - wrap with AoE ( ) - if (aoe) - formula = "AoE (" + formula.capitalize() + ")"; - - //console.log("calculateSpellAttributes -> " + formula ); - return formula.capitalize(); - } - - /** - * Turns a formula into a processed string for display - * - * Processes damage formula based - same as calculateSpellAttributes, but with additional - * consideration to whether its a magic missile or not - * - * @param {String} formula Formula to process - "Willpower Bonus + 4" - * @param {boolean} isMagicMissile Whether or not it's a magic missile - used in calculating additional damage - * @returns {String} Processed formula - */ - calculateSpellDamage(formula, isMagicMissile) - { - console.log("Compute FR") - let actorData = this.data - formula = formula.toLowerCase(); - - if (isMagicMissile) // If it's a magic missile, damage includes willpower bonus - { - formula += "+ " + actorData.data.characteristics["wp"].bonus - } - - // Specific case, to avoid wrong matching with "Force" - if (formula.includes("force mentale")) - { - // Determine if it's looking for the bonus or the value - if (formula.includes('bonus')) { - formula = formula.replace( "bonus de force mentale", actorData.data.characteristics["wp"].bonus); - formula = formula.replace( "force mentale bonus", actorData.data.characteristics["wp"].bonus); - } else - formula = formula.replace("force mentale", actorData.data.characteristics["wp"].value); - } - - // Iterate through characteristics - for(let ch in actorData.data.characteristics) - { - // If formula includes characteristic name - while (formula.includes(actorData.data.characteristics[ch].label.toLowerCase())) - { - // Determine if it's looking for the bonus or the value - if (formula.includes('bonus')) { - formula = formula.replace("bonus de " + game.wfrp4e.config.characteristics[ch].toLowerCase(), actorData.data.characteristics[ch].bonus); - formula = formula.replace(game.wfrp4e.config.characteristics[ch].toLowerCase() + " bonus", actorData.data.characteristics[ch].bonus); - } - else - formula = formula.replace(game.wfrp4e.config.characteristics[ch].toLowerCase(), actorData.data.characteristics[ch].value); - } - } - - //console.log("calculateSpellDamage -> " + formula ); - return eval(formula); - } - - /** - * Construct armor penalty string based on armors equipped. - * - * For each armor, compile penalties and concatenate them into one string. - * Does not stack armor *type* penalties. - * - * @param {Array} armorList array of processed armor items - * @return {string} Penalty string - */ - calculateArmorPenalties(armorList) { - let armorPenaltiesString = ""; - - // Armor type penalties do not stack, only apply if you wear any of that type - let wearingMail = false; - let wearingPlate = false; - - for (let a of armorList) { - // For each armor, apply its specific penalty value, as well as marking down whether - // it qualifies for armor type penalties (wearingMail/Plate) - armorPenaltiesString += a.data.penalty.value + " "; - if (a.data.armorType.value == "mail") - wearingMail = true; - if (a.data.armorType.value == "plate") - wearingPlate = true; - } - - // Apply armor type penalties at the end - if (wearingMail || wearingPlate) { - let stealthPenaltyValue = 0; - if (wearingMail) - stealthPenaltyValue += -10; - if (wearingPlate) - stealthPenaltyValue += -10; - // Add the penalties together to reduce redundancy - armorPenaltiesString += (stealthPenaltyValue + ` ${game.i18n.localize("NAME.Stealth")}`); - } - return armorPenaltiesString; - } - - /** - * Calculates a weapon's range or damage formula. - * - * Takes a weapon formula for Damage or Range (SB + 4 or SBx3) and converts to a numeric value. - * - * @param {String} formula formula to be processed (SBx3 => 9). - * - * @return {Number} Numeric formula evaluation - */ - calculateRangeOrDamage(formula) - { - console.log("FR function calculateRangeOrDamage !", formula); - let actorData = this.data - try - { - formula = formula.toLowerCase(); - // Iterate through characteristics - for(let ch in actorData.data.characteristics) - { - // Determine if the formula includes the characteristic's abbreviation + B (SB, WPB, etc.) - if (formula.includes(ch.concat('b'))) - { - // Replace that abbreviation with the Bonus value - formula = formula.replace(ch.concat('b'), actorData.data.characteristics[ch].bonus.toString()); - } - } - if (formula.includes("yard") ) - formula = formula.replace('yard', "mètre" ); - if (formula.includes("yds") ) - formula = formula.replace('yds', "m." ); - // To evaluate multiplication, replace x with * - formula = formula.replace('x', '*'); - - return eval(formula); - } - catch - { - return formula - } - } - - /** - * Adds all missing basic skills to the Actor. - * - * This function will add all mising basic skills, used when an Actor is created (see create()) - * as well as from the right click menu from the Actor directory. - * - */ - async addBasicSkills() { - let allItems = foundry.utils.duplicate(this.data.items) - let ownedBasicSkills = allItems.filter(i => i.type == "skill" && i.data.advanced.value == "bsc"); - let allBasicSkills = await game.wfrp4e.utility.allBasicSkills() - - // Filter allBasicSkills with ownedBasicSkills, resulting in all the missing skills - let skillsToAdd = allBasicSkills.filter(s => !ownedBasicSkills.find(ownedSkill => ownedSkill.name == s.name)) - - // Add those missing basic skills - this.createEmbeddedEntity("OwnedItem", skillsToAdd); - } - - /** - * Calculates the wounds of an actor based on prepared items - * - * Once all the item preparation is done (prepareItems()), we have a list of traits/talents to use that will - * factor into Wonuds calculation. Namely: Hardy and Size traits. If we find these, they must be considered - * in Wound calculation. - * - * @returns {Number} Max wound value calculated - */ - _calculateWounds() { - let hardies = this.data.items.filter(t => (t.type == "trait" || t.type == "talent") && t.name.toLowerCase().includes(game.i18n.localize("NAME.Hardy").toLowerCase())) - let traits = this.data.items.filter(t => t.type == "trait") - - let tbMultiplier = hardies.length - - tbMultiplier += hardies.filter(h => h.type == "talent").reduce((extra, talent) => extra + talent.data.advances.value - 1, 0) // Add extra advances if some of the talents had multiple advances (rare, usually there are multiple talent items, not advances) - - - // Easy to reference bonuses - let sb = this.data.data.characteristics.s.bonus; - let tb = this.data.data.characteristics.t.bonus; - let wpb = this.data.data.characteristics.wp.bonus; - - if (this.data.flags.autoCalcCritW) - this.data.data.status.criticalWounds.max = tb; - - let wounds = this.data.data.status.wounds.max; - - if (this.data.flags.autoCalcWounds) { - // Construct trait means you use SB instead of WPB - if (traits.find(t => t.name.toLowerCase().includes(game.i18n.localize("NAME.Construct").toLowerCase()) || traits.find(t => t.name.toLowerCase().includes(game.i18n.localize("NAME.Mindless").toLowerCase())))) - wpb = sb; - switch (this.data.data.details.size.value) // Use the size to get the correct formula (size determined in prepare()) - { - case "tiny": - wounds = 1 + tb * tbMultiplier; - break; - - case "ltl": - wounds = tb + tb * tbMultiplier; - break; - - case "sml": - wounds = 2 * tb + wpb + tb * tbMultiplier; - break; - - case "avg": - wounds = sb + 2 * tb + wpb + tb * tbMultiplier; - break; - - case "lrg": - wounds = 2 * (sb + 2 * tb + wpb + tb * tbMultiplier); - break; - - case "enor": - wounds = 4 * (sb + 2 * tb + wpb + tb * tbMultiplier); - break; - - case "mnst": - wounds = 8 * (sb + 2 * tb + wpb + tb * tbMultiplier); - break; - } - } - - let swarmTrait = traits.find(t => t.name.toLowerCase().includes(game.i18n.localize("NAME.Swarm").toLowerCase())) - if (swarmTrait) - wounds *= 5; - - - return wounds - } - - /** - * Apply damage to an actor, taking into account armor, size, and weapons. - * - * applyDamage() is typically called at the end of an oppposed tests, where you can - * right click the chat message and apply damage. This function goes through the - * process of calculating and reducing damage if needede based on armor, toughness, - * size, armor qualities/flaws, and weapon qualities/flaws - * - * @param {Object} victim id of actor taking damage - * @param {Object} opposedData Test results, all the information needed to calculate damage - * @param {var} damageType enum for what the damage ignores, see config.js - */ - static applyDamage(victim, opposeData, damageType = game.wfrp4e.config.DAMAGE_TYPE.NORMAL) { - if (!opposeData.damage) - return `Error: ${game.i18n.localize("CHAT.DamageAppliedError")}` - // If no damage value, don't attempt anything - if (!opposeData.damage.value) - return game.i18n.localize("CHAT.DamageAppliedErrorTiring"); - - // Get actor/tokens for those in the opposed test - let actor = game.wfrp4e.utility.getSpeaker(victim); - let attacker = game.wfrp4e.utility.getSpeaker(opposeData.speakerAttack) - let soundContext = { item: {}, action: "hit" }; - - // Start wound loss at the damage value - let totalWoundLoss = opposeData.damage.value - let newWounds = actor.data.data.status.wounds.value; - let applyAP = (damageType == game.wfrp4e.config.DAMAGE_TYPE.IGNORE_TB || damageType == game.wfrp4e.config.DAMAGE_TYPE.NORMAL) - let applyTB = (damageType == game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP || damageType == game.wfrp4e.config.DAMAGE_TYPE.NORMAL) - let AP = {}; - - // Start message update string - let updateMsg = `${game.i18n.localize("CHAT.DamageApplied")}: @TOTAL`; - if (damageType != game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL) - updateMsg += " (" - - let weaponProperties - // If armor at hitloc has impenetrable value or not - let impenetrable = false; - // If weapon is undamaging - let undamaging = false; - // If weapon has Hack - let hack = false; - // If weapon has Impale - let impale = false; - // If weapon has Penetrating - let penetrating = false; - - // if weapon has pummel - only used for audio - let pummel = false - - // Reduce damage by TB - if (applyTB) { - totalWoundLoss -= actor.data.data.characteristics.t.bonus - updateMsg += actor.data.data.characteristics.t.bonus + " TB" - } - - // If the actor has the Robust talent, reduce damage by times taken - totalWoundLoss -= actor.data.flags.robust || 0; - - if (actor.data.flags.robust) - updateMsg += ` + ${actor.data.flags.robust} Robust` - - if (applyAP) { - AP = actor.prepareItems().AP[opposeData.hitloc.value] - AP.ignored = 0; - if (opposeData.attackerTestResult.weapon) // If the attacker is using a weapon - { - // Determine its qualities/flaws to be used for damage calculation - weaponProperties = opposeData.attackerTestResult.weapon.properties; - penetrating = weaponProperties.qualities.includes(game.i18n.localize("PROPERTY.Penetrating")) - undamaging = weaponProperties.flaws.includes(game.i18n.localize("PROPERTY.Undamaging")) - hack = weaponProperties.qualities.includes(game.i18n.localize("PROPERTY.Hack")) - impale = weaponProperties.qualities.includes(game.i18n.localize("PROPERTY.Impale")) - pummel = weaponProperties.qualities.includes(game.i18n.localize("PROPERTY.Pummel")) - } - // see if armor flaws should be triggered - let ignorePartial = opposeData.attackerTestResult.roll % 2 == 0 || opposeData.attackerTestResult.extra.critical - let ignoreWeakpoints = opposeData.attackerTestResult.extra.critical && impale - - // Mitigate damage with armor one layer at a time - for (let layer of AP.layers) { - if (ignoreWeakpoints && layer.weakpoints) { - AP.ignored += layer.value - } - else if (ignorePartial && layer.partial) { - AP.ignored += layer.value; - } - else if (penetrating) // If penetrating - ignore 1 or all armor depending on material - { - AP.ignored += layer.metal ? 1 : layer.value - } - if (opposeData.attackerTestResult.roll % 2 != 0 && layer.impenetrable) { - impenetrable = true; - soundContext.outcome = "impenetrable" - } - - // Prioritize plate over chain over leather for sound - if (layer.value) { - if (layer.armourType == "plate") - soundContext.item.armourType = layer.armourType - else if (!soundContext.item.armourType || (soundContext.item.armourType && (soundContext.item.armourType.includes("leather")) && layer.armourType == "mail")) // set to chain if there isn't an armour type set yet, or the current armor type is leather - soundContext.item.armourType = layer.armourType - else if (!soundContext.item.armourType) - soundContext.item.armourType = "leather" - } - } - - // AP.used is the actual amount of AP considered - AP.used = AP.value - AP.ignored - AP.used = AP.used < 0 ? 0 : AP.used; // AP minimum 0 - AP.used = undamaging ? AP.used * 2 : AP.used; // Double AP if undamaging - - // show the AP usage in the updated message - if (AP.ignored) - updateMsg += ` + ${AP.used}/${AP.value} ${game.i18n.localize("AP")}` - else - updateMsg += ` + ${AP.used} ${game.i18n.localize("AP")}` - - // If using a shield, add that AP as well - let shieldAP = 0; - if (opposeData.defenderTestResult.weapon) { - if (opposeData.defenderTestResult.weapon.properties.qualities.find(q => q.toLowerCase().includes(game.i18n.localize("PROPERTY.Shield").toLowerCase()))) - shieldAP = Number(opposeData.defenderTestResult.weapon.properties.qualities.find(q => q.toLowerCase().includes(game.i18n.localize("PROPERTY.Shield").toLowerCase())).split(" ")[1]); - } - - if (shieldAP) - updateMsg += ` + ${shieldAP} ${game.i18n.localize("CHAT.DamageShield")})` - else - updateMsg += ")" - - // Reduce damage done by AP - totalWoundLoss -= (AP.used + shieldAP) - - // Minimum 1 wound if not undamaging - if (!undamaging) - totalWoundLoss = totalWoundLoss <= 0 ? 1 : totalWoundLoss - else - totalWoundLoss = totalWoundLoss <= 0 ? 0 : totalWoundLoss - - - try { - if (opposeData.attackerTestResult.weapon.attackType == "melee") { - if ((weaponProperties.qualities.concat(weaponProperties.flaws)).every(p => [game.i18n.localize("PROPERTY.Pummel"), game.i18n.localize("PROPERTY.Slow"), game.i18n.localize("PROPERTY.Damaging")].includes(p))) - soundContext.outcome = "warhammer" // special sound for warhammer :^) - else if (AP.used) { - soundContext.item.type = "armour" - if (applyAP && totalWoundLoss <= 1) - soundContext.outcome = "blocked" - else if (applyAP) - soundContext.outcome = "normal" - if (impenetrable) - soundContext.outcome = "impenetrable" - if (hack) - soundContext.outcome = "hack" - } - else { - soundContext.item.type = "hit" - soundContext.outcome = "normal" - if (impale || penetrating) { - soundContext.outcome = "normal_slash" - } - } - } - } - catch (e) { console.log("wfrp4e | Sound Context Error: " + e) } // Ignore sound errors - } - else updateMsg += ")" - - newWounds -= totalWoundLoss - - game.wfrp4e.audio.PlayContextAudio(soundContext) - - // If damage taken reduces wounds to 0, show Critical - if (newWounds <= 0 && !impenetrable) { - //WFRP_Audio.PlayContextAudio(opposeData.attackerTestResult.weapon, {"type": "hit", "equip": "crit"}) - let critAmnt = game.settings.get("wfrp4e", "dangerousCritsMod") - if (game.settings.get("wfrp4e", "dangerousCrits") && critAmnt && (Math.abs(newWounds) - actor.data.data.characteristics.t.bonus) > 0) { - let critModifier = (Math.abs(newWounds) - actor.data.data.characteristics.t.bonus) * critAmnt; - updateMsg += `
${game.i18n.localize("Critical")} +${critModifier}` - } - else if (Math.abs(newWounds) < actor.data.data.characteristics.t.bonus) - updateMsg += `
${game.i18n.localize("Critical")} (-20)` - else - updateMsg += `
${game.i18n.localize("Critical")}` - } - else if (impenetrable) - updateMsg += `
${game.i18n.localize("PROPERTY.Impenetrable")} - ${game.i18n.localize("CHAT.CriticalsNullified")}` - - if (hack) - updateMsg += `
${game.i18n.localize("CHAT.DamageAP")} ${game.wfrp4e.config.locations[opposeData.hitloc.value]}` - - if (newWounds <= 0) - newWounds = 0; // Do not go below 0 wounds - - - updateMsg += "" - updateMsg = updateMsg.replace("@TOTAL", totalWoundLoss) - - // Update actor wound value - actor.update({ "data.status.wounds.value": newWounds }) - return updateMsg; - } - - - - /* --------------------------------------------------------------------------------------------------------- */ - /* -------------------------------------- Auto-Advancement Functions --------------------------------------- */ - /* --------------------------------------------------------------------------------------------------------- */ - /** - * These functions are primarily for NPCs and Creatures and their automatic advancement capabilities. - * - /* --------------------------------------------------------------------------------------------------------- */ - - - /** - * Advances an actor's skills based on their species and character creation rules - * - * Per character creation, 3 skills from your species list are advanced by 5, and 3 more are advanced by 3. - * This functions uses the Foundry Roll class to randomly select skills from the list (defined in config.js) - * and advance the first 3 selected by 5, and the second 3 selected by 3. This function uses the advanceSkill() - * helper defined below. - */ - async _advanceSpeciesSkills() { - let skillList - - // A species may not be entered in the actor, so use some error handling. - try { - skillList = game.wfrp4e.config.speciesSkills[this.data.data.details.species.value]; - if (!skillList) { - // findKey() will do an inverse lookup of the species key in the species object defined in config.js, and use that if - // user-entered species value does not work (which it probably will not) - skillList = game.wfrp4e.config.speciesSkills[game.wfrp4e.utility.findKey(this.data.data.details.species.value, game.wfrp4e.config.species)] - if (!skillList) { - throw game.i18n.localize("Error.SpeciesSkills") + " " + this.data.data.details.species.value; - } - } - } - catch (error) { - ui.notifications.info("Could not find species " + this.data.data.details.species.value) - console.log("wfrp4e | Could not find species " + this.data.data.details.species.value + ": " + error); - throw error - } - // The Roll class used to randomly select skills - let skillSelector = new Roll(`1d${skillList.length}- 1`); - skillSelector.roll().total; - - // Store selected skills - let skillsSelected = []; - while (skillsSelected.length < 6) { - skillSelector = skillSelector.reroll() - if (!skillsSelected.includes(skillSelector.total)) // Do not push duplicates - skillsSelected.push(skillSelector.total); - } - - // Advance the first 3 by 5, advance the second 3 by 3. - for (let skillIndex = 0; skillIndex < skillsSelected.length; skillIndex++) { - if (skillIndex <= 2) - await this._advanceSkill(skillList[skillsSelected[skillIndex]], 5) - else - await this._advanceSkill(skillList[skillsSelected[skillIndex]], 3) - } - } - - - /** - * Advances an actor's talents based on their species and character creation rules - * - * Character creation rules for talents state that you get all talents in your species, but there - * are a few where you must choose between two instead. See config.js for how the species talent - * object is set up for support in this. Basically species talents are an array of strings, however - * ones that offer a choice is formatted as ", ", each talent being a choice. Finally, - * the last element of the talent list is a number denoting the number of random talents. This function uses - * the advanceTalent() helper defined below. - */ - async _advanceSpeciesTalents() { - // A species may not be entered in the actor, so use some error handling. - let talentList - try { - talentList = game.wfrp4e.config.speciesTalents[this.data.data.details.species.value]; - if (!talentList) { - // findKey() will do an inverse lookup of the species key in the species object defined in config.js, and use that if - // user-entered species value does not work (which it probably will not) - talentList = game.wfrp4e.config.speciesTalents[game.wfrp4e.utility.findKey(this.data.data.details.species.value, game.wfrp4e.config.species)] - if (!talentList) - throw game.i18n.localize("Error.SpeciesTalents") + " " + this.data.data.details.species.value; - } - } - catch (error) { - ui.notifications.info("Could not find species " + this.data.data.details.species.value) - console.log("wfrp4e | Could not find species " + this.data.data.details.species.value + ": " + error); - throw error - } - let talentSelector; - for (let talent of talentList) { - if (!isNaN(talent)) // If is a number, roll on random talents - { - for (let i = 0; i < talent; i++) { - let result = game.wfrp4e.tables.rollTable("talents") - await this._advanceTalent(result.name); - } - continue - } - // If there is a comma, talent.split() will yield an array of length > 1 - let talentOptions = talent.split(',').map(function (item) { - return item.trim(); - }); - - // Randomly choose a talent option and advance it. - if (talentOptions.length > 1) { - talentSelector = new Roll(`1d${talentOptions.length} - 1`) - await this._advanceTalent(talentOptions[talentSelector.roll().total]) - } - else // If no option, simply advance the talent. - { - await this._advanceTalent(talent) - } - } - - } - - - /** - * Adds (if needed) and advances a skill by the specified amount. - * - * As the name suggests, this function advances any given skill, if - * the actor does not currently have that skill, it will be added - * from the compendium and advanced. Note that this function is neither - * used by manually advancing skills nor when clicking on advancement - * indicators. This will simply add the advancement value with no - * other processing. - * - * @param {String} skillName Name of the skill to advance/add - * @param {Number} advances Advances to add to the skill - */ - async _advanceSkill(skillName, advances) { - // Look through items and determine if the actor has the skill - let existingSkill = this.data.items.find(i => i.name.trim() == skillName && i.type == "skill") - // If so, simply update the skill with the new advancement value. - if (existingSkill) { - existingSkill = foundry.utils.duplicate(existingSkill); - // If the existing skill has a greater amount of advances, use the greater value instead (make no change) - ??? Is this needed? I'm not sure why I did this. TODO: Evaluate. - existingSkill.data.advances.value = (existingSkill.data.advances.value < advances) ? advances : existingSkill.data.advances.value; - await this.updateEmbeddedEntity("OwnedItem", existingSkill); - return; - } - - // If the actor does not already own skill, search through compendium and add it - try { - // See findSkill() for a detailed explanation of how it works - // Advanced find function, returns the skill the user expects it to return, even with skills not included in the compendium (Lore (whatever)) - let skillToAdd = await game.wfrp4e.utility.findSkill(skillName) - skillToAdd.data.data.advances.value = advances; - await this.createEmbeddedEntity("OwnedItem", skillToAdd.data); - } - catch (error) { - console.error("Something went wrong when adding skill " + skillName + ": " + error); - ui.notifications.error("Something went wrong when adding skill " + skillName + ": " + error); - } - } - - /** - * Adds the given talent to the actor - * - * In my implementation, adding a talent is the same as advancing a talent. See - * prepareTalent() and you'll see that the total number of any given talent is the - * advencement value. - * - * @param {String} talentName Name of the talent to add/advance. - */ - async _advanceTalent(talentName) { - try { - // See findTalent() for a detailed explanation of how it works - // Advanced find function, returns the Talent the user expects it to return, even with Talents not included in the compendium (Etiquette (whatever)) - let talent = await game.wfrp4e.utility.findTalent(talentName); - await this.createEmbeddedEntity("OwnedItem", talent.data); - } - catch (error) { - console.error("Something went wrong when adding talent " + talentName + ": " + error); - ui.notifications.error("Something went wrong when adding talent " + talentName + ": " + error); - } - } - - /** - * Advance NPC based on given career - * - * A specialized function used by NPC type Actors that triggers when you click on a - * career to be "complete". This takes all the career data and uses it (and the helpers - * defined above) to advance the actor accordingly. It adds all skills (advanced to the - * correct amount to be considered complete), advances all characteristics similarly, and - * adds all talents. - * - * Note: This adds *all* skills and talents, which is not necessary to be considered complete. - * However, I find deleting the ones you don't want to be much easier than trying to pick and - * choose the ones you do want. - * - * @param {Object} careerData Career type Item to be used for advancement. - * - * TODO Refactor for embedded entity along with the helper functions - */ - async _advanceNPC(careerData) { - let updateObj = {}; - let advancesNeeded = careerData.level.value * 5; // Tier 1 needs 5, 2 needs 10, 3 needs 15, 4 needs 20 in all characteristics and skills - - // Update all necessary characteristics to the advancesNeeded - for (let advChar of careerData.characteristics) - if (this.data.data.characteristics[advChar].advances < 5 * careerData.level.value) - updateObj[`data.characteristics.${advChar}.advances`] = 5 * careerData.level.value; - - // Advance all skills in the career - for (let skill of careerData.skills) - await this._advanceSkill(skill, advancesNeeded); - - // Add all talents in the career - for (let talent of careerData.talents) - await this._advanceTalent(talent); - - this.update(updateObj); - } - - - _replaceData(formula) { - let dataRgx = new RegExp(/@([a-z.0-9]+)/gi); - return formula.replace(dataRgx, (match, term) => { - let value = getProperty(this.data, term); - return value ? String(value).trim() : "0"; - }); - } - - /** - * Use a fortune point from the actor to reroll or add sl to a roll - * @param {Object} message - * @param {String} type (reroll, addSL) - */ - useFortuneOnRoll(message, type) { - if (this.data.data.status.fortune.value > 0) { - message.data.flags.data.preData.roll = undefined; - let data = message.data.flags.data; - let html = `

${game.i18n.localize("FORTUNE.Use")}

`; - //First we send a message to the chat - if (type == "reroll") - html += `${game.i18n.format("FORTUNE.UsageRerollText", { character: '' + this.name + '' })}
`; - else - html += `${game.i18n.format("FORTUNE.UsageAddSLText", { character: '' + this.name + '' })}
`; - - html += `${game.i18n.localize("FORTUNE.PointsRemaining")} ${this.data.data.status.fortune.value - 1}`; - ChatMessage.create(game.wfrp4e.utility.chatDataSetup(html)); - - let cardOptions = this.preparePostRollAction(message); - //Then we do the actual fortune action - if (type == "reroll") { - cardOptions.fortuneUsedReroll = true; - cardOptions.hasBeenCalculated = false; - cardOptions.calculatedMessage = []; - //It was an unopposed targeted test who failed - if (data.originalTargets && data.originalTargets.size > 0) { - game.user.targets = data.originalTargets; - //Foundry has a circular reference to the user in its targets set so we do it too - game.user.targets.user = game.user; - } - //It it is an ongoing opposed test, we transfer the list of the startMessages to update them - if (!data.defenderMessage && data.startMessagesList) { - cardOptions.startMessagesList = data.startMessagesList; - } - delete data.preData.roll; - delete data.preData.SL; - new ActorWfrp4e_fr(data.postData.actor)[`${data.postData.postFunction}`]({testData : data.preData, cardOptions}); - - //We also set fortuneUsedAddSL to force the player to use it on the new roll - message.update({ - "flags.data.fortuneUsedReroll": true, - "flags.data.fortuneUsedAddSL": true - }); - - } - else //addSL - { - let newTestData = data.preData; - newTestData.SL = Math.trunc(data.postData.SL) + 1; - newTestData.slBonus = 0; - newTestData.successBonus = 0; - newTestData.roll = Math.trunc(data.postData.roll); - newTestData.hitloc = data.preData.hitloc; - - //We deselect the token, - //2020-04-25 : Currently the foundry function is bugged so we do it ourself - //game.user.updateTokenTargets([]); - game.user.targets.forEach(t => t.setTarget(false, { user: game.user, releaseOthers: false, groupSelection: true })); - - cardOptions.fortuneUsedAddSL = true; - new ActorWfrp4e_fr(data.postData.actor)[`${data.postData.postFunction}`]({testData : newTestData, cardOptions}, {rerenderMessage : message}); - message.update({ - "flags.data.fortuneUsedAddSL": true - }); - } - this.update({ "data.status.fortune.value": this.data.data.status.fortune.value - 1 }); - } - } - - /** - * Take a Dark Deal to reroll for +1 Corruption - * @param {Object} message - */ - useDarkDeal(message) { - let html = `

${game.i18n.localize("DARKDEAL.Use")}

`; - html += `${game.i18n.format("DARKDEAL.UsageText", { character: '' + this.name + '' })}
`; - let corruption = Math.trunc(this.data.data.status.corruption.value) + 1; - html += `${game.i18n.localize("Corruption")}: ${corruption}/${this.data.data.status.corruption.max}`; - ChatMessage.create(game.wfrp4e.utility.chatDataSetup(html)); - this.update({ "data.status.corruption.value": corruption }).then(() => { - this.checkCorruption(); - }); - - message.data.flags.data.preData.roll = undefined; - let cardOptions = this.preparePostRollAction(message); - let data = message.data.flags.data; - cardOptions.fortuneUsedReroll = data.fortuneUsedReroll; - cardOptions.fortuneUsedAddSL = data.fortuneUsedAddSL; - cardOptions.hasBeenCalculated = false; - cardOptions.calculatedMessage = []; - - //It was an unopposed targeted test who failed - if (data.originalTargets && data.originalTargets.size > 0) { - game.user.targets = data.originalTargets; - //Foundry has a circular reference to the user in its targets set so we do it too - game.user.targets.user = game.user; - } - //It it is an ongoing opposed test, we transfer the list of the startMessages to update them - if (!data.defenderMessage && data.startMessagesList) { - cardOptions.startMessagesList = data.startMessagesList; - } - delete message.data.flags.data.preData.roll; - delete message.data.flags.data.preData.SL; - new ActorWfrp4e_fr(data.postData.actor)[`${data.postData.postFunction}`]({testData : data.preData, cardOptions}); - } - - /** - * This helper can be used to prepare cardOptions to reroll/edit a test card - * It uses the informations of the roll located in the message entry - * from game.messages - * @param {Object} message - * @returns {Object} cardOptions - */ - preparePostRollAction(message) { - //recreate the initial (virgin) cardOptions object - //add a flag for reroll limit - let data = message.data.flags.data; - let cardOptions = { - flags: { img: message.data.flags.img }, - rollMode: data.rollMode, - sound: message.data.sound, - speaker: message.data.speaker, - template: data.template, - title: data.title.replace(` - ${game.i18n.localize("Opposed")}`, ""), - user: message.data.user - }; - if (data.attackerMessage) - cardOptions.attackerMessage = data.attackerMessage; - if (data.defenderMessage) - cardOptions.defenderMessage = data.defenderMessage; - if (data.unopposedStartMessage) - cardOptions.unopposedStartMessage = data.unopposedStartMessage; - return cardOptions; - } - - - async corruptionDialog(strength) { - new Dialog({ - title: "Corrupting Influence", - content: `

How does ${this.name} resist this corruption?`, - buttons: { - endurance: { - label: game.i18n.localize("NAME.Endurance"), - callback: () => { - let skill = this.items.find(i => i.name == game.i18n.localize("NAME.Endurance") && i.type == "skill") - if (skill) { - this.setupSkill(skill.data, { corruption: strength }).then(setupData => this.basicTest(setupData)) - } - else { - this.setupCharacteristic("t", { corruption: strength }).then(setupData => this.basicTest(setupData)) - } - } - }, - cool: { - label: game.i18n.localize("NAME.Cool"), - callback: () => { - let skill = this.items.find(i => i.name == game.i18n.localize("NAME.Cool") && i.type == "skill") - if (skill) { - this.setupSkill(skill.data, { corruption: strength }).then(setupData => this.basicTest(setupData)) - } - else { - this.setupCharacteristic("wp", { corruption: strength }).then(setupData => this.basicTest(setupData)) - } - } - } - - } - }).render(true) - } - - async handleCorruptionResult(testResult) { - let strength = testResult.options.corruption; - let failed = testResult.target < testResult.roll; - let corruption = 0 // Corruption GAINED - switch (strength) { - case "minor": - if (failed) - corruption++; - break; - - case "moderate": - if (failed) - corruption += 2 - else if (testResult.SL < 2) - corruption += 1 - break; - - case "major": - if (failed) - corruption += 3 - else if (testResult.SL < 2) - corruption += 2 - else if (testResult.SL < 4) - corruption += 1 - break; - } - let newCorruption = Number(this.data.data.status.corruption.value) + corruption - ChatMessage.create(game.wfrp4e.utility.chatDataSetup(`${this.name} gains ${corruption} Corruption.`, "gmroll", false)) - await this.update({ "data.status.corruption.value": newCorruption }) - if (corruption > 0) - this.checkCorruption(); - - } - - async checkCorruption() { - if (this.data.data.status.corruption.value > this.data.data.status.corruption.max) { - let skill = this.items.find(i => i.name == game.i18n.localize("NAME.Endurance") && i.type == "skill") - if (skill) { - this.setupSkill(skill.data, { mutate: true }).then(setupData => { - this.basicTest(setupData) - }); - } - else { - this.setupCharacteristic("t", { mutate: true }).then(setupData => { - this.basicTest(setupData) - }); - } - } - } - - async handleMutationResult(testResult) { - let failed = testResult.target < testResult.roll; - - if (failed) { - let wpb = this.data.data.characteristics.wp.bonus; - let tableText = "Roll on a Corruption Table:
" + game.wfrp4e.config.corruptionTables.map(t => `@Table[${t}]
`).join("") - ChatMessage.create(game.wfrp4e.utility.chatDataSetup(` -

Dissolution of Body and Mind

-

As corruption ravages your soul, the warping breath of Chaos whispers within, either fanning your flesh into a fresh, new form, or fracturing your psyche with exquisite knowledge it can never unlearn.

-

${this.name} loses ${wpb} Corruption. -

${tableText}

`, - "gmroll", false)) - this.update({ "data.status.corruption.value": Number(this.data.data.status.corruption.value) - wpb }) - } - else - ChatMessage.create(game.wfrp4e.utility.chatDataSetup(`You have managed to hold off your corruption. For now.`, "gmroll", false)) - - } - - - async handleExtendedTest(testResult) { - let test = foundry.utils.duplicate(this.getEmbeddedEntity("OwnedItem", testResult.options.extended)); - - if(game.settings.get("wfrp4e", "extendedTests") && testResult.SL == 0) - testResult.SL = testResult.roll <= testResult.target ? 1 : -1 - - if (test.data.failingDecreases.value) - { - test.data.SL.current += Number(testResult.SL) - if (!test.data.negativePossible.value && test.data.SL.current < 0) - test.data.SL.current = 0; - } - else if(testResult.SL > 0) - test.data.SL.current += Number(testResult.SL) - - let displayString = `${test.name} ${test.data.SL.current} / ${test.data.SL.target} SL` - - if (test.data.SL.current >= test.data.SL.target) - { - if (test.data.completion.value == "reset") - test.data.SL.current = 0; - else if (test.data.completion.value == "remove") - { - this.deleteEmbeddedEntity("OwnedItem", test._id) - test = undefined - } - displayString = displayString.concat("
" + "Completed") - } - - testResult.other.push(displayString) - - if (test) - this.updateEmbeddedEntity("OwnedItem", test); - } - - - -} \ No newline at end of file diff --git a/modules/potion-ingredients.js b/modules/potion-ingredients.js deleted file mode 100644 index e1e9e69..0000000 --- a/modules/potion-ingredients.js +++ /dev/null @@ -1,77 +0,0 @@ -const __INGREDIENTS = [ - { "name": "Pomme", - "type": "herb", - "rarete": "commun", - "milieu": [ "Terre agricole", "Forêt", "Prairie"], - "affinite": "ghur" - }, - { "name": "Haricot Noir", - "type": "herb", - "rarete": "commun", - "milieu": ["Prairie"], - "affinite": "ghur" - }, - { "name": "Coriandre", - "type": "herb", - "rarete": "rare", - "milieu": ["Prairie"], - "affinite": "ghur" - }, - { "name": "Vêture de Renard", - "type": "herb", - "rarete": "commun", - "milieu": ["Forêt"], - "affinite": "ghur" - }, - { - "name": "Iris", - "type": "herb", - "rarete": "commun", - "milieu": ["Marais", "Lande"], - "affinite": "ghur" - }, - { - "name": "Laurier", - "type": "herb", - "rarete": "limite", - "milieu": ["Forêt"], - "affinite": "ghur" - }, - { - "name": "Roquette", - "type": "herb", - "rarete": "commun", - "milieu": ["Tourbière", "Prairie"], - "affinite": "ghur" - }, - { - "name": "Romarin", - "type": "herb", - "rarete": "commun", - "milieu": ["Forêt", "Prairie"], - "affinite": "ghur" - }, - { - "name": "Câpre", - "type": "herb", - "rarete": "commun", - "milieu": ["Marais", "Lande"], - "affinite": "shyish" - }, - { - "name": "Ciboulette", - "type": "herb", - "rarete": "commun", - "milieu": ["Forêt", "Prairie"], - "affinite": "shyish" - }, - { - "name": "Cigüe Aquatique", - "type": "herb", - "rarete": "limite", - "milieu": ["Aquatique", "Marais"], - "affinite": "shyish" - } - -] - diff --git a/wh4_de.js b/modules/wh4_de.js similarity index 100% rename from wh4_de.js rename to modules/wh4_de.js