mirror of
https://github.com/Foundryborne/daggerheart.git
synced 2026-01-15 21:21:08 +01:00
Merge branch 'main' into feature/56-Level-Up-Overview
This commit is contained in:
commit
e0b986da3f
9 changed files with 81 additions and 26 deletions
|
|
@ -97,6 +97,9 @@ Hooks.once('init', () => {
|
||||||
|
|
||||||
game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent);
|
game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent);
|
||||||
|
|
||||||
|
// Make Compendium Dialog resizable
|
||||||
|
foundry.applications.sidebar.apps.Compendium.DEFAULT_OPTIONS.window.resizable = true;
|
||||||
|
|
||||||
registerDHSettings();
|
registerDHSettings();
|
||||||
RegisterHandlebarsHelpers.registerHelpers();
|
RegisterHandlebarsHelpers.registerHelpers();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,9 +37,10 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) {
|
||||||
attackRoll: this.attackRoll,
|
attackRoll: this.attackRoll,
|
||||||
tabToLoadout: () => this.domainCardsTab(false),
|
tabToLoadout: () => this.domainCardsTab(false),
|
||||||
tabToVault: () => this.domainCardsTab(true),
|
tabToVault: () => this.domainCardsTab(true),
|
||||||
sendToVault: (_, button) => this.moveDomainCard(button, true),
|
sendToVault: this.moveDomainCard,
|
||||||
sentToLoadout: (_, button) => this.moveDomainCard(button, false),
|
sendToLoadout: this.moveDomainCard,
|
||||||
useDomainCard: this.useDomainCard,
|
useDomainCard: this.useDomainCard,
|
||||||
|
removeCard: this.removeDomainCard,
|
||||||
selectClass: this.selectClass,
|
selectClass: this.selectClass,
|
||||||
selectSubclass: this.selectSubclass,
|
selectSubclass: this.selectSubclass,
|
||||||
selectAncestry: this.selectAncestry,
|
selectAncestry: this.selectAncestry,
|
||||||
|
|
@ -658,7 +659,8 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) {
|
||||||
this.render();
|
this.render();
|
||||||
}
|
}
|
||||||
|
|
||||||
static async moveDomainCard(button, toVault) {
|
static async moveDomainCard(_, button) {
|
||||||
|
const toVault = button.dataset.action === 'sendToVault';
|
||||||
if (!toVault && this.document.system.domainCards.loadout.length >= this.document.system.domainData.maxLoadout) {
|
if (!toVault && this.document.system.domainCards.loadout.length >= this.document.system.domainData.maxLoadout) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
@ -673,6 +675,7 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) {
|
||||||
const cls = getDocumentClass('ChatMessage');
|
const cls = getDocumentClass('ChatMessage');
|
||||||
const systemData = {
|
const systemData = {
|
||||||
title: `${game.i18n.localize('DAGGERHEART.Chat.DomainCard.Title')} - ${capitalize(button.dataset.domain)}`,
|
title: `${game.i18n.localize('DAGGERHEART.Chat.DomainCard.Title')} - ${capitalize(button.dataset.domain)}`,
|
||||||
|
origin: this.document.id,
|
||||||
img: card.img,
|
img: card.img,
|
||||||
name: card.name,
|
name: card.name,
|
||||||
description: card.system.effect,
|
description: card.system.effect,
|
||||||
|
|
@ -691,6 +694,13 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) {
|
||||||
cls.create(msg.toObject());
|
cls.create(msg.toObject());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static async removeDomainCard(_, button) {
|
||||||
|
if (button.dataset.type === 'domainCard') {
|
||||||
|
const card = this.document.items.find(x => x.uuid === button.dataset.key);
|
||||||
|
await card.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static async selectClass() {
|
static async selectClass() {
|
||||||
(await game.packs.get('daggerheart.classes'))?.render(true);
|
(await game.packs.get('daggerheart.classes'))?.render(true);
|
||||||
}
|
}
|
||||||
|
|
@ -895,6 +905,7 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) {
|
||||||
const cls = getDocumentClass('ChatMessage');
|
const cls = getDocumentClass('ChatMessage');
|
||||||
const systemData = {
|
const systemData = {
|
||||||
title: game.i18n.localize('DAGGERHEART.Chat.FeatureTitle'),
|
title: game.i18n.localize('DAGGERHEART.Chat.FeatureTitle'),
|
||||||
|
origin: this.document.id,
|
||||||
img: item.img,
|
img: item.img,
|
||||||
name: item.name,
|
name: item.name,
|
||||||
description: item.system.description,
|
description: item.system.description,
|
||||||
|
|
@ -925,6 +936,7 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) {
|
||||||
: type === 'community'
|
: type === 'community'
|
||||||
? game.i18n.localize('DAGGERHEART.Chat.FoundationCard.CommunityTitle')
|
? game.i18n.localize('DAGGERHEART.Chat.FoundationCard.CommunityTitle')
|
||||||
: game.i18n.localize('DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle'),
|
: game.i18n.localize('DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle'),
|
||||||
|
origin: this.document.id,
|
||||||
img: item.img,
|
img: item.img,
|
||||||
name: item.name,
|
name: item.name,
|
||||||
description: item.system.description,
|
description: item.system.description,
|
||||||
|
|
@ -952,14 +964,20 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) {
|
||||||
const title = `${item.name} - ${game.i18n.localize(`DAGGERHEART.Sheets.PC.DomainCard.${capitalize(button.dataset.key)}Title`)}`;
|
const title = `${item.name} - ${game.i18n.localize(`DAGGERHEART.Sheets.PC.DomainCard.${capitalize(button.dataset.key)}Title`)}`;
|
||||||
|
|
||||||
const cls = getDocumentClass('ChatMessage');
|
const cls = getDocumentClass('ChatMessage');
|
||||||
|
const systemData = {
|
||||||
|
title: game.i18n.localize('DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle'),
|
||||||
|
origin: this.document.id,
|
||||||
|
name: title,
|
||||||
|
img: item.img,
|
||||||
|
description: ability.description
|
||||||
|
};
|
||||||
const msg = new cls({
|
const msg = new cls({
|
||||||
|
type: 'abilityUse',
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
|
system: systemData,
|
||||||
content: await foundry.applications.handlebars.renderTemplate(
|
content: await foundry.applications.handlebars.renderTemplate(
|
||||||
'systems/daggerheart/templates/chat/ability-use.hbs',
|
'systems/daggerheart/templates/chat/ability-use.hbs',
|
||||||
{
|
systemData
|
||||||
title: game.i18n.localize('DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle'),
|
|
||||||
card: { name: title, img: item.img, description: ability.description }
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -971,14 +989,19 @@ export default class PCSheet extends DaggerheartSheet(ActorSheetV2) {
|
||||||
const item = this.document.items.find(x => x.uuid === button.dataset.id);
|
const item = this.document.items.find(x => x.uuid === button.dataset.id);
|
||||||
|
|
||||||
const cls = getDocumentClass('ChatMessage');
|
const cls = getDocumentClass('ChatMessage');
|
||||||
|
const systemData = {
|
||||||
|
title: game.i18n.localize('DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle'),
|
||||||
|
origin: this.document.id,
|
||||||
|
name: item.name,
|
||||||
|
img: item.img,
|
||||||
|
description: item.system.description
|
||||||
|
};
|
||||||
const msg = new cls({
|
const msg = new cls({
|
||||||
user: game.user.id,
|
user: game.user.id,
|
||||||
|
system: systemData,
|
||||||
content: await foundry.applications.handlebars.renderTemplate(
|
content: await foundry.applications.handlebars.renderTemplate(
|
||||||
'systems/daggerheart/templates/chat/ability-use.hbs',
|
'systems/daggerheart/templates/chat/ability-use.hbs',
|
||||||
{
|
systemData
|
||||||
title: game.i18n.localize('DAGGERHEART.Chat.FoundationCard.SubclassFeatureTitle'),
|
|
||||||
card: { name: item.name, img: item.img, description: item.system.description }
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,12 @@ export default class DhpAbilityUse extends foundry.abstract.TypeDataModel {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
title: new fields.StringField({}),
|
title: new fields.StringField({}),
|
||||||
|
origin: new fields.StringField({}),
|
||||||
img: new fields.StringField({}),
|
img: new fields.StringField({}),
|
||||||
name: new fields.StringField({}),
|
name: new fields.StringField({}),
|
||||||
description: new fields.StringField({}),
|
description: new fields.StringField({}),
|
||||||
actions: new fields.ArrayField(
|
actions: new fields.ArrayField(
|
||||||
new fields.SchemaField({
|
new fields.ObjectField({
|
||||||
name: new fields.StringField({}),
|
name: new fields.StringField({}),
|
||||||
damage: new fields.SchemaField({
|
damage: new fields.SchemaField({
|
||||||
type: new fields.StringField({}),
|
type: new fields.StringField({}),
|
||||||
|
|
@ -19,11 +20,11 @@ export default class DhpAbilityUse extends foundry.abstract.TypeDataModel {
|
||||||
value: new fields.StringField({})
|
value: new fields.StringField({})
|
||||||
}),
|
}),
|
||||||
cost: new fields.SchemaField({
|
cost: new fields.SchemaField({
|
||||||
type: new fields.StringField({ nullable: true }),
|
type: new fields.StringField({}),
|
||||||
value: new fields.NumberField({ nullable: true })
|
value: new fields.NumberField({})
|
||||||
}),
|
}),
|
||||||
target: new fields.SchemaField({
|
target: new fields.SchemaField({
|
||||||
type: new fields.StringField({})
|
type: new fields.StringField({ nullable: true })
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -5,12 +5,15 @@ import { GMUpdateEvent, socketEvent } from '../helpers/socket.mjs';
|
||||||
import { setDiceSoNiceForDualityRoll } from '../helpers/utils.mjs';
|
import { setDiceSoNiceForDualityRoll } from '../helpers/utils.mjs';
|
||||||
|
|
||||||
export default class DhpActor extends Actor {
|
export default class DhpActor extends Actor {
|
||||||
_preCreate(data, changes, user) {
|
async _preCreate(data, options, user) {
|
||||||
if (data.type === 'pc') {
|
if ( (await super._preCreate(data, options, user)) === false ) return false;
|
||||||
data.prototypeToken = { actorLink: true, disposition: 1, sight: { enabled: true } };
|
|
||||||
}
|
|
||||||
|
|
||||||
super._preCreate(data, changes, user);
|
// Configure prototype token settings
|
||||||
|
const prototypeToken = {};
|
||||||
|
if ( this.type === "pc" ) Object.assign(prototypeToken, {
|
||||||
|
sight: { enabled: true }, actorLink: true, disposition: CONST.TOKEN_DISPOSITIONS.FRIENDLY
|
||||||
|
});
|
||||||
|
this.updateSource({ prototypeToken });
|
||||||
}
|
}
|
||||||
|
|
||||||
prepareData() {
|
prepareData() {
|
||||||
|
|
@ -450,10 +453,20 @@ export default class DhpActor extends Actor {
|
||||||
let update = {};
|
let update = {};
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case SYSTEM.GENERAL.healingTypes.health.id:
|
case SYSTEM.GENERAL.healingTypes.health.id:
|
||||||
update = { 'system.resources.health.value': Math.max(this.system.resources.health.value - healing, 0) };
|
update = {
|
||||||
|
'system.resources.health.value': Math.min(
|
||||||
|
this.system.resources.health.value + healing,
|
||||||
|
this.system.resources.health.max
|
||||||
|
)
|
||||||
|
};
|
||||||
break;
|
break;
|
||||||
case SYSTEM.GENERAL.healingTypes.stress.id:
|
case SYSTEM.GENERAL.healingTypes.stress.id:
|
||||||
update = { 'system.resources.stress.value': Math.max(this.system.resources.stress.value - healing, 0) };
|
update = {
|
||||||
|
'system.resources.stress.value': Math.min(
|
||||||
|
this.system.resources.stress.value + healing,
|
||||||
|
this.system.resources.stress.max
|
||||||
|
)
|
||||||
|
};
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -486,7 +499,10 @@ export default class DhpActor extends Actor {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (action.cost.type != null && action.cost.value != null) {
|
if (action.cost.type != null && action.cost.value != null) {
|
||||||
if (this.system.resources[action.cost.type].value < action.cost.value - 1) {
|
if (
|
||||||
|
this.system.resources[action.cost.type].value - action.cost.value <=
|
||||||
|
this.system.resources[action.cost.type].min
|
||||||
|
) {
|
||||||
ui.notifications.error(game.i18n.localize(`Insufficient ${action.cost.type} to use this ability`));
|
ui.notifications.error(game.i18n.localize(`Insufficient ${action.cost.type} to use this ability`));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -36,7 +36,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo
|
||||||
element.addEventListener('click', event => this.selectAdvantage.bind(this)(event, data.message))
|
element.addEventListener('click', event => this.selectAdvantage.bind(this)(event, data.message))
|
||||||
);
|
);
|
||||||
html.querySelectorAll('.ability-use-button').forEach(element =>
|
html.querySelectorAll('.ability-use-button').forEach(element =>
|
||||||
element.addEventListener('click', this.abilityUseButton.bind(this)(event, data.message))
|
element.addEventListener('click', event => this.abilityUseButton.bind(this)(event, data.message))
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -134,6 +134,7 @@ export default class DhpChatLog extends foundry.applications.sidebar.tabs.ChatLo
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
|
|
||||||
const action = message.system.actions[Number.parseInt(event.currentTarget.dataset.index)];
|
const action = message.system.actions[Number.parseInt(event.currentTarget.dataset.index)];
|
||||||
await game.user.character.useAction(action);
|
const actor = game.actors.get(message.system.origin);
|
||||||
|
await actor.useAction(action);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -547,6 +547,11 @@
|
||||||
margin-top: @tinyMargin;
|
margin-top: @tinyMargin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.ability-card-action-cost {
|
||||||
|
margin: auto;
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img {
|
||||||
|
|
|
||||||
|
|
@ -1770,6 +1770,10 @@
|
||||||
.daggerheart.chat.domain-card .ability-card-footer button:nth-of-type(n + 3) {
|
.daggerheart.chat.domain-card .ability-card-footer button:nth-of-type(n + 3) {
|
||||||
margin-top: 2px;
|
margin-top: 2px;
|
||||||
}
|
}
|
||||||
|
.daggerheart.chat.domain-card .ability-card-footer .ability-card-action-cost {
|
||||||
|
margin: auto;
|
||||||
|
font-size: 1.5em;
|
||||||
|
}
|
||||||
.daggerheart.chat.domain-card img {
|
.daggerheart.chat.domain-card img {
|
||||||
width: 80px;
|
width: 80px;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
<button class="ability-use-button" data-index="{{index}}">
|
<button class="ability-use-button" data-index="{{index}}">
|
||||||
{{action.name}}
|
{{action.name}}
|
||||||
</button>
|
</button>
|
||||||
|
{{#if action.cost.value}}<div class="ability-card-action-cost">{{action.cost.value}} {{action.cost.type}}</div>{{/if}}
|
||||||
{{/each}}
|
{{/each}}
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="abilities-text-container domain">
|
<div class="abilities-text-container domain">
|
||||||
|
<div ><i data-action="removeCard" data-type="{{card.type}}" data-key="{{card.uuid}}" class="fas fa-trash icon-button row-icon"></i></div>
|
||||||
<div class="abilities-card-title">{{card.name}}</div>
|
<div class="abilities-card-title">{{card.name}}</div>
|
||||||
{{#if inVault}}
|
{{#if inVault}}
|
||||||
<div class="abilities-card-description">{{{card.system.effect}}}</div>
|
<div class="abilities-card-description">{{{card.system.effect}}}</div>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue