Improve Simple Worldbuilding sheet layout and macro syntax

This commit is contained in:
Andrew 2020-04-18 16:14:51 -07:00
parent 6dbee061d6
commit d405a18f53
8 changed files with 350 additions and 138 deletions

View file

@ -33,14 +33,6 @@ export class SimpleActorSheet extends ActorSheet {
activateListeners(html) {
super.activateListeners(html);
// Activate tabs
let tabs = html.find('.tabs');
let initial = this._sheetTab;
new Tabs(tabs, {
initial: initial,
callback: clicked => this._sheetTab = clicked.data("tab")
});
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return;
@ -64,6 +56,17 @@ export class SimpleActorSheet extends ActorSheet {
/* -------------------------------------------- */
/** @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;
}
/* -------------------------------------------- */
/**
* Listen for click events on an attribute control to modify the composition of attributes in the sheet
* @param {MouseEvent} event The originating left click event

35
module/actor.js Normal file
View file

@ -0,0 +1,35 @@
/**
* Extend the base Actor entity by defining a custom roll data structure which is ideal for the Simple system.
* @extends {Actor}
*/
export class SimpleActor extends Actor {
/** @override */
getRollData() {
const data = super.getRollData();
const shorthand = game.settings.get("worldbuilding", "macroShorthand");
// Re-map all attributes onto the base roll data
if ( !!shorthand ) {
for ( let [k, v] of Object.entries(data.attributes) ) {
if ( !(k in data) ) data[k] = v.value;
}
delete data.attributes;
}
// Map all items data using their slugified names
data.items = this.data.items.reduce((obj, i) => {
let key = i.name.slugify({strict: true});
let itemData = duplicate(i.data);
if ( !!shorthand ) {
for ( let [k, v] of Object.entries(itemData.attributes) ) {
if ( !(k in itemData) ) itemData[k] = v.value;
}
delete itemData["attributes"];
}
obj[key] = itemData;
return obj;
}, {});
return data;
}
}

View file

@ -29,18 +29,21 @@ export class SimpleItemSheet extends ItemSheet {
/* -------------------------------------------- */
/** @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);
// Activate tabs
let tabs = html.find('.tabs');
let initial = this._sheetTab;
new Tabs(tabs, {
initial: initial,
callback: clicked => this._sheetTab = clicked.data("tab")
});
// Everything below here is only needed if the sheet is editable
if (!this.options.editable) return;

View file

@ -5,6 +5,7 @@
*/
// Import Modules
import { SimpleActor } from "./actor.js";
import { SimpleItemSheet } from "./item-sheet.js";
import { SimpleActorSheet } from "./actor-sheet.js";
@ -24,9 +25,22 @@ Hooks.once("init", async function() {
decimals: 2
};
// Define custom Entity classes
CONFIG.Actor.entityClass = SimpleActor;
// Register sheet application classes
Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("dnd5e", SimpleActorSheet, { makeDefault: true });
Items.unregisterSheet("core", ItemSheet);
Items.registerSheet("dnd5e", SimpleItemSheet, {makeDefault: true});
// Register system settings
game.settings.register("worldbuilding", "macroShorthand", {
name: "Shortened Macro Syntax",
hint: "Enable a shortened macro syntax which allows referencing attributes directly, for example @str instead of @attributes.str.value. Disable this setting if you need the ability to reference the full attribute model, for example @attributes.str.label.",
scope: "world",
type: Boolean,
default: true,
config: true
});
});