Skip to content

Commit f704fc1

Browse files
committed
Convert ContainerSystemData and EquipmentSystemData to TypeDataModel
1 parent 6a34836 commit f704fc1

File tree

11 files changed

+403
-113
lines changed

11 files changed

+403
-113
lines changed

src/module/item/base/document.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import type { ItemOriginFlag } from "@module/chat-message/data.ts";
2121
import { ChatMessagePF2e } from "@module/chat-message/document.ts";
2222
import { preImportJSON } from "@module/doc-helpers.ts";
2323
import { MigrationList, MigrationRunner } from "@module/migration/index.ts";
24+
import { Migration901ReorganizeBulkData } from "@module/migration/migrations/901-reorganize-bulk-data.ts";
2425
import { MigrationRunnerBase } from "@module/migration/runner/base.ts";
2526
import { RuleElementOptions, RuleElementPF2e, RuleElementSource, RuleElements } from "@module/rules/index.ts";
2627
import { processGrantDeletions } from "@module/rules/rule-element/grant-item/helpers.ts";
@@ -814,6 +815,31 @@ class ItemPF2e<TParent extends ActorPF2e | null = ActorPF2e | null> extends Item
814815
return super.deleteDocuments(ids, operation);
815816
}
816817

818+
/**
819+
* Temporary migration to allow certain data models to work despite more recent migrations.
820+
* @todo complete data models and create new migration framework
821+
*/
822+
static override migrateData<T extends foundry.abstract.DataModel>(
823+
this: ConstructorOf<T>,
824+
source: ItemSourcePF2e,
825+
): T["_source"] {
826+
const itemType = String(source.type);
827+
const hasTypeDataModel = itemType in CONFIG.Item.dataModels;
828+
if (!hasTypeDataModel) return super.migrateData(source);
829+
830+
const legacyVersion = R.isPlainObject(source.system.schema)
831+
? Number(source.system.schema.version) || null
832+
: null;
833+
const version = Number(source.system._migration?.version) || legacyVersion;
834+
if (version && version < 0.901 && itemIsOfType(source, "physical")) {
835+
const migration = new Migration901ReorganizeBulkData();
836+
migration.updateItem(source);
837+
source = fu.applySpecialKeys(source);
838+
}
839+
840+
return super.migrateData(source);
841+
}
842+
817843
/* -------------------------------------------- */
818844
/* Event Handlers */
819845
/* -------------------------------------------- */

src/module/item/container/data.ts

Lines changed: 84 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,96 @@
1-
import { EquipmentTrait } from "@item/equipment/data.ts";
1+
import type { ModelPropsFromSchema } from "@common/data/fields.d.mts";
2+
import type { EquipmentTrait } from "@item/equipment/data.ts";
3+
import type { BasePhysicalItemSource, BulkData, PhysicalItemTraits } from "@item/physical/data.ts";
24
import {
3-
BasePhysicalItemSource,
4-
BulkData,
5-
Investable,
6-
PhysicalItemTraits,
7-
PhysicalSystemData,
8-
PhysicalSystemSource,
9-
} from "@item/physical/data.ts";
5+
PhysicalItemModelOmission,
6+
PhysicalItemSystemModel,
7+
PhysicalItemSystemSchema,
8+
PhysicalItemSystemSource,
9+
PhysicalItemTraitsSchema,
10+
} from "@item/physical/schema.ts";
11+
import { RarityField } from "@module/model.ts";
12+
import { LaxArrayField, SlugField } from "@system/schema-data-fields.ts";
13+
import type { ContainerPF2e } from "./document.ts";
14+
import fields = foundry.data.fields;
1015

1116
type ContainerSource = BasePhysicalItemSource<"backpack", ContainerSystemSource>;
1217

