Begin playing around with the weapon sheet
This commit is contained in:
parent
d1cb412e5a
commit
91c95da639
8 changed files with 256 additions and 4 deletions
|
|
@ -15,6 +15,7 @@ import { ItemProxy } from "./documents/Item/_proxy.mjs";
|
|||
|
||||
// Item Sheets
|
||||
import { UntypedItemSheet } from "./sheets/Items/UntypedItemSheet.mjs";
|
||||
import { WeaponSheet } from "./sheets/Items/WeaponSheet.mjs";
|
||||
import { AspectSheet } from "./sheets/Items/AspectSheet.mjs";
|
||||
import { SpellSheet } from "./sheets/Items/SpellSheet.mjs";
|
||||
import { PetSheet } from "./sheets/Items/PetSheet.mjs";
|
||||
|
|
@ -95,6 +96,11 @@ Hooks.once(`init`, async () => {
|
|||
types: ["aspect"],
|
||||
label: "dotdungeon.sheet-names.AspectSheet"
|
||||
});
|
||||
Items.registerSheet("dotdungeon", WeaponSheet, {
|
||||
makeDefault: true,
|
||||
types: ["weapon"],
|
||||
label: "dotdungeon.sheet-names.WeaponSheet"
|
||||
});
|
||||
Items.registerSheet("dotdungeon", SpellSheet, {
|
||||
makeDefault: true,
|
||||
types: ["spell"],
|
||||
|
|
|
|||
|
|
@ -32,11 +32,15 @@ export const partials = [
|
|||
`actors/char-sheet/v2/partials/inventory/items/weapon.v2.pc.hbs`,
|
||||
`actors/char-sheet/v2/partials/inventory/items/pet.v2.pc.hbs`,
|
||||
|
||||
// The v2 Untyped sheet partials
|
||||
// The partials used for Untyped v2 and other item sheets that don't have a
|
||||
// unique design for the other tabs
|
||||
`items/untyped/v2/tabs/general.v2.untyped.hbs`,
|
||||
`items/untyped/v2/tabs/details.v2.untyped.hbs`,
|
||||
`items/untyped/v2/tabs/effects.v2.untyped.hbs`,
|
||||
`items/untyped/v2/tabs/settings.v2.untyped.hbs`,
|
||||
|
||||
// The weapon sheet partials
|
||||
`items/weapon/v1/tabs/details.v1.weapon.hbs`,
|
||||
];
|
||||
|
||||
export const preAliasedPartials = {
|
||||
|
|
|
|||
116
module/sheets/Items/WeaponSheet.mjs
Normal file
116
module/sheets/Items/WeaponSheet.mjs
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
import { GenericContextMenu } from "../../utils/GenericContextMenu.mjs";
|
||||
import { DialogManager } from "../../utils/DialogManager.mjs";
|
||||
import { GenericItemSheet } from "./GenericItemSheet.mjs";
|
||||
import { localizer } from "../../utils/localizer.mjs";
|
||||
|
||||
export class WeaponSheet extends GenericItemSheet {
|
||||
static get defaultOptions() {
|
||||
let opts = foundry.utils.mergeObject(
|
||||
super.defaultOptions,
|
||||
{
|
||||
template: `systems/dotdungeon/templates/items/weapon/v1/index.hbs`,
|
||||
width: 300,
|
||||
height: 340,
|
||||
tabs: [
|
||||
{
|
||||
group: `page`,
|
||||
navSelector: `nav.page`,
|
||||
contentSelector: `.page-content`,
|
||||
initial: `general`,
|
||||
},
|
||||
],
|
||||
}
|
||||
);
|
||||
opts.classes.push(`dotdungeon`, `style-v3`);
|
||||
return opts;
|
||||
};
|
||||
|
||||
activateListeners(html) {
|
||||
super.activateListeners(html);
|
||||
|
||||
new GenericContextMenu(html, `.photo.panel`, [
|
||||
{
|
||||
name: localizer(`dotdungeon.common.view-larger`),
|
||||
callback: () => {
|
||||
(new ImagePopout(this.item.img)).render(true);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: localizer(`dotdungeon.common.edit`),
|
||||
condition: () => this.isEditable,
|
||||
callback: () => {
|
||||
const fp = new FilePicker({
|
||||
callback: (path) => {
|
||||
this.item.update({"img": path});
|
||||
},
|
||||
});
|
||||
fp.render(true);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: localizer(`dotdungeon.common.reset`),
|
||||
condition: () => this.isEditable,
|
||||
callback: () => {
|
||||
console.log(`.dungeon | Reset Item Image`)
|
||||
},
|
||||
}
|
||||
]);
|
||||
|
||||
if (!this.isEditable) return;
|
||||
console.debug(`.dungeon | Adding event listeners for Weapon Item: ${this.item.id}`);
|
||||
|
||||
html.find(`.create-ae`).on(`click`, async () => {
|
||||
await this.item.createEmbeddedDocuments(
|
||||
`ActiveEffect`,
|
||||
[{name: localizer(`dotdungeon.default.name`, { document: `ActiveEffect`, type: `base` })}],
|
||||
{ renderSheet: true }
|
||||
);
|
||||
});
|
||||
|
||||
new GenericContextMenu(html, `.effect.panel`, [
|
||||
{
|
||||
name: localizer(`dotdungeon.common.edit`),
|
||||
callback: async (html) => {
|
||||
(await fromUuid(html.closest(`.effect`)[0].dataset.embeddedId))?.sheet.render(true);
|
||||
},
|
||||
},
|
||||
{
|
||||
name: localizer(`dotdungeon.common.delete`),
|
||||
callback: async (html) => {
|
||||
const target = html.closest(`.effect`)[0];
|
||||
const data = target.dataset;
|
||||
const id = data.embeddedId;
|
||||
const doc = await fromUuid(id);
|
||||
DialogManager.createOrFocus(
|
||||
`${doc.uuid}-delete`,
|
||||
{
|
||||
title: localizer(`dotdungeon.delete.ActiveEffect.title`, doc),
|
||||
content: localizer(`dotdungeon.delete.ActiveEffect.content`, doc),
|
||||
buttons: {
|
||||
yes: {
|
||||
label: localizer(`Yes`),
|
||||
callback() {
|
||||
doc.delete();
|
||||
},
|
||||
},
|
||||
no: {
|
||||
label: localizer(`No`),
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
},
|
||||
}
|
||||
]);
|
||||
};
|
||||
|
||||
async getData() {
|
||||
const ctx = await super.getData();
|
||||
|
||||
ctx.meta.showSettingsTab = ctx.isGM || this.item.isOwned;
|
||||
ctx.meta.isEmbedded = this.item.isOwned;
|
||||
ctx.meta.isEditable = this.isEditable;
|
||||
|
||||
return ctx;
|
||||
};
|
||||
};
|
||||
|
|
@ -6,16 +6,24 @@
|
|||
border-radius: 4px;
|
||||
padding: var(--gap);
|
||||
|
||||
&.space-between {
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
&--row {
|
||||
@extend .panel;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: var(--gap);
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
&.space-between {
|
||||
justify-content: space-between;
|
||||
}
|
||||
&--column {
|
||||
@extend .panel;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--gap);
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,6 +21,7 @@
|
|||
@use "./layouts/datasheet.scss";
|
||||
@use "./layouts/items/common.scss";
|
||||
@use "./layouts/items/untyped/v2.scss";
|
||||
@use "./layouts/items/weapon/v1.scss";
|
||||
|
||||
/* Sheet Options */
|
||||
.dotdungeon.style-v3 {
|
||||
|
|
|
|||
13
styles/v3/layouts/items/weapon/v1.scss
Normal file
13
styles/v3/layouts/items/weapon/v1.scss
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
@use "../../../mixins/material";
|
||||
@use "../../../mixins/utils";
|
||||
|
||||
.dotdungeon.style-v3 .item--weapon-v1 {
|
||||
@include utils.tab("details") {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
|
||||
.full-width {
|
||||
grid-column: 1 / -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
21
templates/items/weapon/v1/index.hbs
Normal file
21
templates/items/weapon/v1/index.hbs
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
<form class="item item--weapon-v1 theme-dark">
|
||||
<div class="page-content">
|
||||
{{> dotdungeon.untyped.v2.general }}
|
||||
{{> dotdungeon.weapon.v1.details }}
|
||||
{{#if meta.showSettingsTab}}
|
||||
{{> dotdungeon.untyped.v2.settings }}
|
||||
{{/if}}
|
||||
{{> dotdungeon.untyped.v2.effects }}
|
||||
</div>
|
||||
|
||||
<div class="nav-bar">
|
||||
<nav data-group="page" class="page" aria-label="">
|
||||
<a class="button" data-group="page" data-tab="general">General</a>
|
||||
<a class="button" data-group="page" data-tab="details">Details</a>
|
||||
<a class="button" data-group="page" data-tab="effects">Effects</a>
|
||||
{{#if meta.showSettingsTab}}
|
||||
<a class="button" data-group="page" data-tab="settings">Settings</a>
|
||||
{{/if}}
|
||||
</nav>
|
||||
</div>
|
||||
</form>
|
||||
83
templates/items/weapon/v1/tabs/details.v1.weapon.hbs
Normal file
83
templates/items/weapon/v1/tabs/details.v1.weapon.hbs
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
<div class="tab" data-group="page" data-tab="details">
|
||||
<div class="full-width panel--row space-between">
|
||||
{{#if meta.isEditable}}
|
||||
<label
|
||||
for="{{meta.idp}}-purchase-cost"
|
||||
class="justify-start"
|
||||
>
|
||||
Purchase Cost
|
||||
</label>
|
||||
<dd-incrementer
|
||||
var:height="1.5rem"
|
||||
name="system.buy"
|
||||
value="{{system.buy}}"
|
||||
id="{{meta.idp}}-purchase-cost"
|
||||
min="0"
|
||||
></dd-incrementer>
|
||||
{{else}}
|
||||
<span>Purchase Cost</span>
|
||||
<span class="text-right">{{dd-empty-state system.buy}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="full-width panel--row space-between">
|
||||
{{#if meta.isEditable}}
|
||||
<label
|
||||
for="{{meta.idp}}-usage-cost"
|
||||
class="justify-start"
|
||||
>
|
||||
Usage Cost
|
||||
</label>
|
||||
<dd-incrementer
|
||||
var:height="1.5rem"
|
||||
name="system.usage_cost"
|
||||
value="{{system.usage_cost}}"
|
||||
id="{{meta.idp}}-usage-cost"
|
||||
min="0"
|
||||
></dd-incrementer>
|
||||
{{else}}
|
||||
<span>Usage Cost</span>
|
||||
<span class="text-right">{{dd-empty-state system.usage_cost}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="detail panel--column">
|
||||
<span>Rarity</span>
|
||||
{{#if meta.isEditable}}
|
||||
<select
|
||||
class="text-center"
|
||||
name="system.tier"
|
||||
id="{{meta.idp}}-item-tier"
|
||||
>
|
||||
{{{ dd-options system.tier config.itemTiers localize=true }}}
|
||||
</select>
|
||||
{{else}}
|
||||
<span>{{dd-i18n (concat "dotdungeon.rarity." system.tier)}}</span>
|
||||
{{/if}}
|
||||
</div>
|
||||
{{#if meta.isEmbedded}}
|
||||
<div class="detail panel--column">
|
||||
Item Location
|
||||
{{#if meta.isEditable}}
|
||||
<select
|
||||
class="text-center"
|
||||
name="system.location"
|
||||
id="{{meta.idp}}-location"
|
||||
>
|
||||
{{{ dd-options system.location item.availableLocations localize=true }}}
|
||||
</select>
|
||||
{{else}}
|
||||
{{dd-i18n (concat "dotdungeon.location." system.location)}}
|
||||
{{/if}}
|
||||
</div>
|
||||
<div class="number full-width panel--row space-between">
|
||||
{{#if meta.isEditable}}
|
||||
<label for="{{meta.idp}}-quantity">
|
||||
Quantity
|
||||
</label>
|
||||
<dd-incrementer value="{{system.supplies}}"></dd-incrementer>
|
||||
{{else}}
|
||||
Quantity
|
||||
{{system.quantity}}
|
||||
{{/if}}
|
||||
</div>
|
||||
{{/if}}
|
||||
</div>
|
||||
Loading…
Add table
Add a link
Reference in a new issue