mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-12 03:31:07 +01:00
HBS idea formed. Need to recheck drag drop implementation
This commit is contained in:
parent
b8fcd440c6
commit
1375329541
7 changed files with 133 additions and 21 deletions
|
|
@ -125,7 +125,8 @@
|
||||||
"summon":{
|
"summon":{
|
||||||
"addSummonEntry": "Add Summon Entry",
|
"addSummonEntry": "Add Summon Entry",
|
||||||
"actorUUID": "Actor to Summon",
|
"actorUUID": "Actor to Summon",
|
||||||
"count": "Count"
|
"count": "Count",
|
||||||
|
"hint": "Add Actor(s) and the quantity to summon under this action."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ export default class DHActionBaseConfig extends DaggerheartSheet(ApplicationV2)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static CLEAN_ARRAYS = ['damage.parts', 'cost', 'effects'];
|
static CLEAN_ARRAYS = ['damage.parts', 'cost', 'effects','summon'];
|
||||||
|
|
||||||
_getTabs(tabs) {
|
_getTabs(tabs) {
|
||||||
for (const v of Object.values(tabs)) {
|
for (const v of Object.values(tabs)) {
|
||||||
|
|
|
||||||
|
|
@ -6,10 +6,13 @@ export default class DHActionSettingsConfig extends DHActionBaseConfig {
|
||||||
|
|
||||||
this.effects = effects;
|
this.effects = effects;
|
||||||
this.sheetUpdate = sheetUpdate;
|
this.sheetUpdate = sheetUpdate;
|
||||||
|
|
||||||
|
this._dragDrop = this._createDragDropHandlers();
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEFAULT_OPTIONS = {
|
static DEFAULT_OPTIONS = {
|
||||||
...DHActionBaseConfig.DEFAULT_OPTIONS,
|
...DHActionBaseConfig.DEFAULT_OPTIONS,
|
||||||
|
dragDrop: [{ dragSelector: null, dropSelector: '.summon-actor-drop' }],
|
||||||
actions: {
|
actions: {
|
||||||
...DHActionBaseConfig.DEFAULT_OPTIONS.actions,
|
...DHActionBaseConfig.DEFAULT_OPTIONS.actions,
|
||||||
addEffect: this.addEffect,
|
addEffect: this.addEffect,
|
||||||
|
|
@ -18,8 +21,23 @@ export default class DHActionSettingsConfig extends DHActionBaseConfig {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
_createDragDropHandlers() {
|
||||||
|
return this.options.dragDrop.map(d => {
|
||||||
|
d.callbacks = {
|
||||||
|
drop: this._onDrop.bind(this)
|
||||||
|
};
|
||||||
|
return new foundry.applications.ux.DragDrop.implementation(d);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
async _prepareContext(options) {
|
async _prepareContext(options) {
|
||||||
const context = await super._prepareContext(options);
|
const context = await super._prepareContext(options);
|
||||||
|
const summonData = this.action.summon || [];
|
||||||
|
context.summonActors = await Promise.all(summonData.map(async (entry) => {
|
||||||
|
if (!entry.actorUUID) return null;
|
||||||
|
const actor = await fromUuid(entry.actorUUID);
|
||||||
|
return actor ? { name: actor.name, img: actor.img } : { name: "Unknown", img: "icons/svg/mystery-man.svg" };
|
||||||
|
}));
|
||||||
context.effects = this.effects;
|
context.effects = this.effects;
|
||||||
context.getEffectDetails = this.getEffectDetails.bind(this);
|
context.getEffectDetails = this.getEffectDetails.bind(this);
|
||||||
|
|
||||||
|
|
@ -63,4 +81,47 @@ export default class DHActionSettingsConfig extends DHActionBaseConfig {
|
||||||
this.effects = await this.sheetUpdate(this.action.toObject(), { ...updatedEffect, id });
|
this.effects = await this.sheetUpdate(this.action.toObject(), { ...updatedEffect, id });
|
||||||
this.render();
|
this.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//For drag drop implementation for summon actor selection
|
||||||
|
_onRender(context, options) {
|
||||||
|
super._onRender(context, options);
|
||||||
|
this._dragDrop.forEach(d => d.bind(this.element));
|
||||||
|
}
|
||||||
|
|
||||||
|
async _onDrop(event) {
|
||||||
|
const data = TextEditor.getDragEventData(event);
|
||||||
|
console.log("Daggerheart | Summon Drop Data:", data);
|
||||||
|
|
||||||
|
if (!data || !data.uuid) return;
|
||||||
|
|
||||||
|
const doc = await fromUuid(data.uuid);
|
||||||
|
if (!doc) return;
|
||||||
|
|
||||||
|
|
||||||
|
let actorUuid = null;
|
||||||
|
|
||||||
|
if (doc.documentName === "Actor") {
|
||||||
|
actorUuid = doc.uuid;
|
||||||
|
} else if (doc.documentName === "Token" && doc.actor) {
|
||||||
|
actorUuid = doc.actor.uuid;
|
||||||
|
} else {
|
||||||
|
console.warn("Daggerheart | Dropped document is not an Actor:", doc);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const dropZone = event.target.closest('.summon-actor-drop');
|
||||||
|
if (!dropZone) return;
|
||||||
|
|
||||||
|
const index = Number(dropZone.dataset.index);
|
||||||
|
|
||||||
|
const actionData = this.action.toObject();
|
||||||
|
if (!actionData.summon) actionData.summon = [];
|
||||||
|
|
||||||
|
if (actionData.summon[index]) {
|
||||||
|
actionData.summon[index].actorUUID = actorUuid;
|
||||||
|
|
||||||
|
// Trigger update
|
||||||
|
this.constructor.updateForm.bind(this)(null, null, { object: foundry.utils.flattenObject(actionData) });
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,18 +6,25 @@ export default class DHSummonAction extends DHBaseAction {
|
||||||
const fields = foundry.data.fields;
|
const fields = foundry.data.fields;
|
||||||
return {
|
return {
|
||||||
...super.defineSchema(),
|
...super.defineSchema(),
|
||||||
tokenArray: new fields.ArrayField(new fields.SchemaField({
|
summon: new fields.ArrayField(new fields.SchemaField({
|
||||||
actorUUID: new fields.DocumentUUIDField({ type: 'Actor', required: true }),
|
actorUUID: new fields.DocumentUUIDField({ type: 'Actor', required: true }),
|
||||||
count: new fields.NumberField({ required: true, default: 1, min:1 })
|
count: new fields.NumberField({ required: true, default: 1, min: 1, integer: true })
|
||||||
}), { required: false })
|
}), { required: false, initial: [] })
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
get defaultValues() {
|
||||||
|
return {
|
||||||
|
summon: { actorUUID: "", count: 1 }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
async trigger(event, ...args) {
|
async trigger(event, ...args) {
|
||||||
if (!this.canSummon || !canvas.scene){
|
if (!this.canSummon || !canvas.scene){
|
||||||
ui.notifications.error(game.i18n.localize("DAGGERHEART.ACTIONS.TYPES.summon.error"));
|
ui.notifications.warn(game.i18n.localize("DAGGERHEART.ACTIONS.TYPES.summon.error"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
await this._performAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
get canSummon() {
|
get canSummon() {
|
||||||
|
|
@ -31,6 +38,18 @@ export default class DHSummonAction extends DHBaseAction {
|
||||||
|
|
||||||
//Logic to perform the summon action - incomplete implementation
|
//Logic to perform the summon action - incomplete implementation
|
||||||
async _performAction(event, ...args) {
|
async _performAction(event, ...args) {
|
||||||
return this.summonManager.summonTokens(this.tokenArray);
|
const validSummons = this.summon.filter(entry => entry.actorUUID);
|
||||||
}
|
if (validSummons.length === 0) {
|
||||||
|
ui.notifications.warn("No actors configured for this Summon action.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// FOR NOW: Just log the data to prove the schema working or not
|
||||||
|
console.group("Summon Action Triggered");
|
||||||
|
|
||||||
|
for (const entry of validSummons) {
|
||||||
|
const actor = await fromUuid(entry.actorUUID);
|
||||||
|
console.log(`- Ready to summon ${entry.count}x [${actor?.name || "Unknown Actor"}]`);
|
||||||
|
}
|
||||||
|
console.groupEnd();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ export const preloadHandlebarsTemplates = async function () {
|
||||||
'systems/daggerheart/templates/actionTypes/effect.hbs',
|
'systems/daggerheart/templates/actionTypes/effect.hbs',
|
||||||
'systems/daggerheart/templates/actionTypes/beastform.hbs',
|
'systems/daggerheart/templates/actionTypes/beastform.hbs',
|
||||||
'systems/daggerheart/templates/actionTypes/countdown.hbs',
|
'systems/daggerheart/templates/actionTypes/countdown.hbs',
|
||||||
|
'systems/daggerheart/templates/actionTypes/summon.hbs',
|
||||||
'systems/daggerheart/templates/settings/components/settings-item-line.hbs',
|
'systems/daggerheart/templates/settings/components/settings-item-line.hbs',
|
||||||
'systems/daggerheart/templates/ui/tooltip/parts/tooltipChips.hbs',
|
'systems/daggerheart/templates/ui/tooltip/parts/tooltipChips.hbs',
|
||||||
'systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs',
|
'systems/daggerheart/templates/ui/tooltip/parts/tooltipTags.hbs',
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,43 @@
|
||||||
<fieldset class="one-column">
|
<fieldset class="one-column" data-key="summon">
|
||||||
<legend>{{localize "DAGGERHEART.ACTIONS.TYPES.summon.name"}}</legend>
|
<legend>
|
||||||
<p class="hint">{{localize "DAGGERHEART.ACTIONS.Settings.summonHint"}}</p>
|
{{localize "DAGGERHEART.ACTIONS.TYPES.summon.name"}}
|
||||||
<div class="nest-inputs">
|
<a><i class="fa-solid fa-plus icon-button" data-action="addElement"></i></a>
|
||||||
{{#each source.tokenArray}}
|
</legend>
|
||||||
<div class="summon-entry">
|
<p class="hint">{{localize "DAGGERHEART.ACTIONS.Settings.summon.hint"}}</p>
|
||||||
{{formField ../fields.documentUUID label=DAGGERHEART.ACTIONS.Settings.summon.actorUUID name="tokenArray.{{@index}}.actorUUID" value=this.actorUUID documentType="Actor"}}
|
{{#each source as |entry index|}}
|
||||||
{{formField ../fields.number label=DAGGERHEART.ACTIONS.Settings.summon.count name="tokenArray.{{@index}}.count" value=this.count min=1}}
|
<div class="nest-inputs summon-entry">
|
||||||
<button type="button" class="remove-summon-entry" data-index="{{@index}}" title="{{localize 'DAGGERHEART.UI.Button.remove'}}"><i class="fa-solid fa-trash"></i></button>
|
|
||||||
|
{{!-- Actor --}}
|
||||||
|
<div class="summon-actor-drop drop-section" data-index="{{index}}">
|
||||||
|
{{#if entry.actorUUID}}
|
||||||
|
{{!-- Filled State --}}
|
||||||
|
{{#with (lookup @root.summonActors index) as |actor|}}
|
||||||
|
<div class="suggested-item item-line">
|
||||||
|
<img class="image" src="{{actor.img}}" title="{{actor.name}}"/>
|
||||||
|
<span class="actor-name">{{actor.name}}</span>
|
||||||
|
{{!-- Hidden input to store the actual value --}}
|
||||||
|
<input type="hidden" name="summon.{{index}}.actorUUID" value="{{../entry.actorUUID}}">
|
||||||
|
</div>
|
||||||
|
{{/with}}
|
||||||
|
{{else}}
|
||||||
|
{{!-- Empty State --}}
|
||||||
|
<div class="drag-area">
|
||||||
|
{{localize "DAGGERHEART.GENERAL.missingDragDropThing" thing=(localize "Actor")}}
|
||||||
|
<input type="hidden" name="summon.{{index}}.actorUUID" value="">
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
{{/each}}
|
|
||||||
<button type="button" class="add-summon-entry" title="{{localize 'DAGGERHEART.UI.Button.add'}}"><i class="fa-solid fa-plus"></i> {{localize "DAGGERHEART.ACTIONS.Settings.summon.addSummonEntry"}}</button>
|
{{!-- Count --}}
|
||||||
</div>
|
{{formField ../fields.count
|
||||||
|
label="DAGGERHEART.ACTIONS.Settings.summon.count"
|
||||||
|
name=(concat "summon." index ".count")
|
||||||
|
value=entry.count
|
||||||
|
min=1
|
||||||
|
localize=true}}
|
||||||
|
{{!-- Obtained idea from cost.hbs --}}
|
||||||
|
<a class="btn" data-tooltip="{{localize "CONTROLS.CommonDelete"}}" data-action="removeElement" data-index="{{index}}"><i class="fas fa-trash"></i></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{{/each}}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
|
@ -2,7 +2,8 @@
|
||||||
class="tab {{this.tabs.config.cssClass}}"
|
class="tab {{this.tabs.config.cssClass}}"
|
||||||
data-group="primary"
|
data-group="primary"
|
||||||
data-tab="config"
|
data-tab="config"
|
||||||
>
|
>
|
||||||
|
{{#if fields.summon}}{{> 'systems/daggerheart/templates/actionTypes/summon.hbs' fields=fields.summon.element.fields source=source.summon}}{{/if}}
|
||||||
{{> 'systems/daggerheart/templates/actionTypes/uses.hbs' fields=fields.uses.fields source=source.uses}}
|
{{> 'systems/daggerheart/templates/actionTypes/uses.hbs' fields=fields.uses.fields source=source.uses}}
|
||||||
{{> 'systems/daggerheart/templates/actionTypes/cost.hbs' fields=fields.cost.element.fields source=source.cost costOptions=costOptions}}
|
{{> 'systems/daggerheart/templates/actionTypes/cost.hbs' fields=fields.cost.element.fields source=source.cost costOptions=costOptions}}
|
||||||
{{> 'systems/daggerheart/templates/actionTypes/range-target.hbs' fields=(object range=fields.range target=fields.target.fields) source=(object target=source.target range=source.range)}}
|
{{> 'systems/daggerheart/templates/actionTypes/range-target.hbs' fields=(object range=fields.range target=fields.target.fields) source=(object target=source.target range=source.range)}}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue