mirror of
https://github.com/migatu/conjurer.git
synced 2026-07-14 13:34:40 +00:00
61 lines
3.1 KiB
JavaScript
61 lines
3.1 KiB
JavaScript
// DH2 Attack Test v2 — presets: Aim/Range/Fire + Size/Light/Cover
|
|
const actor = canvas.tokens.controlled[0]?.actor ?? game.user.character;
|
|
if (!actor) return ui.notifications.warn("Zaznacz token albo przypisz postać.");
|
|
new Dialog({
|
|
title: "🎯 Attack Test (WS/BS)",
|
|
content: `
|
|
<form>
|
|
<div class="form-group"><label>Base Target (WS/BS)</label><input name="base" type="number" value="40"/></div>
|
|
<div class="form-group"><label>Aim</label>
|
|
<select name="aim"><option value="0">None</option><option value="10">Half (+10)</option><option value="20">Full (+20)</option></select></div>
|
|
<div class="form-group"><label>Range</label>
|
|
<select name="range">
|
|
<option value="0">Standard</option>
|
|
<option value="30">Point Blank (+30)</option>
|
|
<option value="10">Short (+10)</option>
|
|
<option value="-10">Long (-10)</option>
|
|
<option value="-30">Extreme (-30)</option>
|
|
</select></div>
|
|
<div class="form-group"><label>Fire / Attack</label>
|
|
<select name="stance">
|
|
<option value="0">Standard / Single</option>
|
|
<option value="10">Semi (+10)</option>
|
|
<option value="-10">Full Auto (-10)</option>
|
|
<option value="30">All Out (Melee +30)</option>
|
|
</select></div>
|
|
<div class="form-group"><label>Target Size</label>
|
|
<select name="size">
|
|
<option value="0">Average</option>
|
|
<option value="10">Hulking (+10)</option>
|
|
<option value="20">Enormous (+20)</option>
|
|
<option value="30">Massive (+30)</option>
|
|
<option value="-10">Puny (-10)</option>
|
|
</select></div>
|
|
<div class="form-group"><label>Lighting</label>
|
|
<select name="light"><option value="0">Normal</option><option value="10">Good (+10)</option><option value="-10">Poor (-10)</option></select></div>
|
|
<div class="form-group"><label>Cover</label>
|
|
<select name="cover"><option value="0">None</option><option value="-10">Light (-10)</option><option value="-20">Heavy (-20)</option></select></div>
|
|
<div class="form-group"><label>Other Modifiers</label><input name="mod" type="number" value="0"/></div>
|
|
</form>`,
|
|
buttons: {
|
|
roll: {
|
|
label: "Roll",
|
|
callback: async (html) => {
|
|
const get = n => Number(html.find(`[name="${n}"]`).val());
|
|
const base = get("base");
|
|
const total = base + get("aim") + get("range") + get("stance") + get("size") + get("light") + get("cover") + get("mod");
|
|
const r = await(new Roll("1d100")).roll({async:true});
|
|
const ok = r.total <= total;
|
|
const margin = Math.abs(total - r.total);
|
|
const dox = ok ? 1 + Math.floor(margin/10) : Math.floor(margin/10);
|
|
const table = `
|
|
<table style="width:100%;border-collapse:collapse">
|
|
<tr><td><b>Target</b></td><td>${total}</td><td><b>Roll</b></td><td>${r.total}</td></tr>
|
|
<tr><td><b>Result</b></td><td colspan="3">${ok?'<span style="color:green">SUCCESS</span>':'<span style="color:red">FAIL</span>'} — ${ok?dox+' DoS':dox+' DoF'}</td></tr>
|
|
</table>`;
|
|
r.toMessage({speaker: ChatMessage.getSpeaker({actor}), flavor: `🎯 <b>Attack Test</b><br/>${table}`});
|
|
}
|
|
}
|
|
}
|
|
}).render(true);
|