From d5c00bd4e17af795cfa6cf0f5a4e0c797a20cb6d Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Sat, 4 Sep 2021 09:05:07 -0400 Subject: [PATCH 01/49] starting work on export --- Shadowrun3e/shadowrun3e.html | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index c9f49fa2fa..f9dd2cfd4b 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -19,8 +19,7 @@
-
Import
-
Export
+
ImportExport
From fe1c65bd334ba62746ccb4dcbaa158fe77e95093 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Sat, 4 Sep 2021 13:27:36 -0400 Subject: [PATCH 02/49] added calculations for defense tests, but have not yet created roll for them. --- Shadowrun3e/shadowrun3e.html | 177 ++++++++++++++++++++++++++--------- 1 file changed, 134 insertions(+), 43 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index f9dd2cfd4b..79f01ad49b 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -19,7 +19,8 @@
- + +
@@ -86,6 +87,7 @@
+
- - +
Equip
Name
@@ -2875,7 +2876,7 @@ -
+
@@ -4431,7 +4432,6 @@ buttonlist.forEach(button => { } }; - on("change:repeating_rangedweapons:type", function() { console.log('updating range based on weapon type'); getAttrs(["repeating_rangedweapons_type", "strength_max"], function(myval) { @@ -5290,25 +5290,25 @@ on('clicked:matrixattack', (info) => { adps: { armor: "Math.floor(ballistic * 0.5)", av: 0, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" }, explosive: { armor: "ballistic", av: 0, power: 1, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, explosive2: { armor: "ballistic", av: 0, power: 2, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, - flechette: { armor: "(Math.max(ballistic, (impact * 2)))", av: -0.5, power: 0, rpower:0, dmg:0, rdmg: "(dermalarmor==1)? 0 :((ballistic + impact) ==0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, + flechette: { armor: "(Math.max(ballistic, (impact * 2)))", av: -0.5, power: 0, rpower:0, dmg:0, rdmg: "(armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, gel: { armor: "impact", av: 0, power: -2, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 2, amsg: "" }, tracer: { armor: "ballistic", av: 0, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, av: { armor: "Math.floor(ballistic * 0.5)", av: 1, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" }, capsule: { armor: "impact", av: 0, power: -2, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, - glazer: { armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 2, rpower:0, dmg:0, rdmg: "((ballistic + impact) ==0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, + glazer: { armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 2, rpower:0, dmg:0, rdmg: "( armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, hic: { armor: "Math.max(ballistic,impact)", av: 0, power: "(range==6)? -1 : (range==9)? -1", rpower:0, dmg: 0, rdmg:0, recoil: 2, barrier: 1, knockdown: 1, amsg: "" }, hpoint: { armor: "ballistic + impact", av: 0, power:0, rpower: "((ballistic + impact ==0)? 3 : 1", dmg: 0, rdmg:0, recoil: 2, barrier: 1, knockdown: 1, amsg: "Final Power Rating depends on Armor" }, incendiary: { armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, - mercury: { armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 0, rpower: 0, dmg: 0, rdmg: "((ballistic + impact) ==0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, + mercury: { armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 0, rpower: 0, dmg: 0, rdmg: "( armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, tracker: { armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg: 0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" } } const resistdmg = function (myid, mods) { - atts=["ballistic", "impact", "dermal-armor"]; + atts=["ballistic", "impact", "armor-on"]; getAttrs(atts, function (myval) { const ballistic=myval["ballistic"]; const impact=myval["impact"]; - const dermalarmor=myval["dermal-armor"]; + const armoron=myval["armor-on"]; var wdmg; var dmgcode=0; var weapondmg="none"; @@ -5997,10 +5997,29 @@ on('clicked:matrixattack', (info) => { } }); }); - on('clicked:melee', (info) => { + on('clicked:meleedefend', (info) => { + payload=rollEscape.unescape(info["originalRollId"]); + meleecombat("defend", payload); + }); + on('clicked:meleedefendfull', (info) => { + payload=rollEscape.unescape(info["originalRollId"]); + meleecombat("defend-full", payload); + }); + on('clicked:melee2', (info) => { + payload="none"; + const mymode=info["htmlAttributes"]["id"]; + meleecombat(mymode, payload); + }); + + on('clicked:melee', (info, attacktype="attack") => { console.log(info); var atts=[]; const mymode=info["htmlAttributes"]["id"]; + var payload; + if ( info["originalRollId"] != undefined ) { + payload=rollEscape.unescape(info["originalRollId"]); + attacktype="defend"; + } console.log(mymode); var myfocus = 0; var focus=""; @@ -6013,38 +6032,56 @@ on('clicked:matrixattack', (info) => { var defaultmsg=""; var defaultpen=0; var myspec=0; - const meleeattrs=["unarmed", "unarmed-specialized", "cyberimplant", "weaponfocus-equipped", "weaponfocus-damage", "gyro-on"]; + var meleeattrs=["sheettype", "character_name","strength_max", "martialarts", "attackdamage", "attackpower", "reaction_max", "charisma_max", "unarmed", "unarmed-specialized", "cyberimplant", "weaponfocus-equipped", "weaponfocus-damage", "gyro-on", "armor-quickness-pen", "unarmed-specialized", "unarmed-miscmod", "weaponfocus-specialized", "metatype", "meleeselected"]; + if ( mymode == "repeatingmelee" ) { + var source=info['sourceAttribute'].split('_'); + var sourceattr=source.pop(); + var myrepeat=source.join('_').concat('_'); + const repeatatts=["damage", "power", "name", "skill", "reach", "specialized", "notes", "tnmods"] ; + repeatatts.forEach(myatt=>{ + meleeattrs.push(myrepeat.concat(myatt)); + }); + }; getAttrs(meleeattrs, function(myval) { - if ( mymode == "astralattack" ) { + const strmax=myval["strength_max"]; + const attackdamage=myval["attackdamage"]; + const attackpower=myval["attackpower"]; + const myname=myval["character_name"]; + const sheettype=myval["sheettype"]; + var mynotes=""; + var myspec=0; + var mytnmod=0; + var myreach="@{meleereach|max}"; + var gyropenroll=""; + var gyropen=0; + if (( myval["gyro-on"] == 1 ) && ( mymode != "astralattack" )) { + gyropen=4; + gyropenroll = "{{gyropen=" + gyropen + "}}"; + } + if (( mymode == "astralattack" ) || ( (payload != null) && (payload["plane"]=="astral"))) { pool="astralpool"; myweapon="Astral Attack"; var myskill="@{astralcombat}"; - myskill="@{astralcombat} + @{weaponfocus-force}" var mydamage="M" if ( myval["weaponfocus-equipped"]=="on" ) { - myskill += "( " + myskill + " + @{weaponfocus-force} )" + myskill = "( " + myskill + " + @{weaponfocus-force} )" + myspec=myval["weaponfocus-specialized"]; mydamage=myval["weaponfocus-damage"]; } - mypower="@{charisma|max}"; + mypower=myval["charisma_max"]; focus="{{weaponfocus=@{weaponfocus-name}}}" force="{{focusforce=@{weaponfocus-force}}}" - } - else if ( mymode == "unarmedattack" ) { - var gyropen=0; - var gyropenroll=""; - if ( myval["gyro-on"] == 1 ) { - gyropen=4; - gyropenroll = "{{gyropen=" + gyropen + "}}"; - } - mydamage=myval["@{attackdamage}"]; + } else if (( mymode == "unarmedattack" ) || (( attacktype.includes("defend") ) && (myval["meleeselected"] == "unarmed-equipped"))) { + mydamage=attackdamage; myskill=myval["unarmed"]; myspec=myval["unarmed-specialized"]; - myweapon="@{martialarts}"; - mypower="@{strength|max}"; + mytnmod=myval["unarmed-miscmods"]; + myweapon=myval["martialarts"]; + mypower=strmax; if ( myval["unarmed"] == 0 ) { console.log('unarmed is 0'); if (myval["cyberimplant"] == 0) { - myskill="@{strength|max}"; + myskill=strmax; defaultpen=4; pool="false"; var defaultmsg="{{default=Skill Defaulted to Strength Attribute with +" + defaultpen + " to hit}}"; @@ -6054,20 +6091,51 @@ on('clicked:matrixattack', (info) => { var defaultmsg="{{default=Skill Defaulted to Cyber Implant skill with +" + defaultpen + " to hit}}"; } } + } else if (( sheettype == "Critter" ) || (sheettype=="Spirit")) { + myskill=myval["reaction_max"]; + mydamage=myval["attackdamage"]; + mypower=myval["attackpower"]; + myweapon=sheettype + " Attack"; + } else if (mymode == "repeatingmelee" ) { + console.log('repeating melee'); + mynotes=myval[myrepeat.concat("mynotes")]; + myweapon=myval[myrepeat.concat("name")]; + mydamage=myval[myrepeat.concat("damage")]; + mypower=myval[myrepeat.concat("power")]; + myskill=myval[myrepeat.concat("skill")]; + myspec=myval[myrepeat.concat("specialized")]; + mytnmod=myval[myrepeat.concat("tnmods")]; + if ( myval["metatype"] == "Troll" ) myreach=myval[myrepeat.concat("reach")] + 1; + else myreach=myval[myrepeat.concat("reach")]; + } else if ((attacktype.includes("defend")) && (myval["meleeselected"] != "unarmed-equipped")) { + myrepeat=myval["meleeselected"].slice(0, -12); + newgets=[]; + repeatatts.forEach(myatt=>{ newgets.push(myrepeat.concat(myatt)); }); + getAttrs(newgets, function(rval) { + console.log('repeating melee'); + mynotes=rval[myrepeat.concat("mynotes")]; + myweapon=rval[myrepeat.concat("name")]; + mydamage=rval[myrepeat.concat("damage")]; + mypower=rval[myrepeat.concat("power")]; + myskill=rval[myrepeat.concat("skill")]; + myspec=rval[myrepeat.concat("specialized")]; + mytnmod=rval[myrepeat.concat("tnmods")]; + if ( myval["metatype"] == "Troll" ) myreach=rval[myrepeat.concat("reach")] + 1; + else myreach=rval[myrepeat.concat("reach")]; + }); + } else { + console.log(' id ' + mymode + ' does not match'); } - else if ( mymode == "critterattack" ) { - myskill="@{reaction|max}"; - mydamage="@{attackdamage}"; - mypower="@{attackpower}"; - myweapon="Attack"; - } else { - console.log(' id ' + mymode + ' does not match'); - } - var calcTN="4 + @{meleeTN} + ( ( @{target|Target|meleereach|max} - @{meleereach|max} ) * ?{Use Reach Modifier?} ) + " + defaultpen + " + " + gyropen; + var calcTN="4 + @{meleeTN} + ( ( @{target|Target|meleereach|max} - " + myreach + " ) * ?{Use Reach Modifier?} ) + " + mytnmod + " + " + defaultpen + " + " + gyropen; var calcDice=myskill + " + " + myspec ; - var myroll="&{template:attack}{{myname=@{character_name}}}{{target=@{target|Target|token_name}}}{{weapondamage=" + var myroll="&{template:attack}{{myname=" + myname + "}}{{target=@{target|Target|token_name}}}{{weapondamage=[[0]]}}{{weaponpower=[[" + mypower + "]]}}" + if ( quicknesslinked.includes(myskill) ) { + console.log('quick pen'); + armorpen=myval["armor-quickness-pen"]; + console.log(armorpen); + myroll+= "{{armorpen=@{armor-quickness-pen}}}"; + } console.log('pool name is ' + pool); - myroll+= mydamage + "}}{{weaponpower=[[" + mypower + "]]}}" if ( pool == "combatpool" ) { calcDice += " + ?{Combat Pool Dice}" myroll += "{{pooldice=[[?{Combat Pool Dice|0}]]}}" @@ -6079,20 +6147,40 @@ on('clicked:matrixattack', (info) => { } else { myroll += "{{pooldice=[[0]]}}" } - myroll+= "{{charreach=[[@{meleereach|max}]]}}{{targetreach=[[@{target|Target|meleereach|max}]]}}" + myroll+= "{{charreach=[[" + myreach + "]]}}{{targetreach=[[@{target|Target|meleereach|max}]]}}" myroll+="{{weaponname=" + myweapon + "}}{{reachmod=[[?{Use Reach Modifier?|Yes,1|No,0}]]}}" myroll+="{{reachbonus=[[(@{target|Target|meleereach|max} - @{meleereach|max} ) * ?{Use Reach Modifier?}]]}}" myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}" - myroll+="{{attacktest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" + myroll+="{{senddata=[[0]]}}"; myroll+=defaultmsg; myroll+=gyropenroll; + if ( payload == null ) { + myroll+="{{attacktest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" + payload={ + attacker: myname, + strength: strmax, + power: mypower, + wdmg: mydamage + }; + payload["plane"]=(pool=="astralpool")? "astral" : "physical"; + } else { + myroll+="{{defensetest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" + payload["defender"]=myname, + payload["dstrength"]=strmax, + payload["dpower"]=mypower, + payload["dwdmg"]=mydamage + } console.log(myroll); startRoll(myroll, (results) => { var reachmodtxt="Reach Bonus Applied" ; if ( results.results.reachmod.result == 0 ) reachmodtxt="Reach Bonus Not Applied"; if ( pool != "none" ) updatepoolused(pool, results.results.pooldice.result ); + payload["reachmode"]=results.results.reachmod.result; + payload["attacktest"]=results.results.attacktest.result; finishRoll( results.rollId, { reachmod: reachmodtxt, + weapondamage: mydamage, + senddata: rollEscape.escape(payload), }); }); @@ -7648,7 +7736,7 @@ on("change: change:repeating_meleeweapons:reach", function(eventinfo){ }); }); -on("change:repeating_armor:equipped change:repeating_armor:ballistic change:repeating_armor:impact", function(eventinfo){ +on("change:dermal-armor change:repeating_armor:equipped change:repeating_armor:ballistic change:repeating_armor:impact", function(eventinfo){ var sets={}; var ballistic=0; var impact=0; @@ -7656,12 +7744,13 @@ on("change:repeating_armor:equipped change:repeating_armor:ballistic change:repe fields=["equipped", "ballistic", "impact", "slot"]; getSectionIDs("repeating_armor", idArray => { var attrArray = idArray.reduce((m, id) => [ ...m, ...(fields.map(field => `repeating_armor_${id}_${field}`))], []); - attrArray.push("quickness_max"); + attrArray.push("quickness_max","dermal-armor"); getAttrs(attrArray, function(myval) { console.log('myval'); console.log(myval); console.log(idArray); const myquick=parseInt(myval["quickness_max"]); + const mydermal=parseInt(myval["dermal-armor"]); idArray.forEach(m => { if (myval["repeating_armor_" + m + "_equipped"] == "on" ) { let bal=myval["repeating_armor_" + m + "_slot"] + "-bal"; @@ -7692,6 +7781,8 @@ on("change:repeating_armor:equipped change:repeating_armor:ballistic change:repe let combatpen= -1 * (Math.floor((ballover + impactover) / 2 )); if ( gyro_bal > 0 ) sets["gyro-on"]=1; else sets["gyro-on"]=0; + if (((ballistic + impact) >= 1 ) || (mydermal == 1)) sets["armor-on"]=1; + else sets["armor-on"]=0; sets["ballistic"]=ballistic + ware_bal + gyro_bal; sets["impact"]=impact + ware_im + gyro_bal;; sets["armor-quickness-pen"]=ballover; From c6fd189862cb867de6780bf26b3f8fc764c15e69 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Sun, 5 Sep 2021 11:46:48 -0400 Subject: [PATCH 03/49] moving melee out to its own roll template --- Shadowrun3e/shadowrun3e.html | 70 +++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 29 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 79f01ad49b..9543da530f 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -111,6 +111,8 @@ title="Attack with primary equipped ranged weapons">L + + @@ -5997,28 +5999,11 @@ on('clicked:matrixattack', (info) => { } }); }); - on('clicked:meleedefend', (info) => { - payload=rollEscape.unescape(info["originalRollId"]); - meleecombat("defend", payload); - }); - on('clicked:meleedefendfull', (info) => { - payload=rollEscape.unescape(info["originalRollId"]); - meleecombat("defend-full", payload); - }); - on('clicked:melee2', (info) => { - payload="none"; - const mymode=info["htmlAttributes"]["id"]; - meleecombat(mymode, payload); - }); - on('clicked:melee', (info, attacktype="attack") => { - console.log(info); + const meleecombat = function (mymode, payload) { var atts=[]; - const mymode=info["htmlAttributes"]["id"]; - var payload; - if ( info["originalRollId"] != undefined ) { + if ( payload != "none" ) { payload=rollEscape.unescape(info["originalRollId"]); - attacktype="defend"; } console.log(mymode); var myfocus = 0; @@ -6029,10 +6014,10 @@ on('clicked:matrixattack', (info) => { var myweapon; var mypower; var pool="combatpool"; - var defaultmsg=""; + var defaultmsg=" "; var defaultpen=0; var myspec=0; - var meleeattrs=["sheettype", "character_name","strength_max", "martialarts", "attackdamage", "attackpower", "reaction_max", "charisma_max", "unarmed", "unarmed-specialized", "cyberimplant", "weaponfocus-equipped", "weaponfocus-damage", "gyro-on", "armor-quickness-pen", "unarmed-specialized", "unarmed-miscmod", "weaponfocus-specialized", "metatype", "meleeselected"]; + var meleeattrs=["sheettype", "character_name","strength_max", "martialarts", "attackdamage", "attackpower", "reaction_max", "charisma_max", "unarmed", "unarmed-specialized", "cyberimplant", "weaponfocus-equipped", "weaponfocus-damage", "gyro-on", "armor-quickness-pen", "unarmed-miscmods", "weaponfocus-specialized", "metatype", "meleeselected"]; if ( mymode == "repeatingmelee" ) { var source=info['sourceAttribute'].split('_'); var sourceattr=source.pop(); @@ -6058,7 +6043,7 @@ on('clicked:matrixattack', (info) => { gyropen=4; gyropenroll = "{{gyropen=" + gyropen + "}}"; } - if (( mymode == "astralattack" ) || ( (payload != null) && (payload["plane"]=="astral"))) { + if (( mymode == "astralattack" ) || ( (payload != "none") && (payload["plane"]=="astral"))) { pool="astralpool"; myweapon="Astral Attack"; var myskill="@{astralcombat}"; @@ -6071,7 +6056,8 @@ on('clicked:matrixattack', (info) => { mypower=myval["charisma_max"]; focus="{{weaponfocus=@{weaponfocus-name}}}" force="{{focusforce=@{weaponfocus-force}}}" - } else if (( mymode == "unarmedattack" ) || (( attacktype.includes("defend") ) && (myval["meleeselected"] == "unarmed-equipped"))) { + } else if ((mymode="unarmedattack") || (( mymode.includes("defend")) && (myval["meleeselected"] == "unarmed-equipped"))) { + console.log('unarmed melee'); mydamage=attackdamage; myskill=myval["unarmed"]; myspec=myval["unarmed-specialized"]; @@ -6107,7 +6093,7 @@ on('clicked:matrixattack', (info) => { mytnmod=myval[myrepeat.concat("tnmods")]; if ( myval["metatype"] == "Troll" ) myreach=myval[myrepeat.concat("reach")] + 1; else myreach=myval[myrepeat.concat("reach")]; - } else if ((attacktype.includes("defend")) && (myval["meleeselected"] != "unarmed-equipped")) { + } else if ((mymode.includes("defend")) && (myval["meleeselected"] != "unarmed-equipped")) { myrepeat=myval["meleeselected"].slice(0, -12); newgets=[]; repeatatts.forEach(myatt=>{ newgets.push(myrepeat.concat(myatt)); }); @@ -6128,7 +6114,7 @@ on('clicked:matrixattack', (info) => { } var calcTN="4 + @{meleeTN} + ( ( @{target|Target|meleereach|max} - " + myreach + " ) * ?{Use Reach Modifier?} ) + " + mytnmod + " + " + defaultpen + " + " + gyropen; var calcDice=myskill + " + " + myspec ; - var myroll="&{template:attack}{{myname=" + myname + "}}{{target=@{target|Target|token_name}}}{{weapondamage=[[0]]}}{{weaponpower=[[" + mypower + "]]}}" + var myroll="&{template:melee}{{myname=" + myname + "}}{{target=@{target|Target|token_name}}}{{weapondamage=[[0]]}}{{weaponpower=[[" + mypower + "]]}}" if ( quicknesslinked.includes(myskill) ) { console.log('quick pen'); armorpen=myval["armor-quickness-pen"]; @@ -6154,8 +6140,9 @@ on('clicked:matrixattack', (info) => { myroll+="{{senddata=[[0]]}}"; myroll+=defaultmsg; myroll+=gyropenroll; - if ( payload == null ) { + if ( payload == "none" ) { myroll+="{{attacktest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" + myroll += "{{meleedefend=reg and full}}"; payload={ attacker: myname, strength: strmax, @@ -6175,7 +6162,7 @@ on('clicked:matrixattack', (info) => { var reachmodtxt="Reach Bonus Applied" ; if ( results.results.reachmod.result == 0 ) reachmodtxt="Reach Bonus Not Applied"; if ( pool != "none" ) updatepoolused(pool, results.results.pooldice.result ); - payload["reachmode"]=results.results.reachmod.result; + payload["reachmode"]=results.results.reachmod; payload["attacktest"]=results.results.attacktest.result; finishRoll( results.rollId, { reachmod: reachmodtxt, @@ -6186,8 +6173,21 @@ on('clicked:matrixattack', (info) => { }); }); + }; + on('clicked:meleedefend', (info) => { + payload=rollEscape.unescape(info["originalRollId"]); + meleecombat("defend", payload); }); - on('clicked:repeating_meleeweapons:attack', (info) => { + on('clicked:meleedefendfull', (info) => { + payload=rollEscape.unescape(info["originalRollId"]); + meleecombat("defend-full", payload); + }); + on('clicked:melee clicked:repeating_meleeweapons:attack', (info) => { + payload="none"; + const mymode=info["htmlAttributes"]["id"]; + meleecombat(mymode, payload); + }); + on('clicked:repeating_meleeweapons2:attack', (info) => { console.log(info); var atts=["combatpool-used", "gyro-on", "armor-quickness-pen"]; var rounds=1; @@ -8631,6 +8631,19 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"] {{#notes2}}
{{notes2}}
{{/notes2}}
+ +
+
{{myname}}: {{weaponname}} vs. {{target}}
+
Rolling: {{rolldice}}d6 vs. {{targetnumber}}
+ {{#combatpool}}
Combat Pool Used: {{combatpool}}
{{/combatpool}} + {{#weaponfocus}}
Weapon Focus: {{weaponfocus}} {{focusforce}}
{{/weaponfocus}} + {{#charreach}}
{{myname}} Reach: {{charreach}}
{{/charreach}} + {{#targetreach}}
{{target}} Reach: {{targetreach}}
{{/targetreach}} + {{#meleedefend}}
{{target}}: [Melee Defend](~selected|meleedefend||{{computed::senddata}}) [Melee Full Defense](~selected|meleedefensefull||{{computed::senddata}})
{{/senddata}} + {{#default}}
{{default}}
{{/default}} + {{#info}}
{{info}}
{{/info}} +
+
{{myname}}: {{weaponname}} vs. {{target}}
@@ -8655,7 +8668,6 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
{{#info}}
{{info}}
{{/info}}
-
{{myname}}: {{weaponname}} vs. {{target}}
From b40c3dc9e19a34caaf614ca7da6946ea9f4b98f1 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Sun, 5 Sep 2021 11:52:10 -0400 Subject: [PATCH 04/49] added styling for melee roll template --- Shadowrun3e/shadowrun3e.css | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index 0329f8fe47..6c6518fc80 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -934,6 +934,7 @@ min-width: 0; color: white; } +.sheet-rolltemplate-melee div.sheet-rtheader, .sheet-rolltemplate-attack div.sheet-rtheader { border-bottom: 3px solid black; background-color: red; @@ -990,6 +991,7 @@ min-width: 0; .sheet-rolltemplate-skill div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-adept div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-attack div.sheet-rtrow:nth-child(odd), +.sheet-rolltemplate-melee div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-resistance div.sheet-rtrow:nth-child(odd) { background-color: white; } @@ -1008,6 +1010,7 @@ min-width: 0; .sheet-rolltemplate-skill div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-adept div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-attack div.sheet-rtrow:nth-child(even), +.sheet-rolltemplate-melee div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-resistance div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-spell div.sheet-rtrow:nth-child(even) { background-color: lightgrey; @@ -1022,6 +1025,7 @@ min-width: 0; .sheet-rolltemplate-skill .sheet-numberspan, .sheet-rolltemplate-adept .sheet-numberspan, .sheet-rolltemplate-spell .sheet-numberspan, +.sheet-rolltemplate-melee .sheet-numberspan, .sheet-rolltemplate-resistance .sheet-numberspan, .sheet-rolltemplate-attack .sheet-numberspan{ background-color: yellow; @@ -1042,6 +1046,7 @@ min-width: 0; .sheet-rolltemplate-skill .inlinerollresult, .sheet-rolltemplate-adept .inlinerollresult, .sheet-rolltemplate-attack .inlinerollresult, +.sheet-rolltemplate-melee .inlinerollresult, .sheet-rolltemplate-resistance .inlinerollresult, .sheet-rolltemplate-spell .inlinerollresult { display: inline-block; @@ -1061,6 +1066,7 @@ min-width: 0; .sheet-rolltemplate-skill .inlinerollresult.fullcrit, .sheet-rolltemplate-adept .inlinerollresult.fullcrit, .sheet-rolltemplate-attack .inlinerollresult.fullcrit, +.sheet-rolltemplate-melee .inlinerollresult.fullcrit, .sheet-rolltemplate-resistance .inlinerollresult.fullcrit, .sheet-rolltemplate-spell .inlinerollresult.fullcrit { border: 2px solid #3FB315; @@ -1076,6 +1082,7 @@ min-width: 0; .sheet-rolltemplate-skill .inlinerollresult.fullfail, .sheet-rolltemplate-adept .inlinerollresult.fullfail, .sheet-rolltemplate-attack .inlinerollresult.fullfail, +.sheet-rolltemplate-melee .inlinerollresult.fullfail, .sheet-rolltemplate-resistance .inlinerollresult.fullfail, .sheet-rolltemplate-spell .inlinerollresult.fullfail { border: 2px solid #B31515; @@ -1091,6 +1098,7 @@ min-width: 0; .sheet-rolltemplate-skill .inlinerollresult.importantroll, .sheet-rolltemplate-adept .inlinerollresult.importantroll, .sheet-rolltemplate-attack .inlinerollresult.importantroll, +.sheet-rolltemplate-melee .inlinerollresult.importantroll, .sheet-rolltemplate-resistance .inlinerollresult.importantroll, .sheet-rolltemplate-spell .inlinerollresult.importantroll { border: 2px solid #4A57ED; From 844e2e1f205ec951ba1dab3f74d127ee379cda83 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Mon, 6 Sep 2021 09:56:15 -0400 Subject: [PATCH 05/49] melee combat / defense WIP --- Shadowrun3e/shadowrun3e.html | 136 +++++++++++++++++++---------------- 1 file changed, 75 insertions(+), 61 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 9543da530f..6214f6f264 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -2841,7 +2841,7 @@
@@ -6001,10 +6001,10 @@ on('clicked:matrixattack', (info) => { }); const meleecombat = function (mymode, payload) { + console.log(payload); + var plane=(payload["plane"])? payload["plane"] : "physical"; + const askreach=(payload["reachmode"])? payload["reachmode"] : 0; var atts=[]; - if ( payload != "none" ) { - payload=rollEscape.unescape(info["originalRollId"]); - } console.log(mymode); var myfocus = 0; var focus=""; @@ -6017,16 +6017,15 @@ on('clicked:matrixattack', (info) => { var defaultmsg=" "; var defaultpen=0; var myspec=0; + const repeatatts=["damage", "power", "name", "skill", "reach", "specialized", "notes", "tnmods"] ; var meleeattrs=["sheettype", "character_name","strength_max", "martialarts", "attackdamage", "attackpower", "reaction_max", "charisma_max", "unarmed", "unarmed-specialized", "cyberimplant", "weaponfocus-equipped", "weaponfocus-damage", "gyro-on", "armor-quickness-pen", "unarmed-miscmods", "weaponfocus-specialized", "metatype", "meleeselected"]; - if ( mymode == "repeatingmelee" ) { - var source=info['sourceAttribute'].split('_'); - var sourceattr=source.pop(); - var myrepeat=source.join('_').concat('_'); - const repeatatts=["damage", "power", "name", "skill", "reach", "specialized", "notes", "tnmods"] ; + if ( mymode.includes("repeating" )) { + console.log('using repeating'); repeatatts.forEach(myatt=>{ - meleeattrs.push(myrepeat.concat(myatt)); + meleeattrs.push(mymode.concat(myatt)); }); }; + console.log('ask reach ' + askreach); getAttrs(meleeattrs, function(myval) { const strmax=myval["strength_max"]; const attackdamage=myval["attackdamage"]; @@ -6042,9 +6041,9 @@ on('clicked:matrixattack', (info) => { if (( myval["gyro-on"] == 1 ) && ( mymode != "astralattack" )) { gyropen=4; gyropenroll = "{{gyropen=" + gyropen + "}}"; - } - if (( mymode == "astralattack" ) || ( (payload != "none") && (payload["plane"]=="astral"))) { + } if (( mymode == "astralattack" ) || (plane=="astral")) {; pool="astralpool"; + plane="astral"; myweapon="Astral Attack"; var myskill="@{astralcombat}"; var mydamage="M" @@ -6056,7 +6055,25 @@ on('clicked:matrixattack', (info) => { mypower=myval["charisma_max"]; focus="{{weaponfocus=@{weaponfocus-name}}}" force="{{focusforce=@{weaponfocus-force}}}" - } else if ((mymode="unarmedattack") || (( mymode.includes("defend")) && (myval["meleeselected"] == "unarmed-equipped"))) { + } + else if (mymode.includes("repeating")) { + myrepeat=mymode; + console.log('repeating melee'); + mynotes=myval[myrepeat.concat("mynotes")]; + myweapon=myval[myrepeat.concat("name")]; + mydamage=myval[myrepeat.concat("damage")]; + mypower=myval[myrepeat.concat("power")]; + myskill=myval[myrepeat.concat("skill")]; + myspec=myval[myrepeat.concat("specialized")]; + mytnmod=myval[myrepeat.concat("tnmods")]; + if ( myval["metatype"] == "Troll" ) myreach=myval[myrepeat.concat("reach")] + 1; + else myreach=myval[myrepeat.concat("reach")]; + } else if (( sheettype == "Critter" ) || (sheettype=="Spirit")) { + myskill=myval["reaction_max"]; + mydamage=myval["attackdamage"]; + mypower=myval["attackpower"]; + myweapon=sheettype + " Attack"; + } else { console.log('unarmed melee'); mydamage=attackdamage; myskill=myval["unarmed"]; @@ -6077,42 +6094,9 @@ on('clicked:matrixattack', (info) => { var defaultmsg="{{default=Skill Defaulted to Cyber Implant skill with +" + defaultpen + " to hit}}"; } } - } else if (( sheettype == "Critter" ) || (sheettype=="Spirit")) { - myskill=myval["reaction_max"]; - mydamage=myval["attackdamage"]; - mypower=myval["attackpower"]; - myweapon=sheettype + " Attack"; - } else if (mymode == "repeatingmelee" ) { - console.log('repeating melee'); - mynotes=myval[myrepeat.concat("mynotes")]; - myweapon=myval[myrepeat.concat("name")]; - mydamage=myval[myrepeat.concat("damage")]; - mypower=myval[myrepeat.concat("power")]; - myskill=myval[myrepeat.concat("skill")]; - myspec=myval[myrepeat.concat("specialized")]; - mytnmod=myval[myrepeat.concat("tnmods")]; - if ( myval["metatype"] == "Troll" ) myreach=myval[myrepeat.concat("reach")] + 1; - else myreach=myval[myrepeat.concat("reach")]; - } else if ((mymode.includes("defend")) && (myval["meleeselected"] != "unarmed-equipped")) { - myrepeat=myval["meleeselected"].slice(0, -12); - newgets=[]; - repeatatts.forEach(myatt=>{ newgets.push(myrepeat.concat(myatt)); }); - getAttrs(newgets, function(rval) { - console.log('repeating melee'); - mynotes=rval[myrepeat.concat("mynotes")]; - myweapon=rval[myrepeat.concat("name")]; - mydamage=rval[myrepeat.concat("damage")]; - mypower=rval[myrepeat.concat("power")]; - myskill=rval[myrepeat.concat("skill")]; - myspec=rval[myrepeat.concat("specialized")]; - mytnmod=rval[myrepeat.concat("tnmods")]; - if ( myval["metatype"] == "Troll" ) myreach=rval[myrepeat.concat("reach")] + 1; - else myreach=rval[myrepeat.concat("reach")]; - }); - } else { - console.log(' id ' + mymode + ' does not match'); - } - var calcTN="4 + @{meleeTN} + ( ( @{target|Target|meleereach|max} - " + myreach + " ) * ?{Use Reach Modifier?} ) + " + mytnmod + " + " + defaultpen + " + " + gyropen; + } + var calcTN="4 + @{meleeTN} + " + mytnmod + " + " + defaultpen + " + " + gyropen; + if (askreach==0) calcTN += " + ( ( @{target|Target|meleereach|max} - " + myreach + " ) * ?{Use Reach Modifier?} )"; var calcDice=myskill + " + " + myspec ; var myroll="&{template:melee}{{myname=" + myname + "}}{{target=@{target|Target|token_name}}}{{weapondamage=[[0]]}}{{weaponpower=[[" + mypower + "]]}}" if ( quicknesslinked.includes(myskill) ) { @@ -6134,8 +6118,8 @@ on('clicked:matrixattack', (info) => { myroll += "{{pooldice=[[0]]}}" } myroll+= "{{charreach=[[" + myreach + "]]}}{{targetreach=[[@{target|Target|meleereach|max}]]}}" - myroll+="{{weaponname=" + myweapon + "}}{{reachmod=[[?{Use Reach Modifier?|Yes,1|No,0}]]}}" - myroll+="{{reachbonus=[[(@{target|Target|meleereach|max} - @{meleereach|max} ) * ?{Use Reach Modifier?}]]}}" + myroll+="{{weaponname=" + myweapon + "}}" + if (askreach==0) myroll+="{{reachmod=[[?{Use Reach Modifier?|Yes,1|No,0}]]}}{{reachbonus=[[(@{target|Target|meleereach|max} - @{meleereach|max} ) * ?{Use Reach Modifier?}]]}}" myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}" myroll+="{{senddata=[[0]]}}"; myroll+=defaultmsg; @@ -6147,9 +6131,9 @@ on('clicked:matrixattack', (info) => { attacker: myname, strength: strmax, power: mypower, - wdmg: mydamage + wdmg: mydamage, + plane: plane }; - payload["plane"]=(pool=="astralpool")? "astral" : "physical"; } else { myroll+="{{defensetest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" payload["defender"]=myname, @@ -6157,13 +6141,15 @@ on('clicked:matrixattack', (info) => { payload["dpower"]=mypower, payload["dwdmg"]=mydamage } + console.log('wdmg ' + mydamage); console.log(myroll); startRoll(myroll, (results) => { var reachmodtxt="Reach Bonus Applied" ; if ( results.results.reachmod.result == 0 ) reachmodtxt="Reach Bonus Not Applied"; if ( pool != "none" ) updatepoolused(pool, results.results.pooldice.result ); - payload["reachmode"]=results.results.reachmod; + payload["reachmode"]=results.results.reachmod.result; payload["attacktest"]=results.results.attacktest.result; + console.log(payload); finishRoll( results.rollId, { reachmod: reachmodtxt, weapondamage: mydamage, @@ -6172,17 +6158,36 @@ on('clicked:matrixattack', (info) => { }); }); - }; on('clicked:meleedefend', (info) => { - payload=rollEscape.unescape(info["originalRollId"]); - meleecombat("defend", payload); + console.log(info); + payload=rollEscape.unescape(info["originalRollId"]); + getAttrs(["meleeselected"], function(myval) { + payload["defmode"]="regular"; + const mselect=myval["meleeselected"]; + mymode = (mselect == "unarmed-equipped")? "unarmedattack" : mselect.slice(0, -12); + meleecombat(mymode, payload); + }); }); on('clicked:meleedefendfull', (info) => { - payload=rollEscape.unescape(info["originalRollId"]); - meleecombat("defend-full", payload); + console.log(info); + payload=rollEscape.unescape(info["originalRollId"]); + getAttrs(["meleeselected"], function(myval) { + payload["defmode"]="full"; + const mselect=myval["meleeselected"]; + mymode = (mselect == "unarmed-equipped")? "unarmedattack" : mselect.slice(0, -12); + meleecombat(mymode, payload); + }); }); - on('clicked:melee clicked:repeating_meleeweapons:attack', (info) => { + + on('clicked:repeating_meleeweapons:attack', (info) => { + var source=info['sourceAttribute'].split('_'); + var sourceattr=source.pop(); + var myrepeat=source.join('_').concat('_'); + payload="none"; + meleecombat(myrepeat, payload); + }); + on('clicked:melee', (info) => { payload="none"; const mymode=info["htmlAttributes"]["id"]; meleecombat(mymode, payload); @@ -8635,11 +8640,20 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
{{myname}}: {{weaponname}} vs. {{target}}
Rolling: {{rolldice}}d6 vs. {{targetnumber}}
+
Attack Test: {{attacktest}}
+
Weapon Damage: {{computed::weaponpower}} {{computed::weapondamage}}
{{#combatpool}}
Combat Pool Used: {{combatpool}}
{{/combatpool}} + {{#pooldice}}
{{pooltype}} Poll Used: {{pooldice}}
{{/pooldice}} {{#weaponfocus}}
Weapon Focus: {{weaponfocus}} {{focusforce}}
{{/weaponfocus}} {{#charreach}}
{{myname}} Reach: {{charreach}}
{{/charreach}} {{#targetreach}}
{{target}} Reach: {{targetreach}}
{{/targetreach}} - {{#meleedefend}}
{{target}}: [Melee Defend](~selected|meleedefend||{{computed::senddata}}) [Melee Full Defense](~selected|meleedefensefull||{{computed::senddata}})
{{/senddata}} +
{{target}}: {{#attacktest}}[Defend](~selected|meleedefend||{{computed::senddata}}) [Full Defense](~selected|meleedefendfull||{{computed::senddata}}){{/attacktest}} + {{#dodge}}[Dodge](~selected|dodge||{{computed::senddata}}){{/dodge}}{{#defensetest}}[Resist](~selected|meleedefensefull||{{computed::senddata}}){{/defensetest}}
+
Mods: + {{#reachmod}} Reach:{{computed::reachmod}}{{/reachmod}} + {{#meleemods}} Melee:{{meleemods}}{{/meleemods}} + {{#armorpen}} Armor Penalty:{{armorpen}}{{/armorpen}} + {{#gyropen}} Gyro Penalty:{{gyropen}}{{/gyropen}} {{#movemods}} Move Penalty:{{movemods}}{{/movemods}}
{{#default}}
{{default}}
{{/default}} {{#info}}
{{info}}
{{/info}}
From 6c729790e99d82763ff9914adf54e141db3f67da Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Tue, 7 Sep 2021 08:27:29 -0400 Subject: [PATCH 06/49] continuing work on melee attack/defend/resist --- Shadowrun3e/shadowrun3e.html | 47 +++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 9 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 6214f6f264..f2ca5c1e5e 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -6119,42 +6119,71 @@ on('clicked:matrixattack', (info) => { } myroll+= "{{charreach=[[" + myreach + "]]}}{{targetreach=[[@{target|Target|meleereach|max}]]}}" myroll+="{{weaponname=" + myweapon + "}}" - if (askreach==0) myroll+="{{reachmod=[[?{Use Reach Modifier?|Yes,1|No,0}]]}}{{reachbonus=[[(@{target|Target|meleereach|max} - @{meleereach|max} ) * ?{Use Reach Modifier?}]]}}" + myroll+= (askreach==0)? "{{reachmod=[[?{Use Reach Modifier?|Yes,1|No,0}]]}}{{reachbonus=[[(@{target|Target|meleereach|max} - @{meleereach|max} ) * ?{Use Reach Modifier?}]]}}" : "{{reachmod=[[0]]}}"; myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}" myroll+="{{senddata=[[0]]}}"; myroll+=defaultmsg; myroll+=gyropenroll; if ( payload == "none" ) { myroll+="{{attacktest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" - myroll += "{{meleedefend=reg and full}}"; + myroll += "{{attackmode=Attack}}{{defend=yes}}"; payload={ attacker: myname, strength: strmax, power: mypower, wdmg: mydamage, - plane: plane + plane: plane, + maxd: 4 - damagetable[mydamage] }; } else { - myroll+="{{defensetest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" + myroll+="{{attacktest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" + myroll += "{{resist=yes}}"; + myroll += (payload["defmode"]=="regular")? "{{attackmode=Defend}}" : "{{attackmode=Full Defense}}{{dodge=yes}}"; payload["defender"]=myname, payload["dstrength"]=strmax, payload["dpower"]=mypower, payload["dwdmg"]=mydamage + payload["dmaxd"]= 4 - damagetable[mydamage]; } console.log('wdmg ' + mydamage); console.log(myroll); startRoll(myroll, (results) => { + var delta; var reachmodtxt="Reach Bonus Applied" ; if ( results.results.reachmod.result == 0 ) reachmodtxt="Reach Bonus Not Applied"; - if ( pool != "none" ) updatepoolused(pool, results.results.pooldice.result ); payload["reachmode"]=results.results.reachmod.result; - payload["attacktest"]=results.results.attacktest.result; + if (payload["attacktest"]) { + console.log('defense run'); + defroll=results.results.attacktest.result; + if (payload["attacktest"] >= defroll ) { + delta=Math.floor((payload["attacktest"] - defroll)/2); + finaldmg=(delta >= payload["maxd"])? 4 : damagetable[payload["wdmg"]] + delta; + finalpower=(delta >= payload["maxd"])? payload["power"] + (delta - payload["maxd"]) : payload["power"]; + + console.log('attacker wins'); + } else { + console.log('defender wins'); + delta=Math.floor((defroll - payload["attacktest"])/2); + if ( payload["defmode"] == "regular" ) { + finaldmg=(delta >= payload["dmaxd"])? 4 : damagetable[payload["dwdmg"]] + delta; + finalpower=(delta >= payload["maxd"])? payload["power"] + (delta - payload["maxd"]) : payload["power"]; + } else { + console.log('full defense mode'); + finalpower="Attack"; + finaldamage="Parried"; + } + } + } else { + console.log('attack run'); + payload["attacktest"]=results.results.attacktest.result; + } console.log(payload); finishRoll( results.rollId, { reachmod: reachmodtxt, weapondamage: mydamage, senddata: rollEscape.escape(payload), }); + if ( pool != "none" ) updatepoolused(pool, results.results.pooldice.result ); }); }); @@ -8640,15 +8669,15 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
{{myname}}: {{weaponname}} vs. {{target}}
Rolling: {{rolldice}}d6 vs. {{targetnumber}}
-
Attack Test: {{attacktest}}
+
{{attackmode}} Test: {{attacktest}}
Weapon Damage: {{computed::weaponpower}} {{computed::weapondamage}}
{{#combatpool}}
Combat Pool Used: {{combatpool}}
{{/combatpool}} {{#pooldice}}
{{pooltype}} Poll Used: {{pooldice}}
{{/pooldice}} {{#weaponfocus}}
Weapon Focus: {{weaponfocus}} {{focusforce}}
{{/weaponfocus}} {{#charreach}}
{{myname}} Reach: {{charreach}}
{{/charreach}} {{#targetreach}}
{{target}} Reach: {{targetreach}}
{{/targetreach}} -
{{target}}: {{#attacktest}}[Defend](~selected|meleedefend||{{computed::senddata}}) [Full Defense](~selected|meleedefendfull||{{computed::senddata}}){{/attacktest}} - {{#dodge}}[Dodge](~selected|dodge||{{computed::senddata}}){{/dodge}}{{#defensetest}}[Resist](~selected|meleedefensefull||{{computed::senddata}}){{/defensetest}}
+
{{target}}: {{#defend}}[Defend](~selected|meleedefend||{{computed::senddata}}) [Full Defense](~selected|meleedefendfull||{{computed::senddata}}){{/defend}} + {{#dodge}}[Dodge](~selected|dodge||{{computed::senddata}}){{/dodge}}{{#resist}}[Resist](~selected|meleedefensefull||{{computed::senddata}}){{/resist}}
Mods: {{#reachmod}} Reach:{{computed::reachmod}}{{/reachmod}} {{#meleemods}} Melee:{{meleemods}}{{/meleemods}} From 1a0d5dcf31385d56b8f4358c65c774f16c5eae95 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Tue, 7 Sep 2021 10:29:02 -0400 Subject: [PATCH 07/49] added final weapon power/dmg --- Shadowrun3e/shadowrun3e.html | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index f2ca5c1e5e..e8b773a3cd 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -5288,6 +5288,7 @@ on('clicked:matrixattack', (info) => { } const ammomods = { + melee: { armor: "impact", av: 0, power: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, regular: { armor: "ballistic", av: 0, power: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: ""}, adps: { armor: "Math.floor(ballistic * 0.5)", av: 0, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" }, explosive: { armor: "ballistic", av: 0, power: 1, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, @@ -6136,8 +6137,9 @@ on('clicked:matrixattack', (info) => { maxd: 4 - damagetable[mydamage] }; } else { - myroll+="{{attacktest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" + myroll+="{{defensetest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" myroll += "{{resist=yes}}"; + myroll += "{{winner=[[0]]}}"; myroll += (payload["defmode"]=="regular")? "{{attackmode=Defend}}" : "{{attackmode=Full Defense}}{{dodge=yes}}"; payload["defender"]=myname, payload["dstrength"]=strmax, @@ -6154,23 +6156,26 @@ on('clicked:matrixattack', (info) => { payload["reachmode"]=results.results.reachmod.result; if (payload["attacktest"]) { console.log('defense run'); - defroll=results.results.attacktest.result; + defroll=results.results.defensetest.result; + paylaod["ammotype"]="melee"; + payload["range"]="melee"; if (payload["attacktest"] >= defroll ) { delta=Math.floor((payload["attacktest"] - defroll)/2); finaldmg=(delta >= payload["maxd"])? 4 : damagetable[payload["wdmg"]] + delta; - finalpower=(delta >= payload["maxd"])? payload["power"] + (delta - payload["maxd"]) : payload["power"]; - + payload["wdmg"]=damagetable[finaldmg]; + payload["power"]=(delta >= payload["maxd"])? payload["power"] + (delta - payload["maxd"]) : payload["power"]; console.log('attacker wins'); } else { console.log('defender wins'); delta=Math.floor((defroll - payload["attacktest"])/2); if ( payload["defmode"] == "regular" ) { finaldmg=(delta >= payload["dmaxd"])? 4 : damagetable[payload["dwdmg"]] + delta; - finalpower=(delta >= payload["maxd"])? payload["power"] + (delta - payload["maxd"]) : payload["power"]; + payload["wdmg"]=damagetable[finaldmg]; + payload["power"]=(delta >= payload["maxd"])? payload["power"] + (delta - payload["maxd"]) : payload["power"]; } else { console.log('full defense mode'); - finalpower="Attack"; - finaldamage="Parried"; + payload["wdmg"]="Attack"; + payload["power"]="Parried"; } } } else { @@ -8669,14 +8674,15 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
{{myname}}: {{weaponname}} vs. {{target}}
Rolling: {{rolldice}}d6 vs. {{targetnumber}}
-
{{attackmode}} Test: {{attacktest}}
+ {{#attacktest}}
Attack Test: {{attacktest}}
{{/attacktest}} + {{#defensetest}}
Defense Test: {{defensetest}}
{{/defensetest}}
Weapon Damage: {{computed::weaponpower}} {{computed::weapondamage}}
{{#combatpool}}
Combat Pool Used: {{combatpool}}
{{/combatpool}} {{#pooldice}}
{{pooltype}} Poll Used: {{pooldice}}
{{/pooldice}} {{#weaponfocus}}
Weapon Focus: {{weaponfocus}} {{focusforce}}
{{/weaponfocus}} {{#charreach}}
{{myname}} Reach: {{charreach}}
{{/charreach}} {{#targetreach}}
{{target}} Reach: {{targetreach}}
{{/targetreach}} -
{{target}}: {{#defend}}[Defend](~selected|meleedefend||{{computed::senddata}}) [Full Defense](~selected|meleedefendfull||{{computed::senddata}}){{/defend}} +
{{target}}: {{#defensetest}}[Defend](~selected|meleedefend||{{computed::senddata}}) [Full Defense](~selected|meleedefendfull||{{computed::senddata}}){{/defensetest}} {{#dodge}}[Dodge](~selected|dodge||{{computed::senddata}}){{/dodge}}{{#resist}}[Resist](~selected|meleedefensefull||{{computed::senddata}}){{/resist}}
Mods: {{#reachmod}} Reach:{{computed::reachmod}}{{/reachmod}} From de50edb804d7f83790c46f43dbe88ad1eb7f426d Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Tue, 7 Sep 2021 18:48:31 -0400 Subject: [PATCH 08/49] added melee defend / full defense / dodge and resist buttons to meleecombat sheetroll. Enhanced resistnace roll logic to show armor select when defending against differnt ammo types. --- Shadowrun3e/shadowrun3e.html | 162 ++++++++++++++++++++--------------- 1 file changed, 91 insertions(+), 71 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index e8b773a3cd..f579b5b42f 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -4457,12 +4457,13 @@ buttonlist.forEach(button => { const attributes=[ "body", "quickness", "strength", "charisma", "willpower", "intelligence", "force" ]; const quicknesslinked=["@{blowgun}", "@{bracer}", "@{guncane}", "@{gyrojet}", "@{eyegun}", "@{oralgun}", "@{oralstrike}", "@{pistols}", "@{smgs}", "@{rifles}", "@{assaultrifles}", "@{lasers}", "@{whips}", "@{stealth}", "@{shotguns}"] const damagetable = { - "N/A": 0, + "None": 0, "L": 1, "M": 2, "S": 3, "D": 4, - 0: "N/A", + 0: "None", + 9: "None", 1: "L", 2: "M", 3: "S", @@ -5124,9 +5125,9 @@ on('clicked:matrixattack', (info) => { draindmg=eval(drainlvl); console.log('drdmg calc: ' + draindmg); var dmgmax=4; - var dmgmin=1; + var dmgmin=0; if (draindmg >= 10) dmgmax=13; - if (draindmg >= 10) dmgmin=10; + if (draindmg >= 10) dmgmin=9; if (draindmg > dmgmax) draindmg=dmgmax; if (draindmg < dmgmin) draindmg=dmgmin; @@ -5288,22 +5289,22 @@ on('clicked:matrixattack', (info) => { } const ammomods = { - melee: { armor: "impact", av: 0, power: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, - regular: { armor: "ballistic", av: 0, power: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: ""}, - adps: { armor: "Math.floor(ballistic * 0.5)", av: 0, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" }, - explosive: { armor: "ballistic", av: 0, power: 1, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, - explosive2: { armor: "ballistic", av: 0, power: 2, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, - flechette: { armor: "(Math.max(ballistic, (impact * 2)))", av: -0.5, power: 0, rpower:0, dmg:0, rdmg: "(armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, - gel: { armor: "impact", av: 0, power: -2, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 2, amsg: "" }, - tracer: { armor: "ballistic", av: 0, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, - av: { armor: "Math.floor(ballistic * 0.5)", av: 1, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" }, - capsule: { armor: "impact", av: 0, power: -2, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, - glazer: { armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 2, rpower:0, dmg:0, rdmg: "( armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, - hic: { armor: "Math.max(ballistic,impact)", av: 0, power: "(range==6)? -1 : (range==9)? -1", rpower:0, dmg: 0, rdmg:0, recoil: 2, barrier: 1, knockdown: 1, amsg: "" }, - hpoint: { armor: "ballistic + impact", av: 0, power:0, rpower: "((ballistic + impact ==0)? 3 : 1", dmg: 0, rdmg:0, recoil: 2, barrier: 1, knockdown: 1, amsg: "Final Power Rating depends on Armor" }, - incendiary: { armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, - mercury: { armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 0, rpower: 0, dmg: 0, rdmg: "( armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, - tracker: { armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg: 0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" } + melee: { armorname: "'impact'", armor: "impact", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, + regular: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1 , amsg: ""}, + adps: { armorname: "'half Ballistic'", armor: "Math.floor(ballistic * 0.5)", av: 0, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" }, + explosive: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 1, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, + explosive2: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 2, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, + flechette: { armorname: "(ballistic >(2*impact))? 'ballistic' : 'impact';", armor: "(Math.max(ballistic, (impact * 2)))", av: -0.5, power: 0, rpower:0, dmg:0, rdmg: "(armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, + gel: { armorname: "'impact'", armor: "impact", av: 0, power: -2, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 2, amsg: "" }, + tracer: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, + av: { armorname: "'half Ballistic'", armor: "Math.floor(ballistic * 0.5)", av: 1, power: 0, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 0.5, knockdown: 1, amsg: "" }, + capsule: { armorname: "'impact'", armor: "impact", av: 0, power: -2, rpower:0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, + glazer: { armorname: "(ballistic > impact)? 'ballistic' : 'impact';", armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 2, rpower:0, dmg:0, rdmg: "( armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, + hic: { armorname: "(ballistic > impact)? 'ballistic' : 'impact';", armor: "Math.max(ballistic,impact)", av: 0, power: "(range==6)? -1 : (range==9)? -1", rpower:0, dmg: 0, rdmg:0, recoil: 2, barrier: 1, knockdown: 1, amsg: "" }, + hpoint: { armorname: "'ballistic + Impact'", armor: "ballistic + impact", av: 0, power:0, rpower: "(armoron == 0)? 3 : 1", dmg: 0, rdmg:0, recoil: 2, barrier: 1, knockdown: 1, amsg: "Final Power Rating depends on Armor" }, + incendiary: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" }, + mercury: { armorname: "(ballistic > impact)? 'ballistic' : 'impact';", armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 0, rpower: 0, dmg: 0, rdmg: "( armoron == 0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1, amsg: "Final Damage Level depends on Armor" }, + tracker: { armorname: "'ballistic'", armor: "ballistic", av: 0, power: 0, rpower: 0, dmg: 0, rdmg: 0, recoil: 1, barrier: 1, knockdown: 1, amsg: "" } } const resistdmg = function (myid, mods) { @@ -5312,6 +5313,7 @@ on('clicked:matrixattack', (info) => { const ballistic=myval["ballistic"]; const impact=myval["impact"]; const armoron=myval["armor-on"]; + var armorname; var wdmg; var dmgcode=0; var weapondmg="none"; @@ -5339,14 +5341,18 @@ on('clicked:matrixattack', (info) => { myroll+="{{dodge=[[" + mods["dodge"] + "]]}}"; myroll +="{{AttackType=" + ammo + "}}"; calcTN="?{Attack Power} + " + powermod + " - " + armorval; + myid=eval(ammomods[ammo]["armorname"]); + console.log('test 1 ' + myid); + myroll += "{{armorvalue=" + armorval + "}}"; } else { myroll +="{{Power=?{Attack Power|4}}}"; myroll +="{{AttackType=" + mods + "}}"; calcTN="?{Attack Power} - (floor(@{" + myid + "} * " + mods + "))"; + myroll += "{{armorvalue=@{" + myid + "}}}" } let actionname = myid.charAt(0).toUpperCase() + myid.slice(1); var calcDice= "@{body|max} + ?{Combat Pool Dice}"; - myroll +="{{name=" + actionname + " Armor}}{{character=@{character_name}}}{{armorvalue=@{" + myid + "}}}{{combatpool=[[?{Combat Pool Dice|0}]]}}"; + myroll +="{{name=" + actionname + " Armor}}{{character=@{character_name}}}{{combatpool=[[?{Combat Pool Dice|0}]]}}"; myroll +="{{action=Resistance Test}}"; myroll +="{{finaldmg=[[0]]}}{{netresult=[[0]]}}"; myroll +="{{rolldice=[[" + calcDice + "]]}}"; @@ -5362,9 +5368,9 @@ on('clicked:matrixattack', (info) => { var finaldmg=dmgcode + stage; console.log('finaldmg ' + finaldmg); var dmgmax=4; - var dmgmin=1; + var dmgmin=0; if (dmgcode >= 10) dmgmax=13; - if (dmgcode >= 10) dmgmin=10; + if (dmgcode >= 10) dmgmin=9; if (finaldmg > dmgmax) finaldmg=dmgmax; if (finaldmg < dmgmin) finaldmg=dmgmin; updatepoolused("combatpool", results.results.combatpool.result); @@ -5428,17 +5434,18 @@ on('clicked:matrixattack', (info) => { }); - var dodge = function (mods) { + const dodge = function (mods) { myroll="&{template:resistance}"; if ( typeof mods === 'object' && mods !== null ) { payload=mods; console.log(payload); - mods="?{Modifiers?|" + Math.floor(payload["rounds"] / 3 ) + "}"; + mods=(payload["rounds"])? "?{Modifiers?|" + Math.floor(payload["rounds"] / 3 ) + "}" : parseInt(payload["meleetn"] - 4); myroll +="{{senddata=[[0]]}}"; } console.log('mods: ' + mods); var calcDice= "?{Combat Pool Dice}"; - calcTN="4 + " + mods; + calcTN="4 + " + mods; + calcTN +=(payload["rounds"])? " + @{wp-char}" : ""; myroll +="{{name=Dodge}}{{character=@{character_name}}}" myroll +="{{combatpool=[[?{Combat Pool Dice|0}]]}}"; myroll +="{{action=Dodge Test}}"; @@ -5887,7 +5894,7 @@ on('clicked:matrixattack', (info) => { dmgnumber += 9; wdmg=damagetable[dmgnumber]; } - if (dmgnumber >= 10) dmgmax=13, dmgmin=10; + if (dmgnumber >= 10) dmgmax=13, dmgmin=9; var wpower= myval[myrepeat.concat("power")]; var ammoleft=myval[myrepeat.concat("ammoremain")]; const prevrounds=myval["rounds-phase"]; @@ -6010,10 +6017,7 @@ on('clicked:matrixattack', (info) => { var myfocus = 0; var focus=""; var force=""; - var mydamage; - var myskill; - var myweapon; - var mypower; + var mydamage, myskill, myweapon, mypower, defroll; var pool="combatpool"; var defaultmsg=" "; var defaultpen=0; @@ -6028,9 +6032,9 @@ on('clicked:matrixattack', (info) => { }; console.log('ask reach ' + askreach); getAttrs(meleeattrs, function(myval) { - const strmax=myval["strength_max"]; + const strmax=parseInt(myval["strength_max"]); const attackdamage=myval["attackdamage"]; - const attackpower=myval["attackpower"]; + const attackpower=parseInt(myval["attackpower"]); const myname=myval["character_name"]; const sheettype=myval["sheettype"]; var mynotes=""; @@ -6053,7 +6057,7 @@ on('clicked:matrixattack', (info) => { myspec=myval["weaponfocus-specialized"]; mydamage=myval["weaponfocus-damage"]; } - mypower=myval["charisma_max"]; + mypower=parseInt(myval["charisma_max"]); focus="{{weaponfocus=@{weaponfocus-name}}}" force="{{focusforce=@{weaponfocus-force}}}" } @@ -6063,7 +6067,7 @@ on('clicked:matrixattack', (info) => { mynotes=myval[myrepeat.concat("mynotes")]; myweapon=myval[myrepeat.concat("name")]; mydamage=myval[myrepeat.concat("damage")]; - mypower=myval[myrepeat.concat("power")]; + mypower=parseInt(myval[myrepeat.concat("power")]); myskill=myval[myrepeat.concat("skill")]; myspec=myval[myrepeat.concat("specialized")]; mytnmod=myval[myrepeat.concat("tnmods")]; @@ -6072,7 +6076,7 @@ on('clicked:matrixattack', (info) => { } else if (( sheettype == "Critter" ) || (sheettype=="Spirit")) { myskill=myval["reaction_max"]; mydamage=myval["attackdamage"]; - mypower=myval["attackpower"]; + mypower=parseInt(myval["attackpower"]); myweapon=sheettype + " Attack"; } else { console.log('unarmed melee'); @@ -6099,7 +6103,7 @@ on('clicked:matrixattack', (info) => { var calcTN="4 + @{meleeTN} + " + mytnmod + " + " + defaultpen + " + " + gyropen; if (askreach==0) calcTN += " + ( ( @{target|Target|meleereach|max} - " + myreach + " ) * ?{Use Reach Modifier?} )"; var calcDice=myskill + " + " + myspec ; - var myroll="&{template:melee}{{myname=" + myname + "}}{{target=@{target|Target|token_name}}}{{weapondamage=[[0]]}}{{weaponpower=[[" + mypower + "]]}}" + var myroll="&{template:melee}{{myname=" + myname + "}}{{target=@{target|Target|token_name}}}{{weapondamage=[[0]]}}{{finalwinner=[[0]]}}{{weaponpower=[[" + mypower + "]]}}" if ( quicknesslinked.includes(myskill) ) { console.log('quick pen'); armorpen=myval["armor-quickness-pen"]; @@ -6118,17 +6122,17 @@ on('clicked:matrixattack', (info) => { } else { myroll += "{{pooldice=[[0]]}}" } + myroll+="{{senddata=[[0]]}}"; myroll+= "{{charreach=[[" + myreach + "]]}}{{targetreach=[[@{target|Target|meleereach|max}]]}}" myroll+="{{weaponname=" + myweapon + "}}" myroll+= (askreach==0)? "{{reachmod=[[?{Use Reach Modifier?|Yes,1|No,0}]]}}{{reachbonus=[[(@{target|Target|meleereach|max} - @{meleereach|max} ) * ?{Use Reach Modifier?}]]}}" : "{{reachmod=[[0]]}}"; myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}" - myroll+="{{senddata=[[0]]}}"; - myroll+=defaultmsg; - myroll+=gyropenroll; if ( payload == "none" ) { myroll+="{{attacktest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" myroll += "{{attackmode=Attack}}{{defend=yes}}"; payload={ + dodge: 0, + armortype: "impact", attacker: myname, strength: strmax, power: mypower, @@ -6137,57 +6141,73 @@ on('clicked:matrixattack', (info) => { maxd: 4 - damagetable[mydamage] }; } else { - myroll+="{{defensetest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}" - myroll += "{{resist=yes}}"; - myroll += "{{winner=[[0]]}}"; + myroll += "{{attacknumber=[[" + payload["attacktest"] + "]]}}{{win=[[1]]}}{{attacker=" + payload["attacker"] + "}}{{defender=" + myname + "}}"; + myroll += "{{defensetest=[[ [[" + calcDice + "]]d6>[[ {2,[[ " + calcTN + "]]}kh1]]!! ]] }}"; myroll += (payload["defmode"]=="regular")? "{{attackmode=Defend}}" : "{{attackmode=Full Defense}}{{dodge=yes}}"; - payload["defender"]=myname, - payload["dstrength"]=strmax, - payload["dpower"]=mypower, - payload["dwdmg"]=mydamage payload["dmaxd"]= 4 - damagetable[mydamage]; } + myroll+=defaultmsg; + myroll+=gyropenroll; console.log('wdmg ' + mydamage); console.log(myroll); startRoll(myroll, (results) => { - var delta; + var delta, finalpower, finaldmg, mywinner, mylooser; var reachmodtxt="Reach Bonus Applied" ; if ( results.results.reachmod.result == 0 ) reachmodtxt="Reach Bonus Not Applied"; payload["reachmode"]=results.results.reachmod.result; if (payload["attacktest"]) { console.log('defense run'); defroll=results.results.defensetest.result; - paylaod["ammotype"]="melee"; + payload["ammotype"]="melee"; payload["range"]="melee"; + payload["meleetn"]=results.results.targetnumber.result; if (payload["attacktest"] >= defroll ) { + mywinner=payload["attacker"]; + mylooser=myname; delta=Math.floor((payload["attacktest"] - defroll)/2); - finaldmg=(delta >= payload["maxd"])? 4 : damagetable[payload["wdmg"]] + delta; - payload["wdmg"]=damagetable[finaldmg]; - payload["power"]=(delta >= payload["maxd"])? payload["power"] + (delta - payload["maxd"]) : payload["power"]; + payload["wdmg"]=finaldmg=damagetable[(delta >= payload["maxd"])? 4 : damagetable[payload["wdmg"]] + delta]; + payload["power"]=finalpower=(delta >= payload["maxd"])? payload["power"] + (delta - payload["maxd"]) : payload["power"]; console.log('attacker wins'); } else { console.log('defender wins'); + mywinner=myname; + mylooser=payload["attacker"]; delta=Math.floor((defroll - payload["attacktest"])/2); if ( payload["defmode"] == "regular" ) { - finaldmg=(delta >= payload["dmaxd"])? 4 : damagetable[payload["dwdmg"]] + delta; - payload["wdmg"]=damagetable[finaldmg]; - payload["power"]=(delta >= payload["maxd"])? payload["power"] + (delta - payload["maxd"]) : payload["power"]; + payload["wdmg"]=finaldmg=damagetable[(delta >= payload["dmaxd"])? 4 : damagetable[mydamage] + delta]; + payload["power"]=finalpower=(delta >= payload["dmaxd"])? mypower + (delta - payload["dmaxd"]) : mypower; + payload["strength"]=strmax; } else { console.log('full defense mode'); payload["wdmg"]="Attack"; payload["power"]="Parried"; } } + payload["attacktest"]=0; } else { console.log('attack run'); payload["attacktest"]=results.results.attacktest.result; } console.log(payload); - finishRoll( results.rollId, { - reachmod: reachmodtxt, - weapondamage: mydamage, - senddata: rollEscape.escape(payload), - }); + if (defroll != null) { + console.log('finish dmg ' + finaldmg + ' power ' + finalpower + ' winner: ' + typeof mywinner + ' looser: ' + mylooser); + let testmsg='brad'; + finishRoll( results.rollId, { + finalwinner: mylooser, + reachmod: reachmodtxt, + weapondamage: mydamage, + weapondamage: finaldmg, + weaponpower: finalpower, + senddata: rollEscape.escape(payload), + }); + } else { + finishRoll( results.rollId, { + reachmod: reachmodtxt, + weapondamage: mydamage, + senddata: rollEscape.escape(payload), + }); + + } if ( pool != "none" ) updatepoolused(pool, results.results.pooldice.result ); }); @@ -8673,17 +8693,17 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
{{myname}}: {{weaponname}} vs. {{target}}
+
Mode: {{attackmode}}
Rolling: {{rolldice}}d6 vs. {{targetnumber}}
{{#attacktest}}
Attack Test: {{attacktest}}
{{/attacktest}} - {{#defensetest}}
Defense Test: {{defensetest}}
{{/defensetest}} + {{#defensetest}}
{{attacker}}: {{attacknumber}} vs. {{defender}}:{{defensetest}}
{{/defensetest}}
Weapon Damage: {{computed::weaponpower}} {{computed::weapondamage}}
{{#combatpool}}
Combat Pool Used: {{combatpool}}
{{/combatpool}} {{#pooldice}}
{{pooltype}} Poll Used: {{pooldice}}
{{/pooldice}} {{#weaponfocus}}
Weapon Focus: {{weaponfocus}} {{focusforce}}
{{/weaponfocus}} - {{#charreach}}
{{myname}} Reach: {{charreach}}
{{/charreach}} - {{#targetreach}}
{{target}} Reach: {{targetreach}}
{{/targetreach}} -
{{target}}: {{#defensetest}}[Defend](~selected|meleedefend||{{computed::senddata}}) [Full Defense](~selected|meleedefendfull||{{computed::senddata}}){{/defensetest}} - {{#dodge}}[Dodge](~selected|dodge||{{computed::senddata}}){{/dodge}}{{#resist}}[Resist](~selected|meleedefensefull||{{computed::senddata}}){{/resist}}
+ {{#attacktest}}
{{target}}: [Defend](~selected|meleedefend||{{computed::senddata}}) [Full Defense](~selected|meleedefendfull||{{computed::senddata}})
{{/attacktest}} + {{#defensetest}}
Loser: {{computed::finalwinner}} {{#dodge}}[Dodge](~selected|dodge||{{computed::senddata}}){{/dodge}} [Resist](~selected|resistroll||{{computed::senddata}})
{{/defensetest}} +
Reach: {{myname}}: {{charreach}} vs. {{target}}: {{targetreach}}
Mods: {{#reachmod}} Reach:{{computed::reachmod}}{{/reachmod}} {{#meleemods}} Melee:{{meleemods}}{{/meleemods}} @@ -8707,16 +8727,16 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"] {{#targetreach}}
{{target}} Reach: {{targetreach}}
{{/targetreach}} {{#default}}
{{default}}
{{/default}} {{#senddata}}
{{target}}: [Dodge](~selected|dodge||{{computed::senddata}}) [Resist](~selected|resistroll||{{computed::senddata}})
{{/senddata}} -
Mods:{{#rangedmods}}Ranged: {{rangedmods}} - {{/rangedmods}}{{#meleemods}} Melee: {{meleemods}} - {{/meleemods}}{{#armorpen}} Armor Penalty: {{armorpen}}{{/armorpen}} - {{#gyropen}} Gyro Penalty: {{gyropen}} - {{/gyropen}} {{#movemods}} Move Penalty: {{movemods}}{{/movemods}} +
Mods:{{#rangedmods}}Ranged: {{rangedmods}} {{/rangedmods}} + {{#meleemods}} Melee: {{meleemods}} {{/meleemods}} + {{#armorpen}} Armor Penalty: {{armorpen}}{{/armorpen}} + {{#gyropen}} Gyro Penalty: {{gyropen}} {{/gyropen}} + {{#movemods}} Move Penalty: {{movemods}}{{/movemods}} {{#targetmods}} aim assit {{targetmods}}{{/targetmods}} - {{#reachmod}}{{computed::reachmod}}{{/reachmod}}
{{#info}}
{{info}}
{{/info}}
+
{{myname}}: {{weaponname}} vs. {{target}}
From b5f7b59106c7ca3730f0182e4fb4926d56675e9c Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Wed, 8 Sep 2021 07:45:25 -0400 Subject: [PATCH 09/49] added character name to chat button instead of relying upon selected. --- Shadowrun3e/shadowrun3e.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index f579b5b42f..376f5d267b 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -8701,8 +8701,8 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"] {{#combatpool}}
Combat Pool Used: {{combatpool}}
{{/combatpool}} {{#pooldice}}
{{pooltype}} Poll Used: {{pooldice}}
{{/pooldice}} {{#weaponfocus}}
Weapon Focus: {{weaponfocus}} {{focusforce}}
{{/weaponfocus}} - {{#attacktest}}
{{target}}: [Defend](~selected|meleedefend||{{computed::senddata}}) [Full Defense](~selected|meleedefendfull||{{computed::senddata}})
{{/attacktest}} - {{#defensetest}}
Loser: {{computed::finalwinner}} {{#dodge}}[Dodge](~selected|dodge||{{computed::senddata}}){{/dodge}} [Resist](~selected|resistroll||{{computed::senddata}})
{{/defensetest}} + {{#attacktest}}
{{target}}: [Defend](~{{target}}|meleedefend||{{computed::senddata}}) [Full Defense](~selected|meleedefendfull||{{computed::senddata}})
{{/attacktest}} + {{#defensetest}}
Loser: {{computed::finalwinner}} {{#dodge}}[Dodge](~{{computed::finalwinner}}|dodge||{{computed::senddata}}){{/dodge}} [Resist](~{{computed::finalwinner}}|resistroll||{{computed::senddata}})
{{/defensetest}}
Reach: {{myname}}: {{charreach}} vs. {{target}}: {{targetreach}}
Mods: {{#reachmod}} Reach:{{computed::reachmod}}{{/reachmod}} From f19b5043a304145f40693143dfd91a62df78c061 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Wed, 8 Sep 2021 15:50:17 -0400 Subject: [PATCH 10/49] switched ewarfare buttons to sheet-worker rolls --- Shadowrun3e/shadowrun3e.html | 45 +++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 376f5d267b..ebecf22856 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -3763,32 +3763,23 @@
-
-
+
ECM:
-
-
-
-
+
+
ECCM:
-
-
+
+
-
ED:
@@ -5268,6 +5259,7 @@ on('clicked:matrixattack', (info) => { }); }); + on('clicked:resistbanish', (info) => { const mytitle=info["htmlAttributes"]["title"] const myid=info["htmlAttributes"]["id"] @@ -5771,6 +5763,31 @@ on('clicked:matrixattack', (info) => { rollattribute(attrib); }); + on('clicked:ewarfare', (info) => { + console.log(info); + var mytype=info["htmlAttributes"]["id"] + var mytitle=info["htmlAttributes"]["title"] + const mymap={ + sonar: {dice: "sonar-rating", target: "signature", notes: ""}, + ecmjamming: {dice: "ecm-fluxmod", target: "sensors-rating", notes: "Roll Oposition test for @{target|Target|token_name}"}, + ecmopposition: {dice: "sensors-fluxmod", target: "ecm-rating", notes: "Compare net successes with @{target|Target|token_name}"}, + eccmcounter: {dice: "eccm-fluxmod", target: "ecm-rating", notes: "Roll Oposition test for @{target|Target|token_name}"}, + eccmopposition: {dice: "ecm-fluxmod", target: "eccm-rating", notes: "Compare net successes with @{target|Target|token_name}"} + }; + var calcDice="@{" + mymap[mytype]["dice"] + "}"; + calcTN="@{target|Target|" + mymap[mytype]["target"] + "}"; + if (mytype=="sonar" ) calcTN+=" +@{wp-vehicle} +@{sensor-test-los} +@{sensor-test-weather} +@{sensor-test-terrain} +@{vehicle-urban}"; + calcTN += "+?{Additional Modifiers|0}"; + myroll="&{template:vehicle}{{type=" + mytitle + "}}{{character=@{character_name}}}{{target=@{target|Target|token_name}}}"; + myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}"; + myroll+="{{roll=[[ [[ " + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!!]]}}"; + myroll+="{{notes=" + mymap[mytype]["notes"] + "}}"; + console.log(myroll); + startRoll(myroll, (results) => { + finishRoll( results.rollId); + }); + + }); on('clicked:maneuever', (info) => { var mytype=info["htmlAttributes"]["id"] From 7367e04da6673a5b0038cfd485f10d6e5ac97a84 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Wed, 8 Sep 2021 17:23:04 -0400 Subject: [PATCH 11/49] adding translation tags to sheets --- Shadowrun3e/shadowrun3e.html | 184 +++++++++++++++++------------------ Shadowrun3e/translation.json | 1 + 2 files changed, 93 insertions(+), 92 deletions(-) create mode 100644 Shadowrun3e/translation.json diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index ebecf22856..76e93e3e7f 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -1,80 +1,80 @@
-
General Information
+
General Information
-
Name:
+
Name
-
Sheet Type:
+
Sheet Type:
- +
-
MetaType:
+ + + + + -
Age:
-
Height:
-
Weight:
+
Age:
+
Height:
+
Weight:
-
Spirit Type:
+
Spirit Type:
-
Force:
+
Force:
@@ -131,50 +131,50 @@
- - - - - - - - - - - + + + + + + + + + + +
+ title="Character Attributes and Karma" data-i18n="attributes">Attributes + title="Combat Skills and Weapons for Ranged and Melee" data-i18n="combat">Combat - + title="Critter Powers and Weaknesses" data-i18n="powers">Powers +
- + - + title="Spirit Powers and Weaknesses" data-i18n="powers">Powers +
-
Condition Monitor
+
Condition Monitor

-
Uninjured
-
Light Stun
-
Moderate Stun
-
Serious Stun
-
Unconscious
-
Stun
+
Uninjured
+
Light Stun
+
Moderate Stun
+
Serious Stun
+
Unconscious
+
Stun
@@ -194,7 +194,7 @@
-
Physical
+
Physical
@@ -215,11 +215,11 @@
-
Uninjured
-
Light Wound
-
Moderate Wound
-
Serious Wound
-
Unconscious/Dead
+
Uninjured
+
Light Wound
+
Moderate Wound
+
Serious Wound
+
Deadly Wound
@@ -234,25 +234,25 @@ -
Dice Pools
-
Max
-
Used
-
Combat Pool:
+
Dice Pools
+
Max
+
Used
+
Combat Pool:
-
Spell Pool:
+
Spell Pool:
-
Hacking Pool:
+
Hacking Pool:
-
Control Pool:
+
Control Pool:
-
Astral Pool:
+
Astral Pool:
-
Task Pool:
+
Task Pool:
diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json new file mode 100644 index 0000000000..ba106b3e77 --- /dev/null +++ b/Shadowrun3e/translation.json @@ -0,0 +1 @@ +{"general-info":"General Information","name":"Name","sheet-type":"Sheet Type:","character":"Character","npc":"NPC","critter":"Critter","spirit":"Spirit","drone":"Drone","vehicle":"Vehicle","matrix":"Matrix","frame":"Frame","import":"Import","export":"Export","metatype":"MetaType:","human":"Human","dwarf":"Dwarf","efl":"Elf","ork":"Ork","troll":"Troll","age":"Age:","height":"Height:","weight":"Weight:","spirit-type":"Spirit Type: ","watcher":"Watcher","air-elemental":"Air Elemental","water-elemental":"Water Elemental","earth-elemental":"Earth Elemental","fire-elemental":"Fire Elemental","city-spirit":"City Spirit","field-spirit":"Field Spirit","hearth-spirit":"Hearth Spirit","desert-spirit":"Desert Spirit","forest-spirit":"Forest Spirit","mountain-spirit":"Mountain Spirit","prairie-spirit":"Prairie Spirit","mist-spirit":"Mist Spirit","storm-spirit":"Storm Spirit","wind-spirit":"Wind Spirit","lake-spirit":"Lake Spirit","river-spirit":"River Spirit","sea-spirit":"Sea Spirit","gnome":"Gnome","manitous":"Manitous","salamander":"Salamander","sylph":"Sylphs","ancestor":"Ancestor","force":"Force:","attributes":"Attributes","skills":"Skills","magic":"Magic","adept":"Adept","decking":"Decking","gear":"Gear","rigger":"Rigger","combat":"Combat","cyberware":"Cyberware","contacts-lifesytle":"Contacts/Lifestyle","karma":"Karma","powers":"Powers","condition-monitor":"Condition Monitor","uninjured":"Uninjured","moderate-stun":"Moderate Stun","serious-stun":"Serious Stun","unconscious":"Unconscious","stun":"Stun","physical":"Physical","light-wound":"Light Wound","moderate-wound":"Moderate Wound","serious-wound":"Serious Wound","deadly-wound":"Deadly Wound","dice-pools":"Dice Pools","maxiumum-abreviation":"Max","used":"Used","combat-pool":" Combat Pool:","spell-pool":" Spell Pool:","hacking-pool":" Hacking Pool:","control-pool":" Control Pool:","astral-pool":" Astral Pool:","task-pool":" Task Pool:"} From 60a67d1e53579bfd6f29c6b7bbb5a6659f380e3e Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Wed, 8 Sep 2021 19:38:03 -0400 Subject: [PATCH 12/49] added translations for always displayed and combat conditions section --- Shadowrun3e/shadowrun3e.css | 9 +- Shadowrun3e/shadowrun3e.html | 204 +++++++++++++++++------------------ Shadowrun3e/translation.json | 2 +- 3 files changed, 103 insertions(+), 112 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index 6c6518fc80..b022c1006e 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -433,7 +433,7 @@ input:checked+.slider:before { grid-template-columns: 45px 45px 45px 45px 45px 45px 45px; } -.conditionstatus2-attrs span { +.number-span { background-color: white; color: black; padding: 5px; @@ -1903,13 +1903,6 @@ input.enable-fa:not(:checked)~span.show_fa_dice { grid-template-columns: 140px 140px 130px 70px 110px 90px 1fr; font-size: 14px; } -.combat-modifiers-total span { - background-color: white; - color: black; - padding-left: 5px; - padding-right: 5px; - border: 1px solid #000000; -} .combat-conditions { text-align: center; diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 76e93e3e7f..05deffd948 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -258,97 +258,95 @@
-
Physical Damage Overflow:
+
Physical Damage Overflow:
-
Init Nat.
+
Init Nat.
-
Init. Aug.
+
Init. Aug.
-
Init. Phy.
+
Init. Phy.
-
Init. Astr.
+
Init. Astr.
-
End Turn
+
End Turn
-
B:
-
Q:
-
S:
-
C:
-
I:
-
W:
-
R:
+
B:
+
Q:
+
S:
+
C:
+
I:
+
W:
+
R:
-
Combat conditions
+
Combat conditions
-
Ranged Modifiers:
-
Melee Modifiers:
-
Rounds Fired:
-
Dodge
+
Melee Modifiers:
+
Rounds Fired:
+
Dodge
-
Ballistic:
-
Impact:
+
Ballistic:
+
Impact:
- +
- +
-
Visibility
-
Vision Enhacement
-
Target Cover
-
Movement
-
Dual Wield
-
Called Shot
-
Aim Actions
-
Melee Foes
-
Melee Friends
-
Targets
-
Position
-
Misc Modifiers
+
Visibility
+
Vision Enhacement
+
Target Cover
+
Movement
+
Dual Wield
+
Called Shot
+
Aim Actions
+
Melee Foes
+
Melee Friends
+
Targets
+
Position
+
Misc Modifiers
@@ -377,9 +375,9 @@
@@ -387,64 +385,64 @@
-
Relative Motion
-
Relative Speed
-
Maneuver Score
-
Vehicle Damage
-
Weapon Mount
-
Terrain
-
Target Type
+
Relative Motion
+
Relative Speed
+
Maneuver Score
+
Vehicle Damage
+
Weapon Mount
+
Terrain
+
Target Type
diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index ba106b3e77..6d0edae01c 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -1 +1 @@ -{"general-info":"General Information","name":"Name","sheet-type":"Sheet Type:","character":"Character","npc":"NPC","critter":"Critter","spirit":"Spirit","drone":"Drone","vehicle":"Vehicle","matrix":"Matrix","frame":"Frame","import":"Import","export":"Export","metatype":"MetaType:","human":"Human","dwarf":"Dwarf","efl":"Elf","ork":"Ork","troll":"Troll","age":"Age:","height":"Height:","weight":"Weight:","spirit-type":"Spirit Type: ","watcher":"Watcher","air-elemental":"Air Elemental","water-elemental":"Water Elemental","earth-elemental":"Earth Elemental","fire-elemental":"Fire Elemental","city-spirit":"City Spirit","field-spirit":"Field Spirit","hearth-spirit":"Hearth Spirit","desert-spirit":"Desert Spirit","forest-spirit":"Forest Spirit","mountain-spirit":"Mountain Spirit","prairie-spirit":"Prairie Spirit","mist-spirit":"Mist Spirit","storm-spirit":"Storm Spirit","wind-spirit":"Wind Spirit","lake-spirit":"Lake Spirit","river-spirit":"River Spirit","sea-spirit":"Sea Spirit","gnome":"Gnome","manitous":"Manitous","salamander":"Salamander","sylph":"Sylphs","ancestor":"Ancestor","force":"Force:","attributes":"Attributes","skills":"Skills","magic":"Magic","adept":"Adept","decking":"Decking","gear":"Gear","rigger":"Rigger","combat":"Combat","cyberware":"Cyberware","contacts-lifesytle":"Contacts/Lifestyle","karma":"Karma","powers":"Powers","condition-monitor":"Condition Monitor","uninjured":"Uninjured","moderate-stun":"Moderate Stun","serious-stun":"Serious Stun","unconscious":"Unconscious","stun":"Stun","physical":"Physical","light-wound":"Light Wound","moderate-wound":"Moderate Wound","serious-wound":"Serious Wound","deadly-wound":"Deadly Wound","dice-pools":"Dice Pools","maxiumum-abreviation":"Max","used":"Used","combat-pool":" Combat Pool:","spell-pool":" Spell Pool:","hacking-pool":" Hacking Pool:","control-pool":" Control Pool:","astral-pool":" Astral Pool:","task-pool":" Task Pool:"} +{"general-info":"General Information","name":"Name","sheet-type":"Sheet Type:","character":"Character","npc":"NPC","critter":"Critter","spirit":"Spirit","drone":"Drone","vehicle":"Vehicle","matrix":"Matrix","frame":"Frame","import":"Import","export":"Export","metatype":"MetaType:","human":"Human","dwarf":"Dwarf","efl":"Elf","ork":"Ork","troll":"Troll","age":"Age:","height":"Height:","weight":"Weight:","spirit-type":"Spirit Type: ","watcher":"Watcher","air-elemental":"Air Elemental","water-elemental":"Water Elemental","earth-elemental":"Earth Elemental","fire-elemental":"Fire Elemental","city-spirit":"City Spirit","field-spirit":"Field Spirit","hearth-spirit":"Hearth Spirit","desert-spirit":"Desert Spirit","forest-spirit":"Forest Spirit","mountain-spirit":"Mountain Spirit","prairie-spirit":"Prairie Spirit","mist-spirit":"Mist Spirit","storm-spirit":"Storm Spirit","wind-spirit":"Wind Spirit","lake-spirit":"Lake Spirit","river-spirit":"River Spirit","sea-spirit":"Sea Spirit","gnome":"Gnome","manitous":"Manitous","salamander":"Salamander","sylph":"Sylphs","ancestor":"Ancestor","force":"Force:","attributes":"Attributes","skills":"Skills","magic":"Magic","adept":"Adept","decking":"Decking","gear":"Gear","rigger":"Rigger","combat":"Combat","cyberware":"Cyberware","contacts-lifesytle":"Contacts/Lifestyle","karma":"Karma","powers":"Powers","condition-monitor":"Condition Monitor","uninjured":"Uninjured","moderate-stun":"Moderate Stun","serious-stun":"Serious Stun","unconscious":"Unconscious","stun":"Stun","physical":"Physical","light-wound":"Light Wound","moderate-wound":"Moderate Wound","serious-wound":"Serious Wound","deadly-wound":"Deadly Wound","dice-pools":"Dice Pools","maxiumum-abreviation":"Max","used":"Used","combat-pool":" Combat Pool:","spell-pool":" Spell Pool:","hacking-pool":" Hacking Pool:","control-pool":" Control Pool:","astral-pool":" Astral Pool:","task-pool":" Task Pool:","physical-damage-overflow":"Physical Damage Overflow:","initiative-natural":"Init Nat.","initiative-augmented":"Init. Aug.","initiative-physical":"Init. Phy.","initiative-astral":"Init. Astr. ","end-turn":"End Turn","body-abbreviation":"B:","quickness-abbreviation":"Q:","strength-abbreviation":"S:","charisma-abbreviation":"C:","intelligence-abbreviation":"I:","willpower-abbreviation":"W:","reaction-abbreviation":"R:","combat-conditions":"Combat conditions","ranged-modifiers":"Ranged Modifiers:","dodge":"Dodge","ballistic":"Ballistic:","impact":"Impact:","show-manual-gunnery":"Show Manual Gunnery","hide-manual-gunnery":"Hide Manual Gunnery","visibility":"Visibility","vision-enhacement":"Vision Enhacement","target-cover":"Target Cover","movement":"Movement","dual-wield":"Dual Wield","called-shot":"Called Shot","aim-actions":"Aim Actions","melee-foes":"Melee Foes","melee-friends":"Melee Friends","targets":"Targets","position":"Position","miscellaneous-modifiers":"Misc Modifiers","normal":"Normal","full-dark":"Full Dark","partial-light":"Partail Light","minimal-light":"Minimal Light","glare":"Glare","mist":"Mist","light-smoke-rain":"Light Smoke/Rain","heavy-smoke-rain":"Heavy Smoke/Rain","thermal-smoke":"Thermal Smoke","melee-modifiers":"Melee Modifiers:","rounds-fired":"Rounds Fired:","low-light":"LowLight","thermal":"Thermal","partial":"Partial","blind-fire":"Blind Fire","walk":"walk","walk-difficult-ground":"walk (difficult ground)","run":"run","run-difficult-ground":"run (difficult ground)","none":"None","superior-position":"Superior Position","target-prone":"Target Prone","relative-motion":"Relative Motion","relative-speed":"Relative Speed","maneuver-score":"Maneuver Score","vehicle-damage":"Vehicle Damage","Weapon-mount":"Weapon Mount","terrain":"Terrain","target-type":"Target Type","towards":"Towards","away":"Away","attacker-greater":"Attacker Greaty by 10","target-greater":"Target Greater by 10","light-damage-abbreviation":"L","moderate-damage-abbreviation":"M","serious-damage-abbreviation":"S","unmounted":"Unmounted","mounted":"mounted","restricted":"Restricted","Tight":"Tight","combat-zone":"Combat Zone","metahuman-sized":"Metahuman sized","small-critter":"Small critter","large-critter":"Large critter","small-drone":"Small drone","motorcyle":"Motorcyle","automobile":"Automobile","limo-Light-truck":"Limo/Light Truck","heavy-truck-trailer":"Heavy Truck/Trailer","boat":"Boat","yacht":"Yacht","freighter-tanker":"Freighter/Tanker","ultralight-glider":"Ultralight glider","fixed-wing":"Fixed Wing","commerical-airliner":"Commerical Airliner","helicopter":"Helicopter","zepplin-blimp":"Zepplin/Blimp","lav":"LAV","military-ground-vehicle":"Military Ground Vehicle","not-moving":"not moving","tight":"Tight"} From d351b9cd3dda22cc96ce33271527e897baec896b Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Fri, 10 Sep 2021 14:54:11 -0400 Subject: [PATCH 13/49] added spelldefense and resistance rolls for spell roll template. Added button for checking AOE hits for magic --- Shadowrun3e/shadowrun3e.css | 19 +- Shadowrun3e/shadowrun3e.html | 383 +++++++++++++++++++++++++---------- Shadowrun3e/translation.json | 2 +- 3 files changed, 297 insertions(+), 107 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index b022c1006e..96d9789e8a 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -775,6 +775,14 @@ min-width: 0; grid-template-columns: 73px 1fr; } +.sheet-rolltemplate-resistance div.sheet-spell-resist-table { + display: grid; + grid-template-columns: auto auto auto auto auto; +} +.sheet-rolltemplate-resistance div.sheet-resist-table { + display: grid; + grid-template-columns: auto auto auto auto auto auto auto; +} .char-attributes { display: grid; @@ -914,6 +922,7 @@ min-width: 0; .sheet-rolltemplate-skill div.sheet-rtcontainer, .sheet-rolltemplate-adept div.sheet-rtcontainer, .sheet-rolltemplate-attack div.sheet-rtcontainer, +.sheet-rolltemplate-aoe div.sheet-rtcontainer, .sheet-rolltemplate-resistance div.sheet-rtcontainer { width: 100%; border: 3px solid black; @@ -935,6 +944,7 @@ min-width: 0; } .sheet-rolltemplate-melee div.sheet-rtheader, +.sheet-rolltemplate-aoe div.sheet-rtheader, .sheet-rolltemplate-attack div.sheet-rtheader { border-bottom: 3px solid black; background-color: red; @@ -991,6 +1001,7 @@ min-width: 0; .sheet-rolltemplate-skill div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-adept div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-attack div.sheet-rtrow:nth-child(odd), +.sheet-rolltemplate-aoe div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-melee div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-resistance div.sheet-rtrow:nth-child(odd) { background-color: white; @@ -1010,6 +1021,7 @@ min-width: 0; .sheet-rolltemplate-skill div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-adept div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-attack div.sheet-rtrow:nth-child(even), +.sheet-rolltemplate-aoe div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-melee div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-resistance div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-spell div.sheet-rtrow:nth-child(even) { @@ -1026,6 +1038,7 @@ min-width: 0; .sheet-rolltemplate-adept .sheet-numberspan, .sheet-rolltemplate-spell .sheet-numberspan, .sheet-rolltemplate-melee .sheet-numberspan, +.sheet-rolltemplate-aoe .sheet-numberspan, .sheet-rolltemplate-resistance .sheet-numberspan, .sheet-rolltemplate-attack .sheet-numberspan{ background-color: yellow; @@ -1046,6 +1059,7 @@ min-width: 0; .sheet-rolltemplate-skill .inlinerollresult, .sheet-rolltemplate-adept .inlinerollresult, .sheet-rolltemplate-attack .inlinerollresult, +.sheet-rolltemplate-aoe .inlinerollresult, .sheet-rolltemplate-melee .inlinerollresult, .sheet-rolltemplate-resistance .inlinerollresult, .sheet-rolltemplate-spell .inlinerollresult { @@ -1066,6 +1080,7 @@ min-width: 0; .sheet-rolltemplate-skill .inlinerollresult.fullcrit, .sheet-rolltemplate-adept .inlinerollresult.fullcrit, .sheet-rolltemplate-attack .inlinerollresult.fullcrit, +.sheet-rolltemplate-aoe .inlinerollresult.fullcrit, .sheet-rolltemplate-melee .inlinerollresult.fullcrit, .sheet-rolltemplate-resistance .inlinerollresult.fullcrit, .sheet-rolltemplate-spell .inlinerollresult.fullcrit { @@ -1082,6 +1097,7 @@ min-width: 0; .sheet-rolltemplate-skill .inlinerollresult.fullfail, .sheet-rolltemplate-adept .inlinerollresult.fullfail, .sheet-rolltemplate-attack .inlinerollresult.fullfail, +.sheet-rolltemplate-aoe .inlinerollresult.fullfail, .sheet-rolltemplate-melee .inlinerollresult.fullfail, .sheet-rolltemplate-resistance .inlinerollresult.fullfail, .sheet-rolltemplate-spell .inlinerollresult.fullfail { @@ -1098,6 +1114,7 @@ min-width: 0; .sheet-rolltemplate-skill .inlinerollresult.importantroll, .sheet-rolltemplate-adept .inlinerollresult.importantroll, .sheet-rolltemplate-attack .inlinerollresult.importantroll, +.sheet-rolltemplate-aoe .inlinerollresult.importantroll, .sheet-rolltemplate-melee .inlinerollresult.importantroll, .sheet-rolltemplate-resistance .inlinerollresult.importantroll, .sheet-rolltemplate-spell .inlinerollresult.importantroll { @@ -1215,7 +1232,7 @@ min-width: 0; .spells-status-buttons { display: grid; - grid-template-columns: 200px 60px 25px 60px 25px 60px 25px 60px 25px 60px 25px; + grid-template-columns: 100px 45px 60px 25px 60px 25px 60px 25px 60px 25px 60px 25px; align-items: center; text-align: end; background-color: rgba(192,192,192,.9); diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 05deffd948..8aaa5b5375 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -96,6 +96,8 @@ + + + @@ -452,102 +455,102 @@
-
Attributes
+
Attributes
-
Attribute
-
Base
-
Mods
-
Final
-
Body
+
Attribute
+
Base
+
Mods
+
Final
+
Body
-
+=
-
-
Quickness
+
Quickness
-
+=
-
-
Strength
+
Strength
-
+=
-
-
Charisma
+
Charisma
-
+=
-
-
Intelligence
+
Intelligence
-
+=
-
-
Willpower
+
Willpower
-
+=
-
-
Essence
+
Essence
-
-
Magic
+
Magic
-
@@ -555,46 +558,45 @@
-
Attributes
+
Attributes
-
Attribute
-
Level
-
Perception
+
Attribute
+
Level
+
Perception
- +
-
Reach
+
Reach
-
Force
+
Force
-
Attacks
+
Attacks
+ title="Attack">L
@@ -840,8 +842,8 @@
-
Misc. Modifiers:
+
Misc. Modifiers:
+
Defend:
Dispell:
+
Electrons Warfare:
-
+
@@ -2278,8 +2276,7 @@
Decryption Module:
-
+
@@ -3562,8 +3559,9 @@
-
Driver:
+ +
@@ -3571,7 +3569,7 @@
Max
Used
Control Pool:
- +

@@ -3779,7 +3777,6 @@
-
@@ -4685,6 +4682,39 @@ buttonlist.forEach(button => { console.log(info); }; + on("clicked:setrigger", function(info) { + console.log(info); + const myid=info["htmlAttributes"]["id"] + var myroll="/w gm &{template:info}{{character=@{character_name}}}"; + var designator; + var sets={}; + getAttrs(["sheettype", "rigger"], function(myval) { + console.log(myval); + if ((myid == "refresh-rigger") && (myval["rigger"])) { + myroll+="{{action=Update Gunnery and Conrol Pool}}"; + designator="@{" + myval["rigger"]; + } else if (myval["sheettype"] == "Drone") { + myroll+="{{action=Set Rigger}}"; + designator="@{target|Rigger"; + } else { + myroll+="{{action=Set Vehicle Operator}}"; + designator="@{target|Operator"; + } + myroll+="{{name=[[0[" + designator + "|character_name}]]]}}"; + myroll+="{{gunnery=[[" + designator + "|gunnery}]]}}"; + myroll+="{{controlpool=[[" + designator + "|controlpool}]]}}"; + console.log(myroll); + startRoll(myroll, (results) => { + sets["rigger"]=results.results.name.expression.match(/\[(.*)\]/)[1]; + sets["controlpool"]=results.results.controlpool.result; + sets["gunnery"]=results.results.gunnery.result; + console.log(sets); + finishRoll( results.rollId); + setAttrs(sets); + }); + }); + }); + on("clicked:repeating_intruders:settokenname", function(info) { console.log(info); const source=info['sourceAttribute'].split('_'); From ab33b310de26fe9b40c814f722286b010c5d5323 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Sat, 11 Sep 2021 13:46:59 -0400 Subject: [PATCH 16/49] added foci attribues for repeating spells --- Shadowrun3e/shadowrun3e.css | 2 +- Shadowrun3e/shadowrun3e.html | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index 0f41b7b296..8e18ea3578 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -1273,7 +1273,7 @@ color:red; .magic-spells-row, .magic-spells-table { display: grid; - grid-template-columns: 105px 70px 45px 35px 53px 50px 85px 63px 45px 45px 73px 30px 1fr; + grid-template-columns: 95px 70px 40px 40px 40px 40px 53px 50px 75px 77px 40px 40px 73px 30px 1fr; font-size: 10px; } .sorcery-config { diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index b2e238effb..e099237b08 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -1203,6 +1203,8 @@
Category
Spec.
Force
+
Foci
+
Exp.
Type
Range
Target
@@ -1228,6 +1230,8 @@ + +
-
Memory In Use:
+ +
Jack In
+
Memory In Use:
@@ -8896,6 +8898,21 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"] }); }); + on('clicked:jackin', function(info) { + console.log(info); + getAttrs(["matrix-status"], function(myval) { + var sets={}; + const mstatus=myval["matrix-status"]; + var myroll="/w gm &{template:info}{{character=@{character_name}}}"; + myroll+= (mstatus == "out")? "{{type=Jack In}}": "{{type=Jack Out}}"; + myroll += "{{action=Complex}}"; + sets["matrix-status"]= (mstatus == "out")? "in" : "out"; + startRoll(myroll, (results) => { + setAttrs(sets); + finishRoll( results.rollId); + }); + }); + }); From f373d8adf72253516cbfa87d8a90bd8b76ae1f9b Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Mon, 13 Sep 2021 22:07:05 -0400 Subject: [PATCH 19/49] fixed matrix pentalty for wounds ( was double counting ) --- Shadowrun3e/shadowrun3e.css | 13 ++++++++++++- Shadowrun3e/shadowrun3e.html | 4 ++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index 8e18ea3578..c741d7b5de 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -2302,7 +2302,9 @@ input.enable-fa:not(:checked)~span.show_fa_dice { .deck-memory-used { display: grid; - grid-template-columns: 150px 60px 100px 150px 180px 180px; + text-align: right; + align-items: center; + grid-template-columns: 45px 22px 110px 50px 50px 130px 180px 100px; } .frame-util-used { @@ -2319,6 +2321,15 @@ input.enable-fa:not(:checked)~span.show_fa_dice { padding-right: 5px; } +.matrix-status[value="out"] ~.matrix-status { + background: green; + color: white; +} +.matrix-status[value="in"] ~.matrix-status { + background: red; + color: white; +} + .taskpool-over[value="1"] ~ .taskpool-over, .astralpool-over[value="1"] ~ .astralpool-over, .controlpool-over[value="1"] ~ .controlpool-over, diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 7324af5cfd..2517e982ca 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -4655,7 +4655,7 @@ buttonlist.forEach(button => { } else { action="{{action=" + myutilvalue + " Test}}"; target ="{{target=?{Target Number?|4}}}"; - calcTN="?{Target Number?} + @{wound_pen} + @{stun_pen} + @{wp-matrix}"; + calcTN="?{Target Number?} + @{wound_pen} + @{stun_pen} + @{matrix-penalty}"; calcDice=myratingvalue + " + ?{Hacking Pool Dice}"; } var myroll="&{template:matrix}{{myname=@{character_name}}}{{hackingpool=[[?{Hacking Pool Dice|0}]]}}"; @@ -5326,7 +5326,7 @@ on('clicked:matrixattack', (info) => { } else if ( myid == "matrixinit" ) { init="@{deck-initiative}"; reaction="@{deck-reaction-final}"; - var dmgpen=" - ( @{wp-char} + @{wp-matrix})"; + var dmgpen=" - ( @{wp-char} + @{matrix-penalty})"; } else if ( myid == "vehicleinit" ) { init="(@{vehicle-driver}initiative} + @{vehicle-initbonus})"; reaction="@{vehicle-driver}reaction} + @{vehicle-reactbonus}"; From ff2476b0a26a0fba61f60cf6de416195eefda05d Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Wed, 15 Sep 2021 07:52:35 -0400 Subject: [PATCH 20/49] update pool missing for dispell test --- Shadowrun3e/shadowrun3e.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 2517e982ca..cdf4ac126e 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -5739,6 +5739,8 @@ on('clicked:matrixattack', (info) => { myroll+="{{casttest=[[ [[" + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!! ]] }}"; console.log(myroll); startRoll(myroll, (results) => { + updatepoolused("sorcery", results.results.sorcerydice.result); + updatepoolused("spellpool", results.results.spellpool.result); finishRoll( results.rollId); }); }); From d190a9d4e42bab69551701db31e00818171495af Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Wed, 15 Sep 2021 20:42:17 -0400 Subject: [PATCH 21/49] added token id to roll for explosive --- Shadowrun3e/shadowrun3e.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index cdf4ac126e..8ae961bae2 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -6613,7 +6613,7 @@ on('clicked:matrixattack', (info) => { } else { var calcDice = "[[ " + myskill + " + " + specialized + " + ?{" + poolname + " Pool Dice|0} + " + missleintel + " ]]" calcTN += " + ?{Additional Modifiers|" + tnmods + "} ]]" - var roll="&{template:explosive}{{myname=@{character_name}}}{{target=@{target|Target|token_name}}}" + range + var roll="&{template:explosive}{{mytoken=@{selected|token_id}}}{{myname=@{character_name}}}{{target=@{target|Target|token_name}}}{{targettoken=@{target|Target|token_id}}}" + range roll += "{{rolldice=" + calcDice + "}}{{targetnumber=[[{2,( " + calcTN + ")}kh1]]}}"; roll += "{{weapondamage=" + wdmg + "}}{{senddata=[[0]]}}"; roll += "{{weaponpower=" + wpower + "}}" + expint; From e489e18ba7afa815000f581afe4ea52b8886428b Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Thu, 16 Sep 2021 17:32:50 -0400 Subject: [PATCH 22/49] updated README for release notes and added translation for skills, attributes and magic tabs --- Shadowrun3e/README.MD | 20 +- Shadowrun3e/shadowrun3e.css | 20 +- Shadowrun3e/shadowrun3e.html | 584 +++++++++++++++++------------------ Shadowrun3e/translation.json | 360 ++++++++++++++++++++- 4 files changed, 677 insertions(+), 307 deletions(-) diff --git a/Shadowrun3e/README.MD b/Shadowrun3e/README.MD index 2fb6a7494a..8feb18c8c8 100644 --- a/Shadowrun3e/README.MD +++ b/Shadowrun3e/README.MD @@ -1,13 +1,31 @@ # Shadowrun 3rd Edition -## Release Notes 9/8/2021 +## Release Notes 9/16/2021 ### changes/bug fixes 1. Tar Pit ad Tar baby: when using the "execute" button it will roll the Opposed test between the ic ratin and the utility as well as a sensor test. The resutls of the three rolls will be whispered to the GM. 2. added chat buttons at the end of melee attack. Defending character can click on either Defense or Full defense. The results of the attack test will be passed to the new "defense" roll. The defense roll will compare successes and determin winner. Weapon damage and power will be stagged up as per the melee combat rules of srun3e. If the attacker wins the contest, the defeder will get Resist buton. If "full defense" was chosen, the defender will also be presented with a "dodge" button. Choosing dodge will roll a melee dodge test and present the player with a "resist" button. The only differnce between the "Resist" button displayed afer the offense test and the dodge test is that the reults of the dodge are passed to the resist and count towards the resist successes. If the defender wins the melee contest and they choose "full defence" the roll will result in "Attack Parried". Else, a "resist" button will be displayed and the attacking character will be able to roll damage resistnace based on the staged up weapon damage and power for the melee weapon currently equipped by the defender. The chat buttons do not have to be used, regular sheet rolls can still be used i.e. the defender can use the attack button for a melee weapon and then the player that looses the contest can roll a resistance test. The benefit for the chat buttons is that they reduce the amount of roll queries presented to the players as the data is already sent to the roll. +3. fixed bug on matrix wound penalty +4. added pool tracking for dispel tests +5. added foci to repeating spells +6. added button to select and add player to the "operator/rigger" section of the vehicle tab. Will also update value of control pool and gunnery skill. Vehicle skill still needs to be updated manually. +7. resist explosion now asks for distance in meters from explosion and calculates power reduction accordingly. +8. added chat button after AoE spells. Any charcter in the range of the spell can click on the button and it will determine attack successes. +9. added chat button after magic attack ( regular and AoE ) for spell defense for an ally mage/shaman to click on. +10. added chat button after magic attack or spell defense to resist spell. Resistance is based on attribute if not an elemental spell, in which case resistance is 1/2 impact. +11. All chat buttons published after magic attack roll template pass the value of the original roll to prepopulate most of the roll questions. +12. Resist and Dodge buttons presented after ranged attack roll template will pass value of original roll to dodge and resist rolls. +13. Added translation tags for Always Displayed section of the sheet as well as the Attributes, Skills and Magic tabs. ### Impact on existing characters. +none + +### Todo +add knockdown test chat button after melee and ranged attacks. +add shotgun ammo to ammo type list on repeating ranged weapons. +add translation tags to the remaining sheets. +add translation to sheet worker rolls. ## Release Notes 9/1/2021 diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index c741d7b5de..f75a79871d 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -1252,7 +1252,7 @@ min-width: 0; .spells-spirit-status { display: grid; - grid-template-columns: auto auto auto 60px 25px auto 25px 60px 25px 60px 25px; + grid-template-columns: auto 45px auto 35px auto 45px auto 35px auto 35px 20px; align-items: center; text-align: end; background-color: rgba(192,192,192,.9); @@ -1277,11 +1277,13 @@ color:red; font-size: 10px; } .sorcery-config { - grid-template-columns: auto auto auto auto auto auto; + grid-template-columns: 20px auto 30px auto auto 30px auto auto 30px auto auto 30px 20px; display: grid; background-color: rgba(192,192,192,.9); border: 2px solid #fff; border-radius: 10px; + text-align: right; + align-items: center; } .magic-spells-row { box-sizing: border-box; @@ -1339,7 +1341,7 @@ input[type="checkbox"].hidden-checkbox { .astralspace { display: grid; vertical-align: middle; - grid-template-columns: 235px 100px 20px 50px 120px 45px 45px 35px; + grid-template-columns: 120px 130px 100px 20px 50px 120px 45px 45px 35px; } .astralspace select{ vertical-align: middle; @@ -1349,7 +1351,7 @@ input[type="checkbox"].hidden-checkbox { .astralcombat { display: grid; align-items: center; - grid-template-columns: 100px 30px 160px 90px 10px 40px 60px; + grid-template-columns: 100px 30px 120px 120px 90px 10px 30px 40px 60px; } .geas-table, @@ -2532,7 +2534,8 @@ input.enable-fa:not(:checked)~span.show_fa_dice { .sorceryskills-switch[value="hide"]~div.sorceryskills-show, .astralattributes-switch[value="show"]~div.astralattributes-hide, .astralattributes-switch[value="hide"]~div.astralattributes-show { - display: block; + display: grid; + grid-template-columns: auto 60px 1fr; } .ammo-switch[value="hide"]~div.ammo-show, @@ -2563,6 +2566,13 @@ input.enable-fa:not(:checked)~span.show_fa_dice { display: none; } +.magicinitiate-level { + display: grid; + grid-template-columns: auto 60px 1fr; + + +} + .charsheet button[type=roll].hidedice-button::before { content: ''; } diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 8ae961bae2..e402b2a33c 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -603,13 +603,13 @@
-
Reaction, Init & Speed
+
Reaction, Init & Speed
-
Natural
-
Mods
-
Final
-
Reaction:
+
Natural
+
Mods
+
Final
+
Reaction:
-
Initiative:
+
Initiative:
d6
-
Initiative:
+
Initiative:
d6+ @@ -666,42 +666,42 @@
-
Walking Rate:
+
Walking Rate:
-
meters per combat turn
-
Running Rate:
+
meters per combat turn
+
Running Rate:
-
meters per combat turn
+
meters per combat turn
Dice Pools
-
Pool
-
Calculated
-
Mods
-
Final
-
Combat
+
Pool
+
Calculated
+
Mods
+
Final
+
Combat
-
Spell
+
Spell
-
Hacking
+
Hacking
-
Control
+
Control
-
Astral
+
Astral
-
Task
+
Task
@@ -711,15 +711,15 @@
Karma
-
Karma Pool:
+
Karma Pool:
/
-
Good Karma:
+
Good Karma:
-
Professional Rating:
+
Professional Rating:
@@ -728,15 +728,15 @@
-
Skills/Edges/Flaws
+
Skills/Edges/Flaws
Skills
-
Name
-
Rating
-
Pool
-
Roll
+
Name
+
Rating
+
Pool
+
Roll
@@ -744,12 +744,12 @@
@@ -758,8 +758,8 @@
Edges
-
Type
-
Rating
+
Type
+
Rating
@@ -771,8 +771,8 @@
Flaws
-
Type
-
Rating
+
Type
+
Rating
@@ -797,100 +797,94 @@
-
Stacked
-
Sustained
- +
Stacked
+
Sustained
-
Max
-
Used
- +
Max
+
Used
-
Max
-
Defense
-
Used
+
Max
+
Defense
+
Used
-
Max
-
Defense
-
Used
- +
Max
+
Defense
+
Used
-
Max
-
Used
- -
Spells
+
Max
+
Used
+
Spells
-
Spell Defense
+
Spell Defense
-
Sorcery
+
Sorcery
-
Spell Pool
+
Spell Pool
-
Conjuring
+
Conjuring
-
Misc. Modifiers:
+
Misc. Modifiers:
-
Defend:
-
Dispell:
-
Summon:
-
Banish:
-
Control:
-
Spells Stacked:
-
Spells Sustained:
-
Misc. Modifiers:
-
Dispell:
+
Spells Sustained:
+
Misc. Modifiers:
+
Dispell:
-
Resist Banish:
-
Astral Space +
Astral Space
-
-
Astral Space +
Astral Space
-
-
Astral State: -
-
Astral Reaction:
+
Astral State:
+ +
Astral Reaction:
-
Astral Initiative:
+
Astral Initiative:
1d6+
-
Astral Combat:
+
Astral Combat:
-
Weapon Focus:
-
Enabled
-
Force:
+
Weapon Focus:
+
Enabled
+
+
Force:

-
Magic Skills and Configuration +
Magic Skills and Configuration
-
-
Magic Skills and Configuration +
Magic Skills and Configuration
-
-
Adept
-
Mage
-
Shaman
-
Aspected Mage
+
Adept
+
+
Mage
+
+
Shaman
+
+
Aspected Mage
@@ -933,50 +929,50 @@
-
Sorcery:
+
Sorcery:
-
Specialize
+
Specialize
-
Spellcasting:
+
Spellcasting:
-
Spell Defense:
+
Spell Defense:
-
Dispelling:
+
Dispelling:
-
Astral Combat:
+
Astral Combat:
-
Ritual Magic:
+
Ritual Magic:
-
Spellcasting:
+
Spellcasting:
-
Spell Defense:
+
Spell Defense:
-
Dispelling:
+
Dispelling:
-
Astral Combat:
+
Astral Combat:
-
Ritual Magic:
+
Ritual Magic:
@@ -988,39 +984,39 @@
-
Conjuring:
+
Conjuring:
-
Specialize
+
Specialize
-
Summoning:
+
Summoning:
-
Banishing:
+
Banishing:
-
Controlling:
+
Controlling:
-
Summoning:
+
Summoning:
-
Banishing:
+
Banishing:
-
Controlling:
+
Controlling:
@@ -1032,48 +1028,48 @@
-
Aura Reading:
+
Aura Reading:
-
Specialize
+
Specialize
-
Auras:
+
Auras:
-
Signatures:
+
Signatures:
-
Sorcery:
+
Sorcery:
-
Conjuring:
+
Conjuring:
-
Auras:
+
Auras:
-
Signatures:
+
Signatures:
-
Sorcery:
+
Sorcery:
-
Conjuring:
+
Conjuring:
@@ -1083,29 +1079,29 @@
-
Magic:
+
Magic:
-
Drain:
+
Drain:
-
Enchanting:
+
Enchanting:
-
Divining:
+
Divining:
-
Centering:
+
Centering:
-
Creative Skill:
+
Creative Skill:
@@ -1117,32 +1113,30 @@
-
Adept Powers +
Adept Powers
-
-
Adept Powers +
Adept Powers
-
-
Power
-
Rating
-
Cost
-
Activate
-
Notes
+
Power
+
Rating
+
Cost
+
Activate
+
Notes
-
Improved Reflexes:
+
Improved Reflexes:
-
Body Boost:
+
Body Boost:
-
Strength Boost:
+
Strength Boost:
-
Agility Boost:
+
Agility Boost:
-
Pain Resistance:
+
Pain Resistance:
@@ -1187,67 +1181,65 @@
-
Spells +
Spells
-
-
Spells +
Spells
-
-
Name
-
Category
-
Spec.
-
Force
-
Foci
-
Exp.
-
Type
-
Range
-
Target
-
Dmg.
-
Dur.
-
Drain
-
Drain Damage
-
Roll
-
Description
+
Name
+
Category
+
Spec.
+
Force
+
Foci
+
Exp.
+
Type
+
Range
+
Target
+
Dmg.
+
Dur.
+
Drain
+
Drain Damage
+
Roll
+
Description
@@ -1298,30 +1286,28 @@
-
Fetishes and Foci +
Fetishes and Foci
-
-
Fetishes and Foci +
Fetishes and Foci
-
-
Type
-
Category
-
Force
-
Quantity
+
Type
+
Category
+
Force
+
Quantity
@@ -1329,43 +1315,43 @@
@@ -1381,36 +1367,36 @@
-
Equip
-
Name
-
Reach
-
Skill
-
Conceal
-
Force
-
Power
-
Damage
-
Specialize
-
Attack
-
Notes
+
Equip
+
Name
+
Reach
+
Skill
+
Conceal
+
Force
+
Power
+
Damage
+
Specialize
+
Attack
+
Notes
+
-
Initiation and Metamagic +
Initiation and Metamagic
-
-
Initiation and Metamagic +
Initiation and Metamagic
-
-
Initiate Grade:
+
+
Initiate Grade:
+ +
-
Metamagic
-
Notes
+
Metamagic
+
Notes
@@ -1445,19 +1433,17 @@
-
Geas +
Geas
-
-
Geas +
Geas
-
-
Geas Type
-
Geas Notes
+
Geas Type
+
Geas Notes
@@ -1469,21 +1455,19 @@
-
Totem/Abilities +
Totem/Abilities
-
-
Totem/Abilities +
Totem/Abilities
-
-
Totem
-
Environment
-
Advantages
-
Disadvantages
+
Totem
+
Environment
+
Advantages
+
Disadvantages
@@ -8842,10 +8826,10 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"] if (myattrib == "remove" ) { let cat = eventinfo["removedInfo"][myrepeat.concat("_category")]; let type = eventinfo["removedInfo"][myrepeat.concat("_type")]; - if ( type == "Power Focus" ) atts["power-focus"]=0; - else if ( type == "Spirit Focus") atts[cat]=0; - else if ( type == "Expendable" ) atts["exp-" + cat]=0; - else if ( type == "Reusable" ) atts["reusable-" + cat]=0; + if ( type == "power" ) atts["power-focus"]=0; + else if ( type == "spirit") atts[cat]=0; + else if ( type == "expendable" ) atts["exp-" + cat]=0; + else if ( type == "reusable" ) atts["reusable-" + cat]=0; else return; console.log(atts); setAttrs(atts); diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index 22d6a89e1c..0bae78766e 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -1 +1,359 @@ -{"general-info":"General Information","name":"Name","sheet-type":"Sheet Type:","character":"Character","npc":"NPC","critter":"Critter","spirit":"Spirit","drone":"Drone","vehicle":"Vehicle","matrix":"Matrix","frame":"Frame","import":"Import","export":"Export","metatype":"MetaType:","human":"Human","dwarf":"Dwarf","efl":"Elf","ork":"Ork","troll":"Troll","age":"Age:","height":"Height:","weight":"Weight:","spirit-type":"Spirit Type: ","watcher":"Watcher","air-elemental":"Air Elemental","water-elemental":"Water Elemental","earth-elemental":"Earth Elemental","fire-elemental":"Fire Elemental","city-spirit":"City Spirit","field-spirit":"Field Spirit","hearth-spirit":"Hearth Spirit","desert-spirit":"Desert Spirit","forest-spirit":"Forest Spirit","mountain-spirit":"Mountain Spirit","prairie-spirit":"Prairie Spirit","mist-spirit":"Mist Spirit","storm-spirit":"Storm Spirit","wind-spirit":"Wind Spirit","lake-spirit":"Lake Spirit","river-spirit":"River Spirit","sea-spirit":"Sea Spirit","gnome":"Gnome","manitous":"Manitous","salamander":"Salamander","sylph":"Sylphs","ancestor":"Ancestor","force":"Force:","attributes":"Attributes","skills":"Skills","magic":"Magic","adept":"Adept","decking":"Decking","gear":"Gear","rigger":"Rigger","combat":"Combat","cyberware":"Cyberware","contacts-lifesytle":"Contacts/Lifestyle","karma":"Karma","powers":"Powers","condition-monitor":"Condition Monitor","uninjured":"Uninjured","moderate-stun":"Moderate Stun","serious-stun":"Serious Stun","unconscious":"Unconscious","stun":"Stun","physical":"Physical","light-wound":"Light Wound","moderate-wound":"Moderate Wound","serious-wound":"Serious Wound","deadly-wound":"Deadly Wound","dice-pools":"Dice Pools","maxiumum-abreviation":"Max","used":"Used","combat-pool":" Combat Pool:","spell-pool":" Spell Pool:","hacking-pool":" Hacking Pool:","control-pool":" Control Pool:","astral-pool":" Astral Pool:","task-pool":" Task Pool:","physical-damage-overflow":"Physical Damage Overflow:","initiative-natural":"Init Nat.","initiative-augmented":"Init. Aug.","initiative-physical":"Init. Phy.","initiative-astral":"Init. Astr. ","end-turn":"End Turn","body-abbreviation":"B:","quickness-abbreviation":"Q:","strength-abbreviation":"S:","charisma-abbreviation":"C:","intelligence-abbreviation":"I:","willpower-abbreviation":"W:","reaction-abbreviation":"R:","combat-conditions":"Combat conditions","ranged-modifiers":"Ranged Modifiers:","melee-modifiers":"Melee Modifiers:","rounds-fired":"Rounds Fired:","dodge":"Dodge","ballistic":"Ballistic:","impact":"Impact:","show-manual-gunnery":"Show Manual Gunnery","hide-manual-gunnery":"Hide Manual Gunnery","visibility":"Visibility","vision-enhacement":"Vision Enhacement","target-cover":"Target Cover","movement":"Movement","dual-wield":"Dual Wield","called-shot":"Called Shot","aim-actions":"Aim Actions","melee-foes":"Melee Foes","melee-friends":"Melee Friends","targets":"Targets","position":"Position","miscellaneous-modifiers":"Misc Modifiers","normal":"Normal","full-dark":"Full Dark","partial-light":"Partail Light","minimal-light":"Minimal Light","glare":"Glare","mist":"Mist","light-smoke-rain":"Light Smoke/Rain","heavy-smoke-rain":"Heavy Smoke/Rain","thermal-smoke":"Thermal Smoke","low-light":"LowLight","thermal":"Thermal","partial":"Partial","blind-fire":"Blind Fire","not-moving":"not moving","walk":"walk","walk-difficult-ground":"walk (difficult ground)","run":"run","run-difficult-ground":"run (difficult ground)","none":"None","superior-position":"Superior Position","target-prone":"Target Prone","relative-motion":"Relative Motion","relative-speed":"Relative Speed","maneuver-score":"Maneuver Score","vehicle-damage":"Vehicle Damage","Weapon-mount":"Weapon Mount","terrain":"Terrain","target-type":"Target Type","towards":"Towards","away":"Away","attacker-greater":"Attacker Greaty by 10","target-greater":"Target Greater by 10","light-damage-abbreviation":"L","moderate-damage-abbreviation":"M","serious-damage-abbreviation":"S","unmounted":"Unmounted","mounted":"mounted","restricted":"Restricted","tight":"Tight","combat-zone":"Combat Zone","metahuman-sized":"Metahuman sized","small-critter":"Small critter","large-critter":"Large critter","small-drone":"Small drone","motorcyle":"Motorcyle","automobile":"Automobile","limo-Light-truck":"Limo/Light Truck","heavy-truck-trailer":"Heavy Truck/Trailer","boat":"Boat","yacht":"Yacht","freighter-tanker":"Freighter/Tanker","ultralight-glider":"Ultralight glider","fixed-wing":"Fixed Wing","commerical-airliner":"Commerical Airliner","helicopter":"Helicopter","zepplin-blimp":"Zepplin/Blimp","lav":"LAV","military-ground-vehicle":"Military Ground Vehicle","attribute":"Attribute","base":"Base","mods":"Mods","final":"Final","body":"Body","body-test-natural":"Body Test without augmentation","body-test-aug":"Body Test with augmentation","quickness":"Quickness","quickness-test-natural":"Quickness Test witht augmentation","strength":"Strength","strength-test-natural":"Strength Test with augmentation","charisma":"Charisma","charisma-test-natural":"Charisma Test with augmentation","intelligence":"Intelligence","intelligence-test-natural":"Intelligence Test with augmentation","willpower":"Willpower","willpower-test-natural":"Willpower Test with augmentation","essence":"Essence","essence-test":"Essence Test","magic-test":"Magic Test"} +{ + "general-info": "General Information", + "name": "Name", + "sheet-type": "Sheet Type:", + "character": "Character", + "npc": "NPC", + "critter": "Critter", + "spirit": "Spirit", + "drone": "Drone", + "vehicle": "Vehicle", + "matrix": "Matrix", + "frame": "Frame", + "import": "Import", + "export": "Export", + "metatype": "MetaType:", + "human": "Human", + "dwarf": "Dwarf", + "efl": "Elf", + "ork": "Ork", + "troll": "Troll", + "age": "Age:", + "height": "Height:", + "weight": "Weight:", + "spirit-type": "Spirit Type: ", + "watcher": "Watcher", + "air-elemental": "Air Elemental", + "water-elemental": "Water Elemental", + "earth-elemental": "Earth Elemental", + "fire-elemental": "Fire Elemental", + "city-spirit": "City Spirit", + "field-spirit": "Field Spirit", + "hearth-spirit": "Hearth Spirit", + "desert-spirit": "Desert Spirit", + "forest-spirit": "Forest Spirit", + "mountain-spirit": "Mountain Spirit", + "prairie-spirit": "Prairie Spirit", + "mist-spirit": "Mist Spirit", + "storm-spirit": "Storm Spirit", + "wind-spirit": "Wind Spirit", + "lake-spirit": "Lake Spirit", + "river-spirit": "River Spirit", + "sea-spirit": "Sea Spirit", + "gnome": "Gnome", + "manitous": "Manitous", + "salamander": "Salamander", + "sylph": "Sylphs", + "ancestor": "Ancestor", + "force": "Force", + "attributes": "Attributes", + "skills": "Skills", + "magic": "Magic:", + "adept": "Adept", + "decking": "Decking", + "gear": "Gear", + "rigger": "Rigger", + "combat": "Combat", + "cyberware": "Cyberware", + "contacts-lifesytle": "Contacts/Lifestyle", + "karma": "Karma", + "powers": "Powers", + "condition-monitor": "Condition Monitor", + "uninjured": "Uninjured", + "moderate-stun": "Moderate Stun", + "serious-stun": "Serious(s)", + "unconscious": "Unconscious", + "stun": "Stun", + "physical": "Physical", + "light-wound": "Light Wound", + "moderate-wound": "Moderate Wound", + "serious-wound": "Serious Wound", + "deadly-wound": "Deadly Wound", + "dice-pools": "Dice Pools", + "maxiumum-abreviation": "Max", + "used": "Used", + "combat-pool": " Combat Pool:", + "spell-pool": "Spell Pool", + "hacking-pool": " Hacking Pool:", + "control-pool": " Control Pool:", + "astral-pool": " Astral Pool:", + "task-pool": " Task Pool:", + "physical-damage-overflow": "Physical Damage Overflow:", + "initiative-natural": "Init Nat.", + "initiative-augmented": "Init. Aug.", + "initiative-physical": "Init. Phy.", + "initiative-astral": "Init. Astr. ", + "end-turn": "End Turn", + "body-abbreviation": "B:", + "quickness-abbreviation": "Q:", + "strength-abbreviation": "S:", + "charisma-abbreviation": "C:", + "intelligence-abbreviation": "I:", + "willpower-abbreviation": "W:", + "reaction-abbreviation": "R:", + "combat-conditions": "Combat conditions", + "ranged-modifiers": "Ranged Modifiers:", + "melee-modifiers": "Melee Modifiers:", + "rounds-fired": "Rounds Fired:", + "dodge": "Dodge", + "ballistic": "Ballistic:", + "impact": "Impact:", + "show-manual-gunnery": "Show Manual Gunnery", + "hide-manual-gunnery": "Hide Manual Gunnery", + "visibility": "Visibility", + "vision-enhacement": "Vision Enhacement", + "target-cover": "Target Cover", + "movement": "Movement", + "dual-wield": "Dual Wield", + "called-shot": "Called Shot", + "aim-actions": "Aim Actions", + "melee-foes": "Melee Foes", + "melee-friends": "Melee Friends", + "targets": "Targets", + "position": "Position", + "miscellaneous-modifiers": "Misc Modifiers", + "normal": "Normal", + "full-dark": "Full Dark", + "partial-light": "Partail Light", + "minimal-light": "Minimal Light", + "glare": "Glare", + "mist": "Mist", + "light-smoke-rain": "Light Smoke/Rain", + "heavy-smoke-rain": "Heavy Smoke/Rain", + "thermal-smoke": "Thermal Smoke", + "low-light": "LowLight", + "thermal": "Thermal", + "partial": "Partial", + "blind-fire": "Blind Fire", + "not-moving": "not moving", + "walk": "walk", + "walk-difficult-ground": "walk (difficult ground)", + "run": "run", + "run-difficult-ground": "run (difficult ground)", + "none": "", + "superior-position": "Superior Position", + "target-prone": "Target Prone", + "relative-motion": "Relative Motion", + "relative-speed": "Relative Speed", + "maneuver-score": "Maneuver Score", + "vehicle-damage": "Vehicle Damage", + "Weapon-mount": "Weapon Mount", + "terrain": "Terrain", + "target-type": "Target Type", + "towards": "Towards", + "away": "Away", + "attacker-greater": "Attacker Greaty by 10", + "target-greater": "Target Greater by 10", + "light-damage-abbreviation": "L", + "moderate-damage-abbreviation": "M", + "serious-damage-abbreviation": "S", + "unmounted": "Unmounted", + "mounted": "mounted", + "restricted": "Restricted", + "tight": "Tight", + "combat-zone": "Combat Zone", + "metahuman-sized": "Metahuman sized", + "small-critter": "Small critter", + "large-critter": "Large critter", + "small-drone": "Small drone", + "motorcyle": "Motorcyle", + "automobile": "Automobile", + "limo-Light-truck": "Limo/Light Truck", + "heavy-truck-trailer": "Heavy Truck/Trailer", + "boat": "Boat", + "yacht": "Yacht", + "freighter-tanker": "Freighter/Tanker", + "ultralight-glider": "Ultralight glider", + "fixed-wing": "Fixed Wing", + "commerical-airliner": "Commerical Airliner", + "helicopter": "Helicopter", + "zepplin-blimp": "Zepplin/Blimp", + "lav": "LAV", + "military-ground-vehicle": "Military Ground Vehicle", + "attribute": "Attribute", + "base": "Base", + "mods": "Mods", + "final": "Final", + "body": "Body", + "body-test-natural": "Body Test without augmentation", + "body-test-aug": "Body Test with augmentation", + "quickness": "Quickness", + "quickness-test-natural": "Quickness Test witht augmentation", + "strength": "Strength", + "strength-test-natural": "Strength Test with augmentation", + "charisma": "Charisma", + "charisma-test-natural": "Charisma Test with augmentation", + "intelligence": "Intelligence", + "intelligence-test-natural": "Intelligence Test with augmentation", + "willpower": "Willpower", + "willpower-test-natural": "Willpower Test with augmentation", + "essence": "Essence", + "essence-test": "Essence Test", + "magic-test": "Magic Test", + "level": "Level", + "perception": "Perception", + "perception-test": "Perception Test", + "reach": "Reach", + "attacks": "Attacks", + "deadly-damage-abbreviation": "D", + "light-stun-abbreviation": "L(stun)", + "moderate-stun-abbreviation": "M(stun)", + "serious-stun-abbreviation": "S(stun)", + "deadly-stun-abbreviation": "D(stun)", + "reaction-init-speed": "Reaction, Init & Speed", + "natural": "Natural", + "reaction": "Reaction:", + "initiative": "Max", + "astral": "Astral", + "walking-rate": "Walking Rate:", + "meters-per-combat-turn": "meters per combat turn", + "running-rate": "Running Rate:", + "pool": "Pool", + "calculated": "Calculated", + "spell": "Spell", + "hacking": "Hacking", + "control": "Control", + "task": "Task", + "karma-pool": "Karma Pool:", + "good-karma": "Good Karma:", + "professional-rating": "Professional Rating:", + "skills-edges-flaws": "Skills/Edges/Flaws", + "rating": "Rating", + "roll": "Roll", + "type": "Type", + "stacked": "Stacked", + "sustained": "Sustained", + "max": "Max", + "defense": "Defense", + "spells": "Spells", + "spell-defense": "Spell Defense:", + "sorcery": "Sorcery:", + "conjuring": "Conjuring:", + "misc-modifiers": "Misc. Modifiers:", + "defend": "Defend: ", + "dispell": "Dispell: ", + "summon": "Summon: ", + "banish": "Banish: ", + "spells-stacked": "Spells Stacked:", + "spells-sustained": "Spells Sustained:", + "resist-banish": "Resist Banish: ", + "astral-space": "Astral Space", + "astral-perception": "Astral Perception", + "astral-projection": "Astral Projection", + "astral-reaction": "Astral Reaction:", + "astral-initiative": "Astral Initiative:", + "astral-combat": "Astral Combat:", + "weapon-focus": "Weapon Focus:", + "enabled": "Enabled", + "magic-skills-configuration": "Magic Skills and Configuration", + "mage": "Mage", + "shaman": "Shaman", + "aspected-mage": "Aspected Mage", + "sorcer": "Sorcery:", + "specialize": "Specialize", + "spellcasting": "Spellcasting:", + "dispelling": "Dispelling:", + "ritual-magic": "Ritual Magic:", + "summoning": "Summoning:", + "banishing": "Banishing:", + "controlling": "Controlling:", + "aura-reading": "Aura Reading:", + "auras": "Auras:", + "signatures": "Signatures:", + "drain": "Drain", + "enchanting": "Enchanting:", + "divining": "Divining:", + "centering": "Centering:", + "creative-skill": "Creative Skill:", + "adept-powers": "Adept Powers", + "power": "Power", + "cost": "Cost", + "activate": "Activate", + "notes": "Notes", + "improved-reflexes": "Improved Reflexes: ", + "body-boost": "Body Boost: ", + "strength-boost": "Strength Boost: ", + "agility-boost": "Agility Boost: ", + "pain-resistance": "Pain Resistance: ", + "category": "Category", + "specialization-abbreviation": "Spec.", + "foci": "Foci", + "expendable-abbreviation": "Exp.", + "range": "Range", + "target": "Target", + "damage-abbreviation": "Dmg.", + "durration-abbreviation": "Dur.", + "drain-damage": "Drain Damage", + "description": "Description", + "health": "Health", + "detection": "Detection", + "illusion": "Illusion", + "elemental": "Elemental", + "telekinetic": "Telekinetic", + "transformation": "Transformation", + "mana": "Mana", + "line-of-sight-acronym": "LoS", + "area-of-effect-acronym": "AoE", + "touch": "Touch", + "target-number": "Target Number", + "light": "Light", + "medium": "Medium", + "serious": "Serious", + "deadly": "Deadly", + "light-stun": "Light(s)", + "medium-stun": "Medium(s)", + "deadly-stun": "Deadly(s)", + "instant-abbreviation": "I", + "sustained-abbreviation": "S", + "permanent-abbreviation": "P", + "damage-level": "Damage Lvl", + "damage-level-add-1": "Damage +1", + "damage-level-add-2": "Damage +2", + "damage-level-subtract-1": "Damage -1", + "damage-level-subtract-2": "Damage -2", + "fetishes-and-foci": "Fetishes and Foci", + "quantity": "Quantity", + "expendable": "Expendable", + "reusable": "Reusable", + "power-focus": "Power Focus", + "spirit-focus": "Spirit Focus", + "fire": "Fire", + "water": "Water", + "earth": "Earth", + "air": "Air", + "city-sprit": "City Spirit", + "field-sprit": "Field Spirit", + "hearth-sprit": "Hearth Spirit", + "desert-sprit": "Desert Spirit", + "forest-sprit": "Forest Spirit", + "mountain-sprit": "Mountain Spirit", + "prairie-sprit": "Prairie Spirit", + "mist-sprit": "Mist Spirit", + "storm-sprit": "Storm Spirit", + "wind-sprit": "Wind Spirit", + "lake-sprit": "Lake Spirit", + "river-sprit": "River Spirit", + "sea-sprit": "Sea Spirit", + "sylphs": "Sylphs", + "equip": "Equip", + "skill": "Skill", + "conceal": "Conceal", + "damage": "Damage", + "attack": "Attack", + "edged": "Edged", + "club": "Club", + "pole-arm": "Pole Arm", + "whip": "Whip", + "medium-damage-abbreviation": "M", + "initiation-and-metamagic": "Initiation and Metamagic", + "initiate-grade": "Initiate Grade:", + "metamagic": "Metamagic", + "geas": "Geas", + "geas-type": "Geas Type", + "geas-notes": "Geas Notes", + "totem-abilities": "Totem/Abilities", + "totem": "Totem", + "environment": "Environment", + "advantages": "Advantages", + "disadvantages": "Disadvantages" +} \ No newline at end of file From 42d26c2216fa062c8735d9e5c853bdd9e21c4dba Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Thu, 16 Sep 2021 23:31:27 -0400 Subject: [PATCH 23/49] fixed css error introduced with translatios. started decking translation --- Shadowrun3e/shadowrun3e.css | 37 ++++-- Shadowrun3e/shadowrun3e.html | 224 ++++++++++++++++------------------- Shadowrun3e/translation.json | 2 +- 3 files changed, 130 insertions(+), 133 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index f75a79871d..6a107256a1 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -2290,12 +2290,21 @@ input.enable-fa:not(:checked)~span.show_fa_dice { .deck-combat-system { display: grid; - vertical-align: middle; align-items: center; text-align: right; - grid-template-columns: 140px 65px 20px 20px 50px 20px 20px 50px 20px 20px 30px 20px 20px 50px 20px; + grid-template-columns: auto 20px 30px 20px 20px 70px 20px 70px 20px 70px 20px 70px 20px 70px 20px 1fr; +} +.deck-combat-system2 { + display: grid; + align-items: center; + text-align: right; + grid-template-columns: auto 20px 20px auto 20px 20px auto 20px 20px auto 20px 1fr; + } +.hack-pool-option { + display: grid; + align-items: center; + grid-template-columns: auto 20px 1fr; } - .deck-summary-attributes { display: grid; grid-template-columns: 65px 25px 50px 50px 50px; @@ -2306,7 +2315,7 @@ input.enable-fa:not(:checked)~span.show_fa_dice { display: grid; text-align: right; align-items: center; - grid-template-columns: 45px 22px 110px 50px 50px 130px 180px 100px; + grid-template-columns: auto 25px 20px auto auto auto 20px auto auto 20px auto auto 20px auto auto 1fr; } .frame-util-used { @@ -2510,14 +2519,18 @@ input.enable-fa:not(:checked)~span.show_fa_dice { .gunnery-switch[value="hide"]~div.manual-gunnery-show, .deck-utilities-switch[value="show"]~div.deck-utilities-hide, .deck-utilities-switch[value="hide"]~div.deck-utilities-show, -.deck-skills-switch[value="show"]~div.deck-skills-hide, -.deck-skills-switch[value="hide"]~div.deck-skills-show, +.securitysheaf-switch[value="hide"]~div.securitysheaf-show, +.combatskills-switch[value="show"]~div.combatskills-hide, +.combatskills-switch[value="hide"]~div.combatskills-show { + display: block; + grid-template-columns: auto 60px 1fr; +} + .deck-cyberdeck-switch[value="show"]~div.deck-cyberdeck-hide, .deck-cyberdeck-switch[value="hide"]~div.deck-cyberdeck-show, .securitysheaf-switch[value="show"]~div.securitysheaf-hide, -.securitysheaf-switch[value="hide"]~div.securitysheaf-show, -.combatskills-switch[value="show"]~div.combatskills-hide, -.combatskills-switch[value="hide"]~div.combatskills-show, +.deck-skills-switch[value="show"]~div.deck-skills-hide, +.deck-skills-switch[value="hide"]~div.deck-skills-show, .totem-switch[value="show"]~div.totem-hide, .totem-switch[value="hide"]~div.totem-show, .geas-switch[value="show"]~div.geas-hide, @@ -2525,11 +2538,11 @@ input.enable-fa:not(:checked)~span.show_fa_dice { .magicinitiate-switch[value="show"]~div.magicinitiate-hide, .magicinitiate-switch[value="hide"]~div.magicinitiate-show, .foci-switch[value="show"]~div.foci-hide, -.foci-switch[value="hide"]~div.foci-show, -.adeptpowers-switch[value="show"]~div.adeptpowers-hide, -.adeptpowers-switch[value="hide"]~div.adeptpowers-show, +.foci-switch[value="hide"]~div.foci-show, .spells-switch[value="show"]~div.spells-hide, .spells-switch[value="hide"]~div.spells-show, +.adeptpowers-switch[value="show"]~div.adeptpowers-hide, +.adeptpowers-switch[value="hide"]~div.adeptpowers-show, .sorceryskills-switch[value="show"]~div.sorceryskills-hide, .sorceryskills-switch[value="hide"]~div.sorceryskills-show, .astralattributes-switch[value="show"]~div.astralattributes-hide, diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index e402b2a33c..cd49a1a750 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -811,7 +811,7 @@
Defense
Used
-
Max
+
Max
Used
Spells
@@ -1106,7 +1106,6 @@
-
@@ -1479,31 +1478,29 @@
-
-
Cyberdecks and Utilities
-
-
-
Smart Frames and Agents
-
+
+
Cyberdecks and Utilities
+
+
Smart Frames and Agents
-
Cyber Combat
+
Cyber Combat
-
Persona
+
Persona
-
Core
+
Core
-
Undamaged
-
Light Damage
-
Moderate Damage
-
Serious Damage
-
Crashed
-
Condition
+
Undamaged
+
Light Damage
+
Moderate Damage
+
Serious Damage
+
Crashed
+
Condition
@@ -1528,48 +1525,48 @@
DNI
-
Hot ASIST
-
Reality Filter
-
IC Suppressed
-
Icon Status
-
Host/Grid Rating
+
Hot ASIST
+
Reality Filter
+
IC Suppressed
+
Icon Status
+
Host/Grid Rating
-
Pilot Rating
-
Utility Payload
-
IC Suppressed
-
Icon Status
-
Host/Grid Rating
+
Pilot Rating
+
Utility Payload
+
IC Suppressed
+
Icon Status
+
Host/Grid Rating
@@ -1578,89 +1575,77 @@ +
-
Initiative d6 + - - -
- End Turn -
- Sensor -
- Evade -
- Parry -
- Posistion -
Combat TN
- Resist -
- Medic -
- Decking +
Initiative
d6 + + +
End Turn
+
Sensor
+
Evade
+
Parry
+
Posistion
+
+
+
Combat TN
+
+
Resist
+
+
Medic
+
+
Decking
+

-
Use Hacking Pool for IC supression
+
+
Use Hacking Pool for IC supression
+
-
Full
-
Mods
-
Final
+
Full
+
Mods
+
Final
MPCP
-
Core
+
Core
-
Bod
+
Bod
-
Evasion
+
Evasion
-
Masking
+
Masking
-
Sensors
+
Sensors
-
Detect.F
+
Detect.F
-
- -
Penalties:
-
@@ -1668,58 +1653,61 @@
-
Jack In
-
Memory In Use:
+
Jack In
+
+
Memory In Use:
-
Hacking Pool:
-
Hacking Pool Used:
+ name="act_deck-utilities-unloadall" data-i18n="reset">Reset
+
+
Hacking Pool:
+
+
Hacking Pool Used:
+ -
Penalties:
+
+
Penalties:
-
Computer skills +
Computer skills
-
-
Computer skills +
Computer skills
-
-
Computer
+
Computer
-
specialize
+
specialize
-
Hardware
+
Hardware
-
Decking
+
Decking
-
Programming
+
Programming
-
Hardware
+
Hardware
-
Decking
+
Decking
-
Programming
+
Programming
@@ -1729,27 +1717,23 @@
-
Cyberdeck +
Cyberdeck
-
-
Cyberdeck +
Cyberdeck
-
-
Frame Core +
Frame Core
-
-
Frame Core +
Frame Core
-
@@ -1757,34 +1741,34 @@
-
Deck Name
+
Deck Name
MPCP
-
Bod
+
Bod
-
Evasion
+
Evasion
-
Masking
+
Masking
-
Sensors
+
Sensors
-
Hardening
+
Hardening
-
Active Memory
+
Active Memory
-
Storage Memory
+
Storage Memory
-
I/O Speed
+
I/O Speed
-
Response Increase
+
Response Increase
ICCM
-
Offline Storage
+
Offline Storage
diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index 0bae78766e..dc4ec7c127 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -203,7 +203,7 @@ "reaction-init-speed": "Reaction, Init & Speed", "natural": "Natural", "reaction": "Reaction:", - "initiative": "Max", + "initiative": "Initiative", "astral": "Astral", "walking-rate": "Walking Rate:", "meters-per-combat-turn": "meters per combat turn", From 7ad9520ea498bb64515d96680c9ce7e19214d2b8 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Fri, 17 Sep 2021 10:39:54 -0400 Subject: [PATCH 24/49] completed decking, karma and gear tabs. working on combat tab for translations --- Shadowrun3e/shadowrun3e.css | 66 +++-- Shadowrun3e/shadowrun3e.html | 555 ++++++++++++++++++----------------- Shadowrun3e/translation.json | 100 +++++-- 3 files changed, 394 insertions(+), 327 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index 6a107256a1..c944d779c2 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -262,6 +262,13 @@ input:checked+.slider:before { border-radius: 50%; } +.nuyen-total { + display: grid; + align-items: center; + grid-template-columns: auto auto 1fr; + +} + .karma-max { display: grid; align-items: center; @@ -1689,7 +1696,7 @@ melee-table-row input[type="textarea"], border-bottom-right-radius: 10px; } -.armor { +.armor-headers { display: grid; background-color: rgba(192,192,192,.9); grid-template-columns: 120px 35px 70px 35px 70px 35px 160px 180px 120px; @@ -2491,41 +2498,40 @@ input.enable-fa:not(:checked)~span.show_fa_dice { display: none; } +.vehicle-stats-switch[value="show"]~div.vehicle-stats-hide, +.vehicle-stats-switch[value="hide"]~div.vehicle-stats-show, +.vehicle-condition-switch[value="show"]~div.vehicle-condition-hide, +.vehicle-condition-switch[value="hide"]~div.vehicle-condition-show, +.rc-condition-switch[value="show"]~div.rc-condition-hide, +.rc-condition-switch[value="hide"]~div.rc-condition-show, +.ic-switch[value="show"]~div.ic-hide, +.ic-switch[value="hide"]~div.ic-show, +.gunnery-switch[value="show"]~div.manual-gunnery-hide, +.gunnery-switch[value="hide"]~div.manual-gunnery-show, +.securitysheaf-switch[value="hide"]~div.securitysheaf-show { + display: block; +} + .armor-switch[value="hide"]~div.armor-hide, .armor-switch[value="show"]~div.armor-show, .ammo-switch[value="hide"]~div.ammo-hide, .ammo-switch[value="show"]~div.ammo-show, .explosives-switch[value="hide"]~div.explosives-hide, .explosives-switch[value="show"]~div.explosives-show, -.meleeweapons-switch[value="hide"]~div.meleeweapons-hide, -.meleeweapons-switch[value="show"]~div.meleeweapons-show, .rangedweapons-switch[value="hide"]~div.rangedweapons-hide, .rangedweapons-switch[value="show"]~div.rangedweapons-show, -.vehicle-stats-switch[value="show"]~div.vehicle-stats-hide, -.vehicle-stats-switch[value="hide"]~div.vehicle-stats-show, -.drone-list-switch[value="show"]~div.drone-list-hide, -.drone-list-switch[value="hide"]~div.drone-list-show, -.vehicle-condition-switch[value="show"]~div.vehicle-condition-hide, -.vehicle-condition-switch[value="hide"]~div.vehicle-condition-show, -.rc-condition-switch[value="show"]~div.rc-condition-hide, -.rc-condition-switch[value="hide"]~div.rc-condition-show, -.rc-deck-switch[value="show"]~div.rc-deck-hide, -.rc-deck-switch[value="hide"]~div.rc-deck-show, +.meleeweapons-switch[value="hide"]~div.meleeweapons-hide, +.meleeweapons-switch[value="show"]~div.meleeweapons-show, +.combatskills-switch[value="show"]~div.combatskills-hide, +.combatskills-switch[value="hide"]~div.combatskills-show, .vehicle-skills-switch[value="show"]~div.vehicle-skills-hide, .vehicle-skills-switch[value="hide"]~div.vehicle-skills-show, -.ic-switch[value="show"]~div.ic-hide, -.ic-switch[value="hide"]~div.ic-show, -.gunnery-switch[value="show"]~div.manual-gunnery-hide, -.gunnery-switch[value="hide"]~div.manual-gunnery-show, +.rc-deck-switch[value="show"]~div.rc-deck-hide, +.rc-deck-switch[value="hide"]~div.rc-deck-show, +.drone-list-switch[value="show"]~div.drone-list-hide, +.drone-list-switch[value="hide"]~div.drone-list-show, .deck-utilities-switch[value="show"]~div.deck-utilities-hide, .deck-utilities-switch[value="hide"]~div.deck-utilities-show, -.securitysheaf-switch[value="hide"]~div.securitysheaf-show, -.combatskills-switch[value="show"]~div.combatskills-hide, -.combatskills-switch[value="hide"]~div.combatskills-show { - display: block; - grid-template-columns: auto 60px 1fr; -} - .deck-cyberdeck-switch[value="show"]~div.deck-cyberdeck-hide, .deck-cyberdeck-switch[value="hide"]~div.deck-cyberdeck-show, .securitysheaf-switch[value="show"]~div.securitysheaf-hide, @@ -2551,11 +2557,11 @@ input.enable-fa:not(:checked)~span.show_fa_dice { grid-template-columns: auto 60px 1fr; } -.ammo-switch[value="hide"]~div.ammo-show, -.armor-switch[value="hide"]~div.armor-show, -.explosives-switch[value="hide"]~div.explosives-show, -.meleeweapons-switch[value="hide"]~div.meleeweapons-show, -.rangedweapons-switch[value="hide"]~div.rangedweapons-show, +.ammo-switch[value="hide"]~div.ammo, +.armor-switch[value="hide"]~div.armor, +.explosives-switch[value="hide"]~div.explosives, +.meleeweapons-switch[value="hide"]~div.meleeweapons, +.rangedweapons-switch[value="hide"]~div.rangedweapons, .vehicle-stats-switch[value="hide"]~div.vehicle-stats, .drone-list-switch[value="hide"]~div.drones-list, .vehicle-condition-switch[value="hide"]~div.vehicle-condition, @@ -2673,7 +2679,7 @@ input.enable-fa:not(:checked)~span.show_fa_dice { grid-template-columns: 80px 80px 55px 80px 35px 1fr; } -.armor header, +.armor-headers header, .credsticks header, .karma-history header, .deck-utilities-special header, diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index cd49a1a750..47e20dd86b 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -1777,30 +1777,30 @@
-
Type
+
Type
-
Core Rating
+
Core Rating
-
Utility Payload
+
Utility Payload
-
Pilot
+
Pilot
-
Initiative
+
Initiative
-
Bod
+
Bod
-
Evasion
+
Evasion
-
Masking
+
Masking
-
Sensors
+
Sensors
@@ -1808,14 +1808,12 @@
-
Utilities +
Utilities
-
-
Utilities +
Utilities
-

@@ -1823,7 +1821,7 @@
- +
@@ -1833,18 +1831,18 @@
-
Special Utilities
+
Special Utilities
-
Utility
-
Rating
-
Multiplier
-
Size
-
Loaded
-
Effective Rating
-
Test
-
Swap Memory
-
Notes
-
Sleaze
+
Utility
+
Rating
+
Multiplier
+
Size
+
Loaded
+
Effective Rating
+
Test
+
Swap Memory
+
Notes
+
Sleaze
@@ -1853,7 +1851,7 @@
-
Track
+
Track
@@ -1865,18 +1863,18 @@
-
Defensive Utilities
+
Defensive Utilities
-
Utility
-
Rating
-
Multiplier
-
size
-
loaded
-
Effective Rating
-
Test
-
Swap Memory
-
Notes
-
Armor
+
Utility
+
Rating
+
Multiplier
+
size
+
loaded
+
Effective Rating
+
Test
+
Swap Memory
+
Notes
+
Armor
@@ -1885,7 +1883,7 @@
-
Cloak
+
Cloak
@@ -1894,7 +1892,7 @@
-
Lock-On
+
Lock-On
@@ -1903,7 +1901,7 @@
-
Medic
+
Medic
@@ -1928,23 +1926,23 @@
-
Offensive Utilities
+
Offensive Utilities
-
Utility
-
Rating
-
Multiplier
-
size
-
loaded
-
Effective Rating
-
Execute
-
Test
-
Swap Memory
-
Notes
+
Utility
+
Rating
+
Multiplier
+
size
+
loaded
+
Effective Rating
+
Execute
+
Test
+
Swap Memory
+
Notes
@@ -1956,7 +1954,7 @@
-
Black Hammer
+
Black Hammer
@@ -1966,7 +1964,7 @@
-
Killjoy
+
Killjoy
@@ -1976,7 +1974,7 @@
-
Slow
+
Slow
@@ -2004,30 +2002,30 @@
-
Additional Utilities
+
Additional Utilities
-
Utility
-
Rating
-
Target
-
Multiplier
-
Size
-
Loaded
-
Effective Rating
-
Execute
-
Test
-
Swap Memory
-
Notes
+
Utility
+
Rating
+
Target
+
Multiplier
+
Size
+
Loaded
+
Effective Rating
+
Execute
+
Test
+
Swap Memory
+
Notes
@@ -2046,21 +2044,21 @@
-
Karma
+
Karma
-
Karma Pool:
-
Good Karma:
-
Karma Total:
+
Karma Pool:
+
Good Karma:
+
Karma Total:

-
Attribute/Skill/Spell/etc.
-
Ammount of Karma
-
Date
-
Notes
+
Attribute/Skill/Spell/etc.
+
Ammount of Karma
+
Date
+
Notes
@@ -2071,29 +2069,30 @@

-
Notes
+
Notes
-
-
Nuyen:
+
+
Nuyen:
+
-
Gear
+
Gear
-
Name
-
Rating
-
Weight
-
Conceal
-
Type
-
Quantity
-
Pool
-
Roll
-
Description
+
Name
+
Rating
+
Weight
+
Conceal
+
Type
+
Quantity
+
Pool
+
Roll
+
Description
@@ -2102,19 +2101,19 @@
@@ -2123,31 +2122,31 @@

-
Credsticks ¥
+
Credsticks ¥
-
Type
-
ID
-
Rating
-
Balance ¥
-
Roll
-
Permits
+
Type
+
ID
+
Rating
+
Balance ¥
+
Roll
+
Permits
@@ -2158,13 +2157,13 @@

-
Vehicles List
-
Vehicle Details and Skill rating go on sepperate Vehicle Character Sheet
+
Vehicles List
+
Vehicle Details and Skill rating go on sepperate Vehicle Character Sheet
-
Name
-
Model
-
Cost ¥
-
Notes
+
Name
+
Model
+
Cost ¥
+
Notes
@@ -2180,37 +2179,35 @@
-
VCR Rating:
+
VCR Rating:
-
Vehicle Reaction:
+
Vehicle Reaction:
-
Vehicle Initiative:
+
Vehicle Initiative:
-
IVIS Master Unit:
IVIS Master Unit:
-
FDDM Master Unit:
+
FDDM Master Unit:
-
Remote Control Deck +
Remote Control Deck
-
-
Remote Control Deck +
Remote Control Deck
-

-
Intrusion Factor Base:
+
Intrusion Factor Base:
-
Intrusion Factor Mods:
+
Intrusion Factor Mods:
-
Intrusion Factor:
+
Intrusion Factor:
@@ -2218,43 +2215,43 @@
-
Rating
-
Roll
-
Flux Rating
-
Modified Flux
-
Range
-
Deck:
+
Rating
+
Roll
+
Flux Rating
+
Modified Flux
+
Range
+
Deck:
-
ECCM:
+
ECCM:
-
Electrons Warfare:
+
Electronic Warfare:
-
Encryption Module:
+
Encryption Module:
-
Decryption Module:
+
Decryption Module:
-
Protocol Emulation Module:
+
Protocol Emulation Module:
@@ -2263,23 +2260,21 @@
-
Drone Subscriber List +
Drone Subscriber List
-
-
Drone Subscriber List +
Drone Subscriber List
-

-
Name
-
Type
-
Model
-
Cost
-
Notes
+
Name
+
Type
+
Model
+
Cost
+
Notes
@@ -2294,31 +2289,29 @@
-
Vehicle Skills +
Vehicle Skills
-
-
Vehicle Skills +
Vehicle Skills
-

-
Update Vehicle Skill Here
-
If specializing in a specif vehicle, add modifiers to the vehicle/drone itself

+
Update Vehicle Skill Here
+
If specializing in a specif vehicle, add modifiers to the vehicle/drone itself

-
Skill
-
Level
-
Specialize
-
Remote Operation
+
Skill
+
Level
+
Specialize
+
Remote Operation
-
Skill
-
Level
-
Specialize
-
Remote Operation
+
Skill
+
Level
+
Specialize
+
Remote Operation
-
Bike:
+
Bike:
@@ -2328,7 +2321,7 @@
-
Car:
+
Car:
@@ -2338,7 +2331,7 @@
-
Hovercraft:
+
Hovercraft:
@@ -2348,7 +2341,7 @@
-
LTA Aircraft:
+
LTA Aircraft:
@@ -2359,7 +2352,7 @@
-
Motorboat:
+
Motorboat:
@@ -2370,7 +2363,7 @@
-
Rotor Aircraft:
+
Rotor Aircraft:
@@ -2380,7 +2373,7 @@
-
Sailboat:
+
Sailboat:
@@ -2390,7 +2383,7 @@
-
Ship:
+
Ship:
@@ -2400,7 +2393,7 @@
-
Submarine:
+
Submarine:
@@ -2410,7 +2403,7 @@
-
Vectored Thrust:
+
Vectored Thrust:
@@ -2422,7 +2415,7 @@
-
Winged Aircraft:
+
Winged Aircraft:
@@ -2434,7 +2427,7 @@
-
Mechanical Arm:
+
Mechanical Arm:
@@ -2444,7 +2437,7 @@
-
Semiballistic:
+
Semiballistic:
@@ -2456,7 +2449,7 @@
-
Suborbital:
+
Suborbital:
@@ -2466,7 +2459,7 @@
-
Tracks:
+
Tracks:
@@ -2476,7 +2469,7 @@
-
Walkers:
+
Walkers:
@@ -2494,7 +2487,7 @@
-
Combat
+
Combat
@@ -2508,67 +2501,69 @@
-
Combat Skills
+
Combat Skills
+
-
Combat Skills
+
Combat Skills
+

-
Update Combat Skill Here
-
If specializing in a weapon, add modifiers to the weapon itself

+
Update Combat Skill Here
+
If specializing in a weapon, add modifiers to the weapon itself

-
Assualt Rifle:
Assualt Rifle:
-
Pistols:
-
Rifles:
-
Shotguns:
-
SMGs:
-
Throwing:
-
Edged:
-
Clubs:
-
Cyper Implant:
Pistols:
+
Rifles:
+
Shotguns:
+
SMGs:
+
Throwing:
+
Edged:
+
Clubs:
+
Cyper Implant:
-
Whips:
-
Pole Arms:
-
Gunnery:
-
Heavy Weapons:
Whip:
+
Pole Arm:
+
Gunnery:
+
Heavy Weapons:
-
Lasers:
-
Launchers: +
Lasers:
+
Launchers:
-
Spray:
-
Gyrojet:
-
Projectile: +
Spray:
+
Gyrojet:
+
Projectile:
-
Demolitions: +
Demolitions:
-
Under Water:
Under Water:
-
Blowgun:
-
Bracer:
-
Gun Cane:
-
Oral Gun:
-
Oral Strike:
-
Eye Gun:
+
Blowgun:
+
Bracer:
+
Gun Cane:
+
Oral Gun:
+
Oral Strike:
+
Eye Gun:
-
Unarmed:
-
Martial Arts:
+
Unarmed:
+
Martial Arts:
- - - - - - - - + + + + + + + +
-
Notes:
+
Notes:
@@ -2578,44 +2573,46 @@
-
Ranged Weapons
+
Ranged Weapons
+
-
Ranged Weapons
+
Ranged Weapons
+

-
+
-
Equip
-
General
-
Range
-
Fire Mode
-
Damage
-
Ammunition
-
Show
+
Equip
+
General
+
Range
+
Fire Mode
+
Damage
+
Ammunition
+
Show
-
Pri
-
Sec
-
Name
-
Type
-
Conceal
-
Min
-
S
-
M
-
L
-
Ex
-
SS
-
SA
-
BF
-
FA
-
Power
-
Dmg
-
Max
-
Remain
-
Reload
-
Fire
-
More
+
Pri
+
Sec
+
Name
+
Type
+
Conceal
+
Min
+
S
+
M
+
L
+
Ex
+
SS
+
SA
+
BF
+
FA
+
Power
+
Dmg
+
Max
+
Remain
+
Reload
+
Fire
+
More
@@ -2776,13 +2773,15 @@
-
Melee Weapons
+
Melee Weapons
+
-
Melee Weapons
+
Melee Weapons
+

-
+
@@ -2899,13 +2898,15 @@
-
Explosives
+
Explosives
+
-
Explosives
+
Explosives
+

-
+
Name
Type
@@ -3010,16 +3011,18 @@
-
Armor
+
Armor
+
-
Armor
+
Armor
+

-
+
-
+
Pain Resistance:
Ballistic:
Impact:
@@ -3059,12 +3062,14 @@
-
Ammunition
+
Ammunition
+
-
Ammunition
+
Ammunition
+
-
+

diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index dc4ec7c127..c0e9a7e9cc 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -1,4 +1,22 @@ { + "reaction-init-speed": "Reaction, Init & Speed", + "natural": "Natural", + "mods": "Mods", + "final": "Final", + "reaction": "Reaction:", + "initiative": "Initiative", + "physical": "Physical", + "astral": "Astral", + "walking-rate": "Walking Rate:", + "meters-per-combat-turn": "meters per combat turn", + "running-rate": "Running Rate:", + "pool": "Pool", + "calculated": "Calculated", + "combat": "Combat", + "spell": "Spell", + "hacking": "Hacking", + "control": "Control", + "task": "Task", "general-info": "General Information", "name": "Name", "sheet-type": "Sheet Type:", @@ -53,7 +71,6 @@ "decking": "Decking", "gear": "Gear", "rigger": "Rigger", - "combat": "Combat", "cyberware": "Cyberware", "contacts-lifesytle": "Contacts/Lifestyle", "karma": "Karma", @@ -64,7 +81,6 @@ "serious-stun": "Serious(s)", "unconscious": "Unconscious", "stun": "Stun", - "physical": "Physical", "light-wound": "Light Wound", "moderate-wound": "Moderate Wound", "serious-wound": "Serious Wound", @@ -74,7 +90,7 @@ "used": "Used", "combat-pool": " Combat Pool:", "spell-pool": "Spell Pool", - "hacking-pool": " Hacking Pool:", + "hacking-pool": "Hacking Pool:", "control-pool": " Control Pool:", "astral-pool": " Astral Pool:", "task-pool": " Task Pool:", @@ -110,7 +126,7 @@ "melee-foes": "Melee Foes", "melee-friends": "Melee Friends", "targets": "Targets", - "position": "Position", + "position": "Posistion", "miscellaneous-modifiers": "Misc Modifiers", "normal": "Normal", "full-dark": "Full Dark", @@ -172,8 +188,6 @@ "military-ground-vehicle": "Military Ground Vehicle", "attribute": "Attribute", "base": "Base", - "mods": "Mods", - "final": "Final", "body": "Body", "body-test-natural": "Body Test without augmentation", "body-test-aug": "Body Test with augmentation", @@ -200,20 +214,6 @@ "moderate-stun-abbreviation": "M(stun)", "serious-stun-abbreviation": "S(stun)", "deadly-stun-abbreviation": "D(stun)", - "reaction-init-speed": "Reaction, Init & Speed", - "natural": "Natural", - "reaction": "Reaction:", - "initiative": "Initiative", - "astral": "Astral", - "walking-rate": "Walking Rate:", - "meters-per-combat-turn": "meters per combat turn", - "running-rate": "Running Rate:", - "pool": "Pool", - "calculated": "Calculated", - "spell": "Spell", - "hacking": "Hacking", - "control": "Control", - "task": "Task", "karma-pool": "Karma Pool:", "good-karma": "Good Karma:", "professional-rating": "Professional Rating:", @@ -250,7 +250,7 @@ "shaman": "Shaman", "aspected-mage": "Aspected Mage", "sorcer": "Sorcery:", - "specialize": "Specialize", + "specialize": "specialize", "spellcasting": "Spellcasting:", "dispelling": "Dispelling:", "ritual-magic": "Ritual Magic:", @@ -355,5 +355,61 @@ "totem": "Totem", "environment": "Environment", "advantages": "Advantages", - "disadvantages": "Disadvantages" + "disadvantages": "Disadvantages", + "cyberdecks-and-utilities": "Cyberdecks and Utilities", + "smart-frames-and-agents": "Smart Frames and Agents", + "cyber-combat": "Cyber Combat", + "persona": "Persona", + "core": "Core", + "undamaged": "Undamaged", + "light-damage": "Light Damage", + "moderate-damage": "Moderate Damage", + "serious-damage": "Serious Damage", + "crashed": "Crashed", + "condition": "Condition", + "hot-asist": "Hot ASIST", + "reality-filter": "Reality Filter", + "ic-suppressed": "IC Suppressed", + "icon-status": "Icon Status", + "host-grid-rating": "Host/Grid Rating", + "intruder": "Intruder", + "legitimate": "Legitimate", + "unknown": "Unknown", + "blue": "Blue", + "green": "Green", + "orange": "Orange", + "red": "Red", + "pilot-rating": "Pilot Rating", + "utility-payload": "Utility Payload", + "sensor": "Sensor", + "evade": "Evade", + "parry": "Parry", + "combat-tn": "Combat TN", + "resist": "Resist", + "medic": "Medic", + "use-hacking-pool-for-ic-supression": "Use Hacking Pool for IC supression", + "full": "Full", + "bod": "Bod", + "evasion": "Evasion", + "masking": "Masking", + "sensors": "Sensors", + "detection-factor-abbreviation": "Detect.F", + "jack-in": "Jack In", + "memory-in-use": "Memory In Use:", + "reset": "Reset", + "hacking-pool-used": "Hacking Pool Used:", + "penalties": "Penalties:", + "computer-skills": "Computer skills", + "computer": "Computer", + "hardware": "Hardware", + "programming": "Programming", + "cyberdeck": "Cyberdeck", + "frame-core": "Frame Core", + "deck-name": "Deck Name", + "hardening": "Hardening", + "active-memory": "Active Memory", + "storage-memory": "Storage Memory", + "io-speed": "I/O Speed", + "response-increase": "Response Increase", + "offline-storage": "Offline Storage" } \ No newline at end of file From f1749b7ef9920338468134877723dcd66ccebd43 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Fri, 17 Sep 2021 12:24:56 -0400 Subject: [PATCH 25/49] moved weapon focus under unarmed melee in combat tab. show/hide still in effect if force is < 0 --- Shadowrun3e/shadowrun3e.css | 9 +- Shadowrun3e/shadowrun3e.html | 354 +++++++++++++++++------------------ Shadowrun3e/translation.json | 283 ++++++++++++++++++++++++---- 3 files changed, 430 insertions(+), 216 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index c944d779c2..785fbd41ae 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -364,6 +364,7 @@ input:checked+.slider:before { grid-template-columns: 220px; } +.show-weaponmod .header, .matrix-rating .header { font-weight: bold; } @@ -1740,7 +1741,7 @@ melee-table-row input[type="textarea"], display: grid; font-weight: bold; font-size: 10px; - grid-template-columns: 50px 100px 60px 100px 50px 45px 45px 50px 60px 40px 1fr; + grid-template-columns: 50px 100px 60px 100px 50px 45px 45px 50px 60px 40px 40px 1fr; } .weaponfocus-attributes { display: grid; @@ -1752,7 +1753,7 @@ melee-table-row input[type="textarea"], border-bottom-left-radius: 10px; border-bottom-right-radius: 10px; text-align: center; - grid-template-columns: 50px 100px 60px 100px 50px 45px 45px 50px 60px 40px 1fr; + grid-template-columns: 50px 100px 60px 100px 50px 45px 45px 50px 60px 40px 40px 1fr; } .melee-table-header { @@ -1761,7 +1762,7 @@ melee-table-row input[type="textarea"], font-size: 10px; grid-template-columns: 50px 100px 100px 50px 45px 45px 50px 60px 60px 40px 1fr; } - +.weaponfocus, .melee-table-row { align-content: center; display: grid; @@ -2438,7 +2439,7 @@ input.enable-fa:not(:checked)~span.show_fa_dice { .manual-gunnery-tn[value="0"]~button.gunneryswitch { background-color: green; } -.weaponfocus-show[value="false"]~div.weaponfocus { +.weaponfocus-show[value="false"]~div.show-weaponfocus-melee { display: none; } .armor-show, diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 47e20dd86b..154de0b94d 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -589,10 +589,10 @@ - - - - + + + +
Power
Damage
-
Specialize
+
+Dice
+
+TN
Attack
Notes
@@ -1390,14 +1391,15 @@ - + +
@@ -1940,7 +1942,7 @@
Notes
@@ -2606,7 +2608,7 @@
SA
BF
FA
-
Power
+
Power
Dmg
Max
Remain
@@ -2622,43 +2624,43 @@ name="attr_secondary-ranged-equipped">
@@ -2672,14 +2674,14 @@
@@ -2695,75 +2697,75 @@
- Skill
-
+Dice
-
+TN
-
Recoil Comp
-
Gyro Stabalization
-
Targeting Assistance
-
Reload Type
-
Reloads
-
Ammo Type
-
Notes:
+ Skill
+
+Dice
+
+TN
+
Recoil Comp
+
Gyro Stabalization
+
Targeting Assistance
+
Reload Type
+
Reloads
+
Ammo Type
+
Notes:
@@ -2773,11 +2775,11 @@
-
Melee Weapons
+
Melee Weapons
-
Melee Weapons
+
Melee Weapons

@@ -2789,29 +2791,29 @@
-
Equip
-
Name
-
Skill
-
Conceal
-
Reach
-
Power
-
Damage
-
+Dice
-
+TN
-
Attack
-
Notes
+
Equip
+
Name
+
Skill
+
Conceal
+
Reach
+
Power
+
Damage
+
+Dice
+
+TN
+
Attack
+
Notes
@@ -2819,31 +2821,59 @@ title="Melee Attack">
-
+
+ +
+
+
+ + + + + + + + +
+ +
+
+
@@ -2853,48 +2883,6 @@
- -
-
Weapon Focus
-
-
Equip
-
Name
-
Reach
-
Skill
-
Conceal
-
Force
-
Power
-
Damage
-
Specialize
-
Attack
-
Notes
-
-
-
- - - - - - - - -
- -
-
-
@@ -6015,6 +6003,8 @@ on('clicked:matrixattack', (info) => { atts.push("quickness_max"); console.log(atts); getAttrs(atts, function(myval) { + console.log('myval'); + console.log(myval); const max=parseInt(myval[myrepeat.concat("ammo")]); const myweapon=myval[myrepeat.concat("name")]; const myreload=myval[myrepeat.concat("reloadmethod")]; @@ -6029,12 +6019,15 @@ on('clicked:matrixattack', (info) => { if (myreload=="clip") acttype="simple"; if ( ( myreload == "cylinder" ) || ( myreload == "magazine" ) || ( myreload=="break" ) ) { if ( quick > maxload ) { + console.log('loading max' ); ammoused = maxload; } else { + console.log('too many'); ammoused = quick; } if ( ammoused > myreloads ) ammoused = myreloads; rounds = ammoused + remain; + reloadtxt=ammoused + " rounds into " + myreload; } const reloadsleft=myreloads - ammoused; if (myreloads < 1) { @@ -6050,6 +6043,7 @@ on('clicked:matrixattack', (info) => { myroll += "{{info2=" + reloadsleft +" Spare " + myreload + "s Remaining}}"; } } + console.log(myroll); setatts[myrepeat.concat("ammoremain")]=rounds; setatts[myrepeat.concat("reloads")]=reloadsleft; setAttrs(setatts); diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index c0e9a7e9cc..078e8d8589 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -1,22 +1,4 @@ { - "reaction-init-speed": "Reaction, Init & Speed", - "natural": "Natural", - "mods": "Mods", - "final": "Final", - "reaction": "Reaction:", - "initiative": "Initiative", - "physical": "Physical", - "astral": "Astral", - "walking-rate": "Walking Rate:", - "meters-per-combat-turn": "meters per combat turn", - "running-rate": "Running Rate:", - "pool": "Pool", - "calculated": "Calculated", - "combat": "Combat", - "spell": "Spell", - "hacking": "Hacking", - "control": "Control", - "task": "Task", "general-info": "General Information", "name": "Name", "sheet-type": "Sheet Type:", @@ -38,7 +20,7 @@ "troll": "Troll", "age": "Age:", "height": "Height:", - "weight": "Weight:", + "weight": "Weight", "spirit-type": "Spirit Type: ", "watcher": "Watcher", "air-elemental": "Air Elemental", @@ -71,6 +53,7 @@ "decking": "Decking", "gear": "Gear", "rigger": "Rigger", + "combat": "Combat", "cyberware": "Cyberware", "contacts-lifesytle": "Contacts/Lifestyle", "karma": "Karma", @@ -81,6 +64,7 @@ "serious-stun": "Serious(s)", "unconscious": "Unconscious", "stun": "Stun", + "physical": "Physical", "light-wound": "Light Wound", "moderate-wound": "Moderate Wound", "serious-wound": "Serious Wound", @@ -146,7 +130,7 @@ "walk-difficult-ground": "walk (difficult ground)", "run": "run", "run-difficult-ground": "run (difficult ground)", - "none": "", + "none": "None", "superior-position": "Superior Position", "target-prone": "Target Prone", "relative-motion": "Relative Motion", @@ -188,6 +172,8 @@ "military-ground-vehicle": "Military Ground Vehicle", "attribute": "Attribute", "base": "Base", + "mods": "Mods", + "final": "Final", "body": "Body", "body-test-natural": "Body Test without augmentation", "body-test-aug": "Body Test with augmentation", @@ -210,10 +196,24 @@ "reach": "Reach", "attacks": "Attacks", "deadly-damage-abbreviation": "D", - "light-stun-abbreviation": "L(stun)", - "moderate-stun-abbreviation": "M(stun)", - "serious-stun-abbreviation": "S(stun)", - "deadly-stun-abbreviation": "D(stun)", + "light-stun-abbreviation": "L(s)", + "moderate-stun-abbreviation": "M(s)", + "serious-stun-abbreviation": "S(s)", + "deadly-stun-abbreviation": "D(s)", + "reaction-init-speed": "Reaction, Init & Speed", + "natural": "Natural", + "reaction": "Reaction:", + "initiative": "Initiative", + "astral": "Astral", + "walking-rate": "Walking Rate:", + "meters-per-combat-turn": "meters per combat turn", + "running-rate": "Running Rate:", + "pool": "Pool", + "calculated": "Calculated", + "spell": "Spell", + "hacking": "Hacking", + "control": "Control", + "task": "Task", "karma-pool": "Karma Pool:", "good-karma": "Good Karma:", "professional-rating": "Professional Rating:", @@ -250,7 +250,7 @@ "shaman": "Shaman", "aspected-mage": "Aspected Mage", "sorcer": "Sorcery:", - "specialize": "specialize", + "specialize": "Specialize", "spellcasting": "Spellcasting:", "dispelling": "Dispelling:", "ritual-magic": "Ritual Magic:", @@ -269,7 +269,7 @@ "power": "Power", "cost": "Cost", "activate": "Activate", - "notes": "Notes", + "notes": "Notes:", "improved-reflexes": "Improved Reflexes: ", "body-boost": "Body Boost: ", "strength-boost": "Strength Boost: ", @@ -281,7 +281,7 @@ "expendable-abbreviation": "Exp.", "range": "Range", "target": "Target", - "damage-abbreviation": "Dmg.", + "damage-abbreviation": "Dmg", "durration-abbreviation": "Dur.", "drain-damage": "Drain Damage", "description": "Description", @@ -340,10 +340,10 @@ "conceal": "Conceal", "damage": "Damage", "attack": "Attack", - "edged": "Edged", + "edged": "Edged:", "club": "Club", - "pole-arm": "Pole Arm", - "whip": "Whip", + "pole-arm": "Pole Arm:", + "whip": "Whip:", "medium-damage-abbreviation": "M", "initiation-and-metamagic": "Initiation and Metamagic", "initiate-grade": "Initiate Grade:", @@ -392,7 +392,7 @@ "bod": "Bod", "evasion": "Evasion", "masking": "Masking", - "sensors": "Sensors", + "sensors": "Karma", "detection-factor-abbreviation": "Detect.F", "jack-in": "Jack In", "memory-in-use": "Memory In Use:", @@ -411,5 +411,224 @@ "storage-memory": "Storage Memory", "io-speed": "I/O Speed", "response-increase": "Response Increase", - "offline-storage": "Offline Storage" + "offline-storage": "Offline Storage", + "smart-frame": "Smart Frame", + "agent": "Agent", + "core-rating": "Core Rating", + "pilot": "Pilot", + "utilities": "Utilities", + "utility-rating-sum": "Utility Rating Sum", + "special-utilities": "Special Utilities", + "utility": "Utility", + "multiple": "Multiplier", + "size": "Size", + "loaded": "Loaded", + "effective-rating": "Effective Rating", + "test": "Test", + "swap-memory": "Swap Memory", + "sleaze": "Sleaze", + "track": "Track", + "defensive-utilities": "Defensive Utilities", + "multiplier": "Multiplier", + "armor": "Armor", + "cloak": "Cloak", + "lock-on": "Lock-On", + "offensive-utilities": "Offensive Utilities", + "execute": "Execute", + "attack-light-damage-abbreviation": "Attack (L)", + "attack-medium-damage-abbreviation": "Attack (M)", + "attack-serious-damage-abbreviation": "Attack (S)", + "attack-deadly-damage-abbreviation": "Attack (D)", + "black-hammer": "Black Hammer", + "killjoy": "Killjoy", + "slow": "Slow", + "additional-utilities": "Additional Utilities", + "access": "access", + "index": "index", + "files": "files", + "slave": "slave", + "karma-total": "Karma Total:", + "attribute-skill-spell-etc": "Attribute/Skill/Spell/etc.", + "ammount-of-karma": "Ammount of Karma", + "date": "Date", + "consumeable": "Consumeable", + "credsticks": "Credsticks ¥", + "id": "ID", + "balance": "Balance ¥", + "permits": "Permits", + "certified": "Certified", + "standard": "Standard", + "silver": "Silver", + "gold": "Gold", + "platinum": "Platinum", + "ebony": "Ebony", + "forged": "Forged", + "vehicles-list": "Vehicles List", + "vehicles-skill-message": "Vehicle Details and Skill rating go on sepperate Vehicle Character Sheet", + "model": "Model", + "vcr-rating": "VCR Rating:", + "vehicle-reaction": "Vehicle Reaction:", + "vehicle-initiative": "Vehicle Initiative:", + "ivis-master-unit": "IVIS Master Unit:", + "fddm-master-unit": "FDDM Master Unit:", + "remote-control-deck": "Remote Control Deck", + "intrusion-factor-base": "Intrusion Factor Base:", + "intrusion-factor-modifier": "Intrusion Factor Mods:", + "intrusion-factor": "Intrusion Factor:", + "flux-rating": "Flux Rating", + "modified-flux": "Modified Flux", + "deck": "Deck:", + "eccm": "ECCM:", + "electronic-warfare": "Electronic Warfare:", + "encryption-module": "Encryption Module:", + "decryption-module": "Decryption Module:", + "protocol-emulation-module": "Protocol Emulation Module:", + "drone-subscriber-list": "Drone Subscriber List", + "vehicle-skills": "Vehicle Skills", + "update-vehicle-skill-here": "Update Vehicle Skill Here", + "vehicle-specialize-message": "If specializing in a specif vehicle, add modifiers to the vehicle/drone itself", + "remote-operation": "Remote Operation", + "bike": "Bike:", + "car": "Car:", + "hovercraft": "Hovercraft:", + "lighter-than-air-aircraft-abbreviated": "LTA Aircraft:", + "motorboat": "Motorboat:", + "rotor-aircraft": "Rotor Aircraft:", + "sailboat": "Sailboat:", + "ship": "Ship:", + "submarine": "Submarine:", + "vectored-thrust": "Vectored Thrust:", + "winged-aircraft": "Winged Aircraft:", + "mechanical-arm": "Mechanical Arm:", + "semiballistic": "Semiballistic:", + "suborbital": "Suborbital:", + "tracks": "Tracks:", + "walkers": "Walkers:", + "combat-skills": "Combat Skills", + "update-combat-skills-here": "Update Combat Skill Here", + "combat-skills-specialization-message": "If specializing in a weapon, add modifiers to the weapon itself", + "assualt-rifle": "Assualt Rifle:", + "pistols": "Pistols:", + "rifles": "Rifles:", + "shotguns": "Shotguns:", + "sub-machine-gun-abbreviation": "SMG", + "throwing": "Throwing:", + "clubs": "Clubs:", + "cyber-implant": "Cyper Implant:", + "gunnery": "Gunnery:", + "heavy-weapons": "Heavy Weapons:", + "lasers": "Lasers:", + "launchers": "Launchers:", + "spray": "Spray:", + "gyrojet": "Gyrojet:", + "projectile": "Projectile", + "demolitions": "Demolitions:", + "under-water": "Under Water:", + "blowgun": "Blowgun", + "bracer": "Bracer", + "gun-cane": "Gun Cane", + "oral-gun": "Oral Gun", + "oral-strike": "Oral Strike", + "eye-gun": "Eye Gun", + "unarmed": "Unarmed", + "martial-arts": "Martial Arts:", + "brawling": "Brawling", + "mma": "MMA", + "karate": "Karate", + "arnis": "Arnis", + "muy-thai": "Muy Thai", + "tae-kwon-do": "Tae Kwon Do", + "wild-cat": "Wild Cat", + "ranged-weapons": "Ranged Weapons", + "general": "General", + "fire-mode": "Fire Mode", + "ammunition": "Ammunition", + "show": "Show", + "primary-abbreviation": "Pri", + "secondary-abbreviation": "Sec", + "minimum-abbreviation": "Min", + "short-abbreviation": "S", + "medium-abbreviation": "M", + "long-abbreviation": "L", + "extreme-abbreviation": "Ex", + "single-shot-abbreviation": "SS", + "semi-automatic-abbreviation": "SA", + "burst-fire-abbreviation": "BF", + "full-automatic-abbreviation": "FA", + "maximum-abbreviation": "Max", + "remain": "Remain", + "reload": "Reload", + "more": "More", + "other": "Other", + "hold-out-pistol ": "Hold-out Pistol", + "light-pistol": "Light Pistol", + "machine-pistol": "Machine Pistol", + "heavy-pistol": "Heavy Pistol", + "taser": "Taser", + "shotgun": "Shotgun", + "sporting-rifle": "Sporting Rifle", + "sniper-rifle": "Sniper Rifle", + "assault-rifle": "Assault Rifle", + "light-machine-gun-abbreviation": "LMG", + "medium-machine-gun-abbreviation": "MMG", + "heavy-machine-gun-abbreviation": "HMG", + "assualt-cannon": "Assault Cannon", + "minigun": "Minigun", + "bow": "Bow", + "light-crossbow": "Light Crossbow", + "medium-crossbow": "Medium Crossbow", + "heavy-crossbow": "Heavy Crossbow", + "sling-shot": "Sling Shot", + "sling-launcher": "Sling Launcher", + "thrown-knife": "Thrown Knife", + "shuriken": "Shuriken", + "caltrops": "Caltrops", + "nets": "Nets", + "speargun": "Speargun", + "net-gun": "Net Gun", + "laser-pistol": "Laser Pistol", + "laser-rifle": "Laser Rifle", + "laser-sniper": "Laser Sniper", + "gyrojet-land": "Gyrojet (land)", + "gyrojet-water": "Gyrojet (water)", + "flamethrower": "Flamethrower", + "attack-moderate-damage-abbreviation": "Attack (M)", + "plus-dice-abbreviation": "+Dice", + "plus-target-number-abberviation": "+TN", + "recoil-compensation-abbreviation": "Recoil Comp", + "gyro-stabalization": "Gyro Stabalization", + "targeting-assistance": "Targeting Assistance", + "reload-type": "Reload Type", + "reloads": "Reloads", + "ammo-type": "Ammo Type", + "pistol": "Pistol", + "heavy-weapon": "Heavy Weapon", + "laser": "Laser", + "rifle": "Rifle", + "thrown": "Thrown", + "regular": "Regular", + "deluxe": "Deluxe", + "smartlink": "Smartlink", + "laser-sight": "LaserSight", + "smart-goggles": "Smart Goggles", + "clip": "clip", + "break": "break", + "magazine": "magazine", + "speed-loader": "speed loader", + "cylinder": "cylinder", + "belt": "belt", + "adps": "ADPS", + "explosive": "Explosive", + "explosive-ex": "Explosive EX", + "flechette": "Flechette", + "gel": "Gel", + "tracer": "Tracer", + "anti-vehicle": "Anti-Vehicle", + "capsule": "Capsule", + "glazer": "Glazer", + "Hi-C": "Hi-C", + "hollow-point": "Hollow Point", + "incendiary": "Incendiary", + "mercury": "Mercury", + "tracker": "Tracker" } \ No newline at end of file From 23e987b3c19487f461586ccdf967d486ac80161f Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Fri, 17 Sep 2021 13:10:30 -0400 Subject: [PATCH 26/49] completed translation on combat tab --- Shadowrun3e/shadowrun3e.css | 9 +- Shadowrun3e/shadowrun3e.html | 267 ++++++++++++++++++----------------- Shadowrun3e/translation.json | 61 ++++++-- 3 files changed, 188 insertions(+), 149 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index 785fbd41ae..db69e2f2bd 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -1456,7 +1456,8 @@ input.foci-switch:checked~div.fetish-foci { .combat-unarmed { display: grid; align-items: center; - grid-template-columns: 180px 80px auto auto auto; + text-align: right; + grid-template-columns: auto 50px 20px auto auto auto auto 1fr; border-bottom: 2px solid #fff; border-left: 2px solid #fff; border-right: 2px solid #fff; @@ -1700,7 +1701,7 @@ melee-table-row input[type="textarea"], .armor-headers { display: grid; background-color: rgba(192,192,192,.9); - grid-template-columns: 120px 35px 70px 35px 70px 35px 160px 180px 120px; + grid-template-columns: auto 35px auto 35px auto 35px auto 35px auto 35px auto 25px; text-align: right; align-items: center; border: 2px solid #fff; @@ -1779,7 +1780,7 @@ melee-table-row input[type="textarea"], font-weight: bold; display: grid; font-size: 10px; - grid-template-columns: 110px 100px 55px 40px 40px 40px 40px 40px 45px 70px 35px 40px 40px 40px 45px 45px 1fr; + grid-template-columns: 100px 100px 55px 40px 40px 50px 50px 50px 45px 55px 35px 40px 40px 40px 45px 45px 1fr } .explosives-table-row { @@ -1789,7 +1790,7 @@ melee-table-row input[type="textarea"], background-color: rgba(192,192,192,.9); border-right: 2px solid #fff; font-size: 10px; - grid-template-columns: 110px 100px 55px 40px 40px 40px 40px 40px 45px 70px 35px 40px 40px 40px 45px 45px 1fr; + grid-template-columns: 100px 100px 55px 40px 40px 50px 50px 50px 45px 55px 35px 40px 40px 40px 45px 45px 1fr } .explosive-mods-switch { diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 154de0b94d..72fc289995 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -865,11 +865,11 @@
Astral Space
- +
Astral Space
- +
@@ -906,11 +906,11 @@
Magic Skills and Configuration
- +
Magic Skills and Configuration
- +
@@ -1113,11 +1113,11 @@
Adept Powers
- +
Adept Powers
- +
@@ -1181,11 +1181,11 @@
Spells
- +
Spells
- +
@@ -1286,11 +1286,11 @@
Fetishes and Foci
- +
Fetishes and Foci
- +
@@ -1409,11 +1409,11 @@
Initiation and Metamagic
- +
Initiation and Metamagic
- +
@@ -1435,11 +1435,11 @@
Geas
- +
Geas
- +
@@ -1457,11 +1457,11 @@
Totem/Abilities
- +
Totem/Abilities
- +
@@ -1677,11 +1677,11 @@
Computer skills
- +
Computer skills
- +
@@ -1720,22 +1720,22 @@
Cyberdeck
- +
Cyberdeck
- +
Frame Core
- +
Frame Core
- +
@@ -1811,11 +1811,11 @@
Utilities
- +
Utilities
- +

@@ -2196,11 +2196,11 @@
Remote Control Deck
- +
Remote Control Deck
- +

@@ -2263,11 +2263,11 @@
Drone Subscriber List
- +
Drone Subscriber List
- +

@@ -2292,11 +2292,11 @@
Vehicle Skills
- +
Vehicle Skills
- +

@@ -2504,11 +2504,11 @@
Combat Skills
- +
Combat Skills
- +

@@ -2551,10 +2551,11 @@
-
Unarmed:
-
Martial Arts:
-
- +
Unarmed:
+
+
Martial Arts:
+
+ @@ -2565,6 +2566,7 @@
+
Notes:
@@ -2576,11 +2578,11 @@
Ranged Weapons
- +
Ranged Weapons
- +

@@ -2776,11 +2778,11 @@
Melee Weapons
- +
Melee Weapons
- +

@@ -2886,48 +2888,48 @@
-
Explosives
- +
Explosives
+
-
Explosives
- +
Explosives
+

-
Name
-
Type
-
Conceal
-
Min
-
S
-
M
-
L
-
Ex
-
Power
-
Damage
-
Intel.
-
Blast
-
Scatter
-
Qty.
-
Manual
-
Sensor
-
More
+
Name
+
Type
+
Conceal
+
Min
+
S
+
M
+
L
+
Ex
+
Power
+
Damage
+
Intel.
+
Blast
+
Scatter
+
Qty.
+
Manual
+
Sensor
+
More
@@ -2938,13 +2940,14 @@
@@ -2964,32 +2967,32 @@
-
Skill
-
+Dice
-
+TN
-
Recoil Comp
-
Gyro Stabalization
-
Targeting Assistance
-
Range Finder
-
Notes:
+
Skill
+
+Dice
+
+TN
+
Recoil Comp
+
Gyro Stabalization
+
Targeting Assistance
+
Range Finder
+
Notes:
@@ -2999,32 +3002,32 @@
-
Armor
- +
Armor
+
-
Armor
- +
Armor
+

-
Pain Resistance:
-
Ballistic:
-
Impact:
-
Quickness Penalty:
-
Combat Pool Penalty:
-
Dermal Armor:
+
Pain Resistance:
+
Ballistic:
+
Impact:
+
Quickness Penalty:
+
Combat Pool Penalty:
+
Dermal Armor:
-
Equip
-
Name
-
Slot
-
Ballistic Rating
-
Impact Rating
-
Notes
+
Equip
+
Name
+
Slot
+
Ballistic Rating
+
Impact Rating
+
Notes
@@ -3032,13 +3035,13 @@
@@ -3050,21 +3053,21 @@
-
Ammunition
- +
Ammunition
+
-
Ammunition
- +
Ammunition
+

-
Ammo Type
-
Ammount
-
Weight
-
Damage Modifier
+
Ammo Type
+
Quantity
+
Weight
+
Damage Modifier
@@ -3160,12 +3163,12 @@
Security Sheaf - +
Security Sheaf - +

@@ -3204,12 +3207,12 @@
Intrusion Countermeasures - +
Intrusion Countermeasures - +
@@ -3796,7 +3799,7 @@
+ id="hide" data-i18n="hide">Hide
-
Type
-
Grid
+
Type
+
Grid
-
Security Code
+
Security Code
-
-
Security Value
+
Security Value
/
-
Acesss
+
Acesss
/
-
Control
+
Control
/
-
Index
+
Index
/
-
Files
+
Files
/
-
Slave
+
Slave
-
@@ -3146,15 +3146,15 @@
-
Detection Roll
-
Security Tally
+
Detection Roll
+
Security Tally
Reset Tally
-
Alert Status
+
Alert Status
@@ -3162,20 +3162,18 @@
-
Security Sheaf +
Security Sheaf
-
-
Security Sheaf +
Security Sheaf
-

-
Trigger Step
-
Event
+
Trigger Step
+
Event
@@ -3185,11 +3183,11 @@

-
Intruder
-
Detection
-
Security Tally
-
Reset Tally
-
Select Token
+
Intruder
+
Detection
+
Security Tally
+
Reset Tally
+
Select Token
@@ -3206,31 +3204,29 @@
-
Intrusion Countermeasures +
Intrusion Countermeasures
-
-
Intrusion Countermeasures +
Intrusion Countermeasures
-
-
Name
-
Rating
-
Initiative
-
Damage
-
Type
-
Icon Status
-
Test Target
-
Sensor
-
Evade
-
Parry
-
Position
-
Execute
-
Resist
+
Name
+
Rating
+
Initiative
+
Damage
+
Type
+
Icon Status
+
Test Target
+
Sensor
+
Evade
+
Parry
+
Position
+
Execute
+
Resist
@@ -3240,37 +3236,37 @@
d6 +
@@ -3284,11 +3280,9 @@

- -
- Rapid Settings System Rating +
Rapid Settings System Rating
@@ -3298,48 +3292,46 @@
- - - - + + + +
- - - - + + + +
-
Interface
+
Interface
-
None
+
None
-
Datajack
+
Datajack
-
VCR
+
VCR
-
Autonav
+
Autonav
-
Speed
+
Speed
-
Current
-
Maximum
+
Current
+
Maximum
@@ -3348,16 +3340,16 @@
-
Maneuever
+
Maneuever
Score
+ type="action" name="act_maneuever" data-i18n="generate">Generate
+ name="act_maneuever" data-i18n="compare">Compare


@@ -3367,16 +3359,16 @@
Terrain
-
Off Road:
+
Off Road:
Terrain

@@ -3384,54 +3376,54 @@
-
Environment
+
Environment
-
Urban Setting:
+
Urban Setting:
-
Combat Zone:
+
Combat Zone:
-
Weather
+
Weather
-
Sensor LOS
+
Sensor LOS
Direct
Interupted
-
Sensor Test
+
Sensor Test
-
Vehicle
-
Drone
-
Undamaged
-
Light Damage
-
Moderate Damage
-
Serious Damage
-
Destroyed
-
Condition
+
Vehicle
+
Drone
+
Undamaged
+
Light Damage
+
Moderate Damage
+
Serious Damage
+
Destroyed
+
Condition
@@ -3455,13 +3447,13 @@
-
RC Signal
-
Full Strength
-
Light Degredation
-
Moderate Degredation
-
Serious Degredation
-
Disengaged
-
Command Channel
+
RC Signal
+
Full Strength
+
Light Degredation
+
Moderate Degredation
+
Serious Degredation
+
Disengaged
+
Command Channel
@@ -3482,7 +3474,7 @@
-
Simsense Channel
+
Simsense Channel
@@ -3503,7 +3495,7 @@
-
System Channel
+
System Channel
@@ -3529,40 +3521,40 @@
- +
-
Max
-
Used
-
Control Pool:
+
Max
+
Used
+
Control Pool:

-
Skills
+
Skills
-
Vehicle:
+
Vehicle:
-
Gunnery:
+
Gunnery:
-
Pilot Rating:
+
Pilot Rating:

-
Operative Mode:
+
Operative Mode:
-
Primary:
+
Primary:
-
Secondary:
+
Secondary:
@@ -3573,188 +3565,190 @@
-
Vehicle Configuration
-
Drone Configuration
+
Vehicle Configuration
+
Drone Configuration
-
Name
-
Manual Control
-
Datajack Port
-
Rigger Adaption
-
Remote Control
-
Vehicle Type
-
Vehicle Size
+
Name
+
Manual Control
+
Datajack Port
+
Rigger Adaption
+
Remote Control
+
Vehicle Type
+
Vehicle Size
-
Vehicle Attributes
-
Drone Attributes
+
Vehicle Attributes
+
Drone Attributes
-
Handling:
+
Handling:
-
Speed:
+
Speed:
-
Acceleration:
+
Acceleration:
-
Body:
+
Body:
-
Armor:
+
Armor:
-
Signature:
+
Signature:
-
Autonav:
+
Autonav:
-
Pilot:
+
Pilot:
-
Firmpoints:
+
Firmpoints:
-
Hardpoints:
+
Hardpoints:
-
Seating:
+
Seating:
-
Entry Points:
+
Entry Points:
-
Fuel:
+
Fuel:
-
Economy:
+
Economy:
-
Cargo:
+
Cargo:
-
Load:
+
Load:
-
Vehicle Skill:
+
Vehicle Skill:
-
Gunnery:
+
Gunnery:
-
Walk:
+
Walk:
-
Run:
+
Run:
-
IVIS Pool;
+
IVIS Pool;
-
Stress:
+
Stress:
-
Setup/Breakdown:
+
Setup/Breakdown:
-
Total Cost:
+
Total Cost:
-
Rapid Attribute Set:
+
Rapid Attribute Set:
+ +
-
Vehicle Notes
-
Drone Notes
- +
Vehicle Notes
+
Drone Notes
+
-
Vehicle Electornics and ECM/ECCM
-
Drone Electornics and ECM/ECCM
+
Vehicle Electornics and ECM/ECCM
+
Drone Electornics and ECM/ECCM
-
Vehicle Flux Rating
-
Drone Flux Rating
+
Vehicle Flux Rating
+
Drone Flux Rating
-
Vehicle Flux Used
-
Drone Flux Used
+
Vehicle Flux Used
+
Drone Flux Used
-
-
Rating
-
Flux Rating
-
Modified Flux
-
Max Flux
-
Roll Test
-
Opposition Test
-
Sensors:
+
+
Rating
+
Flux Rating
+
Modified Flux
+
Max Flux
+
Roll Test
+
Opposition Test
+
Sensors:
-
Sonar:
+
Sonar:
-
ECM:
+
ECM:
-
ECCM:
+
ECCM:
-
ED:
+
ED:
-
Activate
+
Activate
-
ECD:
+
ECD:
@@ -3766,115 +3760,109 @@
-
Initiative:
+
Initiative:
-
End Turn:
+
End Turn:
-
Hand
+
Hand
-
Accel:
+
Accel:
-
Body:
+
Body:
-
Armor:
+
Armor:
-
Sig:
+
Sig:
-
Auto:
+
Auto:
-
Sensor:
+
Sensor:
-
Vehicle Actions
-
Drone Actions
-
-
-
-
-
-
-
+
Vehicle Actions
+
Drone Actions
+
+
+
+
+
+
+
-
Relative Motion
-
Movement
-
Maneuver Score
-
Visibility
-
Sensor Mode
-
Target Type
-
Manual TN
-
Sensor TN
+
Relative Motion
+
Movement
+
Maneuver Score
+
Visibility
+
Sensor Mode
+
Target Type
+
Manual TN
+
Sensor TN
Recoil
@@ -3882,39 +3870,39 @@
-
Vehicle Weapons
+
Vehicle Weapons
-
-
Equip
-
General
-
Range
-
Fire Mode
-
Damage
-
Ammunition
-
Show
+
+
Equip
+
General
+
Range
+
Fire Mode
+
Damage
+
Ammunition
+
Show
-
Pri
-
Sec
-
Name
-
Type
-
Mount
-
Min
-
S
-
M
-
L
-
Ex
-
SS
-
SA
-
BF
-
FA
-
Power
-
Damage
-
Max
-
Remain
-
Manual
-
Sensor
-
More
+
+
+
Name
+
Type
+
Mount
+
Min
+
S
+
M
+
L
+
Ex
+
SS
+
SA
+
BF
+
FA
+
Power
+
Damage
+
Max
+
Remain
+
Manual
+
Sensor
+
More
@@ -3977,14 +3965,14 @@
@@ -3998,101 +3986,99 @@
-
Skill
-
+Dice
-
+TN
-
Recoil Comp
-
Gyro Stabalization
-
Targeting Assistance -
-
Reload Type -
-
Reloads
-
Ammo Type
-
Notes:
- - +
- + + + - + + + + - + + + + + +
- + + + + + + + + + + + + + + + - textarea name="attr_notes" style='width:150px;height:22px;'> +
Missles/Rockets
-
Name
-
Type
-
Mount
-
Min
-
S
-
M
-
L
-
Ex
-
Power
-
Damage
-
Intel.
-
Blast
-
Scatter
-
Qty.
-
Manual
-
Sensor
-
More
+
Name
+
Type
+
Mount
+
Min
+
S
+
M
+
L
+
Ex
+
Power
+
Damage
+
Intel.
+
Blast
+
Scatter
+
Qty.
+
Manual
+
Sensor
+
More
@@ -4102,14 +4088,14 @@
@@ -4127,31 +4113,31 @@
-
Skill
-
+Dice
-
+TN
-
Recoil Comp
-
Gyro Stabalization
-
Targeting Assistance
-
Range Finder
-
Notes:
- + +
- + + + - + + + +
@@ -4168,12 +4154,12 @@
-
Cyberware
+
Cyberware
-
Name
-
Rating
-
Essence
-
Description
+
Name
+
Rating
+
Essence
+
Description
@@ -4182,12 +4168,12 @@
-
Bioware
+
Bioware
-
Name
-
Rating
-
Bio Index
-
Description
+
Name
+
Rating
+
Bio Index
+
Description
@@ -4197,12 +4183,12 @@
-
Nanotech
+
Nanotech
-
Name
-
Rating
-
Essence
-
Description
+
Name
+
Rating
+
Essence
+
Description
@@ -4218,24 +4204,24 @@
-
Lifestyle
+
Lifestyle
-
Contacts
+
Contacts
-
Name
-
Contact Type
-
Notes Type
+
Name
+
Contact Type
+
Notes
@@ -4243,14 +4229,14 @@
-
Lifestyle Class/Gear at Home
+
Lifestyle Class/Gear at Home
-
Lifestyle
-
Cost
-
Months Paid
-
Address
-
Description
-
Edges/Flaws
+
Lifestyle
+
Cost
+
Months Paid
+
Address
+
Description
+
Edges/Flaws
@@ -4271,10 +4257,10 @@
-
Powers
+
Powers
-
Power
-
Description
+
Power
+
Description
@@ -4284,10 +4270,10 @@
-
Weakness
+
Weakness
-
Weakness
-
Description
+
Weakness
+
Description
@@ -4300,21 +4286,21 @@
@@ -7524,19 +7510,18 @@ on("change:speed-current change:speed-rating change:vehicle-penalty", function() }); on("change:sensor-los", function(){ + const sensorlosmods={ + direct: {sensor: -1, gunnery: -3 }, + interupted: {sensor: 0, gunnery: 0} + }; getAttrs(["sensor-los"], function (myval) { - var st=0; - switch (myval["sensor-los"]) { - case "direct": - var st=-2; - var gt=-3; - break; - case "interupted": - var st=0; - var gt=0; - break; - } - setAttrs({"sensor-test-los": st, "gunnery-test-los": gt}); + var sets={}; + const los=myval["sensor-los"].toLowerCase(); + console.log('los is: ' + los); + sets["sensor-test-los"]=sensorlosmods[los]["sensor"]; + sets["gunnery-test-los"]=sensorlosmods[los]["gunnery"]; + console.log(sets); + setAttrs(sets); }); }); @@ -7578,136 +7563,68 @@ on("change:speed-current change:speed-rating change:vehicle-penalty", function() on("sheet:opened change:vehicle-interface", function(){ getAttrs(["vehicle-interface"], function (myval) { - var react=0; - var init=0; - var action=0; - var dt=0; const vi=myval["vehicle-interface"]; - console.log(vi); + var sets={}; const interfaces={ - none: { react: 0, init: 0, action: 0, dt: 0}, - datajack: { react: 1, init: 0, action: 0, dt: 1 }, - vcr: { react: "(@{vehicle-driver}vcr} * 2)", init: "@{vehicle-driver}vcr}", action: "(@{vehicle-driver}vcr} * 2)", dt: "@{vehicle-driver}vcr}" } + none: { react: 0, init: 0, action: 0, driving: 0}, + datajack: { react: 1, init: 0, action: 0, driving: 1 }, + vcr: { react: "(@{vehicle-driver}vcr} * 2)", init: "@{vehicle-driver}vcr}", action: "(@{vehicle-driver}vcr} * 2)", driving: "@{vehicle-driver}vcr}" } }; console.log('interfaces test: ' + interfaces[vi]["react"]); - switch (myval["vehicle-interface"]) { - case "none": - var react=0; - var init=0; - var action=0; - var dt=0; - break; - case "datajack": - var react=1; - var init=0; - var dt=1; - break; - case "vcr": - var react="(@{vehicle-driver}vcr} * 2)"; - var init="@{vehicle-driver}vcr}"; - var action="(@{vehicle-driver}vcr} * 2)"; - var dt="@{vehicle-driver}vcr}"; - break; - } - setAttrs({"vehicle-reactbonus":react, "vehicle-initbonus":init, "vehicle-actionbonus":action, "driving-test-interface": dt}); + sets["vehicle-reactbonus"]=interfaces[vi]["react"] + sets["vehicle-initbonus"]=interfaces[vi]["init"]; + sets["vehicle-actionbonus"]=interfaces[vi]["action"]; + sets["driving-test-interface"]=interfaces[vi]["driving"]; + console.log(sets); + setAttrs(sets) }); }); on("sheet:opened change:weather", function(){ getAttrs(["weather"], function (myval) { - var dt=0; - var st=0; - switch (myval["weather"]) { - case "Bad": - var dt=2; - var st=1; - break; - case "Terrible": - var dt=4; - var st=1; - break; - case "Windy": - var dt=2; - break; - case "Snow": - var dt=2; - var st=1; - break; - case "Rain": - var dt=2; - var st=1; - break; - case "Fog": - var dt=2; - var st=1; - break; - case "Smog": - var dt=2; - var st=1; - break; - case "Heavy Wind": - var dt=4; - break; - case "ThunderStorm": - var dt=4; - var st=1; - break; - } - setAttrs({"driving-test-weather": dt, "sensor-test-weather": st}); + var sets={}; + const weather=myval["weather"].toLowerCase(); + const weathermod={ + normal: { driving:0, sensor:0}, + bad: { driving:2, sensor:1}, + terrible: { driving:4, sensor:1}, + windy: { driving:2, sensor:0}, + snow: { driving:2, sensor:1}, + rain: { driving:2, sensor:1}, + fog: { driving:2, sensor:1}, + smog: { driving:2, sensor:1}, + "heavy wind": { driving:4, sensor:0}, + "thunderstorm": { driving:4, sensor:1} + }; + sets["driving-test-weather"]=weathermod[weather]["driving"]; + sets["sensor-test-weather"]=weathermod[weather]["sensor"]; + console.log(sets); + setAttrs(sets); }); }); on("change:terrain", function(){ + sets={}; + const terrainmods={ + open: { driving: -1, sensor: 0, terrainpoints: 0, accelerate: -1, position: -1, ram: -1, hide: 4, relocate: -3, crash: -1, gunnery: 0}, + normal: { driving: 0, sensor: 0, terrainpoints: -2, accelerate: 0, position: 0, ram: 0, hide: 2, relocate: -1, crash: 0, gunnery: 0}, + restricted: { driving: 1, sensor: 0, terrainpoints: -4, accelerate: 1, position: 1, ram: 1, hide: 0, relocate: 0, crash: 2, gunnery: 2}, + tight: { driving: 3, sensor: 1, terrainpoints: -10, accelerate: 3, position: 3, ram: 2, hide: -2, relocate: 3, crash: 4, gunnery: 3} + }; getAttrs(["terrain"], function (myval) { - var [dt, st, tp, ab, pos, ram, hide, relo, crash]=[0,0,0,0,0,0,0,0,0]; - switch (myval["terrain"]) { - case "Open": - var dt=-1; - var tp=0; - var ab=-1; - var pos=-1; - var ram=-1; - var hide=4; - var relo=-3; - var crash=-1; - var mg=0; - break; - case "Normal": - var dt=0; - var tp=-2; - var ab=0; - var pos=0; - var ram=0; - var hide=2; - var relo=-1; - var crash=0; - var mg=0; - break; - case "Restricted": - var dt=1; - var tp=-4; - var ab=1; - var pos=1; - var ram=1; - var hide=0; - var relo=0; - var crash=2; - var mg=2; - break; - case "Tight": - var dt=3; - var st=1; - var tp=-10; - var ab=3; - var pos=3; - var ram=2; - var hide=-2; - var relo=3; - var crash=4; - var mg=3; - break; - } - setAttrs({"driving-test-terrain": dt, "sensor-test-terrain": st, "driving-ab-terrain": ab, "driving-position-terrain": pos, "driving-ram-terrain": ram, "driving-hide-terrain": hide, "driving-relocate-terrain": relo, "driving-crash-terrain": crash, "terrain-points": tp, "terrain-manual-gunnery": mg}); + const terrain=myval["terrain"].toLowerCase(); + sets["driving-test-terrain"]=terrainmods[terrain]["driving"]; + sets["sensor-test-terrain"]=terrainmods[terrain]["sensor"]; + sets["driving-ab-terrain"]=terrainmods[terrain]["accelerate"]; + sets["driving-position-terrain"]=terrainmods[terrain]["position"]; + sets["driving-ram-terrain"]=terrainmods[terrain]["ram"]; + sets["driving-hide-terrain"]=terrainmods[terrain]["hide"]; + sets["driving-relocate-terrain"]=terrainmods[terrain]["relocate"]; + sets["driving-crash-terrain"]=terrainmods[terrain]["crash"]; + sets["terrain-points"]=terrainmods[terrain]["terrainpoints"]; + sets["terrain-manual-gunnery"]=terrainmods[terrain]["gunnery"]; + console.log(sets); + setAttrs(sets); }); }); @@ -7751,10 +7668,8 @@ var setmatrixsystem = function (rating) { getAttrs(["first_time"], function(myval){ if (myval.first_time != "false") { console.log('running firstime'); - updatevisionmods("Human"); updateWoundPenalty(); updateStunPenalty(); - updateVisionTNs(); updatepools(); updatePenalty("vehicle"); updatePenalty("rccommand"); @@ -7795,27 +7710,39 @@ var setmatrixsystem = function (rating) { }); }); +const visionmods = { + elf: {normal: 0, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4}, + ork: {normal: 0, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4}, + troll: {normal: 0, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6}, + dwarf: {normal: 0, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6}, + human: {normal: 0, fulldark: 8, minlight: 6, partiallight: 2, glare: 2, mist: 2, lightsmoke: 4, fullsmoke: 6, thermalsmoke: 4}, + lowlight: {normal: 0, fulldark: 8, minlight: 4, partiallight: 1, glare: 4, mist: 2, lightsmoke: 4, fullsmoke: 6, thermalsmoke: 4}, + thermal: {normal: 0, fulldark: 4, minlight: 4, partiallight: 2, glare: 4, mist: 0, lightsmoke: 0, fullsmoke: 1, thermalsmoke: 8} +}; + + on("change:metatype change:visionenhancement change:visibility", function() { + getAttrs(["metatype", "visionenhancement", "visibility"], function(myval){ + sets={}; + const metatype=myval["metatype"].toLowerCase(); + const vision=myval["visionenhancement"].toLowerCase(); + const visattr=myval["visibility"]; + const visibility = (visattr == 0)? "normal" : visattr.match(/{(.*)}/)[1]; + const rangedvizmods=(vision != "none")? visionmods[vision][visibility] : visionmods[metatype][visibility]; + const meleevizmods=(rangedvizmods !=8 )? Math.floor(rangedvizmods/2) : 8; + sets["rangedvizTN"]=rangedvizmods; + sets["meleevizTN"]=meleevizmods; + console.log(sets); + setAttrs(sets); + }); + }); on("change:metatype", function(){ getAttrs(["metatype"], function(myval){ console.log(myval.metatype) - updatevisionmods(myval.metatype); setattributelimits(myval.metatype); }); }); - on("change:visionenhancement", function(){ - getAttrs(["metatype", "visionenhancement"], function(myval){ - console.log(myval.visionenhancement) - if (myval.visionenhancement == "None" ) { - var vision=(myval.metatype) - } else { - var vision=(myval.visionenhancement) - } - updatevisionmods(vision); - }); - }); - on("change:body change:body-mods", function(){ getAttrs([ "body","body-mods"], function(myval) { let final_body = parseInt(myval.body) + parseInt(myval["body-mods"]) @@ -8063,7 +7990,7 @@ on("change:dermal-armor change:repeating_armor:equipped change:repeating_armor:b }); -on("sheet:opened change:updateviztns change:cover change:move change:dualwield change:calledshot change:aim change:enemies change:friends change:meleetargets change:position change:misccombatmods change:stun_pen change:wound_pen change:manualgunneryTN", function() { +on("sheet:opened change:rangedvizTN change:meleevizTN change:cover change:move change:dualwield change:calledshot change:aim change:enemies change:friends change:meleetargets change:position change:misccombatmods change:stun_pen change:wound_pen change:manualgunneryTN", function() { updateRangeTNs(); updateMeleeTNs(); }); @@ -8084,10 +8011,6 @@ on("change:wounds change:adeptpainres", function() { updateWoundPenalty(); }); -on("change:visionprofile change:visibility", function() { - updateVisionTNs(); -}); - on("change:repeating_ic:ictype", function(eventinfo) { console.log(eventinfo); var mybase=eventinfo["sourceAttribute"].split("_"); @@ -8483,82 +8406,8 @@ var setattributelimits = function(metatype) { setAttrs(atts); }; -var updateVisionTNs = function() { - getAttrs(["visibility","fulldark", "minlight", "partiallight", "glare", "mist", "lightsmoke", "fullsmoke", "thermalsmoke", "updateviztns"], function(myval) { - switch (myval.visibility) { - case "0": - var myvisibilityRangeTn=0; - break; - case "@{fulldark}": - var myvisibilityRangeTn=parseInt(myval.fulldark); - break; - case "@{partiallight}": - var myvisibilityRangeTn=parseInt(myval.partiallight); - break; - case "@{minlight}": - var myvisibilityRangeTn=parseInt(myval.minlight); - break; - case "@{glare}": - var myvisibilityRangeTn=parseInt(myval.glare); - break; - case "@{mist}": - var myvisibilityRangeTn=parseInt(myval.mist); - break; - case "@{lightsmoke}": - var myvisibilityRangeTn=parseInt(myval.lightsmoke); - break; - case "@{fullsmoke}": - var myvisibilityRangeTn=parseInt(myval.fullsmoke); - break; - case "@{thermalsmoke}": - var myvisibilityRangeTn=parseInt(myval.thermalsmoke); - break; - } - if ( myvisibilityRangeTn == 8) { - var myvisibilityMeleeTn = 8 - } else { - var myvisibilityMeleeTn = Math.floor(myvisibilityRangeTn / 2) - } - if ( myval.updateviztns == "flip" ) { - var updateflag = "flop" - } else { - var updateflag = "flip" - } - console.log(myvisibilityRangeTn) - console.log(myvisibilityMeleeTn) - setAttrs({updateviztns:updateflag, rangedvizTN: myvisibilityRangeTn, meleevizTN: myvisibilityMeleeTn}); - }); -}; - -var updatevisionmods = function(myval) { - console.log ('updating vision') - console.log(myval) - if ( (myval) == "Elf" ) { - console.log("Setting Elf") - setAttrs({visionprofile: myval, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4}); - } else if ( (myval) == "Ork" ) { - console.log("Setting Ork") - setAttrs({visionprofile: myval, fulldark: 8, minlight: 2, partiallight: 0, glare: 2, mist: 0, lightsmoke: 2, fullsmoke: 4, thermalsmoke: 4}); - } else if ( (myval) == "Dwarf" ) { - console.log("Setting Dwarf") - setAttrs({visionprofile: myval, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6}); - } else if ( (myval) == "Troll" ) { - console.log("Setting Troll") - setAttrs({visionprofile: myval, fulldark: 2, minlight: 2, partiallight: 1, glare: 2, mist: 0, lightsmoke: 0, fullsmoke: 0, thermalsmoke: 6}); - } else if ((myval) == "Human" ) { - console.log("Setting Human") - setAttrs({visionprofile: myval, fulldark: 8, minlight: 6, partiallight: 2, glare: 2, mist: 2, lightsmoke: 4, fullsmoke: 6, thermalsmoke: 4}); - } else if ( (myval) == "LowLight" ) { - console.log("Setting LowLight") - setAttrs({visionprofile: myval, fulldark: 8, minlight: 4, partiallight: 1, glare: 4, mist: 2, lightsmoke: 4, fullsmoke: 6, thermalsmoke: 4}); - } else if ( (myval) == "Thermal" ) { - console.log("Setting Thermal") - setAttrs({visionprofile: myval, fulldark: 4, minlight: 4, partiallight: 2, glare: 4, mist: 0, lightsmoke: 0, fullsmoke: 1, thermalsmoke: 8}); - } -}; - var updateMeleeTNs = function() { - getAttrs(["rangedvizTN", "meleevizTN", "cover", "move", "dualwield", "calledshot", "aim", "enemies", "friends", "meleetargets", "position", "misccombatmods", "stun_pen","wound_pen"], function(myval) { + getAttrs(["meleevizTN", "cover", "move", "dualwield", "calledshot", "aim", "enemies", "friends", "meleetargets", "position", "misccombatmods", "stun_pen","wound_pen"], function(myval) { console.log("updateMeleeTN") targetNumberMelee = parseInt(myval.calledshot) + parseInt(myval.meleevizTN) + parseInt(myval.enemies) - parseInt(myval.friends) + parseInt(myval.misccombatmods) + ( 2 * parseInt(myval.meleetargets) ) - parseInt(myval.position) + parseInt(myval.stun_pen) + parseInt(myval.wound_pen); console.log(targetNumberMelee) @@ -8568,28 +8417,26 @@ var updateMeleeTNs = function() { var updateRangeTNs = function() { - getAttrs(["rangedvizTN", "meleevizTN", "cover", "move", "dualwield", "calledshot", "aim", "enemies", "friends", "meleetargets", "position", "misccombatmods", "stun_pen","wound_pen", "manualgunneryTN" ], function(myval) { - console.log("updateRangeTN") - targetNumberRange = parseInt(myval.calledshot) + parseInt(myval.rangedvizTN) + parseInt(myval.cover) + parseInt(myval.dualwield) + (2 * parseInt(myval.enemies)) - parseInt(myval.aim) + parseInt(myval.misccombatmods) + parseInt(myval.stun_pen) + parseInt(myval.wound_pen) + parseInt(myval.manualgunneryTN); - switch (parseInt(myval.move)) { - case 0: - var mytargetMove=-1; - break; - case 1: - var mytargetMove=0; - break; - case 2: - var mytargetMove=0; - break; - case 4: - var mytargetMove=2; - break; - case 6: - var mytargetMove=2; - break; - } - console.log(targetNumberRange) - setAttrs({rangedTN: targetNumberRange, targetMove:mytargetMove }); + getAttrs(["rangedvizTN", "cover", "move", "dualwield", "calledshot", "aim", "enemies", "friends", "meleetargets", "position", "misccombatmods", "stun_pen","wound_pen", "manualgunneryTN" ], function(myval) { + var sets={}; + console.log('updating ranged tn'); + const move=parseInt(myval.move); + const called=parseInt(myval.calledshot); + const viz=parseInt(myval.rangedvizTN); + const cover=parseInt(myval.cover); + const dual=parseInt(myval.dualwield); + const enemies=parseInt(myval.enemies); + const aim=parseInt(myval.aim); + const misc=parseInt(myval.misccombatmods); + const stun=parseInt(myval.stun_pen); + const wound=parseInt(myval.wound_pen); + const gunnery=parseInt(myval.manualgunneryTN); + targetNumberRange = called + viz + cover + dual + (2 * enemies) - aim + misc + stun + wound + gunnery; + mytargetMove = (move == 0)? -1 : (move ==4)? 2: (move ==6)? 2: 0; + sets["rangedTN"]=targetNumberRange; + sets["targetMove"]=mytargetMove; + console.log(sets); + setAttrs(sets); }); }; diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index 453b130a2e..38b10fc620 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -7,7 +7,7 @@ "critter": "Critter", "spirit": "Spirit", "drone": "Drone", - "vehicle": "Vehicle", + "vehicle": "Vehicle:", "matrix": "Matrix", "frame": "Frame", "import": "Import", @@ -48,13 +48,13 @@ "force": "Force", "attributes": "Attributes", "skills": "Skills", - "magic": "Magic", + "magic": "Magic:", "adept": "Adept", "decking": "Decking", "gear": "Gear", "rigger": "Rigger", "combat": "Combat", - "cyberware": "cyberware", + "cyberware": "Cyberware", "contacts-lifesytle": "Contacts/Lifestyle", "karma": "Karma", "powers": "Powers", @@ -75,7 +75,7 @@ "combat-pool": " Combat Pool:", "spell-pool": "Spell Pool", "hacking-pool": "Hacking Pool:", - "control-pool": " Control Pool:", + "control-pool": "Control Pool:", "astral-pool": " Astral Pool:", "task-pool": " Task Pool:", "physical-damage-overflow": "Physical Damage Overflow:", @@ -83,7 +83,7 @@ "initiative-augmented": "Init. Aug.", "initiative-physical": "Init. Phy.", "initiative-astral": "Init. Astr. ", - "end-turn": "End Turn", + "end-turn": "End Turn:", "body-abbreviation": "B:", "quickness-abbreviation": "Q:", "strength-abbreviation": "S:", @@ -110,7 +110,7 @@ "melee-foes": "Melee Foes", "melee-friends": "Melee Friends", "targets": "Targets", - "position": "Posistion", + "position": "Position", "miscellaneous-modifiers": "Misc Modifiers", "normal": "Normal", "full-dark": "Full Dark", @@ -121,16 +121,16 @@ "light-smoke-rain": "Light Smoke/Rain", "heavy-smoke-rain": "Heavy Smoke/Rain", "thermal-smoke": "Thermal Smoke", + "none": "None", "low-light": "LowLight", "thermal": "Thermal", "partial": "Partial", "blind-fire": "Blind Fire", - "not-moving": "not moving", + "not-moving": "Not Moving", "walk": "walk", "walk-difficult-ground": "walk (difficult ground)", "run": "run", "run-difficult-ground": "run (difficult ground)", - "none": "None", "superior-position": "Superior Position", "target-prone": "Target Prone", "relative-motion": "Relative Motion", @@ -151,7 +151,7 @@ "mounted": "mounted", "restricted": "Restricted", "tight": "Tight", - "combat-zone": "Combat Zone", + "combat-zone": "Combat Zone:", "metahuman-sized": "Metahuman sized", "small-critter": "Small critter", "large-critter": "Large critter", @@ -168,13 +168,13 @@ "commerical-airliner": "Commerical Airliner", "helicopter": "Helicopter", "zepplin-blimp": "Zepplin/Blimp", - "lav": "LAV", + "lav": "LAV/T-bird", "military-ground-vehicle": "Military Ground Vehicle", "attribute": "Attribute", "base": "Base", "mods": "Mods", "final": "Final", - "body": "body", + "body": "Body:", "body-test-natural": "Body Test without augmentation", "body-test-aug": "Body Test with augmentation", "quickness": "Quickness", @@ -203,7 +203,7 @@ "reaction-init-speed": "Reaction, Init & Speed", "natural": "Natural", "reaction": "Reaction:", - "initiative": "Initiative", + "initiative": "Initiative:", "astral": "Astral", "walking-rate": "Walking Rate:", "meters-per-combat-turn": "meters per combat turn", @@ -212,7 +212,7 @@ "calculated": "Calculated", "spell": "Spell", "hacking": "Hacking", - "control": "Control", + "control": " Control", "task": "Task", "karma-pool": "Karma Pool:", "good-karma": "Good Karma:", @@ -238,6 +238,8 @@ "spells-sustained": "Spells Sustained:", "resist-banish": "Resist Banish: ", "astral-space": "Astral Space", + "show": "Show", + "hide": "Hide", "astral-perception": "Astral Perception", "astral-projection": "Astral Projection", "astral-reaction": "Astral Reaction:", @@ -339,12 +341,13 @@ "skill": "Skill", "conceal": "Conceal", "damage": "Damage", + "plus-dice-abbreviation": "+Dice", + "plus-target-number-abberviation": "+TN", "attack": "Attack", "edged": "Edged", "club": "Club", "pole-arm": "Pole Arm", "whip": "Whip", - "medium-damage-abbreviation": "M", "initiation-and-metamagic": "Initiation and Metamagic", "initiate-grade": "Initiate Grade:", "metamagic": "Metamagic", @@ -375,11 +378,11 @@ "intruder": "Intruder", "legitimate": "Legitimate", "unknown": "Unknown", - "blue": "Blue", - "green": "Green", - "orange": "Orange", - "red": "Red", - "pilot-rating": "Pilot Rating", + "blue": "BLUE", + "green": "GREEN", + "orange": "ORANGE", + "red": "RED", + "pilot-rating": "Pilot Rating:", "utility-payload": "Utility Payload", "sensor": "Sensor", "evade": "Evade", @@ -392,7 +395,7 @@ "bod": "Bod", "evasion": "Evasion", "masking": "Masking", - "sensors": "Karma", + "sensors": "Sensors:", "detection-factor-abbreviation": "Detect.F", "jack-in": "Jack In", "memory-in-use": "Memory In Use:", @@ -415,7 +418,7 @@ "smart-frame": "Smart Frame", "agent": "Agent", "core-rating": "Core Rating", - "pilot": "Pilot", + "pilot": "Pilot:", "utilities": "Utilities", "utility-rating-sum": "Utility Rating Sum", "special-utilities": "Special Utilities", @@ -430,23 +433,23 @@ "track": "Track", "defensive-utilities": "Defensive Utilities", "multiplier": "Multiplier", - "armor": "Armor", + "armor": "Armor:", "cloak": "Cloak", "lock-on": "Lock-On", "offensive-utilities": "Offensive Utilities", "execute": "Execute", "attack-light-damage-abbreviation": "Attack (L)", - "attack-medium-damage-abbreviation": "Attack (M)", + "attack-moderate-damage-abbreviation": "Attack (M)", "attack-serious-damage-abbreviation": "Attack (S)", "attack-deadly-damage-abbreviation": "Attack (D)", "black-hammer": "Black Hammer", "killjoy": "Killjoy", "slow": "Slow", "additional-utilities": "Additional Utilities", - "access": "access", - "index": "index", - "files": "files", - "slave": "slave", + "access": " Acesss", + "index": " Index", + "files": " Files", + "slave": " Slave", "karma-total": "Karma Total:", "attribute-skill-spell-etc": "Attribute/Skill/Spell/etc.", "ammount-of-karma": "Ammount of Karma", @@ -490,8 +493,8 @@ "remote-operation": "Remote Operation", "bike": "Bike:", "car": "Car:", - "hovercraft": "Hovercraft:", - "lighter-than-air-aircraft-abbreviated": "LTA Aircraft:", + "hovercraft": "Hovercraft", + "lighter-than-air-aircraft-abbreviated": "LAV", "motorboat": "Motorboat:", "rotor-aircraft": "Rotor Aircraft:", "sailboat": "Sailboat:", @@ -500,8 +503,8 @@ "vectored-thrust": "Vectored Thrust:", "winged-aircraft": "Winged Aircraft:", "mechanical-arm": "Mechanical Arm:", - "semiballistic": "Semiballistic:", - "suborbital": "Suborbital:", + "semiballistic": "Semiballistic", + "suborbital": "HSCT/Suborbital", "tracks": "Tracks:", "walkers": "Walkers:", "combat-skills": "Combat Skills", @@ -515,7 +518,7 @@ "throwing": "Throwing:", "clubs": "Clubs:", "cyber-implant": "Cyber Implant", - "gunnery": "Gunnery:", + "gunnery": "Gunnery", "heavy-weapons": "Heavy Weapons:", "lasers": "Lasers:", "launchers": "Launchers:", @@ -543,7 +546,6 @@ "general": "General", "fire-mode": "Fire Mode", "ammunition": "Ammunition", - "show": "Show", "primary-abbreviation": "Pri", "secondary-abbreviation": "Sec", "minimum-abbreviation": "Min", @@ -592,13 +594,10 @@ "gyrojet-land": "Gyrojet (land)", "gyrojet-water": "Gyrojet (water)", "flamethrower": "Flamethrower", - "attack-moderate-damage-abbreviation": "Attack (M)", - "plus-dice-abbreviation": "+Dice", - "plus-target-number-abberviation": "+TN", "recoil-compensation-abbreviation": "Recoil Comp", "gyro-stabalization": "Gyro Stabalization", "targeting-assistance": "Targeting Assistance", - "reload-type": "Reload Type", + "reload-type": "Reload Type ", "reloads": "Reloads", "ammo-type": "Ammo Type", "pistol": "Pistol", @@ -632,8 +631,6 @@ "mercury": "Mercury", "tracker": "Tracker", "melee-weapons": "Melee Weapons", - "plus-dice-abberviation": "+Dice", - "jjjjj": "Notes", "explosives": "Explosives", "blast": "Blast", "scatter": "Scatter", @@ -653,17 +650,200 @@ "throw": "Throw", "launcher": "Launcher", "demolition": "Demolition", - "hide": "Hide", + "quickness-penalty": "Quickness Penalty:", + "combat-pool-penalty": "Combat Pool Penalty:", + "dermal-armor": "Dermal Armor:", "slot": "Slot", "ballistic-rating": "Ballistic Rating", "impact-rating": "Impact Rating", "helmet": "helmet", "shield": "shield", - "bioware": "bioware", + "bioware": "Bioware", "nanoware": "nanoware", "gyro-harness": "gyro harness", "damage-modifier": "Damage Modifier", - "quickness-penalty": "Quickness Penalty:", - "combat-pool-penalty": "Combat Pool Penalty:", - "dermal-armor": "Dermal Armor:" + "grid": "Grid", + "security-code": "Security Code", + "security-value": " Security Value", + "host": "Host", + "virtual-machine-abbreviation": "VM", + "detection-roll": "Detection Roll", + "security-tally": "Security Tally", + "alert-status": "Alert Status", + "passive": "Passive", + "active": "Active", + "trigger-step": "Trigger Step", + "event": "Event", + "rest-tally": "Reset Tally", + "select-token": "Select Token", + "intrusion-countermeasures": "Intrusion Countermeasures", + "test-target": "Test Target", + "crippler": "Crippler", + "killer": "Killer", + "probe": "Probe", + "scramble": "Scramble", + "tar-baby": "Tar Baby", + "blaser": "Blaster", + "ripper": "Ripper", + "sparky": "Sparky", + "tar-pi": "Tar pit", + "black-ic": "Black Ic", + "data-bomb": "Data Bomb", + "pavlov": "Pavlov", + "scout": "Scout", + "trace": "Trace", + "cerebropathic": "Cerebropathic", + "psychotropic": "Psychotropic", + "detection-factor": "DetectionFactor", + "computer-skill": "Computer Skill", + "utility-target-number-abbreviation": "Utility TN", + "mpcp": "MPCP", + "rapid-settings-system-rating": "Rapid Settings System Rating", + "apply": "Apply", + "vehicle-attributes": "Vehicle Attributes", + "drone-attributes": "Drone Attributes", + "handling": "Handling:", + "speed": "Speed:", + "acceleration": "Acceleration:", + "signature": "Signature:", + "autonav": "Autonav:", + "firmpoints": "Firmpoints:", + "hardpoint": "Hardpoint", + "seating": "Seating:", + "entry-points": "Entry Points:", + "fuel": "Fuel:", + "economy": "Economy:", + "cargo": "Cargo:", + "load": "Load:", + "vehicle-skill": "Vehicle Skill:", + "ivis-pool": "IVIS Pool;", + "stress": "Stress:", + "setup-breakdown": "Setup/Breakdown:", + "total-cost": "Total Cost:", + "rapid-attributes-set": "Rapid Attribute Set:", + "vehicle-notes": "Vehicle Notes", + "drone-notes": "Drone Notes", + "modification-notes": "Modification Notes", + "vehicle-electronics-and-ecm-eccm": "Vehicle Electornics and ECM/ECCM", + "drone-electronics-and-ecm-eccm": "Drone Electornics and ECM/ECCM", + "vehicle-flux-rating": "Vehicle Flux Rating", + "drone-flux-rating": "Drone Flux Rating", + "vehicle-flux-used": "Vehicle Flux Used", + "drone-flux-used": "Drone Flux Used", + "max-flux": "Max Flux", + "roll-test": "Roll Test", + "opposition-test": "Opposition Test", + "sonar": "Sonar:", + "ECM": "ECM:", + "ED": "ED:", + "ECD": "ECD:", + "handling-abbreviation": "Hand", + "accleration-abbreviation": "Accel:", + "signature-abbreviation": "Sig:", + "auto-pilot-rating-abbreviation": "Auto:", + "vehicle-actions": "Vehicle Actions", + "drone-actions": "Drone Actions", + "accelerate": "Accelerate", + "brake": "Brake", + "ram": "Ram", + "relocate": "Relocate", + "crash": "Crash", + "sensor-mode": "Sensor Mode", + "manual-target-nubmber-abbreviation": "Manual TN", + "sensor-target-nubmber-abbreviation": "Sensor TN", + "about-equal": "About Equal", + "up-to-2x": "Up to 2X", + "up-to-3x": "Up to 3X", + "more-than-3x": "More than 3X", + "attacker-greater-by-10": "Attacker Greaty by 10", + "target-greater-by-10": "Target Greater by 10", + "full-dark ": "Full Dark", + "motorcycle": "Motorcyle", + "limo-light-truck": "Limo/Light Truck", + "commercial-airliner": "Commerical Airliner", + "vehicle-weapons": "Vehicle Weapons", + "mount": "Mount", + "firmpoint": "Firmpoint", + "turret": "Turret", + "bio-index": "Bio Index", + "nanotech": "Nanotech", + "lifestyle": "Lifestyle", + "contacts": "Contacts", + "contact-type": "Contact Type", + "contact": "Contact", + "buddy": "Buddy", + "friend-for-life": "Friend for Life", + "followers": "Followers", + "lifesytle-class-gear-at-home": "Lifestyle Class/Gear at Home", + "months-paid": "Months Paid", + "address": "Address", + "edges-flaws": "Edges/Flaws", + "weakness": "Weakness", + "json-import": "JSON Import", + "json-export": "JSON Export", + "vehicle-combat": "Vehicle Combat", + "ecm-flux": "ECM/FLUX", + "drone-combat": "Drone Combat", + "interface": "Interface", + "datajack": "Datajack", + "VCR": "VCR", + "current": "Current", + "maximum": "Maximum", + "maneuever": "Maneuever", + "generate": "Generate", + "compare": "Compare", + "off-road": "Off Road:", + "open": "Open", + "urban-setting": "Urban Setting:", + "weather": "Weather", + "bad": "Bad", + "terrible": "Terrible", + "fog": "Fog", + "smog": "Smog", + "rain": "Rain", + "snow": "Snow", + "thunderstorm": "ThunderStorm", + "windy": "Windy", + "heavy-wind": "Heavy Wind", + "sensor-los": "Sensor LOS", + "sensor-test": "Sensor Test", + "destroyed": "Destroyed", + "rc-signal": "RC Signal", + "full-strength": "Full Strength", + "light-degredation": "Light Degredation", + "moderate-degredation": "Moderate Degredation", + "serious-degredation": "Serious Degredation", + "disengaged": "Disengaged", + "command-channel": "Command Channel", + "simsense-channel": "Simsense Channel", + "system-channel": "System Channel", + "driver": "Driver", + "maimum-abbreviation": "Max", + "operative-mode": "Operative Mode:", + "primary": "Primary:", + "secondary": "Secondary:", + "vehicle-configuration": "Vehicle Configuration", + "drone-configuration": "Drone Configuration", + "manual-control": "Manual Control", + "datajack-port": "Datajack Port", + "rigger-adaption": "Rigger Adaption", + "remote-control": "Remote Control", + "vehicle-type": "Vehicle Type ", + "vehicle-size": "Vehicle Size ", + "car-pickup-truck": "Car/Pickup Truck", + "fighter-jet": "Fighter Jet", + "heavy-truck": "Heavy Truck", + "large-airplane": "Large Airplane", + "limousine": "Limousine/Light Truck/Van", + "lighter-than-air": "LTA/Zeppelin", + "racing-boat": "Racing Boat", + "small-airplane": "Small Airplane", + "small-boat": "Small Motorboat", + "sports-car": "Sports Car", + "tracked-vehicle": "Tracked Vehicle", + "tractor-trailer": "Tractor Trailer", + "train": "Train/Monorail", + "ultralight": "Ultra-light Aircraft", + "large": "Large", + "extra-large": "Extra-Large" } \ No newline at end of file From 9b01a6174aed39c07bd1ee442335b6fbcb66b591 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Sun, 19 Sep 2021 21:50:50 -0400 Subject: [PATCH 28/49] moving conjuring out to its own roll template to better interact with API script --- Shadowrun3e/shadowrun3e.css | 160 +++++++++++++++------- Shadowrun3e/shadowrun3e.html | 253 +++++++++++++++++++++++------------ 2 files changed, 280 insertions(+), 133 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index 26448b2593..ee25b2c34d 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -521,6 +521,76 @@ input:checked+.slider:before { color: black; } +.magic-tabs { + display: grid; + grid-template-columns: auto auto auto auto auto auto auto auto auto; +} + +.magic-tabs-spells, +.magic-tabs-totem, +.magic-tabs-initiate, +.magic-tabs-skills, +.magic-tabs-foci, +.magic-tabs-adept, +.magic-tabs-geas, +.magic-tabs-conjuring, +.magic-tabs-astral { + display: grid; + background-color: white; + border-bottom: 3px solid black; + text-align: center; + align-items: center; + border-top-right-radius: 10px; + border-top-left-radius: 10px; +} + +.magic-tabs-switch[value="spells"]~button.magic-tabs-spells , +.magic-tabs-switch[value="totem"]~button.magic-tabs-totem, +.magic-tabs-switch[value="initiate"]~button.magic-tabs-initiate, +.magic-tabs-switch[value="skills"]~button.magic-tabs-skills, +.magic-tabs-switch[value="foci"]~button.magic-tabs-foci, +.magic-tabs-switch[value="adept"]~button.magic-tabs-adept, +.magic-tabs-switch[value="geas"]~button.magic-tabs-geas, +.magic-tabs-switch[value="conjuring"]~button.magic-tabs-conjuring, +.magic-tabs-switch[value="astral"]~button.magic-tabs-astral { + background-color: rgba(192,192,192,.9); + font-weight: bold; + border-top: 3px solid black; + border-left: 3px solid black; + border-right: 3px solid black; + border-bottom: unset; +} +.sorcery-skills, +.spells-section, +.fetish-foci, +.totem, +.geas, +.adept-powers, +.conjuring, +.magicinitiate, +.astralattributes { + display: none; +} + +.magic-tabs-switch[value="spells"]~div.spells-section, +.magic-tabs-switch[value="totem"]~div.totem, +.magic-tabs-switch[value="initiate"]~div.magicinitiate, +.magic-tabs-switch[value="skills"]~div.sorcery-skills, +.magic-tabs-switch[value="foci"]~div.fetish-foci, +.magic-tabs-switch[value="adept"]~div.adept-powers, +.magic-tabs-switch[value="geas"]~div.geas, +.magic-tabs-switch[value="conjuring"]~div.conjuring, +.magic-tabs-switch[value="astral"]~div.astralattributes { + display: block; + border-bottom: 3px solid black; + border-left: 3px solid black; + border-right: 3px solid black; + background-color: rgba(192,192,192,.9); + border-bottom-left-radius: 10px; + border-bottom-right-radius: 10px; +} + + .sheet-tabstoggle[value="magic"]+.charsheet { background-image: url("https://raw.githubusercontent.com/bahornbeck/img/master/images/nebula2.jpg"); } @@ -783,6 +853,7 @@ min-width: 0; grid-template-columns: 73px 1fr; } +.sheet-rolltemplate-conjure div.sheet-conjure-resist-table, .sheet-rolltemplate-spell div.sheet-spell-resist-table, .sheet-rolltemplate-resistance div.sheet-spell-resist-table { display: grid; @@ -929,6 +1000,7 @@ min-width: 0; .sheet-rolltemplate-vehicle div.sheet-rtcontainer, .sheet-rolltemplate-matrix div.sheet-rtcontainer, .sheet-rolltemplate-spell div.sheet-rtcontainer, +.sheet-rolltemplate-conjure div.sheet-rtcontainer, .sheet-rolltemplate-init div.sheet-rtcontainer, .sheet-rolltemplate-attribute div.sheet-rtcontainer, .sheet-rolltemplate-explosive div.sheet-rtcontainer, @@ -950,6 +1022,8 @@ min-width: 0; color: white; } + +.sheet-rolltemplate-conjure div.sheet-rtheader, .sheet-rolltemplate-spell div.sheet-rtheader { border-bottom: 3px solid black; background-color: olivedrab; @@ -1003,12 +1077,14 @@ min-width: 0; color: black; } +.sheet-rolltemplate-spell div.sheet-conjure-resist-table:nth-child(odd), .sheet-rolltemplate-spell div.sheet-spell-resist-table:nth-child(odd), .sheet-rolltemplate-info div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-item div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-vehicle div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-matrix div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-spell div.sheet-rtrow:nth-child(odd), +.sheet-rolltemplate-conjure div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-init div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-attribute div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-explosive div.sheet-rtrow:nth-child(odd), @@ -1025,6 +1101,7 @@ min-width: 0; font-size: 10px; } +.sheet-rolltemplate-spell div.sheet-conjure-resist-table:nth-child(even), .sheet-rolltemplate-spell div.sheet-spell-resist-table:nth-child(even), .sheet-rolltemplate-item div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-info div.sheet-rtrow:nth-child(even), @@ -1038,6 +1115,7 @@ min-width: 0; .sheet-rolltemplate-attack div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-aoe div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-melee div.sheet-rtrow:nth-child(even), +.sheet-rolltemplate-conjure div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-resistance div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-spell div.sheet-rtrow:nth-child(even) { background-color: lightgrey; @@ -1053,6 +1131,7 @@ min-width: 0; .sheet-rolltemplate-adept .sheet-numberspan, .sheet-rolltemplate-spell .sheet-numberspan, .sheet-rolltemplate-melee .sheet-numberspan, +.sheet-rolltemplate-conjure .sheet-numberspan, .sheet-rolltemplate-aoe .sheet-numberspan, .sheet-rolltemplate-resistance .sheet-numberspan, .sheet-rolltemplate-attack .sheet-numberspan{ @@ -1076,6 +1155,7 @@ min-width: 0; .sheet-rolltemplate-attack .inlinerollresult, .sheet-rolltemplate-aoe .inlinerollresult, .sheet-rolltemplate-melee .inlinerollresult, +.sheet-rolltemplate-conjure .inlinerollresult, .sheet-rolltemplate-resistance .inlinerollresult, .sheet-rolltemplate-spell .inlinerollresult { display: inline-block; @@ -1097,6 +1177,7 @@ min-width: 0; .sheet-rolltemplate-attack .inlinerollresult.fullcrit, .sheet-rolltemplate-aoe .inlinerollresult.fullcrit, .sheet-rolltemplate-melee .inlinerollresult.fullcrit, +.sheet-rolltemplate-conjure .inlinerollresult.fullcrit, .sheet-rolltemplate-resistance .inlinerollresult.fullcrit, .sheet-rolltemplate-spell .inlinerollresult.fullcrit { border: 2px solid #3FB315; @@ -1114,6 +1195,7 @@ min-width: 0; .sheet-rolltemplate-attack .inlinerollresult.fullfail, .sheet-rolltemplate-aoe .inlinerollresult.fullfail, .sheet-rolltemplate-melee .inlinerollresult.fullfail, +.sheet-rolltemplate-conjure .inlinerollresult.fullfail, .sheet-rolltemplate-resistance .inlinerollresult.fullfail, .sheet-rolltemplate-spell .inlinerollresult.fullfail { border: 2px solid #B31515; @@ -1131,6 +1213,7 @@ min-width: 0; .sheet-rolltemplate-attack .inlinerollresult.importantroll, .sheet-rolltemplate-aoe .inlinerollresult.importantroll, .sheet-rolltemplate-melee .inlinerollresult.importantroll, +.sheet-rolltemplate-conjure .inlinerollresult.importantroll, .sheet-rolltemplate-resistance .inlinerollresult.importantroll, .sheet-rolltemplate-spell .inlinerollresult.importantroll { border: 2px solid #4A57ED; @@ -1339,13 +1422,6 @@ input[type="checkbox"].hidden-checkbox { border-radius: 5px; } -.astralattributes { - border: 1px solid #fff; - padding: 3px; - background-color: rgba(192,192,192,.9); - border-radius: 5px; -} - .astralspace { display: grid; vertical-align: middle; @@ -1367,7 +1443,10 @@ input[type="checkbox"].hidden-checkbox { display: grid; grid-template-columns: 220px 220px; } - +.conjuring-table { + display: grid; + grid-template-columns: 120px 120px 120px 120px 120px 100px 100px 1fr; +} .totem-table { display: grid; @@ -1558,6 +1637,12 @@ melee-table-row input[type="textarea"], border-top-right-radius: 10px; border-top-left-radius: 10px; } +.table-top-left-nc { + border: 2px solid #fff; + text-align: center; + vertical-align: middle; + border-top-left-radius: 10px; +} .table-top-left { background-color: rgba(192,192,192,.9); @@ -1566,7 +1651,13 @@ melee-table-row input[type="textarea"], vertical-align: middle; border-top-left-radius: 10px; } - +.table-top-left-w { + background-color: white; + border: 2px solid black; + text-align: center; + vertical-align: middle; + border-top-left-radius: 10px; +} .table-top-right { background-color: rgba(192,192,192,.9); border-top: 2px solid #fff; @@ -1577,6 +1668,16 @@ melee-table-row input[type="textarea"], border-top-right-radius: 10px; } +.table-top-right-w { + background-color: white; + border-top: 2px solid black; + border-bottom: 2px solid black; + border-right: 2px solid black; + text-align: center; + vertical-align: middle; + border-top-right-radius: 10px; +} + .table-top-mid{ background-color: rgba(192,192,192,.9); border-right: 2px solid #fff; @@ -2465,21 +2566,6 @@ input.enable-fa:not(:checked)~span.show_fa_dice { .vehicle-skills-hide, .rc-deck-show, .rc-deck-hide, -.foci-show, -.foci-hide, -.totem-show, -.totem-hide, -.magicinitiate-show, -.magicinitiate-hide, -.geas-show, -.geas-hide, -.adeptpowers-show, -.adeptpowers-hide, -.spells-show, -.spells-hide, -.astralattributes-show, -.astralattributes-hide, -.sorceryskills-show, .sorceryskills-hide { display: none; } @@ -2522,23 +2608,7 @@ input.enable-fa:not(:checked)~span.show_fa_dice { .securitysheaf-switch[value="show"]~div.securitysheaf-hide, .securitysheaf-switch[value="hide"]~div.securitysheaf-show, .deck-skills-switch[value="show"]~div.deck-skills-hide, -.deck-skills-switch[value="hide"]~div.deck-skills-show, -.totem-switch[value="show"]~div.totem-hide, -.totem-switch[value="hide"]~div.totem-show, -.geas-switch[value="show"]~div.geas-hide, -.geas-switch[value="hide"]~div.geas-show, -.magicinitiate-switch[value="show"]~div.magicinitiate-hide, -.magicinitiate-switch[value="hide"]~div.magicinitiate-show, -.foci-switch[value="show"]~div.foci-hide, -.foci-switch[value="hide"]~div.foci-show, -.spells-switch[value="show"]~div.spells-hide, -.spells-switch[value="hide"]~div.spells-show, -.adeptpowers-switch[value="show"]~div.adeptpowers-hide, -.adeptpowers-switch[value="hide"]~div.adeptpowers-show, -.sorceryskills-switch[value="show"]~div.sorceryskills-hide, -.sorceryskills-switch[value="hide"]~div.sorceryskills-show, -.astralattributes-switch[value="show"]~div.astralattributes-hide, -.astralattributes-switch[value="hide"]~div.astralattributes-show { +.deck-skills-switch[value="hide"]~div.deck-skills-show { display: grid; grid-template-columns: auto 60px 1fr; } @@ -2558,14 +2628,6 @@ input.enable-fa:not(:checked)~span.show_fa_dice { .deck-cyberdeck-switch[value="hide"]~div.deck-cyberdeck, .securitysheaf-switch[value="hide"]~div.securitysheaf, .combatskills-switch[value="hide"]~div.combat-skills, -.sorceryskills-switch[value="hide"]~div.sorcery-skills, -.spells-switch[value="hide"]~div.spells-section, -.astralattributes-switch[value="hide"]~div.astralattributes, -.totem-switch[value="hide"]~div.totem, -.geas-switch[value="hide"]~div.geas, -.foci-switch[value="hide"]~div.fetish-foci, -.magicinitiate-switch[value="hide"]~div.magicinitiate, -.adeptpowers-switch[value="hide"]~div.adept-powers, .rc-deck-switch[value="hide"]~div.rc-deck, .vehicle-skills-switch[value="hide"]~div.vehicle-skills { display: none; diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 00b403a9fc..28695a20fb 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -37,7 +37,7 @@
Spirit Type:
- @@ -863,16 +863,25 @@
Resist Banish:
-
-
Astral Space
- -
-
-
Astral Space
- +
+ + + + + + +
+ +
+ + + +
+
+
Astral State:
-
-
Magic Skills and Configuration
- -
-
-
Magic Skills and Configuration
- -
+
Adept
@@ -1110,16 +1111,9 @@
- -
-
Adept Powers
- -
-
-
Adept Powers
- -
+
+
Power
Rating
@@ -1178,16 +1172,8 @@
- -
-
Spells
- -
-
-
Spells
- -
+
Name
@@ -1283,16 +1269,8 @@

- -
-
Fetishes and Foci
- -
-
-
Fetishes and Foci
- -
+
Type
Category
@@ -1403,45 +1381,28 @@
-
- -
-
Initiation and Metamagic
- -
-
-
Initiation and Metamagic
- -
+
Initiate Grade:
-
Metamagic
-
Notes
+
Metamagic
+
Notes
-
-
+
+

- -
-
Geas
- -
-
-
Geas
- -
+
Geas Type
Geas Notes
@@ -1454,16 +1415,8 @@

- -
-
Totem/Abilities
- -
-
-
Totem/Abilities
- -
+
Totem
Environment
@@ -1475,6 +1428,65 @@
+
+
+
+
Spirit Name
+
Spirit Type
+
Force
+
Fetish
+
Expendable
+
Summon
+
Banish
+
+
+
+ + + + + + + +
+
+
@@ -4315,6 +4327,15 @@ buttonlist.forEach(button => { }); }); +const magictabs = ["astral", "skills", "adept", "conjuring", "geas", "totem", "initiate", "foci", "spells"]; +magictabs.forEach(magic => { + button=magic + "-tab"; + console.log(button) + on(`clicked:${button}`, function() { + setAttrs({ magictab: magic }); + }); +}); + + +
+
{{myname}}: {{spellname}} vs. {{targetofspell}}
+
Rolling: {{computed::rolldice}}d6 vs. {{targetnumber}} = {{casttest}}
+ {{#spelldamage}}
Force: {{castforce}} Damage: {{computed::spelldamage}}
{{/spelldamage}} + {{#sorcerydice}} +
+
Dice
Sorcery
Pool
+
Used
{{sorcerydice}}
{{#spellpool}}{{spellpool}}{{/spellpool}}
+
{{/sorcerydice}} + {{#roll}}
Casting Test: {{computed::cast}} {{computed::roll}}
{{/roll}} + {{#draintest}} +
+
Drain
Resist Test
Final
+
{{computed::draindamage}}
{{draintest}}
{{computed::finaldrain}}
+
+ {{/draintest}} + {{#description}}
{{description}}
{{/description}} + {{#notes}}
{{notes}}
{{/notes}} + {{#notes2}}
{{notes2}}
{{/notes2}} + {{#resist}}
{{targetofspell}}: {{resist}}
{{/resist}} + {{#defensetest}}
+
Attack
Defense
Result
+
{{attacks}}
-
{{casttest}}
=
{{computed::defensetest}}
+
{{/defensetest}} +
{{#spelldefense}}[Spell Defense](~selected|spelldefense||{{computed::senddata}}){{/spelldefense}} + {{#casttest}}{{targetofspell}}: + {{#dodge}}[Dodge](~{{targetofspell}}|dodge||{{computed::senddata}}){{/dodge}} + [Resist](~{{targetofspell}}|{{resisttype}}||{{computed::senddata}}) +
{{/casttest}} + {{#roll}}
{{targetofspell}}: [AOE](~selected|checkaoe||{{computed::senddata}})
{{/roll}} +
+
{{myname}}: {{spellname}} vs. {{targetofspell}}
From 0faaccf976c8b331ab728e2f20a0e77f649a0a2b Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Mon, 20 Sep 2021 08:23:06 -0400 Subject: [PATCH 29/49] updating conjure template --- Shadowrun3e/shadowrun3e.html | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 28695a20fb..071c72f6f2 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -5632,12 +5632,11 @@ on('clicked:matrixattack', (info) => { const mycharisma=myval["charisma_max"]; var calcTN; var calcDrainTN; - var calcDice= parseInt(myval[myid]) + " + ?{Spell Pool Dice} + ?{Spirit Focus Dice}"; - if (myid != "summoning") calcDice+= " + ?{Are you the summoner of the spirit?|Yes," + mycharisma + "|No,0}" + var calcDice= parseInt(myval[myid]) + " + ?{Spirit Focus Dice} + ?{Are you the summoner of the spirit?|Yes," + mycharisma + "|No,0}" var action; if (myid == "summoning" ) { + calcDice= parseInt(myval[myid]) + " - ?{Conjuring Dice for Drain?} + ?{Spirit Focus Dice}"; calcTN = (force=="ask")? "?{Force?}" : force; - var calcDice="?{Conjuring Dice?|" + parseInt(myval[myid]) + "} + ?{Spirit Focus Dice}"; calcDrainTN = (force=="ask")? "?{Force?}" : force; action= (force =="ask")? "Conjure Force ?{Force?} Spirit" : "Conjure Force " + force + " Spirit";; @@ -5651,10 +5650,9 @@ on('clicked:matrixattack', (info) => { myroll+="{{draindamage=[[0]]}}" if (myid == "summoning" ) { if (force=="ask") myroll+="{{spiritforce=[[?{Force?|1}]]}}" - else myroll+="{{spiritforce=" + force + "}}"; + else myroll+="{{spiritforce=[[" + force + "]]}}"; myroll+="{{spirittype=" + spirittype + "}}"; myroll+="{{spiritname=" + name + "}}"; - myroll+="{{spellpool=[[?{Conjuring Dice?|0} + ?{Conjuring Dice for Drain?|0}]]}}"; } else { myroll+="{{spiritforce=[[ @{target|Target|force} ]]}}" From 9b198808cd5bdac8c90a064965158315660a6d98 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Mon, 20 Sep 2021 18:16:51 -0400 Subject: [PATCH 30/49] working on tabs instead of hide/show buttons --- Shadowrun3e/shadowrun3e.css | 17 ++- Shadowrun3e/shadowrun3e.html | 194 +++++++++++++++++++++++------------ 2 files changed, 144 insertions(+), 67 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index ee25b2c34d..21c0f462bb 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -521,11 +521,15 @@ input:checked+.slider:before { color: black; } +.gear-tabs, .magic-tabs { display: grid; grid-template-columns: auto auto auto auto auto auto auto auto auto; } +.gear-tabs-gear, +.gear-tabs-credsticks, +.gear-tabs-vehiclelist, .magic-tabs-spells, .magic-tabs-totem, .magic-tabs-initiate, @@ -543,8 +547,10 @@ input:checked+.slider:before { border-top-right-radius: 10px; border-top-left-radius: 10px; } - -.magic-tabs-switch[value="spells"]~button.magic-tabs-spells , +.gear-tabs-switch[value="gear"]~button.gear-tabs-gear, +.gear-tabs-switch[value="credsticks"]~button.gear-tabs-credsticks, +.gear-tabs-switch[value="vehiclelist"]~button.gear-tabs-vehiclelist, +.magic-tabs-switch[value="spells"]~button.magic-tabs-spells, .magic-tabs-switch[value="totem"]~button.magic-tabs-totem, .magic-tabs-switch[value="initiate"]~button.magic-tabs-initiate, .magic-tabs-switch[value="skills"]~button.magic-tabs-skills, @@ -560,6 +566,10 @@ input:checked+.slider:before { border-right: 3px solid black; border-bottom: unset; } + +.gear, +.credsticks-show, +.vehicles-list, .sorcery-skills, .spells-section, .fetish-foci, @@ -572,6 +582,9 @@ input:checked+.slider:before { display: none; } +.gear-tabs-switch[value="gear"]~div.gear, +.gear-tabs-switch[value="credsticks"]~div.credsticks-show, +.gear-tabs-switch[value="vehiclelist"]~div.vehicles-list, .magic-tabs-switch[value="spells"]~div.spells-section, .magic-tabs-switch[value="totem"]~div.totem, .magic-tabs-switch[value="initiate"]~div.magicinitiate, diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 071c72f6f2..98e70dcf7e 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -8,11 +8,11 @@
Sheet Type:
- - + @@ -85,6 +85,11 @@
+ + + + + @@ -1492,10 +1497,12 @@
-
+
Cyberdecks and Utilities
-
-
Smart Frames and Agents
+
+
+
Smart Frames and Agents
+
@@ -2058,7 +2065,7 @@
-
Karma
+
Karma
Karma Pool:
Good Karma:
@@ -2092,8 +2099,15 @@
-
-
Nuyen:
+ +
+ + + + + +
+
Nuyen:
Gear
@@ -2135,7 +2149,7 @@
-
+
Credsticks ¥
Type
@@ -2169,7 +2183,7 @@
-
+
Vehicles List
Vehicle Details and Skill rating go on sepperate Vehicle Character Sheet
@@ -4327,6 +4341,15 @@ buttonlist.forEach(button => { }); }); +const geartabs = ["gear", "credsticks", "vehiclelist"]; +geartabs.forEach(tab => { + button=tab + "-tab"; + console.log(button) + on(`clicked:${button}`, function() { + setAttrs({ geartab: tab }); + }); +}); + const magictabs = ["astral", "skills", "adept", "conjuring", "geas", "totem", "initiate", "foci", "spells"]; magictabs.forEach(magic => { button=magic + "-tab"; @@ -4336,6 +4359,42 @@ magictabs.forEach(magic => { }); }); +const combattabs = ["skills", "ranged", "melee", "explosives", "armor", "ammunition"]; +combattabs.forEach(tab => { + button=tab + "-tab"; + console.log(button) + on(`clicked:${button}`, function() { + setAttrs({ combattab: tab }); + }); +}); + +const riggertabs = ["rcdeck", "subscriber", "skill"]; +riggertabs.forEach(tab => { + button=tab + "-tab"; + console.log(button) + on(`clicked:${button}`, function() { + setAttrs({ combattab: tab }); + }); +}); + +const waretabs = ["cyberware", "bioware", "nanoware"]; +waretabs.forEach(tab => { + button=tab + "-tab"; + console.log(button) + on(`clicked:${button}`, function() { + setAttrs({ waretab: tab }); + }); +}); + +const deckingtabs = ["skills", "cyberdeck", "utilities"]; +deckingtabs.forEach(tab => { + button=tab + "-tab"; + console.log(button) + on(`clicked:${button}`, function() { + setAttrs({ deckingtab: tab }); + }); +}); + @@ -9255,7 +9292,7 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
{{#spelldefense}}[Spell Defense](~selected|spelldefense||{{computed::senddata}}){{/spelldefense}} {{#casttest}}{{targetofspell}}: {{#dodge}}[Dodge](~{{targetofspell}}|dodge||{{computed::senddata}}){{/dodge}} - [Resist](~{{targetofspell}}|{{computed::resisttype}}||{{computed::senddata}}) + {{#resisttype}}[Resist](~{{targetofspell}}|{{computed::resisttype}}||{{computed::senddata}}){{/resisttype}}
{{/casttest}} {{#roll}}
{{targetofspell}}: [AOE](~selected|checkaoe||{{computed::senddata}})
{{/roll}} diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index e5dc0f2224..cb1dd6af6d 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -1,25 +1,25 @@ { "general-info": "General Information", "name": "Name", - "sheet-type": "Sheet Type:", + "sheet-type": "Sheet Type", "character": "Character", "npc": "NPC", "critter": "Critter", "spirit": "Spirit", "drone": "Drone", - "vehicle": "Vehicle:", + "vehicle": "Vehicle", "matrix": "Matrix", "frame": "Frame", "import": "Import", "export": "Export", - "metatype": "MetaType:", + "metatype": "MetaType", "human": "Human", "dwarf": "Dwarf", "efl": "Elf", "ork": "Ork", "troll": "Troll", - "age": "Age:", - "height": "Height:", + "age": "Age", + "height": "Height", "weight": "Weight", "spirit-type": "Spirit Type", "watcher": "Watcher", @@ -48,10 +48,15 @@ "force": "Force", "attributes": "Attributes", "skills": "Skills", - "magic": "Magic:", + "magic": "Magic", "adept": "Adept", "decking": "Decking", "gear": "Gear", + "mode": "mode", + "resist-explosive": "Resist Explosive", + "direction": "Direction", + "meters-away": "Meter Away", + "power-reduced-by-1-each": "Power Reduced by 1 Each", "rigger": "Rigger", "combat": "Combat", "cyberware": "cyberware", @@ -61,7 +66,6 @@ "condition-monitor": "Condition Monitor", "uninjured": "Uninjured", "moderate-stun": "Moderate Stun", - "serious-stun": "Serious(s)", "unconscious": "Unconscious", "stun": "Stun", "physical": "Physical", @@ -73,6 +77,8 @@ "dice-pools": "Dice Pools", "maxiumum-abreviation": "Max", "used": "Used", + "uses": "Uses", + "item-test": "Equipment Test", "combat-pool": " Combat Pool", "combat-pool-dice": "Combat Pool Dice", "combat-pool-used": "Combat Pool Used", @@ -80,30 +86,30 @@ "hacking-pool": "Hacking Pool", "control-pool": "Control Pool", "astral-pool": " Astral Pool", - "task-pool": " Task Pool:", + "task-pool": " Task Pool", "spell-pool-dice": "Spell Pool", "spell-pool-dice-for-drain": "Spell Pool Dice for Drain", "hacking-pool-dice": "Hacking Pool", "control-pool-dice": "Control Pool", "astral-pool-dice": " Astral Pool", "task-pool-dice": " Task Pool Dice", - "physical-damage-overflow": "Physical Damage Overflow:", + "physical-damage-overflow": "Physical Damage Overflow", "initiative-natural": "Init Nat.", "initiative-augmented": "Init. Aug.", "initiative-physical": "Init. Phy.", "initiative-astral": "Init. Astr. ", - "end-turn": "End Turn:", - "body-abbreviation": "B:", - "quickness-abbreviation": "Q:", - "strength-abbreviation": "S:", - "charisma-abbreviation": "C:", + "end-turn": "End Turn", + "body-abbreviation": "B", + "quickness-abbreviation": "Q", + "strength-abbreviation": "S", + "charisma-abbreviation": "C", "intelligence-abbreviation": "Intel.", - "willpower-abbreviation": "W:", - "reaction-abbreviation": "R:", + "willpower-abbreviation": "W", + "reaction-abbreviation": "R", "combat-conditions": "Combat conditions", - "ranged-modifiers": "Ranged Modifiers:", - "melee-modifiers": "Melee Modifiers:", - "rounds-fired": "Rounds Fired:", + "ranged-modifiers": "Ranged Modifiers", + "melee-modifiers": "Melee Modifiers", + "rounds-fired": "Rounds Fired", "dodge": "Dodge", "ballistic": "Ballistic: ", "impact": "Impact: ", @@ -160,7 +166,7 @@ "mounted": "mounted", "restricted": "Restricted", "tight": "Tight", - "combat-zone": "Combat Zone:", + "combat-zone": "Combat Zone", "metahuman-sized": "Metahuman sized", "small-critter": "Small critter", "large-critter": "Large critter", @@ -183,7 +189,7 @@ "base": "Base", "mods": "Mods", "final": "Final", - "body": "Body:", + "body": "Body", "body-test-natural": "Body Test without augmentation", "body-test-aug": "Body Test with augmentation", "quickness": "Quickness", @@ -211,21 +217,21 @@ "deadly-stun-abbreviation": "D(s)", "reaction-init-speed": "Reaction, Init & Speed", "natural": "Natural", - "reaction": "Reaction:", - "initiative": "Initiative:", + "reaction": "Reaction", + "initiative": "Initiative", "astral": "Astral", - "walking-rate": "Walking Rate:", + "walking-rate": "Walking Rate", "meters-per-combat-turn": "meters per combat turn", - "running-rate": "Running Rate:", + "running-rate": "Running Rate", "pool": "Pool", "calculated": "Calculated", "spell": "Spell", "hacking": "Hacking", "control": " Control", "task": "Task", - "karma-pool": "Karma Pool:", - "good-karma": "Good Karma:", - "professional-rating": "Professional Rating:", + "karma-pool": "Karma Pool", + "good-karma": "Good Karma", + "professional-rating": "Professional Rating", "skills-edges-flaws": "Skills/Edges/Flaws", "rating": "Rating", "roll": "Roll", @@ -235,18 +241,18 @@ "max": "Max", "defense": "Defense", "spells": "Spells", - "spell-defense": "Spell Defense:", - "sorcery": "Sorcery:", - "conjuring": "Conjuring:", + "spell-defense": "Spell Defense", + "sorcery": "Sorcery", + "conjuring": "Conjuring", "conjuring-dice-for-drain": "Conjuring Dice for Drain", - "misc-modifiers": "Misc. Modifiers:", + "misc-modifiers": "Misc. Modifiers", "modifiers": "Modifiers", "defend": "Defend: ", "dispell": "Dispell: ", "summon": "Summon", "banish": "Banish", - "spells-stacked": "Spells Stacked:", - "spells-sustained": "Spells Sustained:", + "spells-stacked": "Spells Stacked", + "spells-sustained": "Spells Sustained", "resist-banish": "Resist Banish: ", "resist-spell": "Resist Spell", "astral-state-combat": "Astral State and Combat", @@ -254,30 +260,30 @@ "adept-powers": "Adept Powers", "astral-perception": "Astral Perception", "astral-projection": "Astral Projection", - "astral-reaction": "Astral Reaction:", - "astral-initiative": "Astral Initiative:", - "astral-combat": "Astral Combat:", - "weapon-focus": "Weapon Focus:", + "astral-reaction": "Astral Reaction", + "astral-initiative": "Astral Initiative", + "astral-combat": "Astral Combat", + "weapon-focus": "Weapon Focus", "enabled": "Enabled", "mage": "Mage", "shaman": "Shaman", "aspected-mage": "Aspected Mage", - "sorcer": "Sorcery:", + "sorcer": "Sorcery", "specialize": "Specialize", - "spellcasting": "Spellcasting:", - "dispelling": "Dispelling:", - "ritual-magic": "Ritual Magic:", - "summoning": "Summoning:", - "banishing": "Banishing:", - "controlling": "Controlling:", - "aura-reading": "Aura Reading:", - "auras": "Auras:", - "signatures": "Signatures:", + "spellcasting": "Spellcasting", + "dispelling": "Dispelling", + "ritual-magic": "Ritual Magic", + "summoning": "Summoning", + "banishing": "Banishing", + "controlling": "Controlling", + "aura-reading": "Aura Reading", + "auras": "Auras", + "signatures": "Signatures", "drain": "Drain", - "enchanting": "Enchanting:", - "divining": "Divining:", - "centering": "Centering:", - "creative-skill": "Creative Skill:", + "enchanting": "Enchanting", + "divining": "Divining", + "centering": "Centering", + "creative-skill": "Creative Skill", "power": "Power", "cost": "Cost", "activate": "Activate", @@ -313,9 +319,10 @@ "medium": "Medium", "serious": "Serious", "deadly": "Deadly", - "light-stun": "Light(s)", - "medium-stun": "Medium(s)", - "deadly-stun": "Deadly(s)", + "light-stun": "Light Stun", + "medium-stun": "Medium Stun", + "serious-stun": "Serious Stun", + "deadly-stun": "Deadly Stun", "instant-abbreviation": "I", "sustained-abbreviation": "S", "permanent-abbreviation": "P", @@ -358,7 +365,7 @@ "club": "Club", "pole-arm": "Pole Arm", "whip": "Whip", - "initiate-grade": "Initiate Grade:", + "initiate-grade": "Initiate Grade", "metamagic": "Metamagic", "geas-type": "Geas Type", "geas-notes": "Geas Notes", @@ -394,7 +401,7 @@ "green": "GREEN", "orange": "ORANGE", "red": "RED", - "pilot-rating": "Pilot Rating:", + "pilot-rating": "Pilot Rating", "utility-payload": "Utility Payload", "sensor": "Sensor", "evade": "Evade", @@ -407,13 +414,13 @@ "bod": "Bod", "evasion": "Evasion", "masking": "Masking", - "sensors": "Sensors:", + "sensors": "Sensors", "detection-factor-abbreviation": "Detect.F", "jack-in": "Jack In", - "memory-in-use": "Memory In Use:", + "memory-in-use": "Memory In Use", "reset": "Reset", - "hacking-pool-used": "Hacking Pool Used:", - "penalties": "Penalties:", + "hacking-pool-used": "Hacking Pool Used", + "penalties": "Penalties", "cyberdeck-configuration": "Cyberdeck Configuration", "computer-skills": "Computer Skills", "frame-configuration": "Frame Configuration", @@ -431,7 +438,7 @@ "smart-frame": "Smart Frame", "agent": "Agent", "core-rating": "Core Rating", - "pilot": "Pilot:", + "pilot": "Pilot", "utility-rating-sum": "Utility Rating Sum", "utility-rating": "Utility Rating", "special-utilities": "Special Utilities", @@ -446,7 +453,7 @@ "track": "Track", "defensive-utilities": "Defensive Utilities", "multiplier": "Multiplier", - "armor": "Armor:", + "armor": "Armor", "cloak": "Cloak", "lock-on": "Lock-On", "offensive-utilities": "Offensive Utilities", @@ -463,7 +470,7 @@ "index": " Index", "files": " Files", "slave": " Slave", - "karma-total": "Karma Total:", + "karma-total": "Karma Total", "attribute-skill-spell-etc": "Attribute/Skill/Spell/etc.", "ammount-of-karma": "Ammount of Karma", "date": "Date", @@ -483,43 +490,43 @@ "vehicles-list": "Vehicles List", "vehicles-skill-message": "Vehicle Details and Skill rating go on sepperate Vehicle Character Sheet", "model": "Model", - "vcr-rating": "VCR Rating:", - "vehicle-reaction": "Vehicle Reaction:", - "vehicle-initiative": "Vehicle Initiative:", - "ivis-master-unit": "IVIS Master Unit:", - "fddm-master-unit": "FDDM Master Unit:", + "vcr-rating": "VCR Rating", + "vehicle-reaction": "Vehicle Reaction", + "vehicle-initiative": "Vehicle Initiative", + "ivis-master-unit": "IVIS Master Unit", + "fddm-master-unit": "FDDM Master Unit", "remote control deck": "Remote Control Deck Configuration", "drone-subscriber-list": "Drone Subscriber List", - "intrusion-factor-base": "Intrusion Factor Base:", - "intrusion-factor-modifier": "Intrusion Factor Mods:", - "intrusion-factor": "Intrusion Factor:", + "intrusion-factor-base": "Intrusion Factor Base", + "intrusion-factor-modifier": "Intrusion Factor Mods", + "intrusion-factor": "Intrusion Factor", "flux-rating": "Flux Rating", "modified-flux": "Modified Flux", - "deck": "Deck:", - "eccm": "ECCM:", - "electronic-warfare": "Electronic Warfare:", - "encryption-module": "Encryption Module:", - "decryption-module": "Decryption Module:", - "protocol-emulation-module": "Protocol Emulation Module:", + "deck": "Deck", + "eccm": "ECCM", + "electronic-warfare": "Electronic Warfare", + "encryption-module": "Encryption Module", + "decryption-module": "Decryption Module", + "protocol-emulation-module": "Protocol Emulation Module", "update-vehicle-skill-here": "Update Vehicle Skill Here", "vehicle-specialize-message": "If specializing in a specif vehicle, add modifiers to the vehicle/drone itself", "remote-operation": "Remote Operation", - "bike": "Bike:", - "car": "Car:", + "bike": "Bike", + "car": "Car", "hovercraft": "Hovercraft", "lighter-than-air-aircraft-abbreviated": "LAV", - "motorboat": "Motorboat:", - "rotor-aircraft": "Rotor Aircraft:", - "sailboat": "Sailboat:", - "ship": "Ship:", - "submarine": "Submarine:", - "vectored-thrust": "Vectored Thrust:", - "winged-aircraft": "Winged Aircraft:", - "mechanical-arm": "Mechanical Arm:", + "motorboat": "Motorboat", + "rotor-aircraft": "Rotor Aircraft", + "sailboat": "Sailboat", + "ship": "Ship", + "submarine": "Submarine", + "vectored-thrust": "Vectored Thrust", + "winged-aircraft": "Winged Aircraft", + "mechanical-arm": "Mechanical Arm", "semiballistic": "Semiballistic", "suborbital": "HSCT/Suborbital", - "tracks": "Tracks:", - "walkers": "Walkers:", + "tracks": "Tracks", + "walkers": "Walkers", "combat-skills-weapons-armor-and-ammunition": "Combat Skills, Weapons, Armor and Ammo", "combat-skills": "combat skills", "ranged-weapons": "ranged weapons", @@ -528,23 +535,23 @@ "ammunition": "Ammunition", "update-combat-skills-here": "Update Combat Skill Here", "combat-skills-specialization-message": "If specializing in a weapon, add modifiers to the weapon itself", - "assualt-rifle": "Assualt Rifle:", - "pistols": "Pistols:", - "rifles": "Rifles:", - "shotguns": "Shotguns:", + "assualt-rifle": "Assualt Rifle", + "pistols": "Pistols", + "rifles": "Rifles", + "shotguns": "Shotguns", "sub-machine-gun-abbreviation": "SMG", - "throwing": "Throwing:", - "clubs": "Clubs:", + "throwing": "Throwing", + "clubs": "Clubs", "cyber-implant": "Cyber Implant", "gunnery": "Gunnery", - "heavy-weapons": "Heavy Weapons:", - "lasers": "Lasers:", - "launchers": "Launchers:", - "spray": "Spray:", - "gyrojet": "Gyrojet:", + "heavy-weapons": "Heavy Weapons", + "lasers": "Lasers", + "launchers": "Launchers", + "spray": "Spray", + "gyrojet": "Gyrojet", "projectile": "Projectile", - "demolitions": "Demolitions:", - "under-water": "Under Water:", + "demolitions": "Demolitions", + "under-water": "Under Water", "blowgun": "Blowgun", "bracer": "Bracer", "gun-cane": "Gun Cane", @@ -552,7 +559,7 @@ "oral-strike": "Oral Strike", "eye-gun": "Eye Gun", "unarmed": "Unarmed", - "martial-arts": "Martial Arts:", + "martial-arts": "Martial Arts", "brawling": "Brawling", "mma": "MMA", "karate": "Karate", @@ -665,9 +672,9 @@ "throw": "Throw", "launcher": "Launcher", "demolition": "Demolition", - "quickness-penalty": "Quickness Penalty:", - "combat-pool-penalty": "Combat Pool Penalty:", - "dermal-armor": "Dermal Armor:", + "quickness-penalty": "Quickness Penalty", + "combat-pool-penalty": "Combat Pool Penalty", + "dermal-armor": "Dermal Armor", "slot": "Slot", "ballistic-rating": "Ballistic Rating", "impact-rating": "Impact Rating", @@ -726,16 +733,16 @@ "interface": "Interface", "datajack": "Datajack", "VCR": "VCR", - "autonav": "Autonav:", - "speed": "Speed:", + "autonav": "Autonav", + "speed": "Speed", "current": "Current", "maximum": "Maximum", "maneuever": "Maneuever", "generate": "Generate", "compare": "Compare", - "off-road": "Off Road:", + "off-road": "Off Road", "open": "Open", - "urban-setting": "Urban Setting:", + "urban-setting": "Urban Setting", "weather": "Weather", "bad": "Bad", "terrible": "Terrible", @@ -761,9 +768,9 @@ "driver": "Driver", "driving": "Driving", "maimum-abbreviation": "Max", - "operative-mode": "Operative Mode:", - "primary": "Primary:", - "secondary": "Secondary:", + "operative-mode": "Operative Mode", + "primary": "Primary", + "secondary": "Secondary", "vehicle-configuration": "Vehicle Configuration", "drone-configuration": "Drone Configuration", "manual-control": "Manual Control", @@ -789,23 +796,23 @@ "ultralight": "Ultra-light Aircraft", "large": "Large", "extra-large": "Extra-Large", - "handling": "Handling:", - "acceleration": "Acceleration:", - "signature": "Signature:", - "firmpoints": "Firmpoints:", + "handling": "Handling", + "acceleration": "Acceleration", + "signature": "Signature", + "firmpoints": "Firmpoints", "hardpoint": "Hardpoint", - "seating": "Seating:", - "entry-points": "Entry Points:", - "fuel": "Fuel:", - "economy": "Economy:", - "cargo": "Cargo:", - "load": "Load:", - "vehicle-skill": "Vehicle Skill:", + "seating": "Seating", + "entry-points": "Entry Points", + "fuel": "Fuel", + "economy": "Economy", + "cargo": "Cargo", + "load": "Load", + "vehicle-skill": "Vehicle Skill", "ivis-pool": "IVIS Pool;", - "stress": "Stress:", - "setup-breakdown": "Setup/Breakdown:", - "total-cost": "Total Cost:", - "rapid-attributes-set": "Rapid Attribute Set:", + "stress": "Stress", + "setup-breakdown": "Setup/Breakdown", + "total-cost": "Total Cost", + "rapid-attributes-set": "Rapid Attribute Set", "modification-notes": "Modification Notes", "vehicle-electronics-and-ecm-eccm": "Vehicle Electornics and ECM/ECCM", "drone-electronics-and-ecm-eccm": "Drone Electornics and ECM/ECCM", @@ -816,14 +823,14 @@ "max-flux": "Max Flux", "roll-test": "Roll Test", "opposition-test": "Opposition Test", - "sonar": "Sonar:", - "ECM": "ECM:", - "ED": "ED:", - "ECD": "ECD:", + "sonar": "Sonar", + "ECM": "ECM", + "ED": "ED", + "ECD": "ECD", "handling-abbreviation": "Hand", - "accleration-abbreviation": "Accel:", - "signature-abbreviation": "Sig:", - "auto-pilot-rating-abbreviation": "Auto:", + "accleration-abbreviation": "Accel", + "signature-abbreviation": "Sig", + "auto-pilot-rating-abbreviation": "Auto", "vehicle-actions": "Vehicle Actions", "drone-actions": "Drone Actions", "accelerate": "Accelerate", @@ -904,7 +911,7 @@ "set-vehicle-operator": "Set Vehicle Operator", "set-decker-for-security-tally": "Set Decker for Security Tally", "spell-resistance-test": "Spell Resistance Test", - "damage-resistance-test": "Damage kkResistance Test", + "damage-resistance-test": "Damage Resistance Test", "sorcery-dice": "Sorcery Dice", "sorcery-dice-for-drain": "Sorcery Dice for Drain", "force-of-spell": "Force of Spell", From 9357b99093003da48be93203056c41ca7eca7013 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Fri, 24 Sep 2021 07:44:24 -0400 Subject: [PATCH 39/49] added wdmg for matrix atack --- Shadowrun3e/shadowrun3e.html | 35 ++++++++++++++++++++--------------- Shadowrun3e/translation.json | 1 + 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 049ebd93cf..8158440213 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -4602,6 +4602,14 @@ deckingtabs.forEach(tab => { on("sheet:opened", function() { lang["use-reach-modifier"] = getTranslationByKey("use-reach-modifier"); + lang["L"] = getTranslationByKey("light-damage-abbreviation"); + lang["M"] = getTranslationByKey("moderate-damage-abbreviation"); + lang["S"] = getTranslationByKey("serious-damage-abbreviation"); + lang["D"] = getTranslationByKey("deadly-damage-abbreviation"); + lang["L(stun)"] = getTranslationByKey("light-stun-abbreviation"); + lang["M(stun)"] = getTranslationByKey("moderate-stun-abbreviation"); + lang["S(stun)"] = getTranslationByKey("serious-stun-abbreviation"); + lang["D(stun)"] = getTranslationByKey("deadly-stun-abbreviation"); lang["decker"] = getTranslationByKey("decker"); lang["none"] = getTranslationByKey("none"); lang["compare"] = getTranslationByKey("compare"); @@ -4793,7 +4801,7 @@ deckingtabs.forEach(tab => { }); }); - const matrixtn={BLUE: {Intruder: 3, Legitimate: 6, secrating: 1}, GREEN: {Intruder: 4, Legitimate: 5, secrating: 2}, ORANGE: {Intruder: 5, Legitimate: 4, secrating: 3}, RED: {Intruder: 6, Legitimate: 3, secrating: 4}}; + const matrixtn={BLUE: {Intruder: 3, Legitimate: 6, secrating: 1, wdmg: 2}, GREEN: {Intruder: 4, Legitimate: 5, secrating: 2, wdmg: 2}, ORANGE: {Intruder: 5, Legitimate: 4, secrating: 3, wdmg: 3}, RED: {Intruder: 6, Legitimate: 3, secrating: 4, wdmg: 3}}; const matrixsecnumber={1: "BLUE", 2: "GREEN", 3: "ORANGE",4: "RED"}; const attributes=[ "body", "quickness", "strength", "charisma", "willpower", "intelligence", "force" ]; const quicknesslinked=["@{blowgun}", "@{bracer}", "@{guncane}", "@{gyrojet}", "@{eyegun}", "@{oralgun}", "@{oralstrike}", "@{pistols}", "@{smgs}", "@{rifles}", "@{assaultrifles}", "@{lasers}", "@{whips}", "@{stealth}", "@{shotguns}"] @@ -5156,18 +5164,14 @@ deckingtabs.forEach(tab => { if ( payload ) { console.log(payload); power=payload["power"]; + wdmg=payload["wdmg"]; basetn=payload["basetn"]; attribute=payload["attribute"]; attacktype=payload["attacktype"]; attacktest=payload["attacktest"]; attacker=payload["attacker"]; - if (( attacktype == "Tar Baby") || (attacktype == "Tar pit" )) { - calcDice="?{" + lang["utility-rating"] + "?|" + basetn + "} + ?{" + lang["hacking-pool-dice"] + "|0}"; - calcTN= "?{" + lang["ic-rating"] + "?|" + power + "}"; - } else { - calcDice="@{deck-bod-final} + ?{" + lang["hacking-pool-dice"] + "|0}"; - calcTN= "?{" + lang["attack-power"] +"?|" + power + "} - @{deckarmor-rating-final}"; - } + calcDice="@{deck-bod-final} + ?{" + lang["hacking-pool-dice"] + "|0}"; + calcTN= "?{" + lang["attack-power"] +"?|" + power + "} - @{deckarmor-rating-final}"; myroll+="{{target=" + attacker + "}}{{attackdmg=[[0]]}}"; } else { calcTN="?{" + lang["attack-power"] +"?|0} - @{deckarmor-rating-final}"; @@ -5227,6 +5231,7 @@ on('clicked:matrixattack', (info) => { updatepoolused("hackingpool", results.results.hackingpool.result); let payload= { ammotype: myammo, + wdmg: matrixtn[mysystem]["wdmg"], attacker: myval["character_name"], attacktest: results.results.roll.result, power: results.results.utilitylevel.result, @@ -5589,12 +5594,12 @@ on('clicked:matrixattack', (info) => { }); }); - const calcFinalDrain = function(drainlevel, draintest) { - const dmgmax=(drainlevel >= 10)? 13 : 4; - const dmgmin=(drainlevel >= 10)? 9 : 0; - var drainstaged=drainlevel - Math.floor(draintest/2); - drainstaged = (drainstaged > dmgmax)? dmgmax : (drainstaged < dmgmin)? dmgmin : drainstaged; - return(damagetable[drainstaged]); + const calcFinalDmg = function(dmgstart, resist) { + const dmgmax=(dmgstart >= 10)? 13 : 4; + const dmgmin=(dmgstart >= 10)? 9 : 0; + var dmgstaged=dmgstart - Math.floor(resist/2); + dmgstaged = (dmgstaged > dmgmax)? dmgmax : (dmgstaged < dmgmin)? dmgmin : dmgstaged; + return(damagetable[dmgstaged]); }; var initiative = function (init, reaction, dmgpen, mytitle, character) { @@ -6144,7 +6149,7 @@ on('clicked:matrixattack', (info) => { updatepoolused("sorcery", results.results.sorcerydice.result); updatepoolused("spellpool", results.results.spellpool.result); const drainbase = damagetable[results.results.draindamage.result]; - const finaldraintxt=calcFinalDrain(results.results.draindamage.result, results.results.draintest.result); + const finaldraintxt=calcFinalDmg(results.results.draindamage.result, results.results.draintest.result); finishRoll( results.rollId, { draindamage: drainbase, finaldrain: finaldraintxt, diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index cb1dd6af6d..9f20cd45bb 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -157,6 +157,7 @@ "target-type": "Target Type", "towards": "Towards", "away": "Away", + "utility-test": "Utility Test", "attacker-greater": "Attacker Greaty by 10", "target-greater": "Target Greater by 10", "light-damage-abbreviation": "L", From 5b6f2c9d52e7d20b232ae31242eba55d4fbfc211 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Fri, 24 Sep 2021 18:27:50 -0400 Subject: [PATCH 40/49] added resistance rolls with original roll details for matrix combat --- Shadowrun3e/shadowrun3e.css | 30 ++++- Shadowrun3e/shadowrun3e.html | 208 +++++++++++++++++++++++++---------- Shadowrun3e/translation.json | 4 +- 3 files changed, 177 insertions(+), 65 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index f69f1b6324..e6b2e1d1b5 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -266,6 +266,7 @@ input:checked+.slider:before { display: grid; align-items: center; grid-template-columns: auto auto 1fr; + border-bottom: 3px solid black; } @@ -521,15 +522,26 @@ input:checked+.slider:before { color: black; } -.ware-tabs, -.rigger-tabs, .combat-tabs, -.decking-tabs, -.gear-tabs, .magic-tabs { display: grid; - grid-template-columns: auto auto auto auto auto auto auto auto auto; + grid-template-columns: auto auto auto auto auto auto auto auto 1fr; } +.spirit-magic-tabs { + display: grid; + grid-template-columns: auto auto 1fr; +} +.ware-tabs, +.rigger-tabs, +.decking-tabs { + display: grid; + grid-template-columns: auto auto auto 1fr; +} +.gear-tabs { + display: grid; + grid-template-columns: auto auto auto auto auto 1fr; +} + .ware-tabs-cyber, .ware-tabs-bio, .ware-tabs-nano, @@ -568,6 +580,9 @@ input:checked+.slider:before { font-size: 18; color: black; } +.tabs-empty { + border-bottom: 3px solid black; +} .ware-tabs-switch[value="cyber"]~button.ware-tabs-cyber, .ware-tabs-switch[value="bio"]~button.ware-tabs-bio, .ware-tabs-switch[value="nano"]~button.ware-tabs-nano, @@ -793,6 +808,7 @@ input:checked+.slider:before { color: black; } +.spirit-magic-tabs, .reaction-spirit, .alwaysdisplayed-buttons, .critters-only, @@ -824,6 +840,7 @@ input:checked+.slider:before { display: none; } +.buttontoggle[value="Spirit"]~div.magic-tabs, .buttontoggle[value="Spirit"]~div.hide-spirit-critter, .buttontoggle[value="Critter"]~div.hide-spirit-critter, .buttontoggle[value="Spirit"]~div.normal-init, @@ -834,6 +851,7 @@ input:checked+.slider:before { display: none; } +.buttontoggle[value="Spirit"]~div.spirit-magic-tabs, .buttontoggle[value="Spirit"]~div.spells-spirit-status, .buttontoggle[value="Spirit"]~div.reaction-spirit, .buttontoggle[value="Spirit"]~div.spirittype-info { @@ -2516,7 +2534,7 @@ input.enable-fa:not(:checked)~span.show_fa_dice { display: grid; text-align: right; align-items: center; - grid-template-columns: auto 25px 20px auto auto auto 20px auto auto 20px auto auto 20px auto auto 1fr; + grid-template-columns: auto 25px 20px auto auto auto auto 20px auto auto 20px auto auto 20px auto auto 1fr; } .frame-util-used { diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 8158440213..1a4d077510 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -914,13 +914,12 @@
Resist Banish:
+
- - - + + +
@@ -932,8 +931,16 @@ data-i8n="initiate-uppercase">INITIATE +
- +
+ + + + +
+
+

@@ -1757,6 +1764,7 @@
+
/
@@ -1774,17 +1782,14 @@
- - - - - + + + + + +
- +
Computer
@@ -2203,10 +2208,11 @@ -
+
Nuyen:
+
Gear
@@ -2329,6 +2335,7 @@ title="Drone Subscriber List">Subscriber List +
@@ -3403,13 +3410,14 @@ - + + - - + +
-
+ +
+
@@ -4601,6 +4609,10 @@ deckingtabs.forEach(tab => { var lang={} on("sheet:opened", function() { + lang["blackiclethal"] = getTranslationByKey("black-ic-lethal"); + lang["blackicnonlethal"] = getTranslationByKey("black-ic-non-lethal"); + lang["cerebropathic"] = getTranslationByKey("cerebropathic"); + lang["psychotropic"] = getTranslationByKey("psychotropic"); lang["use-reach-modifier"] = getTranslationByKey("use-reach-modifier"); lang["L"] = getTranslationByKey("light-damage-abbreviation"); lang["M"] = getTranslationByKey("moderate-damage-abbreviation"); @@ -4611,8 +4623,15 @@ deckingtabs.forEach(tab => { lang["S(stun)"] = getTranslationByKey("serious-stun-abbreviation"); lang["D(stun)"] = getTranslationByKey("deadly-stun-abbreviation"); lang["decker"] = getTranslationByKey("decker"); + lang["evasion"] = getTranslationByKey("evasion"); + lang["sensors"] = getTranslationByKey("sensors"); + lang["masking"] = getTranslationByKey("masking"); + lang["bod"] = getTranslationByKey("bod"); lang["none"] = getTranslationByKey("none"); + lang["attack"] = getTranslationByKey("attack"); + lang["probe"] = getTranslationByKey("probe"); lang["compare"] = getTranslationByKey("compare"); + lang["swap-memory"] = getTranslationByKey("swap-memory"); lang["damage-resistance-test"] = getTranslationByKey("damage-resistance-test"); lang["maneuver-score"] = getTranslationByKey("maneuver-score"); lang["accelerate"] = getTranslationByKey("accelerate"); @@ -4640,6 +4659,7 @@ deckingtabs.forEach(tab => { lang["deadly-stun"] = getTranslationByKey("deadly-stun"); lang["damage"] = getTranslationByKey("damage"); lang["wound-level"] = getTranslationByKey("wound-level"); + lang["utility-test"] = getTranslationByKey("utility-test"); lang["utility-rating"] = getTranslationByKey("utility-rating"); lang["yes"] = getTranslationByKey("yes"); lang["no"] = getTranslationByKey("no"); @@ -5151,7 +5171,7 @@ deckingtabs.forEach(tab => { }); on('clicked:matrixresist', (info) => { - var payload, myid; + var payload, myid, attacktest, wdmg; if ( info["htmlAttributes"]["id"] != undefined) { myid=info["htmlAttributes"]["id"]; } else if ( info["originalRollId"] != undefined ) { @@ -5167,12 +5187,24 @@ deckingtabs.forEach(tab => { wdmg=payload["wdmg"]; basetn=payload["basetn"]; attribute=payload["attribute"]; + const myattr=attribute.split("-")[1]; attacktype=payload["attacktype"]; attacktest=payload["attacktest"]; attacker=payload["attacker"]; calcDice="@{deck-bod-final} + ?{" + lang["hacking-pool-dice"] + "|0}"; - calcTN= "?{" + lang["attack-power"] +"?|" + power + "} - @{deckarmor-rating-final}"; - myroll+="{{target=" + attacker + "}}{{attackdmg=[[0]]}}"; + calcTN= "?{" + lang["attack-power"] +"?|" + power + "}"; + myroll+="{{finaldamage=[[0]]}}{{attackdmg=[[0]]}}{{payload=[[0]]}}"; + if (iclist["attack"].includes(attacktype)) calcTN += " - @{deckarmor-rating-final}"; + if (iclist["blackic"].includes(attacktype)) { + myroll+="{{blackic=" + lang[attacktype] + "}}"; + payload["ammotype"]=attacktype; + payload["wdmg"]=damagetable[wdmg]; + payload["dodge"]=0; + payload["range"]="touch"; + } + myroll+="{{target=" + attacker + "}}"; + console.log('tst myattr: ' + myattr + ' lang: ' + lang[myattr]); + myroll+= (iclist["debuff"].includes(attacktype))? "{{debuff=" + lang[myattr] +"}}": "{{resist=yes}}"; } else { calcTN="?{" + lang["attack-power"] +"?|0} - @{deckarmor-rating-final}"; calcDice="@{deck-bod-final} + ?{" + lang["hacking-pool-dice"] + "|0}"; @@ -5187,12 +5219,30 @@ deckingtabs.forEach(tab => { console.log(myroll); startRoll(myroll, (results) => { updatepoolused("hackingpool", results.results.hackingpool.result); - finishRoll( results.rollId); + if ( payload ) { + const resistroll=results.results.roll.result; + const delta=attacktest - resistroll; + console.log('delta: ' + delta); + console.log('wdmg: ' + wdmg); + const finaldmg=(iclist["debuff"].includes(attacktype))? calcFinalDebuff(delta) : calcFinalDmg(wdmg, delta); + console.log('final dmg: ' + finaldmg); + finishRoll( results.rollId, + { + finaldamage: finaldmg, + payload: rollEscape.escape(payload), + + }); + + } + else finishRoll( results.rollId); }); }); const iclist = { - proactive: ["Crippler", "Ripper", "Killer", "Blaster", "Sparky", "Scout", "Black Ic", "Cerebropathic", "Psychotropic", "Trace"], + blackic: ["blackiclethal", "cerebropathic", "psychotropic", "blackicnonlethal"], + debuff: ["Crippler", "Ripper"], + attack: ["Killer", "Blaster", "Sparky", "blackiclethal", "cerebropathic", "psychotropic", "blackicnonlethal"], + proactive: ["Crippler", "Ripper", "Killer", "Blaster", "Sparky", "Scout", "blackiclethal", "cerebropathic", "psychotropic", "blackicnonlethal", "Trace"], reactive: ["Probe", "Scramble", "Tar Baby", "Tar pit", "Data Bomb", "Pavlov"] }; @@ -5208,17 +5258,18 @@ on('clicked:matrixattack', (info) => { var myaction="{{action=" + mytitle + "}}"; if (myid == "deckattack") myaction="{{action=Attack @{deckattacklevel}}}" var myroll="&{template:matrix}" + myroll+="{{roll=[[[[" + calcDice + "]]d6>[[ {2,( " + calcTN + ")}kh1]]!!]]}}"; myroll+= myaction; + myroll+="{{senddata=[[0]]}}"; + myroll+="{{wdmg=[[0]]}}"; myroll+="{{rolldice=[[" + calcDice + "]]}}" myroll+="{{targetnumber=[[" + calcTN + "]]}}"; - myroll+="{{utilitylevel=[[@{" + myid + "-rating-final}]]}}" - myroll+="{{senddata=[[0]]}}"; - myroll+="{{iconstatus=[[@{target|" + lang["target"] +"|iconstatuscode}]]}}"; if ( systemrating == "UNKNOWN" ) myroll+="{{systemrating=[[@{target|Host|matrixsecuritynumber}]]}}"; else myroll+="{{systemrating=[[" + matrixtn[systemrating]["secrating"] + "]]}}"; + myroll+="{{iconstatus=[[@{target|" + lang["target"] +"|iconstatuscode}]]}}"; myroll+="{{myname=@{character_name}}} {{target=@{target|" + lang["target"] +"|token_name}}}{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "|0}]]}}"; myroll+="{{utilitylevel=@{deckattack-rating-final}}}"; - myroll+="{{roll= [[ [[ " + calcDice + "]]d6>[[ {2,( " + calcTN + ")}kh1 ]]!! ]] }}"; + myroll+="{{utilitylevel=[[@{" + myid + "-rating-final}]]}}" console.log(myroll); startRoll(myroll, (results) => { if ( results.results.iconstatus.result == 0) myicon="Legitimate"; @@ -5227,22 +5278,28 @@ on('clicked:matrixattack', (info) => { const mysystem=matrixsecnumber[results.results.systemrating.result]; const myhosttn=matrixtn[mysystem][myicon]; finaltn += myhosttn; + console.log('final tn: ' + finaltn); const finaldice = (results.results.roll.dice.filter(mydice=> mydice >= finaltn )).length; + console.log('dice : ' + results.results.roll.dice); + console.log('finaldice : ' + finaldice); updatepoolused("hackingpool", results.results.hackingpool.result); + const mydamage=(myid=="deckattack")? damagetable[myval["deckattacklevel"]] : matrixtn[mysystem]["wdmg"]; let payload= { ammotype: myammo, - wdmg: matrixtn[mysystem]["wdmg"], + wdmg: mydamage, attacker: myval["character_name"], - attacktest: results.results.roll.result, + attacktest: finaldice, power: results.results.utilitylevel.result, attacktype: "cybercombat", attribute: "deck-bod-final" } finishRoll( results.rollId, { + wdmg: damagetable[mydamage], senddata: rollEscape.escape(payload), targetnumber: finaltn, roll: finaldice, + finalroll: finaldice, }); }); }); @@ -5296,7 +5353,7 @@ on('clicked:matrixattack', (info) => { if ( myutil == null ) myutil=myval[myrepeat + "utility"]; console.log(sets); setAttrs(sets); - myroll="&{template:info}{{character=@{character_name}}}{{action=Swap Memory}}{{type=" + lang["simple"] + "}}{{info1=Reloading Utility " + myutil + " into Memory}}"; + myroll="&{template:info}{{character=@{character_name}}}{{action=" + lang["swap-memory"] + "}}{{type=" + lang["simple"] + "}}{{info1=Reloading Utility " + myutil + " into Memory}}"; startRoll(myroll, (results) => { finishRoll( results.rollId); }); @@ -5431,19 +5488,19 @@ on('clicked:matrixattack', (info) => { const name=myval[myrepeat + "name"]; const description=myval[myrepeat + "description"]; const damage=myval[myrepeat + "damage"]; - var resistattr; + var resistattr, resisttype; var targetofspell=target; if (target.includes("@{target")) { targetofspell="@{target|" + lang["target"] +"|token_name}"; resistattr=target.split("|")[2]; } - var myroll="&{template:spell}{{myname=@{character_name}}}"; + var myroll="&{template:spell}"; if ( range == "AoE" ) { targetofspell="AoE"; if ( spellcat == "Elemental" ) { calcTN = "4 + @{rangedTN} + (2*(@{spellstack}+@{spellsus})) +@{spellmisc} + @{move}"; myroll+="{{targetnumber=[[" + calcTN + "]] + Cover & Target Movement}}"; - myroll+="{{resisttype=resistroll}}"; + resisttype="resistroll"; } else { if ( resistattr != null ) { calcTN= " (2*(@{spellstack}+@{spellsus})) + @{spellmisc} + @{stun_pen} + @{wound_pen} + @{rangedvizTN}"; @@ -5452,18 +5509,18 @@ on('clicked:matrixattack', (info) => { calcTN= target + " + (2*(@{spellstack}+@{spellsus})) + @{spellmisc} + @{stun_pen} + @{wound_pen} + @{rangedvizTN}"; myroll+="{{targetnumber=[[" + calcTN + "]] + Cover}}"; } - myroll+="{{resisttype=resistspell}}"; + resisttype="resistspell"; } } else { if ( spellcat == "Elemental" ) { calcTN = target + " + 4 + @{rangedTN} + (2*(@{spellstack}+@{spellsus})) +@{spellmisc} + @{move}"; myroll+="{{targetnumber=[[" + calcTN + "]]}}{{dodge=yes}}"; - myroll+="{{resisttype=resistroll}}"; + resisttype="resistroll"; } else { calcTN= target + " + (2*(@{spellstack}+@{spellsus})) + @{spellmisc} + @{stun_pen} + @{wound_pen} + @{rangedvizTN} + @{cover}"; myroll+="{{targetnumber=[[" + calcTN + "]]}}"; - myroll+="{{resisttype=resistspell}}"; + resisttype="resistspell"; } } @@ -5472,22 +5529,25 @@ on('clicked:matrixattack', (info) => { var calcDrainDice="@{willpower|max} + ?{" + lang["sorcery-dice-for-drain"] + "?} + ?{"+ lang["spell-pool-dice-for-drain"] +"?}"; myroll+="{{senddata=[[0]]}}"; myroll+="{{draindamage=[[0]]}}{{finaldrain=[[0]]}}"; + myroll+="{{cast=[[0]]}}"; myroll+="{{sorcerydice=[[?{"+ lang["sorcery-dice"] +"?|@{spellcasting}} + ?{" + lang["sorcery-dice-for-drain"] + "?|0}]]}}"; myroll+="{{spellpool=[[?{"+ lang["spell-pool-dice"] +"?|0} + ?{"+ lang["spell-pool-dice-for-drain"] +"?|0}]]}}"; - myroll+="{{spellname=" + name + "}}"; - myroll+="{{description=" + description +"}}"; myroll+="{{spelldamage=[[" + damage + "]]}}" myroll+="{{castforce=[[?{" + lang["force"] + "?|" + force + "}]]}}"; - myroll+="{{targetofspell=" + targetofspell + "}}"; myroll+="{{rolldice=[[" + calcDice + "]]}}"; - myroll+="{{cast=[[0]]}}"; - myroll+="{{draintest= [[ [[" + calcDrainDice + "]]d6>[[ {2, ( " + calcDrainTN + ")}kh1 ]]!! ]] }}"; + myroll+="{{draintest=[[[[" + calcDrainDice + "]]d6>[[ {2, ( " + calcDrainTN + ")}kh1]]!!]]}}"; if ( range == "AoE" ) { myroll+="{{roll=[[ [[" + calcDice + "]]d6>[[" + calcTN + "]]!! ]] }}"; } else { myroll+="{{targetname=[[0[@{target|" + lang["target"] +"|token_name}]]]}}"; myroll+="{{casttest=[[ [[" + calcDice + "]]d6>[[{2,(" + calcTN + ")}kh1]]!! ]] }}"; } + myroll+="{{resisttype=" + resisttype + "}}"; + myroll+="{{targetofspell=" + targetofspell + "}}"; + myroll+="{{draintn=[[ " + calcDrainTN + "]]}}"; + myroll+="{{spellname=" + name + "}}"; + myroll+="{{description=" + description +"}}"; + myroll+="{{myname=@{character_name}}}"; if (target.includes("@{target")) { console.log('attr split: ' + resistattr); if ( range != "AoE" ) { @@ -5521,11 +5581,13 @@ on('clicked:matrixattack', (info) => { console.log(results.results.spelldamage.result); const finaldmg=payload["wdmg"]=damagetable[results.results.spelldamage.result]; payload["targetnumber"]=results.results.targetnumber.result; - var draindmg; - var finalcast; + var draindmg, finalcast; + var draintn=results.results.draintn.result; + console.log('draintn before: ' + draintn); if (drainlvl.includes("dmglvl")) { let dmglvl=parseInt(results.results.spelldamage.result); draindmg=eval(drainlvl); + draintn += ( draindmg > 4 )? 2*(draindmg - 4) : 0; console.log('drdmg calc: ' + draindmg); } else { @@ -5533,6 +5595,7 @@ on('clicked:matrixattack', (info) => { draindmg = parseInt(drainlvl); console.log('drdmg stright: ' + damagetable[draindmg]); } + console.log('draintn after: ' + draintn); console.log('drain damage base ' + draindmg); var dmgmax=4; var dmgmin=0; @@ -5552,7 +5615,9 @@ on('clicked:matrixattack', (info) => { dmgmax=4; dmgmin=0; } - drainstaged=draindmg - Math.floor(results.results.draintest.result/2); + const draintest=results.results.draintest.dice; + const finaldraintest = (results.results.draintest.dice.filter(mydice=> mydice >= draintn )).length; + var drainstaged=draindmg - Math.floor(finaldraintest/2); console.log(' drain staged ' + drainstaged); drainstaged=(drainstaged < dmgmin)? dmgmin :(drainstaged > dmgmax)? dmgmax : drainstaged; console.log(' drain staged check min/max ' + drainstaged); @@ -5560,6 +5625,7 @@ on('clicked:matrixattack', (info) => { draindmg=damagetable[draindmg]; console.log('drdmg : ' + draindmg); console.log('finaldrain : ' + myfinaldrain); + console.log('finaldrain test : ' + finaldraintest); atts["sorcery-used"]= sorceryused + parseInt(results.results.sorcerydice.result); atts["spellpool-used"]= spused + parseInt(results.results.spellpool.result); if ( range == "AoE" ) { @@ -5569,6 +5635,7 @@ on('clicked:matrixattack', (info) => { payload["attacktest"]=0; finishRoll( results.rollId, { + draintest: finaldraintest, spelldamage: finaldmg, draindamage: draindmg, finaldrain: myfinaldrain, @@ -5582,6 +5649,7 @@ on('clicked:matrixattack', (info) => { payload["attackdice"]=results.results.casttest.dice; finishRoll( results.rollId, { senddata: rollEscape.escape(payload), + draintest: finaldraintest, spelldamage: finaldmg, finaldrain: myfinaldrain, draindamage: draindmg, @@ -5594,10 +5662,16 @@ on('clicked:matrixattack', (info) => { }); }); + const calcFinalDebuff = function(delta) { + delta=floor(delta/2); + return debuff=(delta <= 0)? 0 : delta; + }; + const calcFinalDmg = function(dmgstart, resist) { const dmgmax=(dmgstart >= 10)? 13 : 4; const dmgmin=(dmgstart >= 10)? 9 : 0; - var dmgstaged=dmgstart - Math.floor(resist/2); + var dmgstaged=dmgstart + floor(resist/2); + console.log('dmgstaged: ' + dmgstaged); dmgstaged = (dmgstaged > dmgmax)? dmgmax : (dmgstaged < dmgmin)? dmgmin : dmgstaged; return(damagetable[dmgstaged]); }; @@ -5726,6 +5800,10 @@ on('clicked:matrixattack', (info) => { } const ammomods = { + blackiclethal: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, + blackicnonlethal: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, + cerebropathic: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, + psychotropic: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, d: { armorname: "'impact'", armor: "impact", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, c: { armorname: "'impact'", armor: "impact", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, o: { armorname: "'impact'", armor: "impact", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, @@ -5749,11 +5827,12 @@ on('clicked:matrixattack', (info) => { } const resistdmg = function (myid, mods) { - atts=["ballistic", "impact", "armor-on"]; + atts=["ballistic", "impact", "armor-on", "deck-hardening"]; getAttrs(atts, function (myval) { const ballistic=myval["ballistic"]; const impact=myval["impact"]; const armoron=myval["armor-on"]; + const hardening=myval["deck-hardening"]; var armorname; var wdmg; var dmgcode=0; @@ -6149,7 +6228,7 @@ on('clicked:matrixattack', (info) => { updatepoolused("sorcery", results.results.sorcerydice.result); updatepoolused("spellpool", results.results.spellpool.result); const drainbase = damagetable[results.results.draindamage.result]; - const finaldraintxt=calcFinalDmg(results.results.draindamage.result, results.results.draintest.result); + const finaldraintxt=calcFinalDmg(( -1 * results.results.draindamage.result), results.results.draintest.result); finishRoll( results.rollId, { draindamage: drainbase, finaldrain: finaldraintxt, @@ -7495,6 +7574,8 @@ on('clicked:matrixattack', (info) => { myonchange = myonchange.concat("-rating"); changelist += myonchange; }); + console.log('changelist'); + console.log(changelist); on(changelist, function(eventinfo) { let myutil=eventinfo["sourceAttribute"].split("-")[0]; var myrating=myutil.concat("-rating"); @@ -7754,15 +7835,18 @@ on("change:deckattacklevel", function() { const attacktn =matrixtn[code][targeticon]; var senddata="{{senddata=[[0]]}}"; var myroll="&{template:matrix}{{myname=" + name + "}}"; + var action=lang["attack"]; if ( icmode=="proactive" ) { ictest=attacktn; } else if ( ictype == "Probe" ) { ictest="@{target|" + lang["decker"] + "|deck-detection-final}"; senddata=""; + action=lang["probe"]; } else { ictest="?{" + lang["utility-rating"] + "?|6}"; } const payload = { + wdmg: matrixtn[code]["wdmg"], attacker: name, power: rating, attribute: "deck-" + targetatt + "-final", @@ -7783,8 +7867,9 @@ on("change:deckattacklevel", function() { myroll+=senddata; myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}"; myroll+="{{basetn=[[" + myatt + "]]}}"; - myroll+="{{action=" + mytitle + "}}" + myroll+="{{action=" + action + "}}" myroll+="{{roll= [[ [[" + calcDice + "]]d6>[[ {2,(" + calcTN + ")}kh1]]!! ]] }}" + if ( icmode=="proactive" ) myroll+="{{wdmg=[[" + matrixtn[code]["wdmg"] + "]]}}"; if (( ictype == "Tar Baby") || (ictype == "Tar pit")) { myroll="/w gm &{template:matrix}{{myname=" + name + "}}"; myroll += "{{target=@{target|" + lang["decker"] + "|token_name}}}"; @@ -7797,10 +7882,14 @@ on("change:deckattacklevel", function() { myroll += "{{sensor=[[[[@{target|" + lang["decker"] + "|deck-sensors-final}]]d6>[[" + rating + " + @{target|" + lang["decker"] + "|matrix-penalty} ]]!!]]}}"; } console.log(myroll); + const finalwdmg=(iclist["attack"].includes(ictype))? damagetable[matrixtn[code]["wdmg"]] : ""; + console.log('finalwdmg: ' + finalwdmg); startRoll(myroll, (results) => { payload["basetn"]=results.results.basetn.result; + payload["attacktest"]=results.results.roll.result; finishRoll( results.rollId, { + wdmg: finalwdmg, senddata: rollEscape.escape(payload), }); }); @@ -8498,7 +8587,7 @@ on("change:repeating_ic:ictype", function(eventinfo) { const ictarget=myrepeat + "_ictargettest" gets=[ictype]; console.log(gets); - attackic=["Killer", "Blaster", "Sparky", "Black Ic", "Scout", "Cerebropathic", "Psychotropic"] + attackic=["Killer", "Blaster", "Sparky", "blackiclethal", "Scout", "cerebropathic", "psychotropic", "blackicnonlethal"] getAttrs(gets, function(myval) { console.log(gets); const mytype=myval[ictype]; @@ -9248,7 +9337,7 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
{{myname}}: {{spellname}} vs. {{targetofspell}}
Rolling: {{computed::rolldice}}d6 vs. {{targetnumber}} = {{casttest}}
- {{#spelldamage}}
Force: {{castforce}} Damage: {{computed::spelldamage}}
+ {{#spelldamage}}
Force: {{castforce}} Damage: {{computed::spelldamage}}
{{/spelldamage}} {{#sorcerydice}}
@@ -9510,11 +9599,14 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
Rolling: {{rolldice}}d6 vs. {{computed::targetnumber}}
{{#hackingpool}}
Hacking Pool Dice: {{hackingpool}}
{{/hackingpool}} {{#description}}
{{description}}
{{/description}} -
{{action}}: {{computed::roll}}
+
{{action}}:: {{computed::roll}} {{computed::wdmg}}
+ {{#resist}}
Final Damage staged to {{computed::finaldamage}}
{{/resist}} + {{#debuff}}
{{debuff}} Reduce by {{computed::finaldamage}}
{{/debuff}} {{#senddata}}
{{target}}: [Resist](~selected|matrixresist||{{computed::senddata}})
{{/senddata}} {{#oppose}}
Utility Test {{oppose}}
{{/oppose}} {{#sensor}}
Sensor Test {{sensor}}
{{/sensor}} + {{#blackic}}
[{{blackic}} Resist](~selected|resistroll||{{computed::payload}})
{{/blackic}} {{#notes}}
{{notes}}
{{/notes}} {{#notes2}}
{{notes2}}
{{/notes2}} {{#detect}}
{{target}}: {{detect}}
{{/detect}} diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index 9f20cd45bb..9fed8f89a0 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -57,6 +57,7 @@ "direction": "Direction", "meters-away": "Meter Away", "power-reduced-by-1-each": "Power Reduced by 1 Each", + "reduce-by": "Reduce by", "rigger": "Rigger", "combat": "Combat", "cyberware": "cyberware", @@ -711,7 +712,8 @@ "ripper": "Ripper", "sparky": "Sparky", "tar-pi": "Tar pit", - "black-ic": "Black Ic", + "black-ic-lethal": "Black IC Lethal", + "black-ic-non-lethal": "Black IC Non-Lethal", "data-bomb": "Data Bomb", "pavlov": "Pavlov", "scout": "Scout", From a29eb3b8a75155657aa4900ab2c5ef1efc89e6b1 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Fri, 24 Sep 2021 18:32:35 -0400 Subject: [PATCH 41/49] non lethal ic now does stun damage --- Shadowrun3e/shadowrun3e.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 1a4d077510..748b812ce0 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -5801,7 +5801,7 @@ on('clicked:matrixattack', (info) => { const ammomods = { blackiclethal: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, - blackicnonlethal: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, + blackicnonlethal: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:9, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, cerebropathic: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, psychotropic: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, d: { armorname: "'impact'", armor: "impact", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, From 7af65dea1bdb870eb09df339cc030b8fcce3f697 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Sat, 25 Sep 2021 08:50:49 -0400 Subject: [PATCH 42/49] added blackhammer and killjoy to blackice logic so they trigger physical/stun resit tests using hardening for armor --- Shadowrun3e/shadowrun3e.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 748b812ce0..44d4368e77 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -5239,7 +5239,7 @@ deckingtabs.forEach(tab => { }); const iclist = { - blackic: ["blackiclethal", "cerebropathic", "psychotropic", "blackicnonlethal"], + blackic: ["blackiclethal", "cerebropathic", "psychotropic", "blackicnonlethal", "deckblackhammer", "deckkilljoy"], debuff: ["Crippler", "Ripper"], attack: ["Killer", "Blaster", "Sparky", "blackiclethal", "cerebropathic", "psychotropic", "blackicnonlethal"], proactive: ["Crippler", "Ripper", "Killer", "Blaster", "Sparky", "Scout", "blackiclethal", "cerebropathic", "psychotropic", "blackicnonlethal", "Trace"], @@ -5290,7 +5290,7 @@ on('clicked:matrixattack', (info) => { attacker: myval["character_name"], attacktest: finaldice, power: results.results.utilitylevel.result, - attacktype: "cybercombat", + attacktype: myammo, attribute: "deck-bod-final" } finishRoll( results.rollId, @@ -5800,6 +5800,8 @@ on('clicked:matrixattack', (info) => { } const ammomods = { + deckblackhammer: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, + deckkilljoy: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:9, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, blackiclethal: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, blackicnonlethal: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:9, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, cerebropathic: { armorname: "'hardening'", armor: "hardening", av: 0, power: 0, rpower: 0, dmg: 0, rdmg:0, recoil: 0, barrier: 0, knockdown: 0 , amsg: ""}, From 170e6fef7c84bbd4ae07d713a65472e709f52df5 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Sat, 25 Sep 2021 10:12:10 -0400 Subject: [PATCH 43/49] changed button icons for matrix attacks and sensors --- Shadowrun3e/shadowrun3e.css | 2 ++ Shadowrun3e/shadowrun3e.html | 53 ++++++++++++------------------------ Shadowrun3e/translation.json | 1 - 3 files changed, 20 insertions(+), 36 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index e6b2e1d1b5..fb27fe386d 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -1084,6 +1084,8 @@ min-width: 0; .pictos-custom-button { font-family: 'Pictos Custom'; + font-size: 22px; + height: 80%; } .d6-button { diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 44d4368e77..873c4cab35 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -2049,10 +2049,9 @@
-
+
-
+
Black Hammer
@@ -2061,12 +2060,9 @@
-
-
-
+
+
+
Killjoy
@@ -2075,8 +2071,7 @@
-
+
-
-
-
+
+
+
@@ -2107,12 +2099,9 @@
-
-
-
+
+
+
@@ -3435,18 +3424,12 @@
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index 9fed8f89a0..31c5565bb2 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -937,5 +937,4 @@ "extreme": "extreme", "ic-rating": "IC Rating", "drain-modifiers": "Drain Modifiers" - } From 705b9f9f44cc178a897066173564247e12a734c9 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Sat, 25 Sep 2021 13:01:59 -0400 Subject: [PATCH 44/49] added medic roll to matrix --- Shadowrun3e/shadowrun3e.html | 113 +++++++++++++++++++---------------- 1 file changed, 60 insertions(+), 53 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 873c4cab35..ad5e3ab865 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -1688,15 +1688,17 @@
Combat TN
-
Resist
+
Resist
-
Medic
+
Medic
Decking
+
Hardening
+
+
Armor
+

@@ -1925,10 +1927,8 @@
-
-
+
+
Track
@@ -1937,10 +1937,8 @@
-
-
+
+
@@ -1963,10 +1961,8 @@
-
-
+
+
Cloak
@@ -1975,8 +1971,7 @@
-
+
@@ -1987,8 +1982,7 @@
-
+
@@ -1996,13 +1990,10 @@
-
+
-
-
+
+
@@ -2014,8 +2005,7 @@
-
+
@@ -2050,7 +2040,7 @@ value=1>
-
+
Black Hammer
@@ -2061,7 +2051,7 @@ value=1>
-
+
Killjoy
@@ -2072,10 +2062,8 @@ value=1>
-
-
+
+
Slow
@@ -2084,8 +2072,8 @@
-
-
+
+
@@ -2100,7 +2088,7 @@
-
+
@@ -2136,10 +2124,8 @@
-
-
+
+
@@ -5253,6 +5239,7 @@ on('clicked:matrixattack', (info) => { myroll+="{{myname=@{character_name}}} {{target=@{target|" + lang["target"] +"|token_name}}}{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "|0}]]}}"; myroll+="{{utilitylevel=@{deckattack-rating-final}}}"; myroll+="{{utilitylevel=[[@{" + myid + "-rating-final}]]}}" + myroll+="{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "}]]}}" console.log(myroll); startRoll(myroll, (results) => { if ( results.results.iconstatus.result == 0) myicon="Legitimate"; @@ -5291,18 +5278,36 @@ on('clicked:matrixattack', (info) => { console.log(info); const myid=info["htmlAttributes"]["id"] const mytitle=info["htmlAttributes"]["title"] - var calcTN="?{" + lang["wound-level"] + "?|" + lang["light"] + ",4|" + lang["moderate"] + ",5|" + lang["serious"] + ",6}"; - var calcDice="@{deckmedic-rating-final}" - var myroll="&{template:matrix}" - myroll+="{{action=Medic Utility}}" - myroll+="{{rolldice=[[" + calcDice + "]]}}" - myroll+="{{targetnumber=[[" + calcTN + "]]}}"; - myroll+="{{myname=@{character_name}}}{{target=?{" + lang["wound-level"] + "?}" + lang["damage"] + "}}{{hackingpool=Not Available}}" - myroll+="{{utilitylevel=@{deckmedic-rating-final}}}" - myroll+="{{roll= [[ [[ " + calcDice + "]]d6>[[ {2,( " + calcTN + ")}kh1 ]]!! ]] }}" - console.log(myroll); - startRoll(myroll, (results) => { - finishRoll( results.rollId); + getAttrs(["matrix-damage", "matrix-penalty", "deckmedic-rating-final"], function(myval) { + const pentn=parseInt(myval["matrix-penalty"]) + 3; + const dmg=myval["matrix-damage"]; + var medicrating=parseInt(myval["deckmedic-rating-final"]); + var calcTN=pentn; + var calcDice=medicrating + " + ?{" + lang["hacking-pool-dice"] + "|0}" + var myroll="&{template:matrix}" + myroll+="{{action=Medic Utility}}" + myroll+="{{matrixdmg=[[" + dmg + "]]}}"; + myroll+="{{rolldice=[[" + calcDice + "]]}}" + myroll+="{{targetnumber=[[" + calcTN + "]]}}"; + myroll+="{{myname=@{character_name}}}{{target=" + pentn +"}}"; + myroll+="{{utilitylevel=@{deckmedic-rating-final}}}" + myroll+="{{roll= [[ [[ " + calcDice + "]]d6>[[ {2,( " + calcTN + ")}kh1 ]]!! ]] }}" + myroll+="{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "}]]}}" + console.log(myroll); + startRoll(myroll, (results) => { + sets={}; + updatepoolused("hackingpool", results.results.hackingpool.result); + medicrating -= 1; + var finaldmg = dmg - results.results.roll.result; + finaldmg = (finaldmg < 1 )? 0: finaldmg; + sets["matrix-damage"]=finaldmg; + sets["deckmedic-rating-final"]=medicrating; + setAttrs(sets); + finishRoll( results.rollId, + { + matrixdmg: finaldmg, + }); + }); }); }); @@ -9596,6 +9601,8 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"] {{#notes2}}
{{notes2}}
{{/notes2}} {{#detect}}
{{target}}: {{detect}}
{{/detect}} {{#clickme}}
{{clickme}}
{{/clickme}} + {{#matrixdmg}}
+ {{computed::roll}} 1
{{/matrixdmg}}
From 16f3523512907c31968202c488db0635a511edc9 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Mon, 27 Sep 2021 07:45:45 -0400 Subject: [PATCH 45/49] minor change to matrix roll-template formating --- Shadowrun3e/shadowrun3e.css | 10 +++++++++- Shadowrun3e/shadowrun3e.html | 16 ++++++++++------ Shadowrun3e/translation.json | 2 ++ 3 files changed, 21 insertions(+), 7 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index fb27fe386d..714b53c8ca 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -475,6 +475,7 @@ input:checked+.slider:before { column-gap: 5px; } +.deck-combat-system2 span, .deck-memory-used span, .dicepool span { background-color: white; @@ -1082,10 +1083,17 @@ min-width: 0; font-family: 'Pictos'; } +.pictos-custom-attack, .pictos-custom-button { font-family: 'Pictos Custom'; font-size: 22px; height: 80%; + padding-right: unset; + padding-left: unset; +} +.pictos-custom-attack { + padding-top: 4px; + padding-bottom: 4px; } .d6-button { @@ -2519,7 +2527,7 @@ input.enable-fa:not(:checked)~span.show_fa_dice { display: grid; align-items: center; text-align: right; - grid-template-columns: auto 20px 20px auto 20px 20px auto 20px 20px auto 20px 1fr; + grid-template-columns: auto 20px 20px auto 20px 20px auto 20px 20px auto 20px 20px auto 20px 20px auto 20px 20px auto 20px 1fr; } .hack-pool-option { display: grid; diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index ad5e3ab865..9bed72a42e 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -1688,9 +1688,11 @@
Combat TN
-
Resist
+
Attack>
-
Medic
+
Resist
+
+
Medic
Decking
@@ -4628,6 +4630,8 @@ deckingtabs.forEach(tab => { lang["deadly-stun"] = getTranslationByKey("deadly-stun"); lang["damage"] = getTranslationByKey("damage"); lang["wound-level"] = getTranslationByKey("wound-level"); + lang["system-operation-with"] = getTranslationByKey("system-operation-with"); + lang["utility"] = getTranslationByKey("utility"); lang["utility-test"] = getTranslationByKey("utility-test"); lang["utility-rating"] = getTranslationByKey("utility-rating"); lang["yes"] = getTranslationByKey("yes"); @@ -4996,7 +5000,7 @@ deckingtabs.forEach(tab => { calcDice="@{decking} + ?{" + lang["hacking-pool-dice"] + "}"; } else if ( myid == "matrixrepeatingexec" ) { console.log('utiltarget ' + myutiltarget); - action="{{action=" + lang["system-operation-with"] + " " + myutilvalue + " " + lang["utility"] + "}}"; + action="{{action=" + lang["system-operation-with"] + " " + myutilvalue + " }}"; target = "{{target=@{target|" + lang["target"] +"|token_name}}}"; calcTN= myutiltarget + " + floor(@{target|" + lang["target"] +"|matrixalert}/2) + @{wound_pen} + @{stun_pen} +@{matrix-penalty} - " + myratingvalue; calcDice="@{decking} + ?{" + lang["hacking-pool-dice"] + "}"; @@ -9589,7 +9593,7 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
Rolling: {{rolldice}}d6 vs. {{computed::targetnumber}}
{{#hackingpool}}
Hacking Pool Dice: {{hackingpool}}
{{/hackingpool}} {{#description}}
{{description}}
{{/description}} -
{{action}}:: {{computed::roll}} {{computed::wdmg}}
+
{{action}} {{utilitylevel}}: {{computed::roll}} {{computed::wdmg}}
{{#resist}}
Final Damage staged to {{computed::finaldamage}}
{{/resist}} {{#debuff}}
{{debuff}} Reduce by {{computed::finaldamage}}
{{/debuff}} {{#senddata}}
{{target}}: @@ -9601,8 +9605,8 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"] {{#notes2}}
{{notes2}}
{{/notes2}} {{#detect}}
{{target}}: {{detect}}
{{/detect}} {{#clickme}}
{{clickme}}
{{/clickme}} - {{#matrixdmg}}
- {{computed::roll}} 1
{{/matrixdmg}} + {{#matrixdmg}}
{{matrixdmg}} {{computed::roll}}{{/matrixdmg}} + {{#matrixdmg}}
{{utilitylevel}} 1
{{/matrixdmg}}
diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index 31c5565bb2..ca4ff49275 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -95,6 +95,7 @@ "astral-pool-dice": " Astral Pool", "task-pool-dice": " Task Pool Dice", "physical-damage-overflow": "Physical Damage Overflow", + "damage-reduced-by": "Damage Reduced by", "initiative-natural": "Init Nat.", "initiative-augmented": "Init. Aug.", "initiative-physical": "Init. Phy.", @@ -443,6 +444,7 @@ "pilot": "Pilot", "utility-rating-sum": "Utility Rating Sum", "utility-rating": "Utility Rating", + "utility-rating-reduced-by": "Utility Rating Reduced by", "special-utilities": "Special Utilities", "utility": "Utility", "multiple": "Multiplier", From f037399c981f1f34536229e37f4a3e47d02fd31b Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Mon, 27 Sep 2021 10:14:24 -0400 Subject: [PATCH 46/49] added oppose roll for matrix maneuevers --- Shadowrun3e/shadowrun3e.html | 39 +++++++++++++++++++++++++++++------- Shadowrun3e/translation.json | 2 ++ 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 9bed72a42e..0e19791a2b 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -4580,6 +4580,7 @@ deckingtabs.forEach(tab => { var lang={} on("sheet:opened", function() { + lang["blackic"] = getTranslationByKey("black-ic"); lang["blackiclethal"] = getTranslationByKey("black-ic-lethal"); lang["blackicnonlethal"] = getTranslationByKey("black-ic-non-lethal"); lang["cerebropathic"] = getTranslationByKey("cerebropathic"); @@ -5374,23 +5375,47 @@ on('clicked:matrixattack', (info) => { }); on('clicked:matrixmaneuvers', (info) => { - const mytitle=info["htmlAttributes"]["title"] - const myid=info["htmlAttributes"]["id"] - var myutil="@{deckcloak-rating-final}"; - var myatt="deck-evasion-final"; + atts=["character_name", "deck-evasion-final", "deckcloak-rating-final" + getAttrs(atts, function(myval) { + var payload; + if ( info["originalRollId"] != undefined ) { + payload=rollEscape.unescape(info["originalRollId"]); + } + if (payload != null ) console.log('payload'); + console.log(payload); + const mytitle=info["htmlAttributes"]["title"] + const myid=info["htmlAttributes"]["id"] + var myutil="@{deckcloak-rating-final}"; + var myatt="deck-evasion-final"; if ( mytitle == "Evade Detection" ) myatt = "deck-sensors-final"; if ( mytitle == "Parry Attack" ) myutil = "@{decklockon-rating-final}"; if ( mytitle == "Sensor Test" ) myutil = "@{decklockon-rating-final}"; var calcTN="@{target|" + lang["target"] +"|" + myatt + "} + @{wp-matrix} +?{" + lang["miscellaneous-modifiers"] + "|0} - " + myutil; var calcDice="@{decking} + ?{" + lang["hacking-pool-dice"] + "}" var myroll="&{template:matrix}{{myname=@{character_name}}}{{target=@{target|" + lang["target"] +"|token_name}}}{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "|0}]]}}" + if (payload == null) myroll+="{{senddata2=[[0]]}}{{winner=[[0]]}}"; + else myroll+="{{testresult=[[0]]}}"; myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}"; myroll+="{{action=" + mytitle + "}}" + myroll+="{{targetname=@{target|" + lang["target"] + "|character_name}}" myroll+="{{roll= [[ [[" + calcDice + "]]d6>[[ {2,(" + calcTN + ")}kh1]]!! ]] }}" myroll+="{{detect=[Detect](~@{target|" + lang["target"] +"|token_name}|detection)}}" + var payload={}; startRoll(myroll, (results) => { updatepoolused("hackingpool", results.results.hackingpool.result); - finishRoll( results.rollId); + if ( payload == null) { + payload={successes: results.results.roll.result, attacker: }; + finishRoll( results.rollId, + { + senddata2: rollEscape.escape(payload), + }); + } else { + finishRoll( results.rollId, + const delta = payload["successes"] - + { + testresult: rollEscape.escape(payload), + }); + } }); }); on('clicked:adeptpower', (info) => { @@ -9596,8 +9621,8 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
{{action}} {{utilitylevel}}: {{computed::roll}} {{computed::wdmg}}
{{#resist}}
Final Damage staged to {{computed::finaldamage}}
{{/resist}} {{#debuff}}
{{debuff}} Reduce by {{computed::finaldamage}}
{{/debuff}} - {{#senddata}}
{{target}}: - [Resist](~selected|matrixresist||{{computed::senddata}})
{{/senddata}} + {{#senddata}}
{{target}}: [Resist](~selected|matrixresist||{{computed::senddata}})
{{/senddata}} + {{#senddata2}}
{{target}}: [Oppose](~{{targetname}}|matrixmaneuvers||{{computed::senddata2}})
{{/senddata2}} {{#oppose}}
Utility Test {{oppose}}
{{/oppose}} {{#sensor}}
Sensor Test {{sensor}}
{{/sensor}} {{#blackic}}
[{{blackic}} Resist](~selected|resistroll||{{computed::payload}})
{{/blackic}} diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index ca4ff49275..8a9b4109fe 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -714,6 +714,7 @@ "ripper": "Ripper", "sparky": "Sparky", "tar-pi": "Tar pit", + "black-ic": "Black IC", "black-ic-lethal": "Black IC Lethal", "black-ic-non-lethal": "Black IC Non-Lethal", "data-bomb": "Data Bomb", @@ -725,6 +726,7 @@ "detection-factor": "DetectionFactor", "computer-skill": "Computer Skill", "utility-target-number-abbreviation": "Utility TN", + "oppose": "Oppose", "mpcp": "MPCP", "rapid-settings-system-rating": "Rapid Settings System Rating", "apply": "Apply", From 95d08f5e97b251e9ecf538da9a077058b97e62e4 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Tue, 28 Sep 2021 10:42:22 -0400 Subject: [PATCH 47/49] fixed bugs and added opposite roll for matrix combat manueveurs --- Shadowrun3e/shadowrun3e.html | 120 ++++++++++++++++++++--------------- Shadowrun3e/translation.json | 1 + 2 files changed, 70 insertions(+), 51 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index 0e19791a2b..d44ae15fbf 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -1674,22 +1674,16 @@ name=attr_deck-reaction-final> -
End Turn
-
Sensor
-
Evade
-
Parry
+
End Turn
+
Attack>
+
Evade
+
Parry
Posistion
Combat TN
-
Attack>
-
Resist
Medic
@@ -5375,47 +5369,65 @@ on('clicked:matrixattack', (info) => { }); on('clicked:matrixmaneuvers', (info) => { - atts=["character_name", "deck-evasion-final", "deckcloak-rating-final" + atts=["character_name", "deck-evasion-final", "deck-sensors-final", "decklockon-rating-final", "deckcloak-rating-final", "wp-matrix", "decking"]; getAttrs(atts, function(myval) { - var payload; - if ( info["originalRollId"] != undefined ) { - payload=rollEscape.unescape(info["originalRollId"]); - } - if (payload != null ) console.log('payload'); - console.log(payload); - const mytitle=info["htmlAttributes"]["title"] const myid=info["htmlAttributes"]["id"] - var myutil="@{deckcloak-rating-final}"; - var myatt="deck-evasion-final"; - if ( mytitle == "Evade Detection" ) myatt = "deck-sensors-final"; - if ( mytitle == "Parry Attack" ) myutil = "@{decklockon-rating-final}"; - if ( mytitle == "Sensor Test" ) myutil = "@{decklockon-rating-final}"; - var calcTN="@{target|" + lang["target"] +"|" + myatt + "} + @{wp-matrix} +?{" + lang["miscellaneous-modifiers"] + "|0} - " + myutil; - var calcDice="@{decking} + ?{" + lang["hacking-pool-dice"] + "}" - var myroll="&{template:matrix}{{myname=@{character_name}}}{{target=@{target|" + lang["target"] +"|token_name}}}{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "|0}]]}}" - if (payload == null) myroll+="{{senddata2=[[0]]}}{{winner=[[0]]}}"; - else myroll+="{{testresult=[[0]]}}"; - myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}"; - myroll+="{{action=" + mytitle + "}}" - myroll+="{{targetname=@{target|" + lang["target"] + "|character_name}}" - myroll+="{{roll= [[ [[" + calcDice + "]]d6>[[ {2,(" + calcTN + ")}kh1]]!! ]] }}" - myroll+="{{detect=[Detect](~@{target|" + lang["target"] +"|token_name}|detection)}}" - var payload={}; - startRoll(myroll, (results) => { - updatepoolused("hackingpool", results.results.hackingpool.result); - if ( payload == null) { - payload={successes: results.results.roll.result, attacker: }; - finishRoll( results.rollId, - { - senddata2: rollEscape.escape(payload), - }); - } else { - finishRoll( results.rollId, - const delta = payload["successes"] - - { - testresult: rollEscape.escape(payload), - }); - } + var mytitle=info["htmlAttributes"]["title"] + const evasion=myval["deck-evasion-final"]; + const sensors=myval["deck-sensors-final"]; + const cloak=myval["deckcloak-rating-final"]; + const lockon=myval["decklockon-rating-final"]; + const wpmatrix=myval["wp-matrix"]; + const decking=myval["decking"]; + if ( info["originalRollId"] != undefined ) var payload=rollEscape.unescape(info["originalRollId"]); + var calcDice=evasion + " + ?{" + lang["hacking-pool-dice"] + "}"; + var calcTN="@{target|" + lang["target"] +"|deck-sensors-final} + " + wpmatrix + " +?{" + lang["miscellaneous-modifiers"] + "|0} - " + cloak; + if (payload != null ) { + console.log('payload'); + console.log(payload); + mytitle=payload["attacktype"]; + calcDice=sensors + " + ?{" + lang["hacking-pool-dice"] + "}"; + calcTN="@{target|" + lang["target"] +"|deck-evasion-final} + " + wpmatrix + " +?{" + lang["miscellaneous-modifiers"] + "|0} - " + lockon; + } + var myroll="&{template:matrix}"; + if (payload == null) myroll+="{{senddata2=[[0]]}}"; + else myroll+="{{testresult=[[0]]}}{{winner=[[0]]}}"; + myroll+="{{mytoken=[[0[@{selected|token_name}]]]}}"; + myroll+="{{myname=@{selected|token_name}}}"; + myroll+="{{target=@{target|" + lang["target"] +"|token_name}}}{{hackingpool=[[?{" + lang["hacking-pool-dice"] + "|0}]]}}"; + myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}"; + myroll+="{{action=" + mytitle + "}}"; + myroll+="{{targetname=@{target|" + lang["target"] + "|character_name}}}"; + myroll+="{{roll= [[ [[" + calcDice + "]]d6>[[ {2,(" + calcTN + ")}kh1]]!! ]] }}"; + console.log(myroll); + startRoll(myroll, (results) => { + const mytoken=results.results.mytoken.expression.match(/\[(.*)\]/)[1]; + updatepoolused("hackingpool", results.results.hackingpool.result); + if ( payload == null) { + payload={ + successes: results.results.roll.result, + attacker: mytoken, + attacktype: mytitle + " Oppose" + }; + finishRoll( results.rollId, + { + senddata2: rollEscape.escape(payload), + }); + } else { + console.log('payload success is ' + payload["successes"]); + var delta = payload["successes"] - results.results.roll.result; + console.log('delta is ' + delta); + const mywinner=(delta > 0)? payload["attacker"]: (delta < 0)? mytoken : "none"; + console.log('winner is ' + mywinner); + delta=(delta < 0)? (delta * -1) : delta; + console.log('delta is ' + delta); + finishRoll( results.rollId, + { + testresult: delta, + winner: mywinner, + }); + } + }); }); }); on('clicked:adeptpower', (info) => { @@ -7676,9 +7688,15 @@ on(utilsizechange, function(info) { on("change:matrixsecurityrating", function() { console.log('change of sec rating'); + const atlist=["deck-bod-max", "deck-evasion-max", "deck-masking-max", "deck-sensors-max", "deck-mpcp-max", "deck-detection-max", "decking"]; getAttrs(["matrixsecurityrating"], function(myval) { + sets={}; let sr = parseInt(myval["matrixsecurityrating"]); - setAttrs({"deck-bod-max":sr, "deck-evasion-max":sr, "deck-masking-max":sr, "deck-sensors-max":sr, "deck-mpcp-max":sr, "deck-detection-max":sr}); + atlist.forEach(at=> { + sets[at]=sr; + }); + console.log(sets); + setAttrs(sets); }); }); @@ -9627,7 +9645,7 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"] {{#sensor}}
Sensor Test {{sensor}}
{{/sensor}} {{#blackic}}
[{{blackic}} Resist](~selected|resistroll||{{computed::payload}})
{{/blackic}} {{#notes}}
{{notes}}
{{/notes}} - {{#notes2}}
{{notes2}}
{{/notes2}} + {{#winner}}
Winner {{computed::winner}} : {{computed::testresult}}
{{/winner}} {{#detect}}
{{target}}: {{detect}}
{{/detect}} {{#clickme}}
{{clickme}}
{{/clickme}} {{#matrixdmg}}
{{matrixdmg}} {{computed::roll}}{{/matrixdmg}} diff --git a/Shadowrun3e/translation.json b/Shadowrun3e/translation.json index 8a9b4109fe..8f9c20e446 100644 --- a/Shadowrun3e/translation.json +++ b/Shadowrun3e/translation.json @@ -21,6 +21,7 @@ "age": "Age", "height": "Height", "weight": "Weight", + "winner": "Winner", "spirit-type": "Spirit Type", "watcher": "Watcher", "air-elemental": "Air Elemental", From 634896c931e040a3e15e9db191494e6aa7fef2e7 Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Tue, 28 Sep 2021 10:46:08 -0400 Subject: [PATCH 48/49] updated README.MD --- Shadowrun3e/README.MD | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Shadowrun3e/README.MD b/Shadowrun3e/README.MD index bdd1c98475..cb95447748 100644 --- a/Shadowrun3e/README.MD +++ b/Shadowrun3e/README.MD @@ -1,6 +1,6 @@ # Shadowrun 3rd Edition -## Release Notes 9/18/2021 +## Release Notes 9/28/2021 ### changes/bug fixes 1. Tar Pit ad Tar baby: when using the "execute" button it will roll the Opposed test between the ic ratin and the utility as well as a sensor test. The resutls of the three rolls will be whispered to the GM. @@ -16,9 +16,10 @@ If "full defense" was chosen, the defender will also be presented with a "dodge" 10. added chat button after magic attack or spell defense to resist spell. Resistance is based on attribute if not an elemental spell, in which case resistance is 1/2 impact. 11. All chat buttons published after magic attack roll template pass the value of the original roll to prepopulate most of the roll questions. 12. Resist and Dodge buttons presented after ranged attack roll template will pass value of original roll to dodge and resist rolls. -13. Added translation tags for all html elements. +13. Added translation tags for all html elements and rolls 14. removed the use of case statements 15. switched from show/hide buttons to tabs for sub tabs +16. fixed bugs and added opposed roll for Matrix Combat Manuevers ### Impact on existing characters. From ae1b971f8933e2bf9ae9957c2dee3b1136d1866c Mon Sep 17 00:00:00 2001 From: Brad Hornbeck Date: Tue, 28 Sep 2021 12:39:36 -0400 Subject: [PATCH 49/49] formatted aeo spell template --- Shadowrun3e/shadowrun3e.css | 9 ++++ Shadowrun3e/shadowrun3e.html | 95 +++++++++++++++++++++++++++--------- 2 files changed, 81 insertions(+), 23 deletions(-) diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index 714b53c8ca..f02005291d 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -979,6 +979,13 @@ min-width: 0; grid-template-columns: auto auto auto auto auto auto auto; } +.sheet-rolltemplate-spell div.sheet-spell-pool-table { + display: grid; + align-items: center; + text-align: center; + grid-template-columns: auto auto; +} + .char-attributes { display: grid; grid-template-columns: 80px 70px 70px 55px; @@ -1201,6 +1208,7 @@ min-width: 0; .sheet-rolltemplate-spell div.sheet-conjure-resist-table:nth-child(odd), .sheet-rolltemplate-spell div.sheet-spell-resist-table:nth-child(odd), +.sheet-rolltemplate-spell div.sheet-spell-pool-table:nth-child(odd), .sheet-rolltemplate-info div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-item div.sheet-rtrow:nth-child(odd), .sheet-rolltemplate-vehicle div.sheet-rtrow:nth-child(odd), @@ -1226,6 +1234,7 @@ min-width: 0; .sheet-rolltemplate-spell div.sheet-conjure-resist-table:nth-child(even), .sheet-rolltemplate-spell div.sheet-spell-resist-table:nth-child(even), +.sheet-rolltemplate-spell div.sheet-spell-pool-table:nth-child(even), .sheet-rolltemplate-item div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-info div.sheet-rtrow:nth-child(even), .sheet-rolltemplate-vehicle div.sheet-rtrow:nth-child(even), diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index d44ae15fbf..3e9b5dd425 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -4574,6 +4574,11 @@ deckingtabs.forEach(tab => { var lang={} on("sheet:opened", function() { + geti18n(); + }); + + const geti18n = function() { + console.log('calling i18n for roll query'); lang["blackic"] = getTranslationByKey("black-ic"); lang["blackiclethal"] = getTranslationByKey("black-ic-lethal"); lang["blackicnonlethal"] = getTranslationByKey("black-ic-non-lethal"); @@ -4693,7 +4698,7 @@ deckingtabs.forEach(tab => { lang["update-gunnery-and-control-pool"] = getTranslationByKey("update-gunnery-and-control-pool"); lang["set-decker-for-security-tally"] = getTranslationByKey("set-decker-for-security-tally"); console.log(lang); - }); + }; console.log('loading rangedweapons stats'); const rangedstats = { @@ -4756,6 +4761,7 @@ deckingtabs.forEach(tab => { }; on('clicked:jackin', function(info) { + if (!("yes" in lang)) geti18n(); console.log(info); getAttrs(["matrix-status"], function(myval) { var sets={}; @@ -4831,6 +4837,7 @@ deckingtabs.forEach(tab => { }); on('clicked:missed', (info) => { + if (!("yes" in lang)) geti18n(); payload=rollEscape.unescape(info["originalRollId"]); myroll="/w gm &{template:info}{{character=" + payload["target"] +"}}{{action=" + lang["missed-msg"]+"}}"; startRoll(myroll, (results) => { @@ -4839,6 +4846,7 @@ deckingtabs.forEach(tab => { }); on('clicked:spellblocked', (info) => { + if (!("yes" in lang)) geti18n(); payload=rollEscape.unescape(info["originalRollId"]); myroll="/w gm &{template:info}{{character=" + payload["target"] +"}}{{action=" + lang["spellblocked-msg"] +"}}"; startRoll(myroll, (results) => { @@ -4847,6 +4855,7 @@ deckingtabs.forEach(tab => { }); on('clicked:repeating_gear:usegear', (info) => { + if (!("yes" in lang)) geti18n(); var atts=[]; var source=info['sourceAttribute'].split('_'); var sourceattr=source.pop(); @@ -4886,6 +4895,7 @@ deckingtabs.forEach(tab => { }); on('clicked:repeating_credsticks:checkcredstick', (info) => { + if (!("yes" in lang)) geti18n(); var atts=[]; var source=info['sourceAttribute'].split('_'); var sourceattr=source.pop(); @@ -4908,6 +4918,7 @@ deckingtabs.forEach(tab => { }); on('clicked:repeating_skills:skills', (info) => { + if (!("yes" in lang)) geti18n(); const attrlist=["skillname", "skillrating", "pool"]; var atts=["character_name"]; var source=info['sourceAttribute'].split('_'); @@ -4938,6 +4949,7 @@ deckingtabs.forEach(tab => { }); }); on('clicked:skilltest', (info) => { + if (!("yes" in lang)) geti18n(); var [myskill,mypool]=info["htmlAttributes"]["id"].split(" "); var skill = myskill.charAt(0).toUpperCase() + myskill.slice(1); var pool = mypool.charAt(0).toUpperCase() + mypool.slice(1); @@ -4966,6 +4978,7 @@ deckingtabs.forEach(tab => { on('clicked:repeating_defensiveutils:matrixrepeatingtest clicked:repeating_offensiveutils:matrixrepeatingtest clicked:repeating_deck-utilities:matrixrepeatingtest', (info) => { + if (!("yes" in lang)) geti18n(); var atts=[]; var source=info['sourceAttribute'].split('_'); const myid=info["htmlAttributes"]["id"] @@ -5020,6 +5033,7 @@ deckingtabs.forEach(tab => { }); on("clicked:setrigger", function(info) { + if (!("yes" in lang)) geti18n(); console.log(info); const myid=info["htmlAttributes"]["id"] var myroll="/w gm &{template:info}{{character=@{character_name}}}"; @@ -5053,6 +5067,7 @@ deckingtabs.forEach(tab => { }); on("clicked:repeating_intruders:settokenname", function(info) { + if (!("yes" in lang)) geti18n(); console.log(info); const source=info['sourceAttribute'].split('_'); const sourceattr=source.pop(); @@ -5079,6 +5094,7 @@ deckingtabs.forEach(tab => { }); on('clicked:matrixdetect', (info) => { + if (!("yes" in lang)) geti18n(); sets={}; console.log(info); const myid=info["htmlAttributes"]["id"]; @@ -5106,6 +5122,7 @@ deckingtabs.forEach(tab => { }); on('clicked:repeating_intruders:detect', (info) => { + if (!("yes" in lang)) geti18n(); sets={}; console.log(info); const myid=info["htmlAttributes"]["id"]; @@ -5139,6 +5156,7 @@ deckingtabs.forEach(tab => { }); on('clicked:matrixresist', (info) => { + if (!("yes" in lang)) geti18n(); var payload, myid, attacktest, wdmg; if ( info["htmlAttributes"]["id"] != undefined) { myid=info["htmlAttributes"]["id"]; @@ -5215,6 +5233,7 @@ const iclist = { }; on('clicked:matrixattack', (info) => { + if (!("yes" in lang)) geti18n(); const myid=info["htmlAttributes"]["id"] const mytitle=info["htmlAttributes"]["title"] console.log(info); @@ -5274,6 +5293,7 @@ on('clicked:matrixattack', (info) => { }); }); on('clicked:matrixmedic', (info) => { + if (!("yes" in lang)) geti18n(); console.log(info); const myid=info["htmlAttributes"]["id"] const mytitle=info["htmlAttributes"]["title"] @@ -5311,6 +5331,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:swapmemory clicked:repeating_defensiveutils:swapmemory clicked:repeating_offensiveutils:swapmemory clicked:repeating_deck-utilities:swapmemory', (info) => { + if (!("yes" in lang)) geti18n(); console.log(info); var sets={}; var atts=[]; @@ -5348,6 +5369,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:matrixtest', (info) => { + if (!("yes" in lang)) geti18n(); var atts=[]; if ( info['sourceAttribute'] ) console.log(' got ' + info['sourceAttribute'] ); /* var source=info['sourceAttribute'].split('_'); @@ -5369,6 +5391,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:matrixmaneuvers', (info) => { + if (!("yes" in lang)) geti18n(); atts=["character_name", "deck-evasion-final", "deck-sensors-final", "decklockon-rating-final", "deckcloak-rating-final", "wp-matrix", "decking"]; getAttrs(atts, function(myval) { const myid=info["htmlAttributes"]["id"] @@ -5431,6 +5454,7 @@ on('clicked:matrixattack', (info) => { }); }); on('clicked:adeptpower', (info) => { + if (!("yes" in lang)) geti18n(); const mytitle=info["htmlAttributes"]["title"] const myid=info["htmlAttributes"]["id"] const uppermyid=myid.charAt(0).toUpperCase() + myid.slice(1); @@ -5489,6 +5513,7 @@ on('clicked:matrixattack', (info) => { }; on('clicked:repeating_spells:cast', (info) => { + if (!("yes" in lang)) geti18n(); var atts=["character_name", "magic", "spellpool-used", "sorcery-used", "astralstate"]; var source=info['sourceAttribute'].split('_'); const myid=info["htmlAttributes"]["id"] @@ -5558,7 +5583,7 @@ on('clicked:matrixattack', (info) => { var calcDrainDice="@{willpower|max} + ?{" + lang["sorcery-dice-for-drain"] + "?} + ?{"+ lang["spell-pool-dice-for-drain"] +"?}"; myroll+="{{senddata=[[0]]}}"; myroll+="{{draindamage=[[0]]}}{{finaldrain=[[0]]}}"; - myroll+="{{cast=[[0]]}}"; + myroll+="{{cast=[[0]]}}{{draintnfinal=[[0]]}}"; myroll+="{{sorcerydice=[[?{"+ lang["sorcery-dice"] +"?|@{spellcasting}} + ?{" + lang["sorcery-dice-for-drain"] + "?|0}]]}}"; myroll+="{{spellpool=[[?{"+ lang["spell-pool-dice"] +"?|0} + ?{"+ lang["spell-pool-dice-for-drain"] +"?|0}]]}}"; myroll+="{{spelldamage=[[" + damage + "]]}}" @@ -5659,7 +5684,6 @@ on('clicked:matrixattack', (info) => { atts["spellpool-used"]= spused + parseInt(results.results.spellpool.result); if ( range == "AoE" ) { finalcast=payload["attackdice"]=results.results.roll.dice; - testinfo="NOT WORKING"; console.log('finalcast ' + finalcast); payload["attacktest"]=0; finishRoll( results.rollId, @@ -5669,7 +5693,7 @@ on('clicked:matrixattack', (info) => { draindamage: draindmg, finaldrain: myfinaldrain, cast: finalcast, - roll: testinfo, + draintnfinal: draintn, senddata: rollEscape.escape(payload), }); } else { @@ -5682,6 +5706,7 @@ on('clicked:matrixattack', (info) => { spelldamage: finaldmg, finaldrain: myfinaldrain, draindamage: draindmg, + draintnfinal: draintn, }); } @@ -5706,6 +5731,7 @@ on('clicked:matrixattack', (info) => { }; var initiative = function (init, reaction, dmgpen, mytitle, character) { + if (!("yes" in lang)) geti18n(); console.log('init ' + init + ' reaction ' + reaction + ' dmgpen ' + dmgpen + ' mytitle ' + mytitle + ' character ' + character ); penatts=["stun_pen", "wound_pen", "matrix-penalty", "vehicle-penalty", "rccommand-penalty", "rcsimsense-penalty", "rcsystem-penalty"]; getAttrs(penatts, function (myval) { @@ -5741,6 +5767,7 @@ on('clicked:matrixattack', (info) => { on('clicked:repeating_ic:init', (info) => { + if (!("yes" in lang)) geti18n(); gets=[]; var source=info['sourceAttribute'].split('_'); var sourceattr=source.pop(); @@ -5763,6 +5790,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:init', (info) => { + if (!("yes" in lang)) geti18n(); console.log(info); const mytitle=info["htmlAttributes"]["title"] const myid=info["htmlAttributes"]["id"] @@ -5798,6 +5826,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:endturn', (info) => { + if (!("yes" in lang)) geti18n(); var myroll="&{template:init} {{character=@{character_name}}}{{type=End Combat Pass}}" myroll += "{{setinit=[[10 &{tracker:-}]]}}" console.log(myroll); @@ -5809,6 +5838,7 @@ on('clicked:matrixattack', (info) => { on('clicked:resistbanish', (info) => { + if (!("yes" in lang)) geti18n(); const mytitle=info["htmlAttributes"]["title"] const myid=info["htmlAttributes"]["id"] var calcDice= "@{force}"; @@ -5858,6 +5888,7 @@ on('clicked:matrixattack', (info) => { } const resistdmg = function (myid, mods) { + if (!("yes" in lang)) geti18n(); atts=["ballistic", "impact", "armor-on", "deck-hardening"]; getAttrs(atts, function (myval) { const ballistic=myval["ballistic"]; @@ -5939,6 +5970,7 @@ on('clicked:matrixattack', (info) => { }; on('clicked:resistdmg', (info) => { + if (!("yes" in lang)) geti18n(); console.log(info); const mytitle=info["htmlAttributes"]["title"] const myid=info["htmlAttributes"]["id"] @@ -5947,6 +5979,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:checkaoe', (info) => { + if (!("yes" in lang)) geti18n(); const payload=rollEscape.unescape(info.originalRollId); const attacktype=payload["ammotype"].toLowerCase(); const basetn=payload["targetnumber"]; @@ -5992,6 +6025,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:resistspell', (info) => { + if (!("yes" in lang)) geti18n(); const payload=rollEscape.unescape(info.originalRollId); console.log(payload); const attribute=payload["attribute"] + "_max"; @@ -6055,6 +6089,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:resistvehicledmg', (info) => { + if (!("yes" in lang)) geti18n(); console.log(info); const mytitle=info["htmlAttributes"]["title"] const myid=info["htmlAttributes"]["id"] @@ -6075,6 +6110,7 @@ on('clicked:matrixattack', (info) => { const dodge = function (mods) { + if (!("yes" in lang)) geti18n(); myroll="&{template:resistadv}"; console.log('debug ' + mods); if ( typeof mods === 'object' && mods !== null ) { @@ -6108,6 +6144,7 @@ on('clicked:matrixattack', (info) => { }; on('clicked:dodge', (info) => { + if (!("yes" in lang)) geti18n(); console.log(info); if ( info["htmlAttributes"]["id"] != undefined) { mods="?{" + lang["modifiers"] + "?|0}"; @@ -6119,6 +6156,7 @@ on('clicked:matrixattack', (info) => { }); const conjuring = function (myid, spirittype="spirit", force="ask", name="none") { + if (!("yes" in lang)) geti18n(); console.log('spirittype: ' + spirittype); const atts=["charisma_max", "magic-type", "magic", "summoning", "banishing", "spiritcontrol", "character_name"] getAttrs(atts, function(myval) { @@ -6209,6 +6247,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:repeating_conjuring:conjure-spirit', (info) => { + if (!("yes" in lang)) geti18n(); var atts=[]; console.log(info); var source=info['sourceAttribute'].split('_'); @@ -6238,6 +6277,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:dispell', (info) => { + if (!("yes" in lang)) geti18n(); console.log("clicked dispell"); var calcDice="?{" + lang["sorcery-dice"] +"?} + ?{"+ lang["spell-pool-dice"] +"?}"; var calcTN="?{" + lang["force-of-spell"] + "?}"; @@ -6268,6 +6308,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:spelldefense', (info) => { + if (!("yes" in lang)) geti18n(); console.log("clicked spelldefense"); const payload=( info["originalRollId"] != undefined )? rollEscape.unescape(info["originalRollId"]) : "none"; var myforce=0; @@ -6327,6 +6368,7 @@ on('clicked:matrixattack', (info) => { on('clicked:vehicledriving', (info) => { + if (!("yes" in lang)) geti18n(); calcTN="@{handling} + @{vehicle-driver}stun_pen} +@{vehicle-driver}wound_pen} +@{wp-vehicle} - @{driving-test-interface} +@{driving-test-weather} +@{driving-test-terrain} +@{driving-test-size} +?{" + lang["miscellaneous-modifiers"] + "|0}"; calcDice="[[@{vehicle-skill-final} + @{driving-test-autonav} + ?{" + lang["control-pool-dice"] + "?}]]" var myroll="&{template:vehicle}{{type=" + lang["driving"] + "}}{{controlpool=[[?{" + lang["control-pool-dice"] + "?|0}]]}}{{character=@{character_name}}}" @@ -6341,6 +6383,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:vehiclesensor', (info) => { + if (!("yes" in lang)) geti18n(); calcTN="[[{2,(@{target|" + lang["target"] +"|signature} +@{wp-vehicle} +@{sensor-test-los} +@{sensor-test-weather} +@{sensor-test-terrain} +@{vehicle-urban} +?{" + lang["miscellaneous-modifiers"] + "|0})}kh1]]"; calcDice="[[@{sensors-rating}]]"; calcDiceECD="[[@{ecd-rating} * @{ecd-enabled} ]]"; @@ -6356,6 +6399,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:vehicleposition', (info) => { + if (!("yes" in lang)) geti18n(); calcTN="[[{2,(@{handling} + @{speed-exceeding} + @{driving-position-terrain} - @{vehicle-actionbonus} + (@{vehicle-autonav} * @{autonav}) + @{vehicle-driver}stun_pen} +@{vehicle-driver}wound_pen} + @{wp-vehicle} )}kh1]]"; calcDice="[[@{vehicle-skill-final} + ?{" + lang["control-pool-dice"] + "?}]]" var myroll="&{template:vehicle}{{type=" + lang["position"] + "}}{{controlpool=[[?{" + lang["control-pool-dice"] + "?|0}]]}}{{character=@{character_name}}}" @@ -6377,6 +6421,7 @@ on('clicked:matrixattack', (info) => { }); }); on('clicked:vehiclecrash', (info) => { + if (!("yes" in lang)) geti18n(); calcTN="[[{2,(@{handling} + @{driving-crash-terrain} + @{vehicle-driver}stun_pen} +@{vehicle-driver}wound_pen} +@{wp-vehicle} )}kh1]]" calcDice="[[@{vehicle-skill-final} + ?{" + lang["control-pool-dice"] + "?} + (@{vehicle-autonav} * @{autonav})]]" var myroll="&{template:vehicle}{{type=" + lang["crash"] + "}}{{controlpool=[[?{" + lang["control-pool-dice"] + "?|0}]]}}{{character=@{character_name}}}" @@ -6407,12 +6452,13 @@ on('clicked:matrixattack', (info) => { }); }); on('clicked:vehicleaction', (info) => { + if (!("yes" in lang)) geti18n(); var myaction=info["htmlAttributes"]["id"]; var myterrain="driving-ab-terrain"; var myaction = myaction.charAt(0).toUpperCase() + myaction.slice(1); var autonav="@{autonav}"; var vcr = "@{vehicle-actionbonus}"; - var miscmods="?{" + lang["how-many-additional-enemy-vehicles"] + "?}"; + var miscmods="?{" + lang["how-many-additional-enemy-vehicles"] + "?"; var speeding=1; var vmbelow10=4; var vmbelow00=2; @@ -6431,7 +6477,7 @@ on('clicked:matrixattack', (info) => { } else if ( myaction =="Relocate" ) { myterrain="driving-relocate-terrain"; - miscmods="?{" + lang["successes-from-hiding-test"] + "?}"; + miscmods="?{" + lang["successes-from-hiding-test"] + "?"; speeding=2; vcr=0; autonav="( @{autonav} * -1)"; @@ -6472,7 +6518,8 @@ on('clicked:matrixattack', (info) => { }); - var rollattribute = function (attrib) { + const rollattribute = function (attrib) { + if (!("yes" in lang)) geti18n(); console.log(attrib); var mymode=""; var mybase=attrib.toUpperCase(); @@ -6487,6 +6534,7 @@ on('clicked:matrixattack', (info) => { finishRoll( results.rollId); }); }; + attributes.forEach(myatt => { var myevent="attrib-" + myatt; var myeventmax="attrib-" + myatt + "-max"; @@ -6510,6 +6558,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:ewarfare', (info) => { + if (!("yes" in lang)) geti18n(); console.log(info); var mytype=info["htmlAttributes"]["id"] var mytitle=info["htmlAttributes"]["title"] @@ -6536,6 +6585,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:maneuever', (info) => { + if (!("yes" in lang)) geti18n(); var mytype=info["htmlAttributes"]["id"] if ( mytype == "generate") { var manroll="&{template:vehicle} {{type=" + lang["maneuver-score"] + "}} {{character=@{character_name}}}{{controlpool=[[?{" + lang["control-pool-dice"] + "?|0}]]}} {{roll=[[ [[@{vehicle-skill-final} + ?{" + lang["control-pool-dice"] + "?}]]d6KH1 + @{terrain-points} + @{speed-points} + @{vehicle-points} ]] }}" @@ -6554,6 +6604,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:repeating_rangedweapons:reload', (info) => { + if (!("yes" in lang)) geti18n(); console.log("reloading"); var setatts={}; var atts=[]; @@ -6620,6 +6671,7 @@ on('clicked:matrixattack', (info) => { }); }); on('clicked:repeating_rangedweapons:showmore clicked:repeating_explosives:showmore', (info) => { + if (!("yes" in lang)) geti18n(); var source=info['sourceAttribute']; console.log('attribute is ' + source); getAttrs([source], function(myval){ @@ -6632,6 +6684,7 @@ on('clicked:matrixattack', (info) => { }); }); on('clicked:repeating_rangedweapons:rangedattack', (info) => { + if (!("yes" in lang)) geti18n(); var setatts={}; var atts=["sensors-rating", "combatpool-used", "controlpool-used", "gyro-on", "armor-quickness-pen", "rounds-phase", "character_name"]; var recoilx=1; @@ -6786,6 +6839,7 @@ on('clicked:matrixattack', (info) => { }); const meleecombat = function (mymode, payload) { + if (!("yes" in lang)) geti18n(); console.log(payload); var plane=(payload["plane"])? payload["plane"] : "physical"; const askreach=(payload["reachmode"])? payload["reachmode"] : 0; @@ -6993,6 +7047,7 @@ on('clicked:matrixattack', (info) => { }); }; on('clicked:meleedefend', (info) => { + if (!("yes" in lang)) geti18n(); console.log(info); payload=rollEscape.unescape(info["originalRollId"]); getAttrs(["meleeselected"], function(myval) { @@ -7003,6 +7058,7 @@ on('clicked:matrixattack', (info) => { }); }); on('clicked:meleedefendfull', (info) => { + if (!("yes" in lang)) geti18n(); console.log(info); payload=rollEscape.unescape(info["originalRollId"]); getAttrs(["meleeselected"], function(myval) { @@ -7014,6 +7070,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:repeating_meleeweapons:attack', (info) => { + if (!("yes" in lang)) geti18n(); var source=info['sourceAttribute'].split('_'); var sourceattr=source.pop(); var myrepeat=source.join('_').concat('_'); @@ -7026,6 +7083,7 @@ on('clicked:matrixattack', (info) => { meleecombat(mymode, payload); }); on('clicked:repeating_meleeweapons2:attack', (info) => { + if (!("yes" in lang)) geti18n(); console.log(info); var atts=["combatpool-used", "gyro-on", "armor-quickness-pen"]; var rounds=1; @@ -7084,6 +7142,7 @@ on('clicked:matrixattack', (info) => { }); on('clicked:repeating_explosives:rangedattack', (info) => { + if (!("yes" in lang)) geti18n(); var setatts={}; var scatter=""; var atts=["combatpool-used", "controlpool-used", "character_name"]; @@ -7844,6 +7903,7 @@ on("change:deckattacklevel", function() { }); on('clicked:repeating_ic:combat', (info) => { + if (!("yes" in lang)) geti18n(); const mytitle=info["htmlAttributes"]["title"] const myid=info["htmlAttributes"]["id"] gets=["matrixcode"]; @@ -8615,6 +8675,7 @@ on("change:wounds change:adeptpainres", function() { }); on("change:repeating_ic:ictype", function(eventinfo) { + if (!("yes" in lang)) geti18n(); console.log(eventinfo); var mybase=eventinfo["sourceAttribute"].split("_"); var myattr=mybase.pop(); @@ -9317,6 +9378,7 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"] }); on("change:repeating_spells:range change:repeating_spells:spellcategory", function(myval) { + if (!("yes" in lang)) geti18n(); getAttrs(["repeating_spells_spellcategory", "repeating_spells_range"], function(myval) { const spellcategory=myval["repeating_spells_spellcategory"]; const range=myval["repeating_spells_range"]; @@ -9373,22 +9435,9 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"]
{{myname}}: {{spellname}} vs. {{targetofspell}}
-
Rolling: {{computed::rolldice}}d6 vs. {{targetnumber}} = {{casttest}}
- {{#spelldamage}}
Force: {{castforce}} Damage: {{computed::spelldamage}}
- {{/spelldamage}} - {{#sorcerydice}} -
-
Dice
-
-
Sorcery
-
-
Pool
-
Used
-
-
{{sorcerydice}}
-
-
{{#spellpool}}{{spellpool}}{{/spellpool}}
-
{{/sorcerydice}} +
Rolling: {{rolldice}}d6 vs. {{targetnumber}} = {{casttest}}
+ {{#spelldamage}}
Force: {{castforce}} Damage: {{computed::spelldamage}}
{{/spelldamage}} + {{#sorcerydice}}
Sorcery Dice: {{sorcerydice}} {{#spellpool}} Spell Pool: {{spellpool}}{{/spellpool}}
{{/sorcerydice}} {{#roll}}
Casting Test: {{computed::cast}} {{computed::roll}}
{{/roll}} {{#draintest}}