ENH: Automatic movement
parent
afef38bce6
commit
afa1cd6c77
|
@ -131,6 +131,9 @@
|
|||
"OSE.Setting.EncumbranceHint": "Choose the way encumbrance is calculated",
|
||||
"OSE.Setting.EncumbranceBasic": "Basic",
|
||||
"OSE.Setting.EncumbranceDetailed": "Detailed",
|
||||
"OSE.Setting.MovementAuto": "Calculate Movement",
|
||||
"OSE.Setting.SignificantTreasure": "Significant Treasure Weight",
|
||||
"OSE.Setting.SignificantTreasureHint": "Weight at which treasure will reduce the movement, only useful for basic encumbrance",
|
||||
|
||||
"OSE.items.Equip": "Equip",
|
||||
"OSE.items.Unequip": "Unequip",
|
||||
|
|
|
@ -49,58 +49,104 @@ export class OseActorSheetCharacter extends OseActorSheet {
|
|||
|
||||
// Compute treasure
|
||||
let total = 0;
|
||||
data.owned.items.forEach(item => {
|
||||
data.owned.items.forEach((item) => {
|
||||
if (item.data.treasure) {
|
||||
total += item.data.quantity.value * item.data.cost;
|
||||
}
|
||||
}
|
||||
});
|
||||
data.treasure = total;
|
||||
|
||||
let basic = game.settings.get('ose', 'encumbranceOption') == 'basic';
|
||||
data.config.encumbrance = game.settings.get("ose", "encumbranceOption");
|
||||
let basic = data.config.encumbrance == "basic";
|
||||
// Compute encumbrance
|
||||
let totalWeight = 0;
|
||||
Object.values(data.owned).forEach(cat => {
|
||||
cat.forEach(item => {
|
||||
if (item.type == 'item' && (!basic || item.data.treasure)) {
|
||||
Object.values(data.owned).forEach((cat) => {
|
||||
cat.forEach((item) => {
|
||||
if (item.type == "item" && (!basic || item.data.treasure)) {
|
||||
totalWeight += item.data.quantity.value * item.data.weight;
|
||||
}
|
||||
else if (!basic) {
|
||||
} else if (!basic) {
|
||||
totalWeight += item.data.weight;
|
||||
}
|
||||
})
|
||||
});
|
||||
});
|
||||
data.encumbrance = {
|
||||
pct: Math.clamped(100 * parseFloat(totalWeight) / data.data.encumbrance.max, 0, 100),
|
||||
pct: Math.clamped(
|
||||
(100 * parseFloat(totalWeight)) / data.data.encumbrance.max,
|
||||
0,
|
||||
100
|
||||
),
|
||||
max: data.data.encumbrance.max,
|
||||
encumbered: totalWeight > data.data.encumbrance.max,
|
||||
value: totalWeight
|
||||
value: totalWeight,
|
||||
};
|
||||
|
||||
if (data.data.config.movementAuto) {
|
||||
this._calculateMovement(data, totalWeight);
|
||||
}
|
||||
|
||||
// Compute AC
|
||||
if (data.config.ascendingAC) {
|
||||
let baseAc = 10;
|
||||
data.owned.armors.forEach(a => {
|
||||
data.owned.armors.forEach((a) => {
|
||||
if (a.data.equipped) {
|
||||
baseAc += a.data.aac.value;
|
||||
baseAc += a.data.aac.value;
|
||||
}
|
||||
})
|
||||
});
|
||||
data.data.aac.value = baseAc + data.data.scores.dex.mod;
|
||||
|
||||
} else {
|
||||
let baseAc = 9;
|
||||
let shield = 0;
|
||||
data.owned.armors.forEach(a => {
|
||||
if (a.data.equipped && a.data.type != 'shield') {
|
||||
data.owned.armors.forEach((a) => {
|
||||
if (a.data.equipped && a.data.type != "shield") {
|
||||
baseAc = a.data.ac.value;
|
||||
} else if (a.data.equipped && a.data.type == 'shield') {
|
||||
shield = a.data.ac.value;
|
||||
} else if (a.data.equipped && a.data.type == "shield") {
|
||||
shield = a.data.ac.value;
|
||||
}
|
||||
})
|
||||
});
|
||||
data.data.ac.value = baseAc - data.data.scores.dex.mod - shield;
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
_calculateMovement(data, weight) {
|
||||
if (data.config.encumbrance == "detailed") {
|
||||
if (weight > 800) {
|
||||
data.data.movement.base = 30;
|
||||
} else if (weight > 600) {
|
||||
data.data.movement.base = 60;
|
||||
} else if (weight > 400) {
|
||||
data.data.movement.base = 90;
|
||||
} else {
|
||||
data.data.movement.base = 120;
|
||||
}
|
||||
} else if (data.config.encumbrance == "basic") {
|
||||
let heaviest = 0;
|
||||
data.owned.armors.forEach((a) => {
|
||||
if (a.data.equipped) {
|
||||
if (a.data.type == "light" && heaviest == 0) {
|
||||
heaviest = 1;
|
||||
} else if (a.data.type == "heavy") {
|
||||
heaviest = 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
switch (heaviest) {
|
||||
case 0:
|
||||
data.data.movement.base = 120;
|
||||
break;
|
||||
case 1:
|
||||
data.data.movement.base = 90;
|
||||
break;
|
||||
case 2:
|
||||
data.data.movement.base = 60;
|
||||
break;
|
||||
}
|
||||
if (weight > game.settings.get("ose", "significantTreasure")) {
|
||||
data.data.movement.base -= 30;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
|
||||
async _onQtChange(event) {
|
||||
|
@ -176,29 +222,33 @@ export class OseActorSheetCharacter extends OseActorSheet {
|
|||
actorObject.rollExploration(expl, { event: event });
|
||||
});
|
||||
|
||||
html.find(".ability-score .attribute-mod a").click(ev => {
|
||||
let box = $(event.currentTarget.parentElement.parentElement.parentElement);
|
||||
box.children('.attribute-bonuses').slideDown(200);
|
||||
})
|
||||
html.find(".ability-score .attribute-mod a").click((ev) => {
|
||||
let box = $(
|
||||
event.currentTarget.parentElement.parentElement.parentElement
|
||||
);
|
||||
box.children(".attribute-bonuses").slideDown(200);
|
||||
});
|
||||
|
||||
html.find(".ability-score .attribute-bonuses a").click(ev => {
|
||||
html.find(".ability-score .attribute-bonuses a").click((ev) => {
|
||||
$(event.currentTarget.parentElement.parentElement).slideUp(200);
|
||||
})
|
||||
});
|
||||
|
||||
html.find(".inventory .item-titles .item-caret").click(ev => {
|
||||
let items = $(event.currentTarget.parentElement.parentElement).children('.item-list');
|
||||
if (items.css('display') == "none") {
|
||||
let el = $(event.currentTarget).find('.fas.fa-caret-right');
|
||||
el.removeClass('fa-caret-right');
|
||||
el.addClass('fa-caret-down');
|
||||
html.find(".inventory .item-titles .item-caret").click((ev) => {
|
||||
let items = $(event.currentTarget.parentElement.parentElement).children(
|
||||
".item-list"
|
||||
);
|
||||
if (items.css("display") == "none") {
|
||||
let el = $(event.currentTarget).find(".fas.fa-caret-right");
|
||||
el.removeClass("fa-caret-right");
|
||||
el.addClass("fa-caret-down");
|
||||
items.slideDown(200);
|
||||
} else {
|
||||
let el = $(event.currentTarget).find('.fas.fa-caret-down');
|
||||
el.removeClass('fa-caret-down');
|
||||
el.addClass('fa-caret-right');
|
||||
let el = $(event.currentTarget).find(".fas.fa-caret-down");
|
||||
el.removeClass("fa-caret-down");
|
||||
el.addClass("fa-caret-right");
|
||||
items.slideUp(200);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
// Handle default listeners last so system listeners are triggered first
|
||||
super.activateListeners(html);
|
||||
|
|
|
@ -48,4 +48,13 @@ export const registerSettings = function () {
|
|||
detailed: "OSE.Setting.EncumbranceDetailed",
|
||||
},
|
||||
});
|
||||
|
||||
game.settings.register("ose", "significantTreasure", {
|
||||
name: game.i18n.localize("OSE.Setting.SignificantTreasure"),
|
||||
hint: game.i18n.localize("OSE.Setting.SignificantTreasureHint"),
|
||||
default: 800,
|
||||
scope: "world",
|
||||
type: Number,
|
||||
config: true,
|
||||
});
|
||||
};
|
||||
|
|
|
@ -79,6 +79,9 @@
|
|||
},
|
||||
"character": {
|
||||
"templates": ["common", "spellcaster"],
|
||||
"config": {
|
||||
"movementAuto": true
|
||||
},
|
||||
"details": {
|
||||
"biography": "",
|
||||
"class": "",
|
||||
|
|
|
@ -83,6 +83,18 @@
|
|||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="movementAuto">{{localize "OSE.Setting.MovementAuto"}}</label>
|
||||
<div class="form-fields">
|
||||
<input
|
||||
type="checkbox"
|
||||
name="data.config.movementAuto"
|
||||
id="movementAuto"
|
||||
{{checked
|
||||
data.config.movementAuto}}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{{/if}}
|
||||
<footer class="sheet-footer">
|
||||
<button type="submit">
|
||||
|
|
|
@ -49,9 +49,6 @@
|
|||
</h4>
|
||||
</a>
|
||||
</div>
|
||||
<div class="field-long">
|
||||
{{item.data.roll}}
|
||||
</div>
|
||||
<div class="item-controls">
|
||||
{{#if ../owner}}
|
||||
<a class="item-control item-show" title='{{localize "OSE.Show"}}'><i class="fas fa-eye"></i></a>
|
||||
|
|
|
@ -210,7 +210,7 @@
|
|||
{{ localize "OSE.MovementExplorationShort" }}</h4>
|
||||
<div class="attribute-value flexrow">
|
||||
<input name="data.movement.base" type="text" value="{{data.movement.base}}" placeholder="0"
|
||||
data-dtype="Number" />
|
||||
data-dtype="Number" {{#if data.config.movementAuto}}disabled{{/if}}/>
|
||||
</div>
|
||||
</li>
|
||||
<li class="attribute attribute-secondaries">
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<h3 class="item-name"><a>{{item.name}}</a></h3>
|
||||
</header>
|
||||
|
||||
<div class="card-content" style="display:none;">
|
||||
<div class="card-content">
|
||||
{{{data.description}}}
|
||||
</div>
|
||||
|
||||
|
|
Loading…
Reference in New Issue