Fix Agent Sheet v2 tab navigation positioning.

Move items to ItemV2.

More API deprecation fixes.
This commit is contained in:
Aaron Lutomski
2026-05-29 21:05:50 -07:00
parent a768a02fa3
commit a6d0cba1c1
33 changed files with 874 additions and 871 deletions
+17 -25
View File
@@ -3,7 +3,7 @@ import DG from "./config.js";
import DeltaGreenActor from "./actor/actor.js";
import DGAgentSheet from "./sheets/agent-sheet.js";
import DeltaGreenItem from "./item/item.js";
import DeltaGreenItemSheet from "./item/item-sheet.js";
import DGItemSheet from "./sheets/base-item-sheet.js";
import * as DGRolls from "./roll/roll.js";
import registerSystemSettings from "./settings.js";
import preloadHandlebarsTemplates from "./templates.js";
@@ -103,16 +103,15 @@ Hooks.once("init", async () => {
});
});
// Don't register new sheet yet.
// Actors.registerSheet(DG.ID, DGAgentSheetV2, {
// makeDefault: false,
// themes: null,
// label: `Agent Sheet V2`,
// types: ["agent"],
// });
Actors.registerSheet(DG.ID, DGAgentSheetV2, {
makeDefault: false,
themes: null,
label: "DG.Sheet.class.agentV2",
types: ["agent"],
});
// Register item sheet.
Items.registerSheet(DG.ID, DeltaGreenItemSheet, {
Items.registerSheet(DG.ID, DGItemSheet, {
makeDefault: true,
label: "DG.Sheet.class.item",
themes: null,
@@ -164,32 +163,25 @@ Hooks.on("preCreateItem", (item) => {
});
// Hook into the render call for the Actors Directory to add an extra button
Hooks.on("renderActorDirectory", (app, html, data) => {
if (!game.user.isGM) {
return;
}
Hooks.on("renderActorDirectory", (app, element) => {
if (!game.user.isGM) return;
if (html.querySelector("#statParserButton")) {
return;
}
const footer = element?.querySelector?.(".directory-footer");
if (!footer || footer.querySelector("#statParserButton")) return;
const button = document.createElement("button");
button.id = "statParserButton";
button.type = "button";
const icon = document.createElement("i");
icon.classList.add("fas", "fa-file-import");
button.appendChild(icon);
button.append("Delta Green Stat Block Parser");
html.querySelector(".directory-footer").appendChild(button);
if (button) {
button.addEventListener("click", function (event) {
ParseDeltaGreenStatBlock();
});
}
footer.appendChild(button);
button.addEventListener("click", () => {
ParseDeltaGreenStatBlock();
});
});
// Note - this event is fired on ALL connected clients...
+1 -196
View File
@@ -1,196 +1 @@
import {
DGPercentileRoll,
DGLethalityRoll,
DGDamageRoll,
DGSanityDamageRoll,
} from "../roll/roll.js";
/**
* Extend the basic ItemSheet with some very simple modifications
* @extends {ItemSheet}
*/
export default class DeltaGreenItemSheet extends foundry.appv1.sheets
.ItemSheet {
/** @override */
static get defaultOptions() {
return foundry.utils.mergeObject(super.defaultOptions, {
classes: ["deltagreen", "sheet", "item"],
width: 520,
height: 600,
tabs: [
{
navSelector: ".sheet-tabs",
contentSelector: ".sheet-body",
initial: "attributes",
},
],
});
}
/** @override */
get template() {
const path = "systems/deltagreen/templates/item";
// unique item sheet by type, like `weapon-sheet.html`.
return `${path}/item-${this.item.type}-sheet.html`;
}
/* -------------------------------------------- */
/** @override */
async getData() {
const data = super.getData();
data.enrichedDescription =
await foundry.applications.ux.TextEditor.implementation.enrichHTML(
this.object.system.description,
{ async: true },
);
if (data.item.type === "tome" || data.item.type === "ritual") {
data.enrichedHandlerNotes =
await foundry.applications.ux.TextEditor.implementation.enrichHTML(
this.object.system.handlerNotes,
{ async: true },
);
}
return data;
}
/* -------------------------------------------- */
/** @override */
setPosition(options = {}) {
const position = super.setPosition(options);
const sheetBody = this.element.find(".sheet-body");
const bodyHeight = position.height - 192;
sheetBody.css("height", bodyHeight);
return position;
}
/* -------------------------------------------- */
/** @override */
activateListeners(html) {
super.activateListeners(html);
// Everything below here is only needed if the sheet is editable
// eslint-disable-next-line no-useless-return
if (!this.options.editable) return;
// Rollable abilities - bind to everything with the 'Rollable' class
html.find(".rollable").click(this._onRoll.bind(this));
html.find(".rollable").contextmenu(this._onRoll.bind(this)); // this is for right-click, which triggers the roll modifier dialogue for most rolls
// toggle whether information is shown to a player for a tome or not
html.find(".tome-show-hide-info").click((event) => {
event.preventDefault();
this.item.system.revealed = !this.item.system.revealed;
this.item.update({ "system.revealed": this.item.system.revealed });
});
}
/**
* Handle clickable rolls.
*
* @param {Event} event The originating click event
* @async
* @private
*/
async _onRoll(event) {
event.preventDefault();
const element = event.currentTarget;
const { dataset } = element;
if (event && event.which === 2) {
// probably don't want rolls to trigger from a middle mouse click so just kill it here
return;
}
// const item = this.actor.items.get(dataset.iid);
const rollOptions = {
rollType: dataset.rolltype,
key: dataset.key,
// actor: this,
specialTrainingName: dataset?.name || null, // Only applies to Special Training Rolls
item: this.item,
};
// Create a default 1d100 roll just in case.
let roll = new Roll("1d100", {});
switch (dataset.rolltype) {
case "stat":
case "skill":
case "sanity":
case "special-training":
case "weapon":
roll = new DGPercentileRoll("1D100", {}, rollOptions);
break;
case "lethality":
roll = new DGLethalityRoll("1D100", {}, rollOptions);
break;
case "damage": {
let diceFormula = this.item.system.damage;
const { skill } = this.item.system;
if (
(this.actor.type === "agent" || this.actor.type === "npc") &&
(skill === "unarmed_combat" || skill === "melee_weapons")
) {
diceFormula +=
this.actor.system.statistics.str.meleeDamageBonusFormula;
}
roll = new DGDamageRoll(diceFormula, {}, rollOptions);
break;
}
case "sanity-damage": {
// Applies only to rituals, as far as Jalen can tell. Tomes have "study damage", but it just uses `sanity`.
const isLearntDamage = element.hasAttribute("data-san-on-learn");
const { successLoss, failedLoss } = isLearntDamage
? this.item.system.learnedSanity
: this.item.system.sanity;
const combinedFormula = `{${successLoss}, ${failedLoss}}`;
roll = new DGSanityDamageRoll(combinedFormula, {}, rollOptions);
break;
}
default:
break;
}
this.processRoll(event, roll, rollOptions);
}
/**
* Show a dialog for the roll and then send to chat.
* Broke this logic out from `_onRoll()` so that other files can call it,
* namely the macro logic.
*
* TODO: Move this logic to the roll.js.
*
* @param {Event} event The originating click event
* @param {Event} roll The roll to show a dialog for and then send to chat.
* @async
*/
async processRoll(event, roll) {
// Open dialog if user requests it (no dialog for Sanity Damage rolls)
if (
(event.shiftKey || event.which === 3) &&
!(roll instanceof DGSanityDamageRoll)
) {
const dialogData = await roll.showDialog();
if (!dialogData) return;
if (dialogData.newFormula) {
roll = new DGDamageRoll(dialogData.newFormula, {}, roll.options);
}
roll.modifier += dialogData.targetModifier;
roll.options.rollMode = dialogData.rollMode;
}
// Evaluate the roll.
await roll.evaluate();
// Send the roll to chat.
roll.toChat();
}
}
export { default } from "../sheets/base-item-sheet.js";
+9 -2
View File
@@ -83,9 +83,16 @@ export default function registerHandlebarsHelpers() {
},
);
/** Roll visibility modes for dialog selects (v14+ CONFIG.ChatMessage.modes keys). */
const ROLL_MESSAGE_MODE_KEYS = ["public", "gm", "blind", "self"];
Handlebars.registerHelper("getAvailableRollModes", () => {
try {
return CONFIG.Dice.rollModes;
return Object.fromEntries(
ROLL_MESSAGE_MODE_KEYS.filter((key) => key in CONFIG.ChatMessage.modes).map(
(key) => [key, CONFIG.ChatMessage.modes[key]],
),
);
} catch (error) {
return console.log(error);
}
@@ -93,7 +100,7 @@ export default function registerHandlebarsHelpers() {
Handlebars.registerHelper("getDefaultRollMode", () => {
try {
return game.settings.get("core", "rollMode");
return game.settings.get("core", "messageMode");
} catch (error) {
return console.log(error);
}
+120 -15
View File
@@ -32,25 +32,30 @@ export class DGRoll extends Roll {
/**
* Simple function that actually creates the message and sends it to chat.
* We override this to have a little more control over certain aspects of the message,
* right now, its `speaker` and `rollMode`.
* right now, its `speaker` and `messageMode`.
*
* @override
* The following `@param` descriptions comes from the Foundry VTT code.
* @param {object} messageData The data object to use when creating the message
* @param {options} [options] Additional options which modify the created message.
* @param {string} [options.rollMode] The template roll mode to use for the message from CONFIG.Dice.rollModes
* @param {string} [options.messageMode] A key of CONFIG.ChatMessage.modes
* @param {boolean} [options.create=true] Whether to automatically create the chat message, or only return the
* prepared chatData object.
* @returns {Promise<ChatMessage|object>} A promise which resolves to the created ChatMessage document if create is
* true, or the Object of prepared chatData otherwise.
*/
async toMessage(messageData = {}, { rollMode, create = true } = {}) {
async toMessage(messageData = {}, { messageMode, create = true } = {}) {
// eslint-disable-next-line no-param-reassign
messageData.speaker = ChatMessage.getSpeaker({ actor: this.actor });
return super.toMessage(messageData, {
rollMode: this.options.rollMode || rollMode,
create,
});
const mode =
messageMode ??
this.options.messageMode ??
this.options.rollMode;
const opts = { create };
if (mode) {
opts.messageMode = foundry.dice.Roll._mapLegacyRollMode(mode);
}
return super.toMessage(messageData, opts);
}
}
@@ -165,12 +170,12 @@ export class DGPercentileRoll extends DGRoll {
const sign = mod > 0 ? "Positive" : "Negative";
return {
action: `roll${Math.abs(mod)}${sign}`,
label: String(mod),
label: mod > 0 ? `+${mod}` : String(mod),
callback: (event, button, dialog) => {
try {
const rollMode =
const messageMode =
dialog.element.querySelector("[name='rollMode']")?.value;
resolve({ targetModifier: mod, rollMode });
resolve({ targetModifier: mod, messageMode });
} catch (ex) {
reject(console.log(ex));
}
@@ -197,7 +202,7 @@ export class DGPercentileRoll extends DGRoll {
"[name='targetModifier']",
)?.value; // this is text as a heads up
const rollMode =
const messageMode =
dialog.element.querySelector("[name='rollMode']")?.value;
const plusMinus = dialog.element.querySelector(
@@ -222,7 +227,7 @@ export class DGPercentileRoll extends DGRoll {
});
}
}
resolve({ targetModifier, rollMode });
resolve({ targetModifier, messageMode });
} catch (ex) {
reject(console.log(ex));
}
@@ -253,7 +258,7 @@ export class DGPercentileRoll extends DGRoll {
(this.type === "sanity" || this.key === "ritual") &&
!game.user.isGM
) {
this.options.rollMode = "blindroll";
this.options.messageMode = "blind";
}
const diceSoNice =
@@ -743,7 +748,7 @@ export class DGDamageRoll extends DGRoll {
const modifiedBaseRoll = dialog.element.querySelector(
"[name='originalFormula']",
)?.value; // this is text as a heads up
const rollMode = dialog.element.querySelector(
const messageMode = dialog.element.querySelector(
"[name='targetRollMode']",
)?.value;
@@ -758,7 +763,7 @@ export class DGDamageRoll extends DGRoll {
newFormula += modifiedBaseRoll + innerModifier.trim();
}
resolve({ newFormula, rollMode });
resolve({ newFormula, messageMode });
} catch (ex) {
reject(console.log(ex));
}
@@ -845,3 +850,103 @@ export class DGSanityDamageRoll extends DGRoll {
return [lowResult?.result, highResult?.result];
}
}
/**
* Build a Delta Green roll from a click target's dataset.
*
* @param {DOMStringMap} dataset
* @param {object} params
* @param {Actor|null} [params.actor]
* @param {Item|null} [params.item]
* @param {HTMLElement} [params.element]
* @param {"actor"|"item"} [params.sanityDamageSource]
* @returns {Roll}
*/
export function createDGRollFromDataset(
dataset,
{ actor = null, item = null, element = null, sanityDamageSource = "actor" } = {},
) {
const rollOptions = {
rollType: dataset.rolltype,
key: dataset.key,
actor,
specialTrainingName: dataset?.name || null,
item,
};
let roll = new Roll("1d100", {});
switch (dataset.rolltype) {
case "stat":
case "skill":
case "sanity":
case "special-training":
case "weapon":
roll = new DGPercentileRoll("1D100", {}, rollOptions);
break;
case "lethality":
roll = new DGLethalityRoll("1D100", {}, rollOptions);
break;
case "damage": {
let diceFormula = item.system.damage;
const { skill } = item.system;
if (
actor &&
(actor.type === "agent" || actor.type === "npc") &&
(skill === "unarmed_combat" || skill === "melee_weapons")
) {
diceFormula += actor.system.statistics.str.meleeDamageBonusFormula;
}
roll = new DGDamageRoll(diceFormula, {}, rollOptions);
break;
}
case "sanity-damage": {
let successLoss;
let failedLoss;
if (sanityDamageSource === "item" && item) {
const isLearntDamage = element?.hasAttribute("data-san-on-learn");
const sanityData = isLearntDamage
? item.system.learnedSanity
: item.system.sanity;
({ successLoss, failedLoss } = sanityData);
} else if (actor) {
({ successLoss, failedLoss } = actor.system.sanity);
} else {
break;
}
const combinedFormula = `{${successLoss}, ${failedLoss}}`;
roll = new DGSanityDamageRoll(combinedFormula, {}, rollOptions);
break;
}
default:
break;
}
return roll;
}
/**
* Show an optional modifier dialog, evaluate, and send a roll to chat.
*
* @param {Event|object} event
* @param {Roll} roll
* @returns {Promise<void>}
*/
export async function processDGRoll(event, roll) {
const shiftKey = event?.shiftKey ?? false;
const which = event?.which ?? 0;
if (shiftKey || which === 3) {
if (!(roll instanceof DGSanityDamageRoll)) {
const dialogData = await roll.showDialog();
if (!dialogData) return;
if (dialogData.newFormula) {
roll = new DGDamageRoll(dialogData.newFormula, {}, roll.options);
}
roll.modifier += dialogData.targetModifier;
if (dialogData.messageMode) {
roll.options.messageMode = dialogData.messageMode;
}
}
}
await roll.evaluate();
roll.toChat();
}
+2 -1
View File
@@ -1,6 +1,7 @@
/* eslint-disable max-classes-per-file */
import DG, { BASE_TEMPLATE_PATH } from "./config.js";
import DGActorSheet from "./sheets/base-actor-sheet.js";
import DGItemSheet from "./sheets/base-item-sheet.js";
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
@@ -329,7 +330,7 @@ export default function registerSystemSettings() {
default: "hover",
onChange: () => {
foundry.applications.instances.forEach((app) => {
if (app instanceof DGActorSheet) {
if (app instanceof DGActorSheet || app instanceof DGItemSheet) {
app.render();
}
});
+1 -1
View File
@@ -308,7 +308,7 @@ export default class DGAgentSheet extends DGActorSheet {
}),
content,
flavor,
rollMode: game.settings.get("core", "rollMode"),
messageMode: game.settings.get("core", "messageMode"),
};
return ChatMessage.create(chatData);
+12 -65
View File
@@ -1,9 +1,8 @@
import DG from "../config.js";
import {
DGDamageRoll,
DGLethalityRoll,
DGPercentileRoll,
DGSanityDamageRoll,
createDGRollFromDataset,
processDGRoll,
} from "../roll/roll.js";
import DGSheetMixin from "./base-sheet.js";
@@ -1221,52 +1220,14 @@ export default class DGActorSheet extends DGSheetMixin(ActorSheetV2) {
static async _onRoll(event, target) {
if (target.classList.contains("not-rollable") || event.which === 2) return;
const { dataset } = target;
const item = this.actor.items.get(dataset.iid);
const rollOptions = {
rollType: dataset.rolltype,
key: dataset.key,
const item = this.actor.items.get(target.dataset.iid);
const roll = createDGRollFromDataset(target.dataset, {
actor: this.actor,
specialTrainingName: dataset?.name || null, // Only applies to Special Training Rolls
item,
};
// Create a default 1d100 roll just in case.
let roll = new Roll("1d100", {});
switch (dataset.rolltype) {
case "stat":
case "skill":
case "sanity":
case "special-training":
case "weapon":
roll = new DGPercentileRoll("1D100", {}, rollOptions);
break;
case "lethality":
roll = new DGLethalityRoll("1D100", {}, rollOptions);
break;
case "damage": {
let diceFormula = item.system.damage;
const { skill } = item.system;
if (
(this.actor.type === "agent" || this.actor.type === "npc") &&
(skill === "unarmed_combat" || skill === "melee_weapons")
) {
diceFormula +=
this.actor.system.statistics.str.meleeDamageBonusFormula;
}
roll = new DGDamageRoll(diceFormula, {}, rollOptions);
break;
}
case "sanity-damage": {
const { successLoss, failedLoss } = this.actor.system.sanity;
const combinedFormula = `{${successLoss}, ${failedLoss}}`;
roll = new DGSanityDamageRoll(combinedFormula, {}, rollOptions);
break;
}
default:
break;
}
this.processRoll(event, roll, rollOptions);
element: target,
sanityDamageSource: "actor",
});
await this.processRoll(event, roll);
}
// This only exists to give a chance to activate the modifier dialogue if desired
@@ -1288,7 +1249,9 @@ export default class DGActorSheet extends DGSheetMixin(ActorSheetV2) {
const dialogData = await roll.showDialog();
if (!dialogData) return;
roll.modifier += dialogData.targetModifier;
roll.options.rollMode = dialogData.rollMode;
if (dialogData.messageMode) {
roll.options.messageMode = dialogData.messageMode;
}
}
// Evaluate the roll.
await roll.evaluate();
@@ -1308,23 +1271,7 @@ export default class DGActorSheet extends DGSheetMixin(ActorSheetV2) {
* @async
*/
async processRoll(event, roll) {
// Open dialog if user requests it (no dialog for Sanity Damage rolls)
if (
(event.shiftKey || event.which === 3) &&
!(roll instanceof DGSanityDamageRoll)
) {
const dialogData = await roll.showDialog();
if (!dialogData) return;
if (dialogData.newFormula) {
roll = new DGDamageRoll(dialogData.newFormula, {}, roll.options);
}
roll.modifier += dialogData.targetModifier;
roll.options.rollMode = dialogData.rollMode;
}
// Evaluate the roll.
await roll.evaluate();
// Send the roll to chat.
roll.toChat();
return processDGRoll(event, roll);
}
/** Handler for generic toggle events */
+245
View File
@@ -0,0 +1,245 @@
import { BASE_TEMPLATE_PATH } from "../config.js";
import DGSheetMixin from "./base-sheet.js";
import { createDGRollFromDataset, processDGRoll } from "../roll/roll.js";
const { ItemSheetV2 } = foundry.applications.sheets;
const ITEM_PARTS_PATH = `${BASE_TEMPLATE_PATH}/item/parts`;
/** Tab and part layout per item type. */
const ITEM_SHEET_LAYOUT = /** @type {const} */ ({
weapon: {
parts: {
header: { template: `${ITEM_PARTS_PATH}/weapon-header.html` },
description: {
template: `${ITEM_PARTS_PATH}/weapon-description.html`,
scrollable: [""],
},
},
},
gear: {
parts: {
header: { template: `${ITEM_PARTS_PATH}/gear-header.html` },
description: {
template: `${ITEM_PARTS_PATH}/gear-description.html`,
scrollable: [""],
},
},
},
armor: {
parts: {
header: { template: `${ITEM_PARTS_PATH}/armor-header.html` },
description: {
template: `${ITEM_PARTS_PATH}/armor-description.html`,
scrollable: [""],
},
},
},
bond: {
parts: {
header: { template: `${ITEM_PARTS_PATH}/bond-header.html` },
description: {
template: `${ITEM_PARTS_PATH}/bond-description.html`,
scrollable: [""],
},
},
},
motivation: {
tabs: {
initial: "attributes",
tabs: [
{
id: "attributes",
label: "DG.ItemWindow.Motivations.Attributes",
},
{
id: "description",
label: "DG.ItemWindow.Motivations.Description",
},
],
},
parts: {
tabs: { template: "templates/generic/tab-navigation.hbs" },
attributes: { template: `${ITEM_PARTS_PATH}/motivation-attributes.html` },
description: {
template: `${ITEM_PARTS_PATH}/motivation-description.html`,
scrollable: [""],
},
},
},
tome: {
tabs: {
initial: "description",
tabs: [
{ id: "description", label: "DG.ItemWindow.Tome.Description" },
{
id: "handler",
label: "DG.ItemWindow.Tome.HandlerOnlyTabHeader",
gmOnly: true,
},
],
},
parts: {
header: { template: `${ITEM_PARTS_PATH}/tome-header.html` },
tabs: { template: "templates/generic/tab-navigation.hbs" },
description: {
template: `${ITEM_PARTS_PATH}/tome-description.html`,
scrollable: [""],
},
handler: {
template: `${ITEM_PARTS_PATH}/tome-handler.html`,
scrollable: [""],
},
},
},
ritual: {
tabs: {
initial: "description",
tabs: [
{ id: "description", label: "DG.ItemWindow.Tome.Description" },
{
id: "handler",
label: "DG.ItemWindow.Tome.HandlerOnlyTabHeader",
gmOnly: true,
},
],
},
parts: {
header: { template: `${ITEM_PARTS_PATH}/ritual-header.html` },
tabs: { template: "templates/generic/tab-navigation.hbs" },
description: {
template: `${ITEM_PARTS_PATH}/ritual-description.html`,
scrollable: [""],
},
handler: {
template: `${ITEM_PARTS_PATH}/ritual-handler.html`,
scrollable: [""],
},
},
},
});
/**
* @extends {DGSheetMixin(ItemSheetV2)}
*/
export default class DGItemSheet extends DGSheetMixin(ItemSheetV2) {
/** @override */
static DEFAULT_OPTIONS = /** @type {const} */ ({
classes: ["item"],
position: { width: 520, height: 600 },
actions: {
roll: DGItemSheet._onRoll,
toggleTomeRevealed: DGItemSheet._toggleTomeRevealed,
},
});
/** @inheritdoc */
get item() {
return this.document;
}
/** @inheritdoc */
_configureRenderParts(options) {
const layout = ITEM_SHEET_LAYOUT[this.item.type];
if (!layout) return super._configureRenderParts(options);
const parts = foundry.utils.deepClone(layout.parts);
if (layout.tabs) {
const tabIds = layout.tabs.tabs
.filter((tab) => !tab.gmOnly || game.user.isGM)
.map((tab) => tab.id);
for (const partId of Object.keys(parts)) {
if (partId === "tabs" || partId === "header") continue;
if (!tabIds.includes(partId)) delete parts[partId];
}
}
Object.values(parts).forEach((p) => {
p.templates ??= [];
});
return parts;
}
/** @inheritdoc */
_getTabsConfig(group) {
const layout = ITEM_SHEET_LAYOUT[this.item.type];
if (!layout?.tabs) return super._getTabsConfig(group);
const tabs = layout.tabs.tabs.filter((tab) => !tab.gmOnly || game.user.isGM);
return { ...layout.tabs, tabs };
}
/** @inheritdoc */
async _prepareContext(options) {
const context = await super._prepareContext(options);
context.owner = this.document.isOwner;
context.enrichedDescription =
await foundry.applications.ux.TextEditor.implementation.enrichHTML(
this.item.system.description,
{ async: true },
);
if (this.item.type === "tome" || this.item.type === "ritual") {
context.enrichedHandlerNotes =
await foundry.applications.ux.TextEditor.implementation.enrichHTML(
this.item.system.handlerNotes,
{ async: true },
);
}
return context;
}
/** @inheritdoc */
async _onFirstRender(context, options) {
await super._onFirstRender(context, options);
this._setRightClickListeners();
}
/**
* Right-click on roll controls opens the modifier dialog.
* @returns {void}
*/
_setRightClickListeners() {
this.element.addEventListener("contextmenu", (event) => {
const target = event.target.closest("[data-action='roll']");
if (!target) return;
event.preventDefault();
DGItemSheet._onRoll.call(this, event, target);
});
}
/**
* @param {PointerEvent} event
* @param {HTMLElement} target
*/
static async _onRoll(event, target) {
if (event.which === 2) return;
const roll = createDGRollFromDataset(target.dataset, {
actor: this.actor,
item: this.item,
element: target,
sanityDamageSource: "item",
});
await processDGRoll(event, roll);
}
/**
* Toggle whether tome/ritual details are visible to players.
* @param {PointerEvent} event
*/
static _toggleTomeRevealed(event) {
event.preventDefault();
const revealed = !this.item.system.revealed;
this.item.update({ "system.revealed": revealed });
}
/**
* @param {Event|object} event
* @param {Roll} roll
* @returns {Promise<void>}
*/
async processRoll(event, roll) {
return processDGRoll(event, roll);
}
}
+33 -28
View File
@@ -47,14 +47,15 @@
height="24" />
<span>
<span style="display: inline;" class="item-name">{{item.name}}</span>
<span class="rollable"
data-action="roll"
data-iid="{{item._id}}"
data-rolltype="weapon"
data-key="{{item.system.skill}}"
title="{{localize 'DG.Tooltip.SkillLabel'}} ({{localizeWeaponSkill item.system.skill}})">
<i class="fas fa-dice"></i>
</span>
<button type="button"
class="rollable inline-roll"
data-action="roll"
data-iid="{{item._id}}"
data-rolltype="weapon"
data-key="{{item.system.skill}}"
title="{{localize 'DG.Tooltip.SkillLabel'}} ({{localizeWeaponSkill item.system.skill}})">
<i class="fas fa-dice" inert></i>
</button>
</span>
</div>
@@ -80,10 +81,12 @@
{{/if}}
{{#unless item.system.isLethal}}
<span class="rollable"
data-action="roll"
data-rolltype="damage"
data-iid="{{item._id}}">
<button type="button"
class="rollable inline-roll"
data-action="roll"
data-rolltype="damage"
data-iid="{{item._id}}"
title="{{localize 'DG.Gear.DamageOrLethality'}}">
{{toUpperCase item.system.damage}}
{{#if_eq item.system.skill 'unarmed_combat' }}
{{actor.system.statistics.str.meleeDamageBonusFormula}}
@@ -91,19 +94,20 @@
{{#if_eq item.system.skill 'melee_weapons' }}
{{actor.system.statistics.str.meleeDamageBonusFormula}}
{{/if_eq}}
<i class="fas fa-dice"></i>
</span>
<i class="fas fa-dice" inert></i>
</button>
{{/unless}}
{{#if item.system.isLethal }}
<span class="rollable"
data-action="roll"
data-rolltype="lethality"
data-iid="{{item._id}}"
title="{{localize 'DG.ItemWindow.Weapons.LethalityTooltip'}}">
<button type="button"
class="rollable inline-roll"
data-action="roll"
data-rolltype="lethality"
data-iid="{{item._id}}"
title="{{localize 'DG.ItemWindow.Weapons.LethalityTooltip'}}">
{{item.system.lethality}}%
<i class="fas fa-dice"></i>
</span>
<i class="fas fa-dice" inert></i>
</button>
{{/if}}
</span>
@@ -370,13 +374,14 @@
<div class="horizontal-bar-section-divider">
<span>
{{localize 'DG.Gear.Rituals'}}
<a class="rollable"
data-action="roll"
data-key="ritual"
data-rolltype="skill"
title="Ritual activation">
<i class="fa-solid fa-dice"></i>
</a>
<button type="button"
class="rollable inline-roll"
data-action="roll"
data-key="ritual"
data-rolltype="skill"
title="Ritual activation">
<i class="fa-solid fa-dice" inert></i>
</button>
</span>
</div>
-1
View File
@@ -6,7 +6,6 @@
src="{{actor.img}}"
alt="{{actor.name}}"
data-action="editImage"
data-edit="img"
height="150"
width="100" />
<div>
-50
View File
@@ -1,50 +0,0 @@
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
<header class="">
<div class="armor-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<div class="armor-sheet-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.Bonds.Name'}}:</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Armor.NamePlaceholder'}}"/></h1>
<span class="resource-label">{{localize 'DG.ItemWindow.Armor.Expense'}}:</span>
<select name="system.expense" >
<option {{#if_eq item.system.expense 'NA'}}selected{{/if_eq}} value="NA">{{localize 'DG.Gear.Expense.NA'}}</option>
<option {{#if_eq item.system.expense 'Incidental'}}selected{{/if_eq}} value="Incidental">{{localize 'DG.Gear.Expense.Incidental'}}</option>
<option {{#if_eq item.system.expense 'Standard'}}selected{{/if_eq}} value="Standard">{{localize 'DG.Gear.Expense.Standard'}}</option>
<option {{#if_eq item.system.expense 'Unusual'}}selected{{/if_eq}} value="Unusual">{{localize 'DG.Gear.Expense.Unusual'}}</option>
<option {{#if_eq item.system.expense 'Major'}}selected{{/if_eq}} value="Major">{{localize 'DG.Gear.Expense.Major'}}</option>
<option {{#if_eq item.system.expense 'Extreme'}}selected{{/if_eq}} value="Extreme">{{localize 'DG.Gear.Expense.Extreme'}}</option>
</select>
<span class="resource-label">{{localize 'DG.ItemWindow.Armor.Equipped'}}:</span>
<input class="labeled-resource-checkbox" type="checkbox" name="system.equipped" {{checked item.system.equipped}} data-dtype="Boolean" />
</div>
</div>
<div class="armor-sheet-secondary-grid-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Armor.ArmorRating'}}:</span>
<input class="item-sheet-short-input" type="text" name="system.protection" value="{{item.system.protection}}" data-dtype="Number"/>
</div>
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="description">{{localize 'DG.ItemWindow.Armor.Description'}}</a>
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{!-- Description Tab --}}
<div class="tab top-div-border" data-group="primary" data-tab="description">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
</form>
-35
View File
@@ -1,35 +0,0 @@
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
<header class="">
<div class="bond-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
<div class="bond-sheet-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.Bonds.Name'}}:</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.Bonds.Name'}}" />
<span class="resource-label">{{localize 'DG.Bonds.Score'}}:</span>
<input type="text" name="system.score" value="{{item.system.score}}" data-dtype="Number"
title="{{localize 'DG.ItemWindow.Bonds.ScoreTooltip'}}" />
<span class="resource-label">{{localize 'DG.Bonds.Relationship'}}:</span>
<input type="text" name="system.relationship" value="{{item.system.relationship}}" data-dtype="String" />
</div>
</div>
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="description">{{localize 'DG.ItemWindow.Bonds.Description'}}</a>
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{!-- Description Tab --}}
<div class="tab top-div-border" data-group="primary" data-tab="description">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
</form>
-47
View File
@@ -1,47 +0,0 @@
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
<header class="">
<div class="gear-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}"/>
<div class="gear-sheet-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.Bonds.Name'}}:</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Gear.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Gear.Expense'}}:</span>
<select name="system.expense" >
<option {{#if_eq item.system.expense 'NA'}}selected{{/if_eq}} value="NA">{{localize 'DG.Gear.Expense.NA'}}</option>
<option {{#if_eq item.system.expense 'Incidental'}}selected{{/if_eq}} value="Incidental">{{localize 'DG.Gear.Expense.Incidental'}}</option>
<option {{#if_eq item.system.expense 'Standard'}}selected{{/if_eq}} value="Standard">{{localize 'DG.Gear.Expense.Standard'}}</option>
<option {{#if_eq item.system.expense 'Unusual'}}selected{{/if_eq}} value="Unusual">{{localize 'DG.Gear.Expense.Unusual'}}</option>
<option {{#if_eq item.system.expense 'Major'}}selected{{/if_eq}} value="Major">{{localize 'DG.Gear.Expense.Major'}}</option>
<option {{#if_eq item.system.expense 'Extreme'}}selected{{/if_eq}} value="Extreme">{{localize 'DG.Gear.Expense.Extreme'}}</option>
</select>
<span class="resource-label">{{localize 'DG.ItemWindow.Gear.Equipped'}}:</span>
<input class="labeled-resource-checkbox" type="checkbox" name="system.equipped" {{checked item.system.equipped}} data-dtype="Boolean" />
</div>
</div>
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
<!-- <a class="item" data-tab="attributes">{{localize 'DG.ItemWindow.Gear.Attributes'}}</a> -->
<a class="item" data-tab="description">{{localize 'DG.ItemWindow.Gear.Description'}}</a>
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{!-- Description Tab --}}
<div class="tab top-div-border" data-group="primary" data-tab="description">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
</form>
-66
View File
@@ -1,66 +0,0 @@
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
<a class="item item-toggle" data-tab="attributes">{{localize 'DG.ItemWindow.Motivations.Attributes'}}</a>
<a class="item" data-tab="description">{{localize 'DG.ItemWindow.Motivations.Description'}}</a>
</nav>
{{!-- Sheet Body motivation-sheet-horizontal-grid-2col --}}
<section class="sheet-body">
<div class="tab attributes top-div-border"
data-group="primary"
data-tab="attributes">
<div class="motivation-sheet-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Motivations.IsDisorder'}}:</span>
<input type="checkbox"
name="system.crossedOut"
{{checked item.system.crossedOut}}
data-dtype="Boolean"
title="{{localize 'DG.ItemWindow.Motivations.IsDisorderTooltip'}}" />
<span class="resource-label">{{localize 'DG.ItemWindow.Motivations.Motivation'}}:</span>
<input type="text"
name="name"
value="{{item.name}}"
placeholder=""
data-dtype="String"
title="{{localize 'DG.ItemWindow.Motivations.MotivationNameTooltip'}}"
{{!-- If a motivation has been crossed off after a breaking point, do a strikeout on it and disable it. --}}
{{#if item.system.crossedOut }}
style="text-decoration: line-through"
disabled
{{/if }} />
{{!-- Only Show the Disorders Section if Motivation Lost Checked --}}
{{#if item.system.crossedOut }}
<span class="resource-label">{{localize 'DG.ItemWindow.Motivations.Disorder'}}:</span>
<input type="text"
name="system.disorder"
value="{{item.system.disorder}}"
data-dtype="String"
title="{{localize 'DG.ItemWindow.Motivations.DisorderNameTooltip'}}" />
<span class="resource-label">{{localize 'DG.ItemWindow.Motivations.DisorderHasBeenCured'}}:</span>
<input class="labeled-resource-checkbox"
type="checkbox"
name="system.disorderCured"
{{checked item.system.disorderCured}}
data-dtype="Boolean"
title="{{localize 'DG.ItemWindow.Motivations.DisorderHasBeenCuredTooltip'}}" />
{{/if}}
</div>
</div>
<div class="tab attributes top-div-border"
data-group="primary"
data-tab="description">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
</form>
-113
View File
@@ -1,113 +0,0 @@
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
<header class="">
<div class="gear-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}"/>
<div class="tome-sheet-horizontal-grid-2col">
{{#if item.system.revealed}}
<span class="resource-label">
{{#if (playerHasGamemasterPrivileges)}}<a class="tome-show-hide-info"><i class="far fa-eye"></i></a>{{/if}}
{{localize 'DG.Tome.Name'}}:
</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Tome.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.StudyTime'}}:</span>
<input name="system.studyTime" type="text" value="{{item.system.studyTime}}" placeholder="{{localize 'DG.ItemWindow.Tome.StudyTime'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationTime'}}:</span>
<input name="system.activationTime" type="text" value="{{item.system.activationTime}}" placeholder="{{localize 'DG.ItemWindow.Ritual.ActivationTime'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationCosts'}}:</span>
<input name="system.activationCosts" type="text" value="{{item.system.activationCosts}}" placeholder="{{localize 'DG.ItemWindow.Ritual.ActivationCosts'}}"/>
{{else}}
{{#if (playerHasGamemasterPrivileges)}}
<span class="resource-label">
{{#if (playerHasGamemasterPrivileges)}}<a class="tome-show-hide-info"><i class="far fa-eye-slash"></i></a>{{/if}}
{{localize 'DG.Tome.Name'}}:
</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Tome.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.StudyTime'}}:</span>
<input name="system.studyTime" type="text" value="{{item.system.studyTime}}" placeholder="{{localize 'DG.ItemWindow.Tome.StudyTime'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationTime'}}:</span>
<input name="system.activationTime" type="text" value="{{item.system.activationTime}}" placeholder="{{localize 'DG.ItemWindow.Ritual.ActivationTime'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationCosts'}}:</span>
<input name="system.activationCosts" type="text" value="{{item.system.activationCosts}}" placeholder="{{localize 'DG.ItemWindow.Ritual.ActivationCosts'}}"/>
{{else}}
<span class="resource-label">
{{#if (playerHasGamemasterPrivileges)}}<a class="tome-show-hide-info"><i class="far fa-eye-slash"></i></a>{{/if}}
{{localize 'DG.Tome.Name'}}:
</span>
<span>???</span>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.StudyTime'}}:</span>
<span>???</span>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationTime'}}:</span>
<span>???</span>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationCosts'}}:</span>
<span>???</span>
{{/if}}
{{/if}}
</div>
</div>
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="description">{{localize 'DG.ItemWindow.Tome.Description'}}</a>
{{#if (playerHasGamemasterPrivileges)}}
<a class="item" data-tab="handler">{{localize 'DG.ItemWindow.Tome.HandlerOnlyTabHeader'}}</a>
{{/if}}
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{!-- Description Tab --}}
<div class="tab top-div-border" data-group="primary" data-tab="description">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
{{!-- Handler Notes Tab --}}
{{#if (playerHasGamemasterPrivileges)}}
<div class="tab" data-group="primary" data-tab="handler">
<div class="tome-sheet-handler-info-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.UnnaturalIncrease'}}:</span>
<input class="item-sheet-short-input" name="system.unnaturalSkillIncrease" type="text" value="{{item.system.unnaturalSkillIncrease}}" type="integer" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.LearnedSanityDamage'}}:</span>
<span>
<input class="item-sheet-short-input" name="system.learnedSanity.successLoss" type="text" value="{{item.system.learnedSanity.successLoss}}" type="text" />
/
<input class="item-sheet-short-input" name="system.learnedSanity.failedLoss" type="text" value="{{item.system.learnedSanity.failedLoss}}" type="text" />
<i class="fas fa-dice rollable" data-rolltype="sanity-damage" data-san-on-learn></i>
</span>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationSanityDamage'}}:</span>
<span>
<input class="item-sheet-short-input" name="system.sanity.successLoss" type="text" value="{{item.system.sanity.successLoss}}" type="text" />
/
<input class="item-sheet-short-input" name="system.sanity.failedLoss" type="text" value="{{item.system.sanity.failedLoss}}" type="text" />
<i class="fas fa-dice rollable" data-rolltype="sanity-damage"></i>
</span>
</div>
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.HandlerNotes'}}:</span>
<div class="tab top-div-border">
<div class="editor-host">
{{editor enrichedHandlerNotes target="system.handlerNotes" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</div>
{{/if}}
</section>
</form>
-99
View File
@@ -1,99 +0,0 @@
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
<header class="">
<div class="gear-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}"/>
<div class="tome-sheet-horizontal-grid-2col">
{{#if item.system.revealed}}
<span class="resource-label">
{{#if (playerHasGamemasterPrivileges)}}<a class="tome-show-hide-info"><i class="far fa-eye"></i></a>{{/if}}
{{localize 'DG.Tome.Name'}}:
</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Tome.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.Tome.Language'}}:</span>
<input name="system.language" type="text" value="{{item.system.language}}" placeholder="{{localize 'DG.ItemWindow.Tome.LanguagePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.Tome.StudyTime'}}:</span>
<input name="system.studyTime" type="text" value="{{item.system.studyTime}}" placeholder="{{localize 'DG.ItemWindow.Tome.StudyTime'}}"/>
{{else}}
{{#if (playerHasGamemasterPrivileges)}}
<span class="resource-label">
{{#if (playerHasGamemasterPrivileges)}}<a class="tome-show-hide-info"><i class="far fa-eye-slash"></i></a>{{/if}}
{{localize 'DG.Tome.Name'}}:
</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Tome.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.Tome.Language'}}:</span>
<input name="system.language" type="text" value="{{item.system.language}}" placeholder="{{localize 'DG.ItemWindow.Tome.LanguagePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.Tome.StudyTime'}}:</span>
<input name="system.studyTime" type="text" value="{{item.system.studyTime}}" placeholder="{{localize 'DG.ItemWindow.Tome.StudyTime'}}"/>
{{else}}
<span class="resource-label">
{{#if (playerHasGamemasterPrivileges)}}<a class="tome-show-hide-info"><i class="far fa-eye-slash"></i></a>{{/if}}
{{localize 'DG.Tome.Name'}}:
</span>
<span>???</span>
<span class="resource-label">{{localize 'DG.Tome.Language'}}:</span>
<span>???</span>
<span class="resource-label">{{localize 'DG.Tome.StudyTime'}}:</span>
<span>???</span>
{{/if}}
{{/if}}
</div>
</div>
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="description">{{localize 'DG.ItemWindow.Tome.Description'}}</a>
{{#if (playerHasGamemasterPrivileges)}}
<a class="item" data-tab="handler">{{localize 'DG.ItemWindow.Tome.HandlerOnlyTabHeader'}}</a>
{{/if}}
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body">
{{!-- Description Tab --}}
<div class="tab top-div-border" data-group="primary" data-tab="description">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
{{!-- Handler Notes Tab --}}
{{#if (playerHasGamemasterPrivileges)}}
<div class="tab" data-group="primary" data-tab="handler">
<div class="tome-sheet-handler-info-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.UnnaturalIncrease'}}:</span>
<input class="item-sheet-short-input" name="system.unnaturalSkillIncrease" type="text" value="{{item.system.unnaturalSkillIncrease}}" type="integer" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.OccultIncrease'}}:</span>
<input class="item-sheet-short-input" name="system.occultSkillIncrease" type="text" value="{{item.system.occultSkillIncrease}}" type="integer" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.StudySanityDamage'}}:</span>
<span>
<input class="item-sheet-short-input" name="system.sanity.successLoss" type="text" value="{{item.system.sanity.successLoss}}" type="text" />
/
<input class="item-sheet-short-input" name="system.sanity.failedLoss" type="text" value="{{item.system.sanity.failedLoss}}" type="text" />
<i class="fas fa-dice rollable" data-rolltype="sanity-damage"></i>
</span>
</div>
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.HandlerNotes'}}:</span>
<div class="tab top-div-border">
<div class="editor-host">
{{editor enrichedHandlerNotes target="system.handlerNotes" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</div>
{{/if}}
</section>
</form>
-127
View File
@@ -1,127 +0,0 @@
<form class="{{cssClass}} {{getCharacterSheetStyle}}" autocomplete="off">
<header class="">
<div class="weapon-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-edit="img" title="{{item.name}}"/>
<div class="weapon-sheet-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.Bonds.Name'}}:</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Weapons.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Expense'}}:</span>
<select name="system.expense" >
<option {{#if_eq item.system.expense 'NA'}}selected{{/if_eq}} value="NA">{{localize 'DG.Gear.Expense.NA'}}</option>
<option {{#if_eq item.system.expense 'Incidental'}}selected{{/if_eq}} value="Incidental">{{localize 'DG.Gear.Expense.Incidental'}}</option>
<option {{#if_eq item.system.expense 'Standard'}}selected{{/if_eq}} value="Standard">{{localize 'DG.Gear.Expense.Standard'}}</option>
<option {{#if_eq item.system.expense 'Unusual'}}selected{{/if_eq}} value="Unusual">{{localize 'DG.Gear.Expense.Unusual'}}</option>
<option {{#if_eq item.system.expense 'Major'}}selected{{/if_eq}} value="Major">{{localize 'DG.Gear.Expense.Major'}}</option>
<option {{#if_eq item.system.expense 'Extreme'}}selected{{/if_eq}} value="Extreme">{{localize 'DG.Gear.Expense.Extreme'}}</option>
</select>
<span class="resource-label">{{localize 'DG.ItemWindow.Gear.Equipped'}}:</span>
<input class="labeled-resource-checkbox" type="checkbox" name="system.equipped" {{checked item.system.equipped}} data-dtype="Boolean" />
</div>
</div>
<div class="weapon-sheet-outer-grid-2col">
<div class="weapon-sheet-horizontal-grid-left-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Skill'}}:</span>
<select name="system.skill" >
<option {{#if_eq item.system.skill 'firearms'}}selected{{/if_eq}} value="firearms">{{localize 'DG.Skills.firearms'}}</option>
<option {{#if_eq item.system.skill 'melee_weapons'}}selected{{/if_eq}} value="melee_weapons">{{localize 'DG.Skills.melee_weapons'}}</option>
<option {{#if_eq item.system.skill 'unarmed_combat'}}selected{{/if_eq}} value="unarmed_combat">{{localize 'DG.Skills.unarmed_combat'}}</option>
<option {{#if_eq item.system.skill 'heavy_weapons'}}selected{{/if_eq}} value="heavy_weapons">{{localize 'DG.Skills.heavy_weapons'}}</option>
<option {{#if_eq item.system.skill 'athletics'}}selected{{/if_eq}} value="athletics">{{localize 'DG.Skills.athletics'}}</option>
<option {{#if_eq item.system.skill 'demolitions'}}selected{{/if_eq}} value="demolitions">{{localize 'DG.Skills.demolitions'}}</option>
<option {{#if_eq item.system.skill 'artillery'}}selected{{/if_eq}} value="artillery">{{localize 'DG.Skills.artillery'}}</option>
<option {{#if_eq item.system.skill 'str'}}selected{{/if_eq}} value="str">{{localize 'DG.Attributes.str'}}x5</option>
<option {{#if_eq item.system.skill 'con'}}selected{{/if_eq}} value="con">{{localize 'DG.Attributes.con'}}x5</option>
<option {{#if_eq item.system.skill 'dex'}}selected{{/if_eq}} value="dex">{{localize 'DG.Attributes.dex'}}x5</option>
<option {{#if_eq item.system.skill 'int'}}selected{{/if_eq}} value="int">{{localize 'DG.Attributes.int'}}x5</option>
<option {{#if_eq item.system.skill 'pow'}}selected{{/if_eq}} value="pow">{{localize 'DG.Attributes.pow'}}x5</option>
<option {{#if_eq item.system.skill 'cha'}}selected{{/if_eq}} value="cha">{{localize 'DG.Attributes.cha'}}x5</option>
<option {{#if_eq item.system.skill 'custom'}}selected{{/if_eq}} value="custom">{{localize 'DG.ItemWindow.Custom'}}</option>
</select>
</div>
<div class="weapon-sheet-horizontal-grid-right-2col">
{{#if_eq item.system.skill 'custom'}}
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.CustomSkillTarget'}}:</span>
<input type="text" name="system.customSkillTarget" value="{{../item.system.customSkillTarget}}" data-dtype="Number"/>
{{/if_eq}}
</div>
<!-- left 'column' (label and value)-->
<div class="weapon-sheet-horizontal-grid-left-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.ArmorPiercing'}}:</span>
<input type="text" name="system.armorPiercing" value="{{item.system.armorPiercing}}" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.SkillModifier'}}:</span>
<input type="text" name="system.skillModifier" value="{{item.system.skillModifier}}" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.IsLethality'}}:</span>
<input class="labeled-resource-checkbox" type="checkbox" name="system.isLethal" {{checked item.system.isLethal}} data-dtype="Boolean"
title="{{localize 'DG.ItemWindow.Weapons.IsLethalityTooltip'}}"
/>
</div>
<!-- right 'column' (label and value)-->
<div class="weapon-sheet-horizontal-grid-right-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Range'}}:</span>
<input type="text" name="system.range" value="{{item.system.range}}" data-dtype="String"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.KillRadius'}}:</span>
<input type="text" name="system.killRadius" value="{{item.system.killRadius}}" data-dtype="String"/>
{{!-- If a weapon is 'Lethal', need to show the d100% Lethality input, otherwise only show the regular Damage formula (e.g. 1D6, 1D4+2, etc...) --}}
{{#unless item.system.isLethal}}
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Damage'}}:</span>
<input type="text" name="system.damage" value="{{item.system.damage}}" data-dtype="String"/>
{{/unless}}
{{#if item.system.isLethal}}
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Lethality'}} %:</span>
<input class="" type="text" name="system.lethality" value="{{item.system.lethality}}" data-dtype="Number"
title="{{localize 'DG.ItemWindow.Weapons.LethalityTooltip'}}"
/>
{{/if}}
</div>
</div>
<div class="weapon-sheet-secondary-grid-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Ammo'}}:</span>
<input type="text" name="system.ammo" value="{{item.system.ammo}}" data-dtype="String"/>
</div>
<br>
</header>
{{!-- Sheet Tab Navigation --}}
<nav class="sheet-tabs tabs" data-group="primary">
<a class="item" data-tab="description">{{localize 'DG.ItemWindow.Weapons.Description'}}</a>
</nav>
{{!-- Sheet Body --}}
<section class="sheet-body" style="max-height: 25%;">
{{!-- Description Tab --}}
<div class="tab" data-group="primary" data-tab="description">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
</form>
@@ -0,0 +1,7 @@
<section class="sheet-body">
<div class="tab top-div-border">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
+32
View File
@@ -0,0 +1,32 @@
<header class="">
<div class="armor-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-action="editImage" title="{{item.name}}" />
<div class="armor-sheet-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.Bonds.Name'}}:</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Armor.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Armor.Expense'}}:</span>
<select name="system.expense" >
<option {{#if_eq item.system.expense 'NA'}}selected{{/if_eq}} value="NA">{{localize 'DG.Gear.Expense.NA'}}</option>
<option {{#if_eq item.system.expense 'Incidental'}}selected{{/if_eq}} value="Incidental">{{localize 'DG.Gear.Expense.Incidental'}}</option>
<option {{#if_eq item.system.expense 'Standard'}}selected{{/if_eq}} value="Standard">{{localize 'DG.Gear.Expense.Standard'}}</option>
<option {{#if_eq item.system.expense 'Unusual'}}selected{{/if_eq}} value="Unusual">{{localize 'DG.Gear.Expense.Unusual'}}</option>
<option {{#if_eq item.system.expense 'Major'}}selected{{/if_eq}} value="Major">{{localize 'DG.Gear.Expense.Major'}}</option>
<option {{#if_eq item.system.expense 'Extreme'}}selected{{/if_eq}} value="Extreme">{{localize 'DG.Gear.Expense.Extreme'}}</option>
</select>
<span class="resource-label">{{localize 'DG.ItemWindow.Armor.Equipped'}}:</span>
<input class="labeled-resource-checkbox" type="checkbox" name="system.equipped" {{checked item.system.equipped}} data-dtype="Boolean" />
</div>
</div>
<div class="armor-sheet-secondary-grid-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Armor.ArmorRating'}}:</span>
<input class="item-sheet-short-input" type="text" name="system.protection" value="{{item.system.protection}}" data-dtype="Number"/>
</div>
</header>
@@ -0,0 +1,7 @@
<section class="sheet-body">
<div class="tab top-div-border">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
+18
View File
@@ -0,0 +1,18 @@
<header class="">
<div class="bond-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-action="editImage" title="{{item.name}}" />
<div class="bond-sheet-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.Bonds.Name'}}:</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.Bonds.Name'}}" />
<span class="resource-label">{{localize 'DG.Bonds.Score'}}:</span>
<input type="text" name="system.score" value="{{item.system.score}}" data-dtype="Number"
title="{{localize 'DG.ItemWindow.Bonds.ScoreTooltip'}}" />
<span class="resource-label">{{localize 'DG.Bonds.Relationship'}}:</span>
<input type="text" name="system.relationship" value="{{item.system.relationship}}" data-dtype="String" />
</div>
</div>
</header>
@@ -0,0 +1,7 @@
<section class="sheet-body">
<div class="tab top-div-border">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
+27
View File
@@ -0,0 +1,27 @@
<header class="">
<div class="gear-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-action="editImage" title="{{item.name}}"/>
<div class="gear-sheet-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.Bonds.Name'}}:</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Gear.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Gear.Expense'}}:</span>
<select name="system.expense" >
<option {{#if_eq item.system.expense 'NA'}}selected{{/if_eq}} value="NA">{{localize 'DG.Gear.Expense.NA'}}</option>
<option {{#if_eq item.system.expense 'Incidental'}}selected{{/if_eq}} value="Incidental">{{localize 'DG.Gear.Expense.Incidental'}}</option>
<option {{#if_eq item.system.expense 'Standard'}}selected{{/if_eq}} value="Standard">{{localize 'DG.Gear.Expense.Standard'}}</option>
<option {{#if_eq item.system.expense 'Unusual'}}selected{{/if_eq}} value="Unusual">{{localize 'DG.Gear.Expense.Unusual'}}</option>
<option {{#if_eq item.system.expense 'Major'}}selected{{/if_eq}} value="Major">{{localize 'DG.Gear.Expense.Major'}}</option>
<option {{#if_eq item.system.expense 'Extreme'}}selected{{/if_eq}} value="Extreme">{{localize 'DG.Gear.Expense.Extreme'}}</option>
</select>
<span class="resource-label">{{localize 'DG.ItemWindow.Gear.Equipped'}}:</span>
<input class="labeled-resource-checkbox" type="checkbox" name="system.equipped" {{checked item.system.equipped}} data-dtype="Boolean" />
</div>
</div>
</header>
@@ -0,0 +1,42 @@
<section class="sheet-body">
<div class="tab attributes {{tabs.attributes.cssClass}} top-div-border"
data-group="primary"
data-tab="attributes">
<div class="motivation-sheet-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Motivations.IsDisorder'}}:</span>
<input type="checkbox"
name="system.crossedOut"
{{checked item.system.crossedOut}}
data-dtype="Boolean"
title="{{localize 'DG.ItemWindow.Motivations.IsDisorderTooltip'}}" />
<span class="resource-label">{{localize 'DG.ItemWindow.Motivations.Motivation'}}:</span>
<input type="text"
name="name"
value="{{item.name}}"
placeholder=""
data-dtype="String"
title="{{localize 'DG.ItemWindow.Motivations.MotivationNameTooltip'}}"
{{#if item.system.crossedOut }}
style="text-decoration: line-through"
disabled
{{/if }} />
{{#if item.system.crossedOut }}
<span class="resource-label">{{localize 'DG.ItemWindow.Motivations.Disorder'}}:</span>
<input type="text"
name="system.disorder"
value="{{item.system.disorder}}"
data-dtype="String"
title="{{localize 'DG.ItemWindow.Motivations.DisorderNameTooltip'}}" />
<span class="resource-label">{{localize 'DG.ItemWindow.Motivations.DisorderHasBeenCured'}}:</span>
<input class="labeled-resource-checkbox"
type="checkbox"
name="system.disorderCured"
{{checked item.system.disorderCured}}
data-dtype="Boolean"
title="{{localize 'DG.ItemWindow.Motivations.DisorderHasBeenCuredTooltip'}}" />
{{/if}}
</div>
</div>
@@ -0,0 +1,8 @@
<div class="tab description {{tabs.description.cssClass}} top-div-border"
data-group="primary"
data-tab="description">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
@@ -0,0 +1,9 @@
<section class="sheet-body">
<div class="tab description {{tabs.description.cssClass}} top-div-border"
data-group="primary"
data-tab="description">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
+32
View File
@@ -0,0 +1,32 @@
<div class="tab handler {{tabs.handler.cssClass}}"
data-group="primary"
data-tab="handler">
<div class="tome-sheet-handler-info-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.UnnaturalIncrease'}}:</span>
<input class="item-sheet-short-input" name="system.unnaturalSkillIncrease" type="text" value="{{item.system.unnaturalSkillIncrease}}" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.LearnedSanityDamage'}}:</span>
<span>
<input class="item-sheet-short-input" name="system.learnedSanity.successLoss" type="text" value="{{item.system.learnedSanity.successLoss}}" />
/
<input class="item-sheet-short-input" name="system.learnedSanity.failedLoss" type="text" value="{{item.system.learnedSanity.failedLoss}}" />
<i class="fas fa-dice rollable" data-action="roll" data-rolltype="sanity-damage" data-san-on-learn></i>
</span>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationSanityDamage'}}:</span>
<span>
<input class="item-sheet-short-input" name="system.sanity.successLoss" type="text" value="{{item.system.sanity.successLoss}}" />
/
<input class="item-sheet-short-input" name="system.sanity.failedLoss" type="text" value="{{item.system.sanity.failedLoss}}" />
<i class="fas fa-dice rollable" data-action="roll" data-rolltype="sanity-damage"></i>
</span>
</div>
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.HandlerNotes'}}:</span>
<div class="tab top-div-border">
<div class="editor-host">
{{editor enrichedHandlerNotes target="system.handlerNotes" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</div>
+55
View File
@@ -0,0 +1,55 @@
<header class="">
<div class="gear-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-action="editImage" title="{{item.name}}"/>
<div class="tome-sheet-horizontal-grid-2col">
{{#if item.system.revealed}}
<span class="resource-label">
{{#if (playerHasGamemasterPrivileges)}}<a data-action="toggleTomeRevealed"><i class="far fa-eye"></i></a>{{/if}}
{{localize 'DG.Tome.Name'}}:
</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Tome.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.StudyTime'}}:</span>
<input name="system.studyTime" type="text" value="{{item.system.studyTime}}" placeholder="{{localize 'DG.ItemWindow.Tome.StudyTime'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationTime'}}:</span>
<input name="system.activationTime" type="text" value="{{item.system.activationTime}}" placeholder="{{localize 'DG.ItemWindow.Ritual.ActivationTime'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationCosts'}}:</span>
<input name="system.activationCosts" type="text" value="{{item.system.activationCosts}}" placeholder="{{localize 'DG.ItemWindow.Ritual.ActivationCosts'}}"/>
{{else}}
{{#if (playerHasGamemasterPrivileges)}}
<span class="resource-label">
<a data-action="toggleTomeRevealed"><i class="far fa-eye-slash"></i></a>
{{localize 'DG.Tome.Name'}}:
</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Tome.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.StudyTime'}}:</span>
<input name="system.studyTime" type="text" value="{{item.system.studyTime}}" placeholder="{{localize 'DG.ItemWindow.Tome.StudyTime'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationTime'}}:</span>
<input name="system.activationTime" type="text" value="{{item.system.activationTime}}" placeholder="{{localize 'DG.ItemWindow.Ritual.ActivationTime'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationCosts'}}:</span>
<input name="system.activationCosts" type="text" value="{{item.system.activationCosts}}" placeholder="{{localize 'DG.ItemWindow.Ritual.ActivationCosts'}}"/>
{{else}}
<span class="resource-label">{{localize 'DG.Tome.Name'}}:</span>
<span>???</span>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.StudyTime'}}:</span>
<span>???</span>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationTime'}}:</span>
<span>???</span>
<span class="resource-label">{{localize 'DG.ItemWindow.Ritual.ActivationCosts'}}:</span>
<span>???</span>
{{/if}}
{{/if}}
</div>
</div>
</header>
@@ -0,0 +1,9 @@
<section class="sheet-body">
<div class="tab description {{tabs.description.cssClass}} top-div-border"
data-group="primary"
data-tab="description">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
+27
View File
@@ -0,0 +1,27 @@
<div class="tab handler {{tabs.handler.cssClass}}"
data-group="primary"
data-tab="handler">
<div class="tome-sheet-handler-info-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.UnnaturalIncrease'}}:</span>
<input class="item-sheet-short-input" name="system.unnaturalSkillIncrease" type="text" value="{{item.system.unnaturalSkillIncrease}}" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.OccultIncrease'}}:</span>
<input class="item-sheet-short-input" name="system.occultSkillIncrease" type="text" value="{{item.system.occultSkillIncrease}}" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.StudySanityDamage'}}:</span>
<span>
<input class="item-sheet-short-input" name="system.sanity.successLoss" type="text" value="{{item.system.sanity.successLoss}}" />
/
<input class="item-sheet-short-input" name="system.sanity.failedLoss" type="text" value="{{item.system.sanity.failedLoss}}" />
<i class="fas fa-dice rollable" data-action="roll" data-rolltype="sanity-damage"></i>
</span>
</div>
<span class="resource-label">{{localize 'DG.ItemWindow.Tome.HandlerNotes'}}:</span>
<div class="tab top-div-border">
<div class="editor-host">
{{editor enrichedHandlerNotes target="system.handlerNotes" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</div>
+46
View File
@@ -0,0 +1,46 @@
<header class="">
<div class="gear-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-action="editImage" title="{{item.name}}"/>
<div class="tome-sheet-horizontal-grid-2col">
{{#if item.system.revealed}}
<span class="resource-label">
{{#if (playerHasGamemasterPrivileges)}}<a data-action="toggleTomeRevealed"><i class="far fa-eye"></i></a>{{/if}}
{{localize 'DG.Tome.Name'}}:
</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Tome.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.Tome.Language'}}:</span>
<input name="system.language" type="text" value="{{item.system.language}}" placeholder="{{localize 'DG.ItemWindow.Tome.LanguagePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.Tome.StudyTime'}}:</span>
<input name="system.studyTime" type="text" value="{{item.system.studyTime}}" placeholder="{{localize 'DG.ItemWindow.Tome.StudyTime'}}"/>
{{else}}
{{#if (playerHasGamemasterPrivileges)}}
<span class="resource-label">
<a data-action="toggleTomeRevealed"><i class="far fa-eye-slash"></i></a>
{{localize 'DG.Tome.Name'}}:
</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Tome.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.Tome.Language'}}:</span>
<input name="system.language" type="text" value="{{item.system.language}}" placeholder="{{localize 'DG.ItemWindow.Tome.LanguagePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.Tome.StudyTime'}}:</span>
<input name="system.studyTime" type="text" value="{{item.system.studyTime}}" placeholder="{{localize 'DG.ItemWindow.Tome.StudyTime'}}"/>
{{else}}
<span class="resource-label">{{localize 'DG.Tome.Name'}}:</span>
<span>???</span>
<span class="resource-label">{{localize 'DG.Tome.Language'}}:</span>
<span>???</span>
<span class="resource-label">{{localize 'DG.Tome.StudyTime'}}:</span>
<span>???</span>
{{/if}}
{{/if}}
</div>
</div>
</header>
@@ -0,0 +1,7 @@
<section class="sheet-body">
<div class="tab top-div-border">
<div class="editor-host">
{{editor enrichedDescription target="system.description" engine="prosemirror" button=true owner=owner editable=editable}}
</div>
</div>
</section>
+101
View File
@@ -0,0 +1,101 @@
<header class="">
<div class="weapon-sheet-grid-2col">
<img class="item-img" src="{{item.img}}" data-action="editImage" title="{{item.name}}"/>
<div class="weapon-sheet-horizontal-grid-2col">
<span class="resource-label">{{localize 'DG.Bonds.Name'}}:</span>
<input name="name" type="text" value="{{item.name}}" placeholder="{{localize 'DG.ItemWindow.Weapons.NamePlaceholder'}}"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Expense'}}:</span>
<select name="system.expense" >
<option {{#if_eq item.system.expense 'NA'}}selected{{/if_eq}} value="NA">{{localize 'DG.Gear.Expense.NA'}}</option>
<option {{#if_eq item.system.expense 'Incidental'}}selected{{/if_eq}} value="Incidental">{{localize 'DG.Gear.Expense.Incidental'}}</option>
<option {{#if_eq item.system.expense 'Standard'}}selected{{/if_eq}} value="Standard">{{localize 'DG.Gear.Expense.Standard'}}</option>
<option {{#if_eq item.system.expense 'Unusual'}}selected{{/if_eq}} value="Unusual">{{localize 'DG.Gear.Expense.Unusual'}}</option>
<option {{#if_eq item.system.expense 'Major'}}selected{{/if_eq}} value="Major">{{localize 'DG.Gear.Expense.Major'}}</option>
<option {{#if_eq item.system.expense 'Extreme'}}selected{{/if_eq}} value="Extreme">{{localize 'DG.Gear.Expense.Extreme'}}</option>
</select>
<span class="resource-label">{{localize 'DG.ItemWindow.Gear.Equipped'}}:</span>
<input class="labeled-resource-checkbox" type="checkbox" name="system.equipped" {{checked item.system.equipped}} data-dtype="Boolean" />
</div>
</div>
<div class="weapon-sheet-outer-grid-2col">
<div class="weapon-sheet-horizontal-grid-left-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Skill'}}:</span>
<select name="system.skill" >
<option {{#if_eq item.system.skill 'firearms'}}selected{{/if_eq}} value="firearms">{{localize 'DG.Skills.firearms'}}</option>
<option {{#if_eq item.system.skill 'melee_weapons'}}selected{{/if_eq}} value="melee_weapons">{{localize 'DG.Skills.melee_weapons'}}</option>
<option {{#if_eq item.system.skill 'unarmed_combat'}}selected{{/if_eq}} value="unarmed_combat">{{localize 'DG.Skills.unarmed_combat'}}</option>
<option {{#if_eq item.system.skill 'heavy_weapons'}}selected{{/if_eq}} value="heavy_weapons">{{localize 'DG.Skills.heavy_weapons'}}</option>
<option {{#if_eq item.system.skill 'athletics'}}selected{{/if_eq}} value="athletics">{{localize 'DG.Skills.athletics'}}</option>
<option {{#if_eq item.system.skill 'demolitions'}}selected{{/if_eq}} value="demolitions">{{localize 'DG.Skills.demolitions'}}</option>
<option {{#if_eq item.system.skill 'artillery'}}selected{{/if_eq}} value="artillery">{{localize 'DG.Skills.artillery'}}</option>
<option {{#if_eq item.system.skill 'str'}}selected{{/if_eq}} value="str">{{localize 'DG.Attributes.str'}}x5</option>
<option {{#if_eq item.system.skill 'con'}}selected{{/if_eq}} value="con">{{localize 'DG.Attributes.con'}}x5</option>
<option {{#if_eq item.system.skill 'dex'}}selected{{/if_eq}} value="dex">{{localize 'DG.Attributes.dex'}}x5</option>
<option {{#if_eq item.system.skill 'int'}}selected{{/if_eq}} value="int">{{localize 'DG.Attributes.int'}}x5</option>
<option {{#if_eq item.system.skill 'pow'}}selected{{/if_eq}} value="pow">{{localize 'DG.Attributes.pow'}}x5</option>
<option {{#if_eq item.system.skill 'cha'}}selected{{/if_eq}} value="cha">{{localize 'DG.Attributes.cha'}}x5</option>
<option {{#if_eq item.system.skill 'custom'}}selected{{/if_eq}} value="custom">{{localize 'DG.ItemWindow.Custom'}}</option>
</select>
</div>
<div class="weapon-sheet-horizontal-grid-right-2col">
{{#if_eq item.system.skill 'custom'}}
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.CustomSkillTarget'}}:</span>
<input type="text" name="system.customSkillTarget" value="{{item.system.customSkillTarget}}" data-dtype="Number"/>
{{/if_eq}}
</div>
<div class="weapon-sheet-horizontal-grid-left-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.ArmorPiercing'}}:</span>
<input type="text" name="system.armorPiercing" value="{{item.system.armorPiercing}}" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.SkillModifier'}}:</span>
<input type="text" name="system.skillModifier" value="{{item.system.skillModifier}}" data-dtype="Number"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.IsLethality'}}:</span>
<input class="labeled-resource-checkbox" type="checkbox" name="system.isLethal" {{checked item.system.isLethal}} data-dtype="Boolean"
title="{{localize 'DG.ItemWindow.Weapons.IsLethalityTooltip'}}"
/>
</div>
<div class="weapon-sheet-horizontal-grid-right-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Range'}}:</span>
<input type="text" name="system.range" value="{{item.system.range}}" data-dtype="String"/>
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.KillRadius'}}:</span>
<input type="text" name="system.killRadius" value="{{item.system.killRadius}}" data-dtype="String"/>
{{#unless item.system.isLethal}}
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Damage'}}:</span>
<input type="text" name="system.damage" value="{{item.system.damage}}" data-dtype="String"/>
{{/unless}}
{{#if item.system.isLethal}}
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Lethality'}} %:</span>
<input class="" type="text" name="system.lethality" value="{{item.system.lethality}}" data-dtype="Number"
title="{{localize 'DG.ItemWindow.Weapons.LethalityTooltip'}}"
/>
{{/if}}
</div>
</div>
<div class="weapon-sheet-secondary-grid-2col">
<span class="resource-label">{{localize 'DG.ItemWindow.Weapons.Ammo'}}:</span>
<input type="text" name="system.ammo" value="{{item.system.ammo}}" data-dtype="String"/>
</div>
<br>
</header>