From 2ac0f53c4f6e93b0c85689f13783e9f30989b4a0 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Fri, 7 Feb 2025 08:34:57 +0100 Subject: [PATCH] Add rituals and tomes --- assets/icons/icon_ritual.svg | 1 + assets/icons/icon_tome.svg | 1 + css/fvtt-cthulhu-eternal.css | 290 ++++++++++++++++-- cthulhu-eternal.mjs | 6 +- lang/en.json | 79 ++++- module/applications/_module.mjs | 2 + .../applications/sheets/base-actor-sheet.mjs | 65 ---- .../applications/sheets/protagonist-sheet.mjs | 16 +- module/applications/sheets/ritual-sheet.mjs | 28 ++ module/applications/sheets/tome-sheet.mjs | 28 ++ module/config/system.mjs | 11 +- module/documents/item.mjs | 2 + module/models/_module.mjs | 2 + module/models/ritual.mjs | 24 ++ module/models/tome.mjs | 64 ++++ .../skills/{000114.log => 000130.log} | 0 packs-system/skills/CURRENT | 2 +- packs-system/skills/LOG | 16 +- packs-system/skills/LOG.old | 16 +- packs-system/skills/MANIFEST-000112 | Bin 139 -> 0 bytes packs-system/skills/MANIFEST-000128 | Bin 0 -> 143 bytes styles/fvtt-cthulhu-eternal.less | 2 + styles/protagonist.less | 129 ++++++-- styles/ritual.less | 22 ++ styles/tome.less | 22 ++ system.json | 4 +- templates/protagonist-equipment.hbs | 51 +++ templates/ritual.hbs | 23 ++ templates/tome.hbs | 42 +++ 29 files changed, 803 insertions(+), 145 deletions(-) create mode 100644 assets/icons/icon_ritual.svg create mode 100644 assets/icons/icon_tome.svg create mode 100644 module/applications/sheets/ritual-sheet.mjs create mode 100644 module/applications/sheets/tome-sheet.mjs create mode 100644 module/models/ritual.mjs create mode 100644 module/models/tome.mjs rename packs-system/skills/{000114.log => 000130.log} (100%) delete mode 100644 packs-system/skills/MANIFEST-000112 create mode 100644 packs-system/skills/MANIFEST-000128 create mode 100644 styles/ritual.less create mode 100644 styles/tome.less create mode 100644 templates/ritual.hbs create mode 100644 templates/tome.hbs diff --git a/assets/icons/icon_ritual.svg b/assets/icons/icon_ritual.svg new file mode 100644 index 0000000..bf400eb --- /dev/null +++ b/assets/icons/icon_ritual.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_tome.svg b/assets/icons/icon_tome.svg new file mode 100644 index 0000000..6a46d7a --- /dev/null +++ b/assets/icons/icon_tome.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/css/fvtt-cthulhu-eternal.css b/css/fvtt-cthulhu-eternal.css index 86d7bb1..bc3add8 100644 --- a/css/fvtt-cthulhu-eternal.css +++ b/css/fvtt-cthulhu-eternal.css @@ -529,8 +529,8 @@ i.fvtt-cthulhu-eternal { align-items: center; gap: 4px; margin-left: 4px; - min-width: 12rem; - max-width: 12rem; + min-width: 12.3rem; + max-width: 12.3rem; } .fvtt-cthulhu-eternal .tab.protagonist-skills .skills .skill .rollable:hover, .fvtt-cthulhu-eternal .tab.protagonist-skills .skills .skill .rollable:focus { @@ -538,12 +538,17 @@ i.fvtt-cthulhu-eternal { cursor: pointer; } .fvtt-cthulhu-eternal .tab.protagonist-skills .skills .skill .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; +} +.fvtt-cthulhu-eternal .tab.protagonist-skills .skills .skill .score { + min-width: 1.2rem; + max-width: 1.2rem; } .fvtt-cthulhu-eternal .tab.protagonist-skills .skills .skill .name { - min-width: 11rem; - max-width: 11rem; + min-width: 10rem; + max-width: 10rem; } .fvtt-cthulhu-eternal .tab.protagonist-skills .skills .skill .item-img { width: 24px; @@ -572,8 +577,9 @@ i.fvtt-cthulhu-eternal { max-width: 18rem; } .fvtt-cthulhu-eternal .tab.protagonist-status .bonds .bond .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .fvtt-cthulhu-eternal .tab.protagonist-status .bonds .bond .name { min-width: 12rem; @@ -605,8 +611,9 @@ i.fvtt-cthulhu-eternal { max-width: 14rem; } .fvtt-cthulhu-eternal .tab.protagonist-status .motivations .motivation .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .fvtt-cthulhu-eternal .tab.protagonist-status .motivations .motivation .name { min-width: 12rem; @@ -630,8 +637,9 @@ i.fvtt-cthulhu-eternal { max-width: 18rem; } .fvtt-cthulhu-eternal .tab.protagonist-status .mentaldisorders .mentaldisorder .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .fvtt-cthulhu-eternal .tab.protagonist-status .mentaldisorders .mentaldisorder .name { min-width: 14rem; @@ -659,8 +667,9 @@ i.fvtt-cthulhu-eternal { max-width: 16rem; } .fvtt-cthulhu-eternal .tab.protagonist-status .injuries .injury .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .fvtt-cthulhu-eternal .tab.protagonist-status .injuries .injury .name { min-width: 14rem; @@ -698,8 +707,9 @@ i.fvtt-cthulhu-eternal { cursor: pointer; } .fvtt-cthulhu-eternal .tab.protagonist-equipment .weapons .weapon .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .fvtt-cthulhu-eternal .tab.protagonist-equipment .weapons .weapon .damage { min-width: 6rem; @@ -724,7 +734,7 @@ i.fvtt-cthulhu-eternal { align-items: center; gap: 4px; min-width: 13rem; - max-width: 13srem; + max-width: 13rem; } .fvtt-cthulhu-eternal .tab.protagonist-equipment .armors .armor .rollable:hover, .fvtt-cthulhu-eternal .tab.protagonist-equipment .armors .armor .rollable:focus { @@ -732,8 +742,9 @@ i.fvtt-cthulhu-eternal { cursor: pointer; } .fvtt-cthulhu-eternal .tab.protagonist-equipment .armors .armor .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .fvtt-cthulhu-eternal .tab.protagonist-equipment .armors .armor .protection { min-width: 5rem; @@ -758,7 +769,7 @@ i.fvtt-cthulhu-eternal { align-items: center; gap: 4px; min-width: 13rem; - max-width: 13srem; + max-width: 13rem; } .fvtt-cthulhu-eternal .tab.protagonist-equipment .gears .gear .rollable:hover, .fvtt-cthulhu-eternal .tab.protagonist-equipment .gears .gear .rollable:focus { @@ -766,22 +777,81 @@ i.fvtt-cthulhu-eternal { cursor: pointer; } .fvtt-cthulhu-eternal .tab.protagonist-equipment .gears .gear .controls { - min-width: 2rem; - max-width: 2rem; -} -.fvtt-cthulhu-eternal .tab.protagonist-equipment .gears .gear .damage { - min-width: 5rem; - max-width: 5rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .fvtt-cthulhu-eternal .tab.protagonist-equipment .gears .gear .name { - min-width: 8rem; - max-width: 8rem; + min-width: 10rem; + max-width: 10rem; } .fvtt-cthulhu-eternal .tab.protagonist-equipment .gears .gear .item-img { width: 24px; height: 24px; margin: 4px 0 0 0; } +.fvtt-cthulhu-eternal .tab.protagonist-equipment .rituals { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 4px; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .rituals .ritual { + display: flex; + align-items: center; + gap: 4px; + min-width: 20rem; + max-width: 20rem; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .rituals .ritual .rollable:hover, +.fvtt-cthulhu-eternal .tab.protagonist-equipment .rituals .ritual .rollable:focus { + text-shadow: 0 0 8px var(--color-shadow-primary); + cursor: pointer; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .rituals .ritual .controls { + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .rituals .ritual .name { + min-width: 17rem; + max-width: 17rem; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .rituals .ritual .item-img { + width: 24px; + height: 24px; + margin: 4px 0 0 0; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .tomes { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 4px; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .tomes .tome { + display: flex; + align-items: center; + gap: 4px; + min-width: 20rem; + max-width: 20rem; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .tomes .tome .rollable:hover, +.fvtt-cthulhu-eternal .tab.protagonist-equipment .tomes .tome .rollable:focus { + text-shadow: 0 0 8px var(--color-shadow-primary); + cursor: pointer; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .tomes .tome .controls { + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .tomes .tome .name { + min-width: 17rem; + max-width: 17rem; +} +.fvtt-cthulhu-eternal .tab.protagonist-equipment .tomes .tome .item-img { + width: 24px; + height: 24px; + margin: 4px 0 0 0; +} .fvtt-cthulhu-eternal .tab.protagonist-equipment prose-mirror.inactive { min-height: 40px; } @@ -1887,6 +1957,170 @@ i.fvtt-cthulhu-eternal { .fvtt-cthulhu-eternal .archetype-content label { flex: 10%; } +.fvtt-cthulhu-eternal .ritual-content { + font-family: var(--font-primary); + font-size: calc(var(--font-size-standard) * 1); + color: var(--color-dark-1); + background-image: var(--background-image-base); + background-repeat: no-repeat; + background-size: 100% 100%; +} +.fvtt-cthulhu-eternal .ritual-content input:disabled, +.fvtt-cthulhu-eternal .ritual-content select:disabled { + background-color: rgba(0, 0, 0, 0.2); + border-color: transparent; + color: var(--color-dark-3); +} +.fvtt-cthulhu-eternal .ritual-content input, +.fvtt-cthulhu-eternal .ritual-content select { + background-color: rgba(0, 0, 0, 0.1); + border-color: var(--color-dark-6); + color: var(--color-dark-2); +} +.fvtt-cthulhu-eternal .ritual-content input[name="name"] { + height: 40px; + margin-right: 10px; + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + font-weight: bold; + border: none; +} +.fvtt-cthulhu-eternal .ritual-content fieldset { + margin-bottom: 4px; + border-radius: 4px; +} +.fvtt-cthulhu-eternal .ritual-content .form-fields input, +.fvtt-cthulhu-eternal .ritual-content .form-fields select { + text-align: center; + font-size: calc(var(--font-size-standard) * 1); +} +.fvtt-cthulhu-eternal .ritual-content .form-fields select { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); +} +.fvtt-cthulhu-eternal .ritual-content legend { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1.2); + font-weight: bold; + letter-spacing: 1px; +} +.fvtt-cthulhu-eternal .ritual-content .form-fields { + padding-top: 4px; +} +.fvtt-cthulhu-eternal .ritual-content label { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + flex: 50%; +} +.fvtt-cthulhu-eternal .ritual-content .align-top { + align-self: flex-start; + padding: 0.1rem; + margin-right: 0.2rem; + /*border-color: black; + border-width: 1px; + border-style: solid; + border-radius: 2%;*/ +} +.fvtt-cthulhu-eternal .ritual-content .shift-right { + margin-left: 2rem; +} +.fvtt-cthulhu-eternal .ritual-content fieldset { + margin-top: 8px; + background-color: var(--color-light-1); +} +.fvtt-cthulhu-eternal .ritual-content .header { + background-color: var(--color-light-1); + display: flex; +} +.fvtt-cthulhu-eternal .ritual-content .header img { + width: 50px; + height: 50px; +} +.fvtt-cthulhu-eternal .ritual-content label { + flex: 10%; +} +.fvtt-cthulhu-eternal .tome-content { + font-family: var(--font-primary); + font-size: calc(var(--font-size-standard) * 1); + color: var(--color-dark-1); + background-image: var(--background-image-base); + background-repeat: no-repeat; + background-size: 100% 100%; +} +.fvtt-cthulhu-eternal .tome-content input:disabled, +.fvtt-cthulhu-eternal .tome-content select:disabled { + background-color: rgba(0, 0, 0, 0.2); + border-color: transparent; + color: var(--color-dark-3); +} +.fvtt-cthulhu-eternal .tome-content input, +.fvtt-cthulhu-eternal .tome-content select { + background-color: rgba(0, 0, 0, 0.1); + border-color: var(--color-dark-6); + color: var(--color-dark-2); +} +.fvtt-cthulhu-eternal .tome-content input[name="name"] { + height: 40px; + margin-right: 10px; + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + font-weight: bold; + border: none; +} +.fvtt-cthulhu-eternal .tome-content fieldset { + margin-bottom: 4px; + border-radius: 4px; +} +.fvtt-cthulhu-eternal .tome-content .form-fields input, +.fvtt-cthulhu-eternal .tome-content .form-fields select { + text-align: center; + font-size: calc(var(--font-size-standard) * 1); +} +.fvtt-cthulhu-eternal .tome-content .form-fields select { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); +} +.fvtt-cthulhu-eternal .tome-content legend { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1.2); + font-weight: bold; + letter-spacing: 1px; +} +.fvtt-cthulhu-eternal .tome-content .form-fields { + padding-top: 4px; +} +.fvtt-cthulhu-eternal .tome-content label { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + flex: 50%; +} +.fvtt-cthulhu-eternal .tome-content .align-top { + align-self: flex-start; + padding: 0.1rem; + margin-right: 0.2rem; + /*border-color: black; + border-width: 1px; + border-style: solid; + border-radius: 2%;*/ +} +.fvtt-cthulhu-eternal .tome-content .shift-right { + margin-left: 2rem; +} +.fvtt-cthulhu-eternal .tome-content fieldset { + margin-top: 8px; + background-color: var(--color-light-1); +} +.fvtt-cthulhu-eternal .tome-content .header { + background-color: var(--color-light-1); + display: flex; +} +.fvtt-cthulhu-eternal .tome-content .header img { + width: 50px; + height: 50px; +} +.fvtt-cthulhu-eternal .tome-content label { + flex: 10%; +} .application.dialog.fvtt-cthulhu-eternal { color: var(--color-dark-1); background-color: var(--color-light-1); diff --git a/cthulhu-eternal.mjs b/cthulhu-eternal.mjs index 75e3e13..59d23ce 100644 --- a/cthulhu-eternal.mjs +++ b/cthulhu-eternal.mjs @@ -47,7 +47,9 @@ Hooks.once("init", function () { bond: models.CthulhuEternalBond, arcane: models.CthulhuEternalArcane, gear: models.CthulhuEternalGear, - archetype: models.CthulhuEternalArchetype + archetype: models.CthulhuEternalArchetype, + ritual: models.CthulhuEternalRitual, + tome: models.CthulhuEternalTome } // Register sheet application classes @@ -66,6 +68,8 @@ Hooks.once("init", function () { Items.registerSheet("fvtt-cthulhu-eternal", applications.CthulhuEternalBondSheet, { types: ["bond"], makeDefault: true }) Items.registerSheet("fvtt-cthulhu-eternal", applications.CthulhuEternalGearSheet, { types: ["gear"], makeDefault: true }) Items.registerSheet("fvtt-cthulhu-eternal", applications.CthulhuEternalArchetypeSheet, { types: ["archetype"], makeDefault: true }) + Items.registerSheet("fvtt-cthulhu-eternal", applications.CthulhuEternalRitualSheet, { types: ["ritual"], makeDefault: true }) + Items.registerSheet("fvtt-cthulhu-eternal", applications.CthulhuEternalTomeSheet, { types: ["tome"], makeDefault: true }) // Other Document Configuration CONFIG.ChatMessage.documentClass = documents.CthulhuEternalChatMessage diff --git a/lang/en.json b/lang/en.json index 9e81717..3f0c18a 100644 --- a/lang/en.json +++ b/lang/en.json @@ -14,7 +14,9 @@ "mentaldisorder": "Mental Disorder", "bond": "Bond" , "arcane": "Arcane", - "archetype": "Archetype" + "archetype": "Archetype", + "ritual": "Ritual", + "tome": "Tome" } }, "CTHULHUETERNAL": { @@ -327,7 +329,78 @@ "harsh": "Harsh", "veryHarsh": "Very Harsh" }, + "Tome": { + "FIELDS": { + "language": { + "label": "Language" + }, + "settings": { + "label": "Settings" + }, + "studyTime": { + "label": "Study Time" + }, + "sanLoss": { + "label": "SAN Loss" + }, + "unnaturalSkill": { + "label": "Unnatural Skill" + }, + "rituals": { + "label": "Rituals" + }, + "minimumEra": { + "label": "Minimum Era" + }, + "otherBenefits": { + "label": "Other Benefits" + }, + "creationDate": { + "label": "Creation Date" + }, + "description": { + "label": "Description" + } + }, + "Label": { + "tomeDetails": "Tome Details" + }, + "Button": { + "addRitual": "Add Ritual" + } + }, + "Ritual": { + "Simple": "Simple", + "Complex": "Complex", + "Elaborate": "Elaborate", + "FIELDS": { + "ritualType": { + "label": "Type" + }, + "studyTime": { + "label": "Study time" + }, + "studySAN": { + "label": "Study SAN" + }, + "activationTime": { + "label": "Activation time" + }, + "activationSAN": { + "label": "Activation SAN" + }, + "activationWP": { + "label": "Activation WP" + }, + "description": { + "label": "Description" + } + } + }, "Label": { + "Rituals": "Rituals", + "Tomes": "Tomes", + "otherBenefits": "Other Benefits", "Unarmed": "Unarmed", "Cured": "Cured", "Uncured": "Uncured", @@ -433,7 +506,9 @@ "newGear": "New Gear", "newArcane": "New Arcane", "newArchetype": "New Archetype", - "newSkill": "New Skill" + "newSkill": "New Skill", + "newTome": "New Tome", + "newRitual": "New Ritual" }, "ChatMessage": { "exhausted": "Your protagonist is exhausted. He loses [[/r 1d6]] Willpower Points." diff --git a/module/applications/_module.mjs b/module/applications/_module.mjs index c7b3cc2..a3f4c15 100644 --- a/module/applications/_module.mjs +++ b/module/applications/_module.mjs @@ -9,4 +9,6 @@ export { default as CthulhuEternalMentalDisorderSheet } from "./sheets/mentaldis export { default as CthulhuEternalGearSheet } from "./sheets/gear-sheet.mjs" export { default as CthulhuEternalMotivationSheet } from "./sheets/motivation-sheet.mjs" export { default as CthulhuEternalArchetypeSheet } from "./sheets/archetype-sheet.mjs" +export { default as CthulhuEternalRitualSheet } from "./sheets/ritual-sheet.mjs" export { default as CthulhuEternalVehicleSheet } from "./sheets/vehicle-sheet.mjs" +export { default as CthulhuEternalTomeSheet } from "./sheets/tome-sheet.mjs" diff --git a/module/applications/sheets/base-actor-sheet.mjs b/module/applications/sheets/base-actor-sheet.mjs index 1c777ed..737ae93 100644 --- a/module/applications/sheets/base-actor-sheet.mjs +++ b/module/applications/sheets/base-actor-sheet.mjs @@ -96,7 +96,6 @@ export default class CthulhuEternalActorSheet extends HandlebarsApplicationMixin drop: this._canDragDrop.bind(this), } d.callbacks = { - dragstart: this._onDragStart.bind(this), dragover: this._onDragOver.bind(this), drop: this._onDrop.bind(this), } @@ -133,70 +132,6 @@ export default class CthulhuEternalActorSheet extends HandlebarsApplicationMixin return true //this.isEditable && this.document.isOwner } - /** - * Callback actions which occur at the beginning of a drag start workflow. - * @param {DragEvent} event The originating DragEvent - * @protected - */ - _onDragStart(event) { - if ("link" in event.target.dataset) return - - const el = event.currentTarget.closest('[data-drag="true"]') - const dragType = el.dataset.dragType - - let dragData = {} - - let target - switch (dragType) { - case "save": - target = event.currentTarget.querySelector("input") - dragData = { - actorId: this.document.id, - type: "roll", - rollType: target.dataset.rollType, - rollTarget: target.dataset.rollTarget, - value: target.value, - } - break - case "resource": - target = event.currentTarget.querySelector("select") - dragData = { - actorId: this.document.id, - type: "roll", - rollType: target.dataset.rollType, - rollTarget: target.dataset.rollTarget, - value: target.value, - } - break - case "damage": - dragData = { - actorId: this.document.id, - type: "rollDamage", - rollType: el.dataset.dragType, - rollTarget: el.dataset.itemId, - } - break - case "attack": - dragData = { - actorId: this.document.id, - type: "rollAttack", - rollValue: el.dataset.rollValue, - rollTarget: el.dataset.rollTarget, - } - break - default: - // Handle other cases or do nothing - break - } - - // Extract the data you need - - if (!dragData) return - - // Set data transfer - event.dataTransfer.setData("text/plain", JSON.stringify(dragData)) - } - /** * Callback actions which occur when a dragged element is over a drop target. * @param {DragEvent} event The originating DragEvent diff --git a/module/applications/sheets/protagonist-sheet.mjs b/module/applications/sheets/protagonist-sheet.mjs index be4bd12..8f51398 100644 --- a/module/applications/sheets/protagonist-sheet.mjs +++ b/module/applications/sheets/protagonist-sheet.mjs @@ -20,7 +20,9 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS createInjury: CthulhuEternalProtagonistSheet.#onCreateInjury, createMentalDisorder: CthulhuEternalProtagonistSheet.#onCreateMentalDisorder, createMotivation: CthulhuEternalProtagonistSheet.#onCreateMotivation, - createSkill: CthulhuEternalProtagonistSheet.#onCreateSkill + createSkill: CthulhuEternalProtagonistSheet.#onCreateSkill, + createRitual: CthulhuEternalProtagonistSheet.#onCreateRitual, + createTome: CthulhuEternalProtagonistSheet.#onCreateTome, }, } @@ -108,6 +110,10 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS context.armors.sort((a, b) => a.name.localeCompare(b.name)) context.gears = doc.itemTypes.gear context.gears.sort((a, b) => a.name.localeCompare(b.name)) + context.rituals = doc.itemTypes.ritual + context.rituals.sort((a, b) => a.name.localeCompare(b.name)) + context.tomes = doc.itemTypes.tome + context.tomes.sort((a, b) => a.name.localeCompare(b.name)) break case "status": context.tab = context.tabs.status @@ -170,6 +176,14 @@ export default class CthulhuEternalProtagonistSheet extends CthulhuEternalActorS this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("CTHULHUETERNAL.Label.newSkill"), type: "skill" }]) } + static #onCreateRitual(event, target) { + this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("CTHULHUETERNAL.Label.newRitual"), type: "ritual" }]) + } + + static #onCreateTome(event, target) { + this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("CTHULHUETERNAL.Label.newTome"), type: "tome" }]) + } + /** * Handles the roll action triggered by user interaction. * diff --git a/module/applications/sheets/ritual-sheet.mjs b/module/applications/sheets/ritual-sheet.mjs new file mode 100644 index 0000000..2041480 --- /dev/null +++ b/module/applications/sheets/ritual-sheet.mjs @@ -0,0 +1,28 @@ +import CthulhuEternalItemSheet from "./base-item-sheet.mjs" + +export default class CthulhuEternalRitualSheet extends CthulhuEternalItemSheet { + /** @override */ + static DEFAULT_OPTIONS = { + classes: ["ritual"], + position: { + width: 600, + }, + window: { + contentClasses: ["ritual-content"], + }, + } + + /** @override */ + static PARTS = { + main: { + template: "systems/fvtt-cthulhu-eternal/templates/ritual.hbs", + }, + } + + /** @override */ + async _prepareContext() { + const context = await super._prepareContext() + context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true }) + return context + } +} diff --git a/module/applications/sheets/tome-sheet.mjs b/module/applications/sheets/tome-sheet.mjs new file mode 100644 index 0000000..75346f8 --- /dev/null +++ b/module/applications/sheets/tome-sheet.mjs @@ -0,0 +1,28 @@ +import CthulhuEternalItemSheet from "./base-item-sheet.mjs" + +export default class CthulhuEternalTomeSheet extends CthulhuEternalItemSheet { + /** @override */ + static DEFAULT_OPTIONS = { + classes: ["tome"], + position: { + width: 600, + }, + window: { + contentClasses: ["tome-content"], + }, + } + + /** @override */ + static PARTS = { + main: { + template: "systems/fvtt-cthulhu-eternal/templates/tome.hbs", + }, + } + + /** @override */ + async _prepareContext() { + const context = await super._prepareContext() + context.enrichedDescription = await TextEditor.enrichHTML(this.document.system.description, { async: true }) + return context + } +} diff --git a/module/config/system.mjs b/module/config/system.mjs index 157d82b..e7ddae3 100644 --- a/module/config/system.mjs +++ b/module/config/system.mjs @@ -42,7 +42,7 @@ export const INSANITY = { } export const ERA_CSS = { - jazz: { primaryFont: "RozhaOne", secondaryFont: "RozhaOne", titleFont: "Broadway", baseFontSize: "1.0rem", titleFontSize: "1.2rem", imgFilter: "brightness(0) saturate(100%) invert(52%) sepia(9%) saturate(2368%) hue-rotate(360deg) brightness(86%) contrast(84%)" }, + jazz: { primaryFont: "RozhaOne", secondaryFont: "RozhaOne", titleFont: "Broadway", baseFontSize: "0.95rem", titleFontSize: "1.2rem", imgFilter: "brightness(0) saturate(100%) invert(52%) sepia(9%) saturate(2368%) hue-rotate(360deg) brightness(86%) contrast(84%)" }, modern: { primaryFont: "Georama", secondaryFont: "Georama", titleFont: "Georama", baseFontSize: "1.0rem", titleFontSize: "1.2rem",imgFilter: "brightness(0) saturate(100%) invert(92%) sepia(11%) saturate(1214%) hue-rotate(51deg) brightness(93%) contrast(86%)" }, future: { primaryFont: "Georama", secondaryFont: "Georama", titleFont: "Seabreed", baseFontSize: "1.0rem", titleFontSize: "2.0rem",imgFilter: "invert(90%) sepia(6%) saturate(1818%) hue-rotate(152deg) brightness(91%) contrast(91%)" }, victorian: { primaryFont: "Volkhov", secondaryFont: "Volkhov", titleFont: "Excelsior", baseFontSize: "1.0rem", titleFontSize: "1.2rem",imgFilter: "brightness(0) saturate(100%) invert(100%) sepia(59%) saturate(1894%) hue-rotate(337deg) brightness(88%) contrast(98%)" }, @@ -238,6 +238,12 @@ export const MULTIPLIER_CHOICES = { "5": "5" } +export const RITUAL_TYPES = { + "simple": "CTHULHUETERNAL.Ritual.Simple", + "complex": "CTHULHUETERNAL.Ritual.Complex", + "elaborate": "CTHULHUETERNAL.Ritual.Elaborate" +} + /** * Include all constant definitions within the SYSTEM global export * @type {Object} @@ -261,5 +267,6 @@ export const SYSTEM = { MODIFIER_CHOICES, MULTIPLIER_CHOICES, ASCII, - DAMAGE_BONUS + DAMAGE_BONUS, + RITUAL_TYPES } diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 250591b..c9a5991 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -9,6 +9,8 @@ export const defaultItemImg = { arcane: "systems/fvtt-cthulhu-eternal/assets/icons/icon_arcane.svg", injury: "systems/fvtt-cthulhu-eternal/assets/icons/icon_injury.svg", motivation: "systems/fvtt-cthulhu-eternal/assets/icons/icon_motivation.svg", + ritual: "systems/fvtt-cthulhu-eternal/assets/icons/icon_ritual.svg", + tome: "systems/fvtt-cthulhu-eternal/assets/icons/icon_tome.svg", } export default class CthulhuEternalItem extends Item { diff --git a/module/models/_module.mjs b/module/models/_module.mjs index 58ae6f2..b3f069f 100644 --- a/module/models/_module.mjs +++ b/module/models/_module.mjs @@ -9,5 +9,7 @@ export { default as CthulhuEternalBond } from "./bond.mjs" export { default as CthulhuEternalGear } from "./gear.mjs" export { default as CthulhuEternalMotivation } from "./motivation.mjs" export { default as CthulhuEternalArchetype } from "./archetype.mjs" +export { default as CthulhuEternalRitual } from "./ritual.mjs" export { default as CthulhuEternalVehicle } from "./vehicle.mjs" +export { default as CthulhuEternalTome } from "./tome.mjs" diff --git a/module/models/ritual.mjs b/module/models/ritual.mjs new file mode 100644 index 0000000..6a75e9f --- /dev/null +++ b/module/models/ritual.mjs @@ -0,0 +1,24 @@ +import { SYSTEM } from "../config/system.mjs" + +export default class CthulhuEternalRitual extends foundry.abstract.TypeDataModel { + static defineSchema() { + const fields = foundry.data.fields + const requiredInteger = { required: true, nullable: false, integer: true } + const schema = {} + + schema.ritualType = new fields.StringField({ required: true, initial: "simple", choices: SYSTEM.RITUAL_TYPES }) + schema.studyTime = new fields.StringField({ required: true, initial: "X days", textSearch: true }) + schema.studySAN = new fields.StringField({ required: true, initial: "1d4", textSearch: true }) + schema.activationTime = new fields.StringField({ required: true, initial: "X turns", textSearch: true }) + schema.activationWP = new fields.StringField({ required: true, initial: "1d4", textSearch: true }) + schema.activationSAN = new fields.StringField({ required: true, initial: "1d6", textSearch: true }) + + schema.description = new fields.HTMLField({ required: true, textSearch: true }) + + return schema + } + + /** @override */ + static LOCALIZATION_PREFIXES = ["CTHULHUETERNAL.Ritual"] + +} diff --git a/module/models/tome.mjs b/module/models/tome.mjs new file mode 100644 index 0000000..7e8b1b1 --- /dev/null +++ b/module/models/tome.mjs @@ -0,0 +1,64 @@ +import { SYSTEM } from "../config/system.mjs"; + +export default class CthulhuEternalTome extends foundry.abstract.TypeDataModel { + static defineSchema() { + const fields = foundry.data.fields; + const schema = {}; + + let setting = game.settings.get("fvtt-cthulhu-eternal", "settings-era") || "modern" + schema.minimumEra = new fields.StringField({ required: true, initial: setting, choices: SYSTEM.AVAILABLE_SETTINGS }) + + schema.creationDate = new fields.StringField({ + required: true, + initial: "", + textSearch: true + }); + + // Language field + schema.language = new fields.StringField({ + required: true, + initial: "Latin", + textSearch: true + }); + + // studyTime field + schema.studyTime = new fields.StringField({ + required: true, + initial: "X days", + textSearch: true + }); + + // SAN loss field + schema.sanLoss = new fields.StringField({ + required: true, + initial: "1d4", + textSearch: true + }); + + // Unnatural skill field + schema.unnaturalSkill = new fields.StringField({ + required: true, + initial: "1d4", + textSearch: true + }); + + schema.rituals = new fields.StringField({ + required: true, + initial: "", + textSearch: true + }); + + schema.otherBenefits = new fields.StringField({ + required: true, + initial: "", + textSearch: true + }); + + schema.description = new fields.HTMLField({ required: true, textSearch: true }) + + return schema; + } + + /** @override */ + static LOCALIZATION_PREFIXES = ["CTHULHUETERNAL.Tome"]; +} \ No newline at end of file diff --git a/packs-system/skills/000114.log b/packs-system/skills/000130.log similarity index 100% rename from packs-system/skills/000114.log rename to packs-system/skills/000130.log diff --git a/packs-system/skills/CURRENT b/packs-system/skills/CURRENT index b59a6ba..a8d9908 100644 --- a/packs-system/skills/CURRENT +++ b/packs-system/skills/CURRENT @@ -1 +1 @@ -MANIFEST-000112 +MANIFEST-000128 diff --git a/packs-system/skills/LOG b/packs-system/skills/LOG index 2da1e86..6eda6a0 100644 --- a/packs-system/skills/LOG +++ b/packs-system/skills/LOG @@ -1,8 +1,8 @@ -2025/02/06-21:12:01.561879 7ffae7fff6c0 Recovering log #110 -2025/02/06-21:12:01.618398 7ffae7fff6c0 Delete type=3 #108 -2025/02/06-21:12:01.618459 7ffae7fff6c0 Delete type=0 #110 -2025/02/06-22:37:39.915470 7ffae6bff6c0 Level-0 table #115: started -2025/02/06-22:37:39.915518 7ffae6bff6c0 Level-0 table #115: 0 bytes OK -2025/02/06-22:37:39.952549 7ffae6bff6c0 Delete type=0 #113 -2025/02/06-22:37:39.952742 7ffae6bff6c0 Manual compaction at level-0 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) -2025/02/06-22:37:39.952774 7ffae6bff6c0 Manual compaction at level-1 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) +2025/02/07-07:58:04.988627 7ffae7fff6c0 Recovering log #126 +2025/02/07-07:58:04.998629 7ffae7fff6c0 Delete type=3 #124 +2025/02/07-07:58:04.998698 7ffae7fff6c0 Delete type=0 #126 +2025/02/07-08:34:42.926911 7ffae6bff6c0 Level-0 table #131: started +2025/02/07-08:34:42.926943 7ffae6bff6c0 Level-0 table #131: 0 bytes OK +2025/02/07-08:34:42.933490 7ffae6bff6c0 Delete type=0 #129 +2025/02/07-08:34:42.933666 7ffae6bff6c0 Manual compaction at level-0 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) +2025/02/07-08:34:42.944681 7ffae6bff6c0 Manual compaction at level-1 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) diff --git a/packs-system/skills/LOG.old b/packs-system/skills/LOG.old index 9cf5faf..4d2e435 100644 --- a/packs-system/skills/LOG.old +++ b/packs-system/skills/LOG.old @@ -1,8 +1,8 @@ -2025/02/06-21:10:37.808165 7ffae77fe6c0 Recovering log #106 -2025/02/06-21:10:37.818622 7ffae77fe6c0 Delete type=3 #104 -2025/02/06-21:10:37.818703 7ffae77fe6c0 Delete type=0 #106 -2025/02/06-21:11:20.037362 7ffae6bff6c0 Level-0 table #111: started -2025/02/06-21:11:20.037398 7ffae6bff6c0 Level-0 table #111: 0 bytes OK -2025/02/06-21:11:20.043269 7ffae6bff6c0 Delete type=0 #109 -2025/02/06-21:11:20.043465 7ffae6bff6c0 Manual compaction at level-0 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) -2025/02/06-21:11:20.043496 7ffae6bff6c0 Manual compaction at level-1 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) +2025/02/06-23:17:39.180197 7ffaecbf96c0 Recovering log #122 +2025/02/06-23:17:39.191385 7ffaecbf96c0 Delete type=3 #120 +2025/02/06-23:17:39.191461 7ffaecbf96c0 Delete type=0 #122 +2025/02/07-00:19:54.566098 7ffae6bff6c0 Level-0 table #127: started +2025/02/07-00:19:54.566176 7ffae6bff6c0 Level-0 table #127: 0 bytes OK +2025/02/07-00:19:54.572437 7ffae6bff6c0 Delete type=0 #125 +2025/02/07-00:19:54.583220 7ffae6bff6c0 Manual compaction at level-0 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) +2025/02/07-00:19:54.596307 7ffae6bff6c0 Manual compaction at level-1 from '!folders!DD8331Hda4rhvEf9' @ 72057594037927935 : 1 .. '!items!zplzTG30QXHURusr' @ 0 : 0; will stop at (end) diff --git a/packs-system/skills/MANIFEST-000112 b/packs-system/skills/MANIFEST-000112 deleted file mode 100644 index 8fe9b3df34e8d957716ab565cd671ba043616c09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139 zcmdmC8h9Xufss)vC$%g!CnZVGsj?)sJhM2}IX|}`u_&=5zlfcQ_1HlkMa8uIoRrj} zVnr7h3u9wLkCa4{qKq=vG)u;A1~8CU%q&UGEmo{5$f*i(H#P{2@CXemEiPj0g2)>> eJ^9Ybz{pg{$-rF1@{Y+U6zDwe;|=2kVp$i1OSZ>DF6Tf literal 0 HcmV?d00001 diff --git a/styles/fvtt-cthulhu-eternal.less b/styles/fvtt-cthulhu-eternal.less index 4c0019c..8caaaec 100644 --- a/styles/fvtt-cthulhu-eternal.less +++ b/styles/fvtt-cthulhu-eternal.less @@ -16,6 +16,8 @@ @import "gear.less"; @import "arcane.less"; @import "archetype.less"; + @import "ritual.less"; + @import "tome.less"; } @import "roll.less"; \ No newline at end of file diff --git a/styles/protagonist.less b/styles/protagonist.less index cc39141..6069581 100644 --- a/styles/protagonist.less +++ b/styles/protagonist.less @@ -294,20 +294,25 @@ align-items: center; gap: 4px; margin-left: 4px; - min-width: 12rem; - max-width: 12rem; + min-width: 12.3rem; + max-width: 12.3rem; .rollable:hover, .rollable:focus { text-shadow: 0 0 8px var(--color-shadow-primary); cursor: pointer; } .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; + } + .score { + min-width: 1.2rem; + max-width: 1.2rem; } .name { - min-width: 11rem; - max-width: 11rem; + min-width: 10rem; + max-width: 10rem; } .item-img { width: 24px; @@ -340,8 +345,9 @@ min-width: 18rem; max-width: 18rem; .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .name { min-width: 12rem; @@ -374,8 +380,9 @@ min-width: 14rem; max-width: 14rem; .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .name { min-width: 12rem; @@ -400,8 +407,9 @@ min-width: 18rem; max-width: 18rem; .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .name { min-width: 14rem; @@ -430,8 +438,9 @@ min-width: 16rem; max-width: 16rem; .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .name { min-width: 14rem; @@ -472,8 +481,9 @@ cursor: pointer; } .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .damage { min-width: 6rem; @@ -499,15 +509,16 @@ align-items: center; gap: 4px; min-width: 13rem; - max-width: 13srem; + max-width: 13rem; .rollable:hover, .rollable:focus { text-shadow: 0 0 8px var(--color-shadow-primary); cursor: pointer; } .controls { - min-width: 2rem; - max-width: 2rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .protection { min-width: 5rem; @@ -524,6 +535,7 @@ } } } + .gears { display: grid; grid-template-columns: repeat(3, 1fr); @@ -533,23 +545,84 @@ align-items: center; gap: 4px; min-width: 13rem; - max-width: 13srem; + max-width: 13rem; .rollable:hover, .rollable:focus { text-shadow: 0 0 8px var(--color-shadow-primary); cursor: pointer; } .controls { - min-width: 2rem; - max-width: 2rem; - } - .damage { - min-width: 5rem; - max-width: 5rem; + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; } .name { - min-width: 8rem; - max-width: 8rem; + min-width: 10rem; + max-width: 10rem; + } + .item-img { + width: 24px; + height: 24px; + margin: 4px 0 0 0; + } + } + } + + .rituals { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 4px; + .ritual { + display: flex; + align-items: center; + gap: 4px; + min-width: 20rem; + max-width: 20rem; + .rollable:hover, + .rollable:focus { + text-shadow: 0 0 8px var(--color-shadow-primary); + cursor: pointer; + } + .controls { + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; + } + .name { + min-width: 17rem; + max-width: 17rem; + } + .item-img { + width: 24px; + height: 24px; + margin: 4px 0 0 0; + } + } + } + + .tomes { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 4px; + .tome { + display: flex; + align-items: center; + gap: 4px; + min-width: 20rem; + max-width: 20rem; + .rollable:hover, + .rollable:focus { + text-shadow: 0 0 8px var(--color-shadow-primary); + cursor: pointer; + } + .controls { + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; + } + .name { + min-width: 17rem; + max-width: 17rem; } .item-img { width: 24px; diff --git a/styles/ritual.less b/styles/ritual.less new file mode 100644 index 0000000..8f8c4c0 --- /dev/null +++ b/styles/ritual.less @@ -0,0 +1,22 @@ +.ritual-content { + .sheet-common(); + .item-sheet-common(); + + fieldset { + margin-top: 8px; + background-color: var(--color-light-1); + } + + .header { + background-color: var(--color-light-1); + display: flex; + img { + width: 50px; + height: 50px; + } + } + + label { + flex: 10%; + } +} diff --git a/styles/tome.less b/styles/tome.less new file mode 100644 index 0000000..30f860e --- /dev/null +++ b/styles/tome.less @@ -0,0 +1,22 @@ +.tome-content { + .sheet-common(); + .item-sheet-common(); + + fieldset { + margin-top: 8px; + background-color: var(--color-light-1); + } + + .header { + background-color: var(--color-light-1); + display: flex; + img { + width: 50px; + height: 50px; + } + } + + label { + flex: 10%; + } +} diff --git a/system.json b/system.json index 7fd93c1..8925939 100644 --- a/system.json +++ b/system.json @@ -47,7 +47,9 @@ "motivation": { "htmlFields": ["description"] }, "arcane": { "htmlFields": ["description"] }, "gear": { "htmlFields": ["description"] }, - "archetype": { "htmlFields": ["description"] } + "archetype": { "htmlFields": ["description"] }, + "ritual": { "htmlFields": ["description"] }, + "tome": { "htmlFields": ["description"] } } }, "packs": [ diff --git a/templates/protagonist-equipment.hbs b/templates/protagonist-equipment.hbs index 701aa7b..0114ea4 100644 --- a/templates/protagonist-equipment.hbs +++ b/templates/protagonist-equipment.hbs @@ -81,4 +81,55 @@ + {{#if (count tomes)}} +
+ {{localize "CTHULHUETERNAL.Label.Tomes"}}{{#if isEditMode}} + {{/if}} + +
+ {{#each tomes as |item|}} +
+ +
+ {{item.name}} +
+
+ + +
+
+ {{/each}} +
+
+ {{/if}} + + {{#if (count rituals)}} +
+ {{localize "CTHULHUETERNAL.Label.Rituals"}}{{#if isEditMode}} + {{/if}} + +
+ {{#each rituals as |item|}} +
+ +
+ {{item.name}} +
+
+ + +
+
+ {{/each}} +
+
+ {{/if}} + + \ No newline at end of file diff --git a/templates/ritual.hbs b/templates/ritual.hbs new file mode 100644 index 0000000..fe165f9 --- /dev/null +++ b/templates/ritual.hbs @@ -0,0 +1,23 @@ +
+
+ + {{formInput fields.name value=source.name}} +
+ +
+ + {{formField systemFields.ritualType value=system.ritualType localize=true}} + {{formField systemFields.studyTime value=system.studyTime}} + {{formField systemFields.studySAN value=system.studySAN}} + {{formField systemFields.activationTime value=system.activationTime}} + {{formField systemFields.activationSAN value=system.activationSAN}} + {{formField systemFields.activationWP value=system.activationWP}} + +
+ +
+ {{localize "CTHULHUETERNAL.Label.description"}} + {{formInput systemFields.description enriched=description value=system.description name="system.description" toggled=true}} +
+ +
\ No newline at end of file diff --git a/templates/tome.hbs b/templates/tome.hbs new file mode 100644 index 0000000..ab0af99 --- /dev/null +++ b/templates/tome.hbs @@ -0,0 +1,42 @@ +
+
+ + {{formInput fields.name value=source.name}} +
+ +
+ +
+ {{formField systemFields.language value=system.language }} +
+
+ {{formField systemFields.minimumEra value=system.minimumEra localize=true }} +
+
+ {{formField systemFields.creationDate value=system.creationDate }} +
+
+ {{formField systemFields.studyTime value=system.studyTime }} +
+
+ {{formField systemFields.sanLoss value=system.sanLoss }} +
+
+ {{formField systemFields.unnaturalSkill value=system.unnaturalSkill }} +
+
+ + +
+
+ + +
+
+ +
+ {{localize "CTHULHUETERNAL.Label.description"}} + {{formInput systemFields.description enriched=description value=system.description name="system.description" toggled=true}} +
+ +
\ No newline at end of file