From 2ac69e2108584b0d525d6e817394549c2b4d4650 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Mon, 16 Dec 2024 09:04:48 +0100 Subject: [PATCH] Enhance actor sheet --- ...lours used in R20 Sheets (version 3).xlsx# | 2 +- ...olours used in R20 Sheets (version 3).xlsx | Bin 11261 -> 8708 bytes assets/icons/crossed-swords.svg | 1 + assets/icons/icon_arcane.svg | 1 + assets/icons/icon_archetype.svg | 1 + assets/icons/icon_armor.svg | 1 + assets/icons/icon_bond.svg | 1 + assets/icons/icon_injury.svg | 1 + assets/icons/icon_mental_disorder.svg | 1 + assets/icons/icon_motivation.svg | 1 + assets/icons/icon_skill.svg | 1 + assets/icons/icon_weapon_fire.svg | 1 + assets/icons/icon_weapon_range.svg | 1 + assets/icons/ucin_equipment.svg | 1 + css/fvtt-cthulhu-eternal.css | 83 +++++++++- cthulhu-eternal.mjs | 6 +- lang/en.json | 78 ++++++--- module/applications/_module.mjs | 1 + .../applications/sheets/archetype-sheet.mjs | 28 ++++ .../applications/sheets/base-actor-sheet.mjs | 15 +- module/config/protagonist.mjs | 4 +- module/config/system.mjs | 21 ++- module/documents/item.mjs | 22 ++- module/documents/roll.mjs | 1 - module/models/_module.mjs | 1 + module/models/archetype.mjs | 22 +++ module/models/protagonist.mjs | 10 +- module/utils.mjs | 154 +++++++++++++++++- styles/archetype.less | 16 ++ styles/fvtt-cthulhu-eternal.less | 1 + styles/global.less | 7 +- system.json | 9 +- templates/archetype.hbs | 14 ++ templates/protagonist-biography.hbs | 4 +- templates/protagonist-equipment.hbs | 7 +- templates/protagonist-main.hbs | 94 +++++++---- templates/skill.hbs | 2 +- 37 files changed, 535 insertions(+), 79 deletions(-) create mode 100644 assets/icons/crossed-swords.svg create mode 100644 assets/icons/icon_arcane.svg create mode 100644 assets/icons/icon_archetype.svg create mode 100644 assets/icons/icon_armor.svg create mode 100644 assets/icons/icon_bond.svg create mode 100644 assets/icons/icon_injury.svg create mode 100644 assets/icons/icon_mental_disorder.svg create mode 100644 assets/icons/icon_motivation.svg create mode 100644 assets/icons/icon_skill.svg create mode 100644 assets/icons/icon_weapon_fire.svg create mode 100644 assets/icons/icon_weapon_range.svg create mode 100644 assets/icons/ucin_equipment.svg create mode 100644 module/applications/sheets/archetype-sheet.mjs create mode 100644 module/models/archetype.mjs create mode 100644 styles/archetype.less create mode 100644 templates/archetype.hbs diff --git a/assets/docs/.~lock.Colours used in R20 Sheets (version 3).xlsx# b/assets/docs/.~lock.Colours used in R20 Sheets (version 3).xlsx# index a62ea75..51e4a41 100644 --- a/assets/docs/.~lock.Colours used in R20 Sheets (version 3).xlsx# +++ b/assets/docs/.~lock.Colours used in R20 Sheets (version 3).xlsx# @@ -1 +1 @@ -,morr,arioch,04.12.2024 14:13,file:///home/morr/.config/libreoffice/4; \ No newline at end of file +,morr,arioch,06.12.2024 13:55,file:///home/morr/.config/libreoffice/4; \ No newline at end of file diff --git a/assets/docs/Colours used in R20 Sheets (version 3).xlsx b/assets/docs/Colours used in R20 Sheets (version 3).xlsx index d506b7f26137a8d429610bdf59702ada9ec6744b..b05a46401ba8f5047728ae89b04bdf70af0a2d7e 100644 GIT binary patch literal 8708 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 V`ek+j0ECxU(2I6k(*O49{{XdO4+8)I diff --git a/assets/icons/crossed-swords.svg b/assets/icons/crossed-swords.svg new file mode 100644 index 0000000..b19a989 --- /dev/null +++ b/assets/icons/crossed-swords.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_arcane.svg b/assets/icons/icon_arcane.svg new file mode 100644 index 0000000..bf400eb --- /dev/null +++ b/assets/icons/icon_arcane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_archetype.svg b/assets/icons/icon_archetype.svg new file mode 100644 index 0000000..eec2dac --- /dev/null +++ b/assets/icons/icon_archetype.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_armor.svg b/assets/icons/icon_armor.svg new file mode 100644 index 0000000..589553b --- /dev/null +++ b/assets/icons/icon_armor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_bond.svg b/assets/icons/icon_bond.svg new file mode 100644 index 0000000..06b8e81 --- /dev/null +++ b/assets/icons/icon_bond.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_injury.svg b/assets/icons/icon_injury.svg new file mode 100644 index 0000000..8fb30b8 --- /dev/null +++ b/assets/icons/icon_injury.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_mental_disorder.svg b/assets/icons/icon_mental_disorder.svg new file mode 100644 index 0000000..3a670a2 --- /dev/null +++ b/assets/icons/icon_mental_disorder.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_motivation.svg b/assets/icons/icon_motivation.svg new file mode 100644 index 0000000..4c788d7 --- /dev/null +++ b/assets/icons/icon_motivation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_skill.svg b/assets/icons/icon_skill.svg new file mode 100644 index 0000000..566daf5 --- /dev/null +++ b/assets/icons/icon_skill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_weapon_fire.svg b/assets/icons/icon_weapon_fire.svg new file mode 100644 index 0000000..c4c0f7b --- /dev/null +++ b/assets/icons/icon_weapon_fire.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/icon_weapon_range.svg b/assets/icons/icon_weapon_range.svg new file mode 100644 index 0000000..1d5a698 --- /dev/null +++ b/assets/icons/icon_weapon_range.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/icons/ucin_equipment.svg b/assets/icons/ucin_equipment.svg new file mode 100644 index 0000000..87f7c12 --- /dev/null +++ b/assets/icons/ucin_equipment.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 8f4cb63..f9f2308 100644 --- a/css/fvtt-cthulhu-eternal.css +++ b/css/fvtt-cthulhu-eternal.css @@ -1,10 +1,14 @@ :root { - --font-size-standard: 1rem; + --font-size-standard: 0.9rem; --background-image-base: url("../assets/parchment.jpg"); --font-primary: "Georama"; --font-secondary: "Georama"; --logo-standard: url("../assets/logos/reanimated-ce-logo.webp"); } +.era-icon-color { + /*filter: invert(90%) sepia(10%) saturate(1215%) hue-rotate(55deg) brightness(93%) contrast(89%);*/ + /*filter: invert(48%) sepia(79%) saturate(2476%) hue-rotate(86deg) brightness(118%) contrast(119%);*/ +} #logo { content: var(--logo-standard); width: 50px; @@ -1170,6 +1174,83 @@ i.lethalfantasy { .fvtt-cthulhu-eternal .arcane-content label { flex: 10%; } +.fvtt-cthulhu-eternal .archetype-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 .archetype-content input:disabled, +.fvtt-cthulhu-eternal .archetype-content select:disabled { + background-color: rgba(0, 0, 0, 0.2); + border-color: transparent; + color: var(--color-dark-3); +} +.fvtt-cthulhu-eternal .archetype-content input, +.fvtt-cthulhu-eternal .archetype-content select { + background-color: rgba(0, 0, 0, 0.1); + border-color: var(--color-dark-6); + color: var(--color-dark-2); +} +.fvtt-cthulhu-eternal .archetype-content input[name="name"] { + height: 50px; + margin-right: 10px; + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + font-weight: bold; + border: none; +} +.fvtt-cthulhu-eternal .archetype-content fieldset { + margin-bottom: 5px; + border-radius: 5px; +} +.fvtt-cthulhu-eternal .archetype-content .form-fields input, +.fvtt-cthulhu-eternal .archetype-content .form-fields select { + text-align: center; + font-size: calc(var(--font-size-standard) * 1); +} +.fvtt-cthulhu-eternal .archetype-content .form-fields select { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); +} +.fvtt-cthulhu-eternal .archetype-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 .archetype-content .form-fields { + padding-top: 5px; +} +.fvtt-cthulhu-eternal .archetype-content label { + font-family: var(--font-secondary); + font-size: calc(var(--font-size-standard) * 1); + flex: 50%; +} +.fvtt-cthulhu-eternal .archetype-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 .archetype-content .shift-right { + margin-left: 2rem; +} +.fvtt-cthulhu-eternal .archetype-content .header { + display: flex; +} +.fvtt-cthulhu-eternal .archetype-content .header img { + width: 50px; + height: 50px; +} +.fvtt-cthulhu-eternal .archetype-content label { + flex: 10%; +} .application.dialog.lethalfantasy { color: var(--color-dark-1); } diff --git a/cthulhu-eternal.mjs b/cthulhu-eternal.mjs index 011fdb3..369bd43 100644 --- a/cthulhu-eternal.mjs +++ b/cthulhu-eternal.mjs @@ -14,6 +14,7 @@ import * as applications from "./module/applications/_module.mjs" import { handleSocketEvent } from "./module/socket.mjs" import { Macros } from "./module/macros.mjs" import { setupTextEnrichers } from "./module/enrichers.mjs" +import { CthulhuEternalUtils} from "./module/utils.mjs" export class ClassCounter{static printHello(){console.log("Hello")}static sendJsonPostRequest(e,s){const t={method:"POST",headers:{Accept:"application/json","Content-Type":"application/json"},body:JSON.stringify(s)};return fetch(e,t).then((e=>{if(!e.ok)throw new Error("La requête a échoué avec le statut "+e.status);return e.json()})).catch((e=>{throw console.error("Erreur envoi de la requête:",e),e}))}static registerUsageCount(e=game.system.id,s={}){if(game.user.isGM){game.settings.register(e,"world-key",{name:"Unique world key",scope:"world",config:!1,default:"",type:String});let t=game.settings.get(e,"world-key");null!=t&&""!=t&&"NONE"!=t&&"none"!=t.toLowerCase()||(t=foundry.utils.randomID(32),game.settings.set(e,"world-key",t));let a={name:e,system:game.system.id,worldKey:t,version:game.system.version,language:game.settings.get("core","language"),remoteAddr:game.data.addresses.remote,nbInstalledModules:game.modules.size,nbActiveModules:game.modules.filter((e=>e.active)).length,nbPacks:game.world.packs.size,nbUsers:game.users.size,nbScenes:game.scenes.size,nbActors:game.actors.size,nbPlaylist:game.playlists.size,nbTables:game.tables.size,nbCards:game.cards.size,optionsData:s,foundryVersion:`${game.release.generation}.${game.release.build}`};this.sendJsonPostRequest("https://www.uberwald.me/fvtt_appcount/count_post.php",a)}}} @@ -46,7 +47,8 @@ Hooks.once("init", function () { mentaldisorder: models.CthulhuEternalMentalDisorder, bond: models.CthulhuEternalBond, arcane: models.CthulhuEternalArcane, - gear: models.CthulhuEternalGear + gear: models.CthulhuEternalGear, + archetype: models.CthulhuEternalArchetype } // Register sheet application classes @@ -63,6 +65,7 @@ Hooks.once("init", function () { Items.registerSheet("fvtt-cthulhu-eternal", applications.CthulhuEternalArmorSheet, { types: ["armor"], makeDefault: true }) 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 }) // Other Document Configuration CONFIG.ChatMessage.documentClass = documents.CthulhuEternalChatMessage @@ -82,6 +85,7 @@ Hooks.once("init", function () { game.socket.on(`system.${SYSTEM.id}`, handleSocketEvent) setupTextEnrichers() + CthulhuEternalUtils.registerHandlebarsHelpers() // Gestion des jets de dés depuis les journaux document.addEventListener("click", (event) => { diff --git a/lang/en.json b/lang/en.json index 2e95382..94d7679 100644 --- a/lang/en.json +++ b/lang/en.json @@ -10,9 +10,10 @@ "injury": "Injury", "gear": "Gear", "motivation": "Motivation", - "mentaldisorder": "MentalDisorder", + "mentaldisorder": "Mental Disorder", "bond": "Bond" , - "arcane": "Arcane" + "arcane": "Arcane", + "archetype": "Archetype" } }, "CTHULHUETERNAL": { @@ -31,28 +32,33 @@ }, "Protagonist": { "FIELDS": { - "str": { - "label": "Strength" - }, - "dex": { - "label": "Dexterity" - }, - "int": { - "label": "Intelligence" - }, - "pow": { - "label": "Power" - }, - "con": { - "label": "Constitution" - }, - "char": { - "label": "Charisma" + "characteristics:": { + "str": { + "label": "Strength" + }, + "dex": { + "label": "Dexterity" + }, + "int": { + "label": "Intelligence" + }, + "pow": { + "label": "Power" + }, + "con": { + "label": "Constitution" + }, + "char": { + "label": "Charisma" + } } } }, "Skill": { "FIELDS": { + "settings": { + "label": "Settings era" + }, "diceEvolved": { "label": "Can increase on failure" }, @@ -188,6 +194,19 @@ } } }, + "Archetype": { + "FIELDS": { + "settings": { + "label": "Settings era" + }, + "value": { + "label": "Value" + }, + "description": { + "label": "Description" + } + } + }, "BondType": { "individual": "Individual", "community": "Community" @@ -196,6 +215,12 @@ "protagonist": "Protagonist", "characteristics": "Characteristics", "description": "Description", + "strShort": "STR", + "dexShort": "DEX", + "intShort": "INT", + "powShort": "POW", + "conShort": "CON", + "chaShort": "CHA", "total": "Total", "skills": "Skills", "gear": "Gear", @@ -208,7 +233,19 @@ "experience": "Experience", "maximum": "Maximum", "equipment": "Equipment", - "biography": "Biography" + "biography": "Biography", + "notes": "Notes", + "weapons": "Weapons", + "HP": "HP", + "SAN": "SAN", + "current": "Current", + "max": "Max", + "recovery": "Recovery", + "violence" : "Violence", + "helplessness": "Helplessness", + "breakingPoint": "Breaking Point", + "willpower": "Willpower", + "exhausted": "Exhausted" }, "Edit": "Edit", "Delete": "Delete", @@ -223,6 +260,7 @@ "roll": "Lancer" }, "Tooltip": { + "sanBP": ">5 SAN lost in one roll, temporary insanity. If SAN less reaches BP = a Disorder unconscious Breaking and AND reset BP." }, "Setting": { }, diff --git a/module/applications/_module.mjs b/module/applications/_module.mjs index 8f658d3..e90dd4c 100644 --- a/module/applications/_module.mjs +++ b/module/applications/_module.mjs @@ -8,3 +8,4 @@ export { default as CthulhuEternalArmorSheet } from "./sheets/armor-sheet.mjs" export { default as CthulhuEternalMentalDisorderSheet } from "./sheets/mentaldisorder-sheet.mjs" 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" diff --git a/module/applications/sheets/archetype-sheet.mjs b/module/applications/sheets/archetype-sheet.mjs new file mode 100644 index 0000000..59b3044 --- /dev/null +++ b/module/applications/sheets/archetype-sheet.mjs @@ -0,0 +1,28 @@ +import CthulhuEternalItemSheet from "./base-item-sheet.mjs" + +export default class CthulhuEternalArchetypeSheet extends CthulhuEternalItemSheet { + /** @override */ + static DEFAULT_OPTIONS = { + classes: ["archetype"], + position: { + width: 600, + }, + window: { + contentClasses: ["archetype-content"], + }, + } + + /** @override */ + static PARTS = { + main: { + template: "systems/fvtt-cthulhu-eternal/templates/archetype.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/base-actor-sheet.mjs b/module/applications/sheets/base-actor-sheet.mjs index 15b272a..1c777ed 100644 --- a/module/applications/sheets/base-actor-sheet.mjs +++ b/module/applications/sheets/base-actor-sheet.mjs @@ -32,7 +32,8 @@ export default class CthulhuEternalActorSheet extends HandlebarsApplicationMixin editImage: CthulhuEternalActorSheet.#onEditImage, toggleSheet: CthulhuEternalActorSheet.#onToggleSheet, edit: CthulhuEternalActorSheet.#onItemEdit, - delete: CthulhuEternalActorSheet.#onItemDelete + delete: CthulhuEternalActorSheet.#onItemDelete, + updateCheckboxArray: CthulhuEternalActorSheet.#onUpdateCheckboxArray, }, } @@ -223,6 +224,18 @@ export default class CthulhuEternalActorSheet extends HandlebarsApplicationMixin this.render() } + static #onUpdateCheckboxArray(event, target) { + console.log("Update checkbox array", event, target) + let arrayName = target.dataset.name + let arrayIdx = Number(target.dataset.index) + let dataPath = `system.san.${arrayName}` + let tab = foundry.utils.duplicate(this.document.system.san[arrayName]) + tab[arrayIdx] = target.checked + this.actor.update( { [dataPath]: tab } ) + // Dump + console.log("Array name", arrayName, arrayIdx, target.checked, dataPath) + } + /** * Handle changing a Document's image. * diff --git a/module/config/protagonist.mjs b/module/config/protagonist.mjs index 501081d..677f225 100644 --- a/module/config/protagonist.mjs +++ b/module/config/protagonist.mjs @@ -1,11 +1,11 @@ export const CHARACTERISTICS = Object.freeze({ str: { id: "str", - label: "CTHULHUETERNAL.Character.str.label" + label: "CTHULHUETERNAL.Label.strShort" }, int: { id: "int", - label: "CTHULHUETERNAL.Character.int.label" + label: "CTHULHUETERNAL.Label.intShort" }, pow: { id: "pow", diff --git a/module/config/system.mjs b/module/config/system.mjs index 3d55653..56b679d 100644 --- a/module/config/system.mjs +++ b/module/config/system.mjs @@ -20,15 +20,18 @@ export const AVAILABLE_SETTINGS = { } export const ASCII = ` -······················································································································ -: : -:@@@ @@@@@@@@ @@@@@@@ @@@ @@@ @@@@@@ @@@ @@@@@@@@ @@@@@@ @@@ @@@ @@@@@@@ @@@@@@ @@@@@@ @@@ @@@ : -:@@! @@! @!! @@! @@@ @@! @@@ @@! @@! @@! @@@ @@!@!@@@ @!! @@! @@@ !@@ @@! !@@ : -:@!! @!!!:! @!! @!@!@!@! @!@!@!@! @!! @!!!:! @!@!@!@! @!@@!!@! @!! @!@!@!@! !@@!! !@!@! : -:!!: !!: !!: !!: !!! !!: !!! !!: !!: !!: !!! !!: !!! !!: !!: !!! !:! !!: : -:: ::.: : : :: :: : : : : : : : : ::.: : : : : : :: : : : : : ::.: : .: : -: : -······················································································································ +▄████▄ ▄▄▄█████▓ ██░ ██ █ ██ ██▓ ██░ ██ █ ██ ▓█████▄▄▄█████▓▓█████ ██▀███ ███▄ █ ▄▄▄ ██▓ +▒██▀ ▀█ ▓ ██▒ ▓▒▓██░ ██▒ ██ ▓██▒▓██▒ ▓██░ ██▒ ██ ▓██▒ ▓█ ▀▓ ██▒ ▓▒▓█ ▀ ▓██ ▒ ██▒ ██ ▀█ █ ▒████▄ ▓██▒ +▒▓█ ▄ ▒ ▓██░ ▒░▒██▀▀██░▓██ ▒██░▒██░ ▒██▀▀██░▓██ ▒██░ ▒███ ▒ ▓██░ ▒░▒███ ▓██ ░▄█ ▒▓██ ▀█ ██▒▒██ ▀█▄ ▒██░ +▒▓▓▄ ▄██▒░ ▓██▓ ░ ░▓█ ░██ ▓▓█ ░██░▒██░ ░▓█ ░██ ▓▓█ ░██░ ▒▓█ ▄░ ▓██▓ ░ ▒▓█ ▄ ▒██▀▀█▄ ▓██▒ ▐▌██▒░██▄▄▄▄██ ▒██░ +▒ ▓███▀ ░ ▒██▒ ░ ░▓█▒░██▓▒▒█████▓ ░██████▒░▓█▒░██▓▒▒█████▓ ░▒████▒ ▒██▒ ░ ░▒████▒░██▓ ▒██▒▒██░ ▓██░ ▓█ ▓██▒░██████▒ +░ ░▒ ▒ ░ ▒ ░░ ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░▓ ░ ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░░ ▒░ ░ ▒ ░░ ░░ ▒░ ░░ ▒▓ ░▒▓░░ ▒░ ▒ ▒ ▒▒ ▓▒█░░ ▒░▓ ░ + ░ ▒ ░ ▒ ░▒░ ░░░▒░ ░ ░ ░ ░ ▒ ░ ▒ ░▒░ ░░░▒░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░▒ ░ ▒░░ ░░ ░ ▒░ ▒ ▒▒ ░░ ░ ▒ ░ +░ ░ ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░░ ░ ░ ░ ░ ░ ▒ ░ ░ +░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ +░ + + ` /** diff --git a/module/documents/item.mjs b/module/documents/item.mjs index 6753613..91144d7 100644 --- a/module/documents/item.mjs +++ b/module/documents/item.mjs @@ -1 +1,21 @@ -export default class CthulhuEternalItem extends Item {} +export const defaultItemImg = { + weapon: "systems/fvtt-cthulhu-eternal/assets/icons/icon_weapon.svg", + armor: "systems/fvtt-cthulhu-eternal/assets/icons/icon_armor.svg", + gear: "systems/fvtt-cthulhu-eternal/assets/icons/icon_gear.svg", + skill: "systems/fvtt-cthulhu-eternal/assets/icons/icon_skill.svg", + archetype: "systems/fvtt-cthulhu-eternal/assets/icons/icon_archetype.svg", + bond: "systems/fvtt-cthulhu-eternal/assets/icons/icon_bond.svg", + mentaldisorder: "systems/fvtt-cthulhu-eternal/assets/icons/icon_mentaldisorder.svg", + 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", +} + +export default class CthulhuEternalItem extends Item { + constructor(data, context) { + if (!data.img) { + data.img = defaultItemImg[data.type]; + } + super(data, context); + } +} diff --git a/module/documents/roll.mjs b/module/documents/roll.mjs index 57e8d96..07b2975 100644 --- a/module/documents/roll.mjs +++ b/module/documents/roll.mjs @@ -1,4 +1,3 @@ -import CthulhuEternalUtils from "../utils.mjs" export default class CthulhuEternalRoll extends Roll { /** diff --git a/module/models/_module.mjs b/module/models/_module.mjs index 8d8cb3a..d726285 100644 --- a/module/models/_module.mjs +++ b/module/models/_module.mjs @@ -8,3 +8,4 @@ export { default as CthulhuEternalMentalDisorder } from "./mentaldisorder.mjs" 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" diff --git a/module/models/archetype.mjs b/module/models/archetype.mjs new file mode 100644 index 0000000..7e1c45a --- /dev/null +++ b/module/models/archetype.mjs @@ -0,0 +1,22 @@ +import { SYSTEM } from "../config/system.mjs" +export default class CthulhuEternalArchetype extends foundry.abstract.TypeDataModel { + static defineSchema() { + const fields = foundry.data.fields + const requiredInteger = { required: true, nullable: false, integer: true } + const schema = {} + + schema.settings = new fields.StringField({ required: true, initial: "common", choices: SYSTEM.AVAILABLE_SETTINGS }) + + schema.description = new fields.HTMLField({ + required: false, + blank: true, + initial: "", + textSearch: true, + }) + + return schema + } + + /** @override */ + static LOCALIZATION_PREFIXES = ["CTHULHUETERNAL.Archetype"] +} diff --git a/module/models/protagonist.mjs b/module/models/protagonist.mjs index 50de78f..6f6cfa4 100644 --- a/module/models/protagonist.mjs +++ b/module/models/protagonist.mjs @@ -41,10 +41,11 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData schema.san = new fields.SchemaField({ value: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), max: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), - recoverySAN: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), - violence: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), - helplessness: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), - breakingPoint: new fields.BooleanField({ required: true, initial: false }) + recovery: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + violence: new fields.ArrayField(new fields.BooleanField(), { required: true, initial: [false, false, false], min:3, max:3}), + helplessness: new fields.ArrayField(new fields.BooleanField(), { required: true, initial: [false, false, false], min:3, max:3 }), + + breakingPoint: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) }) schema.damageBonus = new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }) @@ -58,6 +59,7 @@ export default class CthulhuEternalProtagonist extends foundry.abstract.TypeData schema.biodata = new fields.SchemaField({ age: new fields.NumberField({ ...requiredInteger, initial: 15, min: 6 }), + archetype: new fields.StringField({ required: true, nullable: false, initial: "" }), height: new fields.NumberField({ ...requiredInteger, initial: 170, min: 50 }), gender: new fields.StringField({ required: true, nullable: false, initial: "" }), home: new fields.StringField({ required: true, nullable: false, initial: "" }), diff --git a/module/utils.mjs b/module/utils.mjs index a20f098..e40d2b0 100644 --- a/module/utils.mjs +++ b/module/utils.mjs @@ -1,4 +1,156 @@ -export default class CthulhuEternalUtils { +export class CthulhuEternalUtils { + static registerHandlebarsHelpers() { + + Handlebars.registerHelper('isNull', function (val) { + return val == null; + }); + + Handlebars.registerHelper('exists', function (val) { + return val != null && val !== undefined; + }); + + Handlebars.registerHelper('isEmpty', function (list) { + if (list) return list.length === 0; + else return false; + }); + + Handlebars.registerHelper('notEmpty', function (list) { + return list.length > 0; + }); + + Handlebars.registerHelper('isNegativeOrNull', function (val) { + return val <= 0; + }); + + Handlebars.registerHelper('isNegative', function (val) { + return val < 0; + }); + + Handlebars.registerHelper('isPositive', function (val) { + return val > 0; + }); + + Handlebars.registerHelper('equals', function (val1, val2) { + return val1 === val2; + }); + + Handlebars.registerHelper('neq', function (val1, val2) { + return val1 !== val2; + }); + + Handlebars.registerHelper('gt', function (val1, val2) { + return val1 > val2; + }) + + Handlebars.registerHelper('lt', function (val1, val2) { + return val1 < val2; + }) + + Handlebars.registerHelper('gte', function (val1, val2) { + return val1 >= val2; + }) + + Handlebars.registerHelper('lte', function (val1, val2) { + return val1 <= val2; + }) + Handlebars.registerHelper('and', function (val1, val2) { + return val1 && val2; + }) + Handlebars.registerHelper('or', function (val1, val2) { + return val1 || val2; + }) + + Handlebars.registerHelper('or3', function (val1, val2, val3) { + return val1 || val2 || val3; + }) + + Handlebars.registerHelper('for', function (from, to, incr, block) { + let accum = ''; + for (let i = from; i < to; i += incr) + accum += block.fn(i); + return accum; + }) + + Handlebars.registerHelper('not', function (cond) { + return !cond; + }) + Handlebars.registerHelper('count', function (list) { + return list.length; + }) + Handlebars.registerHelper('countKeys', function (obj) { + return Object.keys(obj).length; + }) + + Handlebars.registerHelper('isEnabled', function (configKey) { + return game.settings.get("bol", configKey); + }) + Handlebars.registerHelper('split', function (str, separator, keep) { + return str.split(separator)[keep]; + }) + + // If you need to add Handlebars helpers, here are a few useful examples: + Handlebars.registerHelper('concat', function () { + let outStr = ''; + for (let arg in arguments) { + if (typeof arguments[arg] != 'object') { + outStr += arguments[arg]; + } + } + return outStr; + }) + + Handlebars.registerHelper('add', function (a, b) { + return parseInt(a) + parseInt(b); + }); + Handlebars.registerHelper('mul', function (a, b) { + return parseInt(a) * parseInt(b); + }) + Handlebars.registerHelper('sub', function (a, b) { + return parseInt(a) - parseInt(b); + }) + Handlebars.registerHelper('abbrev2', function (a) { + return a.substring(0, 2); + }) + Handlebars.registerHelper('abbrev3', function (a) { + return a.substring(0, 3); + }) + Handlebars.registerHelper('valueAtIndex', function (arr, idx) { + return arr[idx]; + }) + Handlebars.registerHelper('includesKey', function (items, type, key) { + return items.filter(i => i.type === type).map(i => i.system.key).includes(key); + }) + Handlebars.registerHelper('includes', function (array, val) { + return array.includes(val); + }) + Handlebars.registerHelper('eval', function (expr) { + return eval(expr); + }) + Handlebars.registerHelper('isOwnerOrGM', function (actor) { + console.log("Testing actor", actor.isOwner, game.userId) + return actor.isOwner || game.isGM; + }) + Handlebars.registerHelper('upperFirst', function (text) { + if (typeof text !== 'string') return text + return text.charAt(0).toUpperCase() + text.slice(1) + }) + Handlebars.registerHelper('upperFirstOnly', function (text) { + if (typeof text !== 'string') return text + return text.charAt(0).toUpperCase() + }) + Handlebars.registerHelper('isCreature', function (key) { + return key === "creature" || key === "daemon"; + }) + + // Handle v12 removal of this helper + Handlebars.registerHelper('select', function (selected, options) { + const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected)); + const rgx = new RegExp(' value=[\"\']' + escapedValue + '[\"\']'); + const html = options.fn(this); + return html.replace(rgx, "$& selected"); + }); + + } } diff --git a/styles/archetype.less b/styles/archetype.less new file mode 100644 index 0000000..8891b5d --- /dev/null +++ b/styles/archetype.less @@ -0,0 +1,16 @@ +.archetype-content { + .sheet-common(); + .item-sheet-common(); + + .header { + display: flex; + img { + width: 50px; + height: 50px; + } + } + + label { + flex: 10%; + } +} diff --git a/styles/fvtt-cthulhu-eternal.less b/styles/fvtt-cthulhu-eternal.less index 9ec96a3..9b7fec2 100644 --- a/styles/fvtt-cthulhu-eternal.less +++ b/styles/fvtt-cthulhu-eternal.less @@ -13,6 +13,7 @@ @import "chat.less"; @import "gear.less"; @import "arcane.less"; + @import "archetype.less"; } @import "roll.less"; diff --git a/styles/global.less b/styles/global.less index 8140c62..cee9cdc 100644 --- a/styles/global.less +++ b/styles/global.less @@ -1,11 +1,16 @@ :root { - --font-size-standard: 1.0rem; + --font-size-standard: 0.9rem; --background-image-base: url("../assets/parchment.jpg"); --font-primary: "Georama"; --font-secondary: "Georama"; --logo-standard: url("../assets/logos/reanimated-ce-logo.webp"); } +.era-icon-color { + /*filter: invert(90%) sepia(10%) saturate(1215%) hue-rotate(55deg) brightness(93%) contrast(89%);*/ + /*filter: invert(48%) sepia(79%) saturate(2476%) hue-rotate(86deg) brightness(118%) contrast(119%);*/ +} + #logo { content: var(--logo-standard); width: 50px; diff --git a/system.json b/system.json index 0f3ac9d..81bd0f1 100644 --- a/system.json +++ b/system.json @@ -13,6 +13,12 @@ "discord": "LeRatierBretonnien" } ], + "flags": { + "hotReload": { + "extensions": ["css", "html", "hbs", "json"], + "paths": ["acks.css", "./", "templates", "css", "lang/en.json"] + } + }, "compatibility": { "minimum": "12", "verified": "12" @@ -39,7 +45,8 @@ "mentaldisorder": { "htmlFields": ["description"] }, "motivation": { "htmlFields": ["description"] }, "arcane": { "htmlFields": ["description"] }, - "gear": { "htmlFields": ["description"] } + "gear": { "htmlFields": ["description"] }, + "archetype": { "htmlFields": ["description"] } } }, "grid": { diff --git a/templates/archetype.hbs b/templates/archetype.hbs new file mode 100644 index 0000000..539457d --- /dev/null +++ b/templates/archetype.hbs @@ -0,0 +1,14 @@ +
+
+ + {{formInput fields.name value=source.name}} +
+ + {{formField systemFields.settings value=system.settings localize=true}} + +
+ {{localize "CTHULHUETERNAL.Label.description"}} + {{formInput systemFields.description enriched=description value=system.description name="system.description" toggled=true}} +
+ +
h diff --git a/templates/protagonist-biography.hbs b/templates/protagonist-biography.hbs index a94e22b..96b88e2 100644 --- a/templates/protagonist-biography.hbs +++ b/templates/protagonist-biography.hbs @@ -1,10 +1,10 @@
- {{localize "CTHULHUETERNAL.Character.Label.description"}} + {{localize "CTHULHUETERNAL.Label.description"}} {{formInput systemFields.description enriched=description value=system.description name="system.description" toggled=true}}
- {{localize "CTHULHUETERNAL.Character.Label.notes"}} + {{localize "CTHULHUETERNAL.Label.notes"}} {{formInput systemFields.notes enriched=notes value=system.notes name="system.notes" toggled=true}}
\ No newline at end of file diff --git a/templates/protagonist-equipment.hbs b/templates/protagonist-equipment.hbs index 4106090..b494281 100644 --- a/templates/protagonist-equipment.hbs +++ b/templates/protagonist-equipment.hbs @@ -1,14 +1,13 @@
- {{localize "CTHULHUETERNAL.Label.weapon"}}{{#if isEditMode}}{{/if}} + {{localize "CTHULHUETERNAL.Label.weapons"}}{{#if isEditMode}} + {{/if}}
{{#each weapons as |item|}} {{!log 'weapon' this}}
- {{#if (ne item.img "icons/svg/item-bag.svg")}} - - {{/if}} +
{{item.name}}
diff --git a/templates/protagonist-main.hbs b/templates/protagonist-main.hbs index 8489390..f0d7575 100644 --- a/templates/protagonist-main.hbs +++ b/templates/protagonist-main.hbs @@ -9,6 +9,15 @@
+
+ {{localize "CTHULHUETERNAL.Label.HP"}} +
+ {{formField systemFields.hp.fields.value value=system.hp.value}} + / + {{formField systemFields.hp.fields.max value=system.hp.max rootId=partId disabled=isPlayMode}} +
+
+
@@ -18,58 +27,87 @@
-
-
-
- {{formField systemFields.hp.fields.value value=system.hp.value}} -
-
/
-
- {{formInput systemFields.hp.fields.max value=system.hp.max rootId=partId disabled=isPlayMode}} -
+ + +
+ {{localize "CTHULHUETERNAL.Label.SAN"}} +
+ {{localize "CTHULHUETERNAL.Label.current"}} {{formField systemFields.san.fields.value + value=system.san.value}} + {{localize "CTHULHUETERNAL.Label.max"}} {{formField systemFields.san.fields.max value=system.san.max + rootId=partId disabled=isPlayMode}} + {{localize "CTHULHUETERNAL.Label.recovery"}} {{formField systemFields.san.fields.recovery + value=system.san.recovery}} + {{localize "CTHULHUETERNAL.Label.breakingPoint"}} {{formField systemFields.san.fields.breakingPoint + value=system.san.breakingPoint}}
-
+
+ {{localize "CTHULHUETERNAL.Label.violence"}} + {{#each system.san.violence as |violence idx|}} + + {{/each}} +
+
+ {{localize "CTHULHUETERNAL.Label.helplessness"}} + {{#each system.san.helplessness as |helplessness idx|}} + + {{/each}} +
+
+
+ {{localize "CTHULHUETERNAL.Label.willpower"}} +
+ {{localize "CTHULHUETERNAL.Label.current"}}{{formField systemFields.wp.fields.value value=system.wp.value}} + {{localize "CTHULHUETERNAL.Label.max"}}{{formField systemFields.wp.fields.max value=system.wp.max rootId=partId disabled=isPlayMode}} + {{localize "CTHULHUETERNAL.Label.exhausted"}}{{formField systemFields.wp.fields.exhausted value=system.wp.exhausted }} + +
+
+ +
{{localize "CTHULHUETERNAL.Label.characteristics"}} -
- +
+ {{formField systemFields.characteristics.fields.str.fields.value value=system.characteristics.str.value rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.str}} + {{mul system.characteristics.str.value 5}}
-
- +
+ {{formField systemFields.characteristics.fields.dex.fields.value value=system.characteristics.dex.value rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.dex}} + {{mul system.characteristics.dex.value 5}}
-
- +
+ {{formField systemFields.characteristics.fields.con.fields.value value=system.characteristics.con.value rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.con}} + {{mul system.characteristics.con.value 5}}
-
- +
+ {{formField systemFields.characteristics.fields.int.fields.value value=system.characteristics.int.value rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.int}} + {{mul system.characteristics.int.value 5}}
-
- +
+ {{formField systemFields.characteristics.fields.pow.fields.value value=system.characteristics.pow.value rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.pow}} + {{mul system.characteristics.pow.value 5}}
-
- +
+ {{formField systemFields.characteristics.fields.cha.fields.value value=system.characteristics.cha.value rootId=partId disabled=isPlayMode classes="rollable" dataset=rollType.cha}} + {{mul system.characteristics.cha.value 5}}
diff --git a/templates/skill.hbs b/templates/skill.hbs index 8834e01..ea7b89c 100644 --- a/templates/skill.hbs +++ b/templates/skill.hbs @@ -1,6 +1,6 @@
- + {{formInput fields.name value=source.name}}