13-
type ContainerTraits = PhysicalItemTraits<EquipmentTrait>;
18+
class ContainerSystemData extends PhysicalItemSystemModel<ContainerPF2e, ContainerSystemSchema> {
19+
declare traits: PhysicalItemTraits<EquipmentTrait>;
1420

15-
interface ContainerSystemSource extends Investable<PhysicalSystemSource> {
16-
traits: ContainerTraits;
17-
stowing: boolean;
18-
bulk: ContainerBulkSource;
19-
collapsed: boolean;
20-
usage: { value: string };
21-
subitems?: never;
22-
}
21+
declare temporary: boolean;
22+
23+
declare bulk: ContainerBulkData;
24+
25+
static override defineSchema(): ContainerSystemSchema {
26+
const traits: Record<EquipmentTrait, string> = CONFIG.PF2E.equipmentTraits;
27+
28+
return {
29+
...super.defineSchema(),
30+
traits: new fields.SchemaField({
31+
otherTags: new fields.ArrayField(
32+
new SlugField({ required: true, nullable: false, initial: undefined }),
33+
),
34+
value: new LaxArrayField(
35+
new fields.StringField({
36+
required: true,
37+
nullable: false,
38+
choices: traits,
39+
initial: undefined,
40+
}),
41+
),
42+
rarity: new RarityField(),
43+
}),
44+
bulk: new fields.SchemaField({
45+
value: new fields.NumberField({ required: true, nullable: false, min: 0, initial: 0 }),
46+
heldOrStowed: new fields.NumberField({ required: true, nullable: false, min: 0, initial: 0.1 }),
47+
capacity: new fields.NumberField({ required: true, nullable: false, min: 0, initial: 10 }),
48+
ignored: new fields.NumberField({ required: true, nullable: false, min: 0, initial: 0 }),
49+
}),
50+
usage: new fields.SchemaField({
51+
value: new fields.StringField({ required: true, nullable: false, initial: "worn" }),
52+
}),
53+
collapsed: new fields.BooleanField({ required: true, nullable: false, initial: false }),
54+
stowing: new fields.BooleanField({ required: true, nullable: false, initial: false }),
55+
};
56+
}
2357

24-
interface ContainerBulkSource {
25-
value: number;
26-
heldOrStowed: number;
27-
capacity: number;
28-
ignored: number;
58+
override prepareBaseData(): void {
59+
this.temporary = false;
60+
61+
// Simple measure to avoid self-recursive containers
62+
if (this.containerId === this.parent.id) {
63+
this.containerId = null;
64+
}
65+
}
2966
}
3067

3168
interface ContainerSystemData
32-
extends Omit<ContainerSystemSource, SourceOmission>,
33-
Omit<Investable<PhysicalSystemData>, "subitems" | "traits"> {
34-
bulk: ContainerBulkData;
35-
stackGroup: null;
36-
}
69+
extends PhysicalItemSystemModel<ContainerPF2e, ContainerSystemSchema>,
70+
Omit<ModelPropsFromSchema<ContainerSystemSchema>, PhysicalItemModelOmission> {}
71+
72+
type ContainerSystemSchema = Omit<PhysicalItemSystemSchema, "traits" | "bulk"> & {
73+
traits: fields.SchemaField<PhysicalItemTraitsSchema<EquipmentTrait>>;
74+
bulk: fields.SchemaField<ContainerBulkSchema>;
75+
usage: fields.SchemaField<{
76+
value: fields.StringField<string, string, true, false>;
77+
}>;
78+
collapsed: fields.BooleanField<boolean, boolean, true, false, true>;
79+
stowing: fields.BooleanField<boolean, boolean, true, false, true>;
80+
};
3781

38-
type SourceOmission =
39-
| "apex"
40-
| "bulk"
41-
| "description"
42-
| "hp"
43-
| "identification"
44-
| "material"
45-
| "price"
46-
| "temporary"
47-
| "usage";
82+
type ContainerBulkSchema = {
83+
value: fields.NumberField<number, number, true, false, true>;
84+
heldOrStowed: fields.NumberField<number, number, true, false, true>;
85+
capacity: fields.NumberField<number, number, true, false, true>;
86+
ignored: fields.NumberField<number, number, true, false, true>;
87+
};
88+
89+
type ContainerSystemSource = PhysicalItemSystemSource<ContainerSystemSchema> & {
90+
subitems?: never;
91+
};
4892

49-
interface ContainerBulkData extends ContainerBulkSource, BulkData {}
93+
interface ContainerBulkData extends ModelPropsFromSchema<ContainerBulkSchema>, BulkData {}
5094

51-
export type { ContainerBulkData, ContainerSource, ContainerSystemData };
95+
export { ContainerSystemData };
96+
export type { ContainerBulkData, ContainerSource };

src/module/item/container/document.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import type { ActorPF2e } from "@actor";
22
import { InventoryBulk } from "@actor/inventory/index.ts";
3-
import type { EnrichmentOptions } from "@client/applications/ux/text-editor.d.mts";
43
import type { DatabaseUpdateCallbackOptions } from "@common/abstract/_module.d.mts";
54
import type { RawItemChatData } from "@item/base/data/index.ts";
65
import type { EquipmentTrait } from "@item/equipment/data.ts";
76
import { Bulk } from "@item/physical/bulk.ts";
87
import { PhysicalItemPF2e } from "@item/physical/document.ts";
8+
import type { EnrichmentOptionsPF2e } from "@system/text-editor.ts";
99
import type { ContainerSource, ContainerSystemData } from "./data.ts";
1010
import { hasExtraDimensionalParent } from "./helpers.ts";
1111

@@ -52,15 +52,6 @@ class ContainerPF2e<TParent extends ActorPF2e | null = ActorPF2e | null> extends
5252
return super.bulk.plus(this.capacity.value.minus(this.bulkIgnored));
5353
}
5454

