diff --git a/css/deltagreen.css b/css/deltagreen.css index 90bf772..ba4479f 100644 --- a/css/deltagreen.css +++ b/css/deltagreen.css @@ -385,4 +385,9 @@ div span.bio-grid-label{ div .motivation-section{ border-bottom: 1px solid #AAA; margin-bottom: 10px; +} + +div .bottom-left-justified-resource{ + vertical-align: bottom; + text-align: left; } \ No newline at end of file diff --git a/module/actor/actor-sheet.js b/module/actor/actor-sheet.js index 0b39ac4..6522cb1 100644 --- a/module/actor/actor-sheet.js +++ b/module/actor/actor-sheet.js @@ -249,36 +249,40 @@ export class DeltaGreenActorSheet extends ActorSheet { if (dataset.roll) { let roll = new Roll(dataset.roll, this.actor.data.data); let key = dataset.label ? dataset.label : ''; - let label = dataset.label ? `Rolling ${dataset.label.toUpperCase()}` : ''; + //let label = dataset.label ? `Rolling ${dataset.label.toUpperCase()}` : ''; + let label = dataset.label ? `${dataset.label}` : ''; let targetVal = ""; + let rollType = dataset.rolltype ? dataset.rolltype : ''; // check the 'data-target="something" property to determine how to grab the target for the roll - if(Number.isNumeric(dataset.target)){ + if(rollType === "skill" || rollType === "typeskill"){ targetVal = dataset.target; - label += `, Target: ${targetVal}`; + this._sendPercentileTestToChat(label, targetVal); } else if(dataset.target === "statistic.x5"){ let stat = this.actor.data.data.statistics[key]; targetVal = stat.x5; - label += `, Target: ${targetVal}`; + this._sendPercentileTestToChat(label, targetVal); } - else if(dataset.target === "sanity"){ + else if(rollType === "sanity"){ targetVal = this.actor.data.data.sanity.value; - label += `, Target: ${targetVal}`; + //label += `, Target: ${targetVal}`; + this._sendPercentileTestToChat(label, targetVal); } - else if(dataset.target === "damage"){ + else if(rollType === "damage"){ // damage roll, not a skill check label = dataset.label ? `Rolling damage for ${dataset.label.toUpperCase()}` : ''; - } - else if(dataset.target === "lethality"){ - // a lethality roll - label = dataset.label ? `Rolling LETHALITY for ${dataset.label.toUpperCase()}` : ''; - } - roll.roll().toMessage({ - speaker: ChatMessage.getSpeaker({ actor: this.actor }), - flavor: label - }); + roll.roll().toMessage({ + speaker: ChatMessage.getSpeaker({ actor: this.actor }), + flavor: label + }); + } + else if(rollType === "lethality"){ + // a lethality roll + targetVal = dataset.target; + this._sendLethalityTestToChat(label, targetVal); + } } } @@ -297,4 +301,175 @@ export class DeltaGreenActorSheet extends ActorSheet { this.actor.update({"data": updatedData}); } + _sendLethalityTestToChat(weaponName, target){ + let roll = new Roll('d100', this.actor.data.data).roll(); + let isCritical = false; + let skillCheckTotal = roll.total; + + + // page 57 of agent's handbook + // Lethality rolls do not fumble or critically succeed, but the attack roll can. + // In this situation, the lethality threshold doubles (e.g. 20% would become 40%), + // and if the lethality roll fails, the damage is doubled per normal. However right now + // the attack roll and damage roll are completely separate... Perhaps in the future, use a + // hotkey to allow the doubling logic? + + // try to determine what the d100 result would be as if it was two d10's being rolled + let damageDie1 = Math.floor(skillCheckTotal / 10); + let damageDie2 = skillCheckTotal - (damageDie1 * 10); + if(damageDie2 === 0){ + // if the result is evenly divisible by 10 (e.g. 30, 40, 50...) + // then the percentile die result was actually one lower than the calculation above would show. + // For example, a '70' is actually a 60 + 10, so the damage die should be 6 + 10 = 16, not 7 + 0 = 7. + damageDie1 -= 1; + damageDie2 = 10; + } + + let damageDie1Label = damageDie1.toString(); + let damageDie2Label = damageDie2.toString(); + + if(damageDie1 === 0){ + // a roll of 00 on the tens part of the d100 counts as a ten if it becomes a damage die + // Will leave the labeling as a '0' though, to be consistent with a regular d10 roll + damageDie1 = 10; + } + + if(damageDie2 === 10){ + // keep the labelling consistent, show a '0' for a ten + damageDie2Label = '0'; + } + + let nonlethalDamage = damageDie1 + damageDie2; + + let isLethal = false; + let html = ''; + let label = `Rolling LETHALITY for ${weaponName.toUpperCase()} Target ${target}`; + let resultString = ''; + let styleOverride = ''; + + if(skillCheckTotal <= target){ + isLethal = true; + resultString = "LETHAL" + styleOverride="color: red"; + } + else{ + resultString = "Fail" + } + + html = `
` + html += ` d100 OR d10 + d10` + html += ` ${roll.total}` + html += `
` + html += `` + html += ` ${roll.formula}` + html += ` ${roll.total}` + html += `
` + html += `