diff --git a/css/fvtt-oath-hammer.css b/css/fvtt-oath-hammer.css index 8d5b2b1..45a20fd 100644 --- a/css/fvtt-oath-hammer.css +++ b/css/fvtt-oath-hammer.css @@ -703,6 +703,19 @@ text-overflow: ellipsis; white-space: nowrap; } +.oathhammer .item-entry .item-group { + font-size: calc(0.86rem * 0.9); + color: #535128; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.oathhammer .item-entry .item-magic { + text-align: center; + font-size: calc(0.86rem * 0.9); + color: #8e44ad; +} .oathhammer .item-entry .item-type { font-size: calc(0.86rem * 0.9); color: #084a74; @@ -741,11 +754,11 @@ } .oathhammer .item-list--weapon .item-list-header, .oathhammer .item-list--weapon .item-entry { - grid-template-columns: 24px 1fr 5.5rem 3rem 1.8rem 3.5rem; + grid-template-columns: 24px 1fr 4.5rem 3.5rem 2rem 1.5rem 1.8rem 3.5rem; } .oathhammer .item-list--armor .item-list-header, .oathhammer .item-list--armor .item-entry { - grid-template-columns: 24px 1fr 3.5rem 5rem 1.8rem 3.5rem; + grid-template-columns: 24px 1fr 3.5rem 2.5rem 3.5rem 1.5rem 1.8rem 3.5rem; } .oathhammer .item-list--ammo .item-list-header, .oathhammer .item-list--ammo .item-entry { @@ -771,13 +784,37 @@ .oathhammer .item-list--condition .item-entry { grid-template-columns: 24px 1fr 5.5rem 3.5rem; } -.oathhammer .item-list--ability .item-list-header, -.oathhammer .item-list--ability .item-entry { - grid-template-columns: 24px 1fr 6rem 3.5rem; +.oathhammer .item-list--trait .item-list-header, +.oathhammer .item-list--trait .item-entry { + grid-template-columns: 24px 1fr 6rem 6rem 3.5rem; } .oathhammer .item-list--oath .item-list-header, .oathhammer .item-list--oath .item-entry { - grid-template-columns: 24px 1fr 5.5rem 3.5rem; + grid-template-columns: 24px 1fr 7rem 3.5rem 3.5rem; +} +.oathhammer .item-usage { + font-size: calc(0.86rem * 0.9); + color: #535128; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.oathhammer .item-violated { + text-align: center; + font-size: calc(0.86rem * 0.85); +} +.oathhammer .item-violated i.fa-circle-xmark { + color: #c0392b; +} +.oathhammer .item-violated i.fa-circle-check { + color: #27ae60; +} +.oathhammer .oath--violated { + background-color: rgba(192, 57, 43, 0.08); +} +.oathhammer .oath--violated .item-name { + color: #c0392b; } .oathhammer .no-items { color: var(--color-dark-5); diff --git a/lang/en.json b/lang/en.json index 1711313..f18ed6f 100644 --- a/lang/en.json +++ b/lang/en.json @@ -10,11 +10,12 @@ "Spell": "Oath Hammer Spell Sheet", "Miracle": "Oath Hammer Miracle Sheet", "MagicItem": "Oath Hammer Magic Item Sheet", - "Ability": "Oath Hammer Ability Sheet", + "Trait": "Oath Hammer Trait Sheet", "Oath": "Oath Hammer Oath Sheet", "Condition": "Oath Hammer Condition Sheet", "Lineage": "Oath Hammer Lineage Sheet", - "Class": "Oath Hammer Class Sheet" + "Class": "Oath Hammer Class Sheet", + "Building": "Oath Hammer Building Sheet" }, "Tab": { "Identity": "Identity", @@ -116,6 +117,22 @@ "Runic": "Runic", "Stygian": "Stygian" }, + "BuildingSkill": { + "Carpentry": "Carpentry", + "Masonry": "Masonry" + }, + "Building": { + "FIELDS": { + "skillCheck": { "label": "Skill Check" }, + "cost": { "label": "Cost (gp)" }, + "buildTime": { "label": "Build Time" }, + "taxRevenue": { "label": "Tax Revenue / month" }, + "constructed":{ "label": "Constructed" }, + "settlement": { "label": "Settlement" }, + "description":{ "label": "Description" }, + "notes": { "label": "Notes" } + } + }, "ArmorType": { "Light": "Light", "Medium": "Medium", @@ -157,9 +174,9 @@ "VeryRare": "4 – Very Rare", "Legendary": "5 – Legendary" }, - "AbilityType": { - "ClassAbility": "Class Ability", - "LineageTrait": "Lineage Trait" + "TraitType": { + "SpecialTrait": "Special Trait", + "ClassTrait": "Class Trait" }, "Condition": { "Blinded": "Blinded", @@ -212,7 +229,7 @@ "Level": "Level", "XP": "Current XP", "TotalXP": "Total XP", - "Abilities": "Abilities & Traits", + "Traits": "Special Traits", "Oaths": "Oaths", "Weapons": "Weapons", "Armor": "Armor & Shields", @@ -253,6 +270,10 @@ "Features": "Features", "Name": "Name", "Type": "Type", + "Usage": "Usage", + "Violated": "Violated", + "Group": "Group", + "Magic": "Magic", "Damage": "Damage", "Tradition": "Tradition", "Piety": "Piety", @@ -271,7 +292,8 @@ "Weapon": "New Weapon", "Spell": "New Spell", "Miracle": "New Miracle", - "Equipment": "New Equipment" + "Equipment": "New Equipment", + "Building": "New Building" }, "ToggleSheet": "Toggle Edit/Play Mode", "Character": { @@ -638,9 +660,9 @@ } } }, - "Ability": { + "Trait": { "FIELDS": { - "abilityType": { + "traitType": { "label": "Type" }, "source": { @@ -775,7 +797,7 @@ "miracle": "Miracle", "magic_item": "Magic Item", "magic-item": "Magic Item", - "ability": "Ability", + "trait": "Trait", "oath": "Oath", "lineage": "Lineage", "class": "Class" diff --git a/less/item-list.less b/less/item-list.less index ccd37b5..762c706 100644 --- a/less/item-list.less +++ b/less/item-list.less @@ -63,6 +63,21 @@ white-space: nowrap; } + .item-group { + font-size: @font-size-xs; + color: @color-olive; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .item-magic { + text-align: center; + font-size: @font-size-xs; + color: #8e44ad; + } + .item-type { font-size: @font-size-xs; color: @color-blue; @@ -102,13 +117,13 @@ .item-list--weapon { .item-list-header, .item-entry { - grid-template-columns: @item-img-size 1fr 5.5rem 3rem 1.8rem 3.5rem; + grid-template-columns: @item-img-size 1fr 4.5rem 3.5rem 2rem 1.5rem 1.8rem 3.5rem; } } .item-list--armor { .item-list-header, .item-entry { - grid-template-columns: @item-img-size 1fr 3.5rem 5rem 1.8rem 3.5rem; + grid-template-columns: @item-img-size 1fr 3.5rem 2.5rem 3.5rem 1.5rem 1.8rem 3.5rem; } } @@ -148,18 +163,39 @@ } } - .item-list--ability { + .item-list--trait { .item-list-header, .item-entry { - grid-template-columns: @item-img-size 1fr 6rem 3.5rem; + grid-template-columns: @item-img-size 1fr 6rem 6rem 3.5rem; } } .item-list--oath { .item-list-header, .item-entry { - grid-template-columns: @item-img-size 1fr 5.5rem 3.5rem; + grid-template-columns: @item-img-size 1fr 7rem 3.5rem 3.5rem; } } + .item-usage { + font-size: @font-size-xs; + color: @color-olive; + text-align: center; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .item-violated { + text-align: center; + font-size: @font-size-sm; + i.fa-circle-xmark { color: #c0392b; } + i.fa-circle-check { color: #27ae60; } + } + + .oath--violated { + background-color: fade(#c0392b, 8%); + .item-name { color: #c0392b; } + } + .no-items { color: var(--color-dark-5); font-style: italic; diff --git a/module/applications/_module.mjs b/module/applications/_module.mjs index cf89d84..7a9c397 100644 --- a/module/applications/_module.mjs +++ b/module/applications/_module.mjs @@ -7,7 +7,8 @@ export { default as OathHammerEquipmentSheet } from "./sheets/equipment-sheet.mj export { default as OathHammerSpellSheet } from "./sheets/spell-sheet.mjs" 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 OathHammerTraitSheet } from "./sheets/trait-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" +export { default as OathHammerBuildingSheet } from "./sheets/building-sheet.mjs" diff --git a/module/applications/sheets/building-sheet.mjs b/module/applications/sheets/building-sheet.mjs new file mode 100644 index 0000000..0a26f91 --- /dev/null +++ b/module/applications/sheets/building-sheet.mjs @@ -0,0 +1,28 @@ +import OathHammerItemSheet from "./base-item-sheet.mjs" + +export default class OathHammerBuildingSheet extends OathHammerItemSheet { + /** @override */ + static DEFAULT_OPTIONS = { + classes: ["building"], + position: { + width: 640, + }, + window: { + contentClasses: ["building-content"], + }, + } + + /** @override */ + static PARTS = { + main: { + template: "systems/fvtt-oath-hammer/templates/item/building-sheet.hbs", + }, + } + + /** @override */ + async _prepareContext() { + const context = await super._prepareContext() + context.enrichedNotes = await foundry.applications.ux.TextEditor.implementation.enrichHTML(this.document.system.notes ?? "", { async: true }) + return context + } +} diff --git a/module/applications/sheets/character-sheet.mjs b/module/applications/sheets/character-sheet.mjs index 03de3d9..ca258ec 100644 --- a/module/applications/sheets/character-sheet.mjs +++ b/module/applications/sheets/character-sheet.mjs @@ -72,8 +72,26 @@ export default class OathHammerCharacterSheet extends OathHammerActorSheet { break case "identity": context.tab = context.tabs.identity - context.abilities = doc.itemTypes.ability - context.oaths = doc.itemTypes.oath + context.traits = doc.itemTypes.trait.map(a => { + const typeKey = SYSTEM.TRAIT_TYPE_CHOICES[a.system.traitType] + const periodKey = SYSTEM.TRAIT_USAGE_PERIOD[a.system.usagePeriod] + const isPassive = a.system.usagePeriod === "none" + return { + id: a.id, uuid: a.uuid, img: a.img, name: a.name, system: a.system, + _typeLabel: typeKey ? game.i18n.localize(typeKey) : a.system.traitType, + _usageLabel: isPassive + ? game.i18n.localize("OATHHAMMER.UsagePeriod.None") + : `${a.system.maxUses > 0 ? a.system.maxUses + " / " : ""}${game.i18n.localize(periodKey)}` + } + }) + context.oaths = doc.itemTypes.oath.map(o => { + const typeEntry = SYSTEM.OATH_TYPES[o.system.oathType] + return { + id: o.id, uuid: o.uuid, img: o.img, name: o.name, system: o.system, + _typeLabel: typeEntry ? game.i18n.localize(typeEntry.label) : o.system.oathType, + _violated: o.system.violated + } + }) break case "skills": { context.tab = context.tabs.skills @@ -116,8 +134,32 @@ export default class OathHammerCharacterSheet extends OathHammerActorSheet { } case "combat": context.tab = context.tabs.combat - context.weapons = doc.itemTypes.weapon - context.armors = doc.itemTypes.armor + context.weapons = doc.itemTypes.weapon.map(w => { + const groupKey = SYSTEM.WEAPON_PROFICIENCY_GROUPS[w.system.proficiencyGroup] + const traitsLabel = [...w.system.traits].map(t => { + const tk = SYSTEM.WEAPON_TRAITS[t] + return tk ? game.i18n.localize(tk) : t + }).join(", ") + return { + id: w.id, uuid: w.uuid, img: w.img, name: w.name, system: w.system, + _groupLabel: groupKey ? game.i18n.localize(groupKey) : w.system.proficiencyGroup, + _traitsTooltip: traitsLabel || null, + _isMagic: w.system.isMagic + } + }) + context.armors = doc.itemTypes.armor.map(a => { + const typeKey = SYSTEM.ARMOR_TYPE_CHOICES[a.system.armorType] + const traitsLabel = [...a.system.traits].map(t => { + const tk = SYSTEM.ARMOR_TRAITS[t] + return tk ? game.i18n.localize(tk) : t + }).join(", ") + return { + id: a.id, uuid: a.uuid, img: a.img, name: a.name, system: a.system, + _typeLabel: typeKey ? game.i18n.localize(typeKey) : a.system.armorType, + _traitsTooltip: traitsLabel || null, + _isMagic: a.system.isMagic + } + }) context.ammunition = doc.itemTypes.ammunition break case "magic": diff --git a/module/applications/sheets/ability-sheet.mjs b/module/applications/sheets/trait-sheet.mjs similarity index 61% rename from module/applications/sheets/ability-sheet.mjs rename to module/applications/sheets/trait-sheet.mjs index d67d443..6a5617b 100644 --- a/module/applications/sheets/ability-sheet.mjs +++ b/module/applications/sheets/trait-sheet.mjs @@ -1,21 +1,21 @@ import OathHammerItemSheet from "./base-item-sheet.mjs" -export default class OathHammerAbilitySheet extends OathHammerItemSheet { +export default class OathHammerTraitSheet extends OathHammerItemSheet { /** @override */ static DEFAULT_OPTIONS = { - classes: ["ability"], + classes: ["trait"], position: { width: 620, }, window: { - contentClasses: ["ability-content"], + contentClasses: ["trait-content"], }, } /** @override */ static PARTS = { main: { - template: "systems/fvtt-oath-hammer/templates/item/ability-sheet.hbs", + template: "systems/fvtt-oath-hammer/templates/item/trait-sheet.hbs", }, } diff --git a/module/config/system.mjs b/module/config/system.mjs index 0cdebb6..ea6c625 100644 --- a/module/config/system.mjs +++ b/module/config/system.mjs @@ -172,14 +172,14 @@ export const RARITY_CHOICES = { legendary: "OATHHAMMER.Rarity.Legendary" } -// Two types of ability: class traits and lineage traits. No feats in Oath Hammer. -export const ABILITY_TYPE_CHOICES = { - "class-ability": "OATHHAMMER.AbilityType.ClassAbility", - "lineage-trait": "OATHHAMMER.AbilityType.LineageTrait" +// Two types of trait per the rulebook terminology +export const TRAIT_TYPE_CHOICES = { + "special-trait": "OATHHAMMER.TraitType.SpecialTrait", + "class-trait": "OATHHAMMER.TraitType.ClassTrait" } -// When an ability's uses reset (none = passive/always on) -export const ABILITY_USAGE_PERIOD = { +// When a trait's uses reset (none = passive/always on) +export const TRAIT_USAGE_PERIOD = { none: "OATHHAMMER.UsagePeriod.None", encounter: "OATHHAMMER.UsagePeriod.Encounter", day: "OATHHAMMER.UsagePeriod.Day" @@ -331,6 +331,11 @@ export const ASCII = ` ················································· ` +export const BUILDING_SKILL_CHOICES = { + carpentry: "OATHHAMMER.BuildingSkill.Carpentry", + masonry: "OATHHAMMER.BuildingSkill.Masonry" +} + export const SYSTEM = { id: SYSTEM_ID, ATTRIBUTES, @@ -347,14 +352,15 @@ export const SYSTEM = { WEAPON_TRAITS, ARMOR_TYPE_CHOICES, ARMOR_TRAITS, - CURRENCY_CHOICES, + CURRENCY_CHOICES, AMMO_TYPE_CHOICES, EQUIPMENT_TYPE_CHOICES, MAGIC_ITEM_TYPE_CHOICES, MAGIC_QUALITY_CHOICES, RARITY_CHOICES, - ABILITY_TYPE_CHOICES, - ABILITY_USAGE_PERIOD, + TRAIT_TYPE_CHOICES, + TRAIT_USAGE_PERIOD, + BUILDING_SKILL_CHOICES, STATUS_EFFECTS, ATTRIBUTE_RANK_CHOICES, ASCII diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 5055716..e89ad53 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -6,7 +6,7 @@ const defaultItemImg = { spell: "systems/fvtt-oath-hammer/assets/icons/icon_spell.webp", miracle: "systems/fvtt-oath-hammer/assets/icons/icon_miracle.webp", "magic-item": "systems/fvtt-oath-hammer/assets/icons/icon_magic_item.webp", - ability: "systems/fvtt-oath-hammer/assets/icons/icon_ability.webp", + trait: "systems/fvtt-oath-hammer/assets/icons/icon_ability.webp", oath: "systems/fvtt-oath-hammer/assets/icons/icon_oath.webp" } diff --git a/module/models/_module.mjs b/module/models/_module.mjs index 500bb88..8f8f91e 100644 --- a/module/models/_module.mjs +++ b/module/models/_module.mjs @@ -7,7 +7,8 @@ export { default as OathHammerEquipment } from "./equipment.mjs" export { default as OathHammerSpell } from "./spell.mjs" 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 OathHammerTrait } from "./trait.mjs" export { default as OathHammerOath } from "./oath.mjs" export { default as OathHammerLineage } from "./lineage.mjs" export { default as OathHammerClass } from "./class.mjs" +export { default as OathHammerBuilding } from "./building.mjs" diff --git a/module/models/ability.mjs b/module/models/ability.mjs deleted file mode 100644 index 1903a06..0000000 --- a/module/models/ability.mjs +++ /dev/null @@ -1,33 +0,0 @@ -import { SYSTEM } from "../config/system.mjs" - -export default class OathHammerAbility extends foundry.abstract.TypeDataModel { - static defineSchema() { - const fields = foundry.data.fields - const requiredInteger = { required: true, nullable: false, integer: true } - const schema = {} - - schema.description = new fields.HTMLField({ required: true, textSearch: true }) - - // lineage-trait (racial) or class-ability (starting or advancement trait) - schema.abilityType = new fields.StringField({ - required: true, initial: "class-ability", choices: SYSTEM.ABILITY_TYPE_CHOICES - }) - - // Which class or lineage this trait belongs to (e.g. "Berserker", "Wood Elf") - schema.source = new fields.StringField({ required: true, nullable: false, initial: "" }) - - // When uses reset: none = passive (always on), encounter, day - schema.usagePeriod = new fields.StringField({ - required: true, initial: "none", choices: SYSTEM.ABILITY_USAGE_PERIOD - }) - - // Maximum uses per period. 0 = passive / unlimited. - // Use a descriptive string when the limit is formula-based - // (e.g. "equal to Fate ranks") — store the note in the description. - schema.maxUses = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) - - return schema - } - - static LOCALIZATION_PREFIXES = ["OATHHAMMER.Ability"] -} diff --git a/module/models/building.mjs b/module/models/building.mjs new file mode 100644 index 0000000..7de4104 --- /dev/null +++ b/module/models/building.mjs @@ -0,0 +1,44 @@ +import { SYSTEM } from "../config/system.mjs" + +export default class OathHammerBuilding extends foundry.abstract.TypeDataModel { + static defineSchema() { + const fields = foundry.data.fields + const requiredInteger = { required: true, nullable: false, integer: true } + const schema = {} + + // Narrative description and special effects + schema.description = new fields.HTMLField({ required: true, textSearch: true }) + + // Skill required to build (Carpentry or Masonry) + schema.skillCheck = new fields.StringField({ + required: true, initial: "carpentry", choices: SYSTEM.BUILDING_SKILL_CHOICES + }) + + // Cost in gold pieces (after skill check SV negotiation) + schema.cost = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) + + // Construction duration (free text: "3 weeks", "6 months", etc.) + schema.buildTime = new fields.StringField({ required: true, nullable: false, initial: "" }) + + // Monthly tax revenue formula ("3d6", "2d6", "1d3", "" = none) + schema.taxRevenue = new fields.StringField({ required: true, nullable: false, initial: "" }) + + // Is this building currently constructed in the settlement? + schema.constructed = new fields.BooleanField({ required: true, initial: false }) + + // Which settlement this building belongs to (free text or settlement name) + schema.settlement = new fields.StringField({ required: true, nullable: false, initial: "" }) + + // Additional GM notes (special conditions, upgrades, damage, etc.) + schema.notes = new fields.HTMLField({ required: false, textSearch: true }) + + return schema + } + + static LOCALIZATION_PREFIXES = ["OATHHAMMER.Building"] + + /** Returns true if this building generates tax income */ + get hasTaxRevenue() { + return this.taxRevenue.trim().length > 0 + } +} diff --git a/module/models/magic-item.mjs b/module/models/magic-item.mjs index adf7b0b..2b82590 100644 --- a/module/models/magic-item.mjs +++ b/module/models/magic-item.mjs @@ -31,7 +31,7 @@ export default class OathHammerMagicItem extends foundry.abstract.TypeDataModel // Limited-use items (e.g. "once per day"); none = always active schema.usagePeriod = new fields.StringField({ - required: true, initial: "none", choices: SYSTEM.ABILITY_USAGE_PERIOD + required: true, initial: "none", choices: SYSTEM.TRAIT_USAGE_PERIOD }) schema.maxUses = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) diff --git a/module/models/trait.mjs b/module/models/trait.mjs new file mode 100644 index 0000000..76beb91 --- /dev/null +++ b/module/models/trait.mjs @@ -0,0 +1,43 @@ +import { SYSTEM } from "../config/system.mjs" + +export default class OathHammerTrait extends foundry.abstract.TypeDataModel { + static defineSchema() { + const fields = foundry.data.fields + const requiredInteger = { required: true, nullable: false, integer: true } + const schema = {} + + schema.description = new fields.HTMLField({ required: true, textSearch: true }) + + // class-trait (class-exclusive, acquirable) or special-trait (starting class trait) + schema.traitType = new fields.StringField({ + required: true, initial: "special-trait", choices: SYSTEM.TRAIT_TYPE_CHOICES + }) + + // Which class or lineage this trait belongs to (e.g. "Berserker", "Wood Elf") + schema.source = new fields.StringField({ required: true, nullable: false, initial: "" }) + + // When uses reset: none = passive (always on), encounter, day + schema.usagePeriod = new fields.StringField({ + required: true, initial: "none", choices: SYSTEM.TRAIT_USAGE_PERIOD + }) + + // Maximum uses per period. 0 = passive / unlimited. + schema.maxUses = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) + + return schema + } + + static LOCALIZATION_PREFIXES = ["OATHHAMMER.Trait"] + + static migrateData(source) { + // Migrate old abilityType field → traitType + if (source.abilityType !== undefined && source.traitType === undefined) { + const map = { "class-ability": "class-trait", "lineage-trait": "special-trait" } + source.traitType = map[source.abilityType] ?? "special-trait" + } + // Migrate old traitType values + if (source.traitType === "lineage-trait") source.traitType = "special-trait" + if (source.traitType === "class-ability") source.traitType = "class-trait" + return super.migrateData(source) + } +} diff --git a/oath-hammer.mjs b/oath-hammer.mjs index 74a235b..8e2150a 100644 --- a/oath-hammer.mjs +++ b/oath-hammer.mjs @@ -30,10 +30,11 @@ Hooks.once("init", function () { spell: models.OathHammerSpell, miracle: models.OathHammerMiracle, "magic-item": models.OathHammerMagicItem, - ability: models.OathHammerAbility, + trait: models.OathHammerTrait, oath: models.OathHammerOath, lineage: models.OathHammerLineage, - "class": models.OathHammerClass + "class": models.OathHammerClass, + building: models.OathHammerBuilding } foundry.documents.collections.Actors.unregisterSheet("core", foundry.appv1.sheets.ActorSheet) @@ -56,10 +57,11 @@ Hooks.once("init", function () { foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerSpellSheet, { types: ["spell"], makeDefault: true, label: "OATHHAMMER.Sheet.Spell" }) foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerMiracleSheet, { types: ["miracle"], makeDefault: true, label: "OATHHAMMER.Sheet.Miracle" }) foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerMagicItemSheet, { types: ["magic-item"], makeDefault: true, label: "OATHHAMMER.Sheet.MagicItem" }) - foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerAbilitySheet, { types: ["ability"], makeDefault: true, label: "OATHHAMMER.Sheet.Ability" }) + foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerTraitSheet, { types: ["trait"], makeDefault: true, label: "OATHHAMMER.Sheet.Trait" }) foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerOathSheet, { types: ["oath"], makeDefault: true, label: "OATHHAMMER.Sheet.Oath" }) foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerLineageSheet, { types: ["lineage"], makeDefault: true, label: "OATHHAMMER.Sheet.Lineage" }) foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerClassSheet, { types: ["class"], makeDefault: true, label: "OATHHAMMER.Sheet.Class" }) + foundry.documents.collections.Items.registerSheet("fvtt-oath-hammer", applications.OathHammerBuildingSheet, { types: ["building"], makeDefault: true, label: "OATHHAMMER.Sheet.Building" }) CONFIG.statusEffects = STATUS_EFFECTS diff --git a/system.json b/system.json index 495d693..560fff4 100644 --- a/system.json +++ b/system.json @@ -73,7 +73,7 @@ "effect" ] }, - "ability": { + "trait": { "htmlFields": [ "description" ] @@ -96,6 +96,12 @@ "description", "features" ] + }, + "building": { + "htmlFields": [ + "description", + "notes" + ] } } }, @@ -105,7 +111,7 @@ }, "primaryTokenAttribute": "grit", "socket": true, - "background": "systems/fvtt-oath-hammer/assets/ui/oath_hammer_paper.webp", + "background": "systems/fvtt-oath-hammer/assets/images/cover_art.webp", "flags": { "hotReload": { "extensions": [ diff --git a/templates/actor/character-combat.hbs b/templates/actor/character-combat.hbs index 077756b..41400c0 100644 --- a/templates/actor/character-combat.hbs +++ b/templates/actor/character-combat.hbs @@ -25,17 +25,21 @@