Added Aura type to action areas

This commit is contained in:
WBHarry 2026-06-30 16:19:05 +02:00
parent 329d820aab
commit ab4fb6970f
8 changed files with 45 additions and 11 deletions

View file

@ -113,7 +113,8 @@
"area": { "area": {
"sectionTitle": "Areas", "sectionTitle": "Areas",
"shape": "Shape", "shape": "Shape",
"size": "Size" "size": "Size",
"hasHole": "Area Hole"
}, },
"displayInChat": "Display in chat", "displayInChat": "Display in chat",
"deleteTriggerTitle": "Delete Trigger", "deleteTriggerTitle": "Delete Trigger",
@ -870,6 +871,10 @@
"bruiser": "for each Bruiser adversary.", "bruiser": "for each Bruiser adversary.",
"solo": "for each Solo adversary." "solo": "for each Solo adversary."
}, },
"AreaTypes": {
"aura": { "label": "Aura" },
"placed": { "label": "Placed Area" }
},
"ArmorInteraction": { "ArmorInteraction": {
"none": { "label": "Ignores Armor" }, "none": { "label": "Ignores Armor" },
"active": { "label": "Active w/ Armor" }, "active": { "label": "Active w/ Armor" },

View file

@ -96,7 +96,7 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
return inBounds.length === 1 ? inBounds[0] : null; return inBounds.length === 1 ? inBounds[0] : null;
} }
static getTemplateShape({ type, angle, range, direction } = {}) { static getTemplateShape({ shapeType, angle, range, direction, hasHole } = {}) {
const { line, rectangle, inFront, cone, circle, emanation } = CONFIG.DH.GENERAL.templateTypes; const { line, rectangle, inFront, cone, circle, emanation } = CONFIG.DH.GENERAL.templateTypes;
/* Length calculation */ /* Length calculation */
@ -112,11 +112,11 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
const shapeData = { const shapeData = {
...canvas.mousePosition, ...canvas.mousePosition,
type: type, type: shapeType,
direction: direction ?? 0 direction: direction ?? 0
}; };
switch (type) { switch (shapeType) {
case rectangle.id: case rectangle.id:
shapeData.width = length; shapeData.width = length;
shapeData.height = length; shapeData.height = length;
@ -145,7 +145,8 @@ export default class DhRegionLayer extends foundry.canvas.layers.RegionLayer {
y: 0, y: 0,
width: 1, width: 1,
height: 1, height: 1,
shape: game.canvas.grid.isHexagonal ? CONST.TOKEN_SHAPES.ELLIPSE_1 : CONST.TOKEN_SHAPES.RECTANGLE_1 shape: game.canvas.grid.isHexagonal ? CONST.TOKEN_SHAPES.ELLIPSE_1 : CONST.TOKEN_SHAPES.RECTANGLE_1,
hole: hasHole
}; };
break; break;
} }

View file

@ -119,6 +119,10 @@ export const advantageState = {
export const areaTypes = { export const areaTypes = {
placed: { placed: {
id: 'placed', id: 'placed',
label: 'Placed Area' label: 'DAGGERHEART.CONFIG.AreaTypes.placed.label'
},
aura: {
id: 'aura',
label: 'DAGGERHEART.CONFIG.AreaTypes.aura.label'
} }
}; };

View file

@ -33,6 +33,10 @@ export default class AreasField extends fields.ArrayField {
initial: CONFIG.DH.GENERAL.range.veryClose.id, initial: CONFIG.DH.GENERAL.range.veryClose.id,
label: 'DAGGERHEART.ACTIONS.Config.area.size' label: 'DAGGERHEART.ACTIONS.Config.area.size'
}), }),
hasHole: new fields.BooleanField({
initial: false,
label: 'DAGGERHEART.ACTIONS.Config.area.hasHole'
}),
effects: new fields.ArrayField(new fields.DocumentIdField()) effects: new fields.ArrayField(new fields.DocumentIdField())
}); });
super(element, options, context); super(element, options, context);

View file

@ -276,8 +276,12 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
async onCreateAreas(event) { async onCreateAreas(event) {
const createArea = async selectedArea => { const createArea = async selectedArea => {
const effects = selectedArea.effects.map(effect => this.system.action.item.effects.get(effect).uuid); const effects = selectedArea.effects.map(effect => this.system.action.item.effects.get(effect).uuid);
const { shape: type, size: range } = selectedArea; const { shape: shapeType, size: range, hasHole } = selectedArea;
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({ type, range }); const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({
shapeType,
range,
hasHole
});
const scene = game.scenes.get(game.user.viewedScene); const scene = game.scenes.get(game.user.viewedScene);
const level = scene.levels.find(x => x.isView); const level = scene.levels.find(x => x.isView);
@ -305,7 +309,10 @@ export default class DhpChatMessage extends foundry.documents.ChatMessage {
visibility: CONST.REGION_VISIBILITY.ALWAYS visibility: CONST.REGION_VISIBILITY.ALWAYS
}; };
const placeRegion = data => { const placeRegion = data => {
canvas.regions.placeRegion(data, { create: true }); canvas.regions.placeRegion(data, {
create: true,
attachToToken: selectedArea.type === CONFIG.DH.ACTIONS.areaTypes.aura.id
});
}; };
// Regions with effects must be placed by the GM // Regions with effects must be placed by the GM

View file

@ -58,10 +58,11 @@ export const renderMeasuredTemplate = async event => {
if (!type || !range || !game.canvas.scene) return; if (!type || !range || !game.canvas.scene) return;
const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({ const shapeData = CONFIG.Canvas.layers.regions.layerClass.getTemplateShape({
type, shapetype: type,
angle, angle,
range, range,
direction direction,
hasHole: false
}); });
await canvas.regions.placeRegion( await canvas.regions.placeRegion(

View file

@ -384,6 +384,10 @@
justify-content: space-between; justify-content: space-between;
} }
label {
white-space: nowrap;
}
.btn { .btn {
padding-top: 15px; padding-top: 15px;
} }
@ -399,6 +403,13 @@
> .checkbox { > .checkbox {
align-self: end; align-self: end;
} }
.auto-sized {
width: auto;
display: flex;
flex-direction: column;
align-items: center;
}
} }
.form-group { .form-group {

View file

@ -14,6 +14,7 @@
{{formField ../fields.type value=area.type name=(concat "areas." index ".type") localize=true}} {{formField ../fields.type value=area.type name=(concat "areas." index ".type") localize=true}}
{{formField ../fields.shape value=area.shape name=(concat "areas." index ".shape") localize=true}} {{formField ../fields.shape value=area.shape name=(concat "areas." index ".shape") localize=true}}
{{formField ../fields.size value=area.size name=(concat "areas." index ".size") localize=true}} {{formField ../fields.size value=area.size name=(concat "areas." index ".size") localize=true}}
{{formField ../fields.hasHole value=area.hasHole name=(concat "areas." index ".hasHole") localize=true classes="auto-sized" }}
</div> </div>
<div class="sub-section-header"> <div class="sub-section-header">