From dfd5e160f64f87a2c26ac5aa0638c1e6b77109b2 Mon Sep 17 00:00:00 2001 From: Antho Date: Thu, 7 Oct 2021 13:47:04 -0400 Subject: [PATCH] Active Effect now can divide, verify Sta, spell Crit/fumble --- README.md | 17 +-- module/sheets/WitcherActorSheet.js | 92 ++++++++++++---- module/witcher.js | 166 ++++++++++++++++++++--------- system.json | 7 +- 4 files changed, 205 insertions(+), 77 deletions(-) diff --git a/README.md b/README.md index 80e9ce2c..fd1c28ab 100644 --- a/README.md +++ b/README.md @@ -4,21 +4,22 @@ This Sheet represent a Player character with all of it's stats ### Skill Tab ### -This tabs allows you to roll skills and keep track of your improvement Points +This tabs allows you to roll skills and keep track of your improvement Points. +There is a color code for the skill to easily discernate the trained skills (Red) and those who are not(Brown). + ### Race and Profession Tab ### This tab is used to handle the race and profession. -It allows you to roll the professions skills. +It allows you to roll the professions skills by clicking on the dice of a profession skill. You can create Items of type Race and/or profession To drag and drop in the caracter sheet. + ### Inventory Tab ### This tab is used to organize different sort of items that the character is carrying. -You can see the total carrying weight -Weapons -Armor -Valuables -Substances and Components -Diagrams +At the top left there is a section for the currency. In the weapon section you have the weapons. +By clicking on the name of a weapon it launches an attack with this specific weapons and will use the specified skill to make the attack. +After you have the armor section, which will help you to easily keep track you your stopping power and resistances. B, S, P, stand for resistance to Blundgeoning damage, Slashing damage and perforring damage. When an armor is equipped, if it contains an encumbrance value it will automaticly subtract it to your REf and DEX. +At the bottom of the sheet you can see the total carrying weight ### Magic Tab ### This tab is used to organize your Spell, invocations, witcher signs, rituals and hexes. diff --git a/module/sheets/WitcherActorSheet.js b/module/sheets/WitcherActorSheet.js index fe4302ea..f98a0bf3 100644 --- a/module/sheets/WitcherActorSheet.js +++ b/module/sheets/WitcherActorSheet.js @@ -302,7 +302,9 @@ export default class WitcherActorSheet extends ActorSheet { if (previousActor) { previousActor.deleteOwnedItem(dragData.item._id) } - this.actor.createEmbeddedDocuments("Item", [dragData.item]); + if (dragData.item.data.quantity != 0) { + this.actor.createEmbeddedDocuments("Item", [dragData.item]); + } } else { super._onDrop(event, data); } @@ -866,23 +868,41 @@ export default class WitcherActorSheet extends ActorSheet { break; } let staCostTotal = spellItem.data.data.stamina; + let customModifier = 0; + let isExtraAttack = false + let content = `
` if (spellItem.data.data.staminaIsVar){ - const content = `${game.i18n.localize("WITCHER.Spell.staminaDialog")}`; - let cancel = true - let dialogData = { - buttons : [[`${game.i18n.localize("WITCHER.Button.Cancel")}`, ()=>{}], - [`${game.i18n.localize("WITCHER.Button.Continue")}`, (html)=>{ - let sta = html.find("[name=staCost]")[0].value; - staCostTotal = sta - cancel = false - } ]], - title : game.i18n.localize("WITCHER.Spell.MagicCost"), - content : content - } - await buttonDialog(dialogData) - if (cancel) { - return + content = `${game.i18n.localize("WITCHER.Spell.staminaDialog")}
` + } + content += `
`; + let cancel = true + let dialogData = { + buttons : [ + [`${game.i18n.localize("WITCHER.Button.Continue")}`, (html)=>{ + + if (spellItem.data.data.staminaIsVar){ + staCostTotal = html.find("[name=staCost]")[0].value; + } + customModifier = html.find("[name=customMod]")[0].value; + isExtraAttack = html.find("[name=isExtraAttack]").prop("checked"); + cancel = false + } ]], + title : game.i18n.localize("WITCHER.Spell.MagicCost"), + content : content + } + await buttonDialog(dialogData) + if (cancel) { + return + } + let newSta = this.actor.data.data.derivedStats.sta.value + if (isExtraAttack) { + newSta -= 3 + if (newSta < 0) { + return ui.notifications.error(game.i18n.localize("WITCHER.Spell.notEnoughSta")); } + this.actor.update({ + 'data.derivedStats.sta.value': newSta + }); } let staCostdisplay = staCostTotal; let staFocus = 0 @@ -895,7 +915,7 @@ export default class WitcherActorSheet extends ActorSheet { staCostTotal = 0 } - let newSta = this.actor.data.data.derivedStats.sta.value - staCostTotal + newSta -= staCostTotal if (newSta < 0) { return ui.notifications.error(game.i18n.localize("WITCHER.Spell.notEnoughSta")); } @@ -904,7 +924,9 @@ export default class WitcherActorSheet extends ActorSheet { 'data.derivedStats.sta.value': newSta }); staCostdisplay += `-${staFocus}[Focus]` - + + if (customModifier < 0){formula += `${customModifier}`} + if (customModifier > 0){formula += `+${customModifier}`} let rollResult = new Roll(formula).roll() let messageData = {flavor:`

