Redefine actors for French use

This commit is contained in:
sladecraven 2020-11-06 21:44:22 +01:00
parent db8e5efa2e
commit c4211304d4
4 changed files with 61 additions and 203 deletions

View File

@ -1,155 +0,0 @@
/************************************************************************************/
/* 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();
}
}

View File

@ -3,18 +3,18 @@
"name": "WH4-fr-translation",
"title": "Traduction du module WH4 en Français.",
"description": "La traduction du module WH4.",
"version": "1.3.12",
"version": "1.3.13",
"minimumCoreVersion" : "0.6.6",
"compatibleCoreVersion": "1.0.0",
"author": "LeRatierBretonnien",
"dependencies": [
{
"name": "wfrp4e",
"type": "system"
"name": "wfrp4e",
"type": "system"
},
{
"name": "babele",
"type": "module"
"name": "babele",
"type": "module"
}
],
"esmodules": [

View File

@ -178,7 +178,7 @@ export default class ActorWfrp4e_fr extends Actor {
}
// If the size has been changed since the last known value, update the value
data.data.details.size.value = WFRP_Utility.findKey(size, WFRP4E.actorSizes) || "avg"
data.data.details.size.value = WFRP_Utility.findKey(size, game.wfrp4e.config.actorSizes) || "avg"
// Now that we have size, calculate wounds and token size
if (data.flags.autoCalcWounds) {
@ -191,7 +191,8 @@ export default class ActorWfrp4e_fr extends Actor {
}
if (data.flags.autoCalcSize) {
let tokenSize = WFRP4E.tokenSizes[data.data.details.size.value]
//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 });
}
@ -372,7 +373,7 @@ export default class ActorWfrp4e_fr extends Actor {
// 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 = WFRP4E.difficultyModifiers[html.find('[name="testDifficulty"]').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
@ -455,7 +456,7 @@ export default class ActorWfrp4e_fr extends Actor {
data: {
hitLocation: testData.hitLocation,
talents: this.data.flags.talentTests,
characteristicList: WFRP4E.characteristics,
characteristicList: game.wfrp4e.config.characteristics,
characteristicToUse: skill.data.characteristic.value,
advantage: this.data.data.status.advantage.value || 0,
rollMode: options.rollMode
@ -465,7 +466,7 @@ export default class ActorWfrp4e_fr extends Actor {
// 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 = WFRP4E.difficultyModifiers[html.find('[name="testDifficulty"]').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();
@ -673,7 +674,7 @@ export default class ActorWfrp4e_fr extends Actor {
// 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 = WFRP4E.difficultyModifiers[html.find('[name="testDifficulty"]').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())];
@ -791,7 +792,7 @@ export default class ActorWfrp4e_fr extends Actor {
// 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 = WFRP4E.difficultyModifiers[html.find('[name="testDifficulty"]').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());
@ -870,7 +871,7 @@ export default class ActorWfrp4e_fr extends Actor {
}
}
else {
defaultSelection = channellSkills.indexOf(channellSkills.find(x => x.name.includes(WFRP4E.magicWind[spellLore])));
defaultSelection = channellSkills.indexOf(channellSkills.find(x => x.name.includes(game.wfrp4e.config.magicWind[spellLore])));
}
if (spellLore == "witchcraft")
@ -911,7 +912,7 @@ export default class ActorWfrp4e_fr extends Actor {
// 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 = WFRP4E.difficultyModifiers[html.find('[name="testDifficulty"]').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');
@ -1010,7 +1011,7 @@ export default class ActorWfrp4e_fr extends Actor {
// 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 = WFRP4E.difficultyModifiers[html.find('[name="testDifficulty"]').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());
@ -1066,7 +1067,7 @@ export default class ActorWfrp4e_fr extends Actor {
setupTrait(trait, options = {}) {
if (!trait.data.rollable.value)
return;
let title = WFRP4E.characteristics[trait.data.rollable.rollCharacteristic] + ` ${game.i18n.localize("Test")} - ` + trait.name;
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,
@ -1092,7 +1093,7 @@ export default class ActorWfrp4e_fr extends Actor {
data: {
hitLocation: testData.hitLocation,
talents: this.data.flags.talentTests,
characteristicList: WFRP4E.characteristics,
characteristicList: game.wfrp4e.config.characteristics,
characteristicToUse: trait.data.rollable.rollCharacteristic,
advantage: this.data.data.status.advantage.value || 0,
testDifficulty: trait.data.rollable.defaultDifficulty
@ -1102,7 +1103,7 @@ export default class ActorWfrp4e_fr extends Actor {
// 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 = WFRP4E.difficultyModifiers[html.find('[name="testDifficulty"]').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();
@ -1268,10 +1269,10 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
let status = testData.income.value.split(' ')
let dieAmount = WFRP4E.earningValues[WFRP_Utility.findKey(status[0], WFRP4E.statusTiers)][0] // b, s, or g maps to 2d10, 1d10, or 1 respectively (takes the first letter)
let dieAmount = game.wfrp4e.config.earningValues[WFRP_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 (WFRP_Utility.findKey(status[0], WFRP4E.statusTiers) != "g") // Don't roll for gold, just use standing value
if (WFRP_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;
@ -1282,7 +1283,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
// After rolling, determined how much, if any, was actually earned
if (result.description.includes("Success")) {
result.incomeResult = game.i18n.localize("INCOME.YouEarn") + " " + moneyEarned;
switch (WFRP_Utility.findKey(status[0], WFRP4E.statusTiers)) {
switch (WFRP_Utility.findKey(status[0], game.wfrp4e.config.statusTiers)) {
case "b":
result.incomeResult += ` ${game.i18n.localize("NAME.BPPlural").toLowerCase()}.`
break;
@ -1300,7 +1301,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
else if (Number(result.SL) > -6) {
moneyEarned /= 2;
result.incomeResult = game.i18n.localize("INCOME.YouEarn") + " " + moneyEarned;
switch (WFRP_Utility.findKey(status[0], WFRP4E.statusTiers)) {
switch (WFRP_Utility.findKey(status[0], game.wfrp4e.config.statusTiers)) {
case "b":
result.incomeResult += ` ${game.i18n.localize("NAME.BPPlural").toLowerCase()}.`
break;
@ -1321,7 +1322,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
}
// let contextAudio = await WFRP_Audio.MatchContextAudio(WFRP_Audio.FindContext(result))
// cardOptions.sound = contextAudio.file || cardOptions.sound
result.moneyEarned = moneyEarned + WFRP_Utility.findKey(status[0], WFRP4E.statusTiers);
result.moneyEarned = moneyEarned + WFRP_Utility.findKey(status[0], game.wfrp4e.config.statusTiers);
if (!options.suppressMessage)
DiceWFRP.renderRollCard(cardOptions, result, options.rerenderMessage).then(msg => {
OpposedWFRP.handleOpposedTarget(msg)
@ -1690,7 +1691,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
{
if (loc == "shield")
continue
let row = WFRP_Tables[actorData.data.details.hitLocationTable.value].rows.find(r => r.result == loc)
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
@ -2083,9 +2084,9 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
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 = WFRP4E.trappingCategories[item.data.trappingType.value];
item.type = game.wfrp4e.config.trappingCategories[item.data.trappingType.value];
else
item.type = WFRP4E.trappingCategories[item.type];
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
@ -2166,15 +2167,15 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
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 = WFRP4E.encumbrancePenalties["maxEncumbered"];
enc.penalty = game.wfrp4e.config.encumbrancePenalties["maxEncumbered"];
}
else if (enc.state > 2) {
enc["veryEncumbered"] = true
enc.penalty = WFRP4E.encumbrancePenalties["veryEncumbered"];
enc.penalty = game.wfrp4e.config.encumbrancePenalties["veryEncumbered"];
}
else if (enc.state > 1) {
enc["encumbered"] = true
enc.penalty = WFRP4E.encumbrancePenalties["encumbered"];
enc.penalty = game.wfrp4e.config.encumbrancePenalties["encumbered"];
}
else
enc["notEncumbered"] = true;
@ -2232,7 +2233,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
else if (skill.data.modifier.value < 0)
skill.modified = "negative"
}
skill.data.characteristic.abrev = WFRP4E.characteristicsAbbrev[skill.data.characteristic.value];
skill.data.characteristic.abrev = game.wfrp4e.config.characteristicsAbbrev[skill.data.characteristic.value];
skill.data.cost = WFRP_Utility._calculateAdvCost(skill.data.advances.value, "skill", skill.data.advances.costModifier)
return skill
}
@ -2308,9 +2309,9 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
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 = WFRP4E.groupToType[weapon.data.weaponGroup.value]
weapon.data.reach.value = WFRP4E.weaponReaches[weapon.data.reach.value];
weapon.data.weaponGroup.value = WFRP4E.weaponGroups[weapon.data.weaponGroup.value] || "basic";
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()})`))
@ -2726,7 +2727,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
{
// 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("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
@ -2921,7 +2922,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
* @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 = WFRP4E.DAMAGE_TYPE.NORMAL) {
static applyDamage(victim, opposeData, damageType = game.wfrp4e.config.DAMAGE_TYPE.NORMAL) {
if (!opposeData.damage)
return `<b>Error</b>: ${game.i18n.localize("CHAT.DamageAppliedError")}`
// If no damage value, don't attempt anything
@ -2936,13 +2937,13 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
// Start wound loss at the damage value
let totalWoundLoss = opposeData.damage.value
let newWounds = actor.data.data.status.wounds.value;
let applyAP = (damageType == WFRP4E.DAMAGE_TYPE.IGNORE_TB || damageType == WFRP4E.DAMAGE_TYPE.NORMAL)
let applyTB = (damageType == WFRP4E.DAMAGE_TYPE.IGNORE_AP || damageType == WFRP4E.DAMAGE_TYPE.NORMAL)
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 = `<b>${game.i18n.localize("CHAT.DamageApplied")}</b><span class = 'hide-option'>: @TOTAL`;
if (damageType != WFRP4E.DAMAGE_TYPE.IGNORE_ALL)
if (damageType != game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL)
updateMsg += " ("
let weaponProperties
@ -3099,7 +3100,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
updateMsg += `<br>${game.i18n.localize("PROPERTY.Impenetrable")} - ${game.i18n.localize("CHAT.CriticalsNullified")}`
if (hack)
updateMsg += `<br>${game.i18n.localize("CHAT.DamageAP")} ${WFRP4E.locations[opposeData.hitloc.value]}`
updateMsg += `<br>${game.i18n.localize("CHAT.DamageAP")} ${game.wfrp4e.config.locations[opposeData.hitloc.value]}`
if (newWounds <= 0)
newWounds = 0; // Do not go below 0 wounds
@ -3137,11 +3138,11 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
// A species may not be entered in the actor, so use some error handling.
try {
skillList = WFRP4E.speciesSkills[this.data.data.details.species.value];
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 = WFRP4E.speciesSkills[WFRP_Utility.findKey(this.data.data.details.species.value, WFRP4E.species)]
skillList = game.wfrp4e.config.speciesSkills[WFRP_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;
}
@ -3188,11 +3189,11 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
// A species may not be entered in the actor, so use some error handling.
let talentList
try {
talentList = WFRP4E.speciesTalents[this.data.data.details.species.value];
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 = WFRP4E.speciesTalents[WFRP_Utility.findKey(this.data.data.details.species.value, WFRP4E.species)]
talentList = game.wfrp4e.config.speciesTalents[WFRP_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;
}
@ -3207,7 +3208,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
if (!isNaN(talent)) // If is a number, roll on random talents
{
for (let i = 0; i < talent; i++) {
let result = WFRP_Tables.rollTable("talents")
let result = game.wfrp4e.tables.rollTable("talents")
await this._advanceTalent(result.name);
}
continue
@ -3375,7 +3376,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
}
delete data.preData.roll;
delete data.preData.SL;
new ActorWfrp4e(data.postData.actor)[`${data.postData.postFunction}`]({testData : data.preData, cardOptions});
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({
@ -3399,7 +3400,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
game.user.targets.forEach(t => t.setTarget(false, { user: game.user, releaseOthers: false, groupSelection: true }));
cardOptions.fortuneUsedAddSL = true;
new ActorWfrp4e(data.postData.actor)[`${data.postData.postFunction}`]({testData : newTestData, cardOptions}, {rerenderMessage : message});
new ActorWfrp4e_fr(data.postData.actor)[`${data.postData.postFunction}`]({testData : newTestData, cardOptions}, {rerenderMessage : message});
message.update({
"flags.data.fortuneUsedAddSL": true
});
@ -3442,7 +3443,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
}
delete message.data.flags.data.preData.roll;
delete message.data.flags.data.preData.SL;
new ActorWfrp4e(data.postData.actor)[`${data.postData.postFunction}`]({testData : data.preData, cardOptions});
new ActorWfrp4e_fr(data.postData.actor)[`${data.postData.postFunction}`]({testData : data.preData, cardOptions});
}
/**
@ -3564,7 +3565,7 @@ DiceWFRP.renderRollCard() as well as handleOpposedTarget().
if (failed) {
let wpb = this.data.data.characteristics.wp.bonus;
let tableText = "Roll on a Corruption Table:<br>" + WFRP4E.corruptionTables.map(t => `@Table[${t}]<br>`).join("")
let tableText = "Roll on a Corruption Table:<br>" + game.wfrp4e.config.corruptionTables.map(t => `@Table[${t}]<br>`).join("")
ChatMessage.create(WFRP_Utility.chatDataSetup(`
<h3>Dissolution of Body and Mind</h3>
<p>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.</p>

File diff suppressed because one or more lines are too long