Begin working on making there be per-subtype classes for class methods

This commit is contained in:
Oliver-Akins 2024-01-07 00:54:16 -07:00
parent b4dcad9eee
commit 07bebdba4d
6 changed files with 88 additions and 25 deletions

View file

@ -4,8 +4,7 @@ import { PlayerData } from "./module/models/PlayerData.mjs";
import { SyncData } from "./module/models/SyncData.mjs";
// Main Documents
import { PlayerActor } from "./module/documents/PlayerActor.mjs";
import { AspectItem } from "./module/documents/AspectItem.mjs";
import { ActorHandler } from "./module/documents/Actor/Handler.mjs";
// Character Sheets
import { AspectSheet } from "./module/sheets/AspectSheet.mjs";
@ -27,13 +26,10 @@ Hooks.once(`init`, () => {
loadSettings();
game.boilerplate = {
PlayerActor,
AspectItem,
};
CONFIG.Actor.dataModels.player = PlayerData;
CONFIG.Actor.dataModels.sync = SyncData;
CONFIG.Item.dataModels.aspect = AspectItemData;
CONFIG.Actor.documentClass = ActorHandler;
Actors.unregisterSheet("core", ActorSheet);
Actors.registerSheet("dotdungeon", PlayerSheet, {

View file

@ -0,0 +1,22 @@
import { PlayerActor } from "./Player.mjs";
export class ActorHandler extends Actor {
actorTypes = {
player: PlayerActor,
};
constructor(data, ctx) {
super(data, ctx);
};
/** @type {class|undefined} */
get fn() {
return this.actorTypes[this.type];
};
createCustomSpell() {
if (!this.fn?.createCustomSpell) return;
this.fn.createCustomSpell.bind(this)();
this.sheet.render(true);
};
};

View file

@ -0,0 +1,10 @@
export class PlayerActor {
static createCustomSpell() {
let customUUID = `Spell.Custom.${randomID()}`;
this.system.spells[customUUID] = {
name: ``,
cost: ``,
description: ``,
};
};
};

View file

@ -135,11 +135,11 @@ export class PlayerData extends foundry.abstract.DataModel {
upkeep: new fields.NumberField({ min: 0, integer: true }),
info: new fields.StringField(),
}),
spells: new fields.ArrayField(
spells: new MappingField(
new fields.SchemaField({
name: new fields.StringField(),
cost: new fields.NumberField(),
info: new fields.StringField(),
name: new fields.StringField({ initial: ``, blank: true, trim: true }),
cost: new fields.NumberField({ initial: 0, min: 0 }),
info: new fields.StringField({ initial: ``, blank: true, trim: true }),
})
),
respawns: new fields.SchemaField({

View file

@ -19,17 +19,7 @@ export class PlayerSheet extends GenericActorSheet {
if (!this.isEditable) return;
console.debug(`.dungeon | Adding event listeners for Actor: ${this.id}`);
/*
Toggles the expanded state for the detail elements in the sheet.
*/
};
#syncValue() {
let delta = 0;
for (const actor of game.actors) {
delta += actor.system.syncDelta ?? 0;
};
return 100 + delta;
html.find(`.add-spell`).on(`click`, this.actor.createCustomSpell.bind(this.actor));
};
getData() {
@ -40,7 +30,6 @@ export class PlayerSheet extends GenericActorSheet {
ctx.flags = actor.flags;
ctx.computed = {
syncTotal: this.#syncValue(),
canChangeGroup: ctx.settings.playersCanChangeGroup || ctx.isGM,
};
@ -50,6 +39,4 @@ export class PlayerSheet extends GenericActorSheet {
console.groupEnd();
return ctx;
};
};

View file

@ -1,3 +1,51 @@
{{#> dotdungeon.panel class="spells" title="dotdungeon.actor.pc.panel.spells"}}
Spells
{{#each system.spells as | spell |}}
<details {{dd-expanded ../meta.expanded @key}}>
<summary data-collapse-id="{{@key}}">
{{spell.name}} (Cost: {{spell.cost}})
</summary>
<div class="spell">
<div class="spell__name">
<label for="{{meta.idp}}-{{@key}}-name">Name</label>
<input
type="text"
id="{{meta.idp}}-{{@key}}-name"
name="system.spells.{{@key}}.name"
value="{{spell.name}}"
>
</div>
<div class="spell__cost">
<label for="{{meta.idp}}-{{@key}}-cost"></label>
<input
type="text"
id="{{meta.idp}}-{{@key}}-cost"
name="system.spells.{{@key}}.cost"
value="{{spell.cost}}"
>
</div>
<div class="spell__description">
{{spell.description}}
</div>
<div class="flex-row flex-end">
<button>
Delete
</button>
</div>
</div>
</details>
{{else}}
<p>
You have no spells yet!
</p>
<div class="debug-data">
{{dd-stringify system.spells}}
</div>
{{/each}}
<div class="flex-row">
<button
class="primary add-spell"
>
Add New Spell
</button>
</div>
{{/ dotdungeon.panel}}