mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-11 19:25:21 +01:00
[Feature] Countdown Rols And Randomzie (#1329)
* . * . * . * Raised system version
This commit is contained in:
parent
9e0bc3cff1
commit
d137e33c3d
37 changed files with 281 additions and 87 deletions
14
lang/en.json
14
lang/en.json
|
|
@ -344,7 +344,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"current": { "label": "Current" },
|
"current": { "label": "Current" },
|
||||||
"looping": { "label": "Looping" },
|
"looping": { "label": "Looping" },
|
||||||
"max": { "label": "Max" },
|
"start": { "label": "Start" },
|
||||||
|
"startFormula": { "label": "Start Formula" },
|
||||||
"type": {
|
"type": {
|
||||||
"label": { "label": "Label", "hint": "Used for custom" },
|
"label": { "label": "Label", "hint": "Used for custom" },
|
||||||
"value": { "label": "Value" }
|
"value": { "label": "Value" }
|
||||||
|
|
@ -372,12 +373,13 @@
|
||||||
"newCountdown": "New Countdown",
|
"newCountdown": "New Countdown",
|
||||||
"removeCountdownTitle": "Remove Countdown",
|
"removeCountdownTitle": "Remove Countdown",
|
||||||
"removeCountdownText": "Are you sure you want to remove the countdown: {name}?",
|
"removeCountdownText": "Are you sure you want to remove the countdown: {name}?",
|
||||||
"current": "Current",
|
"current": "Current Value",
|
||||||
"max": "Max",
|
"start": "Start Value",
|
||||||
"currentCountdownValue": "Current: {value}",
|
"startFormula": "Randomized Start Value Formula",
|
||||||
"currentCountdownMax": "Max: {value}",
|
"currentCountdownCurrent": "Current: {value}",
|
||||||
|
"currentCountdownStart": "Start: {value}",
|
||||||
"category": "Category",
|
"category": "Category",
|
||||||
"progressionType": "Progression Type",
|
"progressionType": "Progression",
|
||||||
"decreasing": "Decreasing",
|
"decreasing": "Decreasing",
|
||||||
"looping": "Looping",
|
"looping": "Looping",
|
||||||
"defaultOwnershipTooltip": "The default player ownership of countdowns",
|
"defaultOwnershipTooltip": "The default player ownership of countdowns",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import { DhCountdown } from '../../data/countdowns.mjs';
|
import { DhCountdown } from '../../data/countdowns.mjs';
|
||||||
|
import { waitForDiceSoNice } from '../../helpers/utils.mjs';
|
||||||
import { emitAsGM, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs';
|
import { emitAsGM, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs';
|
||||||
|
|
||||||
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
||||||
|
|
@ -26,6 +27,7 @@ export default class CountdownEdit extends HandlebarsApplicationMixin(Applicatio
|
||||||
toggleCountdownEdit: CountdownEdit.#toggleCountdownEdit,
|
toggleCountdownEdit: CountdownEdit.#toggleCountdownEdit,
|
||||||
editCountdownImage: CountdownEdit.#editCountdownImage,
|
editCountdownImage: CountdownEdit.#editCountdownImage,
|
||||||
editCountdownOwnership: CountdownEdit.#editCountdownOwnership,
|
editCountdownOwnership: CountdownEdit.#editCountdownOwnership,
|
||||||
|
randomiseCountdownStart: CountdownEdit.#randomiseCountdownStart,
|
||||||
removeCountdown: CountdownEdit.#removeCountdown
|
removeCountdown: CountdownEdit.#removeCountdown
|
||||||
},
|
},
|
||||||
form: { handler: this.updateData, submitOnChange: true }
|
form: { handler: this.updateData, submitOnChange: true }
|
||||||
|
|
@ -57,6 +59,7 @@ export default class CountdownEdit extends HandlebarsApplicationMixin(Applicatio
|
||||||
? 'DAGGERHEART.UI.Countdowns.decreasingLoop'
|
? 'DAGGERHEART.UI.Countdowns.decreasingLoop'
|
||||||
: 'DAGGERHEART.UI.Countdowns.loop'
|
: 'DAGGERHEART.UI.Countdowns.loop'
|
||||||
: null;
|
: null;
|
||||||
|
const randomizeValid = !new Roll(countdown.progress.startFormula ?? '').isDeterministic;
|
||||||
acc[key] = {
|
acc[key] = {
|
||||||
...countdown,
|
...countdown,
|
||||||
typeName: game.i18n.localize(CONFIG.DH.GENERAL.countdownBaseTypes[countdown.type].label),
|
typeName: game.i18n.localize(CONFIG.DH.GENERAL.countdownBaseTypes[countdown.type].label),
|
||||||
|
|
@ -67,6 +70,7 @@ export default class CountdownEdit extends HandlebarsApplicationMixin(Applicatio
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
editing: this.editingCountdowns.has(key),
|
editing: this.editingCountdowns.has(key),
|
||||||
|
randomizeValid,
|
||||||
loopTooltip
|
loopTooltip
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -123,18 +127,26 @@ export default class CountdownEdit extends HandlebarsApplicationMixin(Applicatio
|
||||||
// Sync current and max if max is changing and they were equal before
|
// Sync current and max if max is changing and they were equal before
|
||||||
for (const [id, countdown] of Object.entries(settingsData.countdowns ?? {})) {
|
for (const [id, countdown] of Object.entries(settingsData.countdowns ?? {})) {
|
||||||
const existing = this.data.countdowns[id];
|
const existing = this.data.countdowns[id];
|
||||||
const wasEqual = existing && existing.progress.current === existing.progress.max;
|
countdown.progress.current = this.getMatchingCurrentValue(
|
||||||
if (wasEqual && countdown.progress.max !== existing.progress.max) {
|
existing,
|
||||||
countdown.progress.current = countdown.progress.max;
|
countdown.progress.start,
|
||||||
} else {
|
countdown.progress.current
|
||||||
countdown.progress.current = Math.min(countdown.progress.current, countdown.progress.max);
|
);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.hideNewCountdowns = hideNewCountdowns;
|
this.hideNewCountdowns = hideNewCountdowns;
|
||||||
this.updateSetting(settingsData);
|
this.updateSetting(settingsData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getMatchingCurrentValue(oldCount, newStart, newCurrent) {
|
||||||
|
const wasEqual = oldCount && oldCount.progress.current === oldCount.progress.start;
|
||||||
|
if (wasEqual && newStart !== oldCount.progress.start) {
|
||||||
|
return newStart;
|
||||||
|
} else {
|
||||||
|
return Math.min(newCurrent, newStart);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async gmSetSetting(data) {
|
async gmSetSetting(data) {
|
||||||
await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns, data),
|
await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns, data),
|
||||||
game.socket.emit(`system.${CONFIG.DH.id}`, {
|
game.socket.emit(`system.${CONFIG.DH.id}`, {
|
||||||
|
|
@ -190,6 +202,21 @@ export default class CountdownEdit extends HandlebarsApplicationMixin(Applicatio
|
||||||
this.updateSetting({ [`countdowns.${button.dataset.countdownId}`]: data });
|
this.updateSetting({ [`countdowns.${button.dataset.countdownId}`]: data });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async #randomiseCountdownStart(_, button) {
|
||||||
|
const countdown = this.data.countdowns[button.dataset.countdownId];
|
||||||
|
const roll = await new Roll(countdown.progress.startFormula).roll();
|
||||||
|
const message = await roll.toMessage({ title: 'Countdown' });
|
||||||
|
|
||||||
|
await waitForDiceSoNice(message);
|
||||||
|
await this.updateSetting({
|
||||||
|
[`countdowns.${button.dataset.countdownId}.progress`]: {
|
||||||
|
start: roll.total,
|
||||||
|
current: this.getMatchingCurrentValue(countdown, roll.total, countdown.progress.current)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
|
||||||
static async #removeCountdown(event, button) {
|
static async #removeCountdown(event, button) {
|
||||||
const { countdownId } = button.dataset;
|
const { countdownId } = button.dataset;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
import { waitForDiceSoNice } from '../../helpers/utils.mjs';
|
||||||
import { emitAsGM, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs';
|
import { emitAsGM, GMUpdateEvent, RefreshType, socketEvent } from '../../systemRegistration/socket.mjs';
|
||||||
|
|
||||||
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
||||||
|
|
@ -123,13 +124,14 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application
|
||||||
: 'DAGGERHEART.UI.Countdowns.loop'
|
: 'DAGGERHEART.UI.Countdowns.loop'
|
||||||
: null;
|
: null;
|
||||||
const loopDisabled =
|
const loopDisabled =
|
||||||
!countdownEditable || (isLooping && (countdown.progress.current > 0 || countdown.progress.max === '0'));
|
!countdownEditable ||
|
||||||
|
(isLooping && (countdown.progress.current > 0 || countdown.progress.start === '0'));
|
||||||
|
|
||||||
acc[key] = {
|
acc[key] = {
|
||||||
...countdown,
|
...countdown,
|
||||||
editable: countdownEditable,
|
editable: countdownEditable,
|
||||||
noPlayerAccess: nonGmPlayers.length && playersWithAccess.length === 0,
|
noPlayerAccess: nonGmPlayers.length && playersWithAccess.length === 0,
|
||||||
shouldLoop: isLooping && countdown.progress.current === 0 && countdown.progress.max > 0,
|
shouldLoop: isLooping && countdown.progress.current === 0 && countdown.progress.start > 0,
|
||||||
loopDisabled: isLooping ? loopDisabled : null,
|
loopDisabled: isLooping ? loopDisabled : null,
|
||||||
loopTooltip: isLooping && game.i18n.localize(loopTooltip)
|
loopTooltip: isLooping && game.i18n.localize(loopTooltip)
|
||||||
};
|
};
|
||||||
|
|
@ -182,16 +184,27 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application
|
||||||
|
|
||||||
const settings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns);
|
const settings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns);
|
||||||
const countdown = settings.countdowns[target.id];
|
const countdown = settings.countdowns[target.id];
|
||||||
|
|
||||||
|
let progressMax = countdown.progress.start;
|
||||||
|
let message = null;
|
||||||
|
if (countdown.progress.startFormula) {
|
||||||
|
const roll = await new Roll(countdown.progress.startFormula).evaluate();
|
||||||
|
progressMax = roll.total;
|
||||||
|
message = await roll.toMessage();
|
||||||
|
}
|
||||||
|
|
||||||
const newMax =
|
const newMax =
|
||||||
countdown.progress.looping === CONFIG.DH.GENERAL.countdownLoopingTypes.increasing.id
|
countdown.progress.looping === CONFIG.DH.GENERAL.countdownLoopingTypes.increasing.id
|
||||||
? Number(countdown.progress.max) + 1
|
? Number(progressMax) + 1
|
||||||
: countdown.progress.looping === CONFIG.DH.GENERAL.countdownLoopingTypes.decreasing.id
|
: countdown.progress.looping === CONFIG.DH.GENERAL.countdownLoopingTypes.decreasing.id
|
||||||
? Math.max(Number(countdown.progress.max) - 1, 0)
|
? Math.max(Number(progressMax) - 1, 0)
|
||||||
: countdown.progress.max;
|
: progressMax;
|
||||||
|
|
||||||
|
await waitForDiceSoNice(message);
|
||||||
await settings.updateSource({
|
await settings.updateSource({
|
||||||
[`countdowns.${target.id}.progress`]: {
|
[`countdowns.${target.id}.progress`]: {
|
||||||
current: newMax,
|
current: newMax,
|
||||||
max: newMax
|
start: newMax
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
await emitAsGM(GMUpdateEvent.UpdateCountdowns, DhCountdowns.gmSetSetting.bind(settings), settings, null, {
|
await emitAsGM(GMUpdateEvent.UpdateCountdowns, DhCountdowns.gmSetSetting.bind(settings), settings, null, {
|
||||||
|
|
@ -205,7 +218,7 @@ export default class DhCountdowns extends HandlebarsApplicationMixin(Application
|
||||||
const settings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns);
|
const settings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Countdowns);
|
||||||
const countdown = settings.countdowns[target.id];
|
const countdown = settings.countdowns[target.id];
|
||||||
const newCurrent = increase
|
const newCurrent = increase
|
||||||
? Math.min(countdown.progress.current + 1, countdown.progress.max)
|
? Math.min(countdown.progress.current + 1, countdown.progress.start)
|
||||||
: Math.max(countdown.progress.current - 1, 0);
|
: Math.max(countdown.progress.current - 1, 0);
|
||||||
await settings.updateSource({ [`countdowns.${target.id}.progress.current`]: newCurrent });
|
await settings.updateSource({ [`countdowns.${target.id}.progress.current`]: newCurrent });
|
||||||
await emitAsGM(GMUpdateEvent.UpdateCountdowns, DhCountdowns.gmSetSetting.bind(settings), settings, null, {
|
await emitAsGM(GMUpdateEvent.UpdateCountdowns, DhCountdowns.gmSetSetting.bind(settings), settings, null, {
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,10 @@ export default class DhCountdownAction extends DHBaseAction {
|
||||||
...super.defaultValues,
|
...super.defaultValues,
|
||||||
countdown: {
|
countdown: {
|
||||||
name: this.parent.parent.name,
|
name: this.parent.parent.name,
|
||||||
img: this.img
|
img: this.img,
|
||||||
|
progress: {
|
||||||
|
startFormula: '1'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -21,10 +24,26 @@ export default class DhCountdownAction extends DHBaseAction {
|
||||||
{
|
{
|
||||||
...game.system.api.data.countdowns.DhCountdown.defaultCountdown(),
|
...game.system.api.data.countdowns.DhCountdown.defaultCountdown(),
|
||||||
name: parent.parent.name,
|
name: parent.parent.name,
|
||||||
img: parent.parent.img
|
img: parent.parent.img,
|
||||||
|
progress: {
|
||||||
|
startFormula: '1'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
return updateSource;
|
return updateSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @inheritDoc */
|
||||||
|
static migrateData(source) {
|
||||||
|
for (const countdown of source.countdown) {
|
||||||
|
if (countdown.progress.max) {
|
||||||
|
countdown.progress.startFormula = countdown.progress.max;
|
||||||
|
countdown.progress.start = 1;
|
||||||
|
countdown.progress.max = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.migrateData(source);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -167,10 +167,15 @@ export class DhCountdown extends foundry.abstract.DataModel {
|
||||||
initial: 1,
|
initial: 1,
|
||||||
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.current.label'
|
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.current.label'
|
||||||
}),
|
}),
|
||||||
max: new FormulaField({
|
start: new fields.NumberField({
|
||||||
required: true,
|
required: true,
|
||||||
|
integer: true,
|
||||||
initial: 1,
|
initial: 1,
|
||||||
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.max.label',
|
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.start.label',
|
||||||
|
deterministic: false
|
||||||
|
}),
|
||||||
|
startFormula: new FormulaField({
|
||||||
|
label: 'DAGGERHEART.APPLICATIONS.Countdown.FIELDS.countdowns.element.progress.startFormula.label',
|
||||||
deterministic: false
|
deterministic: false
|
||||||
}),
|
}),
|
||||||
looping: new fields.StringField({
|
looping: new fields.StringField({
|
||||||
|
|
@ -206,7 +211,7 @@ export class DhCountdown extends foundry.abstract.DataModel {
|
||||||
ownership: ownership,
|
ownership: ownership,
|
||||||
progress: {
|
progress: {
|
||||||
current: 1,
|
current: 1,
|
||||||
max: 1
|
start: 1
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
@ -225,4 +230,15 @@ export class DhCountdown extends foundry.abstract.DataModel {
|
||||||
return acc;
|
return acc;
|
||||||
}, {});
|
}, {});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** @inheritDoc */
|
||||||
|
static migrateData(source) {
|
||||||
|
if (source.progress.max) {
|
||||||
|
source.progress.start = Number(source.progress.max);
|
||||||
|
source.progress.max = null;
|
||||||
|
source.progress.startFormula = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return super.migrateData(source);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -40,18 +40,40 @@ export default class CountdownField extends fields.ArrayField {
|
||||||
}
|
}
|
||||||
|
|
||||||
const data = { countdowns: {} };
|
const data = { countdowns: {} };
|
||||||
|
const countdownMessages = [];
|
||||||
for (let countdown of config.countdowns) {
|
for (let countdown of config.countdowns) {
|
||||||
const { total: max } = await new Roll(countdown.progress.max).evaluate();
|
let startFormula = countdown.progress.startFormula ? countdown.progress.startFormula : null;
|
||||||
|
let countdownStart = startFormula ?? '1';
|
||||||
|
if (startFormula) {
|
||||||
|
const roll = await new Roll(startFormula).roll();
|
||||||
|
if (roll.dice.length > 0) {
|
||||||
|
countdownStart = roll.total;
|
||||||
|
const message = await roll.toMessage();
|
||||||
|
countdownMessages.push(message);
|
||||||
|
} else {
|
||||||
|
startFormula = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
data.countdowns[foundry.utils.randomID()] = {
|
data.countdowns[foundry.utils.randomID()] = {
|
||||||
...countdown,
|
...countdown,
|
||||||
progress: {
|
progress: {
|
||||||
...countdown.progress,
|
...countdown.progress,
|
||||||
current: max,
|
current: countdownStart,
|
||||||
max: max
|
start: countdownStart,
|
||||||
|
startFormula
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (game.modules.get('dice-so-nice')?.active) {
|
||||||
|
await Promise.all(
|
||||||
|
countdownMessages.map(message => {
|
||||||
|
return game.dice3d.waitFor3DAnimationByMessageID(message.id);
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
await emitAsGM(
|
await emitAsGM(
|
||||||
GMUpdateEvent.UpdateCountdowns,
|
GMUpdateEvent.UpdateCountdowns,
|
||||||
async () => {
|
async () => {
|
||||||
|
|
|
||||||
|
|
@ -445,3 +445,9 @@ export function itemIsIdentical(a, b) {
|
||||||
|
|
||||||
return compendiumSource && name & description;
|
return compendiumSource && name & description;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function waitForDiceSoNice(message) {
|
||||||
|
if (message && game.modules.get('dice-so-nice')?.active) {
|
||||||
|
await game.dice3d.waitFor3DAnimationByMessageID(message.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -738,7 +738,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "looping",
|
"looping": "looping",
|
||||||
"type": "actionRoll",
|
"type": "actionRoll",
|
||||||
"max": "1d6",
|
"start": 1,
|
||||||
|
"startFormula": "1d6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -794,7 +794,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "looping",
|
"looping": "looping",
|
||||||
"type": "actionRoll",
|
"type": "actionRoll",
|
||||||
"max": "2d6",
|
"start": 1,
|
||||||
|
"startFormula": "2d6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -476,7 +476,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "looping",
|
"looping": "looping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "6",
|
"start": 1,
|
||||||
|
"startFormula": "6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -579,7 +579,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "looping",
|
"looping": "looping",
|
||||||
"type": "actionRoll",
|
"type": "actionRoll",
|
||||||
"max": "2d6",
|
"start": 1,
|
||||||
|
"startFormula": "2d6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -623,7 +623,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "decreasing",
|
"looping": "decreasing",
|
||||||
"type": "actionRoll",
|
"type": "actionRoll",
|
||||||
"max": "8",
|
"start": 1,
|
||||||
|
"startFormula": "8",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -634,7 +634,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "actionRoll",
|
"type": "actionRoll",
|
||||||
"max": "1d8",
|
"start": 1,
|
||||||
|
"startFormula": "1d8",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -630,7 +630,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "4",
|
"start": 1,
|
||||||
|
"startFormula": "4",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -361,7 +361,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "characterAttack",
|
"type": "characterAttack",
|
||||||
"max": "5",
|
"start": 1,
|
||||||
|
"startFormula": "5",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -640,7 +640,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "looping",
|
"looping": "looping",
|
||||||
"type": "actionRoll",
|
"type": "actionRoll",
|
||||||
"max": "1d6",
|
"start": 1,
|
||||||
|
"startFormula": "1d6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -376,7 +376,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "8",
|
"start": 1,
|
||||||
|
"startFormula": "8",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -625,7 +625,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "looping",
|
"looping": "looping",
|
||||||
"type": "actionRoll",
|
"type": "actionRoll",
|
||||||
"max": "1d6",
|
"start": 1,
|
||||||
|
"startFormula": "1d6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -488,7 +488,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "6",
|
"start": 1,
|
||||||
|
"startFormula": "6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -543,7 +543,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "8",
|
"start": 1,
|
||||||
|
"startFormula": "8",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -862,7 +862,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "fear",
|
"type": "fear",
|
||||||
"max": "1d12",
|
"start": 1,
|
||||||
|
"startFormula": "1d12",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -63,7 +63,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "8",
|
"start": 1,
|
||||||
|
"startFormula": "8",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -545,7 +545,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "looping",
|
"looping": "looping",
|
||||||
"type": "actionRoll",
|
"type": "actionRoll",
|
||||||
"max": "6",
|
"start": 1,
|
||||||
|
"startFormula": "6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -291,7 +291,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "6",
|
"start": 1,
|
||||||
|
"startFormula": "6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
@ -304,7 +305,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "4",
|
"start": 1,
|
||||||
|
"startFormula": "4",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -283,7 +283,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "6",
|
"start": 1,
|
||||||
|
"startFormula": "6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -225,7 +225,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "8",
|
"start": 1,
|
||||||
|
"startFormula": "8",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
@ -341,7 +342,7 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "looping",
|
"looping": "looping",
|
||||||
"type": "actionRoll",
|
"type": "actionRoll",
|
||||||
"max": "4",
|
"startValue": "4",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -174,7 +174,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "12",
|
"start": 1,
|
||||||
|
"startFormula": "12",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -374,7 +374,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "fear",
|
"type": "fear",
|
||||||
"max": "6",
|
"start": 1,
|
||||||
|
"startFormula": "6",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -197,7 +197,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "8",
|
"start": 1,
|
||||||
|
"startFormula": "8",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
@ -607,7 +608,7 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "10",
|
"startValue": "10",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -361,7 +361,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "5",
|
"start": 1,
|
||||||
|
"startFormula": "5",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -404,7 +404,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "looping",
|
"looping": "looping",
|
||||||
"type": "actionRoll",
|
"type": "actionRoll",
|
||||||
"max": "4",
|
"start": 1,
|
||||||
|
"startFormula": "4",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -183,7 +183,8 @@
|
||||||
"progress": {
|
"progress": {
|
||||||
"looping": "noLooping",
|
"looping": "noLooping",
|
||||||
"type": "custom",
|
"type": "custom",
|
||||||
"max": "4",
|
"start": 1,
|
||||||
|
"startFormula": "4",
|
||||||
"current": 1
|
"current": 1
|
||||||
},
|
},
|
||||||
"ownership": {}
|
"ownership": {}
|
||||||
|
|
|
||||||
|
|
@ -129,12 +129,20 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.countdown-edit-subrow {
|
|
||||||
|
.countdown-edit-row-container {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 8px;
|
flex-direction: column;
|
||||||
|
gap: 2px;
|
||||||
|
|
||||||
|
.countdown-edit-subrow {
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.countdown-edit-input {
|
.countdown-edit-input {
|
||||||
|
position: relative;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
@ -151,11 +159,56 @@
|
||||||
|
|
||||||
&.tiny {
|
&.tiny {
|
||||||
flex: 0;
|
flex: 0;
|
||||||
|
|
||||||
|
label {
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
input {
|
input {
|
||||||
min-width: 2.5rem;
|
min-width: 2.5rem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.countdown-random-input {
|
||||||
|
padding-right: var(--input-height);
|
||||||
|
}
|
||||||
|
|
||||||
|
.countdown-random-button {
|
||||||
|
position: absolute;
|
||||||
|
right: 0px;
|
||||||
|
bottom: 0px;
|
||||||
|
border-radius: 0 6px 6px 0;
|
||||||
|
height: var(--input-height);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 0 8px;
|
||||||
|
|
||||||
|
&[disabled] {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
i {
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// .countdown-random-container {
|
||||||
|
// width: 100%;
|
||||||
|
// display: flex;
|
||||||
|
|
||||||
|
// input {
|
||||||
|
// border-radius: 6px 0 0 6px;
|
||||||
|
// border-right: 0;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// button {
|
||||||
|
// border-radius: 0 6px 6px 0;
|
||||||
|
// height: var(--input-height);
|
||||||
|
// border: 1px solid white;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
input,
|
input,
|
||||||
select {
|
select {
|
||||||
background: light-dark(@beige, @dark-blue);
|
background: light-dark(@beige, @dark-blue);
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
"id": "daggerheart",
|
"id": "daggerheart",
|
||||||
"title": "Daggerheart",
|
"title": "Daggerheart",
|
||||||
"description": "An unofficial implementation of the Daggerheart system",
|
"description": "An unofficial implementation of the Daggerheart system",
|
||||||
"version": "1.2.5",
|
"version": "1.2.6",
|
||||||
"compatibility": {
|
"compatibility": {
|
||||||
"minimum": "13",
|
"minimum": "13",
|
||||||
"verified": "13.351",
|
"verified": "13.351",
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
<div class="nest-inputs">
|
<div class="nest-inputs">
|
||||||
{{formField ../fields.progress.fields.looping value=countdown.progress.looping name=(concat "countdown." index ".progress.looping") localize=true}}
|
{{formField ../fields.progress.fields.looping value=countdown.progress.looping name=(concat "countdown." index ".progress.looping") localize=true}}
|
||||||
{{formField ../fields.progress.fields.type value=countdown.progress.type name=(concat "countdown." index ".progress.type") localize=true}}
|
{{formField ../fields.progress.fields.type value=countdown.progress.type name=(concat "countdown." index ".progress.type") localize=true}}
|
||||||
{{formField ../fields.progress.fields.max value=countdown.progress.max name=(concat "countdown." index ".progress.max") localize=true}}
|
{{formField ../fields.progress.fields.startFormula value=countdown.progress.startFormula name=(concat "countdown." index ".progress.startFormula") label="DAGGERHEART.APPLICATIONS.CountdownEdit.start" localize=true}}
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
@ -29,8 +29,8 @@
|
||||||
<div class="countdown-edit-text">
|
<div class="countdown-edit-text">
|
||||||
<h4>{{countdown.name}}</h4>
|
<h4>{{countdown.name}}</h4>
|
||||||
<div class="countdown-edit-subtext">
|
<div class="countdown-edit-subtext">
|
||||||
<div class="countdown-edit-sub-tag">{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.currentCountdownValue" value=countdown.progress.current}}</div>
|
<div class="countdown-edit-sub-tag">{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.currentCountdownCurrent" value=countdown.progress.current}}</div>
|
||||||
<div class="countdown-edit-sub-tag">{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.currentCountdownMax" value=countdown.progress.max}}</div>
|
<div class="countdown-edit-sub-tag">{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.currentCountdownStart" value=countdown.progress.start}}</div>
|
||||||
<div class="countdown-edit-sub-tag">{{countdown.typeName}}</div>
|
<div class="countdown-edit-sub-tag">{{countdown.typeName}}</div>
|
||||||
<div class="countdown-edit-sub-tag">{{countdown.progress.typeName}}</div>
|
<div class="countdown-edit-sub-tag">{{countdown.progress.typeName}}</div>
|
||||||
|
|
||||||
|
|
@ -59,32 +59,42 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{#if countdown.editing}}
|
{{#if countdown.editing}}
|
||||||
<div class="countdown-edit-subrow">
|
<div class="countdown-edit-row-container">
|
||||||
<div class="countdown-edit-input tiny">
|
<div class="countdown-edit-subrow">
|
||||||
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.current"}}</label>
|
<div class="countdown-edit-input tiny">
|
||||||
<input type="number" name="{{concat "countdowns." id ".progress.current"}}" value="{{countdown.progress.current}}" />
|
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.current"}}</label>
|
||||||
|
<input type="number" name="{{concat "countdowns." id ".progress.current"}}" value="{{countdown.progress.current}}" />
|
||||||
|
</div>
|
||||||
|
<div class="countdown-edit-input tiny">
|
||||||
|
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.start"}}</label>
|
||||||
|
<input type="number" name="{{concat "countdowns." id ".progress.start"}}" value="{{countdown.progress.start}}" />
|
||||||
|
</div>
|
||||||
|
<div class="countdown-edit-input">
|
||||||
|
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.startFormula"}}</label>
|
||||||
|
<input class="countdown-random-input" type="text" name="{{concat "countdowns." id ".progress.startFormula"}}" value="{{countdown.progress.startFormula}}" />
|
||||||
|
<a class="countdown-random-button" data-action="randomiseCountdownStart" data-countdown-id="{{id}}" {{#unless countdown.randomizeValid}}disabled{{/unless}}><i class="fa-solid fa-dice fa-fw"></i></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="countdown-edit-input tiny">
|
<div class="countdown-edit-subrow">
|
||||||
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.max"}}</label>
|
<div class="countdown-edit-input tiny type-input">
|
||||||
<input type="number" name="{{concat "countdowns." id ".progress.max"}}" value="{{countdown.progress.max}}" />
|
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.category"}}</label>
|
||||||
</div>
|
<select name="{{concat "countdowns." id ".type"}}">
|
||||||
<div class="countdown-edit-input tiny type-input">
|
{{selectOptions ../countdownBaseTypes selected=countdown.type localize=true}}
|
||||||
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.category"}}</label>
|
</select>
|
||||||
<select name="{{concat "countdowns." id ".type"}}">
|
</div>
|
||||||
{{selectOptions ../countdownBaseTypes selected=countdown.type localize=true}}
|
<div class="countdown-edit-input">
|
||||||
</select>
|
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.progressionType"}}</label>
|
||||||
</div>
|
<select name="{{concat "countdowns." id ".progress.type"}}">
|
||||||
<div class="countdown-edit-input">
|
{{selectOptions ../countdownProgressionTypes selected=countdown.progress.type localize=true}}
|
||||||
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.progressionType"}}</label>
|
</select>
|
||||||
<select name="{{concat "countdowns." id ".progress.type"}}">
|
</div>
|
||||||
{{selectOptions ../countdownProgressionTypes selected=countdown.progress.type localize=true}}
|
<div class="countdown-edit-input looping-input tiny">
|
||||||
</select>
|
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.looping"}}</label>
|
||||||
</div>
|
<select name="{{concat "countdowns." id ".progress.looping"}}">
|
||||||
<div class="countdown-edit-input looping-input tiny">
|
{{selectOptions ../countdownLoopingTypes selected=countdown.progress.looping localize=true}}
|
||||||
<label>{{localize "DAGGERHEART.APPLICATIONS.CountdownEdit.looping"}}</label>
|
</select>
|
||||||
<select name="{{concat "countdowns." id ".progress.looping"}}">
|
</div>
|
||||||
{{selectOptions ../countdownLoopingTypes selected=countdown.progress.looping localize=true}}
|
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{/if}}
|
{{/if}}
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
<div class="countdown-tool-controls">
|
<div class="countdown-tool-controls">
|
||||||
{{#if countdown.editable}}<a data-action="decreaseCountdown" id="{{id}}"><i class="fa-solid fa-minus"></i></a>{{/if}}
|
{{#if countdown.editable}}<a data-action="decreaseCountdown" id="{{id}}"><i class="fa-solid fa-minus"></i></a>{{/if}}
|
||||||
<div class="progress-tag">
|
<div class="progress-tag">
|
||||||
{{countdown.progress.current}}/{{countdown.progress.max}}
|
{{countdown.progress.current}}/{{countdown.progress.start}}
|
||||||
</div>
|
</div>
|
||||||
{{#if countdown.editable}}<a data-action="increaseCountdown" id="{{id}}"><i class="fa-solid fa-plus"></i></a>{{/if}}
|
{{#if countdown.editable}}<a data-action="increaseCountdown" id="{{id}}"><i class="fa-solid fa-plus"></i></a>{{/if}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue