From 6247f655905c7dd496c81ff4e2dda0a8051fe7b3 Mon Sep 17 00:00:00 2001 From: LeRatierBretonnier Date: Tue, 4 Aug 2026 17:20:29 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20fiche=20de=20Communaut=C3=A9=20(socle)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - acteur community (identité, géographie, histoire, objectifs, taille/effectif) - 4 Domaines x 2 jauges avec états (Crise/Bas/Stable/Opulent), moral, réserves - onglets Identité / Domaines / Ressources, édition ProseMirror (formInput) - header avec fond, totem, niveau, effectif ; icône par défaut - libellé du type via typeLabels (sans écraser TYPES.* du core) --- assets/icons/actors/community.webp | Bin 0 -> 55446 bytes lang/en.json | 102 +++++++++ lang/fr.json | 98 ++++++++- less/actor/community.less | 152 ++++++++++++++ less/base.less | 10 +- less/vermine2047.less | 1 + module/applications/sheets/_module.mjs | 1 + .../applications/sheets/community-sheet.mjs | 123 +++++++++++ module/models/_module.mjs | 1 + module/models/community.mjs | 195 ++++++++++++++++++ module/system/config.mjs | 51 +++++ module/vermine2047.mjs | 17 +- system.json | 3 +- templates/actor/appv2/community-domains.hbs | 54 +++++ templates/actor/appv2/community-identity.hbs | 137 ++++++++++++ templates/actor/appv2/community-main.hbs | 79 +++++++ templates/actor/appv2/community-resources.hbs | 63 ++++++ 17 files changed, 1080 insertions(+), 7 deletions(-) create mode 100644 assets/icons/actors/community.webp create mode 100644 less/actor/community.less create mode 100644 module/applications/sheets/community-sheet.mjs create mode 100644 module/models/community.mjs create mode 100644 templates/actor/appv2/community-domains.hbs create mode 100644 templates/actor/appv2/community-identity.hbs create mode 100644 templates/actor/appv2/community-main.hbs create mode 100644 templates/actor/appv2/community-resources.hbs diff --git a/assets/icons/actors/community.webp b/assets/icons/actors/community.webp new file mode 100644 index 0000000000000000000000000000000000000000..242947bca966f2ff43f7633e7c8a6313dba62e63 GIT binary patch literal 55446 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 n9~h1UxHD@RK^uo7V9ibJAeQH^A(HA literal 0 HcmV?d00001 diff --git a/lang/en.json b/lang/en.json index 69d6b9d..e7b2eb4 100644 --- a/lang/en.json +++ b/lang/en.json @@ -174,6 +174,15 @@ "range": "Range", "ranges": "Ranges", "mobility": "Mobility", + "vehicle_specs": "Vehicle specifications", + "kind": "Kind", + "kind_vehicle": "Vehicle", + "kind_mount": "Mount", + "distance": "Distance", + "speed": "Speed", + "speed_duration_ph": "top speed duration (e.g. 10 min)", + "effort_reserve": "Effort reserve", + "maintenance": "Maintenance", "rarity": "Rarity", "rarity_sm": "Rar.", "reliability": "Reliability", @@ -204,6 +213,7 @@ "type_character": "Character", "type_npc": "NPC", "type_creature": "Creature", + "type_community": "Community", "type": "Type", "group_members": "Members", "encounters": "Encounters", @@ -379,6 +389,13 @@ "totem": "Totem", "experience": "Experience" }, + "Sheet": { + "character": "Character", + "npc": "NPC", + "group": "Group", + "creature": "Creature", + "community": "Community" + }, "base_values": "Base Values", "computed_values": "Computed Values", "cost": "Cost", @@ -441,6 +458,91 @@ "effects.passive": "Passive", "effects.temporary": "Temporary" }, + "COMMUNITY": { + "tabs": { + "identity": "Identity", + "domains": "Domains", + "resources": "Resources" + }, + "identity": "Identity", + "name_placeholder": "Community name", + "choose_totem": "Choose totem", + "origin": "Origin", + "theme": "Theme", + "age_label": "Community age", + "age": { + "recent": "A few days", + "established": "A few months", + "old": "A few years" + }, + "instincts": "Instincts", + "prohibits": "Prohibitions", + "notes": "Notes", + "location": "Location", + "sector": "Sector", + "placeType": "Place type", + "landmarks": "Landmarks", + "territory": "Territory", + "history": "History", + "founding": "Founding", + "events": "Key events", + "history_relations": "Relations", + "objectives": "Objectives", + "objective_major": "Major objective", + "objectives_minor": "Minor objectives", + "add_objective": "Add objective", + "size_title": "Size & Population", + "size_label": "Size", + "sizeLevels": { + "1": "Size 1", + "2": "Size 2", + "3": "Size 3" + }, + "population": "Population", + "population_range": "Recommended population", + "figures": "Figures", + "companies": "Companies", + "domains": { + "resources": "Resources", + "security": "Security", + "dynamism": "Dynamism", + "relations": "Relations" + }, + "sections": { + "vivre": "Food & Water", + "supplies": "Supplies", + "defense": "Defense", + "care": "Care", + "cohesion": "Cohesion", + "productivity": "Productivity", + "human": "Human", + "ecology": "Ecology" + }, + "states": { + "crisis": "Crisis", + "low": "Low", + "stable": "Stable", + "opulent": "Opulent" + }, + "reserves": "Reserves", + "group_reserve": "Group reserve", + "material_dice": "Material dice", + "experience_dice": "Experience dice", + "morale": "Morale", + "morale_value": "Value", + "morale_state": "State", + "morale_levels": { + "high": "High", + "normal": "Normal", + "low": "Low", + "crisis": "Crisis" + }, + "morale_blocked": "All four Domains are Low: the Morale bonus is inactive.", + "habitants_title": "Inhabitants", + "habitants_coming": "Figures and Companies management comes in a future version.", + "linked_group": "Linked group", + "profile_hint": "Community profile" + }, "ITEMS": { "item": "Item", "items": "Items", diff --git a/lang/fr.json b/lang/fr.json index 10b1185..99c17b9 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -255,6 +255,15 @@ "range": "Portée", "ranges": "Portées", "mobility": "Mobilité", + "vehicle_specs": "Caractéristiques du véhicule", + "kind": "Type", + "kind_vehicle": "Véhicule", + "kind_mount": "Monture", + "distance": "Distance", + "speed": "Vitesse", + "speed_duration_ph": "durée de pointe (ex: 10 min)", + "effort_reserve": "Réserve d'Effort", + "maintenance": "Entretien", "rarity": "Rareté", "rarity_sm": "Rar.", "reliability": "Fiabilité", @@ -395,6 +404,7 @@ "type_character": "Personnage", "type_npc": "PNJ", "type_creature": "Créature", + "type_community": "Communauté", "type": "Type", "group_members": "Membres", "encounters": "Rencontres", @@ -440,7 +450,8 @@ "character": "Personnage", "npc": "PNJ", "group": "Groupe", - "creature": "Créature" + "creature": "Créature", + "community": "Communauté" } }, "UI": { @@ -458,6 +469,91 @@ "inactive": "Effets inactifs" } }, + "COMMUNITY": { + "tabs": { + "identity": "Identité", + "domains": "Domaines", + "resources": "Ressources" + }, + "identity": "Identité", + "name_placeholder": "Nom de la Communauté", + "choose_totem": "Choisir le totem", + "origin": "Origine", + "theme": "Thème", + "age_label": "Âge de la Communauté", + "age": { + "recent": "Quelques jours", + "established": "Quelques mois", + "old": "Quelques années" + }, + "instincts": "Instincts", + "prohibits": "Interdits", + "notes": "Notes", + "location": "Localisation", + "sector": "Secteur", + "placeType": "Type de lieu", + "landmarks": "Éléments marquants", + "territory": "Territoire", + "history": "Histoire", + "founding": "Fondation", + "events": "Événements marquants", + "history_relations": "Relations", + "objectives": "Objectifs", + "objective_major": "Objectif majeur", + "objectives_minor": "Objectifs mineurs", + "add_objective": "Ajouter un objectif", + "size_title": "Taille & Effectif", + "size_label": "Taille", + "sizeLevels": { + "1": "Taille 1", + "2": "Taille 2", + "3": "Taille 3" + }, + "population": "Effectif", + "population_range": "Population recommandée", + "figures": "Figures", + "companies": "Compagnies", + "domains": { + "resources": "Ressources", + "security": "Sécurité", + "dynamism": "Dynamisme", + "relations": "Rapports" + }, + "sections": { + "vivre": "Vivres", + "supplies": "Fournitures", + "defense": "Défense", + "care": "Soins", + "cohesion": "Cohésion", + "productivity": "Productivité", + "human": "Humain", + "ecology": "Écologie" + }, + "states": { + "crisis": "Crise", + "low": "Bas", + "stable": "Stable", + "opulent": "Opulent" + }, + "reserves": "Réserves", + "group_reserve": "Réserve de Groupe", + "material_dice": "Dés de Matériel", + "experience_dice": "Dés d'Expérience", + "morale": "Moral", + "morale_value": "Valeur", + "morale_state": "État", + "morale_levels": { + "high": "Haut", + "normal": "Normal", + "low": "Bas", + "crisis": "Crise" + }, + "morale_blocked": "Les quatre Domaines sont Bas : le Bonus de Moral est inactif.", + "habitants_title": "Habitants", + "habitants_coming": "La gestion des Figures et des Compagnies arrive dans une prochaine version.", + "linked_group": "Groupe rattaché", + "profile_hint": "Profil de la Communauté" + }, "ITEMS": { "item": "Objet", "items": "Objets", diff --git a/less/actor/community.less b/less/actor/community.less new file mode 100644 index 0000000..f176676 --- /dev/null +++ b/less/actor/community.less @@ -0,0 +1,152 @@ +@import "../variables"; +@import "../utilities"; + +.system-vermine2047 .vermine2047.actor.community { + .char-header { + .background-image(url("@{ui-path}/barre_haut.webp"), no-repeat, 100% 100%, right top); + max-height: 130px; + + .community-portrait { + display: flex; + align-items: center; + justify-content: center; + } + + .char-name, + .char-vermine2047 { + border-bottom: none; + line-height: 2rem; + } + + .char-vermine2047 { + font-size: 1.1rem; + } + + .profile, + .origin, + .level, + .population { + width: 100%; + } + + input[type="text"] { + flex: 1; + min-width: 0; + } + + .level input, + .population input { + width: 60px; + text-align: center; + } + } + + .community-section { + padding: 8px; + border: 1px solid @color-border-dark-4; + background: fade(@color-chitin-dark, 20%); + + h3 { + font-family: "DistressBlack", sans-serif; + text-transform: uppercase; + font-size: @font-size-13; + color: @theme-color-dark; + margin: 0 0 8px; + text-align: left; + border-bottom: none; + } + } + + .community-linked-group { + display: flex; + gap: 6px; + margin-bottom: 8px; + padding: 6px 8px; + border: 1px dashed @color-hemolymph; + background: fade(@color-hemolymph, 8%); + + .label { + font-family: "DistressBlack", sans-serif; + text-transform: uppercase; + font-size: @font-size-11; + color: @color-amber; + } + } + + .community-size-info { + margin: 6px 0 0; + font-size: @font-size-11; + color: @color-text-light-0; + opacity: 0.85; + } + + .community-warning { + margin: 6px 0 0; + padding: 4px 8px; + font-size: @font-size-11; + font-weight: 700; + color: @color-hemolymph; + background: fade(@color-hemolymph, 12%); + border: 1px solid @color-hemolymph; + } + + .community-hint { + margin: 0; + font-size: @font-size-11; + font-style: italic; + color: @color-text-light-0; + opacity: 0.7; + } + + // Jauges de Domaines + .gauge { + display: flex; + flex-direction: column; + gap: 2px; + padding: 6px; + border: 1px solid @color-border-dark-4; + border-left: 4px solid @color-border-dark-4; + + label { + font-family: "DistressBlack", sans-serif; + text-transform: uppercase; + font-size: @font-size-11; + color: @color-amber; + } + + input[type="number"] { + width: 48px; + text-align: center; + padding: 2px; + } + + .gauge-value { + font-family: "DistressBlack", sans-serif; + font-size: @font-size-16; + color: @color-text-light-0; + } + + .gauge-state { + font-family: "Roboto", sans-serif; + font-size: @font-size-11; + font-weight: 700; + text-transform: uppercase; + } + + &.crisis { border-left-color: @color-hemolymph; .gauge-state { color: @color-hemolymph; } } + &.low { border-left-color: @color-amber; .gauge-state { color: @color-amber; } } + &.stable { border-left-color: @color-acid-green; .gauge-state { color: @color-acid-green; } } + &.opulent { border-left-color: @theme-color-accent; .gauge-state { color: @theme-color-accent; } } + } + + .morale-level { + font-family: "Roboto", sans-serif; + font-size: @font-size-12; + font-weight: 700; + + &.high { color: @color-acid-green; } + &.normal { color: @color-text-light-0; } + &.low { color: @color-amber; } + &.crisis { color: @color-hemolymph; } + } +} diff --git a/less/base.less b/less/base.less index fba1522..f2fab58 100644 --- a/less/base.less +++ b/less/base.less @@ -126,7 +126,8 @@ ul.unstyled { // La fiche de groupe contient beaucoup de zones (membres, objectifs, totem…) : // dès que le contenu dépasse la hauteur de la fenêtre, on autorise le défilement // pour ne pas perdre l'accès aux zones du bas. -.application.sheet.vermine2047.group .window-content { +.application.sheet.vermine2047.group .window-content, +.application.sheet.vermine2047.community .window-content { overflow-y: auto; } @@ -1027,11 +1028,12 @@ ol.chat-log { } } -// Padding supplémentaire pour les fiches groupe, npc et créature +// Padding supplémentaire pour les fiches groupe, npc, créature et communauté .system-vermine2047 { .group-content, .npc-content, - .creature-content { + .creature-content, + .community-content { padding: 15px; } } @@ -1119,7 +1121,7 @@ ol.chat-log { label { font-family: "DistressBlack", sans-serif; text-transform: uppercase; - font-size: @font-size-10; + font-size: @font-size-11; color: @color-amber; } } diff --git a/less/vermine2047.less b/less/vermine2047.less index 217f224..af9cea7 100644 --- a/less/vermine2047.less +++ b/less/vermine2047.less @@ -22,6 +22,7 @@ @import "actor/npc"; @import "actor/group"; @import "actor/creature"; +@import "actor/community"; // 6. Styles des items @import "items"; diff --git a/module/applications/sheets/_module.mjs b/module/applications/sheets/_module.mjs index bd1eb28..cfe806c 100644 --- a/module/applications/sheets/_module.mjs +++ b/module/applications/sheets/_module.mjs @@ -4,6 +4,7 @@ export { default as VermineCharacterSheetV2 } from "./character-sheet.mjs" export { default as VermineNpcSheetV2 } from "./npc-sheet.mjs" export { default as VermineGroupSheetV2 } from "./group-sheet.mjs" export { default as VermineCreatureSheetV2 } from "./creature-sheet.mjs" +export { default as VermineCommunitySheetV2 } from "./community-sheet.mjs" export { VermineItemSheetV2, VermineWeaponSheetV2, diff --git a/module/applications/sheets/community-sheet.mjs b/module/applications/sheets/community-sheet.mjs new file mode 100644 index 0000000..c6ccc88 --- /dev/null +++ b/module/applications/sheets/community-sheet.mjs @@ -0,0 +1,123 @@ +import VermineBaseActorSheet from "./base-actor-sheet.mjs" + +export default class VermineCommunitySheetV2 extends VermineBaseActorSheet { + + static DEFAULT_OPTIONS = { + classes: ["community"], + position: { width: 760, height: 640 }, + window: { contentClasses: ["community-content"] }, + actions: { + addObjective: VermineCommunitySheetV2.#onAddObjective, + deleteObjective: VermineCommunitySheetV2.#onDeleteObjective + } + } + + static PARTS = { + main: { template: "systems/vermine2047/templates/actor/appv2/community-main.hbs", scrollable: [""] }, + tabs: { template: "templates/generic/tab-navigation.hbs" }, + identity: { template: "systems/vermine2047/templates/actor/appv2/community-identity.hbs", scrollable: [""] }, + domains: { template: "systems/vermine2047/templates/actor/appv2/community-domains.hbs", scrollable: [""] }, + resources: { template: "systems/vermine2047/templates/actor/appv2/community-resources.hbs", scrollable: [""] } + } + + tabGroups = { sheet: "identity" } + + #getTabs() { + const tabs = { + identity: { id: "identity", group: "sheet", icon: "fas fa-info-circle", label: "COMMUNITY.tabs.identity" }, + domains: { id: "domains", group: "sheet", icon: "fas fa-chart-simple", label: "COMMUNITY.tabs.domains" }, + resources: { id: "resources", group: "sheet", icon: "fas fa-boxes-stacked", label: "COMMUNITY.tabs.resources" } + } + for (const v of Object.values(tabs)) { + v.active = this.tabGroups[v.group] === v.id + v.cssClass = v.active ? "active" : "" + } + return tabs + } + + async _prepareContext() { + const context = await super._prepareContext() + context.tabs = this.#getTabs() + // Groupe de personnages rattaché + context.resolvedGroup = null + if (this.document.system.groupId) { + const g = game.actors.get(this.document.system.groupId) + if (g) context.resolvedGroup = { id: g.id, name: g.name } + } + // Enrichissement HTML des champs longs (même logique que la fiche PNJ) + const enrich = async (path) => { + const val = foundry.utils.getProperty(this.document.system, path) + return val ? await foundry.applications.ux.TextEditor.implementation.enrichHTML(val, { async: true }) : "" + } + context.enrichedNotes = await enrich("identity.notes") + context.enrichedLandmarks = await enrich("location.landmarks") + context.enrichedTerritory = await enrich("location.territory") + context.enrichedEvents = await enrich("history.events") + context.enrichedRelations = await enrich("history.relations") + return context + } + + async _preparePartContext(partId, context) { + const doc = this.document + switch (partId) { + case "main": break + case "identity": + context.tab = context.tabs.identity + context.ageOptions = Object.entries(CONFIG.VERMINE.communityAges).map(([key, label]) => ({ key, label: game.i18n.localize(label) })) + break + case "domains": + context.tab = context.tabs.domains + context.sizeOptions = CONFIG.VERMINE.communitySizeLevels + context.sizeLabel = doc.system.size?.value ? game.i18n.localize(CONFIG.VERMINE.communitySizeLevels[doc.system.size.value]?.label ?? "") : "" + context.sizeInfo = doc.system.size?.value ? CONFIG.VERMINE.communitySizeLevels[doc.system.size.value] : null + // Préparer les 4 Domaines avec leurs 2 sections (jauges) et leur état + context.domains = [] + for (const [dkey, dcfg] of Object.entries(CONFIG.VERMINE.communityDomains)) { + const domain = doc.system.domains?.[dkey] + context.domains.push({ + key: dkey, + label: game.i18n.localize(dcfg.label), + sections: Object.entries(dcfg.sections).map(([skey, label]) => { + const gauge = domain?.[skey] ?? { value: 0 } + const state = gauge.state || "crisis" + return { + domainKey: dkey, + key: skey, + label: game.i18n.localize(label), + gauge, + state, + stateLabel: game.i18n.localize(CONFIG.VERMINE.communityGaugeStates[state]?.label ?? "COMMUNITY.states.crisis") + } + }) + }) + } + break + case "resources": + context.tab = context.tabs.resources + break + } + return context + } + + changeTab(tab, group, options = {}) { + super.changeTab(tab, group, options) + if (group === "sheet") { + const main = this.element?.querySelector('[data-group="sheet"][data-tab="main"]') + if (main) main.classList.add("active") + } + } + + static #onDeleteObjective(event, target) { + const index = parseInt(target.dataset.index) + if (isNaN(index)) return + const objectives = foundry.utils.duplicate(this.document.system.objectives || { major: "", minor: [] }) + objectives.minor.splice(index, 1) + this.document.update({ "system.objectives": objectives }) + } + + static #onAddObjective(event, target) { + const objectives = foundry.utils.duplicate(this.document.system.objectives || { major: "", minor: [] }) + objectives.minor.push("") + this.document.update({ "system.objectives": objectives }) + } +} diff --git a/module/models/_module.mjs b/module/models/_module.mjs index 5d4023a..9de8d92 100644 --- a/module/models/_module.mjs +++ b/module/models/_module.mjs @@ -2,6 +2,7 @@ export { default as VermineCharacterData } from "./character.mjs" export { default as VermineNpcData } from "./npc.mjs" export { default as VermineGroupData } from "./group.mjs" export { default as VermineCreatureData } from "./creature.mjs" +export { default as VermineCommunityData } from "./community.mjs" export { default as VermineItemData } from "./item.mjs" export { default as VermineWeaponData } from "./weapon.mjs" export { default as VermineDefenseData } from "./defense.mjs" diff --git a/module/models/community.mjs b/module/models/community.mjs new file mode 100644 index 0000000..8d1890d --- /dev/null +++ b/module/models/community.mjs @@ -0,0 +1,195 @@ +/** + * DataModel pour les acteurs de type "community" (Communauté). + * La Communauté est l'extension sédentarisée d'un Groupe : elle englobe le + * Groupe de personnages, des Figures et des Habitants répartis en Compagnies. + * Le socle couvre l'identité, la géographie, l'histoire, les objectifs, la + * taille/l'effectif, les quatre Domaines (8 jauges), le Moral et les réserves. + */ +import { + attributeSchema, + levelSchema, + combatStatusSchema +} from "./_shared.mjs" + +export default class VermineCommunityData extends foundry.abstract.TypeDataModel { + + /** @override */ + static LOCALIZATION_PREFIXES = ["VERMINE.community"] + + /** @override */ + static defineSchema() { + const fields = foundry.data.fields + const reqInt = { required: true, nullable: false, integer: true } + const gauge = () => attributeSchema(0, 0, 10) + + return { + // Statut de combat (base, peu utilisé pour une Communauté) + combatStatus: combatStatusSchema("9"), + + // Identité + identity: new fields.SchemaField({ + totem: new fields.StringField({ required: true, nullable: false, initial: "" }), + profile: new fields.StringField({ required: true, nullable: false, initial: "" }), + origin: new fields.StringField({ required: true, nullable: false, initial: "" }), + theme: new fields.StringField({ required: true, nullable: false, initial: "" }), + instincts: new fields.StringField({ required: true, nullable: false, initial: "" }), + prohibits: new fields.StringField({ required: true, nullable: false, initial: "" }), + // Âge de la Communauté : recent | established | old + age: new fields.StringField({ required: true, nullable: false, initial: "recent" }), + notes: new fields.HTMLField({ required: true, initial: "", textSearch: true }) + }), + + // Géographie / localisation + location: new fields.SchemaField({ + sector: new fields.StringField({ required: true, nullable: false, initial: "" }), + placeType: new fields.StringField({ required: true, nullable: false, initial: "" }), + landmarks: new fields.HTMLField({ required: true, initial: "", textSearch: true }), + territory: new fields.HTMLField({ required: true, initial: "", textSearch: true }) + }), + + // Histoire + history: new fields.SchemaField({ + founding: new fields.StringField({ required: true, nullable: false, initial: "" }), + events: new fields.HTMLField({ required: true, initial: "", textSearch: true }), + relations: new fields.HTMLField({ required: true, initial: "", textSearch: true }) + }), + + // Objectifs : un majeur + des mineurs + objectives: new fields.SchemaField({ + major: new fields.StringField({ required: true, nullable: false, initial: "" }), + minor: new fields.ArrayField(new fields.StringField({ required: true, nullable: false, initial: "" })) + }), + + // Taille (1-3) et effectif + size: attributeSchema(1, 1, 3), + population: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), + + // Domaines : 4 Domaines × 2 sections (jauges en Dés) + domains: new fields.SchemaField({ + resources: new fields.SchemaField({ + vivre: gauge(), + supplies: gauge() + }), + security: new fields.SchemaField({ + defense: gauge(), + care: gauge() + }), + dynamism: new fields.SchemaField({ + cohesion: gauge(), + productivity: gauge() + }), + relations: new fields.SchemaField({ + human: gauge(), + ecology: gauge() + }) + }), + + // Moral (comme le Groupe) : value 0-7, level dérivé + morale: new fields.SchemaField({ + level: new fields.StringField({ required: true, nullable: false, initial: "normal" }), + value: new fields.NumberField({ ...reqInt, initial: 7, min: 0, max: 7 }), + min: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), + max: new fields.NumberField({ ...reqInt, initial: 7, min: 0 }) + }), + + // Réserve de Groupe + reserve: attributeSchema(0, 0, 10), + + // Dés collectifs de la Communauté + material: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }), + experience: new fields.SchemaField({ + dice: new fields.NumberField({ ...reqInt, initial: 0, min: 0 }) + }), + + // Niveau de la Communauté (pour l'expérience des habitants) + level: levelSchema(1, 1, 10), + + // Groupe de personnages rattaché (id d'acteur) + groupId: new fields.StringField({ required: true, nullable: false, initial: "" }), + + // Habitants (phase 2) : Figures et Compagnies + figures: new fields.ArrayField(new fields.SchemaField({ + name: new fields.StringField({ required: true, nullable: false, initial: "" }), + role: new fields.StringField({ required: true, nullable: false, initial: "" }), + totem: new fields.StringField({ required: true, nullable: false, initial: "" }), + specialty: new fields.SchemaField({ + name: new fields.StringField({ required: true, nullable: false, initial: "" }), + score: new fields.NumberField({ ...reqInt, initial: 3, min: 0, max: 10 }) + }) + })), + companies: new fields.ArrayField(new fields.SchemaField({ + name: new fields.StringField({ required: true, nullable: false, initial: "" }), + specialty: new fields.SchemaField({ + name: new fields.StringField({ required: true, nullable: false, initial: "" }), + score: new fields.NumberField({ ...reqInt, initial: 3, min: 0, max: 10 }) + }), + level: levelSchema(1, 1, 4), + members: new fields.NumberField({ ...reqInt, initial: 1, min: 0 }), + figureName: new fields.StringField({ required: true, nullable: false, initial: "" }) + })) + } + } + + /** @override */ + prepareDerivedData() { + super.prepareDerivedData() + + // 1. État (Crise/Bas/Stable/Opulent) de chaque jauge de Domaine + this._computeGaugeStates() + + // 2. Les quatre Domaines sont-ils Bas ? (Moral inactif) + this._computeAllDomainsLow() + + // 3. Mettre à jour le niveau de Moral selon la valeur + this._updateMorale() + } + + /** + * État d'une jauge selon sa valeur en Dés. + * Crise 0D / Bas 1-2D / Stable 3-5D / Opulent 6D+. + * @param {number} value + * @returns {string} + */ + static gaugeState(value) { + const v = parseInt(value, 10) || 0 + if (v >= 6) return "opulent" + if (v >= 3) return "stable" + if (v >= 1) return "low" + return "crisis" + } + + _computeGaugeStates() { + for (const domain of Object.values(this.domains)) { + for (const gauge of Object.values(domain)) { + gauge.state = VermineCommunityData.gaugeState(gauge.value) + } + } + } + + /** + * Un Domaine est "Bas" lorsque ses deux sections sont à 2D ou moins. + * Si les quatre Domaines sont Bas, le Bonus de Moral est inactif. + */ + _computeAllDomainsLow() { + const domainLow = (domain) => Object.values(domain).every(g => (parseInt(g.value, 10) || 0) <= 2) + this.allDomainsLow = Object.values(this.domains).every(domainLow) + } + + /** + * Met à jour le niveau de Moral en fonction de la valeur de dés. + * Règles : 7D = Haut, 6-3D = Normal, 2-1D = Bas, 0D = Crise. + */ + _updateMorale() { + const moraleValue = parseInt(this.morale?.value, 10) || 0 + if (this.morale.level && this.morale.level !== "normal") return + if (moraleValue >= 7) { + this.morale.level = "high" + } else if (moraleValue >= 3) { + this.morale.level = "normal" + } else if (moraleValue >= 1) { + this.morale.level = "low" + } else { + this.morale.level = "crisis" + } + } +} diff --git a/module/system/config.mjs b/module/system/config.mjs index ccf16f8..757d81d 100644 --- a/module/system/config.mjs +++ b/module/system/config.mjs @@ -469,3 +469,54 @@ VERMINE.totemEffects = { } } + +/** + * Communauté — Domaines et sections (jauges). + */ +VERMINE.communityDomains = { + resources: { + label: "COMMUNITY.domains.resources", + sections: { vivre: "COMMUNITY.sections.vivre", supplies: "COMMUNITY.sections.supplies" } + }, + security: { + label: "COMMUNITY.domains.security", + sections: { defense: "COMMUNITY.sections.defense", care: "COMMUNITY.sections.care" } + }, + dynamism: { + label: "COMMUNITY.domains.dynamism", + sections: { cohesion: "COMMUNITY.sections.cohesion", productivity: "COMMUNITY.sections.productivity" } + }, + relations: { + label: "COMMUNITY.domains.relations", + sections: { human: "COMMUNITY.sections.human", ecology: "COMMUNITY.sections.ecology" } + } +} + +/** + * Communauté — Tailles (effectif, Figures, Compagnies recommandés). + */ +VERMINE.communitySizeLevels = { + 1: { label: "COMMUNITY.sizeLevels.1", population: "7-50", figures: 3, companies: 5 }, + 2: { label: "COMMUNITY.sizeLevels.2", population: "51-75", figures: 5, companies: 7 }, + 3: { label: "COMMUNITY.sizeLevels.3", population: "100+", figures: 7, companies: 9 } +} + +/** + * Communauté — États d'une jauge de Domaine. + * Crise 0D / Bas 1-2D / Stable 3-5D / Opulent 6D+. + */ +VERMINE.communityGaugeStates = { + crisis: { label: "COMMUNITY.states.crisis" }, + low: { label: "COMMUNITY.states.low" }, + stable: { label: "COMMUNITY.states.stable" }, + opulent: { label: "COMMUNITY.states.opulent" } +} + +/** + * Communauté — Âge (notion de temps). + */ +VERMINE.communityAges = { + recent: "COMMUNITY.age.recent", + established: "COMMUNITY.age.established", + old: "COMMUNITY.age.old" +} diff --git a/module/vermine2047.mjs b/module/vermine2047.mjs index e7f33f3..09d24e9 100644 --- a/module/vermine2047.mjs +++ b/module/vermine2047.mjs @@ -37,6 +37,14 @@ Hooks.once('init', async function () { CONFIG.Actor.dataModels.npc = models.VermineNpcData; CONFIG.Actor.dataModels.group = models.VermineGroupData; CONFIG.Actor.dataModels.creature = models.VermineCreatureData; + CONFIG.Actor.dataModels.community = models.VermineCommunityData; + + // Libellé du type "community" (TYPES.Actor.* du core ne le connaît pas) + CONFIG.Actor.typeLabels ??= {}; + CONFIG.Actor.typeLabels.community = "VERMINE.type_community"; + Hooks.once('i18nInit', () => { + CONFIG.Actor.typeLabels.community = "VERMINE.type_community"; + }); CONFIG.Item.dataModels.item = models.VermineItemData; CONFIG.Item.dataModels.weapon = models.VermineWeaponData; @@ -89,6 +97,9 @@ Hooks.once('init', async function () { foundry.documents.collections.Actors.registerSheet("vermine2047", sheets.VermineGroupSheetV2, { types: ["group"], makeDefault: true, label: "VERMINE.Sheet.group" }) + foundry.documents.collections.Actors.registerSheet("vermine2047", sheets.VermineCommunitySheetV2, { + types: ["community"], makeDefault: true, label: "VERMINE.Sheet.community" + }) // Item sheets — un par type foundry.documents.collections.Items.registerSheet("vermine2047", sheets.VermineItemSheetV2, { @@ -193,7 +204,11 @@ Hooks.once('init', async function () { "systems/vermine2047/templates/actor/appv2/creature-info.hbs", "systems/vermine2047/templates/actor/appv2/creature-stats.hbs", "systems/vermine2047/templates/actor/appv2/creature-combat.hbs", - "systems/vermine2047/templates/actor/appv2/creature-effects.hbs" + "systems/vermine2047/templates/actor/appv2/creature-effects.hbs", + "systems/vermine2047/templates/actor/appv2/community-main.hbs", + "systems/vermine2047/templates/actor/appv2/community-identity.hbs", + "systems/vermine2047/templates/actor/appv2/community-domains.hbs", + "systems/vermine2047/templates/actor/appv2/community-resources.hbs" ]); }); diff --git a/system.json b/system.json index 71c75ae..9d2548c 100644 --- a/system.json +++ b/system.json @@ -34,7 +34,8 @@ "character": { "htmlFields": ["equipment.description", "identity.biography", "identity.relations"] }, "npc": { "htmlFields": ["equipment.description", "identity.notes"] }, "group": { "htmlFields": ["equipment.description", "identity.notes"] }, - "creature": { "htmlFields": ["equipment.description", "identity.notes", "identity.biography"] } + "creature": { "htmlFields": ["equipment.description", "identity.notes", "identity.biography"] }, + "community": { "htmlFields": ["identity.notes", "location.landmarks", "location.territory", "history.events", "history.relations"] } }, "Item": { "item": { "htmlFields": ["description"] }, diff --git a/templates/actor/appv2/community-domains.hbs b/templates/actor/appv2/community-domains.hbs new file mode 100644 index 0000000..0b6b32b --- /dev/null +++ b/templates/actor/appv2/community-domains.hbs @@ -0,0 +1,54 @@ +
+
+

{{ localize 'COMMUNITY.size_title' }}

+
+
+ + {{#if isEditMode}} + + {{else}} + {{ sizeLabel }} + {{/if}} +
+
+ + {{#if isEditMode}} + + {{else}} + {{system.population}} + {{/if}} +
+
+ {{#if sizeInfo}} +

+ {{ localize 'COMMUNITY.population_range' }}: {{ sizeInfo.population }} · + {{ localize 'COMMUNITY.figures' }}: {{ sizeInfo.figures }}+ · + {{ localize 'COMMUNITY.companies' }}: {{ sizeInfo.companies }}+ +

+ {{/if}} +
+ + {{#each domains}} +
+

{{ this.label }}

+
+ {{#each this.sections}} +
+ + {{#if @root.isEditMode}} + + {{else}} + {{ this.gauge.value }}D + {{/if}} + {{ this.stateLabel }} +
+ {{/each}} +
+
+ {{/each}} +
diff --git a/templates/actor/appv2/community-identity.hbs b/templates/actor/appv2/community-identity.hbs new file mode 100644 index 0000000..9034775 --- /dev/null +++ b/templates/actor/appv2/community-identity.hbs @@ -0,0 +1,137 @@ +
+
+

{{ localize 'COMMUNITY.identity' }}

+
+
+ + {{#if isEditMode}} + + {{else}} + {{system.identity.origin}} + {{/if}} +
+
+ + {{#if isEditMode}} + + {{else}} + {{system.identity.theme}} + {{/if}} +
+
+ + {{#if isEditMode}} + + {{else}} + {{#each ageOptions}}{{#ife @root.system.identity.age this.key}}{{ this.label }}{{/ife}}{{/each}} + {{/if}} +
+
+ + {{#if isEditMode}} + + {{else}} + {{system.identity.instincts}} + {{/if}} +
+
+ + {{#if isEditMode}} + + {{else}} + {{system.identity.prohibits}} + {{/if}} +
+
+
+ + {{formInput systemFields.identity.fields.notes enriched=enrichedNotes value=system.identity.notes name="system.identity.notes" toggled=true}} +
+
+ +
+

{{ localize 'COMMUNITY.location' }}

+
+
+ + {{#if isEditMode}} + + {{else}} + {{system.location.sector}} + {{/if}} +
+
+ + {{#if isEditMode}} + + {{else}} + {{system.location.placeType}} + {{/if}} +
+
+
+ + {{formInput systemFields.location.fields.landmarks enriched=enrichedLandmarks value=system.location.landmarks name="system.location.landmarks" toggled=true}} +
+
+ + {{formInput systemFields.location.fields.territory enriched=enrichedTerritory value=system.location.territory name="system.location.territory" toggled=true}} +
+
+ +
+

{{ localize 'COMMUNITY.history' }}

+
+ + {{#if isEditMode}} + + {{else}} + {{system.history.founding}} + {{/if}} +
+
+ + {{formInput systemFields.history.fields.events enriched=enrichedEvents value=system.history.events name="system.history.events" toggled=true}} +
+
+ + {{formInput systemFields.history.fields.relations enriched=enrichedRelations value=system.history.relations name="system.history.relations" toggled=true}} +
+
+ +
+

{{ localize 'COMMUNITY.objectives' }}

+
+ + {{#if isEditMode}} + + {{else}} + {{system.objectives.major}} + {{/if}} +
+
+ +
    + {{#each system.objectives.minor as |obj index|}} +
  1. + {{#if @root.isEditMode}} + + + {{else}} + {{obj}} + {{/if}} +
  2. + {{/each}} + {{#if isEditMode}} +
  3. + {{ localize 'COMMUNITY.add_objective' }} +
  4. + {{/if}} +
+
+
+
diff --git a/templates/actor/appv2/community-main.hbs b/templates/actor/appv2/community-main.hbs new file mode 100644 index 0000000..34986ef --- /dev/null +++ b/templates/actor/appv2/community-main.hbs @@ -0,0 +1,79 @@ +
+ {{!-- Toggle Edit/Play --}} +
+ {{#if isEditMode}} + + {{else}} + + {{/if}} +
+ + {{!-- HEADER --}} +
+
+ +
+ +
+

+ + {{#if isEditMode}} + + {{else}} + {{actor.name}} + {{/if}} +

+
+ + {{#if isEditMode}} + + {{else}} + {{#if system.identity.profile}}{{system.identity.profile}}{{else}}{{ localize 'COMMUNITY.profile_hint' }}{{/if}} + {{/if}} +
+
+ + {{#if isEditMode}} + + {{else}} + {{system.identity.origin}} + {{/if}} +
+
+ +
+

+ {{#if (eq system.identity.totem "")}} + {{ localize 'COMMUNITY.choose_totem' }}… + {{ else }} + {{ smarttl "TOTEMS" system.identity.totem }} + {{/if}} +

+
+ + {{#if isEditMode}} + + {{else}} + {{system.level.value}} + {{/if}} + / {{system.level.max}} +
+
+ + {{#if isEditMode}} + + {{else}} + {{system.population}} + {{/if}} +
+
+
+ + {{#if resolvedGroup}} +
+ {{ localize 'COMMUNITY.linked_group' }}: + {{ resolvedGroup.name }} +
+ {{/if}} +
diff --git a/templates/actor/appv2/community-resources.hbs b/templates/actor/appv2/community-resources.hbs new file mode 100644 index 0000000..4a0cdf8 --- /dev/null +++ b/templates/actor/appv2/community-resources.hbs @@ -0,0 +1,63 @@ +
+
+

{{ localize 'COMMUNITY.reserves' }}

+
+
+ + {{#if isEditMode}} + + {{else}} + {{system.reserve.value}} / {{system.reserve.max}} + {{/if}} +
+
+ + {{#if isEditMode}} + + {{else}} + {{system.material}}D + {{/if}} +
+
+ + {{#if isEditMode}} + + {{else}} + {{system.experience.dice}}D + {{/if}} +
+
+
+ +
+

{{ localize 'COMMUNITY.morale' }}

+
+
+ + {{#if isEditMode}} + + {{else}} + {{system.morale.value}} + {{/if}} +
+
+ + {{ localize (concat 'COMMUNITY.morale_levels.' system.morale.level) }} +
+
+ {{#if system.allDomainsLow}} +

{{ localize 'COMMUNITY.morale_blocked' }}

+ {{/if}} +
+ +
+

{{ localize 'COMMUNITY.habitants_title' }}

+

{{ localize 'COMMUNITY.habitants_coming' }}

+ {{#if resolvedGroup}} +

+ {{ localize 'COMMUNITY.linked_group' }}: + {{ resolvedGroup.name }} +

+ {{/if}} +
+