55-
override prepareBaseData(): void {
56-
super.prepareBaseData();
57-
58-
// Simple measure to avoid self-recursive containers
59-
if (this.system.containerId === this.id) {
60-
this.system.containerId = null;
61-
}
62-
}
63-
6455
/** Reload this container's contents following Actor embedded-document preparation */
6556
override prepareSiblingData(this: ContainerPF2e<ActorPF2e>): void {
6657
super.prepareSiblingData();
@@ -85,7 +76,7 @@ class ContainerPF2e<TParent extends ActorPF2e | null = ActorPF2e | null> extends
8576

8677
override async getChatData(
8778
this: ContainerPF2e<TParent>,
88-
htmlOptions: EnrichmentOptions = {},
79+
htmlOptions: EnrichmentOptionsPF2e = {},
8980
): Promise<RawItemChatData> {
9081
return this.processChatData(htmlOptions, {
9182
...(await super.getChatData()),

src/module/item/equipment/data.ts

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,65 @@
1+
import type { ModelPropsFromSchema } from "@common/data/fields.d.mts";
12
import type { PhysicalItemSource } from "@item/base/data/index.ts";
2-
import type {
3-
BasePhysicalItemSource,
4-
Investable,
5-
PhysicalItemTraits,
6-
PhysicalSystemData,
7-
PhysicalSystemSource,
8-
} from "@item/physical/data.ts";
3+
import type { BasePhysicalItemSource, PhysicalItemTraits } from "@item/physical/data.ts";
4+
import {
5+
type PhysicalItemModelOmission,
6+
PhysicalItemSystemModel,
7+
PhysicalItemSystemSchema,
8+
PhysicalItemSystemSource,
9+
PhysicalItemTraitsSchema,
10+
} from "@item/physical/schema.ts";
11+
import { RarityField } from "@module/model.ts";
12+
import { LaxArrayField, SlugField } from "@system/schema-data-fields.ts";
13+
import type { EquipmentPF2e } from "./document.ts";
914
import type { EquipmentTrait } from "./types.ts";
15+
import fields = foundry.data.fields;
1016

1117
type EquipmentSource = BasePhysicalItemSource<"equipment", EquipmentSystemSource>;
1218

13-
interface EquipmentSystemSource extends Investable<PhysicalSystemSource> {
14-
traits: EquipmentTraits;
15-
usage: { value: string };
16-
/** Doubly-embedded adjustments, attachments, talismans etc. */
17-
subitems: PhysicalItemSource[];
18-
}
19+
class EquipmentSystemData extends PhysicalItemSystemModel<EquipmentPF2e, EquipmentSystemSchema> {
20+
declare traits: PhysicalItemTraits<EquipmentTrait>;
1921

20-
interface EquipmentTraits extends PhysicalItemTraits<EquipmentTrait> {}
22+
static override defineSchema(): EquipmentSystemSchema {
23+
const traits: Record<EquipmentTrait, string> = CONFIG.PF2E.equipmentTraits;
2124

22-
interface EquipmentSystemData
23-
extends Omit<EquipmentSystemSource, SourceOmission>,
24-
Omit<Investable<PhysicalSystemData>, "subitems" | "traits"> {
25-
stackGroup: null;
25+
return {
26+
...super.defineSchema(),
27+
traits: new fields.SchemaField({
28+
otherTags: new fields.ArrayField(
29+
new SlugField({ required: true, nullable: false, initial: undefined }),
30+
),
31+
value: new LaxArrayField(
32+
new fields.StringField({
33+
required: true,
34+
nullable: false,
35+
choices: traits,
36+
initial: undefined,
37+
}),
38+
),
39+
rarity: new RarityField(),
40+
}),
41+
usage: new fields.SchemaField({
42+
value: new fields.StringField({ required: true, nullable: false, initial: "held-in-one-hand" }),
43+
}),
44+
temporary: new fields.BooleanField({ required: true, nullable: false, initial: false }),
45+
subitems: new fields.ArrayField(new fields.ObjectField({ required: true, nullable: false })),
46+
};
47+
}
2648
}
49+
interface EquipmentSystemData
50+
extends PhysicalItemSystemModel<EquipmentPF2e, EquipmentSystemSchema>,
51+
Omit<ModelPropsFromSchema<EquipmentSystemSchema>, PhysicalItemModelOmission> {}
52+
53+
type EquipmentSystemSchema = Omit<PhysicalItemSystemSchema, "traits"> & {
54+
traits: fields.SchemaField<PhysicalItemTraitsSchema<EquipmentTrait>>;
55+
usage: fields.SchemaField<{
56+
value: fields.StringField<string, string, true, false>;
57+
}>;
58+
temporary: fields.BooleanField<boolean, boolean, true, false, true>;
59+
subitems: fields.ArrayField<fields.ObjectField<PhysicalItemSource, PhysicalItemSource, true, false>>;
60+
};
2761

28-
type SourceOmission =
29-
| "apex"
30-
| "bulk"
31-
| "description"
32-
| "hp"
33-
| "identification"
34-
| "material"
35-
| "price"
36-
| "temporary"
37-
| "usage";
62+
type EquipmentSystemSource = PhysicalItemSystemSource<EquipmentSystemSchema>;
3863

39-
export type { EquipmentSource, EquipmentSystemData, EquipmentSystemSource, EquipmentTrait };
64+
export { EquipmentSystemData };
65+
export type { EquipmentSource, EquipmentSystemSource, EquipmentTrait };

src/module/item/physical/data.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ interface PhysicalSystemData extends Omit<PhysicalSystemSource, "description">,
7070
temporary: boolean;
7171
identification: IdentificationData;
7272
usage: UsageDetails;
73-
stackGroup: string | null;
73+
stackGroup?: string | null;
7474
}
7575

7676
type Investable<TData extends PhysicalSystemData | PhysicalSystemSource> = TData & {

0 commit comments

Comments
 (0)