Add a prompt for equipping an item on drag and drop

This commit is contained in:
Eldritch-Oliver 2025-10-05 15:25:23 -06:00
parent dfc8964296
commit f29ab8bdaa
2 changed files with 65 additions and 35 deletions

View file

@ -4,12 +4,13 @@ import { localizer } from "../../utils/Localizer.mjs";
import { Logger } from "../../utils/Logger.mjs"; import { Logger } from "../../utils/Logger.mjs";
import { requiredInteger } from "../helpers.mjs"; import { requiredInteger } from "../helpers.mjs";
const { diffObject, getProperty, setProperty } = foundry.utils;
const { DialogV2 } = foundry.applications.api;
const { fields } = foundry.data; const { fields } = foundry.data;
const { getProperty, diffObject, mergeObject } = foundry.utils;
/** Used for Armour and Shields */ /** Used for Armour and Shields */
export class ArmourData extends CommonItemData { export class ArmourData extends CommonItemData {
// MARK: Schema // #region Schema
static defineSchema() { static defineSchema() {
return { return {
...super.defineSchema(), ...super.defineSchema(),
@ -39,20 +40,22 @@ export class ArmourData extends CommonItemData {
}), }),
}; };
}; };
// #endregion Schema
// MARK: Base Data
prepareBaseData() {
super.prepareBaseData();
};
// MARK: Derived Data
prepareDerivedData() {
super.prepareDerivedData();
};
// #region Lifecycle // #region Lifecycle
async _preCreate(item) {
if (this.parent.isEmbedded && this._canEquip()) {
const shouldEquip = await DialogV2.confirm({
window: { title: `Equip Item?` },
content: `Do you want to equip ${item.name}?`,
});
if (shouldEquip) {
this.updateSource({ "equipped": true });
};
};
};
async _preUpdate(changes, options, user) { async _preUpdate(changes, options, user) {
// return false
if (options.force && game.settings.get(`ripcrypt`, `devMode`)) { return }; if (options.force && game.settings.get(`ripcrypt`, `devMode`)) { return };
// Ensure changes is a diffed object // Ensure changes is a diffed object
@ -69,9 +72,7 @@ export class ArmourData extends CommonItemData {
); );
// Don't stop the update, but don't allow changing the equipped status // Don't stop the update, but don't allow changing the equipped status
mergeObject(changes, { setProperty(changes, `system.equipped`, false);
"system.equipped": false,
});
// Set a flag so that we can tell the sheet that it needs to rerender // Set a flag so that we can tell the sheet that it needs to rerender
this.forceRerender = true; this.forceRerender = true;
@ -79,7 +80,9 @@ export class ArmourData extends CommonItemData {
return valid; return valid;
}; };
// #endregion Lifecycle
// #region Helpers
/** /**
* Used to tell the preUpdate logic whether or not to prevent the item from * Used to tell the preUpdate logic whether or not to prevent the item from
* being equipped or not. * being equipped or not.
@ -106,11 +109,9 @@ export class ArmourData extends CommonItemData {
}; };
return true; return true;
}; };
// #endregion
// #region Getters
get locationString() { get locationString() {
return [...this.location].join(`, `); return [...this.location].join(`, `);
}; };
// #endregion // #endregion Helpers
}; };

View file

@ -2,12 +2,14 @@ import { barAttribute, optionalInteger, requiredInteger } from "../helpers.mjs";
import { CommonItemData } from "./Common.mjs"; import { CommonItemData } from "./Common.mjs";
import { gameTerms } from "../../gameTerms.mjs"; import { gameTerms } from "../../gameTerms.mjs";
import { localizer } from "../../utils/Localizer.mjs"; import { localizer } from "../../utils/Localizer.mjs";
import { Logger } from "../../utils/Logger.mjs";
const { diffObject, getProperty, setProperty } = foundry.utils;
const { DialogV2 } = foundry.applications.api;
const { fields } = foundry.data; const { fields } = foundry.data;
const { hasProperty, mergeObject } = foundry.utils;
export class WeaponData extends CommonItemData { export class WeaponData extends CommonItemData {
// MARK: Schema // #region Schema
static defineSchema() { static defineSchema() {
return { return {
...super.defineSchema(), ...super.defineSchema(),
@ -41,18 +43,28 @@ export class WeaponData extends CommonItemData {
}), }),
}; };
}; };
// #endregion Schema
// MARK: Base Data
prepareBaseData() {
super.prepareBaseData();
};
// MARK: Derived Data
prepareDerivedData() {
super.prepareDerivedData();
};
// #region Lifecycle // #region Lifecycle
async _preCreate(item) {
if (this.parent.isEmbedded && this._canEquip()) {
const shouldEquip = await DialogV2.confirm({
window: { title: `Equip Item?` },
content: `Do you want to equip ${item.name}?`,
});
if (shouldEquip) {
this.updateSource({ "equipped": true });
};
};
};
/**
*
* @param {*} changes The expanded object that was used for the update
* @param {*} options
* @param {*} user
* @returns
*/
async _preUpdate(changes, options, user) { async _preUpdate(changes, options, user) {
if (options.force && game.settings.get(`ripcrypt`, `devMode`)) { return }; if (options.force && game.settings.get(`ripcrypt`, `devMode`)) { return };
let valid = super._preUpdate(changes, options, user); let valid = super._preUpdate(changes, options, user);
@ -71,9 +83,26 @@ export class WeaponData extends CommonItemData {
}; };
return valid; return valid;
}; };
// #endregion // #endregion Lifecycle
// #region Helpers
/**
* Used to tell the preUpdate logic whether or not to prevent the item from
* being equipped or not.
*/
_canEquip() {
const parent = this.parent;
if (!parent.isEmbedded || !(parent.parent instanceof Actor)) {
Logger.error(`Unable to equip item when it's not embedded`);
return false;
};
const actor = this.parent.parent.system;
if (actor.equippedWeapons?.length >= actor.limit.weapons) {
return false;
};
return true;
};
// #region Getters
get traitString() { get traitString() {
return [...this.traits].join(`, `); return [...this.traits].join(`, `);
}; };
@ -84,7 +113,7 @@ export class WeaponData extends CommonItemData {
}; };
return String(this.range.short ?? this.range.long ?? ``); return String(this.range.short ?? this.range.long ?? ``);
}; };
// #endregion // #endregion Helpers
// #region Sheet Data // #region Sheet Data
async getFormFields(_ctx) { async getFormFields(_ctx) {
@ -225,5 +254,5 @@ export class WeaponData extends CommonItemData {
return fields; return fields;
}; };
// #endregion // #endregion Sheet Data
}; };