diff --git a/langs/en-ca.json b/langs/en-ca.json index 48afe53..a6b8a3d 100644 --- a/langs/en-ca.json +++ b/langs/en-ca.json @@ -1,5 +1,6 @@ { - "dotdungeon.CharacterSheet": "PC Sheet", + "dotdungeon.sheet.PlayerSheet": "PC Sheet", + "dotdungeon.sheet.AspectSheet": "Aspect Sheet", "dotdungeon.panel.avatar": "Avatar", "dotdungeon.panel.statistics": "Statistics", diff --git a/module/documents/AspectItem.mjs b/module/documents/AspectItem.mjs new file mode 100644 index 0000000..87d3779 --- /dev/null +++ b/module/documents/AspectItem.mjs @@ -0,0 +1,11 @@ +export class AspectItem extends Item { + prepareData() { + super.prepareData(); + }; + + prepareDerivedData() {}; + + _preparePCData() {}; + + _prepareNPCData() {}; +}; \ No newline at end of file diff --git a/module/documents/PlayerActor.js b/module/documents/PlayerActor.mjs similarity index 100% rename from module/documents/PlayerActor.js rename to module/documents/PlayerActor.mjs diff --git a/module/dotdungeon.js b/module/dotdungeon.js index eb933c7..90801d1 100644 --- a/module/dotdungeon.js +++ b/module/dotdungeon.js @@ -1,32 +1,42 @@ -// Class imports -import { PlayerActor } from "./documents/PlayerActor.js"; +// Data Models +import { AspectItemData } from "./models/AspectItemData.mjs"; +import { PlayerData } from "./models/PlayerData.mjs"; + +// Main Documents +import { PlayerActor } from "./documents/PlayerActor.mjs"; +import { AspectItem } from "./documents/AspectItem.mjs"; + +// Character Sheets +import { AspectSheet } from "./sheets/AspectSheet.mjs"; import { PlayerSheet } from "./sheets/PlayerSheet.mjs"; -import { PlayerData } from "./models/PlayerData.js"; + // Utility imports -import * as hbs from "./handlebars.js"; +import * as hbs from "./handlebars.mjs"; // Non-Setup hooks -import "./hooks/hotReload.js"; +import "./hooks/hotReload.mjs"; Hooks.once(`init`, () => { - console.log(`.dungeon | Init hook started`) + console.debug(`.dungeon | Initializing`); game.boilerplate = { PlayerActor, + AspectItem, }; - CONFIG.Actor.systemDataModels.player = PlayerData; + CONFIG.Actor.dataModels.player = PlayerData; + CONFIG.Item.dataModels.aspect = AspectItemData; Actors.unregisterSheet("core", ActorSheet); - // Actors.registerSheet("dotdungeon", CharacterSheet, { makeDefault: true, }); - Actors.registerSheet("dotdungeon.player", PlayerSheet, { makeDefault: true }); + Actors.registerSheet("dotdungeon.sheet", PlayerSheet, { makeDefault: true }); + + Items.registerSheet("dotdungeon.sheet", AspectSheet, { makeDefault: true }); hbs.registerHandlebarsHelpers(); hbs.preloadHandlebarsTemplates(); - console.info(`.dungeon | Dot Dungeon has been initialized fully`); }); Hooks.once(`ready`, () => { - console.info(".dungeon | Ready"); + console.debug(".dungeon | Ready"); }); \ No newline at end of file diff --git a/module/handlebars.js b/module/handlebars.mjs similarity index 65% rename from module/handlebars.js rename to module/handlebars.mjs index 28c0d8f..82d23d6 100644 --- a/module/handlebars.js +++ b/module/handlebars.mjs @@ -1,10 +1,11 @@ export const partials = [ - "actors/char-sheet-mvp/partials/dice_choice.hbs", - "actors/char-sheet-mvp/partials/stat.hbs", - "actors/char-sheet-mvp/partials/skill.hbs", - "actors/char-sheet-mvp/partials/panel.hbs", - "actors/char-sheet-mvp/partials/panels/skills.hbs", -] + `actors/char-sheet-mvp/partials/dice_choice.hbs`, + `actors/char-sheet-mvp/partials/stat.hbs`, + `actors/char-sheet-mvp/partials/skill.hbs`, + `actors/char-sheet-mvp/partials/panel.hbs`, + `actors/char-sheet-mvp/partials/panels/skills.hbs`, + `items/aspect.hbs`, +]; export async function registerHandlebarsHelpers() { Handlebars.registerHelper({ @@ -21,7 +22,7 @@ export async function preloadHandlebarsTemplates() { for ( const partial of partials ) { console.debug(`Loading partial: ${partial}`); const path = `${pathPrefix}${partial}`; - paths[`dotdungeon.${partial.split("/").pop().replace(".hbs", "")}`] = path; + paths[`dotdungeon.${partial.split(`/`).pop().replace(`.hbs`, ``)}`] = path; } console.debug(`Loaded ${partials.length} partials`); diff --git a/module/hooks/hotReload.js b/module/hooks/hotReload.mjs similarity index 94% rename from module/hooks/hotReload.js rename to module/hooks/hotReload.mjs index 533aae2..832686f 100644 --- a/module/hooks/hotReload.js +++ b/module/hooks/hotReload.mjs @@ -1,4 +1,4 @@ -import * as hbs from "../handlebars.js"; +import * as hbs from "../handlebars.mjs"; Hooks.on(`hotReload`, async (data) => { if (data.extension !== 'hbs') { diff --git a/module/models/AspectItemData.mjs b/module/models/AspectItemData.mjs new file mode 100644 index 0000000..4ba41bd --- /dev/null +++ b/module/models/AspectItemData.mjs @@ -0,0 +1,12 @@ +export class AspectItemData extends foundry.abstract.DataModel { + static defineSchema() { + const fields = foundry.data.fields; + return { + name: new fields.HTMLField({ nullable: true, blank: false, trim: true }), + used: new fields.BooleanField(), + /** The number of seconds that the effect of the aspect stays */ + deactivateAfter: new fields.NumberField({ nullable: true }), + info: new fields.HTMLField({ nullable: true, blank: false, trim: true }), + }; + }; +}; \ No newline at end of file diff --git a/module/models/CommonItemData.mjs b/module/models/CommonItemData.mjs new file mode 100644 index 0000000..37b7de4 --- /dev/null +++ b/module/models/CommonItemData.mjs @@ -0,0 +1,14 @@ +export class CommonItemData extends foundry.abstract.DataModel { + static defineSchema() { + const fields = foundry.data.fields; + return { + name: fields.HTMLField({ + blank: true, + trim: true, + }), + cost: fields.NumberField({ + nullable: true, + }) + }; + }; +}; \ No newline at end of file diff --git a/module/models/PlayerData.js b/module/models/PlayerData.js deleted file mode 100644 index 8e9d3f6..0000000 --- a/module/models/PlayerData.js +++ /dev/null @@ -1,57 +0,0 @@ -export class PlayerData extends foundry.abstract.DataModel { - static defineSchema() { - const fields = foundry.data.fields; - return { - stats: new fields.SchemaField({ - build: new fields.StringField({ - blank: true, - trim: true, - options(...args) { - console.log(`build args`, args); - return [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ]; - }, - }), - meta: new fields.StringField({ - blank: true, - trim: true, - options(...args) { - console.log(args); - return [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ]; - }, - }), - presence: new fields.StringField({ - blank: true, - trim: true, - options(...args) { - console.log(args); - return [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ]; - }, - }), - hands: new fields.StringField({ - blank: true, - trim: true, - options(...args) { - console.log(args); - return [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ]; - }, - }), - tilt: new fields.StringField({ - blank: true, - trim: true, - options(...args) { - console.log(args); - return [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ]; - }, - }), - rng: new fields.StringField({ - blank: true, - trim: true, - options(...args) { - console.log(args); - return [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ]; - }, - }), - }), - }; - }; -}; \ No newline at end of file diff --git a/module/models/PlayerData.mjs b/module/models/PlayerData.mjs new file mode 100644 index 0000000..c4653f8 --- /dev/null +++ b/module/models/PlayerData.mjs @@ -0,0 +1,99 @@ +function diceChoiceField() { + return new foundry.data.fields.StringField({ + blank: true, + trim: true, + options() { + return [ `d4`, `d6`, `d8`, `d10`, `d12`, `d20` ]; + }, + }); +}; + +function trainingLevelField() { + return new foundry.data.fields.StringField({ + blank: true, + trim: true, + options: [ ``, `locked`, `+2`, `+4` ], + }); +}; + +export class PlayerData extends foundry.abstract.DataModel { + static defineSchema() { + const fields = foundry.data.fields; + return { + bytes: new fields.NumberField({ + integer: true, + positive: true, + }), + stats: new fields.SchemaField({ + build: diceChoiceField(), + meta: diceChoiceField(), + presence: diceChoiceField(), + hands: diceChoiceField(), + tilt: diceChoiceField(), + rng: diceChoiceField(), + }), + skills: new fields.SchemaField({ + build: new fields.SchemaField({ + defense: trainingLevelField(), + magic: trainingLevelField(), + melee: trainingLevelField(), + platforming: trainingLevelField(), + strength: trainingLevelField(), + }), + meta: new fields.SchemaField({ + alchemy: trainingLevelField(), + arcanum: trainingLevelField(), + dreams: trainingLevelField(), + lore: trainingLevelField(), + navigation: trainingLevelField(), + }), + presence: new fields.SchemaField({ + animal_handling: trainingLevelField(), + perception: trainingLevelField(), + sneak: trainingLevelField(), + speech: trainingLevelField(), + vibe: trainingLevelField(), + }), + hands: new fields.SchemaField({ + accuracy: trainingLevelField(), + crafting: trainingLevelField(), + engineering: trainingLevelField(), + explosives: trainingLevelField(), + piloting: trainingLevelField(), + }) + }), + aspect: new fields.StringField({ + blank: true, + trim: true, + }), + roles: new fields.ArrayField(new fields.HTMLField()), + weapon: new fields.SchemaField({ + name: new fields.HTMLField(), + damage: new fields.HTMLField(), + ammo: new fields.SchemaField({ + quivers: new fields.NumberField({ min: 0, max: 5, integer: true }), + mags: new fields.NumberField({ min: 0, max: 5, integer: true }), + cells: new fields.NumberField({ min: 0, max: 5, integer: true }), + }), + }), + supplies: new fields.NumberField({ min: 0, max: 5, integer: true }), + materials: new fields.NumberField({ min: 0, max: 5, integer: true }), + pet: new fields.SchemaField({ + name: new fields.HTMLField(), + info: new fields.HTMLField(), + }), + transport: new fields.SchemaField({ + name: new fields.HTMLField(), + upkeep: new fields.NumberField({ min: 0, integer: true }), + info: new fields.HTMLField(), + }), + spells: new fields.ArrayField( + new fields.SchemaField({ + name: new fields.HTMLField(), + cost: new fields.NumberField(), + info: new fields.HTMLField(), + }) + ), + }; + }; +}; \ No newline at end of file diff --git a/module/sheets/AspectSheet.mjs b/module/sheets/AspectSheet.mjs new file mode 100644 index 0000000..85aa013 --- /dev/null +++ b/module/sheets/AspectSheet.mjs @@ -0,0 +1,28 @@ +export class AspectSheet extends ItemSheet { + static get defaultOptions() { + let opts = mergeObject( + super.defaultOptions, + { + template: `systems/dotdungeon/templates/items/aspect.hbs`, + width: 280, + height: 340, + } + ); + opts.classes.push(`dotdungeon`); + return opts; + }; + + getData() { + const ctx = super.getData(); + const item = this.item.toObject(false); + + ctx.system = item.system; + ctx.flags = item.flags; + + console.groupCollapsed(`AspectSheet.getData`); + console.log(`ctx`, ctx); + console.log(`item`, item); + console.groupEnd(); + return ctx; + }; +}; \ No newline at end of file diff --git a/module/sheets/PlayerSheet.mjs b/module/sheets/PlayerSheet.mjs index 26e01cd..ea4ee57 100644 --- a/module/sheets/PlayerSheet.mjs +++ b/module/sheets/PlayerSheet.mjs @@ -3,10 +3,10 @@ export class PlayerSheet extends ActorSheet { let opts = mergeObject( super.defaultOptions, { - template: "systems/dotdungeon/templates/actors/char-sheet-mvp/sheet.hbs" + template: `systems/dotdungeon/templates/actors/char-sheet-mvp/sheet.hbs` } ); - opts.classes.push("dotdungeon"); + opts.classes.push(`dotdungeon`); return opts; }; @@ -27,7 +27,7 @@ export class PlayerSheet extends ActorSheet { ctx.system = actor.system; ctx.flags = actor.flags; - console.group(`PlayerSheet.getData`); + console.groupCollapsed(`PlayerSheet.getData`); console.log(`ctx`, ctx); console.log(`actor`, actor); console.groupEnd(); diff --git a/template.json b/template.json index c72924f..15a893d 100644 --- a/template.json +++ b/template.json @@ -6,6 +6,7 @@ }, "Item": { "types": [ + "aspect", "weapon", "armour", "equipment", diff --git a/templates/items/aspect.hbs b/templates/items/aspect.hbs new file mode 100644 index 0000000..aba3947 --- /dev/null +++ b/templates/items/aspect.hbs @@ -0,0 +1,4 @@ +
\ No newline at end of file