/************************************************************************************/ /* Override some methods of the WFRP4 actor class, mainly to compute spells/weapons */ class ActorWfrp4e_fr extends ActorWfrp4e { /** * 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 } } /** * 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) { 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 " + WFRP4E.characteristics[ch].toLowerCase(), actorData.data.characteristics[ch].bonus); formula = formula.replace(WFRP4E.characteristics[ch].toLowerCase() + " bonus", actorData.data.characteristics[ch].bonus); } else formula = formula.replace(WFRP4E.characteristics[ch].toLowerCase(), actorData.data.characteristics[ch].value); } } //console.log("calculateSpellDamage -> " + formula ); return eval(formula); } /** * 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) { let actorData = this.data formula = formula.toLowerCase(); // Do not process these special values if (formula != game.i18n.localize("Vous").toLowerCase() && formula != game.i18n.localize("Special").toLowerCase() && formula != game.i18n.localize("Instantané").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(WFRP4E.characteristics[ch].toLowerCase())) { // Determine if it's looking for the bonus or the value if (formula.includes('bonus')) { formula = formula.replace("bonus de " + WFRP4E.characteristics[ch].toLowerCase(), actorData.data.characteristics[ch].bonus); formula = formula.replace(WFRP4E.characteristics[ch].toLowerCase() + " bonus", actorData.data.characteristics[ch].bonus); } else formula = formula.replace(WFRP4E.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(); } }