mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-07-22 18:39:55 +02:00
Merge branch 'main' into feature/combo-dice-modifier
This commit is contained in:
commit
c711fb7321
30 changed files with 772 additions and 145 deletions
|
|
@ -3,7 +3,7 @@ import DhDeathMove from '../../dialogs/deathMove.mjs';
|
|||
import { CharacterLevelup, LevelupViewMode } from '../../levelup/_module.mjs';
|
||||
import DhCharacterCreation from '../../characterCreation/characterCreation.mjs';
|
||||
import FilterMenu from '../../ux/filter-menu.mjs';
|
||||
import { getArmorSources, getDocFromElement, getDocFromElementSync, sortBy } from '../../../helpers/utils.mjs';
|
||||
import { getArmorSources, getDocFromElement, getDocFromElementSync, itemAbleRollParse, sortBy } from '../../../helpers/utils.mjs';
|
||||
|
||||
/**@typedef {import('@client/applications/_types.mjs').ApplicationClickAction} ApplicationClickAction */
|
||||
|
||||
|
|
@ -29,6 +29,7 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
|||
toggleResourceDice: CharacterSheet.#toggleResourceDice,
|
||||
handleResourceDice: CharacterSheet.#handleResourceDice,
|
||||
advanceResourceDie: CharacterSheet.#advanceResourceDie,
|
||||
toggleItemReload: CharacterSheet.#onToggleItemReload,
|
||||
cancelBeastform: CharacterSheet.#cancelBeastform,
|
||||
toggleResourceManagement: CharacterSheet.#toggleResourceManagement,
|
||||
useDowntime: this.useDowntime,
|
||||
|
|
@ -954,11 +955,21 @@ export default class CharacterSheet extends DHBaseActorSheet {
|
|||
});
|
||||
}
|
||||
|
||||
/** */
|
||||
static #advanceResourceDie(_, target) {
|
||||
this.updateResourceDie(target, true);
|
||||
}
|
||||
|
||||
static async #onToggleItemReload(_, target) {
|
||||
const item = await getDocFromElement(target);
|
||||
if (!item || !item.system.resource?.max)
|
||||
return;
|
||||
|
||||
await item.update({
|
||||
'system.resource.value': item.system.needsReload ?
|
||||
itemAbleRollParse(item.system.resource.max, this.document, item) : 0
|
||||
})
|
||||
}
|
||||
|
||||
lowerResourceDie(event) {
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
import { enrichedDualityRoll } from '../../enrichers/DualityRollEnricher.mjs';
|
||||
import { enrichedFateRoll, getFateTypeData } from '../../enrichers/FateRollEnricher.mjs';
|
||||
import { getCommandTarget, rollCommandToJSON } from '../../helpers/utils.mjs';
|
||||
import FearTracker from './fearTracker.mjs';
|
||||
|
||||
export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLog {
|
||||
constructor(options) {
|
||||
|
|
@ -152,6 +153,9 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo
|
|||
html.querySelectorAll('.risk-it-all-button').forEach(element =>
|
||||
element.addEventListener('click', event => this.riskItAllClearStressAndHitPoints(event, data))
|
||||
);
|
||||
for (const element of html.querySelectorAll('.roll-reload-check')) {
|
||||
element.addEventListener('click', event => this.onRollReloadCheck(event, message));
|
||||
}
|
||||
};
|
||||
|
||||
setupHooks() {
|
||||
|
|
@ -275,4 +279,27 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo
|
|||
const actor = game.actors.get(event.target.dataset.actorId);
|
||||
new game.system.api.applications.dialogs.RiskItAllDialog(actor, resourceValue).render({ force: true });
|
||||
}
|
||||
|
||||
_toggleNotifications({ closing = false } = {}) {
|
||||
super._toggleNotifications(closing)
|
||||
FearTracker.handleOffSet();
|
||||
}
|
||||
|
||||
async onRollReloadCheck(_event, messageData) {
|
||||
const message = game.messages.get(messageData._id);
|
||||
|
||||
if (message.system.reloadCheckValue) {
|
||||
const confirmed = await foundry.applications.api.DialogV2.confirm({
|
||||
window: {
|
||||
title: _loc('DAGGERHEART.ACTIONS.Reload.rerollConfirmationTitle')
|
||||
},
|
||||
content: _loc('DAGGERHEART.ACTIONS.Reload.rerollConfirmationText')
|
||||
});
|
||||
|
||||
if (!confirmed) return;
|
||||
}
|
||||
|
||||
const { rollValue } = await message.system.action.handleReload?.({ awaitRoll: true });
|
||||
await message.update({ 'system.reloadCheckValue': rollValue });
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,6 +13,14 @@ const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api;
|
|||
export default class FearTracker extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||
constructor(options = {}) {
|
||||
super(options);
|
||||
|
||||
this._dragData = {
|
||||
isDragging: false,
|
||||
startX: 0,
|
||||
startY: 0,
|
||||
startLeft: 0,
|
||||
startTop: 0
|
||||
}
|
||||
}
|
||||
|
||||
/** @inheritDoc */
|
||||
|
|
@ -21,19 +29,20 @@ export default class FearTracker extends HandlebarsApplicationMixin(ApplicationV
|
|||
classes: [],
|
||||
tag: 'div',
|
||||
window: {
|
||||
frame: true,
|
||||
frame: false,
|
||||
title: 'DAGGERHEART.GENERAL.fear',
|
||||
positioned: true,
|
||||
resizable: true,
|
||||
minimizable: false
|
||||
},
|
||||
classes: ['daggerheart', 'dh-style', 'fear-tracker'],
|
||||
actions: {
|
||||
setFear: FearTracker.setFear,
|
||||
increaseFear: FearTracker.increaseFear
|
||||
},
|
||||
position: {
|
||||
width: 222,
|
||||
height: 222
|
||||
width: 540,
|
||||
height: 'auto'
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -53,6 +62,10 @@ export default class FearTracker extends HandlebarsApplicationMixin(ApplicationV
|
|||
return game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).maxFear;
|
||||
}
|
||||
|
||||
get fearPosition() {
|
||||
return game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance).fearPosition;
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Rendering */
|
||||
/* -------------------------------------------- */
|
||||
|
|
@ -63,15 +76,48 @@ export default class FearTracker extends HandlebarsApplicationMixin(ApplicationV
|
|||
current = this.currentFear,
|
||||
max = this.maxFear,
|
||||
percent = (current / max) * 100,
|
||||
isGM = game.user.isGM;
|
||||
isGM = game.user.isGM,
|
||||
locked = false,
|
||||
isFree = this.fearPosition == 'free';
|
||||
|
||||
return { display, current, max, percent, isGM };
|
||||
return { display, current, max, percent, isGM, locked, isFree };
|
||||
}
|
||||
|
||||
/** @override */
|
||||
async _preFirstRender(context, options) {
|
||||
options.position =
|
||||
game.user.getFlag(CONFIG.DH.id, 'app.resources.position') ?? FearTracker.DEFAULT_OPTIONS.position;
|
||||
async _onRender(context, options) {
|
||||
await super._onRender(context, options);
|
||||
|
||||
this.#setupDragging();
|
||||
this.#setupResizing();
|
||||
|
||||
const fearPosition = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.appearance).fearPosition;
|
||||
|
||||
if (options.isFirstRender) FearTracker.handleOffSet();
|
||||
if (!options.force) return;
|
||||
|
||||
this.handleStyleElement(fearPosition);
|
||||
|
||||
switch (fearPosition) {
|
||||
case 'topCenter':
|
||||
document.getElementById('ui-top')?.appendChild(this.element);
|
||||
break;
|
||||
case 'bottomCenter':
|
||||
document.getElementById('ui-bottom')?.prepend(this.element);
|
||||
break;
|
||||
case 'rightTop':
|
||||
document.getElementById('ui-right-column-1')?.appendChild(this.element);
|
||||
break;
|
||||
case 'leftBottom':
|
||||
document.getElementById('ui-left-column-1')?.insertBefore(this.element, document.getElementById('players'));
|
||||
break;
|
||||
|
||||
default:
|
||||
document.body?.appendChild(this.element);
|
||||
const position =
|
||||
game.user.getFlag(CONFIG.DH.id, 'app.resources.position') ?? FearTracker.DEFAULT_OPTIONS.position;
|
||||
this.setPosition(position);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/** @override */
|
||||
|
|
@ -80,13 +126,29 @@ export default class FearTracker extends HandlebarsApplicationMixin(ApplicationV
|
|||
await game.settings.set(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Resources.Fear, this.maxFear);
|
||||
}
|
||||
|
||||
_onPosition(position) {
|
||||
game.user.setFlag(CONFIG.DH.id, 'app.resources.position', position);
|
||||
handleStyleElement(fearPosition) {
|
||||
for (const position of Object.values(CONFIG.DH.GENERAL.fearPosition)) {
|
||||
this.element.classList.remove(position.value);
|
||||
}
|
||||
|
||||
this.element.classList.add(fearPosition);
|
||||
}
|
||||
|
||||
async close(options = {}) {
|
||||
if (!options.allowed) return;
|
||||
else super.close(options);
|
||||
static handleOffSet() {
|
||||
const fearTracker = document.getElementById('resources');
|
||||
const hotbar = document.getElementById('hotbar');
|
||||
|
||||
if (!fearTracker) return;
|
||||
|
||||
const offset = Number(hotbar.style.getPropertyValue('--offset').replace(/px$/, '')) || 0;
|
||||
|
||||
if (offset > 0) return;
|
||||
|
||||
fearTracker.style.setProperty('--offset', `${offset - 13}px`);
|
||||
}
|
||||
|
||||
_onPosition(position) {
|
||||
game.user.setFlag(CONFIG.DH.id, 'app.resources.position', position);
|
||||
}
|
||||
|
||||
static async setFear(event, target) {
|
||||
|
|
@ -110,4 +172,119 @@ export default class FearTracker extends HandlebarsApplicationMixin(ApplicationV
|
|||
value
|
||||
);
|
||||
}
|
||||
|
||||
// TODO: Remove methods later to use Foundry's dragger and resize methods
|
||||
/* -------------------------------------------- */
|
||||
/* Dragging handlers */
|
||||
/* -------------------------------------------- */
|
||||
#setupDragging() {
|
||||
const dragHandle = this.element.querySelector('.drag-handle');
|
||||
if (!dragHandle) return;
|
||||
dragHandle.addEventListener('mousedown', this.#onDragStart.bind(this));
|
||||
}
|
||||
|
||||
#onDragStart(event) {
|
||||
if (event.button !== 0) return;
|
||||
this._dragData.isDragging = true;
|
||||
this._dragData.startX = event.clientX;
|
||||
this._dragData.startY = event.clientY;
|
||||
const rect = this.element.getBoundingClientRect();
|
||||
this._dragData.startLeft = rect.left;
|
||||
this._dragData.startTop = rect.top;
|
||||
this.element.style.cursor = 'grabbing';
|
||||
|
||||
this._dragHandler = this.#onDragging.bind(this);
|
||||
this._dragEndHandler = this.#onDragEnd.bind(this);
|
||||
window.addEventListener('mousemove', this._dragHandler);
|
||||
window.addEventListener('mouseup', this._dragEndHandler);
|
||||
}
|
||||
|
||||
#onDragging(event) {
|
||||
if (!this._dragData.isDragging) return;
|
||||
|
||||
const dragX = event.clientX - this._dragData.startX;
|
||||
const dragY = event.clientY - this._dragData.startY;
|
||||
|
||||
this.element.style.left = `${this._dragData.startLeft + dragX}px`;
|
||||
this.element.style.top = `${this._dragData.startTop + dragY}px`;
|
||||
}
|
||||
|
||||
#onDragEnd() {
|
||||
if (!this._dragData.isDragging) return;
|
||||
this._dragData.isDragging = false;
|
||||
this.element.style.cursor = '';
|
||||
|
||||
if (this._dragHandler) window.removeEventListener('mousemove', this._dragHandler);
|
||||
if (this._dragEndHandler) window.removeEventListener('mouseup', this._dragEndHandler);
|
||||
|
||||
const rect = this.element.getBoundingClientRect();
|
||||
const pos = { top: rect.top, left: rect.left };
|
||||
|
||||
this.setPosition(pos);
|
||||
}
|
||||
|
||||
/* -------------------------------------------- */
|
||||
/* Resize handlers */
|
||||
/* -------------------------------------------- */
|
||||
|
||||
#setupResizing() {
|
||||
const resizeHandle = this.element.querySelector('.resize-handle');
|
||||
if (!resizeHandle) return;
|
||||
resizeHandle.addEventListener('mousedown', this.#onResizeStart.bind(this));
|
||||
}
|
||||
|
||||
#onResizeStart(e) {
|
||||
if (e.button !== 0) return;
|
||||
e.stopPropagation();
|
||||
|
||||
let maxAllowedWidth = 10000;
|
||||
|
||||
this._resizeData = {
|
||||
isResizing: true,
|
||||
startX: e.clientX,
|
||||
startY: e.clientY,
|
||||
startWidth: this.element.offsetWidth,
|
||||
startHeight: this.element.offsetHeight,
|
||||
maxAllowedWidth: Math.max(50, maxAllowedWidth)
|
||||
};
|
||||
|
||||
this._resizeHandler = this.#onResizing.bind(this);
|
||||
this._resizeEndHandler = this.#onResizeEnd.bind(this);
|
||||
window.addEventListener('mousemove', this._resizeHandler);
|
||||
window.addEventListener('mouseup', this._resizeEndHandler);
|
||||
}
|
||||
|
||||
#onResizing(e) {
|
||||
if (!this._resizeData?.isResizing) return;
|
||||
|
||||
const currentDx = e.clientX - this._resizeData.startX;
|
||||
const potentialWidth = Math.max(50, this._resizeData.startWidth + currentDx);
|
||||
|
||||
const width = Math.min(potentialWidth, this._resizeData.maxAllowedWidth);
|
||||
|
||||
this.element.style.width = `${width}px`;
|
||||
|
||||
if (width < 100) {
|
||||
this.element.classList.add('narrow');
|
||||
} else {
|
||||
this.element.classList.remove('narrow');
|
||||
}
|
||||
}
|
||||
|
||||
#onResizeEnd() {
|
||||
if (!this._resizeData?.isResizing) return;
|
||||
this._resizeData.isResizing = false;
|
||||
|
||||
if (this._resizeHandler) window.removeEventListener('mousemove', this._resizeHandler);
|
||||
if (this._resizeEndHandler) window.removeEventListener('mouseup', this._resizeEndHandler);
|
||||
|
||||
let width = parseFloat(this.element.style.width);
|
||||
|
||||
|
||||
if (isNaN(width)) {
|
||||
width = this.element.getBoundingClientRect().width;
|
||||
}
|
||||
|
||||
this.setPosition({ width: width });
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -924,6 +924,14 @@ export const fearDisplay = {
|
|||
hide: { value: 'hide', label: 'DAGGERHEART.SETTINGS.Appearance.fearDisplay.hide' }
|
||||
};
|
||||
|
||||
export const fearPosition = {
|
||||
free: { value: 'free', label: 'DAGGERHEART.SETTINGS.Appearance.fearPosition.free' },
|
||||
topCenter: { value: 'topCenter', label: 'DAGGERHEART.SETTINGS.Appearance.fearPosition.topCenter' },
|
||||
bottomCenter: { value: 'bottomCenter', label: 'DAGGERHEART.SETTINGS.Appearance.fearPosition.bottomCenter' },
|
||||
rightTop: { value: 'rightTop', label: 'DAGGERHEART.SETTINGS.Appearance.fearPosition.rightTop' },
|
||||
leftBottom: { value: 'leftBottom', label: 'DAGGERHEART.SETTINGS.Appearance.fearPosition.leftBottom' }
|
||||
};
|
||||
|
||||
export const basicOwnershiplevels = {
|
||||
0: { value: 0, label: 'OWNERSHIP.NONE' },
|
||||
2: { value: 2, label: 'OWNERSHIP.OBSERVER' },
|
||||
|
|
|
|||
|
|
@ -62,3 +62,18 @@ export const actionAutomationChoices = {
|
|||
label: 'DAGGERHEART.CONFIG.ActionAutomationChoices.always'
|
||||
}
|
||||
};
|
||||
|
||||
export const reloadChoices = {
|
||||
off: {
|
||||
id: 'off',
|
||||
label: 'DAGGERHEART.CONFIG.ReloadChoices.off.label'
|
||||
},
|
||||
manual: {
|
||||
id: 'manual',
|
||||
label: 'DAGGERHEART.CONFIG.ReloadChoices.manual.label'
|
||||
},
|
||||
auto: {
|
||||
id: 'auto',
|
||||
label: 'DAGGERHEART.CONFIG.ReloadChoices.auto.label'
|
||||
}
|
||||
};
|
||||
|
|
@ -52,6 +52,10 @@ export default class DHAttackAction extends DHDamageAction {
|
|||
}
|
||||
|
||||
async use(event, options) {
|
||||
if (this.item?.system.needsReload) {
|
||||
return ui.notifications.error(_loc('DAGGERHEART.UI.Notifications.reloadRequired', { weapon: this.item.name }));
|
||||
}
|
||||
|
||||
const result = await super.use(event, options);
|
||||
|
||||
if (result?.message?.system.action?.roll?.type === 'attack') {
|
||||
|
|
@ -62,6 +66,23 @@ export default class DHAttackAction extends DHDamageAction {
|
|||
return result;
|
||||
}
|
||||
|
||||
async handleReload(options = { awaitRoll: false }) {
|
||||
const roll = await new Roll('1d6').evaluate();
|
||||
if (game.modules.get('dice-so-nice')?.active) {
|
||||
if (options.awaitRoll)
|
||||
await game.dice3d.showForRoll(roll, game.user, true);
|
||||
else
|
||||
game.dice3d.showForRoll(roll, game.user, true);
|
||||
}
|
||||
|
||||
const needsReload = roll.total === 1;
|
||||
if (needsReload) {
|
||||
this.item.update({ 'system.resource.value': 0 });
|
||||
}
|
||||
|
||||
return { needsReload, rollValue: roll.total };
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a localized label array for this item subtype.
|
||||
* @returns {(string | { value: string, icons: string[] })[]} An array of localized strings and damage label objects.
|
||||
|
|
|
|||
|
|
@ -429,11 +429,11 @@ export default class DHBaseAction extends ActionMixin(foundry.abstract.DataModel
|
|||
}
|
||||
|
||||
get hasDamage() {
|
||||
return this.type !== 'healing' && (Boolean(this.damage.main) || !foundry.utils.isEmpty(this.damage.resources));
|
||||
return this.type !== 'healing' && (Boolean(this.damage?.main) || !foundry.utils.isEmpty(this.damage?.resources));
|
||||
}
|
||||
|
||||
get hasHealing() {
|
||||
return this.type === 'healing' && !foundry.utils.isEmpty(this.damage.resources);
|
||||
return this.type === 'healing' && !foundry.utils.isEmpty(this.damage?.resources);
|
||||
}
|
||||
|
||||
get hasSave() {
|
||||
|
|
|
|||
|
|
@ -42,6 +42,7 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel {
|
|||
hasEffect: new fields.BooleanField({ initial: false }),
|
||||
hasSave: new fields.BooleanField({ initial: false }),
|
||||
hasTarget: new fields.BooleanField({ initial: false }),
|
||||
reloadCheckValue: new fields.NumberField({ integer: true, nullable: true, initial: null }),
|
||||
isDirect: new fields.BooleanField({ initial: false }),
|
||||
onSave: new fields.StringField(),
|
||||
source: new fields.SchemaField({
|
||||
|
|
@ -75,10 +76,14 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel {
|
|||
return fromUuidSync(this.source.actor);
|
||||
}
|
||||
|
||||
get actionItem() {
|
||||
get item() {
|
||||
const actionActor = this.actionActor;
|
||||
if (!actionActor || !this.source.item) return null;
|
||||
|
||||
return actionActor.items.get(this.source.item);
|
||||
}
|
||||
|
||||
get actionItem() {
|
||||
switch (this.source.originItem.type) {
|
||||
case CONFIG.DH.ITEM.originItemType.restMove:
|
||||
const restMoves = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Homebrew).restMoves;
|
||||
|
|
@ -86,11 +91,18 @@ export default class DHActorRoll extends foundry.abstract.TypeDataModel {
|
|||
this.source.originItem.actionIndex
|
||||
];
|
||||
default:
|
||||
const item = actionActor.items.get(this.source.item);
|
||||
return item ? item.system.actionsList?.find(a => a.id === this.source.action) : null;
|
||||
return this.item?.system.actionsList?.find(a => a.id === this.source.action);
|
||||
}
|
||||
}
|
||||
|
||||
get hasReload() {
|
||||
return this.item?.system.hasReload;
|
||||
}
|
||||
|
||||
get reloadCheckFailed() {
|
||||
return this.reloadCheckValue === 1;
|
||||
}
|
||||
|
||||
get action() {
|
||||
const { actionActor, actionItem: itemAction } = this;
|
||||
if (!this.source.action) return null;
|
||||
|
|
|
|||
|
|
@ -116,6 +116,14 @@ export default class DHWeapon extends AttachableItem {
|
|||
return this.weaponFeatures;
|
||||
}
|
||||
|
||||
get hasReload() {
|
||||
return Boolean(this.weaponFeatures.find(x => x.value === 'reloading'));
|
||||
}
|
||||
|
||||
get needsReload() {
|
||||
return this.hasReload && this.resource.value === 0;
|
||||
}
|
||||
|
||||
/**@inheritdoc */
|
||||
async getDescriptionData() {
|
||||
const baseDescription = this.description;
|
||||
|
|
|
|||
|
|
@ -41,6 +41,11 @@ export default class DhAppearance extends foundry.abstract.DataModel {
|
|||
choices: CONFIG.DH.GENERAL.fearDisplay,
|
||||
initial: CONFIG.DH.GENERAL.fearDisplay.token.value
|
||||
}),
|
||||
fearPosition: new StringField({
|
||||
required: true,
|
||||
choices: CONFIG.DH.GENERAL.fearPosition,
|
||||
initial: CONFIG.DH.GENERAL.fearPosition.topCenter.value
|
||||
}),
|
||||
displayCountdownUI: new BooleanField({ initial: true }),
|
||||
diceSoNice: new SchemaField({
|
||||
hope: diceStyle({ fg: '#ffffff', bg: '#ffe760', outline: '#000000', edge: '#ffffff' }),
|
||||
|
|
|
|||
|
|
@ -196,6 +196,13 @@ export default class DhAutomation extends foundry.abstract.DataModel {
|
|||
})
|
||||
})
|
||||
}),
|
||||
reload: new fields.StringField({
|
||||
required: true,
|
||||
choices: CONFIG.DH.SETTINGS.reloadChoices,
|
||||
initial: CONFIG.DH.SETTINGS.reloadChoices.manual.id,
|
||||
label: 'DAGGERHEART.SETTINGS.Automation.FIELDS.reload.label',
|
||||
hint: 'DAGGERHEART.SETTINGS.Automation.FIELDS.reload.hint'
|
||||
}),
|
||||
autoExpireActiveEffects: new fields.BooleanField({
|
||||
required: true,
|
||||
initial: true,
|
||||
|
|
|
|||
|
|
@ -117,7 +117,11 @@ export default class DHRoll extends BaseRoll {
|
|||
|
||||
static async toMessage(roll, config) {
|
||||
const item = config.data.parent?.items?.get?.(config.source.item) ?? null;
|
||||
const action = item ? item.system.actions.get(config.source.action) : null;
|
||||
const actions = item ? [
|
||||
...item.system.actions,
|
||||
...(item.system.attack?.id === config.source.action ? [item.system.attack] : [])
|
||||
] : [];
|
||||
const action = actions.find(x => x.id === config.source.action);
|
||||
let actionDescription = null;
|
||||
if (action?.chatDisplay) {
|
||||
actionDescription = action
|
||||
|
|
@ -129,6 +133,14 @@ export default class DHRoll extends BaseRoll {
|
|||
config.actionChatMessageHandled = true;
|
||||
}
|
||||
|
||||
const reloadSetting =
|
||||
game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation).reload;
|
||||
const useReload =
|
||||
item?.system.hasReload &&
|
||||
action?.type === 'attack' &&
|
||||
reloadSetting === CONFIG.DH.SETTINGS.reloadChoices.auto.id;
|
||||
const reloadResult = useReload ? await action?.handleReload?.() : {};
|
||||
|
||||
const cls = getDocumentClass('ChatMessage'),
|
||||
msgData = {
|
||||
type: this.messageType,
|
||||
|
|
@ -136,7 +148,11 @@ export default class DHRoll extends BaseRoll {
|
|||
title: roll.title,
|
||||
speaker: cls.getSpeaker({ actor: roll.data?.parent }),
|
||||
sound: config.mute ? null : CONFIG.sounds.dice,
|
||||
system: { ...config, actionDescription },
|
||||
system: {
|
||||
...config,
|
||||
actionDescription,
|
||||
reloadCheckValue: reloadResult.rollValue
|
||||
},
|
||||
rolls: [roll]
|
||||
};
|
||||
|
||||
|
|
@ -158,14 +174,17 @@ export default class DHRoll extends BaseRoll {
|
|||
if (!this._evaluated) return;
|
||||
|
||||
const metagamingSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Metagaming);
|
||||
const automationSettings = game.settings.get(CONFIG.DH.id, CONFIG.DH.SETTINGS.gameSettings.Automation);
|
||||
const chatData = await this._prepareChatRenderContext({ flavor, isPrivate, ...options });
|
||||
return foundry.applications.handlebars.renderTemplate(template, {
|
||||
roll: this,
|
||||
...chatData,
|
||||
action: chatData.action,
|
||||
parent: chatData.parent,
|
||||
targetMode: chatData.targetMode,
|
||||
areas: chatData.action?.areas,
|
||||
metagamingSettings
|
||||
metagamingSettings,
|
||||
automationSettings
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue