Begin working on making there be per-subtype classes for class methods
This commit is contained in:
parent
b4dcad9eee
commit
07bebdba4d
6 changed files with 88 additions and 25 deletions
|
|
@ -4,8 +4,7 @@ import { PlayerData } from "./module/models/PlayerData.mjs";
|
||||||
import { SyncData } from "./module/models/SyncData.mjs";
|
import { SyncData } from "./module/models/SyncData.mjs";
|
||||||
|
|
||||||
// Main Documents
|
// Main Documents
|
||||||
import { PlayerActor } from "./module/documents/PlayerActor.mjs";
|
import { ActorHandler } from "./module/documents/Actor/Handler.mjs";
|
||||||
import { AspectItem } from "./module/documents/AspectItem.mjs";
|
|
||||||
|
|
||||||
// Character Sheets
|
// Character Sheets
|
||||||
import { AspectSheet } from "./module/sheets/AspectSheet.mjs";
|
import { AspectSheet } from "./module/sheets/AspectSheet.mjs";
|
||||||
|
|
@ -27,13 +26,10 @@ Hooks.once(`init`, () => {
|
||||||
|
|
||||||
loadSettings();
|
loadSettings();
|
||||||
|
|
||||||
game.boilerplate = {
|
|
||||||
PlayerActor,
|
|
||||||
AspectItem,
|
|
||||||
};
|
|
||||||
CONFIG.Actor.dataModels.player = PlayerData;
|
CONFIG.Actor.dataModels.player = PlayerData;
|
||||||
CONFIG.Actor.dataModels.sync = SyncData;
|
CONFIG.Actor.dataModels.sync = SyncData;
|
||||||
CONFIG.Item.dataModels.aspect = AspectItemData;
|
CONFIG.Item.dataModels.aspect = AspectItemData;
|
||||||
|
CONFIG.Actor.documentClass = ActorHandler;
|
||||||
|
|
||||||
Actors.unregisterSheet("core", ActorSheet);
|
Actors.unregisterSheet("core", ActorSheet);
|
||||||
Actors.registerSheet("dotdungeon", PlayerSheet, {
|
Actors.registerSheet("dotdungeon", PlayerSheet, {
|
||||||
|
|
|
||||||
22
module/documents/Actor/Handler.mjs
Normal file
22
module/documents/Actor/Handler.mjs
Normal 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);
|
||||||
|
};
|
||||||
|
};
|
||||||
10
module/documents/Actor/Player.mjs
Normal file
10
module/documents/Actor/Player.mjs
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
export class PlayerActor {
|
||||||
|
static createCustomSpell() {
|
||||||
|
let customUUID = `Spell.Custom.${randomID()}`;
|
||||||
|
this.system.spells[customUUID] = {
|
||||||
|
name: ``,
|
||||||
|
cost: ``,
|
||||||
|
description: ``,
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
@ -135,11 +135,11 @@ export class PlayerData extends foundry.abstract.DataModel {
|
||||||
upkeep: new fields.NumberField({ min: 0, integer: true }),
|
upkeep: new fields.NumberField({ min: 0, integer: true }),
|
||||||
info: new fields.StringField(),
|
info: new fields.StringField(),
|
||||||
}),
|
}),
|
||||||
spells: new fields.ArrayField(
|
spells: new MappingField(
|
||||||
new fields.SchemaField({
|
new fields.SchemaField({
|
||||||
name: new fields.StringField(),
|
name: new fields.StringField({ initial: ``, blank: true, trim: true }),
|
||||||
cost: new fields.NumberField(),
|
cost: new fields.NumberField({ initial: 0, min: 0 }),
|
||||||
info: new fields.StringField(),
|
info: new fields.StringField({ initial: ``, blank: true, trim: true }),
|
||||||
})
|
})
|
||||||
),
|
),
|
||||||
respawns: new fields.SchemaField({
|
respawns: new fields.SchemaField({
|
||||||
|
|
|
||||||
|
|
@ -19,17 +19,7 @@ export class PlayerSheet extends GenericActorSheet {
|
||||||
if (!this.isEditable) return;
|
if (!this.isEditable) return;
|
||||||
console.debug(`.dungeon | Adding event listeners for Actor: ${this.id}`);
|
console.debug(`.dungeon | Adding event listeners for Actor: ${this.id}`);
|
||||||
|
|
||||||
/*
|
html.find(`.add-spell`).on(`click`, this.actor.createCustomSpell.bind(this.actor));
|
||||||
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;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
getData() {
|
getData() {
|
||||||
|
|
@ -40,7 +30,6 @@ export class PlayerSheet extends GenericActorSheet {
|
||||||
ctx.flags = actor.flags;
|
ctx.flags = actor.flags;
|
||||||
|
|
||||||
ctx.computed = {
|
ctx.computed = {
|
||||||
syncTotal: this.#syncValue(),
|
|
||||||
canChangeGroup: ctx.settings.playersCanChangeGroup || ctx.isGM,
|
canChangeGroup: ctx.settings.playersCanChangeGroup || ctx.isGM,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -50,6 +39,4 @@ export class PlayerSheet extends GenericActorSheet {
|
||||||
console.groupEnd();
|
console.groupEnd();
|
||||||
return ctx;
|
return ctx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
@ -1,3 +1,51 @@
|
||||||
{{#> dotdungeon.panel class="spells" title="dotdungeon.actor.pc.panel.spells"}}
|
{{#> 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}}
|
{{/ dotdungeon.panel}}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue