WIP: Treasure tables, hp rolls
parent
2acc9992f5
commit
e1319b6215
|
@ -222,6 +222,7 @@ async function clean() {
|
||||||
"lang",
|
"lang",
|
||||||
"templates",
|
"templates",
|
||||||
"assets",
|
"assets",
|
||||||
|
"packs",
|
||||||
"module",
|
"module",
|
||||||
`${name}.js`,
|
`${name}.js`,
|
||||||
"module.json",
|
"module.json",
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
"OSE.Ok": "Ok",
|
"OSE.Ok": "Ok",
|
||||||
"OSE.Cancel": "Cancel",
|
"OSE.Cancel": "Cancel",
|
||||||
"OSE.Roll": "Roll",
|
"OSE.Roll": "Roll",
|
||||||
|
"OSE.Success": "Success",
|
||||||
|
"OSE.Failure": "Failure",
|
||||||
|
|
||||||
"OSE.Formula": "Formula",
|
"OSE.Formula": "Formula",
|
||||||
"OSE.SitMod": "Situational Modifier",
|
"OSE.SitMod": "Situational Modifier",
|
||||||
|
@ -20,6 +22,8 @@
|
||||||
"OSE.Experience": "Experience",
|
"OSE.Experience": "Experience",
|
||||||
"OSE.ExperienceBonus": "Bonus Experience",
|
"OSE.ExperienceBonus": "Bonus Experience",
|
||||||
"OSE.Treasure": "Treasure type",
|
"OSE.Treasure": "Treasure type",
|
||||||
|
"OSE.TreasureTable": "Table",
|
||||||
|
"OSE.TreasureTableHint": "Drop a rollable table here to roll the monster treasure",
|
||||||
"OSE.Size": "Size",
|
"OSE.Size": "Size",
|
||||||
"OSE.Morale": "Morale",
|
"OSE.Morale": "Morale",
|
||||||
"OSE.Retainer": "Retainer",
|
"OSE.Retainer": "Retainer",
|
||||||
|
|
|
@ -125,6 +125,11 @@ export class OseActorSheet extends ActorSheet {
|
||||||
actorObject.rollAttack({label: this.actor.name, type: attack}, { event: event });
|
actorObject.rollAttack({label: this.actor.name, type: attack}, { event: event });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
html.find(".hit-dice .attribute-name a").click((ev) => {
|
||||||
|
let actorObject = this.actor;
|
||||||
|
actorObject.rollHitDice({ event: event });
|
||||||
|
});
|
||||||
|
|
||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -146,11 +146,6 @@ export class OseActorSheetCharacter extends OseActorSheet {
|
||||||
actorObject.rollCheck(score, { event: event });
|
actorObject.rollCheck(score, { event: event });
|
||||||
});
|
});
|
||||||
|
|
||||||
html.find(".hit-dice .attribute-name a").click((ev) => {
|
|
||||||
let actorObject = this.actor;
|
|
||||||
actorObject.rollHitDice({ event: event });
|
|
||||||
});
|
|
||||||
|
|
||||||
html.find(".exploration .attribute-name a").click((ev) => {
|
html.find(".exploration .attribute-name a").click((ev) => {
|
||||||
let actorObject = this.actor;
|
let actorObject = this.actor;
|
||||||
let element = event.currentTarget;
|
let element = event.currentTarget;
|
||||||
|
|
|
@ -26,22 +26,42 @@ export class OseActor extends Actor {
|
||||||
/* Socket Listeners and Handlers
|
/* Socket Listeners and Handlers
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
getExperience(value, options = {}) {
|
getExperience(value, options = {}) {
|
||||||
console.log(this.data);
|
if (this.data.type != "character") {
|
||||||
if (this.data.type != 'character') {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let modified = value + (this.data.data.details.xp.bonus * value) / 100;
|
let modified = Math.floor(
|
||||||
console.log(modified);
|
value + (this.data.data.details.xp.bonus * value) / 100
|
||||||
|
);
|
||||||
return this.update({
|
return this.update({
|
||||||
"data.details.xp.value": modified + this.data.data.details.xp.value
|
"data.details.xp.value": modified + this.data.data.details.xp.value,
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
const speaker = ChatMessage.getSpeaker({actor: this});
|
const speaker = ChatMessage.getSpeaker({ actor: this });
|
||||||
ChatMessage.create({content: game.i18n.format("OSE.messages.getExperience", {name: this.name, value: modified}), speaker});
|
ChatMessage.create({
|
||||||
|
content: game.i18n.format("OSE.messages.getExperience", {
|
||||||
|
name: this.name,
|
||||||
|
value: modified,
|
||||||
|
}),
|
||||||
|
speaker,
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
/* Rolls */
|
/* Rolls */
|
||||||
/* -------------------------------------------- */
|
/* -------------------------------------------- */
|
||||||
|
|
||||||
|
rollHP(options = {}) {
|
||||||
|
let roll = new Roll(this.data.data.hp.hd).roll();
|
||||||
|
console.log(roll);
|
||||||
|
return this.update({
|
||||||
|
data: {
|
||||||
|
hp: {
|
||||||
|
max: roll.total,
|
||||||
|
value: roll.total,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
rollSave(save, options = {}) {
|
rollSave(save, options = {}) {
|
||||||
const label = game.i18n.localize(`OSE.saves.${save}.long`);
|
const label = game.i18n.localize(`OSE.saves.${save}.long`);
|
||||||
const rollParts = ["1d20"];
|
const rollParts = ["1d20"];
|
||||||
|
@ -57,7 +77,7 @@ export class OseActor extends Actor {
|
||||||
};
|
};
|
||||||
|
|
||||||
let skip = options.event && options.event.ctrlKey;
|
let skip = options.event && options.event.ctrlKey;
|
||||||
|
|
||||||
// Roll and return
|
// Roll and return
|
||||||
return OseDice.Roll({
|
return OseDice.Roll({
|
||||||
event: options.event,
|
event: options.event,
|
||||||
|
@ -132,7 +152,7 @@ export class OseActor extends Actor {
|
||||||
...this.data,
|
...this.data,
|
||||||
...{
|
...{
|
||||||
rollData: {
|
rollData: {
|
||||||
type: "Hit Dice"
|
type: "Hit Dice",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -186,20 +206,20 @@ export class OseActor extends Actor {
|
||||||
rollData: {
|
rollData: {
|
||||||
type: "Damage",
|
type: "Damage",
|
||||||
stat: attData.type,
|
stat: attData.type,
|
||||||
scores: data.scores
|
scores: data.scores,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
let dmgParts = [];
|
let dmgParts = [];
|
||||||
if (!attData.dmg || !game.settings.get('ose', 'variableWeaponDamage')) {
|
if (!attData.dmg || !game.settings.get("ose", "variableWeaponDamage")) {
|
||||||
dmgParts.push("1d6");
|
dmgParts.push("1d6");
|
||||||
} else {
|
} else {
|
||||||
dmgParts.push(attData.dmg);
|
dmgParts.push(attData.dmg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add Str to damage
|
// Add Str to damage
|
||||||
if (attData.type == 'melee') {
|
if (attData.type == "melee") {
|
||||||
dmgParts.push(data.scores.str.mod);
|
dmgParts.push(data.scores.str.mod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,7 +232,7 @@ export class OseActor extends Actor {
|
||||||
speaker: ChatMessage.getSpeaker({ actor: this }),
|
speaker: ChatMessage.getSpeaker({ actor: this }),
|
||||||
flavor: `${attData.label} - ${game.i18n.localize("OSE.Damage")}`,
|
flavor: `${attData.label} - ${game.i18n.localize("OSE.Damage")}`,
|
||||||
title: `${attData.label} - ${game.i18n.localize("OSE.Damage")}`,
|
title: `${attData.label} - ${game.i18n.localize("OSE.Damage")}`,
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
rollAttack(attData, options = {}) {
|
rollAttack(attData, options = {}) {
|
||||||
|
@ -240,7 +260,7 @@ export class OseActor extends Actor {
|
||||||
rollData: {
|
rollData: {
|
||||||
type: "Attack",
|
type: "Attack",
|
||||||
stat: attData.type,
|
stat: attData.type,
|
||||||
scores: data.scores
|
scores: data.scores,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -140,6 +140,11 @@ export class OseActorSheetMonster extends OseActorSheet {
|
||||||
actorObject.rollMorale({ event: event });
|
actorObject.rollMorale({ event: event });
|
||||||
});
|
});
|
||||||
|
|
||||||
|
html.find(".hp-roll").click((ev) => {
|
||||||
|
let actorObject = this.actor;
|
||||||
|
actorObject.rollHP({ event: event });
|
||||||
|
});
|
||||||
|
|
||||||
// Handle default listeners last so system listeners are triggered first
|
// Handle default listeners last so system listeners are triggered first
|
||||||
super.activateListeners(html);
|
super.activateListeners(html);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,10 @@
|
||||||
export class OseDice {
|
export class OseDice {
|
||||||
static digestResult(data, roll) {
|
static digestResult(data, roll) {
|
||||||
let details = "";
|
let result = {
|
||||||
|
isSuccess: false,
|
||||||
|
isFailure: false,
|
||||||
|
target: "",
|
||||||
|
};
|
||||||
// ATTACKS
|
// ATTACKS
|
||||||
let die = roll.parts[0].total;
|
let die = roll.parts[0].total;
|
||||||
if (data.rollData.type == "Attack") {
|
if (data.rollData.type == "Attack") {
|
||||||
|
@ -11,12 +15,12 @@ export class OseDice {
|
||||||
} else if (data.rollData.stat == "missile") {
|
} else if (data.rollData.stat == "missile") {
|
||||||
bba += data.data.thac0.mod.missile + data.rollData.scores.dex.mod;
|
bba += data.data.thac0.mod.missile + data.rollData.scores.dex.mod;
|
||||||
}
|
}
|
||||||
|
result.target = bba;
|
||||||
details = `<div class='roll-result roll-fail'><b>Failure</b> (${bba})</div>`;
|
|
||||||
if (die == 1) {
|
if (die == 1) {
|
||||||
return details;
|
result.isFailure = true;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
details = `<div class='roll-result'><b>Hits AC ${roll.total}</b> (${bba})</div>`;
|
result.isSuccess = true;
|
||||||
} else {
|
} else {
|
||||||
// B/X Historic THAC0 Calculation
|
// B/X Historic THAC0 Calculation
|
||||||
let thac = data.data.thac0.value;
|
let thac = data.data.thac0.value;
|
||||||
|
@ -25,11 +29,12 @@ export class OseDice {
|
||||||
} else if (data.rollData.stat == "missile") {
|
} else if (data.rollData.stat == "missile") {
|
||||||
thac -= data.data.thac0.mod.missile + data.rollData.scores.dex.mod;
|
thac -= data.data.thac0.mod.missile + data.rollData.scores.dex.mod;
|
||||||
}
|
}
|
||||||
details = `<div class='roll-result roll-fail'><b>Failure</b> (${thac})</div>`;
|
result.target = thac;
|
||||||
if (thac - roll.total > 9) {
|
if (thac - roll.total > 9) {
|
||||||
return details;
|
result.isFailure = true;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
details = `<div class='roll-result'><b>Hits AC ${Math.clamped(
|
result.details = `<div class='roll-result'><b>Hits AC ${Math.clamped(
|
||||||
thac - roll.total,
|
thac - roll.total,
|
||||||
-3,
|
-3,
|
||||||
9
|
9
|
||||||
|
@ -38,37 +43,41 @@ export class OseDice {
|
||||||
} else if (data.rollData.type == "Above") {
|
} else if (data.rollData.type == "Above") {
|
||||||
// SAVING THROWS
|
// SAVING THROWS
|
||||||
let sv = data.rollData.target;
|
let sv = data.rollData.target;
|
||||||
|
result.target = sv;
|
||||||
if (roll.total >= sv) {
|
if (roll.total >= sv) {
|
||||||
details = `<div class='roll-result roll-success'><b>Success!</b> (${sv})</div>`;
|
result.isSuccess = true;
|
||||||
} else {
|
} else {
|
||||||
details = `<div class='roll-result roll-fail'><b>Failure</b> (${sv})</div>`;
|
result.isFailure = true;
|
||||||
}
|
}
|
||||||
} else if (data.rollData.type == "Below") {
|
} else if (data.rollData.type == "Below") {
|
||||||
// Morale
|
// Morale
|
||||||
let m = data.rollData.target;
|
let m = data.rollData.target;
|
||||||
|
result.target = m;
|
||||||
if (roll.total <= m) {
|
if (roll.total <= m) {
|
||||||
details = `<div class='roll-result roll-success'><b>Success!</b> (${m})</div>`;
|
result.isSuccess = true;
|
||||||
} else {
|
} else {
|
||||||
details = `<div class='roll-result roll-fail'><b>Failure</b> (${m})</div>`;
|
result.isFailure = true;
|
||||||
}
|
}
|
||||||
} else if (data.rollData.type == "Check") {
|
} else if (data.rollData.type == "Check") {
|
||||||
// SCORE CHECKS
|
// SCORE CHECKS
|
||||||
let sc = data.rollData.target;
|
let sc = data.rollData.target;
|
||||||
|
result.target = sc;
|
||||||
if (die == 1 || (roll.total <= sc && die < 20)) {
|
if (die == 1 || (roll.total <= sc && die < 20)) {
|
||||||
details = `<div class='roll-result roll-success'><b>Success!</b> (${sc})</div>`;
|
result.isSuccess = true;
|
||||||
} else {
|
} else {
|
||||||
details = `<div class='roll-result roll-fail'><b>Failure</b> (${sc})</div>`;
|
result.isFailure = true;
|
||||||
}
|
}
|
||||||
} else if (data.rollData.type == "Exploration") {
|
} else if (data.rollData.type == "Exploration") {
|
||||||
// EXPLORATION CHECKS
|
// EXPLORATION CHECKS
|
||||||
let sc = data.data.exploration[data.rollData.stat];
|
let sc = data.data.exploration[data.rollData.stat];
|
||||||
|
result.target = sc;
|
||||||
if (roll.total <= sc) {
|
if (roll.total <= sc) {
|
||||||
details = `<div class='roll-result roll-success'><b>Success!</b> (${sc})</div>`;
|
result.isSuccess = true;
|
||||||
} else {
|
} else {
|
||||||
details = `<div class='roll-result roll-fail'><b>Failure</b> (${sc})</div>`;
|
result.isFailure = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return details;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static async sendRoll({
|
static async sendRoll({
|
||||||
|
@ -91,18 +100,18 @@ export class OseDice {
|
||||||
flavor: flavor,
|
flavor: flavor,
|
||||||
data: data,
|
data: data,
|
||||||
};
|
};
|
||||||
|
|
||||||
// Optionally include a situational bonus
|
// Optionally include a situational bonus
|
||||||
if (form !== null) data["bonus"] = form.bonus.value;
|
if (form !== null) data["bonus"] = form.bonus.value;
|
||||||
if (data["bonus"]) parts.push(data["bonus"]);
|
if (data["bonus"]) parts.push(data["bonus"]);
|
||||||
|
|
||||||
const roll = new Roll(parts.join("+"), data).roll();
|
const roll = new Roll(parts.join("+"), data).roll();
|
||||||
|
|
||||||
// Convert the roll to a chat message and return the roll
|
// Convert the roll to a chat message and return the roll
|
||||||
let rollMode = game.settings.get("core", "rollMode");
|
let rollMode = game.settings.get("core", "rollMode");
|
||||||
rollMode = form ? form.rollMode.value : rollMode;
|
rollMode = form ? form.rollMode.value : rollMode;
|
||||||
|
|
||||||
templateData.details = OseDice.digestResult(data, roll);
|
templateData.result = OseDice.digestResult(data, roll);
|
||||||
|
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
roll.render().then((r) => {
|
roll.render().then((r) => {
|
||||||
|
|
|
@ -14,14 +14,15 @@
|
||||||
.chat-details {
|
.chat-details {
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
font-size: 13px;
|
font-size: 13px;
|
||||||
.roll-result {
|
}
|
||||||
text-align: center;
|
.roll-result {
|
||||||
&.roll-success {
|
font-size: 13px;
|
||||||
color: #18520b;
|
text-align: center;
|
||||||
}
|
&.roll-success {
|
||||||
&.roll-fail {
|
color: #18520b;
|
||||||
color: #aa0200;
|
}
|
||||||
}
|
&.roll-fail {
|
||||||
|
color: #aa0200;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,21 @@
|
||||||
min-width: 75px;
|
min-width: 75px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.attributes {
|
||||||
|
.attribute.health {
|
||||||
|
position: relative;
|
||||||
|
.attribute-name .hp-roll {
|
||||||
|
font-size: 12px;
|
||||||
|
position: absolute;
|
||||||
|
right: 5px;
|
||||||
|
top: 5px;
|
||||||
|
color: $colorFaint;
|
||||||
|
&:hover {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
.attribute-group {
|
.attribute-group {
|
||||||
.attacks-description {
|
.attacks-description {
|
||||||
margin: 2px;
|
margin: 2px;
|
||||||
|
|
|
@ -9,7 +9,15 @@
|
||||||
"author": "U~man",
|
"author": "U~man",
|
||||||
"esmodules": ["ose.js"],
|
"esmodules": ["ose.js"],
|
||||||
"styles": ["ose.css"],
|
"styles": ["ose.css"],
|
||||||
"packs": [],
|
"packs": [
|
||||||
|
{
|
||||||
|
"name": "OSEMacros",
|
||||||
|
"label": "Old School Essentials Macros",
|
||||||
|
"system": "ose",
|
||||||
|
"path": "./packs/macros.db",
|
||||||
|
"entity": "Macro"
|
||||||
|
}
|
||||||
|
],
|
||||||
"languages": [
|
"languages": [
|
||||||
{
|
{
|
||||||
"lang": "en",
|
"lang": "en",
|
||||||
|
|
|
@ -141,7 +141,10 @@
|
||||||
"biography": "",
|
"biography": "",
|
||||||
"alignment": "",
|
"alignment": "",
|
||||||
"xp": 0,
|
"xp": 0,
|
||||||
"treasure": "",
|
"treasure": {
|
||||||
|
"table": "",
|
||||||
|
"type": ""
|
||||||
|
},
|
||||||
"appearing": "",
|
"appearing": "",
|
||||||
"morale": 0
|
"morale": 0
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
<section class="flexrow">
|
<section class="flexrow">
|
||||||
<ul class="attributes flexrow">
|
<ul class="attributes flexrow">
|
||||||
<li class="attribute health">
|
<li class="attribute health">
|
||||||
<h4 class="attribute-name box-title" title="{{localize 'OSE.Health'}}">{{ localize "OSE.HealthShort" }}</h4>
|
<h4 class="attribute-name box-title" title="{{localize 'OSE.Health'}}">{{ localize "OSE.HealthShort" }} <a class="hp-roll"><i class="fas fa-dice"></i></a></h4>
|
||||||
<div class="attribute-value flexrow">
|
<div class="attribute-value flexrow">
|
||||||
<input name="data.hp.value" type="text" value="{{data.hp.value}}" data-dtype="Number" placeholder="0" />
|
<input name="data.hp.value" type="text" value="{{data.hp.value}}" data-dtype="Number" placeholder="0" />
|
||||||
<span class="sep"> / </span>
|
<span class="sep"> / </span>
|
||||||
<input name="data.hp.max" type="text" value="{{data.hp.max}}" data-dtype="Number" placeholder="0" />
|
<input name="data.hp.max" type="text" value="{{data.hp.max}}" data-dtype="Number" placeholder="0" />
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li class="attribute">
|
<li class="attribute hit-dice">
|
||||||
<h4 class="attribute-name box-title" title="{{localize 'OSE.HitDice'}}">{{ localize "OSE.HitDiceShort" }}
|
<h4 class="attribute-name box-title" title="{{localize 'OSE.HitDice'}}"><a>{{ localize "OSE.HitDiceShort" }}</a>
|
||||||
</h4>
|
</h4>
|
||||||
<div class="attribute-value">
|
<div class="attribute-value">
|
||||||
<input name="data.hp.hd" type="text" value="{{data.hp.hd}}" data-dtype="String" />
|
<input name="data.hp.hd" type="text" value="{{data.hp.hd}}" data-dtype="String" />
|
||||||
|
|
|
@ -23,13 +23,17 @@
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="summary flexrow">
|
<ul class="summary flexrow">
|
||||||
<li class="flex2">
|
<li class="flex3">
|
||||||
<input type="text" name="data.details.xp" value="{{data.details.xp}}" />
|
<input type="text" name="data.details.xp" value="{{data.details.xp}}" />
|
||||||
<label>{{localize 'OSE.Experience'}}</label>
|
<label>{{localize 'OSE.Experience'}}</label>
|
||||||
</li>
|
</li>
|
||||||
<li class="flex2">
|
<li class="flex3">
|
||||||
<input type="text" name="data.details.treasure" value="{{data.details.treasure}}" />
|
<input type="text" name="data.details.treasure.type" value="{{data.details.treasure.type}}" />
|
||||||
<label>{{localize 'OSE.Treasure'}}</label>
|
<label>{{localize 'OSE.Treasure'}}</label>
|
||||||
</li>
|
</li>
|
||||||
|
<li title="{{localize 'OSE.TreasureTableHint'}}">
|
||||||
|
<div>{{data.details.treasure.table}}</div>
|
||||||
|
<label>{{localize 'OSE.TreasureTable'}}</label>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</section>
|
</section>
|
|
@ -1,7 +1,9 @@
|
||||||
<section class="ose chat-message">
|
<section class="ose chat-message">
|
||||||
<div class="ose chat-block">
|
<div class="ose chat-block">
|
||||||
<h2 class="chat-title">{{title}}</h2>
|
<h2 class="chat-title">{{title}}</h2>
|
||||||
{{#if details}}<div class="chat-details">{{{details}}}</div>{{/if}}
|
{{#if result.details}}<div class="chat-details">{{{result.details}}}</div>{{/if}}
|
||||||
|
{{#if result.isFailure}}<div class='roll-result roll-fail'><b>{{localize 'OSE.Failure'}}</b> ({{result.target}})</div>{{/if}}
|
||||||
|
{{#if result.isSuccess}}<div class='roll-result roll-success'><b>{{localize 'OSE.Success'}}</b> ({{result.target}})</div>{{/if}}
|
||||||
{{#if rollOSE}}<div>{{{rollOSE}}}</div>{{/if}}
|
{{#if rollOSE}}<div>{{{rollOSE}}}</div>{{/if}}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
Loading…
Reference in New Issue