[Feature] Action Areas (#1815)
Some checks are pending
Project CI / build (24.x) (push) Waiting to run

* Functioning setup

* .

* Fixes

* Completed

* Apply suggestions from code review

Co-authored-by: Carlos Fernandez <CarlosFdez@users.noreply.github.com>

* using function.call instead of function.bind

* Run lint fix on action areas PR (#1820)

* .

* .

* Restructured getTemplateShape to be a lot more readable

* .

* .

* Changed from 'area' to 'areas'

* .

* Moved the areas button to the left

* Fix regression with actions list

* Updated all SRD adversaries

---------

Co-authored-by: Carlos Fernandez <CarlosFdez@users.noreply.github.com>
Co-authored-by: Carlos Fernandez <cfern1990@gmail.com>
This commit is contained in:
WBHarry 2026-04-21 22:27:52 +02:00 committed by GitHub
parent 646e0debbd
commit 3eda3c4c05
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
89 changed files with 1871 additions and 686 deletions

View file

@ -137,6 +137,10 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
element.addEventListener('click', this.onApplyEffect.bind(this))
);
for (const element of html.querySelectorAll('.action-areas')) {
element.addEventListener('click', this.onCreateAreas.bind(this));
}
html.querySelectorAll('.roll-target').forEach(element => {
element.addEventListener('mouseenter', this.hoverTarget);
element.addEventListener('mouseleave', this.unhoverTarget);
@ -249,6 +253,54 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
this.system.action?.workflow.get('effects')?.execute(config, targets, true);
}
async onCreateAreas(event) {
const createArea = async selectedArea => {
const effects = selectedArea.effects.map(effect => this.system.action.item.effects.get(effect).uuid);
const { shape: type, size: range } = selectedArea;
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({ type, range });
await canvas.regions.placeRegion(
{
name: selectedArea.name,
shapes: [shapeData],
restriction: { enabled: false, type: 'move', priority: 0 },
behaviors: [
{
name: game.i18n.localize('TYPES.RegionBehavior.applyActiveEffect'),
type: 'applyActiveEffect',
system: {
effects: effects
}
}
],
displayMeasurements: true,
locked: false,
ownership: { default: CONST.DOCUMENT_OWNERSHIP_LEVELS.NONE },
visibility: CONST.REGION_VISIBILITY.ALWAYS
},
{ create: true }
);
};
if (this.system.action.areas.length === 1) createArea(this.system.action.areas[0]);
else if (this.system.action.areas.length > 1) {
new foundry.applications.ux.ContextMenu.implementation(
event.target,
'.action-areas',
this.system.action.areas.map(area => ({
label: area.name,
onClick: () => createArea(area)
})),
{
jQuery: false,
fixed: true
}
);
CONFIG.ux.ContextMenu.triggerContextMenu(event, '.action-areas');
}
}
filterPermTargets(targets) {
return targets.filter(t => fromUuidSync(t.actorId)?.canUserModify(game.user, 'update'));
}