From 047640a528e85ba52961e24b7c4227deb18be0c2 Mon Sep 17 00:00:00 2001 From: Antho Date: Tue, 30 Aug 2022 23:46:36 -0400 Subject: [PATCH] Add Social standing, crafting button, fix hide loot, modifiers displayed individually --- lang/en.json | 20 +- module/sheets/WitcherActorSheet.js | 157 +++++++++++----- module/witcher.js | 224 ++++++++++++----------- scripts/actions.js | 93 +++------- styles/loot-sheet.css | 2 +- system.json | 2 +- template.json | 8 + templates/partials/character-header.html | 15 ++ templates/partials/tab-inventory.html | 5 +- templates/partials/tab-profession.html | 68 +++++++ templates/sheets/race-sheet.html | 68 +++++++ 11 files changed, 437 insertions(+), 225 deletions(-) diff --git a/lang/en.json b/lang/en.json index 5d8a9874..4e8513a5 100644 --- a/lang/en.json +++ b/lang/en.json @@ -640,13 +640,17 @@ "WITCHER.Chat.SaveText": "To succeed you need to roll below", "WITCHER.Dialog.Crafting": "Crafting a", + "WITCHER.Dialog.CraftingTitle": "Performing a crafting action", "WITCHER.Dialog.AlchemyTitle": "Performing an alchemy action", "WITCHER.Dialog.ButtonCraft": "Craft", "WITCHER.Dialog.CraftingAlchemycal": "Crafting an alchemical", + "WITCHER.Dialog.CraftingItem": "Crafting an item", "WITCHER.Dialog.NoComponents": "Not Enough Component", "WITCHER.Dialog.CraftingDiagram": "You have the diagram", "WITCHER.Dialog.Diagram": "Diagram", + "WITCHER.Dialog.after": "After", + "WITCHER.Dialog.ButtonDodge": "Dodge", "WITCHER.Dialog.ButtonReposition": "Reposition", "WITCHER.Dialog.ButtonParry": "Parry", @@ -884,5 +888,19 @@ "WITCHER.verbalCombat.BribeEffect": "For every 50 Crowns you offer, you gain +1 to your empathetic Verbal Combat rolls for the rest of the fightif you succeed on your Gambling roll.", "WITCHER.verbalCombat.None": "NONE", - "WITCHER.effect.isActive": "Is Active" + "WITCHER.effect.isActive": "Is Active", + + "WITCHER.character.socialStanding": "Social Standing", + "WITCHER.socialStanding.equal": "Equal", + "WITCHER.socialStanding.tolerated": "Tolerated", + "WITCHER.socialStanding.hated": "Hated", + "WITCHER.socialStanding.feared": "Feared", + "WITCHER.socialStanding.hatedFeared": "Hated & Feared", + + + "WITCHER.socialStanding.north": "The North", + "WITCHER.socialStanding.nilfgaard": "Nilfgaard", + "WITCHER.socialStanding.skellige": "Skellige", + "WITCHER.socialStanding.dolBlathanna": "Dol Blathanna", + "WITCHER.socialStanding.mahakam": "Mahakam" } \ No newline at end of file diff --git a/module/sheets/WitcherActorSheet.js b/module/sheets/WitcherActorSheet.js index 67abc736..34238360 100644 --- a/module/sheets/WitcherActorSheet.js +++ b/module/sheets/WitcherActorSheet.js @@ -1,6 +1,6 @@ import { buttonDialog, rollDamage } from "../chat.js"; import { witcher } from "../config.js"; -import { getRandomInt, updateDerived, rollSkillCheck, genId, calc_currency_weight } from "../witcher.js"; +import { getRandomInt, updateDerived, rollSkillCheck, genId, calc_currency_weight, addModifiers } from "../witcher.js"; import { exportLoot, onChangeSkillList } from "./MonsterSheet.js"; import { ExecuteDefense } from "../../scripts/actions.js"; @@ -198,6 +198,7 @@ export default class WitcherActorSheet extends ActorSheet { html.find(".profession-roll").on("click", this._onProfessionRoll.bind(this)); html.find(".spell-roll").on("click", this._onSpellRoll.bind(this)); html.find(".alchemy-potion").on("click", this._alchemyCraft.bind(this)); + html.find(".crafting-craft").on("click", this._craftinCraft.bind(this)); html.find(".add-crit").on("click", this._onCritAdd.bind(this)); html.find(".delete-crit").on("click", this._onCritRemove.bind(this)); @@ -1038,6 +1039,8 @@ export default class WitcherActorSheet extends ActorSheet { let hasDiagram = html.find("[name=hasDiagram]").prop("checked"); skillName = skillName.replace(" (2)", ""); messageData.flavor = `

${game.i18n.localize("WITCHER.Dialog.CraftingAlchemycal")}

`, + messageData.flavor += ` ${item.data.name}
`, + messageData.flavor += ` ${item.data.data.craftingTime}
`, messageData.flavor += `${game.i18n.localize("WITCHER.Diagram.alchemyDC")} ${item.data.data.alchemyDC}`; if (!item.data.data.alchemyDC || item.data.data.alchemyDC == 0){ @@ -1052,15 +1055,74 @@ export default class WitcherActorSheet extends ActorSheet { rollFormula += !displayRollDetails ? `+2`:`+2[${game.i18n.localize("WITCHER.Dialog.Diagram")}]` } - let totalModifiers = 0 - this.actor.data.data.skills.cra.alchemy.modifiers.forEach(item => totalModifiers += Number(item.value)); - if (totalModifiers < 0){ - rollFormula += !displayRollDetails ? `${totalModifiers}` : `${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } - if (totalModifiers > 0){ - rollFormula += !displayRollDetails ? `+${totalModifiers}`: `+${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` + rollFormula = addModifiers(this.actor.data.data.skills.cra.alchemy.modifiers, rollFormula) + + let roll = await new Roll(rollFormula).roll() + if (roll.dice[0].results[0].result == 10){ + messageData.flavor += `
${game.i18n.localize("WITCHER.Crit")}
`; + }; + if (roll.dice[0].results[0].result == 1){ + messageData.flavor += `
${game.i18n.localize("WITCHER.Fumble")}
`; + }; + roll.toMessage(messageData); + } + } + }}).render(true) + } + + async _craftinCraft(event) { + let displayRollDetails = game.settings.get("TheWitcherTRPG", "displayRollsDetails") + let itemId = event.currentTarget.closest(".item").dataset.itemId; + let item = this.actor.items.get(itemId); + + let content = `
`; + + let messageData = { + speaker: {alias: this.actor.name}, + flavor: `

Crafting

`, + } + + + content += `
` + item.data.data.craftingComponents.forEach(element => { + content += `
${element.name}(${element.quantity})
` + let ownedComponent = this.actor.items.filter(function(item) {return item.type=="component" && item.name == element.name}); + let componentQuantity = ownedComponent.sum("quantity"); + if (componentQuantity < Number(element.quantity)) { + let missing = element.quantity - Number(componentQuantity) + content += `${game.i18n.localize("WITCHER.Dialog.NoComponents")}: ${missing} ${element.name}
` + } + }); + content += `
` + + content += `
` + + new Dialog({ + title: `${game.i18n.localize("WITCHER.Dialog.CraftingTitle")}`, + content, + buttons: { + Craft: { + label: `${game.i18n.localize("WITCHER.Dialog.ButtonCraft")}`, + callback: async html => { + let stat = this.actor.data.data.stats.cra.current; + let statName = game.i18n.localize(this.actor.data.data.stats.cra.label); + let skill = this.actor.data.data.skills.cra.crafting.value; + let skillName = game.i18n.localize(this.actor.data.data.skills.cra.crafting.label); + let hasDiagram = html.find("[name=hasDiagram]").prop("checked"); + skillName = skillName.replace(" (2)", ""); + messageData.flavor = `

${game.i18n.localize("WITCHER.Dialog.CraftingItem")}

`, + messageData.flavor += ` ${item.data.name}
`, + messageData.flavor += ` ${item.data.data.craftingTime}
`, + messageData.flavor += `${game.i18n.localize("WITCHER.Diagram.craftingDC")} ${item.data.data.craftingDC}`; + + let rollFormula = !displayRollDetails ? `1d10+${stat}+${skill}` : `1d10+${stat}[${statName}]+${skill}[${skillName}]` ; + + if (hasDiagram) { + rollFormula += !displayRollDetails ? `+2`:`+2[${game.i18n.localize("WITCHER.Dialog.Diagram")}]` } + rollFormula = addModifiers(this.actor.data.data.skills.cra.crafting.modifiers, rollFormula) + let roll = await new Roll(rollFormula).roll() if (roll.dice[0].results[0].result == 10){ messageData.flavor += `
${game.i18n.localize("WITCHER.Crit")}
`; @@ -1587,25 +1649,25 @@ export default class WitcherActorSheet extends ActorSheet { let vcSkill; let vcDmg; let effect; - let totalModifiers = 0; + let modifiers; switch(verbal){ case "Seduce": - vcName = "WITCHER.verbalCombat.Seduce"; - vcStatName = "WITCHER.Actor.Stat.Emp"; - vcStat = this.actor.data.data.stats.emp.current; - vcSkillName = "WITCHER.SkEmpSeduction"; - vcSkill = this.actor.data.data.skills.emp.seduction.value; - this.actor.data.data.skills.emp.seduction.modifiers.forEach(item => totalModifiers += Number(item.value)); - vcDmg = `1d6+${this.actor.data.data.stats.emp.current}[${game.i18n.localize(vcStatName)}]` - effect = "WITCHER.verbalCombat.SeduceEffect" - break; + vcName = "WITCHER.verbalCombat.Seduce"; + vcStatName = "WITCHER.Actor.Stat.Emp"; + vcStat = this.actor.data.data.stats.emp.current; + vcSkillName = "WITCHER.SkEmpSeduction"; + vcSkill = this.actor.data.data.skills.emp.seduction.value; + modifiers = this.actor.data.data.skills.emp.seduction.modifiers + vcDmg = `1d6+${this.actor.data.data.stats.emp.current}[${game.i18n.localize(vcStatName)}]` + effect = "WITCHER.verbalCombat.SeduceEffect" + break; case "Persuade": vcName = "WITCHER.verbalCombat.Persuade"; vcStatName = "WITCHER.Actor.Stat.Emp"; vcStat = this.actor.data.data.stats.emp.current; vcSkillName = "WITCHER.SkEmpPersuasion"; vcSkill = this.actor.data.data.skills.emp.persuasion.value; - this.actor.data.data.skills.emp.persuasion.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.emp.persuasion.modifiers; vcDmg = `1d6/2+${this.actor.data.data.stats.emp.current}[${game.i18n.localize(vcStatName)}]` effect = "WITCHER.verbalCombat.PersuadeEffect" break; @@ -1615,7 +1677,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.emp.current; vcSkillName = "WITCHER.SkEmpLeadership"; vcSkill = this.actor.data.data.skills.emp.leadership.value; - this.actor.data.data.skills.emp.leadership.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.emp.leadership.modifiers; vcDmg = `1d10+${this.actor.data.data.stats.emp.current}[${game.i18n.localize(vcStatName)}]` effect = "WITCHER.verbalCombat.AppealEffect" break; @@ -1625,7 +1687,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.emp.current; vcSkillName = "WITCHER.SkEmpCharisma"; vcSkill = this.actor.data.data.skills.emp.charisma.value; - this.actor.data.data.skills.emp.charisma.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.emp.charisma.modifiers; vcDmg = `1d6+${this.actor.data.data.stats.emp.current}[${game.i18n.localize(vcStatName)}]` effect = "WITCHER.verbalCombat.BefriendEffect" break; @@ -1635,7 +1697,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.emp.current; vcSkillName = "WITCHER.SkEmpDeceit"; vcSkill = this.actor.data.data.skills.emp.deceit.value; - this.actor.data.data.skills.emp.deceit.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.emp.deceit.modifiers; vcDmg = `1d6+${this.actor.data.data.stats.int.current}[${game.i18n.localize("WITCHER.Actor.Stat.Int")}]` effect = "WITCHER.verbalCombat.DeceiveEffect" break; @@ -1645,7 +1707,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.int.current; vcSkillName = "WITCHER.SkIntSocialEt"; vcSkill = this.actor.data.data.skills.int.socialetq.value; - this.actor.data.data.skills.int.socialetq.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.int.socialetq.modifiers; vcDmg = `1d6+${this.actor.data.data.stats.will.current}[${game.i18n.localize("WITCHER.Actor.Stat.Will")}]` effect = "WITCHER.verbalCombat.RidiculeEffect" break; @@ -1655,7 +1717,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.will.current; vcSkillName = "WITCHER.SkWillIntim"; vcSkill = this.actor.data.data.skills.will.intimidation.value; - this.actor.data.data.skills.will.intimidation.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.will.intimidation.modifiers; vcDmg = `1d10+${this.actor.data.data.stats.will.current}[${game.i18n.localize("WITCHER.Actor.Stat.Will")}]` effect = "WITCHER.verbalCombat.IntimidateEffect" break; @@ -1665,7 +1727,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.will.current; vcSkillName = "WITCHER.SkWillResistCoer"; vcSkill = this.actor.data.data.skills.will.resistcoerc.value; - this.actor.data.data.skills.will.resistcoerc.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.will.resistcoerc.modifiers; vcDmg = `1d10+${this.actor.data.data.stats.emp.current}[${game.i18n.localize("WITCHER.Actor.Stat.Emp")}]` effect = "WITCHER.verbalCombat.None" break; @@ -1684,7 +1746,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.emp.current; vcSkillName = "WITCHER.SkEmpPersuasion"; vcSkill = this.actor.data.data.skills.emp.persuasion.value; - this.actor.data.data.skills.emp.persuasion.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.emp.persuasion.modifiers; vcDmg = `1d6+${this.actor.data.data.stats.int.current}[${game.i18n.localize("WITCHER.Actor.Stat.Int")}]` effect = "WITCHER.verbalCombat.None" break; @@ -1694,7 +1756,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.will.current; vcSkillName = "WITCHER.SkWillResistCoer"; vcSkill = this.actor.data.data.skills.will.resistcoerc.value; - this.actor.data.data.skills.will.resistcoerc.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.will.resistcoerc.modifiers; vcDmg = game.i18n.localize("WITCHER.verbalCombat.None") effect = "WITCHER.verbalCombat.DisengageEffect" break; @@ -1704,7 +1766,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.emp.current; vcSkillName = "WITCHER.SkEmpCharisma"; vcSkill = this.actor.data.data.skills.emp.charisma.value; - this.actor.data.data.skills.emp.charisma.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.emp.charisma.modifiers; vcDmg = game.i18n.localize("WITCHER.verbalCombat.None") effect = "WITCHER.verbalCombat.RomanceEffect" break; @@ -1714,7 +1776,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.emp.current; vcSkillName = "WITCHER.SkEmpHumanPerc"; vcSkill = this.actor.data.data.skills.emp.perception.value; - this.actor.data.data.skills.emp.perception.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.emp.perception.modifiers; vcDmg = game.i18n.localize("WITCHER.verbalCombat.None") effect = "WITCHER.verbalCombat.StudyEffect" break; @@ -1724,7 +1786,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.emp.current; vcSkillName = "WITCHER.SkEmpPersuasion"; vcSkill = this.actor.data.data.skills.emp.persuasion.value; - this.actor.data.data.skills.emp.persuasion.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.emp.persuasion.modifiers; vcDmg = game.i18n.localize("WITCHER.verbalCombat.None") effect = "WITCHER.verbalCombat.ImplyEffect" break; @@ -1734,7 +1796,7 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.emp.current; vcSkillName = "WITCHER.SkEmpDeceit"; vcSkill = this.actor.data.data.skills.emp.deceit.value; - this.actor.data.data.skills.emp.deceit.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.emp.deceit.modifiers; vcDmg = game.i18n.localize("WITCHER.verbalCombat.None") effect = "WITCHER.verbalCombat.ImplyEffect" break; @@ -1744,15 +1806,15 @@ export default class WitcherActorSheet extends ActorSheet { vcStat = this.actor.data.data.stats.emp.current; vcSkillName = "WITCHER.SkEmpGambling"; vcSkill = this.actor.data.data.skills.emp.gambling.value; - this.actor.data.data.skills.emp.gambling.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.emp.gambling.modifiers; vcDmg = game.i18n.localize("WITCHER.verbalCombat.None") effect = "WITCHER.verbalCombat.BribeEffect" break; } let rollFormula = !displayRollDetails ? `1d10+${vcStat}+${vcSkill}`: `1d10+${vcStat}[${game.i18n.localize(vcStatName)}]+${vcSkill}[${game.i18n.localize(vcSkillName)}]` - if(totalModifiers != 0){ - rollFormula += !displayRollDetails ? `+${totalModifiers}`: `+${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } + + rollFormula = addModifiers(modifiers, rollFormula) + let customAtt = html.find("[name=customModifiers]")[0].value; if (customAtt < 0){ rollFormula += !displayRollDetails ? `${customAtt}`: `${customAtt}[${game.i18n.localize("WITCHER.Settings.Custom")}]` @@ -2260,48 +2322,48 @@ export default class WitcherActorSheet extends ActorSheet { if (isSilhouetted) { attFormula += "+2"; } if (isAiming) { attFormula += `+${customAim}`} - let totalModifiers = 0; + let modifiers; switch(item.data.data.attackSkill){ case "Brawling": attFormula += !displayRollDetails ? `+${this.actor.data.data.stats.ref.current}+${this.actor.data.data.skills.ref.brawling.value}`: `+${this.actor.data.data.stats.ref.current}[${game.i18n.localize("WITCHER.Actor.Stat.Ref")}]+${this.actor.data.data.skills.ref.brawling.value}[${game.i18n.localize("WITCHER.SkRefBrawling")}]`; - this.actor.data.data.skills.ref.brawling.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.ref.brawling.modifiers; break; case "Melee": attFormula += !displayRollDetails ? `+${this.actor.data.data.stats.ref.current}+${this.actor.data.data.skills.ref.melee.value}`: `+${this.actor.data.data.stats.ref.current}[${game.i18n.localize("WITCHER.Actor.Stat.Ref")}]+${this.actor.data.data.skills.ref.melee.value}[${game.i18n.localize("WITCHER.SkRefMelee")}]`; - this.actor.data.data.skills.ref.melee.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.ref.melee.modifiers; break; case "Small Blades": attFormula += !displayRollDetails ? `+${this.actor.data.data.stats.ref.current}+${this.actor.data.data.skills.ref.smallblades.value}`: `+${this.actor.data.data.stats.ref.current}[${game.i18n.localize("WITCHER.Actor.Stat.Ref")}]+${this.actor.data.data.skills.ref.smallblades.value}[${game.i18n.localize("WITCHER.SkRefSmall")}]`; - this.actor.data.data.skills.ref.smallblades.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.ref.smallblades.modifiers; break; case "Staff/Spear": attFormula += !displayRollDetails ? `+${this.actor.data.data.stats.ref.current}+${this.actor.data.data.skills.ref.staffspear.value}`: `+${this.actor.data.data.stats.ref.current}[${game.i18n.localize("WITCHER.Actor.Stat.Ref")}]+${this.actor.data.data.skills.ref.staffspear.value}[${game.i18n.localize("WITCHER.SkRefStaff")}]`; - this.actor.data.data.skills.ref.staffspear.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.ref.staffspear.modifiers; break; case "Swordsmanship": attFormula += !displayRollDetails ? `+${this.actor.data.data.stats.ref.current}+${this.actor.data.data.skills.ref.swordsmanship.value}`: `+${this.actor.data.data.stats.ref.current}[${game.i18n.localize("WITCHER.Actor.Stat.Ref")}]+${this.actor.data.data.skills.ref.swordsmanship.value}[${game.i18n.localize("WITCHER.SkRefSwordmanship")}]`; - this.actor.data.data.skills.ref.swordsmanship.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.ref.swordsmanship.modifiers; break; case "Archery": attFormula += !displayRollDetails ? `+${this.actor.data.data.stats.dex.current}+${this.actor.data.data.skills.dex.archery.value}`: `+${this.actor.data.data.stats.dex.current}[${game.i18n.localize("WITCHER.Actor.Stat.Dex")}]+${this.actor.data.data.skills.dex.archery.value}[${game.i18n.localize("WITCHER.SkDexArchery")}]`; - this.actor.data.data.skills.dex.archery.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.dex.archery.modifiers; break; case "Athletics": attFormula += !displayRollDetails ? `+${this.actor.data.data.stats.dex.current}+${this.actor.data.data.skills.dex.athletics.value}`: `+${this.actor.data.data.stats.dex.current}[${game.i18n.localize("WITCHER.Actor.Stat.Dex")}]+${this.actor.data.data.skills.dex.athletics.value}[${game.i18n.localize("WITCHER.SkDexAthletics")}]`; - this.actor.data.data.skills.dex.athletics.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.dex.athletics.modifiers; break; case "Crossbow": attFormula += !displayRollDetails ? `+${this.actor.data.data.stats.dex.current}+${this.actor.data.data.skills.dex.crossbow.value}`: `+${this.actor.data.data.stats.dex.current}[${game.i18n.localize("WITCHER.Actor.Stat.Dex")}]+${this.actor.data.data.skills.dex.crossbow.value}[${game.i18n.localize("WITCHER.SkDexCrossbow")}]`; - this.actor.data.data.skills.dex.crossbow.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = this.actor.data.data.skills.dex.crossbow.modifiers; break; } @@ -2434,12 +2496,7 @@ export default class WitcherActorSheet extends ActorSheet { attFormula = !displayRollDetails ? `${attFormula}-3`: `${attFormula}-3[${game.i18n.localize("WITCHER.Dialog.attackStrike")}]`; } - if (totalModifiers < 0){ - attFormula += !displayRollDetails ? `${totalModifiers}` : `${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } - if (totalModifiers > 0){ - attFormula += !displayRollDetails ? `+${totalModifiers}`: `+${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } + attFormula = addModifiers(modifiers, attFormula) let allEffects = item.data.data.effects if (ammunition){ diff --git a/module/witcher.js b/module/witcher.js index 52ecaa0b..edb2c13c 100644 --- a/module/witcher.js +++ b/module/witcher.js @@ -2,7 +2,6 @@ export function getRandomInt(max) { return Math.floor(Math.random() * (max + 1)) + 1; } - /* On any change to the Stats, the Derived Stats need to be updated appropriately. The base = Will+Body/2. HP and Stamina = base * 5. Recovery and Stun = base. Stun can be a maximum of 10. Encumbrance = Body*10. Run = Speed*3. Leap = Run/5. Punch and Kick bonuses are determined @@ -328,20 +327,28 @@ function rollSkillCheck(thisActor, statNum, skillNum){ skill = array[1]; skillName = skillName.replace(" (2)", ""); let messageData = { - speaker: {alias: thisActor.name}, - flavor: `${parentStat}: ${skillName} Check`, + speaker: {alias: thisActor.name}, + flavor: `${parentStat}: ${skillName} Check`, } let rollFormula = !displayRollDetails ? `1d10+${stat}+${skill}` : `1d10+${stat}[${parentStat}]+${skill}[${skillName}]` ; + if (statNum == 4 && (skillNum == 0 || skillNum == 6 || skillNum == 7 || skillNum == 9)){ + if (thisActor.data.data.general.socialStanding == "tolerated") { + rollFormula += !displayRollDetails ? `-1` : `-1[${game.i18n.localize("WITCHER.socialStanding.tolerated")}]` ; + } else if (thisActor.data.data.general.socialStanding == "hated" || thisActor.data.data.general.socialStanding == "hatedFeared") { + rollFormula += !displayRollDetails ? `-2` : `-2[${game.i18n.localize("WITCHER.socialStanding.hated")}]` ; + } + } + if (statNum == 4 && skillNum == 0 && (thisActor.data.data.general.socialStanding == "feared" || thisActor.data.data.general.socialStanding == "hatedFeared")){ + rollFormula += !displayRollDetails ? `-1` : `-1[${game.i18n.localize("WITCHER.socialStanding.feared")}]` ; + } + if (statNum == 6 && skillNum == 2 && (thisActor.data.data.general.socialStanding == "feared" || thisActor.data.data.general.socialStanding == "hatedFeared")){ + rollFormula += !displayRollDetails ? `+1` : `+1[${game.i18n.localize("WITCHER.socialStanding.feared")}]` ; + } + + if (array[2]) { - let totalModifiers = 0; - array[2].forEach(item => totalModifiers += Number(item.value)); - if (totalModifiers < 0){ - rollFormula += !displayRollDetails ? `${totalModifiers}` : `${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } - if (totalModifiers > 0){ - rollFormula += !displayRollDetails ? `+${totalModifiers}`: `+${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } + rollFormula = addModifiers(array[2], rollFormula) } let activeEffects = thisActor.items.filter(function(item) {return item.type=="effect"}); @@ -420,111 +427,111 @@ function getIntSkillMod(actor, skillNum){ } function getRefSkillMod(actor, skillNum){ - switch(skillNum){ - case 0: - return [game.i18n.localize("WITCHER.SkRefBrawling"), actor.data.data.skills.ref.brawling.value, actor.data.data.skills.ref.brawling.modifiers] - case 1: - return [game.i18n.localize("WITCHER.SkRefDodge"), actor.data.data.skills.ref.dodge.value, actor.data.data.skills.ref.dodge.modifiers] - case 2: - return [game.i18n.localize("WITCHER.SkRefMelee"), actor.data.data.skills.ref.melee.value, actor.data.data.skills.ref.melee.modifiers] - case 3: - return [game.i18n.localize("WITCHER.SkRefRiding"), actor.data.data.skills.ref.riding.value, actor.data.data.skills.ref.riding.modifiers] - case 4: - return [game.i18n.localize("WITCHER.SkRefSailing"), actor.data.data.skills.ref.sailing.value, actor.data.data.skills.ref.sailing.modifiers] - case 5: - return [game.i18n.localize("WITCHER.SkRefSmall"), actor.data.data.skills.ref.smallblades.value, actor.data.data.skills.ref.smallblades.modifiers] - case 6: - return [game.i18n.localize("WITCHER.SkRefStaff"), actor.data.data.skills.ref.staffspear.value, actor.data.data.skills.ref.staffspear.modifiers] - case 7: - return [game.i18n.localize("WITCHER.SkRefSwordmanship"), actor.data.data.skills.ref.swordsmanship.value, actor.data.data.skills.ref.swordsmanship.modifiers] - } + switch(skillNum){ + case 0: + return [game.i18n.localize("WITCHER.SkRefBrawling"), actor.data.data.skills.ref.brawling.value, actor.data.data.skills.ref.brawling.modifiers] + case 1: + return [game.i18n.localize("WITCHER.SkRefDodge"), actor.data.data.skills.ref.dodge.value, actor.data.data.skills.ref.dodge.modifiers] + case 2: + return [game.i18n.localize("WITCHER.SkRefMelee"), actor.data.data.skills.ref.melee.value, actor.data.data.skills.ref.melee.modifiers] + case 3: + return [game.i18n.localize("WITCHER.SkRefRiding"), actor.data.data.skills.ref.riding.value, actor.data.data.skills.ref.riding.modifiers] + case 4: + return [game.i18n.localize("WITCHER.SkRefSailing"), actor.data.data.skills.ref.sailing.value, actor.data.data.skills.ref.sailing.modifiers] + case 5: + return [game.i18n.localize("WITCHER.SkRefSmall"), actor.data.data.skills.ref.smallblades.value, actor.data.data.skills.ref.smallblades.modifiers] + case 6: + return [game.i18n.localize("WITCHER.SkRefStaff"), actor.data.data.skills.ref.staffspear.value, actor.data.data.skills.ref.staffspear.modifiers] + case 7: + return [game.i18n.localize("WITCHER.SkRefSwordmanship"), actor.data.data.skills.ref.swordsmanship.value, actor.data.data.skills.ref.swordsmanship.modifiers] + } } function getDexSkillMod(actor, skillNum){ - switch(skillNum){ - case 0: - return [game.i18n.localize("WITCHER.SkDexArchery"), actor.data.data.skills.dex.archery.value, actor.data.data.skills.dex.archery.modifiers] - case 1: - return [game.i18n.localize("WITCHER.SkDexAthletics"), actor.data.data.skills.dex.athletics.value, actor.data.data.skills.dex.athletics.modifiers] - case 2: - return [game.i18n.localize("WITCHER.SkDexCrossbow"), actor.data.data.skills.dex.crossbow.value, actor.data.data.skills.dex.crossbow.modifiers] - case 3: - return [game.i18n.localize("WITCHER.SkDexSleight"), actor.data.data.skills.dex.sleight.value, actor.data.data.skills.dex.sleight.modifiers] - case 4: - return [game.i18n.localize("WITCHER.SkDexStealth"), actor.data.data.skills.dex.stealth.value, actor.data.data.skills.dex.stealth.modifiers] - } + switch(skillNum){ + case 0: + return [game.i18n.localize("WITCHER.SkDexArchery"), actor.data.data.skills.dex.archery.value, actor.data.data.skills.dex.archery.modifiers] + case 1: + return [game.i18n.localize("WITCHER.SkDexAthletics"), actor.data.data.skills.dex.athletics.value, actor.data.data.skills.dex.athletics.modifiers] + case 2: + return [game.i18n.localize("WITCHER.SkDexCrossbow"), actor.data.data.skills.dex.crossbow.value, actor.data.data.skills.dex.crossbow.modifiers] + case 3: + return [game.i18n.localize("WITCHER.SkDexSleight"), actor.data.data.skills.dex.sleight.value, actor.data.data.skills.dex.sleight.modifiers] + case 4: + return [game.i18n.localize("WITCHER.SkDexStealth"), actor.data.data.skills.dex.stealth.value, actor.data.data.skills.dex.stealth.modifiers] + } } function getBodySkillMod(actor, skillNum){ - switch(skillNum){ - case 0: - return [game.i18n.localize("WITCHER.SkBodyPhys"), actor.data.data.skills.body.physique.value, actor.data.data.skills.body.physique.modifiers] - case 1: - return [game.i18n.localize("WITCHER.SkBodyEnd"), actor.data.data.skills.body.endurance.value, actor.data.data.skills.body.endurance.modifiers] - } + switch(skillNum){ + case 0: + return [game.i18n.localize("WITCHER.SkBodyPhys"), actor.data.data.skills.body.physique.value, actor.data.data.skills.body.physique.modifiers] + case 1: + return [game.i18n.localize("WITCHER.SkBodyEnd"), actor.data.data.skills.body.endurance.value, actor.data.data.skills.body.endurance.modifiers] + } } function getEmpSkillMod(actor, skillNum){ - switch(skillNum){ - case 0: - return [game.i18n.localize("WITCHER.SkEmpCharisma"), actor.data.data.skills.emp.charisma.value, actor.data.data.skills.emp.charisma.modifiers] - case 1: - return [game.i18n.localize("WITCHER.SkEmpDeceit"), actor.data.data.skills.emp.deceit.value, actor.data.data.skills.emp.deceit.modifiers] - case 2: - return [game.i18n.localize("WITCHER.SkEmpArts"), actor.data.data.skills.emp.finearts.value, actor.data.data.skills.emp.finearts.modifiers] - case 3: - return [game.i18n.localize("WITCHER.SkEmpGambling"), actor.data.data.skills.emp.gambling.value, actor.data.data.skills.emp.gambling.modifiers] - case 4: - return [game.i18n.localize("WITCHER.SkEmpGrooming"), actor.data.data.skills.emp.grooming.value, actor.data.data.skills.emp.grooming.modifiers] - case 5: - return [game.i18n.localize("WITCHER.SkEmpHumanPerc"), actor.data.data.skills.emp.perception.value, actor.data.data.skills.emp.perception.modifiers] - case 6: - return [game.i18n.localize("WITCHER.SkEmpLeadership"), actor.data.data.skills.emp.leadership.value, actor.data.data.skills.emp.leadership.modifiers] - case 7: - return [game.i18n.localize("WITCHER.SkEmpPersuasion"), actor.data.data.skills.emp.persuasion.value, actor.data.data.skills.emp.persuasion.modifiers] - case 8: - return [game.i18n.localize("WITCHER.SkEmpPerformance"), actor.data.data.skills.emp.performance.value, actor.data.data.skills.emp.performance.modifiers] - case 9: - return [game.i18n.localize("WITCHER.SkEmpSeduction"), actor.data.data.skills.emp.seduction.value, actor.data.data.skills.emp.seduction.modifiers] - } + switch(skillNum){ + case 0: + return [game.i18n.localize("WITCHER.SkEmpCharisma"), actor.data.data.skills.emp.charisma.value, actor.data.data.skills.emp.charisma.modifiers] + case 1: + return [game.i18n.localize("WITCHER.SkEmpDeceit"), actor.data.data.skills.emp.deceit.value, actor.data.data.skills.emp.deceit.modifiers] + case 2: + return [game.i18n.localize("WITCHER.SkEmpArts"), actor.data.data.skills.emp.finearts.value, actor.data.data.skills.emp.finearts.modifiers] + case 3: + return [game.i18n.localize("WITCHER.SkEmpGambling"), actor.data.data.skills.emp.gambling.value, actor.data.data.skills.emp.gambling.modifiers] + case 4: + return [game.i18n.localize("WITCHER.SkEmpGrooming"), actor.data.data.skills.emp.grooming.value, actor.data.data.skills.emp.grooming.modifiers] + case 5: + return [game.i18n.localize("WITCHER.SkEmpHumanPerc"), actor.data.data.skills.emp.perception.value, actor.data.data.skills.emp.perception.modifiers] + case 6: + return [game.i18n.localize("WITCHER.SkEmpLeadership"), actor.data.data.skills.emp.leadership.value, actor.data.data.skills.emp.leadership.modifiers] + case 7: + return [game.i18n.localize("WITCHER.SkEmpPersuasion"), actor.data.data.skills.emp.persuasion.value, actor.data.data.skills.emp.persuasion.modifiers] + case 8: + return [game.i18n.localize("WITCHER.SkEmpPerformance"), actor.data.data.skills.emp.performance.value, actor.data.data.skills.emp.performance.modifiers] + case 9: + return [game.i18n.localize("WITCHER.SkEmpSeduction"), actor.data.data.skills.emp.seduction.value, actor.data.data.skills.emp.seduction.modifiers] + } } function getCraSkillMod(actor, skillNum){ - switch(skillNum){ - case 0: - return [game.i18n.localize("WITCHER.SkCraAlchemy"), actor.data.data.skills.cra.alchemy.value, actor.data.data.skills.cra.alchemy.modifiers] - case 1: - return [game.i18n.localize("WITCHER.SkCraCrafting"), actor.data.data.skills.cra.crafting.value, actor.data.data.skills.cra.crafting.modifiers] - case 2: - return [game.i18n.localize("WITCHER.SkCraDisguise"), actor.data.data.skills.cra.disguise.value, actor.data.data.skills.cra.disguise.modifiers] - case 3: - return [game.i18n.localize("WITCHER.SkCraAid"), actor.data.data.skills.cra.firstaid.value, actor.data.data.skills.cra.firstaid.modifiers] - case 4: - return [game.i18n.localize("WITCHER.SkCraForge"), actor.data.data.skills.cra.forgery.value, actor.data.data.skills.cra.forgery.modifiers] - case 5: - return [game.i18n.localize("WITCHER.SkCraPick"), actor.data.data.skills.cra.picklock.value, actor.data.data.skills.cra.picklock.modifiers] - case 6: - return [game.i18n.localize("WITCHER.SkCraTrapCraft"), actor.data.data.skills.cra.trapcraft.value, actor.data.data.skills.cra.trapcraft.modifiers] - } + switch(skillNum){ + case 0: + return [game.i18n.localize("WITCHER.SkCraAlchemy"), actor.data.data.skills.cra.alchemy.value, actor.data.data.skills.cra.alchemy.modifiers] + case 1: + return [game.i18n.localize("WITCHER.SkCraCrafting"), actor.data.data.skills.cra.crafting.value, actor.data.data.skills.cra.crafting.modifiers] + case 2: + return [game.i18n.localize("WITCHER.SkCraDisguise"), actor.data.data.skills.cra.disguise.value, actor.data.data.skills.cra.disguise.modifiers] + case 3: + return [game.i18n.localize("WITCHER.SkCraAid"), actor.data.data.skills.cra.firstaid.value, actor.data.data.skills.cra.firstaid.modifiers] + case 4: + return [game.i18n.localize("WITCHER.SkCraForge"), actor.data.data.skills.cra.forgery.value, actor.data.data.skills.cra.forgery.modifiers] + case 5: + return [game.i18n.localize("WITCHER.SkCraPick"), actor.data.data.skills.cra.picklock.value, actor.data.data.skills.cra.picklock.modifiers] + case 6: + return [game.i18n.localize("WITCHER.SkCraTrapCraft"), actor.data.data.skills.cra.trapcraft.value, actor.data.data.skills.cra.trapcraft.modifiers] + } } function getWillSkillMod(actor, skillNum){ - switch(skillNum){ - case 0: - return [game.i18n.localize("WITCHER.SkWillCourage"), actor.data.data.skills.will.courage.value, actor.data.data.skills.will.courage.modifiers] - case 1: - return [game.i18n.localize("WITCHER.SkWillHex"), actor.data.data.skills.will.hexweave.value, actor.data.data.skills.will.hexweave.modifiers] - case 2: - return [game.i18n.localize("WITCHER.SkWillIntim"), actor.data.data.skills.will.intimidation.value, actor.data.data.skills.will.intimidation.modifiers] - case 3: - return [game.i18n.localize("WITCHER.SkWillSpellcast"), actor.data.data.skills.will.spellcast.value, actor.data.data.skills.will.spellcast.modifiers] - case 4: - return [game.i18n.localize("WITCHER.SkWillResistMag"), actor.data.data.skills.will.resistmagic.value, actor.data.data.skills.will.resistmagic.modifiers] - case 5: - return [game.i18n.localize("WITCHER.SkWillResistCoer"), actor.data.data.skills.will.resistcoerc.value, actor.data.data.skills.will.resistcoerc.modifiers] - case 6: - return [game.i18n.localize("WITCHER.SkWillRitCraft"), actor.data.data.skills.will.ritcraft.value, actor.data.data.skills.will.ritcraft.modifiers] - } + switch(skillNum){ + case 0: + return [game.i18n.localize("WITCHER.SkWillCourage"), actor.data.data.skills.will.courage.value, actor.data.data.skills.will.courage.modifiers] + case 1: + return [game.i18n.localize("WITCHER.SkWillHex"), actor.data.data.skills.will.hexweave.value, actor.data.data.skills.will.hexweave.modifiers] + case 2: + return [game.i18n.localize("WITCHER.SkWillIntim"), actor.data.data.skills.will.intimidation.value, actor.data.data.skills.will.intimidation.modifiers] + case 3: + return [game.i18n.localize("WITCHER.SkWillSpellcast"), actor.data.data.skills.will.spellcast.value, actor.data.data.skills.will.spellcast.modifiers] + case 4: + return [game.i18n.localize("WITCHER.SkWillResistMag"), actor.data.data.skills.will.resistmagic.value, actor.data.data.skills.will.resistmagic.modifiers] + case 5: + return [game.i18n.localize("WITCHER.SkWillResistCoer"), actor.data.data.skills.will.resistcoerc.value, actor.data.data.skills.will.resistcoerc.modifiers] + case 6: + return [game.i18n.localize("WITCHER.SkWillRitCraft"), actor.data.data.skills.will.ritcraft.value, actor.data.data.skills.will.ritcraft.modifiers] + } } function genId() { @@ -546,4 +553,17 @@ function calc_currency_weight(currency) { return Number(totalPieces * 0.001) } -export { updateDerived, rollSkillCheck, genId, calc_currency_weight}; \ No newline at end of file +function addModifiers(modifiers, formula) { + let displayRollDetails = game.settings.get("TheWitcherTRPG", "displayRollsDetails") + modifiers.forEach(item => { + if (item.value < 0){ + formula += !displayRollDetails ? `${item.value}` : `${item.value}[${item.name}]` + } + if (item.value > 0){ + formula += !displayRollDetails ? `+${item.value}`: `+${item.value}[${item.name}]` + } + }); + return formula; + } + +export { updateDerived, rollSkillCheck, genId, calc_currency_weight, addModifiers}; \ No newline at end of file diff --git a/scripts/actions.js b/scripts/actions.js index 0aa89393..1647e123 100644 --- a/scripts/actions.js +++ b/scripts/actions.js @@ -1,5 +1,6 @@ -import {witcher} from "../module/config.js"; +import { witcher } from "../module/config.js"; import { buttonDialog } from "../module/chat.js"; +import { addModifiers } from "../module/witcher.js"; async function ApplyDamage(actor, dmgType, location, totalDamage){ let armors = actor.items.filter(function(item) {return item.type=="armor" && item.data.data.equiped}) @@ -495,14 +496,7 @@ function ExecuteDefense(actor){ rollFormula += !displayFormula ? `+${customDef}`: `+${customDef}[${game.i18n.localize("WITCHER.Settings.Custom")}]` ; } - let totalModifiers = 0; - actor.data.data.skills.ref.dodge.modifiers.forEach(item => totalModifiers += Number(item.value)); - if (totalModifiers < 0){ - rollFormula += !displayRollDetails ? `${totalModifiers}` : `${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } - if (totalModifiers > 0){ - rollFormula += !displayRollDetails ? `+${totalModifiers}`: `+${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } + rollFormula = addModifiers(actor.data.data.skills.ref.dodge.modifiers, rollFormula) let roll = await new Roll(rollFormula).roll() if (roll.dice[0].results[0].result == 10){ @@ -538,15 +532,7 @@ function ExecuteDefense(actor){ rollFormula += !displayFormula ? `+${customDef}`: `+${customDef}[${game.i18n.localize("WITCHER.Settings.Custom")}]` ; } - - let totalModifiers = 0; - actor.data.data.skills.dex.athletics.modifiers.forEach(item => totalModifiers += Number(item.value)); - if (totalModifiers < 0){ - rollFormula += !displayRollDetails ? `${totalModifiers}` : `${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } - if (totalModifiers > 0){ - rollFormula += !displayRollDetails ? `+${totalModifiers}`: `+${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } + rollFormula = addModifiers(actor.data.data.skills.dex.athletics.modifiers, rollFormula) let roll = await new Roll(rollFormula).roll() if (roll.dice[0].results[0].result == 10){ @@ -576,39 +562,38 @@ function ExecuteDefense(actor){ let stat = actor.data.data.stats.ref.current; let skill = 0; let skillName = ""; + let modifiers; let displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.Dialog.Defense")}`; - - let totalModifiers = 0; switch(defense){ case "Brawling": skill = actor.data.data.skills.ref.brawling.value; skillName = actor.data.data.skills.ref.brawling.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefBrawling")}`; - actor.data.data.skills.ref.brawling.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.brawling.modifiers break; case "Melee": skill = actor.data.data.skills.ref.melee.value; skillName = actor.data.data.skills.ref.melee.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefMelee")}`; - actor.data.data.skills.ref.melee.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.melee.modifiers break; case "Small Blades": skill = actor.data.data.skills.ref.smallblades.value; skillName = actor.data.data.skills.ref.smallblades.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefSmall")}`; - actor.data.data.skills.ref.smallblades.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.smallblades.modifiers break; case "Staff/Spear": skill = actor.data.data.skills.ref.staffspear.value; skillName = actor.data.data.skills.ref.staffspear.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefStaff")}`; - actor.data.data.skills.ref.staffspear.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.staffspear.modifiers break; case "Swordsmanship": skill = actor.data.data.skills.ref.swordsmanship.value; skillName = actor.data.data.skills.ref.swordsmanship.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefSwordmanship")}`; - actor.data.data.skills.ref.swordsmanship.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.swordsmanship.modifiers break; } @@ -617,13 +602,7 @@ function ExecuteDefense(actor){ if (customDef != "0") { rollFormula += !displayFormula ? `+${customDef}`: `+${customDef}[${game.i18n.localize("WITCHER.Settings.Custom")}]` ; } - - if (totalModifiers < 0){ - rollFormula += !displayRollDetails ? `${totalModifiers}` : `${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } - if (totalModifiers > 0){ - rollFormula += !displayRollDetails ? `+${totalModifiers}`: `+${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } + rollFormula = addModifiers(modifiers, rollFormula) let roll = await new Roll(rollFormula).roll() if (roll.dice[0].results[0].result == 10){ @@ -653,38 +632,38 @@ function ExecuteDefense(actor){ let stat = actor.data.data.stats.ref.current; let skill = 0; let skillName = ""; + let modifiers; let displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.Dialog.ButtonParry")}`; - let totalModifiers = 0; switch(defense){ case "Brawling": skill = actor.data.data.skills.ref.brawling.value; skillName = actor.data.data.skills.ref.brawling.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefBrawling")} - 3`; - actor.data.data.skills.ref.brawling.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.brawling.modifiers break; case "Melee": skill = actor.data.data.skills.ref.melee.value; skillName = actor.data.data.skills.ref.melee.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefMelee")} - 3`; - actor.data.data.skills.ref.melee.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.melee.modifiers break; case "Small Blades": skill = actor.data.data.skills.ref.smallblades.value; skillName = actor.data.data.skills.ref.smallblades.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefSmall")} - 3`; - actor.data.data.skills.ref.smallblades.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.smallblades.modifiers break; case "Staff/Spear": skill = actor.data.data.skills.ref.staffspear.value; skillName = actor.data.data.skills.ref.staffspear.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefStaff")} - 3`; - actor.data.data.skills.ref.staffspear.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.staffspear.modifiers break; case "Swordsmanship": skill = actor.data.data.skills.ref.swordsmanship.value; skillName = actor.data.data.skills.ref.swordsmanship.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefSwordmanship")} - 3`; - actor.data.data.skills.ref.swordsmanship.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.swordsmanship.modifiers break; } @@ -693,13 +672,7 @@ function ExecuteDefense(actor){ if (customDef != "0") { rollFormula += !displayFormula ? `+${customDef}`: `+${customDef}[${game.i18n.localize("WITCHER.Settings.Custom")}]` ; } - - if (totalModifiers < 0){ - rollFormula += !displayRollDetails ? `${totalModifiers}` : `${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } - if (totalModifiers > 0){ - rollFormula += !displayRollDetails ? `+${totalModifiers}`: `+${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } + rollFormula = addModifiers(modifiers, rollFormula) let roll = await new Roll(rollFormula).roll() if (roll.dice[0].results[0].result == 10){ @@ -730,37 +703,36 @@ function ExecuteDefense(actor){ let skill = 0; let skillName = "" let displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.Dialog.ButtonParry")}`; - let totalModifiers = 0; switch(defense){ case "Brawling": skill = actor.data.data.skills.ref.brawling.value; skillName = actor.data.data.skills.ref.brawling.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefBrawling")} - 5`; - actor.data.data.skills.ref.brawling.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.brawling.modifiers break; case "Melee": skill = actor.data.data.skills.ref.melee.value; skillName = actor.data.data.skills.ref.melee.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefMelee")} - 5`; - actor.data.data.skills.ref.melee.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.melee.modifiers break; case "Small Blades": skill = actor.data.data.skills.ref.smallblades.value; skillName = actor.data.data.skills.ref.smallblades.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefSmall")} - 5`; - actor.data.data.skills.ref.smallblades.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.smallblades.modifiers break; case "Staff/Spear": skill = actor.data.data.skills.ref.staffspear.value; skillName = actor.data.data.skills.ref.staffspear.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefStaff")} - 5`; - actor.data.data.skills.ref.staffspear.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.staffspear.modifiers break; case "Swordsmanship": skill = actor.data.data.skills.ref.swordsmanship.value; skillName = actor.data.data.skills.ref.swordsmanship.label; displayFormula = `1d10 + ${game.i18n.localize("WITCHER.Actor.Stat.Ref")} + ${game.i18n.localize("WITCHER.SkRefSwordmanship")} - 5`; - actor.data.data.skills.ref.swordsmanship.modifiers.forEach(item => totalModifiers += Number(item.value)); + modifiers = actor.data.data.skills.ref.swordsmanship.modifiers break; } @@ -769,13 +741,7 @@ function ExecuteDefense(actor){ if (customDef != "0") { rollFormula += !displayFormula ? `+${customDef}`: `+${customDef}[${game.i18n.localize("WITCHER.Settings.Custom")}]` ; } - - if (totalModifiers < 0){ - rollFormula += !displayRollDetails ? `${totalModifiers}` : `${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } - if (totalModifiers > 0){ - rollFormula += !displayRollDetails ? `+${totalModifiers}`: `+${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } + rollFormula = addModifiers(modifiers, rollFormula) let roll = await new Roll(rollFormula).roll() if (roll.dice[0].results[0].result == 10){ @@ -810,15 +776,8 @@ function ExecuteDefense(actor){ if (customDef != "0") { rollFormula += !displayFormula ? `+${customDef}`: `+${customDef}[${game.i18n.localize("WITCHER.Settings.Custom")}]` ; } - - let totalModifiers = 0; - actor.data.data.skills.ref.dodge.modifiers.forEach(item => totalModifiers += Number(item.value)); - if (totalModifiers < 0){ - rollFormula += !displayRollDetails ? `${totalModifiers}` : `${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } - if (totalModifiers > 0){ - rollFormula += !displayRollDetails ? `+${totalModifiers}`: `+${totalModifiers}[${game.i18n.localize("WITCHER.Settings.modifiers")}]` - } + + rollFormula = addModifiers(actor.data.data.skills.ref.dodge.modifiers, rollFormula) let roll = await new Roll(rollFormula).roll() if (roll.dice[0].results[0].result == 10){ diff --git a/styles/loot-sheet.css b/styles/loot-sheet.css index daa9b730..d8022eea 100644 --- a/styles/loot-sheet.css +++ b/styles/loot-sheet.css @@ -14,7 +14,7 @@ flex: 1 } -.hidden-view { +table tr.hidden-view { background-color: silver; } diff --git a/system.json b/system.json index ca425ed9..d8ef3bd5 100644 --- a/system.json +++ b/system.json @@ -4,7 +4,7 @@ "description": "The Witcher TRPG System.", "minimumCoreVersion" : "9", "compatibleCoreVersion" : "9", - "version": 0.84, + "version": 0.85, "author": "TechAntho", "scripts": [ ], diff --git a/template.json b/template.json index 1d3702c3..cf790330 100644 --- a/template.json +++ b/template.json @@ -820,6 +820,7 @@ "value": "", "label": "WITCHER.Reputation" }, + "socialStanding": "", "name": "", "race": "", "gender": "", @@ -1357,6 +1358,13 @@ "perk4": { "name": "", "description": "" + }, + "socialStanding": { + "north": "", + "nilfgaard": "", + "skellige": "", + "dolBlathanna": "", + "mahakam": "" } }, "effect": { diff --git a/templates/partials/character-header.html b/templates/partials/character-header.html index 0d0aa128..b3ffb7a7 100644 --- a/templates/partials/character-header.html +++ b/templates/partials/character-header.html @@ -128,6 +128,21 @@ + + {{localize "WITCHER.character.socialStanding"}} + + + + + diff --git a/templates/partials/tab-inventory.html b/templates/partials/tab-inventory.html index 978fa952..1badd849 100644 --- a/templates/partials/tab-inventory.html +++ b/templates/partials/tab-inventory.html @@ -385,6 +385,7 @@

{{localize "WITCHER.Inventory.Diagrams"}} @@ -487,9 +488,7 @@

{{localize "WITCHER.Inventory.Diagrams"}}
- {{#if diagram.data.isFormulae}} - - {{/if}} +
diff --git a/templates/partials/tab-profession.html b/templates/partials/tab-profession.html index 37ed400b..b23c9d60 100644 --- a/templates/partials/tab-profession.html +++ b/templates/partials/tab-profession.html @@ -279,6 +279,74 @@

+
+ + + + + + + + + + + + + + + +
{{localize "WITCHER.socialStanding.north"}}{{localize "WITCHER.socialStanding.nilfgaard"}}{{localize "WITCHER.socialStanding.skellige"}}{{localize "WITCHER.socialStanding.dolBlathanna"}}{{localize "WITCHER.socialStanding.mahakam"}}
+ + + + + + + + + +
+
{{/if}} {{#unless race}} diff --git a/templates/sheets/race-sheet.html b/templates/sheets/race-sheet.html index a4ffa21b..f1de723a 100644 --- a/templates/sheets/race-sheet.html +++ b/templates/sheets/race-sheet.html @@ -28,4 +28,72 @@

{{editor content=data.perk4.description target="data.perk4.description" button=true editable=editable}} +
+ + + + + + + + + + + + + + + +
{{localize "WITCHER.socialStanding.north"}}{{localize "WITCHER.socialStanding.nilfgaard"}}{{localize "WITCHER.socialStanding.skellige"}}{{localize "WITCHER.socialStanding.dolBlathanna"}}{{localize "WITCHER.socialStanding.mahakam"}}
+ + + + + + + + + +
+
\ No newline at end of file