ENH: Automatic movement

master
U~man 2020-07-09 13:54:03 +02:00
parent afef38bce6
commit afa1cd6c77
8 changed files with 115 additions and 41 deletions

View File

@ -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",

View File

@ -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);

View File

@ -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,
});
};

View File

@ -79,6 +79,9 @@
},
"character": {
"templates": ["common", "spellcaster"],
"config": {
"movementAuto": true
},
"details": {
"biography": "",
"class": "",

View File

@ -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">

View File

@ -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>

View File

@ -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">

View File

@ -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>