removed alert stats from decking tab, it is not needed. Fixed calculation of deck attributes for Host/Grid/IC

This commit is contained in:
Brad Hornbeck
2021-09-01 13:21:15 -04:00
parent 937b20910f
commit 0a058b960e
2 changed files with 141 additions and 81 deletions
+139 -79
View File
@@ -1538,9 +1538,8 @@
<div>Hot ASIST</div>
<div>Reality Filter</div>
<div>IC Suppressed</div>
<div class="text-mid">Target Status</div>
<div class="text-mid">Icon Status</div>
<div class="text-mid">Host/Grid Rating</div>
<div class="text-mid">Alert Status</div>
<div><input checked="checked" type="checkbox" name="attr_deck-dni" value=1></div>
<div><input type="checkbox" name="attr_deck-asist" value=1> </div>
<div><input type="checkbox" name="attr_deck-realityfilter" value=1></div>
@@ -1556,11 +1555,6 @@
<option>Orange</option>
<option>Red</option>
</select>
<select name="attr_deck-alertstatus" class= "mediumselect2">
<option value=0 SELECTED>None</option>
<option value=4>Passive</option>
<option value=5>Active</option>
</select>
</div>
</div>
<div class="matrix-show-frame">
@@ -1570,7 +1564,6 @@
<div>IC Suppressed</div>
<div class="text-mid">Icon Status</div>
<div class="text-mid">Host/Grid Rating</div>
<div class="text-mid">Alert Status</div>
<div><input type="number" name="attr_decking" min=0 value=0> </div>
<div><input type="number" name="attr_deck-utilitypayload" min=0 value=0></div>
<div><input type="number" name="attr_deck-icsuppressed" min=0 value=0></div>
@@ -1585,11 +1578,6 @@
<option>Orange</option>
<option>Red</option>
</select>
<select name="attr_deck-alertstatus" class= "mediumselect2">
<option value=0 SELECTED>None</option>
<option value=4>Passive</option>
<option value=5>Active</option>
</select>
</div>
</div>
@@ -2745,7 +2733,7 @@
<div class="text-mid" title="number or clips, belts or individual rounds"><b>Reloads</div>
<div class="text-mid"><b>Ammo Type</div>
<div class="text-mid"><b>Notes:</div>
<select name="attr_skill" class="mediumselect3"
<select name="attr_skill" class="mediumselect2"
title="choose weapon active skill, use Other if there is no match and put skill level in Specialized box">
<option SELECTED value="@{pistols}">Pistol</option>
<option value="@{assaultrifles}">Assualt Rifle</option>
@@ -2768,38 +2756,44 @@
<div><input type="number" name="attr_tnmods" value=0></div>
<div><input type="number" name="attr_recoilcomp" title="Gas vents and other recoil accesories"
value=0></div>
<select class="mediumselect3" name="attr_gyro">
<select class="mediumselect2" name="attr_gyro">
<option value="0" SELECTED>None</option>
<option value="5">Regular</option>
<option value="6">Deluxe</option>
</select>
<select class="mediumselect3" name="attr_targeting">
<select class="mediumselect2" name="attr_targeting">
<option value="0" SELECTED>None</option>
<option value="-2">Smartlink</option>
<option value="-1">LaserSight</option>
<option value="-1">Smart Goggles</option>
</select>
<select name="attr_reloadmethod" class="mediumselect3">
<select name="attr_reloadmethod" class="mediumselect2">
<option>clip</option>
<option>break</option>
<option>magazine</option>
<option>speed loader</option>
<option>cylinder</option>
<option>belt</option>
<select>
<div><input type="number" name="attr_reloads" value=0></div>
<div><input type="text" list="ammotype" value="Regular" class="myweapontxt2"
name="attr_ammotype"></div>
<datalist class="mediumselect3" id="ammotype">
<option>Regular</option>
<option>ADPS</option>
<option>Explosive</option>
<option>Flechette</option>
<option>Gel</option>
<option>Tracer</option>
<option>Explosive EX</option>
</datalist>
<textarea name="attr_notes" style='width:150px;height:22px;'></textarea>
</select>
<div><input type="number" name="attr_reloads" value=0></div>
<select name="attr_ammotype" class="mediumselect2">
<option value="regular">Regular</option>
<option value="adps">ADPS</option>
<option value="explosive">Explosive</option>
<option value="explosive2">Explosive EX</option>
<option value="flechette">Flechette</option>
<option value="gel">Gel</option>
<option value="tracer">Tracer</option>
<option value="av">Anti-Vehicl</option>
<option value="capsule">Capsule</option>
<option value="glazer">Glazer</option>
<option value="hic">Hi-C</option>
<option value="hpoint">Hollow Point</option>
<option value="incendiary">Incendiary</option>
<option value="mercury">Mercury</option>
<option value="tracker">Tracker</option>
</select>
<textarea name="attr_notes" style='width:150px;height:22px;'></textarea>
</span>
</div>
<div class="table-bottom" />
@@ -2836,7 +2830,7 @@
</div>
<div class="melee-table-row">
<div class="text-mid"><input type="checkbox" name="attr_unarmed-equipped" checked></div>
<input class="myweapontxt" type="text" name="attr_unarmed-name" value="Unarmed Combat">
<input class="myweapontxt" type="text" name="attr_unarmed-name" value="Unarmed Combat" disabled>
<select class="mediumselect2" name="attr_unarmedskill">
<option value="@{unarmed}" selected>Unarmed</option>
</select>
@@ -2850,7 +2844,7 @@
<input type="number" name="attr_unarmed-miscmods" value=0 \>
<div><button class="attack-dice" id="unarmedattack" type="action" name="act_melee"
title="Melee Attack"></button></div>
<input name="attr_notes" type=""text></input>
<input name="attr_notes" type="text"></input>
</div>
<div class="table-bottom" />
<fieldset class="repeating_meleeweapons">
@@ -4078,20 +4072,26 @@
<option>speed loader</option>
<option>cylinder</option>
<option>belt</option>
<select>
<div><input type="number" name="attr_reloads" value=0></div>
<div><input type="text" list="ammotype" value="Regular" class="myweapontxt2"
name="attr_ammotype"></div>
<datalist class="mediumselect3" id="ammotype">
<option>Regular</option>
<option>ADPS</option>
<option>Explosive</option>
<option>Flechette</option>
<option>Gel</option>
<option>Tracer</option>
<option>Explosive EX</option>
</datalist>
<textarea name="attr_notes" style='width:150px;height:22px;'></textarea>
</select>
<div><input type="number" name="attr_reloads" value=0></div>
<select name="attr_ammotype" class="mediumselect3">
<option value="regular">Regular</option>
<option value="adps">ADPS</option>
<option value="explosive">Explosive</option>
<option value="explosive2">Explosive EX</option>
<option value="flechette">Flechette</option>
<option value="gel">Gel</option>
<option value="tracer">Tracer</option>
<option value="av">Anti-Vehicl</option>
<option value="capsule">Capsule</option>
<option value="glazer">Glazer</option>
<option value="hic">Hi-C<option>
<option value="hpoint">Hollow Point</option>
<option value="incendiary">Incendiary</option>
<option value="mercury">Mercury</option>
<option value="tracker">Tracker</option>
</select>
textarea name="attr_notes" style='width:150px;height:22px;'></textarea>
</span>
</div>
<div class="table-bottom" />
@@ -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}}<div class="rtrow"><b>Hacking Pool Dice:</b> {{hackingpool}}</div>{{/hackingpool}}
{{#description}}<div class="rtrow">{{description}}</div>{{/description}}
<div class="sheet-rtrow"><b>{{action}}:</b> {{computed::roll}}</div>
{{#senddata}}<div class="sheet-rtrow"><b>{{target}}:</b> [Resist](~selected|matrixresist||{{computed::senddata}})</div>{{/senddata}}
{{#notes}}<div class="sheet-rtrow"> {{notes}}</div>{{/notes}}
{{#notes2}}<div class="sheet-rtrow"> {{notes2}}</div>{{/notes2}}
{{#detect}}<div class="sheet-rtrow"><b>{{target}}:</b> {{detect}}</div>{{/detect}}