diff --git a/Shadowrun3e/shadowrun3e.css b/Shadowrun3e/shadowrun3e.css index fc69726ccc..f4b055b6f2 100644 --- a/Shadowrun3e/shadowrun3e.css +++ b/Shadowrun3e/shadowrun3e.css @@ -2205,13 +2205,13 @@ input.enable-fa:not(:checked)~span.show_fa_dice { .frame-summary { display: grid; text-align: center; - grid-template-columns: 60px 70px 80px 80px 100px 85px; + grid-template-columns: 60px 70px 80px 80px 100px; } .deck-summary { display: grid; text-align: center; - grid-template-columns: 30px 50px 60px 80px 80px 100px 85px; + grid-template-columns: 40px 80px 90px 100px 80px 100px; } .matrixrapid { diff --git a/Shadowrun3e/shadowrun3e.html b/Shadowrun3e/shadowrun3e.html index d8ba439160..bd5abd6e75 100644 --- a/Shadowrun3e/shadowrun3e.html +++ b/Shadowrun3e/shadowrun3e.html @@ -1538,9 +1538,8 @@
Hot ASIST
Reality Filter
IC Suppressed
-
Target Status
+
Icon Status
Host/Grid Rating
-
Alert Status
@@ -1556,11 +1555,6 @@ -
@@ -1570,7 +1564,6 @@
IC Suppressed
Icon Status
Host/Grid Rating
-
Alert Status
@@ -1585,11 +1578,6 @@ -
@@ -2745,7 +2733,7 @@
Reloads
Ammo Type
Notes:
-
- - - - -
- - - - - - - - - - + +
+ +
@@ -2836,7 +2830,7 @@
- + @@ -2850,7 +2844,7 @@
- +
@@ -4078,20 +4072,26 @@ -
-
- - - - - - - - - - + +
+ + textarea name="attr_notes" style='width:150px;height:22px;'>
@@ -4612,21 +4612,24 @@ buttonlist.forEach(button => { const myrating=myrepeat.concat("rating-final"); atts.push(myutil, myrating); if ( myid == "matrixrepeatingexec" ) utiltarget=myrepeat.concat("target"); + atts.push(utiltarget); if ( myid == "matrixrepeatingexec" ) console.log('utiltarget: ' + utiltarget); console.log(atts); getAttrs(atts, function(myval) { console.log(myval); const myutilvalue=myval[myutil]; const myratingvalue=myval[myrating]; + const myutiltarget=myval[utiltarget]; if ( myid == "matrixrepeatingattack" ) { action = "{{action=" + myutilvalue + " Attack}}"; target = "{{target=@{target|Target|token_name}}}"; calcTN="@{deck-tn} + @{wound_pen} + @{stun_pen} +@{matrix-penalty} +?{Miscellaneous Modifiers|0}"; calcDice="@{decking} + ?{Hacking Pool Dice}"; } else if ( myid == "matrixrepeatingexec" ) { + console.log('utiltarget ' + myutiltarget); action="{{action=System Operation with " + myutilvalue + " Utility}}"; - target = "{{target=@{" + utiltarget + "}}}"; - calcTN="@{" + utiltarget + "} + floor(@{deck-alertstatus}/2) + @{wound_pen} + @{stun_pen} +@{matrix-penalty} - " + myratingvalue; + target = "{{target=@{target|Target|token_name}}}"; + calcTN= myutiltarget + " + floor(@{target|Target|matrixalert}/2) + @{wound_pen} + @{stun_pen} +@{matrix-penalty} - " + myratingvalue; calcDice="@{decking} + ?{Hacking Pool Dice}"; } else { action="{{action=" + myutilvalue + " Test}}"; @@ -4734,12 +4737,29 @@ buttonlist.forEach(button => { }); on('clicked:matrixresist', (info) => { - console.log(info); - const myid=info["htmlAttributes"]["id"]; - const mytitle=info["htmlAttributes"]["title"]; - var calcTN="?{Power of Attack?|0} - @{deckarmor-rating-final}"; - var calcDice="@{deck-bod-final} + ?{Hacking Pool Dice|0}"; + var payload, myid; + if ( info["htmlAttributes"]["id"] != undefined) { + myid=info["htmlAttributes"]["id"]; + } else if ( info["originalRollId"] != undefined ) { + payload=rollEscape.unescape(info["originalRollId"]); + } + var calcTN; + var calcDice; var myroll="&{template:matrix}"; + console.log(info); + if ( payload ) { + console.log(payload); + power=payload["power"]; + attribute=payload["attribute"]; + attacktype=payload["attacktype"]; + console.log ('power ' + power + ' att ' + attribute + ' attacktype ' + attacktype); + calcDice="@{" + attribute + "} + ?{Hacking Pool Dice|0}"; + calcTN="?{Power of Attack?|" + power + "}"; + if ( attacktype == "cybercombat" ) calcTN+= " - @{deckarmor-rating-final}"; + } else { + calcTN="?{Power of Attack?|0} - @{deckarmor-rating-final}"; + calcDice="@{deck-bod-final} + ?{Hacking Pool Dice|0}"; + } myroll+="{{action=Damage Resistance Test}}"; myroll+="{{rolldice=[[" + calcDice + "]]}}"; myroll+="{{targetnumber=[[" + calcTN + "]]}}"; @@ -4753,6 +4773,10 @@ buttonlist.forEach(button => { }); }); +const iclist = { + proactive: ["Crippler", "Ripper", "Killer", "Blaster", "Sparky", "Scout", "Black Ic", "Cerebropathic", "Psychotropic", "Trace"], + reactive: ["Probe", "Scramble", "Tar Baby", "Tar pit", "Data Bomb", "Pavlov"] +}; on('clicked:matrixattack', (info) => { const myid=info["htmlAttributes"]["id"] @@ -4768,7 +4792,8 @@ on('clicked:matrixattack', (info) => { myroll+= myaction; myroll+="{{rolldice=[[" + calcDice + "]]}}" myroll+="{{targetnumber=[[" + calcTN + "]]}}"; - myroll+="{{utilitylevel=@{" + myid + "-rating-final}}}" + myroll+="{{utilitylevel=[[@{" + myid + "-rating-final}]]}}" + myroll+="{{senddata=[[0]]}}"; myroll+="{{iconstatus=[[@{target|Target|iconstatuscode}]]}}"; if ( systemrating == "UNKNOWN" ) myroll+="{{systemrating=[[@{target|Host|matrixsecuritynumber}]]}}"; else myroll+="{{systemrating=[[" + matrixtn[systemrating]["secrating"] + "]]}}"; @@ -4785,10 +4810,14 @@ on('clicked:matrixattack', (info) => { finaltn += myhosttn; const finaldice = (results.results.roll.dice.filter(mydice=> mydice >= finaltn )).length; updatepoolused("hackingpool", results.results.hackingpool.result); - console.log('final tn ' + finaltn); - console.log('final foll ' + finaldice); + let payload= { + power: results.results.utilitylevel.result, + attacktype: "cybercombat", + attribute: "deck-bod-final" + } finishRoll( results.rollId, { + senddata: rollEscape.escape(payload), targetnumber: finaltn, roll: finaldice, }); @@ -5221,21 +5250,22 @@ on('clicked:matrixattack', (info) => { const ammomods = { regular: { armor: "ballistic", av: 0, power: 0, dmg: 0, recoil: 1, barrier: 1, knockdown: 1 }, - adps: { armor: "ballistic * 0.5", av: 0, power: 0, dmg: 0, recoil: 1, barrier: 0.5, knockdown: 1 }, + adps: { armor: "Math.floor(ballistic * 0.5)", av: 0, power: 0, dmg: 0, recoil: 1, barrier: 0.5, knockdown: 1 }, explosive: { armor: "ballistic", av: 0, power: 1, dmg: 0, recoil: 1, barrier: 1, knockdown: 1 }, explosive2: { armor: "ballistic", av: 0, power: 2, dmg: 0, recoil: 1, barrier: 1, knockdown: 1 }, - flechette: { armor: "return (Math.max(ballistic, (impact * 2)))", av: -0.5, power: 0, dmg: "if ( ballistic + impact ==0 ) return 1; else return 0;", recoil: 1, barrier: 2, knockdown: 1 }, - gel: { armor: "impact", av: 0, power: -2, dmg: "stun", recoil: 1, barrier: 1, knockdown: 2 }, + flechette: { armor: "(Math.max(ballistic, (impact * 2)))", av: -0.5, power: 0, dmg: "((ballistic + impact) ==0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1 }, + gel: { armor: "impact", av: 0, power: -2, dmg: 0, recoil: 1, barrier: 1, knockdown: 2 }, tracer: { armor: "ballistic", av: 0, power: "-(Math.floor(rounds/3))", dmg: 0, recoil: 1, barrier: 1, knockdown: 1 }, - av: { armor: "ballistic * 0.5", av: 1, power: 0, dmg: 0, recoil: 1, barrier: 0.5, knockdown: 1 }, - capsule: { armor: "impact", av: 0, power: -2, dmg: "stun", recoil: 1, barrier: 1, knockdown: 1 }, - glazer: { armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 2, dmg: "if(ballistic + impact)==0 return 1 else return 0", recoil: 1, barrier: 2, knockdown: 1 }, - hic: { armor: "Math.max(ballistic,impact)", av: 0, power: "if ((range=='extreme')||(range=='long')) return -1 else return 0", dmg: 0, recoil: 2, barrier: 1, knockdown: 1 }, - hp: { armor: "ballistic + impact", av: 0, power: "if(ballistic + impact)==0 return 3 else return 1", dmg: 0, recoil: 2, barrier: 1, knockdown: 1 }, + av: { armor: "Math.floor(ballistic * 0.5)", av: 1, power: 0, dmg: 0, recoil: 1, barrier: 0.5, knockdown: 1 }, + capsule: { armor: "impact", av: 0, power: -2, dmg: 0, recoil: 1, barrier: 1, knockdown: 1 }, + glazer: { armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 2, dmg: "((ballistic + impact) ==0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1 }, + hic: { armor: "Math.max(ballistic,impact)", av: 0, power: "(range==6)? -1 : (range==9)? -1", dmg: 0, recoil: 2, barrier: 1, knockdown: 1 }, + hpoint: { armor: "ballistic + impact", av: 0, power: "((ballistic + impact ==0)? 3 : 1", dmg: 0, recoil: 2, barrier: 1, knockdown: 1 }, incendiary: { armor: "ballistic", av: 0, power: 0, dmg: 0, recoil: 1, barrier: 1, knockdown: 1 }, - mercury: { armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 0, dmg: "if(ballistic + impact)==0 return 1 else return 0", recoil: 1, barrier: 2, knockdown: 1 }, + mercury: { armor: "Math.max((ballistic * 2), (impact * 2))", av: -0.5, power: 0, dmg: "((ballistic + impact) ==0)? 1 : 0;", recoil: 1, barrier: 2, knockdown: 1 }, tracker: { armor: "ballistic", av: 0, power: 0, dmg: 0, recoil: 1, barrier: 1, knockdown: 1 } } + const resistdmg = function (myid, mods) { atts=["ballistic", "impact", "dermal-armor"]; getAttrs(atts, function (myval) { @@ -5255,9 +5285,12 @@ on('clicked:matrixattack', (info) => { const ammo=mods["ammotype"].toLowerCase(); weapondmg = mods["wdmg"]; dodge = mods["dodge"]; - var armorval = eval(ammomods[ammo]["armor"]); + const range = mods["range"]; + const armorval = eval(ammomods[ammo]["armor"]); const powermod = eval(ammomods[ammo]["power"]); - dmgcode = damagetable[weapondmg] + eval(ammomods[ammo]["dmg"]); + const dmgmod = eval(ammomods[ammo]["dmg"]); + dmgcode = damagetable[weapondmg] + dmgmod; + console.log ('armorval ' + armorval + ' powermod ' + powermod + ' dmgmod ' + dmgmod + ' range ' + range); myroll +="{{Power=?{Attack Power|" + mods.power + "}}}"; myroll+="{{wpndmg=" + weapondmg + "}}"; myroll +="{{attacktest=[[" + mods["attacktest"] + "]]}}"; @@ -5799,7 +5832,7 @@ on('clicked:matrixattack', (info) => { const myweapon= myval[myrepeat.concat("name")]; const combatused=parseInt(myval["combatpool-used"]); const controlused=parseInt(myval["controlpool-used"]); - const wdmg= myval[myrepeat.concat("damage")]; + var wdmg= myval[myrepeat.concat("damage")]; const ammoremain= myval[myrepeat.concat("ammoremain")]; const ammotype= myval[myrepeat.concat("ammotype")]; const targetaim= myval[myrepeat.concat("targeting")]; @@ -5808,6 +5841,10 @@ on('clicked:matrixattack', (info) => { if ( myval["gyro-on"] == 0 ) gyro=0; const firemode= myval[myrepeat.concat("firemode")]; var dmgnumber= damagetable[wdmg]; + if (( ammotype == "gel" || ammotype == "capsule" ) && dmgnumber < 10 ) { + dmgnumber += 9; + wdmg=damagetable[dmgnumber]; + } if (dmgnumber >= 10) dmgmax=13; var wpower= myval[myrepeat.concat("power")]; var ammoleft=myval[myrepeat.concat("ammoremain")]; @@ -5859,7 +5896,7 @@ on('clicked:matrixattack', (info) => { var roll="&{template:attack}{{myname=@{character_name}}}{{target=@{target|Target|token_name}}}"; - roll += "{{rounds=[[" + rounds + "]]}}{{range=@{ask-range}}}"; + roll += "{{rounds=[[" + rounds + "]]}}{{range=[[@{ask-range}]]}}"; roll += "{{targetnumber=" + calcTN + " }}{{rolldice=" + calcDice + "}}"; roll += "{{weaponname=" + myweapon + "}}{{weapondamage=" + wdmg + "}}{{weaponpower=[[" + wpower + "]]}}"; roll += "{{" + pool + "=[[?{" + poolname + " Pool Dice}]]}}{{weaponname=" + myweapon + "}}{{ammotype=" + ammotype + "}}"; @@ -5887,6 +5924,7 @@ on('clicked:matrixattack', (info) => { let payload= { attacker: myname, armortype: "ballistic", + range: results.results.range.result, wdmg: wdmg, rounds: results.results.rounds.result, dodge: 0, @@ -6560,6 +6598,7 @@ on('clicked:matrixattack', (info) => { pgetatts.push(p.concat("-mods")); }); on(pchangelist, function() { + console.log('deck-mpcp change'); getAttrs(pgetatts, function(myval) { sets={}; console.log(myval); @@ -6615,9 +6654,10 @@ on(utilsizechange, function(info) { on("change:matrixsecurityrating", function() { + console.log('change of sec rating'); getAttrs(["matrixsecurityrating"], function(myval) { let sr = parseInt(myval["matrixsecurityrating"]); - setAttrs({"deck-bod-final":sr, "deck-evasion-final":sr, "deck-masking-final":sr, "deck-sensors-final":sr, "deck-mpcp-final":sr, "deck-detection-final":sr}); + 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}); }); }); @@ -6779,23 +6819,38 @@ on("change:deckattacklevel", function() { gets.push(myrepeat.concat("matrix-iconstatus")); getAttrs(gets, function (myval) { var myatt="@{target|Target|deck-evasion-final}"; + const name=myval[myrepeat.concat("icname")]; + const ictype=myval[myrepeat.concat("ictype")]; + console.log('ictype ' + ictype); + const penalty=parseInt(myval[myrepeat.concat("ic-penalty")]); + const targeticon=myval[myrepeat.concat("matrix-iconstatus")]; + var icmode="proactive"; + if ( iclist["reactive"].includes(ictype)) { + icmode="reactive"; + } const code=myval["matrixcode"].toUpperCase(); const rating=parseInt(myval[myrepeat.concat("icrating")]); var ictest=myval[myrepeat.concat("ictargettest")]; - console.log('test ' + ictest); - const name=myval[myrepeat.concat("icname")]; - const ictype=myval[myrepeat.concat("ictype")]; - const penalty=parseInt(myval[myrepeat.concat("ic-penalty")]); - const targeticon=myval[myrepeat.concat("matrix-iconstatus")]; + var targetatt="bod"; + if ( (icmode="proactive") && (ictest.includes("target")) ) targetatt=ictest.split("-")[1]; const attacktn =matrixtn[code][targeticon]; - console.log('test2 ' + attacktn); - if ( ictest=="Attack" ) ictest=attacktn; + if ( icmode=="proactive" ) ictest=attacktn; + if ( ictype == "Probe" ) { + console.log('probe!'); + ictest="@{target|decker|deck-detection-final}"; + } + const payload = { + power: rating, + attribute: "deck-" + targetatt + "-final", + attacktype: ictype + }; var target="{{target=@{target|Target|token_name}}}"; if ( mytitle == "Evade Detection" ) myatt = "@{target|Target|deck-sensors-final}"; if ( mytitle == "IC Resist" ) myatt = "?{Power of Attack?|2}"; if ( mytitle == "IC Resist" ) target = "{{target=" + name + "}}"; if ( mytitle == "IC Execute" ) { myatt = ictest; + console.log('myatt ' + myatt); target="{{target=@{target|decker|token_name}}}"; } var calcTN= myatt + " +?{Miscellaneous Modifiers|0} + " + penalty; @@ -6804,12 +6859,16 @@ on("change:deckattacklevel", function() { if (( ictype == "Tar Baby") || (ictype == "Tar pit")) calcDice=rating; var myroll="&{template:matrix}{{myname=" + name + "}}"; myroll+=target; + myroll+="{{senddata=[[0]]}}"; myroll+="{{rolldice=[[" + calcDice + "]]}}{{targetnumber=[[" + calcTN + "]]}}"; myroll+="{{action=" + mytitle + "}}" myroll+="{{roll= [[ [[" + calcDice + "]]d6>[[ {2,(" + calcTN + ")}kh1]]!! ]] }}" console.log(myroll); startRoll(myroll, (results) => { - finishRoll( results.rollId); + finishRoll( results.rollId, + { + senddata: rollEscape.escape(payload), + }); }); }); @@ -8476,6 +8535,7 @@ powers: ["Accident", "Divination", "Guard", "Materialization", "Search"] {{#hackingpool}}
Hacking Pool Dice: {{hackingpool}}
{{/hackingpool}} {{#description}}
{{description}}
{{/description}}
{{action}}: {{computed::roll}}
+ {{#senddata}}
{{target}}: [Resist](~selected|matrixresist||{{computed::senddata}})
{{/senddata}} {{#notes}}
{{notes}}
{{/notes}} {{#notes2}}
{{notes2}}
{{/notes2}} {{#detect}}
{{target}}: {{detect}}
{{/detect}}