From 57706629e1c5e4b9f9d90ef1beda9fd93e737e42 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Sun, 25 May 2025 18:39:57 +0200 Subject: [PATCH] Add Enemy sheet --- css/fvtt-hellborn.css | 104 ++++++++++++--- lang/en.json | 12 ++ .../applications/sheets/character-sheet.mjs | 4 + module/applications/sheets/enemy-sheet.mjs | 26 +++- module/models/enemy.mjs | 2 + module/utils.mjs | 20 +-- styles/enemy.less | 102 +++++++++++--- styles/roll.less | 5 + templates/character-equipment.hbs | 8 +- templates/character-status.hbs | 2 +- templates/chat-malefica.hbs | 13 +- templates/chat-perk.hbs | 8 +- templates/chat-ritual.hbs | 12 +- templates/enemy-trait.hbs | 125 +++++++++++++----- 14 files changed, 346 insertions(+), 97 deletions(-) diff --git a/css/fvtt-hellborn.css b/css/fvtt-hellborn.css index 5d60b5d..0a1de13 100644 --- a/css/fvtt-hellborn.css +++ b/css/fvtt-hellborn.css @@ -1173,6 +1173,14 @@ i.fvtt-hellborn { font-size: calc(var(--font-size-standard) * 1.4); padding-left: 5px; } +.fvtt-hellborn .tab.enemy-traits .main-div .enemy-column { + display: flex; + flex-direction: row; + gap: 4px; +} +.fvtt-hellborn .tab.enemy-traits .main-div .enemy-column fieldset { + width: 100%; +} .fvtt-hellborn .tab.enemy-traits .main-div .mortality { display: flex; align-items: center; @@ -1196,6 +1204,14 @@ i.fvtt-hellborn { color: grey; font-size: small; } +.fvtt-hellborn .tab.enemy-traits .main-div .counters .characteristics-label label { + min-width: 3.5rem; + max-width: 3.5rem; +} +.fvtt-hellborn .tab.enemy-traits .main-div .counters .characteristics-label span { + min-width: 3rem; + max-width: 3rem; +} .fvtt-hellborn .tab.enemy-traits .main-div .counters label { min-width: 4rem; max-width: 4rem; @@ -1217,8 +1233,8 @@ i.fvtt-hellborn { align-items: center; gap: 4px; margin-left: 4px; - min-width: 20rem; - max-width: 20rem; + min-width: 12rem; + max-width: 12rem; } .fvtt-hellborn .tab.enemy-traits .main-div .traits .trait .rollable:hover, .fvtt-hellborn .tab.enemy-traits .main-div .traits .trait .rollable:focus { @@ -1230,27 +1246,78 @@ i.fvtt-hellborn { min-width: 1.8rem; max-width: 1.8rem; } -.fvtt-hellborn .tab.enemy-traits .main-div .traits .trait .flavor { - min-width: 24rem; - max-width: 24rem; -} -.fvtt-hellborn .tab.enemy-traits .main-div .traits .trait .role { - min-width: 5rem; - max-width: 5rem; -} -.fvtt-hellborn .tab.enemy-traits .main-div .traits .trait .level { - min-width: 4rem; - max-width: 4rem; -} .fvtt-hellborn .tab.enemy-traits .main-div .traits .trait .name { - min-width: 10rem; - max-width: 10rem; + min-width: 18rem; + max-width: 18rem; } .fvtt-hellborn .tab.enemy-traits .main-div .traits .trait .item-img { width: 24px; height: 24px; margin: 4px 0 0 0; } +.fvtt-hellborn .tab.enemy-traits .main-div .equipments { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 4px; +} +.fvtt-hellborn .tab.enemy-traits .main-div .equipments .equipment { + display: flex; + align-items: center; + gap: 4px; + min-width: 13rem; + max-width: 13rem; +} +.fvtt-hellborn .tab.enemy-traits .main-div .equipments .equipment .rollable:hover, +.fvtt-hellborn .tab.enemy-traits .main-div .equipments .equipment .rollable:focus { + text-shadow: 0 0 8px var(--color-shadow-primary); + cursor: pointer; +} +.fvtt-hellborn .tab.enemy-traits .main-div .equipments .equipment .controls { + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; +} +.fvtt-hellborn .tab.enemy-traits .main-div .equipments .equipment .name { + min-width: 12rem; + max-width: 12rem; +} +.fvtt-hellborn .tab.enemy-traits .main-div .equipments .equipment .item-img { + width: 24px; + height: 24px; + margin: 4px 0 0 0; +} +.fvtt-hellborn .tab.enemy-traits .main-div .maleficas { + display: grid; + grid-template-columns: repeat(1, 1fr); + gap: 4px; +} +.fvtt-hellborn .tab.enemy-traits .main-div .maleficas .malefica { + display: flex; + align-items: center; + gap: 4px; + margin-left: 4px; + min-width: 12rem; + max-width: 12rem; +} +.fvtt-hellborn .tab.enemy-traits .main-div .maleficas .malefica .rollable:hover, +.fvtt-hellborn .tab.enemy-traits .main-div .maleficas .malefica .rollable:focus { + text-shadow: 0 0 8px var(--color-shadow-primary); + cursor: pointer; +} +.fvtt-hellborn .tab.enemy-traits .main-div .maleficas .malefica .controls { + font-size: 0.7rem; + min-width: 1.8rem; + max-width: 1.8rem; +} +.fvtt-hellborn .tab.enemy-traits .main-div .maleficas .malefica .name { + min-width: 18rem; + max-width: 18rem; +} +.fvtt-hellborn .tab.enemy-traits .main-div .maleficas .malefica .item-img { + width: 24px; + height: 24px; + margin: 4px 0 0 0; +} .fvtt-hellborn .tab.enemy-traits .main-div .weapons { display: grid; grid-template-columns: repeat(1, 1fr); @@ -2269,6 +2336,11 @@ i.fvtt-hellborn { font-size: calc(var(--font-size-standard) * 2); color: var(--color-dark-1); } +.item-to-chat h2 { + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.4); + color: var(--title-color); +} .item-to-chat ul { list-style-type: none; padding: 0; diff --git a/lang/en.json b/lang/en.json index be75bef..fd0f7af 100644 --- a/lang/en.json +++ b/lang/en.json @@ -343,6 +343,18 @@ } }, "Label": { + "addArmor": "Add Armor", + "addPerk": "Add Perk", + "addRitual": "Add Ritual", + "addSpeciesTrait": "Add Trait", + "addTarot": "Add Tarot", + "addMalefica": "Add Malefica", + "addTrait": "Add Trait", + "newMalefica": "New Malefica", + "newPerk": "New Perk", + "newRitual": "New Ritual", + "newSpeciesTrait": "New Trait", + "newTarot": "New Tarot", "titleStat": "Stat Roll Dialog", "difficulty": "Difficulty", "unknown": "Unknown", diff --git a/module/applications/sheets/character-sheet.mjs b/module/applications/sheets/character-sheet.mjs index 8609ac9..ae1eb99 100644 --- a/module/applications/sheets/character-sheet.mjs +++ b/module/applications/sheets/character-sheet.mjs @@ -18,6 +18,7 @@ export default class HellbornCharacterSheet extends HellbornActorSheet { createDeal: HellbornCharacterSheet.#onCreateDeal, createMalefica: HellbornCharacterSheet.#onCreateMalefica, createRitual: HellbornCharacterSheet.#onCreateRitual, + createPerk: HellbornCharacterSheet.#onCreatePerk, }, } @@ -152,6 +153,9 @@ export default class HellbornCharacterSheet extends HellbornActorSheet { this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newArmor"), type: "armor" }]) } + static #onCreatePerk(event, target) { + this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newPerk"), type: "perk" }]) + } /** diff --git a/module/applications/sheets/enemy-sheet.mjs b/module/applications/sheets/enemy-sheet.mjs index 7dcc151..36da7c2 100644 --- a/module/applications/sheets/enemy-sheet.mjs +++ b/module/applications/sheets/enemy-sheet.mjs @@ -13,7 +13,11 @@ export default class HellbornEnemySheet extends HellbornActorSheet { }, actions: { createTrait: HellbornEnemySheet.#onCreateTrait, - }, + createEquipment: HellbornEnemySheet.#onCreateEquipment, + createWeapon: HellbornEnemySheet.#onCreateWeapon, + createMalefica: HellbornEnemySheet.#onCreateMalefica, + } + } /** @override */ @@ -37,6 +41,7 @@ export default class HellbornEnemySheet extends HellbornActorSheet { sheet: "traits", } + /** * Prepare an array of form header tabs. * @returns {Record>} @@ -73,6 +78,10 @@ export default class HellbornEnemySheet extends HellbornActorSheet { context.traits.sort((a, b) => a.name.localeCompare(b.name)) context.weapons = doc.itemTypes.weapon context.weapons.sort((a, b) => a.name.localeCompare(b.name)) + context.maleficas = doc.itemTypes.malefica + context.maleficas.sort((a, b) => a.name.localeCompare(b.name)) + context.equipments = doc.itemTypes.equipment + context.equipments.sort((a, b) => a.name.localeCompare(b.name)) break case "biography": context.tab = context.tabs.biography @@ -89,9 +98,22 @@ export default class HellbornEnemySheet extends HellbornActorSheet { * @param {HTMLElement} target The current target of the event listener. */ static #onCreateTrait(event, target) { - this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newTrait"), type: "trait" }]) + this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newTrait"), type: "species-trait" }]) } + static #onCreateEquipment(event, target) { + this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newEquipment"), type: "equipment" }]) + } + + static #onCreateMalefica(event, target) { + this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newMalefica"), type: "malefica" }]) + } + + static #onCreateWeapon(event, target) { + this.document.createEmbeddedDocuments("Item", [{ name: game.i18n.localize("HELLBORN.Label.newWeapon"), type: "weapon" }]) + } + + /** * Handles the roll action triggered by user interaction. * diff --git a/module/models/enemy.mjs b/module/models/enemy.mjs index 150c2d3..1a666f5 100644 --- a/module/models/enemy.mjs +++ b/module/models/enemy.mjs @@ -47,6 +47,8 @@ export default class HellbornEnemy extends foundry.abstract.TypeDataModel { bonus: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), total: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), resistance: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + maleficDR: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), + resilience: new fields.NumberField({ ...requiredInteger, initial: 0, min: 0 }), }) schema.movement = new fields.SchemaField({ diff --git a/module/utils.mjs b/module/utils.mjs index f9c7d0e..46223ed 100644 --- a/module/utils.mjs +++ b/module/utils.mjs @@ -172,16 +172,16 @@ export default class HellbornUtils { if (level=== "highpowers") return "High"; if (level === "mastery") return "Mastery"; level = parseInt(level); - if (level === 0) return "I"; - if (level === 1) return "II"; - if (level === 2) return "III"; - if (level === 3) return "IV"; - if (level === 4) return "V"; - if (level === 5) return "VI"; - if (level === 6) return "VII"; - if (level === 7) return "VIII"; - if (level === 8) return "IX"; - if (level === 9) return "X"; + if (level === 0) return "0"; + if (level === 1) return "I"; + if (level === 2) return "II"; + if (level === 3) return "III"; + if (level === 4) return "IV"; + if (level === 5) return "V"; + if (level === 6) return "VI"; + if (level === 7) return "VII"; + if (level === 8) return "VIII"; + if (level === 9) return "IX"; return level; }) // Handle v12 removal of this helper diff --git a/styles/enemy.less b/styles/enemy.less index afbc222..39d69ca 100644 --- a/styles/enemy.less +++ b/styles/enemy.less @@ -164,6 +164,14 @@ padding-left: 5px; } } + .enemy-column { + display:flex; + flex-direction: row; + gap: 4px; + fieldset { + width: 100%; + } + } .mortality { display: flex; align-items: center; @@ -186,6 +194,14 @@ .characteristics-label{ color: grey; font-size:small; + label { + min-width: 3.5rem; + max-width: 3.5rem; + } + span { + min-width: 3rem; + max-width: 3rem; + } } label { min-width: 4rem; @@ -208,8 +224,8 @@ align-items: center; gap: 4px; margin-left: 4px; - min-width: 20rem; - max-width: 20rem; + min-width: 12rem; + max-width: 12rem; .rollable:hover, .rollable:focus { text-shadow: 0 0 8px var(--color-shadow-primary); @@ -220,21 +236,9 @@ min-width: 1.8rem; max-width: 1.8rem; } - .flavor { - min-width: 24rem; - max-width: 24rem; - } - .role { - min-width: 5rem; - max-width: 5rem; - } - .level { - min-width: 4rem; - max-width: 4rem; - } .name { - min-width: 10rem; - max-width: 10rem; + min-width: 18rem; + max-width: 18rem; } .item-img { width: 24px; @@ -243,7 +247,71 @@ } } } - .weapons { + .equipments { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 4px; + .equipment { + display: flex; + align-items: center; + gap: 4px; + min-width: 13rem; + max-width: 13rem; + .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: 12rem; + max-width: 12rem; + } + .item-img { + width: 24px; + height: 24px; + margin: 4px 0 0 0; + } + } + } + + .maleficas { + display: grid; + grid-template-columns: repeat(1, 1fr); + gap: 4px; + .malefica { + display: flex; + align-items: center; + gap: 4px; + margin-left: 4px; + min-width: 12rem; + max-width: 12rem; + .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: 18rem; + max-width: 18rem; + } + .item-img { + width: 24px; + height: 24px; + margin: 4px 0 0 0; + } + } + } + .weapons { display: grid; grid-template-columns: repeat(1, 1fr); gap: 4px; diff --git a/styles/roll.less b/styles/roll.less index 319ca0f..eb8aa87 100644 --- a/styles/roll.less +++ b/styles/roll.less @@ -55,6 +55,11 @@ } .item-to-chat { + h2 { + font-family: var(--font-title); + font-size: calc(var(--font-size-standard) * 1.4); + color: var(--title-color); + } ul { list-style-type: none; padding: 0; diff --git a/templates/character-equipment.hbs b/templates/character-equipment.hbs index ea33666..9027352 100644 --- a/templates/character-equipment.hbs +++ b/templates/character-equipment.hbs @@ -3,7 +3,7 @@
{{localize "HELLBORN.Label.weapons"}}{{#if isEditMode}} - {{/if}}
@@ -36,7 +36,7 @@
{{localize "HELLBORN.Label.armors"}}{{#if isEditMode}} - {{/if}}
@@ -63,7 +63,7 @@
{{localize "HELLBORN.Label.equipments"}}{{#if isEditMode}} - {{/if}}
@@ -100,7 +100,7 @@ {{#each system.ammoArray as |ammo key|}}
- + {{upperFirst ammo.label}}
{{/each}} diff --git a/templates/character-status.hbs b/templates/character-status.hbs index e1967f3..036d37d 100644 --- a/templates/character-status.hbs +++ b/templates/character-status.hbs @@ -33,7 +33,7 @@
{{localize "HELLBORN.Label.perks"}}{{#if isEditMode}} - {{/if}}
diff --git a/templates/chat-malefica.hbs b/templates/chat-malefica.hbs index 4b31345..1457922 100644 --- a/templates/chat-malefica.hbs +++ b/templates/chat-malefica.hbs @@ -1,12 +1,13 @@
+

{{name}}

+
    -
  • Malefica : {{name}}
  • -
  • Domain : {{system.domain}}
  • -
  • Level : {{system.level}}
  • -
  • Time : {{system.time}}
  • -
  • Range : {{system.range}}
  • -
  • Target : {{system.target}}
  • +
  • Domain : {{upperFirst system.domain}}
  • +
  • Level : {{getRomanLevel system.level}}
  • +
  • Time : {{system.time}}
  • +
  • Range : {{system.range}}
  • +
  • Target : {{system.target}}
  • {{{system.description}}}
diff --git a/templates/chat-perk.hbs b/templates/chat-perk.hbs index de5a196..a83f5d5 100644 --- a/templates/chat-perk.hbs +++ b/templates/chat-perk.hbs @@ -1,10 +1,10 @@
+

{{name}}

    -
  • Perk : {{name}}
  • -
  • {{system.flavorText}}
  • -
  • Role : {{system.role}}
  • -
  • Level : {{system.level}}
  • +
  • {{system.flavorText}}
  • +
  • Role : {{upperFirst system.role}}
  • +
  • Level : {{getRomanLevel system.level}}
  • {{{system.description}}}
diff --git a/templates/chat-ritual.hbs b/templates/chat-ritual.hbs index ba5ec5d..c3bbea8 100644 --- a/templates/chat-ritual.hbs +++ b/templates/chat-ritual.hbs @@ -1,12 +1,12 @@
+

{{name}}

    -
  • Ritual : {{name}}
  • -
  • Difficulty : {{system.difficulty}}
  • -
  • Threshold : {{system.threshold}}
  • -
  • Limit : {{system.limit}}
  • -
  • Ingredients : {{system.ingredients}}
  • -
  • N. Attempts : {{system.nbAttempts}}
  • +
  • Difficulty : {{system.difficulty}}
  • +
  • Threshold : {{system.threshold}}
  • +
  • Limit : {{system.limit}}
  • +
  • Ingredients : {{system.ingredients}}
  • +
  • N. Attempts : {{system.nbAttempts}}
  • {{{system.description}}}
diff --git a/templates/enemy-trait.hbs b/templates/enemy-trait.hbs index c7dd039..66d9538 100644 --- a/templates/enemy-trait.hbs +++ b/templates/enemy-trait.hbs @@ -6,53 +6,92 @@
- {{formInput systemFields.trauma.fields.current value=system.trauma.current}} + {{formInput systemFields.trauma.fields.current value=system.trauma.current}} / + {{formInput systemFields.trauma.fields.max value=system.trauma.max}} - - {{formInput systemFields.darkness.fields.value value=system.darkness.value}} - {{formInput systemFields.defense.fields.base value=system.defense.base}} - {{formInput systemFields.movement.fields.base value=system.movement.base}} + {{formInput systemFields.darkness.fields.current value=system.darkness.current}} / + {{formInput systemFields.darkness.fields.max value=system.darkness.max}} + {{formInput systemFields.defense.fields.base value=system.defense.base}} + {{formInput systemFields.defense.fields.maleficDR value=system.defense.maleficDR}} + {{formInput systemFields.defense.fields.resilience value=system.defense.resilience}} + {{formInput systemFields.movement.fields.base value=system.movement.base}}
- Curr. - Curr. - Base - Base + Curr.Max +    Curr.     Max + + + + + + + +
-
- {{localize "HELLBORN.Label.traits"}}{{#if isEditMode}} - {{/if}} - -
- {{#each traits as |item|}} -
+
- - - +
+ {{localize "HELLBORN.Label.traits"}}{{#if isEditMode}} + {{/if}} + +
+ {{#each traits as |item|}} +
-
- - + + + + +
+ + +
+ {{/each}}
- {{/each}} -
-
+
+ +
+ {{localize "HELLBORN.Label.maleficas"}}{{#if isEditMode}} + {{/if}} + +
+ {{#each maleficas as |item|}} +
+ + + + + +
+ + +
+
+ {{/each}} +
+
+ +
{{localize "HELLBORN.Label.weapons"}}{{#if isEditMode}} - {{/if}}
@@ -83,5 +122,29 @@
+
+ {{localize "HELLBORN.Label.equipments"}}{{#if isEditMode}} + {{/if}} + +
+ {{#each equipments as |item|}} + {{!log 'armor' this}} +
+ +
+ {{item.name}} +
+
+ + +
+
+ {{/each}} +
+
+
\ No newline at end of file