${spellItem.name}

${game.i18n.localize("WITCHER.Spell.StaCost")}: ${staCostdisplay}
@@ -933,6 +955,14 @@ export default class WitcherActorSheet extends ActorSheet { if (spellItem.data.data.liftRequirement) { messageData.flavor += `
${game.i18n.localize("WITCHER.Spell.Requirements")}: ${spellItem.data.data.liftRequirement}
` } + + if (rollResult.dice[0].results[0].result == 10){ + messageData.flavor += `
${game.i18n.localize("WITCHER.Crit")}
` + } + else if(rollResult.dice[0].results[0].result == 1) { + messageData.flavor += `
${game.i18n.localize("WITCHER.Fumble")}
` + } + rollResult.toMessage(messageData) let token = this.actor.token; @@ -1061,7 +1091,8 @@ export default class WitcherActorSheet extends ActorSheet {

- `; + +
`; let messageData = { speaker: {alias: this.actor.name}, @@ -1076,8 +1107,12 @@ export default class WitcherActorSheet extends ActorSheet { label: `${game.i18n.localize("WITCHER.Dialog.ButtonDodge")}`, callback: (html) => { let isExtraDefense = html.find("[name=isExtraDefense]").prop("checked"); + let customDef = html.find("[name=customDef]")[0].value; if (isExtraDefense) { let newSta = this.actor.data.data.derivedStats.sta.value - 1 + if (newSta < 0) { + return ui.notifications.error(game.i18n.localize("WITCHER.Spell.notEnoughSta")); + } this.actor.update({ 'data.derivedStats.sta.value': newSta }); @@ -1087,6 +1122,9 @@ export default class WitcherActorSheet extends ActorSheet { let displayFormula = `1d10 + Ref + ${game.i18n.localize("WITCHER.SkRefDodge")}`; messageData.flavor = `

${game.i18n.localize("WITCHER.Dialog.Defense")}: ${game.i18n.localize("WITCHER.Dialog.ButtonDodge")}

${displayFormula}

`; let rollFormula = `1d10+${stat}+${skill}`; + if (customDef != "0") { + rollFormula += "+"+customDef; + } let roll = new Roll(rollFormula).roll() if (roll.dice[0].results[0].result == 10){ messageData.flavor += `
${game.i18n.localize("WITCHER.Crit")}
`; @@ -1103,6 +1141,9 @@ export default class WitcherActorSheet extends ActorSheet { let isExtraDefense = html.find("[name=isExtraDefense]").prop("checked"); if (isExtraDefense) { let newSta = this.actor.data.data.derivedStats.sta.value - 1 + if (newSta < 0) { + return ui.notifications.error(game.i18n.localize("WITCHER.Spell.notEnoughSta")); + } this.actor.update({ 'data.derivedStats.sta.value': newSta }); @@ -1128,6 +1169,9 @@ export default class WitcherActorSheet extends ActorSheet { let isExtraDefense = html.find("[name=isExtraDefense]").prop("checked"); if (isExtraDefense) { let newSta = this.actor.data.data.derivedStats.sta.value - 1 + if (newSta < 0) { + return ui.notifications.error(game.i18n.localize("WITCHER.Spell.notEnoughSta")); + } this.actor.update({ 'data.derivedStats.sta.value': newSta }); @@ -1195,6 +1239,9 @@ export default class WitcherActorSheet extends ActorSheet { let isExtraDefense = html.find("[name=isExtraDefense]").prop("checked"); if (isExtraDefense) { let newSta = this.actor.data.data.derivedStats.sta.value - 1 + if (newSta < 0) { + return ui.notifications.error(game.i18n.localize("WITCHER.Spell.notEnoughSta")); + } this.actor.update({ 'data.derivedStats.sta.value': newSta }); @@ -1244,6 +1291,9 @@ export default class WitcherActorSheet extends ActorSheet { let isExtraDefense = html.find("[name=isExtraDefense]").prop("checked"); if (isExtraDefense) { let newSta = this.actor.data.data.derivedStats.sta.value - 1 + if (newSta < 0) { + return ui.notifications.error(game.i18n.localize("WITCHER.Spell.notEnoughSta")); + } this.actor.update({ 'data.derivedStats.sta.value': newSta }); @@ -1540,6 +1590,10 @@ export default class WitcherActorSheet extends ActorSheet { if (isExtraAttack) { let newSta = this.actor.data.data.derivedStats.sta.value - 3 + + if (newSta < 0) { + return ui.notifications.error(game.i18n.localize("WITCHER.Spell.notEnoughSta")); + } this.actor.update({ 'data.derivedStats.sta.value': newSta }); diff --git a/module/witcher.js b/module/witcher.js index 2f8d2885..a7ca181a 100644 --- a/module/witcher.js +++ b/module/witcher.js @@ -26,6 +26,15 @@ function updateDerived(actor){ let craTotalModifiers = 0; let willTotalModifiers = 0; let luckTotalModifiers = 0; + let intDivider = 1; + let refDivider = 1; + let dexDivider = 1; + let bodyDivider = 1; + let spdDivider = 1; + let empDivider = 1; + let craDivider = 1; + let willDivider = 1; + let luckDivider = 1; thisActor.data.data.stats.int.modifiers.forEach(item => intTotalModifiers += Number(item.value)); thisActor.data.data.stats.ref.modifiers.forEach(item => refTotalModifiers += Number(item.value)); thisActor.data.data.stats.dex.modifiers.forEach(item => dexTotalModifiers += Number(item.value)); @@ -40,15 +49,42 @@ function updateDerived(actor){ activeEffects.forEach(item => item.data.data.stats.forEach(stat => { switch(stat.stat){ - case "WITCHER.Actor.Stat.Int": intTotalModifiers += Number(stat.modifier); break; - case "WITCHER.Actor.Stat.Ref": refTotalModifiers += Number(stat.modifier); break; - case "WITCHER.Actor.Stat.Dex": dexTotalModifiers += Number(stat.modifier); break; - case "WITCHER.Actor.Stat.Body": bodyTotalModifiers += Number(stat.modifier); break; - case "WITCHER.Actor.Stat.Spd": spdTotalModifiers += Number(stat.modifier); break; - case "WITCHER.Actor.Stat.Emp": empTotalModifiers += Number(stat.modifier); break; - case "WITCHER.Actor.Stat.Cra": craTotalModifiers += Number(stat.modifier); break; - case "WITCHER.Actor.Stat.Will": willTotalModifiers += Number(stat.modifier); break; - case "WITCHER.Actor.Stat.Luck": luckTotalModifiers += Number(stat.modifier); break; + case "WITCHER.Actor.Stat.Int": + if (stat.modifier.includes("/")){intDivider = Number(stat.modifier.replace("/", ''));} + else {intTotalModifiers += Number(stat.modifier)} + break; + case "WITCHER.Actor.Stat.Ref": + if (stat.modifier.includes("/")){refDivider = Number(stat.modifier.replace("/", ''));} + else {refTotalModifiers += Number(stat.modifier)} + break; + case "WITCHER.Actor.Stat.Dex": + if (stat.modifier.includes("/")){dexDivider = Number(stat.modifier.replace("/", ''));} + else {dexTotalModifiers += Number(stat.modifier)} + break; + case "WITCHER.Actor.Stat.Body": + if (stat.modifier.includes("/")){bodyDivider = Number(stat.modifier.replace("/", ''));} + else {bodyTotalModifiers += Number(stat.modifier)} + break; + case "WITCHER.Actor.Stat.Spd": + if (stat.modifier.includes("/")){spdDivider = Number(stat.modifier.replace("/", ''));} + else {spdTotalModifiers += Number(stat.modifier)} + break; + case "WITCHER.Actor.Stat.Emp": + if (stat.modifier.includes("/")){empDivider = Number(stat.modifier.replace("/", ''));} + else {empTotalModifiers += Number(stat.modifier)} + break; + case "WITCHER.Actor.Stat.Cra": + if (stat.modifier.includes("/")){craDivider = Number(stat.modifier.replace("/", ''));} + else {craTotalModifiers += Number(stat.modifier)} + break; + case "WITCHER.Actor.Stat.Will": + if (stat.modifier.includes("/")){willDivider = Number(stat.modifier.replace("/", ''));} + else {willTotalModifiers += Number(stat.modifier)} + break; + case "WITCHER.Actor.Stat.Luck": + if (stat.modifier.includes("/")){luckDivider = Number(stat.modifier.replace("/", ''));} + else {luckTotalModifiers += Number(stat.modifier)} + break; } })); @@ -58,6 +94,12 @@ function updateDerived(actor){ let encTotalModifiers = 0; let recTotalModifiers = 0; let wtTotalModifiers = 0; + let stunDivider = 1; + let runDivider = 1; + let leapDivider = 1; + let encDivider = 1; + let recDivider = 1; + let wtDivider= 1; thisActor.data.data.coreStats.stun.modifiers.forEach(item => stunTotalModifiers += Number(item.value)); thisActor.data.data.coreStats.run.modifiers.forEach(item => runTotalModifiers += Number(item.value)); thisActor.data.data.coreStats.leap.modifiers.forEach(item => leapTotalModifiers += Number(item.value)); @@ -78,52 +120,71 @@ function updateDerived(actor){ activeEffects.forEach(item => item.data.data.derived.forEach(derived => { switch(derived.derivedStat){ - case "WITCHER.Actor.CoreStat.Stun": stunTotalModifiers += Number(derived.modifier); break; - case "WITCHER.Actor.CoreStat.Run": runTotalModifiers += Number(derived.modifier); break; - case "WITCHER.Actor.CoreStat.Leap": leapTotalModifiers += Number(derived.modifier); break; - case "WITCHER.Actor.CoreStat.Enc": encTotalModifiers += Number(derived.modifier); break; - case "WITCHER.Actor.CoreStat.Rec": recTotalModifiers += Number(derived.modifier); break; - case "WITCHER.Actor.CoreStat.woundTreshold": wtTotalModifiers += Number(derived.modifier); break; + case "WITCHER.Actor.CoreStat.Stun": + if (derived.modifier.includes("/")){stunDivider = Number(derived.modifier.replace("/", ''));} + else {stunTotalModifiers += Number(derived.modifier)} + break; + case "WITCHER.Actor.CoreStat.Run": + if (derived.modifier.includes("/")){runDivider = Number(derived.modifier.replace("/", ''));} + else {runTotalModifiers += Number(derived.modifier)} + break; + case "WITCHER.Actor.CoreStat.Leap": + if (derived.modifier.includes("/")){leapDivider = Number(derived.modifier.replace("/", ''));} + else {leapTotalModifiers += Number(derived.modifier)} + break; + case "WITCHER.Actor.CoreStat.Enc": + if (derived.modifier.includes("/")){encDivider = Number(derived.modifier.replace("/", ''));} + else {encTotalModifiers += Number(derived.modifier)} + break; + case "WITCHER.Actor.CoreStat.Rec": + if (derived.modifier.includes("/")){recDivider = Number(derived.modifier.replace("/", ''));} + else {recTotalModifiers += Number(derived.modifier)} + break; + case "WITCHER.Actor.CoreStat.woundTreshold": + if (derived.modifier.includes("/")){wtDivider = Number(derived.modifier.replace("/", ''));} + else {wtTotalModifiers += Number(derived.modifier)} + break; } })); - - let curInt = thisActor.data.data.stats.int.max + intTotalModifiers; - let curRef = thisActor.data.data.stats.ref.max + refTotalModifiers - armorEnc - encDiff; - let curDex = thisActor.data.data.stats.dex.max + dexTotalModifiers - armorEnc - encDiff; - let curBody = thisActor.data.data.stats.body.max + bodyTotalModifiers; - let curSpd = thisActor.data.data.stats.spd.max + spdTotalModifiers - encDiff; - let curEmp = thisActor.data.data.stats.emp.max + empTotalModifiers; - let curCra = thisActor.data.data.stats.cra.max + craTotalModifiers; - let curWill = thisActor.data.data.stats.will.max + willTotalModifiers; - let curLuck = thisActor.data.data.stats.luck.max + luckTotalModifiers; + let curInt = Math.floor((thisActor.data.data.stats.int.max + intTotalModifiers) / intDivider); + let curRef = Math.floor((thisActor.data.data.stats.ref.max + refTotalModifiers - armorEnc - encDiff) / refDivider); + let curDex = Math.floor((thisActor.data.data.stats.dex.max + dexTotalModifiers - armorEnc - encDiff) / dexDivider); + let curBody = Math.floor((thisActor.data.data.stats.body.max + bodyTotalModifiers) / bodyDivider); + let curSpd = Math.floor((thisActor.data.data.stats.spd.max + spdTotalModifiers - encDiff) / spdDivider); + let curEmp = Math.floor((thisActor.data.data.stats.emp.max + empTotalModifiers) / empDivider); + let curCra = Math.floor((thisActor.data.data.stats.cra.max + craTotalModifiers) / craDivider); + let curWill = Math.floor((thisActor.data.data.stats.will.max + willTotalModifiers) / willDivider); + let curLuck = Math.floor((thisActor.data.data.stats.luck.max + luckTotalModifiers) / luckDivider); let isDead = false; let isWounded = false; let HPvalue = thisActor.data.data.derivedStats.hp.value; if (HPvalue <= 0) { isDead = true - curInt = Math.floor((thisActor.data.data.stats.int.max + intTotalModifiers)/3) - curRef =Math.floor(( thisActor.data.data.stats.ref.max + refTotalModifiers)/3) - curDex = Math.floor((thisActor.data.data.stats.dex.max + dexTotalModifiers)/3) - curBody = Math.floor((thisActor.data.data.stats.body.max + bodyTotalModifiers)/3) - curSpd = Math.floor((thisActor.data.data.stats.spd.max + spdTotalModifiers)/3) - curEmp = Math.floor((thisActor.data.data.stats.emp.max + empTotalModifiers)/3) - curCra = Math.floor((thisActor.data.data.stats.cra.max + craTotalModifiers)/3) - curWill = Math.floor((thisActor.data.data.stats.will.max + willTotalModifiers)/3) - curLuck = Math.floor((thisActor.data.data.stats.luck.max + luckTotalModifiers)/3) + curInt = Math.floor((thisActor.data.data.stats.int.max + intTotalModifiers)/3/intDivider) + curRef =Math.floor(( thisActor.data.data.stats.ref.max + refTotalModifiers - armorEnc - encDiff)/3/dexDivider) + curDex = Math.floor((thisActor.data.data.stats.dex.max + dexTotalModifiers - armorEnc - encDiff)/3/refDivider) + curBody = Math.floor((thisActor.data.data.stats.body.max + bodyTotalModifiers)/3/bodyDivider) + curSpd = Math.floor((thisActor.data.data.stats.spd.max + spdTotalModifiers - encDiff)/3/spdDivider) + curEmp = Math.floor((thisActor.data.data.stats.emp.max + empTotalModifiers)/3/empDivider) + curCra = Math.floor((thisActor.data.data.stats.cra.max + craTotalModifiers)/3/craDivider) + curWill = Math.floor((thisActor.data.data.stats.will.max + willTotalModifiers)/3/willDivider) + curLuck = Math.floor((thisActor.data.data.stats.luck.max + luckTotalModifiers)/3/luckDivider) } else if (HPvalue < thisActor.data.data.coreStats.woundTreshold.current > 0) { isWounded = true - curRef = Math.floor((thisActor.data.data.stats.ref.max + refTotalModifiers)/2) - curDex = Math.floor((thisActor.data.data.stats.dex.max + dexTotalModifiers)/2) - curInt = Math.floor((thisActor.data.data.stats.int.max + intTotalModifiers)/2) - curWill = Math.floor((thisActor.data.data.stats.will.max + willTotalModifiers)/2) + curRef = Math.floor((thisActor.data.data.stats.ref.max + refTotalModifiers - armorEnc - encDiff)/2/refDivider) + curDex = Math.floor((thisActor.data.data.stats.dex.max + dexTotalModifiers - armorEnc - encDiff)/2/dexDivider) + curInt = Math.floor((thisActor.data.data.stats.int.max + intTotalModifiers)/2/intDivider) + curWill = Math.floor((thisActor.data.data.stats.will.max + willTotalModifiers)/2/willDivider) } let hpTotalModifiers = 0; let staTotalModifiers = 0; let resTotalModifiers = 0; let focusTotalModifiers = 0; + let hpDivider = 1; + let staDivider = 1; thisActor.data.data.derivedStats.hp.modifiers.forEach(item => hpTotalModifiers += Number(item.value)); thisActor.data.data.derivedStats.sta.modifiers.forEach(item => staTotalModifiers += Number(item.value)); thisActor.data.data.derivedStats.resolve.modifiers.forEach(item => resTotalModifiers += Number(item.value)); @@ -131,8 +192,14 @@ function updateDerived(actor){ activeEffects.forEach(item => item.data.data.derived.forEach(derived => { switch(derived.derivedStat){ - case "WITCHER.Actor.DerStat.HP": hpTotalModifiers += Number(derived.modifier); break; - case "WITCHER.Actor.DerStat.Sta": staTotalModifiers += Number(derived.modifier); break; + case "WITCHER.Actor.DerStat.HP": + if (derived.modifier.includes("/")){hpDivider = Number(derived.modifier.replace("/", ''));} + else {hpTotalModifiers += Number(derived.modifier)} + break; + case "WITCHER.Actor.DerStat.Sta": + if (derived.modifier.includes("/")){staDivider = Number(derived.modifier.replace("/", ''));} + else {staTotalModifiers += Number(derived.modifier)} + break; } })); @@ -142,8 +209,8 @@ function updateDerived(actor){ let curFocus = thisActor.data.data.derivedStats.focus.max + focusTotalModifiers; if (thisActor.data.data.customStat != true){ - curHp = base * 5 + hpTotalModifiers - curSta = base * 5 + staTotalModifiers + curHp = Math.floor((base * 5 + hpTotalModifiers)/hpDivider) + curSta = Math.floor((base * 5 + staTotalModifiers)/staDivider) curRes = Math.floor((curWill + curInt)/2*5) + resTotalModifiers curFocus = Math.floor((curWill + curInt)/2*3) + focusTotalModifiers } @@ -166,22 +233,22 @@ function updateDerived(actor){ 'data.derivedStats.resolve.max': curRes, 'data.derivedStats.focus.max': curFocus, - 'data.coreStats.stun.current': Math.clamped(base, 1, 10) + stunTotalModifiers, + 'data.coreStats.stun.current': Math.floor((Math.clamped(base, 1, 10) + stunTotalModifiers)/stunDivider), 'data.coreStats.stun.max': Math.clamped(baseMax, 1, 10), - 'data.coreStats.enc.current': stats.body.current*10 + encTotalModifiers, + 'data.coreStats.enc.current': Math.floor((stats.body.current*10 + encTotalModifiers)/encDivider), 'data.coreStats.enc.max': stats.body.current*10, - 'data.coreStats.run.current': stats.spd.current*3 +runTotalModifiers, + 'data.coreStats.run.current': Math.floor((stats.spd.current*3 +runTotalModifiers)/runDivider), 'data.coreStats.run.max': stats.spd.current*3, - 'data.coreStats.leap.current': Math.floor(stats.spd.current*3/5)+leapTotalModifiers, + 'data.coreStats.leap.current': Math.floor((stats.spd.current*3/5)+leapTotalModifiers)/leapDivider, 'data.coreStats.leap.max': Math.floor(stats.spd.max*3/5), - 'data.coreStats.rec.current': base + recTotalModifiers, + 'data.coreStats.rec.current': Math.floor((base + recTotalModifiers)/recDivider), 'data.coreStats.rec.max': baseMax, - 'data.coreStats.woundTreshold.current': baseMax+wtTotalModifiers, + 'data.coreStats.woundTreshold.current': Math.floor((baseMax+wtTotalModifiers)/wtDivider), 'data.coreStats.woundTreshold.max': baseMax, 'data.attackStats.meleeBonus': meleeBonus, @@ -270,7 +337,8 @@ function rollSkillCheck(thisActor, statNum, skillNum){ activeEffects.forEach(item => item.data.data.skills.forEach(skill => { if (skillName == game.i18n.localize(skill.skill)){ - rollFormula += `+${skill.modifier}` + if (skill.modifier.includes("/")){rollFormula += `/${Number(skill.modifier.replace("/", ''))}`} + else {rollFormula += `+${skill.modifier}`} } })); diff --git a/system.json b/system.json index 292a2aff..bd609e12 100644 --- a/system.json +++ b/system.json @@ -3,7 +3,7 @@ "title": "TheWitcherTRPG - fvtt", "description": "The Witcher TRPG System.", "compatibleCoreVersion": "0.8.8", - "version": 0.54, + "version": 0.55, "author": "TechAntho", "scripts": [ ], @@ -88,6 +88,11 @@ "lang": "deu", "name": "German", "path": "lang/deu.json" + }, + { + "lang": "it", + "name": "Italian", + "path": "lang/it.json" } ], "dependencies": [