Downtime window now enumerates the actions/resources that will be refreshed upon completion. Resources can now specify their progression direction (#591)

This commit is contained in:
WBHarry 2025-08-05 13:43:14 +02:00 committed by GitHub
parent 645b8fef58
commit 599e9c7aa0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 140 additions and 2 deletions

View file

@ -375,6 +375,9 @@
"description": "Describe how you prepare yourself for the path ahead, then gain a Hope. If you choose to Prepare with one or more members of your party, you each gain 2 Hope."
}
},
"refreshable": {
"title": "Refreshing Resources"
},
"takeDowntime": "Take Downtime"
},
"HUD": {
@ -903,6 +906,10 @@
"abbreviation": "FR"
}
},
"ItemResourceProgression": {
"increasing": "Increasing",
"decreasing": "Decreasing"
},
"ItemResourceType": {
"simple": "Simple",
"diceValue": "Dice Value"
@ -1968,6 +1975,7 @@
"dieFaces": { "label": "Die Faces" },
"icon": { "label": "Icon" },
"max": { "label": "Max" },
"progression": { "label": "Progression" },
"recovery": { "label": "Recovery" },
"type": { "label": "Type" },
"value": { "label": "Value" }

View file

@ -24,6 +24,8 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
actor.system.bonuses.rest[`${shortrest ? 'short' : 'long'}Rest`].longMoves
}
};
this.refreshables = this.getRefreshables();
}
get title() {
@ -81,11 +83,56 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
context.shortRestMoves = this.nrChoices.shortRest.max > 0 ? this.moveData.shortRest : null;
context.longRestMoves = this.nrChoices.longRest.max > 0 ? this.moveData.longRest : null;
context.refreshables = this.refreshables;
context.disabledDowntime = shortRestMovesSelected === 0 && longRestMovesSelected === 0;
return context;
}
getRefreshables() {
const actionItems = this.actor.items.reduce((acc, x) => {
if (x.system.actions) {
const recoverable = x.system.actions.reduce((acc, action) => {
if (action.uses.recovery && (action.uses.recovery === 'shortRest') === this.shortrest) {
acc.push({
title: x.name,
name: action.name,
uuid: action.uuid
});
}
return acc;
}, []);
if (recoverable) {
acc.push(...recoverable);
}
}
return acc;
}, []);
const resourceItems = this.actor.items.reduce((acc, x) => {
if (
x.system.resource &&
x.system.resource.type &&
(x.system.resource.recovery === 'shortRest') === this.shortrest
) {
acc.push({
title: game.i18n.localize(`TYPES.Item.${x.type}`),
name: x.name,
uuid: x.uuid
});
}
return acc;
}, []);
return {
actionItems,
resourceItems
};
}
static selectMove(_, target) {
const { category, move } = target.dataset;
@ -172,11 +219,24 @@ export default class DhpDowntime extends HandlebarsApplicationMixin(ApplicationV
}
}
// We can close the window when all moves are taken
// We can close the window and refresh resources when all moves are taken
if (
this.nrChoices.shortRest.taken >= this.nrChoices.shortRest.max &&
this.nrChoices.longRest.taken >= this.nrChoices.longRest.max
) {
for (var data of this.refreshables.actionItems) {
const action = await foundry.utils.fromUuid(data.uuid);
await action.parent.parent.update({ [`system.actions.${action.id}.uses.value`]: action.uses.max ?? 1 });
}
for (var data of this.refreshables.resourceItems) {
const feature = await foundry.utils.fromUuid(data.uuid);
const increasing =
feature.system.resource.progression === CONFIG.DH.ITEM.itemResourceProgression.increasing.id;
const resetValue = increasing ? 0 : (feature.system.resource.max ?? 0);
await feature.update({ 'system.resource.value': resetValue });
}
this.close();
} else {
this.render();

View file

@ -1473,6 +1473,17 @@ export const itemResourceTypes = {
}
};
export const itemResourceProgression = {
increasing: {
id: 'increasing',
label: 'DAGGERHEART.CONFIG.ItemResourceProgression.increasing'
},
decreasing: {
id: 'decreasing',
label: 'DAGGERHEART.CONFIG.ItemResourceProgression.decreasing'
}
};
export const beastformTypes = {
normal: {
id: 'normal',

View file

@ -56,6 +56,11 @@ export default class BaseDataItem extends foundry.abstract.TypeDataModel {
initial: null,
nullable: true
}),
progression: new fields.StringField({
required: true,
choices: CONFIG.DH.ITEM.itemResourceProgression,
initial: CONFIG.DH.ITEM.itemResourceProgression.increasing.id
}),
diceStates: new fields.TypedObjectField(
new fields.SchemaField({
value: new fields.NumberField({ integer: true, initial: 1, min: 1 }),

View file

@ -63,6 +63,36 @@
}
}
.refreshables-container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4px;
font-size: 12px;
&.wide {
grid-template-columns: 1fr 1fr 1fr 1fr;
}
.refreshable-container {
border: 1px solid light-dark(@dark-blue, @golden);
border-radius: 6px;
color: light-dark(@dark, @beige);
background-image: url('../assets/parchments/dh-parchment-dark.png');
padding: 0 2px;
text-align: center;
display: flex;
flex-direction: column;
gap: 2px;
.refreshable-title {
font-weight: bold;
}
.refreshable-name {
}
}
}
footer {
margin-top: 8px;
display: flex;

View file

@ -7,6 +7,26 @@
{{#if shortRestMoves.moves}}{{> "systems/daggerheart/templates/dialogs/downtime/activities.hbs" moves=shortRestMoves.moves category='shortRest' nrChoices=nrChoices.shortRest}}{{/if}}
{{#if longRestMoves.moves}}{{> "systems/daggerheart/templates/dialogs/downtime/activities.hbs" moves=longRestMoves.moves category='longRest' nrChoices=nrChoices.longRest}}{{/if}}
</div>
<fieldset>
<legend>{{localize "DAGGERHEART.APPLICATIONS.Downtime.refreshable.title"}}</legend>
<div class="refreshables-container {{#if (and shortRestMoves longRestMoves)}}wide{{/if}}">
{{#each this.refreshables.actionItems as | item |}}
<div class="refreshable-container">
<div class="refreshable-title">{{item.title}}</div>
<div class="refreshable-name">{{item.name}}</div>
</div>
{{/each}}
{{#each this.refreshables.resourceItems as | item |}}
<div class="refreshable-container">
<div class="refreshable-title">{{item.title}}</div>
<div class="refreshable-name">{{item.name}}</div>
</div>
{{/each}}
</div>
</fieldset>
<footer>
<button type="button" data-action="close">{{localize "Cancel"}}</button>
<button type="button" data-action="takeDowntime" {{#if disabledDowntime}}disabled{{/if}}>{{localize "DAGGERHEART.APPLICATIONS.Downtime.takeDowntime"}}</button>

View file

@ -9,9 +9,13 @@
</legend>
{{#if source.system.resource}}
<div class="two-columns even">
<div class="{{#if (eq source.system.resource.type 'simple')}}nest-inputs{{else}}two-columns{{/if}} even">
{{formGroup systemFields.resource.fields.type value=source.system.resource.type localize=true blank=false}}
{{formGroup systemFields.resource.fields.recovery value=source.system.resource.recovery localize=true}}
{{#if (eq source.system.resource.type 'simple')}}
{{formGroup systemFields.resource.fields.progression value=source.system.resource.progression localize=true}}
{{/if}}
</div>
<div class="two-columns even">