diff --git a/.gitignore b/.gitignore index 8e5ea01..ac39572 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ deltagreen.lock # Ignore npm modules node_modules + +# Ignore Foundry VTT Reference Files +reference/ \ No newline at end of file diff --git a/module/data/item/armor.js b/module/data/item/armor.js new file mode 100644 index 0000000..58e47ef --- /dev/null +++ b/module/data/item/armor.js @@ -0,0 +1,14 @@ +import defineBaseItemSystemFields from "./base-fields.js"; + +const { NumberField, StringField, BooleanField } = foundry.data.fields; + +export default class ArmorItemData extends foundry.abstract.TypeDataModel { + static defineSchema() { + return { + ...defineBaseItemSystemFields(), + protection: new NumberField({ initial: 3, integer: true }), + equipped: new BooleanField({ initial: true }), + expense: new StringField({ initial: "Standard" }), + }; + } +} diff --git a/module/data/item/base-fields.js b/module/data/item/base-fields.js new file mode 100644 index 0000000..d8fba49 --- /dev/null +++ b/module/data/item/base-fields.js @@ -0,0 +1,11 @@ +const { StringField } = foundry.data.fields; + +/** + * Shared system fields for all Delta Green item types (from legacy template base). + * Item display name lives on the document (`Item#name`), not in system. + */ +export default function defineBaseItemSystemFields() { + return { + description: new StringField({ initial: "" }), + }; +} diff --git a/module/data/item/bond.js b/module/data/item/bond.js new file mode 100644 index 0000000..16574dc --- /dev/null +++ b/module/data/item/bond.js @@ -0,0 +1,14 @@ +import defineBaseItemSystemFields from "./base-fields.js"; + +const { NumberField, StringField, BooleanField } = foundry.data.fields; + +export default class BondItemData extends foundry.abstract.TypeDataModel { + static defineSchema() { + return { + ...defineBaseItemSystemFields(), + score: new NumberField({ initial: 10, integer: true }), + relationship: new StringField({ initial: "?" }), + hasBeenDamagedSinceLastHomeScene: new BooleanField({ initial: false }), + }; + } +} diff --git a/module/data/item/gear.js b/module/data/item/gear.js new file mode 100644 index 0000000..8d54208 --- /dev/null +++ b/module/data/item/gear.js @@ -0,0 +1,13 @@ +import defineBaseItemSystemFields from "./base-fields.js"; + +const { StringField, BooleanField } = foundry.data.fields; + +export default class GearItemData extends foundry.abstract.TypeDataModel { + static defineSchema() { + return { + ...defineBaseItemSystemFields(), + equipped: new BooleanField({ initial: true }), + expense: new StringField({ initial: "Standard" }), + }; + } +} diff --git a/module/data/item/motivation.js b/module/data/item/motivation.js new file mode 100644 index 0000000..5d0831f --- /dev/null +++ b/module/data/item/motivation.js @@ -0,0 +1,14 @@ +import defineBaseItemSystemFields from "./base-fields.js"; + +const { StringField, BooleanField } = foundry.data.fields; + +export default class MotivationItemData extends foundry.abstract.TypeDataModel { + static defineSchema() { + return { + ...defineBaseItemSystemFields(), + disorder: new StringField({ initial: "" }), + crossedOut: new BooleanField({ initial: false }), + disorderCured: new BooleanField({ initial: false }), + }; + } +} diff --git a/module/data/item/ritual.js b/module/data/item/ritual.js new file mode 100644 index 0000000..30e8611 --- /dev/null +++ b/module/data/item/ritual.js @@ -0,0 +1,29 @@ +import defineBaseItemSystemFields from "./base-fields.js"; + +const { NumberField, StringField, BooleanField, SchemaField } = + foundry.data.fields; + +export default class RitualItemData extends foundry.abstract.TypeDataModel { + static defineSchema() { + return { + ...defineBaseItemSystemFields(), + studyTime: new StringField({ initial: "" }), + sanity: new SchemaField({ + notes: new StringField({ initial: "" }), + failedLoss: new StringField({ initial: "1D10" }), + successLoss: new StringField({ initial: "0" }), + }), + learnedSanity: new SchemaField({ + notes: new StringField({ initial: "" }), + failedLoss: new StringField({ initial: "1D10" }), + successLoss: new StringField({ initial: "0" }), + }), + unnaturalSkillIncrease: new NumberField({ initial: 1, integer: true }), + activationCosts: new StringField({ initial: "" }), + activationTime: new StringField({ initial: "" }), + complexity: new StringField({ initial: "Simple" }), + handlerNotes: new StringField({ initial: "" }), + revealed: new BooleanField({ initial: false }), + }; + } +} diff --git a/module/data/item/tome.js b/module/data/item/tome.js new file mode 100644 index 0000000..28a27af --- /dev/null +++ b/module/data/item/tome.js @@ -0,0 +1,23 @@ +import defineBaseItemSystemFields from "./base-fields.js"; + +const { NumberField, StringField, BooleanField, SchemaField } = + foundry.data.fields; + +export default class TomeItemData extends foundry.abstract.TypeDataModel { + static defineSchema() { + return { + ...defineBaseItemSystemFields(), + language: new StringField({ initial: "" }), + studyTime: new StringField({ initial: "" }), + unnaturalSkillIncrease: new NumberField({ initial: 5, integer: true }), + occultSkillIncrease: new NumberField({ initial: 3, integer: true }), + sanity: new SchemaField({ + notes: new StringField({ initial: "" }), + failedLoss: new StringField({ initial: "1D6" }), + successLoss: new StringField({ initial: "1D4" }), + }), + handlerNotes: new StringField({ initial: "" }), + revealed: new BooleanField({ initial: false }), + }; + } +} diff --git a/module/data/item/weapon.js b/module/data/item/weapon.js new file mode 100644 index 0000000..11777a2 --- /dev/null +++ b/module/data/item/weapon.js @@ -0,0 +1,23 @@ +import defineBaseItemSystemFields from "./base-fields.js"; + +const { NumberField, StringField, BooleanField } = foundry.data.fields; + +export default class WeaponItemData extends foundry.abstract.TypeDataModel { + static defineSchema() { + return { + ...defineBaseItemSystemFields(), + skill: new StringField({ initial: "" }), + skillModifier: new NumberField({ initial: 0, integer: true }), + customSkillTarget: new NumberField({ initial: 50, integer: true }), + range: new StringField({ initial: "10M" }), + damage: new StringField({ initial: "1D8" }), + armorPiercing: new NumberField({ initial: 0, integer: true }), + lethality: new NumberField({ initial: 0, integer: true }), + isLethal: new BooleanField({ initial: false }), + killRadius: new StringField({ initial: "N/A" }), + ammo: new StringField({ initial: "" }), + expense: new StringField({ initial: "Standard" }), + equipped: new BooleanField({ initial: true }), + }; + } +} diff --git a/module/deltagreen.js b/module/deltagreen.js index 63f12f7..5f7aad5 100644 --- a/module/deltagreen.js +++ b/module/deltagreen.js @@ -25,18 +25,35 @@ import AgentData from "./data/actor/agent.js"; import UnnaturalData from "./data/actor/unnatural.js"; import NPCData from "./data/actor/npc.js"; import VehicleData from "./data/actor/vehicle.js"; +import WeaponItemData from "./data/item/weapon.js"; +import ArmorItemData from "./data/item/armor.js"; +import MotivationItemData from "./data/item/motivation.js"; +import BondItemData from "./data/item/bond.js"; +import GearItemData from "./data/item/gear.js"; +import TomeItemData from "./data/item/tome.js"; +import RitualItemData from "./data/item/ritual.js"; const { Actors, Items } = foundry.documents.collections; Hooks.once("init", async () => { Object.assign(CONFIG.Actor.dataModels, { - // The keys are the types defined in our template.json + // The keys are the types defined in system.json documentTypes.Actor agent: AgentData, unnatural: UnnaturalData, npc: NPCData, vehicle: VehicleData, }); + Object.assign(CONFIG.Item.dataModels, { + weapon: WeaponItemData, + armor: ArmorItemData, + motivation: MotivationItemData, + bond: BondItemData, + gear: GearItemData, + tome: TomeItemData, + ritual: RitualItemData, + }); + game.deltagreen = { DeltaGreenActor, DeltaGreenItem, diff --git a/system.json b/system.json index c27a854..1f7f15e 100644 --- a/system.json +++ b/system.json @@ -18,8 +18,8 @@ "version": "dev", "compatibility": { "minimum": "13", - "verified": "13", - "maximum": "13" + "verified": "14", + "maximum": "14" }, "flags": { "hotReload": { @@ -207,6 +207,15 @@ "unnatural": {}, "npc": {}, "vehicle": {} + }, + "Item": { + "weapon": {}, + "armor": {}, + "motivation": {}, + "bond": {}, + "gear": {}, + "tome": {}, + "ritual": {} } } } diff --git a/template.json b/template.json index 68dc905..0967ef4 100644 --- a/template.json +++ b/template.json @@ -1,91 +1 @@ -{ - "Item": { - "types": [ - "weapon", - "armor", - "motivation", - "bond", - "gear", - "tome", - "ritual" - ], - "templates": { - "base": { - "name": "", - "description": "" - } - }, - "weapon": { - "templates": ["base"], - "skill": "", - "skillModifier": 0, - "customSkillTarget": 50, - "range": "10M", - "damage": "1D8", - "armorPiercing": 0, - "lethality": 0, - "isLethal": false, - "killRadius": "N/A", - "ammo": "", - "expense": "Standard", - "equipped": true - }, - "armor": { - "templates": ["base"], - "protection": 3, - "equipped": true, - "expense": "Standard" - }, - "motivation": { - "templates": ["base"], - "disorder": "", - "crossedOut": false, - "disorderCured": false - }, - "bond": { - "templates": ["base"], - "score": 10, - "relationship": "?", - "hasBeenDamagedSinceLastHomeScene": false - }, - "gear": { - "templates": ["base"], - "equipped": true, - "expense": "Standard" - }, - "tome": { - "templates": ["base"], - "language": "", - "studyTime": "", - "unnaturalSkillIncrease": 5, - "occultSkillIncrease": 3, - "sanity": { - "notes": "", - "failedLoss": "1D6", - "successLoss": "1D4" - }, - "handlerNotes": "", - "revealed": false - }, - "ritual": { - "templates": ["base"], - "studyTime": "", - "sanity": { - "notes": "", - "failedLoss": "1D10", - "successLoss": "0" - }, - "learnedSanity": { - "notes": "", - "failedLoss": "1D10", - "successLoss": "0" - }, - "unnaturalSkillIncrease": 1, - "activationCosts": "", - "activationTime": "", - "complexity": "Simple", - "handlerNotes": "", - "revealed": false - } - } -} +{}