Item ehnance, fixes on acto sheet

This commit is contained in:
2026-03-08 10:42:36 +01:00
parent 8f7f0169e4
commit e9abefd90d
22 changed files with 508 additions and 68 deletions

View File

@@ -9,3 +9,5 @@ export { default as OathHammerMiracleSheet } from "./sheets/miracle-sheet.mjs"
export { default as OathHammerMagicItemSheet } from "./sheets/magic-item-sheet.mjs"
export { default as OathHammerAbilitySheet } from "./sheets/ability-sheet.mjs"
export { default as OathHammerOathSheet } from "./sheets/oath-sheet.mjs"
export { default as OathHammerLineageSheet } from "./sheets/lineage-sheet.mjs"
export { default as OathHammerClassSheet } from "./sheets/class-sheet.mjs"

View File

@@ -95,6 +95,13 @@ export default class OathHammerActorSheet extends HandlebarsApplicationMixin(fou
async _onDropItem(item) {
const itemData = item.toObject()
// Lineage and class are unique: replace any existing item of the same type
if (item.type === "lineage" || item.type === "class") {
const existing = this.document.itemTypes[item.type]
if (existing.length > 0) {
await this.document.deleteEmbeddedDocuments("Item", existing.map(i => i.id))
}
}
await this.document.createEmbeddedDocuments("Item", [itemData], { renderSheet: false })
}

View File

@@ -68,6 +68,8 @@ export default class OathHammerCharacterSheet extends OathHammerActorSheet {
break
case "identity":
context.tab = context.tabs.identity
context.lineage = doc.itemTypes.lineage?.[0] ?? null
context.characterClass = doc.itemTypes["class"]?.[0] ?? null
context.abilities = doc.itemTypes.ability
context.oaths = doc.itemTypes.oath
break
@@ -124,7 +126,7 @@ export default class OathHammerCharacterSheet extends OathHammerActorSheet {
}
async _onDrop(event) {
if (!this.isEditable || !this.isEditMode) return
if (!this.isEditable) return
const data = foundry.applications.ux.TextEditor.implementation.getDragEventData(event)
if (data.type === "Item") {
const item = await fromUuid(data.uuid)

View File

@@ -0,0 +1,30 @@
import OathHammerItemSheet from "./base-item-sheet.mjs"
export default class OathHammerClassSheet extends OathHammerItemSheet {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["class"],
position: {
width: 640,
},
window: {
contentClasses: ["class-content"],
},
}
/** @override */
static PARTS = {
main: {
template: "systems/fvtt-oath-hammer/templates/item/class-sheet.hbs",
},
}
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedFeatures = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
this.document.system.features ?? "", { async: true }
)
return context
}
}

View File

@@ -0,0 +1,30 @@
import OathHammerItemSheet from "./base-item-sheet.mjs"
export default class OathHammerLineageSheet extends OathHammerItemSheet {
/** @override */
static DEFAULT_OPTIONS = {
classes: ["lineage"],
position: {
width: 640,
},
window: {
contentClasses: ["lineage-content"],
},
}
/** @override */
static PARTS = {
main: {
template: "systems/fvtt-oath-hammer/templates/item/lineage-sheet.hbs",
},
}
/** @override */
async _prepareContext() {
const context = await super._prepareContext()
context.enrichedTraits = await foundry.applications.ux.TextEditor.implementation.enrichHTML(
this.document.system.traits ?? "", { async: true }
)
return context
}
}

View File

@@ -9,3 +9,5 @@ export { default as OathHammerMiracle } from "./miracle.mjs"
export { default as OathHammerMagicItem } from "./magic-item.mjs"
export { default as OathHammerAbility } from "./ability.mjs"
export { default as OathHammerOath } from "./oath.mjs"
export { default as OathHammerLineage } from "./lineage.mjs"
export { default as OathHammerClass } from "./class.mjs"

View File

@@ -1,4 +1,3 @@
import { SYSTEM } from "../config/system.mjs"
export default class OathHammerCharacter extends foundry.abstract.TypeDataModel {
static defineSchema() {
@@ -88,8 +87,6 @@ export default class OathHammerCharacter extends foundry.abstract.TypeDataModel
})
schema.biodata = new fields.SchemaField({
lineage: new fields.StringField({ required: true, initial: "dwarf", choices: SYSTEM.LINEAGE_CHOICES }),
class: new fields.StringField({ required: true, initial: "soldier", choices: SYSTEM.CLASS_CHOICES }),
age: new fields.StringField({ required: true, nullable: false, initial: "" }),
gender: new fields.StringField({ required: true, nullable: false, initial: "" }),
height: new fields.StringField({ required: true, nullable: false, initial: "" }),

21
module/models/class.mjs Normal file
View File

@@ -0,0 +1,21 @@
export default class OathHammerClass extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const schema = {}
schema.description = new fields.HTMLField({ required: true, textSearch: true })
// Class features, starting abilities, advancement options (rich text)
schema.features = new fields.HTMLField({ required: true, textSearch: true })
// Armor proficiencies (e.g. "Light, Medium, Heavy")
schema.armorProficiency = new fields.StringField({ required: true, nullable: false, initial: "" })
// Weapon proficiencies (e.g. "Common, Dueling, Heavy, Throwing")
schema.weaponProficiency = new fields.StringField({ required: true, nullable: false, initial: "" })
return schema
}
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Class"]
}

21
module/models/lineage.mjs Normal file
View File

@@ -0,0 +1,21 @@
export default class OathHammerLineage extends foundry.abstract.TypeDataModel {
static defineSchema() {
const fields = foundry.data.fields
const schema = {}
schema.description = new fields.HTMLField({ required: true, textSearch: true })
// Racial traits and special abilities (rich text)
schema.traits = new fields.HTMLField({ required: true, textSearch: true })
// Base movement speed in feet
schema.movement = new fields.NumberField({ required: true, nullable: false, integer: true, initial: 30, min: 0 })
// Modifier to max Grit Points (e.g. -1 for High Elf, Wood Elf)
schema.gritModifier = new fields.NumberField({ required: true, nullable: false, integer: true, initial: 0 })
return schema
}
static LOCALIZATION_PREFIXES = ["OATHHAMMER.Lineage"]
}