FIX: Monster rolls

master
U~man 2020-07-04 23:02:03 +02:00
parent 573c9fe23c
commit ebcdcc8465
8 changed files with 109 additions and 116 deletions

View File

@ -51,8 +51,6 @@ export class OseActorSheetCharacter extends OseActorSheet {
data.config.ascendingAC = game.settings.get("ose", "ascendingAC");
data.config.individualInit = game.settings.get("ose", "individualInit");
data.mods = this.actor.computeModifiers();
// Compute treasure
let total = 0;
data.owned.items.forEach(item => {

View File

@ -9,12 +9,14 @@ export class OseActor extends Actor {
super.prepareData();
const data = this.data.data;
// Compute modifiers from actor scores
this.computeModifiers();
// Determine Initiative
if (game.settings.get("ose", "individualInit")) {
data.initiative.value = data.initiative.mod;
if (this.data.type == "character") {
const mods = this.computeModifiers();
data.initiative.value += mods.dex;
data.initiative.value += data.scores.dex.mod;
}
} else {
data.initiative.value = 0;
@ -105,63 +107,49 @@ export class OseActor extends Actor {
rollAttack(attack, options = {}) {
const label = game.i18n.localize(`OSE.${attack}`);
const rollParts = ["1d20"];
const data = this.data.data;
const mods = this.computeModifiers();
if (attack == "Missile") {
rollParts.push(
"+",
mods.dex.toString(),
data.scores.dex.mod.toString(),
"+",
this.data.data.thac0.mod.missile.toString()
data.thac0.mod.missile.toString()
);
} else if (attack == "Melee") {
rollParts.push(
"+",
mods.str.toString(),
data.scores.str.mod.toString(),
"+",
this.data.data.thac0.mod.melee.toString()
data.thac0.mod.melee.toString()
);
}
if (game.settings.get("ose", "ascendingAC")) {
rollParts.push("+", this.data.data.thac0.bba.toString());
}
const data = {
const rollData = {
...this.data,
...{
rollData: {
type: "Attack",
stat: attack,
mods: mods,
scores: data.scores,
},
},
};
// Roll and return
return OseDice.Roll({
event: options.event,
parts: rollParts,
data: data,
data: rollData,
speaker: ChatMessage.getSpeaker({ actor: this }),
flavor: `${label} ${game.i18n.localize("OSE.Attack")}`,
title: `${label} ${game.i18n.localize("OSE.Attack")}`,
});
}
computeModifiers() {
if (this.data.type != "character") {
return {
str: 0,
dex: 0,
int: 0,
con: 0,
wis: 0,
cha: 0,
npc: 0,
init: 0,
};
}
let _valueToMod = (val) => {
static _valueToMod(val) {
switch (val) {
case 3:
return -3;
@ -189,27 +177,31 @@ export class OseActor extends Actor {
default:
return 0;
}
};
let mods = {
str: _valueToMod(this.data.data.scores.str.value),
int: _valueToMod(this.data.data.scores.int.value),
dex: _valueToMod(this.data.data.scores.dex.value),
init: _valueToMod(this.data.data.scores.dex.value),
cha: _valueToMod(this.data.data.scores.cha.value),
npc: _valueToMod(this.data.data.scores.cha.value),
wis: _valueToMod(this.data.data.scores.wis.value),
con: _valueToMod(this.data.data.scores.con.value),
};
if (mods.init > 1) {
mods.init -= 1;
} else if (mods.init < -1) {
mods.init += 1;
}
if (mods.npc > 1) {
mods.npc -= 1;
} else if (mods.npc < -1) {
mods.npc += 1;
static _cappedMod(val) {
let mod = OseActor._valueToMod(val);
if (mod > 1) {
mod -= 1;
} else if (mod < -1) {
mod += 1;
}
return mods;
return mod;
}
computeModifiers() {
if (this.data.type != "character") {
return;
}
const data = this.data.data;
data.scores.str.mod = OseActor._valueToMod(this.data.data.scores.str.value);
data.scores.int.mod = OseActor._valueToMod(this.data.data.scores.int.value);
data.scores.dex.mod = OseActor._valueToMod(this.data.data.scores.dex.value);
data.scores.cha.mod = OseActor._valueToMod(this.data.data.scores.cha.value);
data.scores.wis.mod = OseActor._valueToMod(this.data.data.scores.wis.value);
data.scores.con.mod = OseActor._valueToMod(this.data.data.scores.con.value);
data.scores.dex.init = OseActor._cappedMod(this.data.data.scores.dex.value);
data.scores.cha.npc = OseActor._cappedMod(this.data.data.scores.cha.value);
}
}

View File

@ -1,16 +1,17 @@
export class OseDice {
static digestResult(data, roll) {
let details = "";
// ATTACKS
let die = roll.parts[0].total;
if (data.rollData.type == "Attack") {
if (game.settings.get("ose", "ascendingAC")) {
let bba = data.data.thac0.bba;
bba +=
data.rollData.stat == "Melee"
? data.data.thac0.mod.melee + data.rollData.mods.str
: data.data.thac0.mod.missile + data.rollData.mods.dex;
if (data.rollData.stat == "Melee") {
bba += data.data.thac0.mod.melee + data.rollData.scores.str.mod;
} else if (data.rollData.stat == "Missile") {
bba += data.data.thac0.mod.missile + data.rollData.scores.dex.mod;
}
details = `<div class='roll-result roll-fail'><b>Failure</b> (${bba})</div>`;
if (die == 1) {
return details;
@ -19,11 +20,11 @@ export class OseDice {
} else {
// B/X Historic THAC0 Calculation
let thac = data.data.thac0.value;
thac -=
data.rollData.stat == "Melee"
? data.data.thac0.mod.melee + data.rollData.mods.str
: data.data.thac0.mod.missile + data.rollData.mods.dex;
if (data.rollData.stat == "Melee") {
thac -= data.data.thac0.mod.melee + data.rollData.scores.str.mod;
} else if (data.rollData.stat == "Missile") {
thac -= data.data.thac0.mod.missile + data.rollData.scores.dex.mod;
}
details = `<div class='roll-result roll-fail'><b>Failure</b> (${thac})</div>`;
if (thac - roll.total > 9) {
return details;

View File

@ -54,6 +54,8 @@ export class OseItem extends Item {
} else if (this.data.data.melee) {
this.actor.rollAttack('Melee');
return true;
} else {
this.actor.rollAttack();
}
return false;
}
@ -84,6 +86,7 @@ export class OseItem extends Item {
* @return {Promise}
*/
async roll({ configureDialog = true } = {}) {
console.log(this.data);
if (this.data.type == 'weapon') {
if (this.rollWeapon()) return;
}

View File

@ -72,8 +72,7 @@
position: absolute;
transform: rotate(90deg);
top: 365px;
right: -168px;
border-bottom: 1px solid black;
right: -169px;
width: 320px;
z-index: -1;
.item {

View File

@ -97,27 +97,27 @@
"scores": {
"str": {
"value": 0,
"mod": 0
"bonus": 0
},
"int": {
"value": 0,
"mod": 0
"bonus": 0
},
"wis": {
"value": 0,
"mod": 0
"bonus": 0
},
"dex": {
"value": 0,
"mod": 0
"bonus": 0
},
"con": {
"value": 0,
"mod": 0
"bonus": 0
},
"cha": {
"value": 0,
"mod": 0
"bonus": 0
}
},
"encumbrance": {

View File

@ -11,7 +11,7 @@
<span class="attribute-mod"><a><i class="fas fa-circle"></i></a></span>
</div>
<div class="attribute-bonuses">
{{localize 'OSE.Melee'}} ({{mods.str}})<br/>
{{localize 'OSE.Melee'}} ({{data.scores.str.mod}})<br/>
{{localize 'OSE.exploration.od.long'}}
<span class="attribute-mod"><a><i class="fas fa-circle"></i></a></span>
</div>
@ -39,7 +39,7 @@
<span class="attribute-mod"><a><i class="fas fa-circle"></i></a></span>
</div>
<div class="attribute-bonuses">
{{localize 'OSE.saves.magic.long'}}({{mods.wis}})
{{localize 'OSE.saves.magic.long'}}({{data.scores.wis.mod}})
<span class="attribute-mod"><a><i class="fas fa-circle"></i></a></span>
</div>
</li>
@ -52,9 +52,9 @@
<span class="attribute-mod"><a><i class="fas fa-circle"></i></a></span>
</div>
<div class="attribute-bonuses">
{{localize 'OSE.Missile'}} ({{mods.dex}})<br/>
{{localize 'OSE.Initiative'}} ({{mods.init}})<br/>
{{localize 'OSE.ArmorClass'}} ({{mods.dex}})
{{localize 'OSE.Missile'}} ({{data.scores.dex.mod}})<br/>
{{localize 'OSE.Initiative'}} ({{data.scores.dex.init}})<br/>
{{localize 'OSE.ArmorClass'}} ({{data.scores.dex.mod}})
<span class="attribute-mod"><a><i class="fas fa-circle"></i></a></span>
</div>
</li>
@ -67,7 +67,7 @@
<span class="attribute-mod"><a><i class="fas fa-circle"></i></a></span>
</div>
<div class="attribute-bonuses">
{{localize 'OSE.Health'}} ({{mods.con}})
{{localize 'OSE.Health'}} ({{data.scores.con.mod}})
<span class="attribute-mod"><a><i class="fas fa-circle"></i></a></span>
</div>
</li>
@ -80,9 +80,9 @@
<span class="attribute-mod"><a><i class="fas fa-circle"></i></a></span>
</div>
<div class="attribute-bonuses">
{{localize 'OSE.NPCReaction'}} ({{mods.npc}})<br/>
{{localize 'OSE.RetainersMax'}} ({{add mods.cha 4}})<br/>
{{localize 'OSE.Loyalty'}} ({{add mods.cha 7}})
{{localize 'OSE.NPCReaction'}} ({{data.scores.cha.npc}})<br/>
{{localize 'OSE.RetainersMax'}} ({{add data.scores.cha.mod 4}})<br/>
{{localize 'OSE.Loyalty'}} ({{add data.scores.cha.mod 7}})
<span class="attribute-mod"><a><i class="fas fa-circle"></i></a></span>
</div>
</li>
@ -114,12 +114,12 @@
{{#if config.ascendingAC}}
<input class="health-top" name="data.aac.value" type="text" value="{{data.aac.value}}"
data-dtype="Number" placeholder="0" title="{{localize 'OSE.ArmorClass'}}" />
<input class="health-bottom" type="text" value="{{add 10 mods.dex}}"
<input class="health-bottom" type="text" value="{{add 10 data.scores.dex.mod}}"
title="{{localize 'OSE.ArmorClassNaked'}}" disabled />
{{else}}
<input class="health-top" name="data.ac.value" type="text" value="{{data.ac.value}}" data-dtype="Number"
placeholder="0" title="{{localize 'OSE.ArmorClass'}}" />
<input class="health-bottom" type="text" value="{{subtract mods.dex 9}}"
<input class="health-bottom" type="text" value="{{subtract data.scores.dex.mod 9}}"
title="{{localize 'OSE.ArmorClass'}}" disabled />
{{/if}}
</div>
@ -140,8 +140,8 @@
<h4 class="attribute-name box-title" title="{{ localize 'OSE.Initiative' }}">
{{ localize "OSE.InitiativeShort" }}</h4>
<div class="attribute-value"
title="{{localize 'OSE.scores.dex.long'}}({{mods.init}}) + {{localize 'OSE.Modifier'}}({{data.initiative.mod}})">
{{add mods.init data.initiative.mod}}
title="{{localize 'OSE.scores.dex.long'}}({{data.scores.dex.init}}) + {{localize 'OSE.Modifier'}}({{data.initiative.mod}})">
{{add data.scores.dex.init data.initiative.mod}}
</div>
</li>
{{/if}}
@ -155,13 +155,13 @@
<div class="flexrow">
{{#if config.ascendingAC}}
<div class="attribute-value"
title="{{localize 'OSE.AB'}}({{data.thac0.bba}}) + {{localize 'OSE.scores.str.long'}}({{mods.str}}) + {{localize 'OSE.Modifier'}}({{data.thac0.mod.melee}})">
{{add data.thac0.mod.melee (add mods.str data.thac0.bba)}}
title="{{localize 'OSE.AB'}}({{data.thac0.bba}}) + {{localize 'OSE.scores.str.long'}}({{data.scores.str.mod}}) + {{localize 'OSE.Modifier'}}({{data.thac0.mod.melee}})">
{{add data.thac0.mod.melee (add data.scores.str.mod data.thac0.bba)}}
</div>
{{else}}
<div class="attribute-value"
title="{{localize 'OSE.Thac0'}}({{data.thac0.value}}) - {{localize 'OSE.scores.str.long'}}({{mods.str}}) - {{localize 'OSE.Modifier'}}({{data.thac0.mod.melee}})">
{{subtract data.thac0.mod.melee (subtract mods.str data.thac0.value)}}
title="{{localize 'OSE.Thac0'}}({{data.thac0.value}}) - {{localize 'OSE.scores.str.long'}}({{data.scores.str.mod}}) - {{localize 'OSE.Modifier'}}({{data.thac0.mod.melee}})">
{{subtract data.thac0.mod.melee (subtract data.scores.str.mod data.thac0.value)}}
</div>
{{/if}}
</div>
@ -195,13 +195,13 @@
<div class="flexrow">
{{#if config.ascendingAC}}
<div class="attribute-value"
title="{{localize 'OSE.AB'}}({{data.thac0.bba}}) + {{localize 'OSE.scores.dex.long'}}({{mods.dex}}) + {{localize 'OSE.Modifier'}}({{data.thac0.mod.missile}})">
{{add data.thac0.mod.missile (add mods.dex data.thac0.bba)}}
title="{{localize 'OSE.AB'}}({{data.thac0.bba}}) + {{localize 'OSE.scores.dex.long'}}({{data.scores.dex.mod}}) + {{localize 'OSE.Modifier'}}({{data.thac0.mod.missile}})">
{{add data.thac0.mod.missile (add data.scores.dex.mod data.thac0.bba)}}
</div>
{{else}}
<div class="attribute-value"
title="{{localize 'OSE.Thac0'}}({{data.thac0.value}}) - {{localize 'OSE.scores.dex.long'}}({{mods.dex}}) - {{localize 'OSE.Modifier'}}({{data.thac0.mod.missile}})">
{{subtract data.thac0.mod.missile (subtract mods.dex data.thac0.value)}}
title="{{localize 'OSE.Thac0'}}({{data.thac0.value}}) - {{localize 'OSE.scores.dex.long'}}({{data.scores.dex.mod}}) - {{localize 'OSE.Modifier'}}({{data.thac0.mod.missile}})">
{{subtract data.thac0.mod.missile (subtract data.scores.dex.mod data.thac0.value)}}
</div>
{{/if}}
</div>
@ -280,8 +280,8 @@
<li class="attribute saving-throw">
<h4 class="attribute-name box-title" title="{{ localize 'OSE.saves.magic.long' }}">
{{ localize "OSE.saves.magic.long"}}</h4>
<div class="attribute-value flat" title="{{localize 'OSE.scores.wis.long'}}({{mods.wis}})">
{{mods.wis}}
<div class="attribute-value flat" title="{{localize 'OSE.scores.wis.long'}}({{data.scores.wis.mod}})">
{{data.scores.wis.mod}}
</div>
</li>
</ul>

View File

@ -32,7 +32,7 @@
</div>
{{/if}}
</li>
<li class="attribute attack" data-attack="Melee">
<li class="attribute attack" data-attack="Attack">
{{#if config.ascendingAC}}
<h4 class="attribute-name box-title" title="{{localize 'OSE.AB'}}"><a>{{ localize "OSE.ABShort" }}</a></h4>
<div class="attribute-value">
@ -130,7 +130,7 @@
<div class="attribute-group">
<div class="attacks-description">
<label>{{ localize "OSE.Attacks" }}</label>
<input name="data.att" type="text" value="{{data.att}}" placeholder="0" data-dtype="String" />
<input name="data.att" type="text" value="{{data.att}}" data-dtype="String" />
</div>
<ul class="attributes">
<li class="attribute saving-throw" data-save="death">