ENH: Fix formula formatting, Morale check
parent
401d78f435
commit
70309c960e
|
@ -146,6 +146,11 @@ export class OseActorSheetCharacter extends OseActorSheet {
|
|||
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) => {
|
||||
let actorObject = this.actor;
|
||||
let element = event.currentTarget;
|
||||
|
|
|
@ -37,8 +37,8 @@ export class OseActor extends Actor {
|
|||
...this.data,
|
||||
...{
|
||||
rollData: {
|
||||
type: "Save",
|
||||
stat: save,
|
||||
type: "Above",
|
||||
target: this.data.data.saves[save].value,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
@ -54,6 +54,32 @@ export class OseActor extends Actor {
|
|||
});
|
||||
}
|
||||
|
||||
rollMorale(options = {}) {
|
||||
const label = game.i18n.localize(`OSE.Morale`);
|
||||
const rollParts = ["2d6"];
|
||||
|
||||
const data = {
|
||||
...this.data,
|
||||
...{
|
||||
rollData: {
|
||||
type: "Below",
|
||||
target: this.data.data.details.morale,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
// Roll and return
|
||||
return OseDice.Roll({
|
||||
event: options.event,
|
||||
parts: rollParts,
|
||||
data: data,
|
||||
skipDialog: true,
|
||||
speaker: ChatMessage.getSpeaker({ actor: this }),
|
||||
flavor: `${label} ${game.i18n.localize("OSE.Roll")}`,
|
||||
title: `${label} ${game.i18n.localize("OSE.Roll")}`,
|
||||
});
|
||||
}
|
||||
|
||||
rollCheck(score, options = {}) {
|
||||
const label = game.i18n.localize(`OSE.scores.${score}.long`);
|
||||
const rollParts = ["1d20"];
|
||||
|
@ -79,6 +105,31 @@ export class OseActor extends Actor {
|
|||
});
|
||||
}
|
||||
|
||||
rollHitDice(options = {}) {
|
||||
const label = game.i18n.localize(`OSE.HitDice`);
|
||||
const rollParts = [this.data.data.hp.hd];
|
||||
|
||||
const data = {
|
||||
...this.data,
|
||||
...{
|
||||
rollData: {
|
||||
type: "Hit Dice"
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
// Roll and return
|
||||
return OseDice.Roll({
|
||||
event: options.event,
|
||||
parts: rollParts,
|
||||
data: data,
|
||||
skipDialog: true,
|
||||
speaker: ChatMessage.getSpeaker({ actor: this }),
|
||||
flavor: `${label} ${game.i18n.localize("OSE.Roll")}`,
|
||||
title: `${label} ${game.i18n.localize("OSE.Roll")}`,
|
||||
});
|
||||
}
|
||||
|
||||
rollExploration(expl, options = {}) {
|
||||
const label = game.i18n.localize(`OSE.exploration.${expl}.long`);
|
||||
const rollParts = ["1d6"];
|
||||
|
|
|
@ -135,6 +135,11 @@ export class OseActorSheetMonster extends OseActorSheet {
|
|||
return this.actor.createOwnedItem(itemData, {});
|
||||
});
|
||||
|
||||
html.find(".morale-check a").click((ev) => {
|
||||
let actorObject = this.actor;
|
||||
actorObject.rollMorale({ event: event });
|
||||
});
|
||||
|
||||
// Handle default listeners last so system listeners are triggered first
|
||||
super.activateListeners(html);
|
||||
}
|
||||
|
|
|
@ -34,16 +34,23 @@ export class OseDice {
|
|||
-3,
|
||||
9
|
||||
)}</b> (${thac})</div>`;
|
||||
// ADD DAMAGE ROLL
|
||||
}
|
||||
} else if (data.rollData.type == "Save") {
|
||||
} else if (data.rollData.type == "Above") {
|
||||
// SAVING THROWS
|
||||
let sv = data.data.saves[data.rollData.stat].value;
|
||||
let sv = data.rollData.target;
|
||||
if (roll.total >= sv) {
|
||||
details = `<div class='roll-result roll-success'><b>Success!</b> (${sv})</div>`;
|
||||
} else {
|
||||
details = `<div class='roll-result roll-fail'><b>Failure</b> (${sv})</div>`;
|
||||
}
|
||||
} else if (data.rollData.type == "Below") {
|
||||
// Morale
|
||||
let m = data.rollData.target;
|
||||
if (roll.total <= m) {
|
||||
details = `<div class='roll-result roll-success'><b>Success!</b> (${m})</div>`;
|
||||
} else {
|
||||
details = `<div class='roll-result roll-fail'><b>Failure</b> (${m})</div>`;
|
||||
}
|
||||
} else if (data.rollData.type == "Check") {
|
||||
// SCORE CHECKS
|
||||
let sc = data.data.scores[data.rollData.stat].value;
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
import { OseDice } from "../dice.js";
|
||||
|
||||
/**
|
||||
* Override and extend the basic :class:`Item` implementation
|
||||
*/
|
||||
|
@ -48,7 +50,6 @@ export class OseItem extends Item {
|
|||
}
|
||||
|
||||
rollWeapon() {
|
||||
console.log("WEAPON");
|
||||
if (this.data.data.missile) {
|
||||
this.actor.rollAttack({type: 'missile', label: this.name, dmg: this.data.data.damage});
|
||||
} else if (this.data.data.melee) {
|
||||
|
@ -60,25 +61,32 @@ export class OseItem extends Item {
|
|||
}
|
||||
|
||||
async rollFormula(options={}) {
|
||||
console.log("FORMULA");
|
||||
if ( !this.data.data.roll ) {
|
||||
throw new Error("This Item does not have a formula to roll!");
|
||||
}
|
||||
|
||||
// Define Roll Data
|
||||
const rollData = {
|
||||
item: this.data.data
|
||||
};
|
||||
const title = `${this.name} - Roll`;
|
||||
const label = `${this.name}`;
|
||||
const rollParts = [this.data.data.roll];
|
||||
|
||||
// Invoke the roll and submit it to chat
|
||||
const roll = new Roll(rollData.item.roll, rollData).roll();
|
||||
roll.toMessage({
|
||||
speaker: ChatMessage.getSpeaker({actor: this.actor}),
|
||||
flavor: this.data.data.chatFlavor || title,
|
||||
rollMode: game.settings.get("core", "rollMode")
|
||||
const data = {
|
||||
...this.data,
|
||||
...{
|
||||
rollData: {
|
||||
type: "Formula"
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
// Roll and return
|
||||
return OseDice.Roll({
|
||||
event: options.event,
|
||||
parts: rollParts,
|
||||
data: data,
|
||||
skipDialog: true,
|
||||
speaker: ChatMessage.getSpeaker({ actor: this }),
|
||||
flavor: `${label} ${game.i18n.localize("OSE.Roll")}`,
|
||||
title: `${label} ${game.i18n.localize("OSE.Roll")}`,
|
||||
});
|
||||
return roll;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,6 +1,17 @@
|
|||
.ose.actor.monster {
|
||||
min-height: 565px;
|
||||
min-width: 460px;
|
||||
.header-details {
|
||||
.summary {
|
||||
.morale-check {
|
||||
line-height: 35px;
|
||||
flex: 0 0 20px;
|
||||
&:hover {
|
||||
color: $colorDark;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.sheet-body {
|
||||
.editor {
|
||||
height: 300px;
|
||||
|
|
|
@ -29,11 +29,21 @@
|
|||
}
|
||||
},
|
||||
"saves": {
|
||||
"death": 10,
|
||||
"wand": 10,
|
||||
"paralysis": 10,
|
||||
"breath": 10,
|
||||
"spell": 10
|
||||
"death": {
|
||||
"value": 10
|
||||
},
|
||||
"wand": {
|
||||
"value": 10
|
||||
},
|
||||
"paralysis": {
|
||||
"value": 10
|
||||
},
|
||||
"breath": {
|
||||
"value": 10
|
||||
},
|
||||
"spell": {
|
||||
"value": 10
|
||||
}
|
||||
},
|
||||
"movement": {
|
||||
"base": 120
|
||||
|
|
|
@ -126,9 +126,9 @@
|
|||
</div>
|
||||
<div class="flexrow">
|
||||
<ul class="attributes flexrow">
|
||||
<li class="attribute">
|
||||
<li class="attribute hit-dice">
|
||||
<h4 class="attribute-name box-title" title="{{ localize 'OSE.HitDice' }}">
|
||||
{{ localize "OSE.HitDiceShort" }}
|
||||
<a>{{ localize "OSE.HitDiceShort" }}</a>
|
||||
</h4>
|
||||
<div class="attribute-value">
|
||||
<input name="data.hp.hd" type="text" value="{{data.hp.hd}}" placeholder=""
|
||||
|
|
|
@ -13,9 +13,12 @@
|
|||
<label>{{localize 'OSE.Appearing'}}</label>
|
||||
</li>
|
||||
{{#if config.morale}}
|
||||
<li>
|
||||
<input type="text" name="data.details.morale" value="{{data.details.morale}}" />
|
||||
<label>{{localize 'OSE.Morale'}}</label>
|
||||
<li class="flexrow">
|
||||
<div>
|
||||
<input type="text" name="data.details.morale" value="{{data.details.morale}}" />
|
||||
<label>{{localize 'OSE.Morale'}}</label>
|
||||
</div>
|
||||
<div class="morale-check"><a><i class="fas fa-dice"></i></a></div>
|
||||
</li>
|
||||
{{/if}}
|
||||
</ul>
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
{{/if}}
|
||||
|
||||
{{#if data.roll}}
|
||||
<button data-action="formula">{{ localize "OSE.Roll"}}</button>
|
||||
<button data-action="formula">{{ localize "OSE.Roll"}} {{data.roll}}</button>
|
||||
{{/if}}
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Reference in New Issue