From 848366e05c0fca6dc8533828df3311478c6a18b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois-Xavier=20Guillois?= Date: Tue, 5 Sep 2023 15:04:06 +0200 Subject: [PATCH] basis of wound system --- lang/en.json | 2 +- module/sheets/character-sheet.mjs | 8 +- module/system/config.mjs | 4 +- module/system/functions.mjs | 134 ++++++++++++++---------- module/system/handlebars-manager.mjs | 43 +++++++- template.json | 18 ++-- templates/actor/parts/actor-combat.html | 22 +++- 7 files changed, 156 insertions(+), 75 deletions(-) diff --git a/lang/en.json b/lang/en.json index 26c2c25..c3bdaf4 100644 --- a/lang/en.json +++ b/lang/en.json @@ -139,7 +139,7 @@ "reliability": "Fiabilité", "reliability_sm": "Fiab.", "wounds":{ - "name":"Blessure", + "name":"Blessures", "threshold": "Seuil", "light":"Légère", "heavy": "Grave", diff --git a/module/sheets/character-sheet.mjs b/module/sheets/character-sheet.mjs index a13fd74..1b8ecd0 100644 --- a/module/sheets/character-sheet.mjs +++ b/module/sheets/character-sheet.mjs @@ -2,6 +2,7 @@ import {onManageActiveEffect, prepareActiveEffectCategories} from "../system/eff import { VermineActorSheet } from "./actor-sheet.mjs"; import { getRollBox } from "../system/dialogs.mjs"; import { TotemPicker } from "../system/applications.mjs"; +import { setCharacterEffort, setCharacterSelfControl, setCharacterThresholds } from "../system/functions.mjs"; /** * Extend the basic ActorSheet with some very simple modifications @@ -71,10 +72,15 @@ export class VermineCharacterSheet extends VermineActorSheet { * @return {undefined} */ _prepareCharacterData(context) { + const actor = game.actors.get(context.data._id); // Handle ability scores. for (let [k, v] of Object.entries(context.system.abilities)) { v.label = game.i18n.localize(context.system.abilities[k].label) ?? k; } + + setCharacterEffort(actor); + setCharacterSelfControl(actor); + setCharacterThresholds(actor); } /** @@ -155,7 +161,7 @@ export class VermineCharacterSheet extends VermineActorSheet { let ageType = "2"; Object.keys(CONFIG.VERMINE.AgeTypes).forEach((type) => { - if(age > parseInt(CONFIG.VERMINE.AgeTypes[type].beginning,10)){ + if(age >= parseInt(CONFIG.VERMINE.AgeTypes[type].beginning,10)){ ageType = type; } }); diff --git a/module/system/config.mjs b/module/system/config.mjs index d8f9c63..4bdca6f 100644 --- a/module/system/config.mjs +++ b/module/system/config.mjs @@ -7,8 +7,8 @@ export const VERMINE = {}; VERMINE.AgeTypes = { 1:{ "name":"AGE_TYPES.young", "beginning": 0 }, - 2:{ "name":"AGE_TYPES.adult", "beginning": 16 }, - 3:{ "name":"AGE_TYPES.old", "beginning": 45 } + 2:{ "name":"AGE_TYPES.adult", "beginning": 18 }, + 3:{ "name":"AGE_TYPES.old", "beginning": 47 } } VERMINE.SkillLevels = { diff --git a/module/system/functions.mjs b/module/system/functions.mjs index 957509a..0aedf91 100644 --- a/module/system/functions.mjs +++ b/module/system/functions.mjs @@ -1,4 +1,5 @@ import { VERMINE } from './config.mjs' + /** * renvoie le score d'une compétence d'un actor existant * @param {VermineActor} @@ -14,33 +15,7 @@ export function getActorSkillScore(actor, skillLabel, property = "value") { } } } - if (returnedValue == null){ - for(let i in actor.system.cskills.data){ - if (actor.system.cskills.data[i].label == skillLabel){ - returnedValue = actor.system.cskills.data[i][property]; - } - } - } - - return returnedValue; -} - -/** - * renvoie le type d'une compétence - * @param {VermineActor} - * @return {string||null} Data for rendering or null - */ -export function getSkillTypeFromLabel(skillLabel) { - let returnedValue = null; - - for(let i in VERMINE.skills){ - for(let j in VERMINE.skills[i].data){ - if (VERMINE.skills[i].data[j].label == skillLabel){ - returnedValue = j; - } - } - } - + return returnedValue; } @@ -64,46 +39,93 @@ export function updateActorSkillScore(selectedActor, skillLabel, property = "val } } - if (updated == false){ - for (let s in selectedActor.system.cskills.data){ - if (selectedActor.system.cskills.data[s].label == skillLabel){ - selectedActor.system.cskills.data[s][property] = updatedValue; // printing the new value - const systemSkillKey = `system.cskills.data.${s}.${property}`; - selectedActor.update({[systemSkillKey]:updatedValue }); // updating actor's data - updated = true; - } - } - } - return updated; } catch(e){ return false; } } +/** + * renvoie le score de Sang froid (carac mental + social) + * @param {VermineActor} + * @return {number||null} Data for rendering or null + */ +export function setCharacterSelfControl(actor) { + let returnedValue = null; + + for(let i in actor.system.abilities){ + if (actor.system.abilities[i].category == 'mental' || actor.system.abilities[i].category == 'social'){ + returnedValue += actor.system.abilities[i].value; + } + } + /// gestion de l'age + if (actor.system.identity.ageType == 1){ + returnedValue--; + } + + actor.update({ "system.attributes.self_control.max": returnedValue }); + return returnedValue; +} /** - * réinitialise toutes les dépenses d'usure + * renvoie le score d'Effort (carac physical + manual) * @param {VermineActor} - * @return {boolean} bool + * @return {number||null} Data for rendering or null */ -export function resetActorSkillUsure(selectedActor) { - try { - // on recherche les usures des compétences - for (let st in selectedActor.system.skills){ - for (let s in selectedActor.system.skills[st].data){ - const systemSkillKey = `system.skills.${st}.data.${s}.spent`; - selectedActor.update({[systemSkillKey]:0 }); // updating actor's data - } - } +export function setCharacterEffort(actor) { + let returnedValue = null; - // on recherche les usures des compétences céphaliques - for (let s in selectedActor.system.cskills.data){ - const systemSkillKey = `system.cskills.data.${s}.spent`; - selectedActor.update({[systemSkillKey]:0 }); // updating actor's data + for(let i in actor.system.abilities){ + if (actor.system.abilities[i].category == 'physical' || actor.system.abilities[i].category == 'manual'){ + returnedValue += actor.system.abilities[i].value; } - return true; - } catch(e){ - return false; } + + /// gestion de l'age + if (actor.system.identity.ageType == 1){ + returnedValue--; + } else if (actor.system.identity.ageType == 3){ + returnedValue -= 2; + } + + actor.update({ "system.attributes.effort.max": returnedValue }); + + return returnedValue; +} + + +/** + * définis les scores de seuil + * @param {VermineActor} + * @return {number||null} Data for rendering or null + */ +export function setCharacterThresholds(actor) { + + const health = actor.system.abilities.health.value; + + let returnedValue = null; + + actor.update({ "system.minorWound.threshold": health }); + actor.update({ "system.majorWound.threshold": health + 3}); + actor.update({ "system.deadlyWound.threshold": (health + 7 < 11) ? health + 7 : 10 }); + + let lightWounds = 4; + let heavyWounds = 3; + let deadlyWounds = 2; + + if (actor.system.identity.ageType == 3){ + lightWounds--; + heavyWounds--; + deadlyWounds--; + } else if (actor.system.identity.ageType == 1){ + deadlyWounds--; + } + + actor.update({ "system.minorWound.max": lightWounds }); + actor.update({ "system.majorWound.max": heavyWounds }); + actor.update({ "system.deadlyWound.max": deadlyWounds }); + + // console.log('wounds', actor.system.minorWound, actor.system.majorWound, actor.system.deadlyWound); + + return returnedValue; } diff --git a/module/system/handlebars-manager.mjs b/module/system/handlebars-manager.mjs index 27f33c6..ffcca19 100644 --- a/module/system/handlebars-manager.mjs +++ b/module/system/handlebars-manager.mjs @@ -8,7 +8,6 @@ // Actor partials. - // "systems/vermine2047/templates/actor/parts/actor-features.html", "systems/vermine2047/templates/actor/parts/actor-id.hbs", "systems/vermine2047/templates/actor/parts/actor-totem.hbs", "systems/vermine2047/templates/actor/parts/character-features.hbs", @@ -32,6 +31,37 @@ }; +/** + * Produce a range of numbers (positive and/or negative), processing from + * `start` up to, but not including, `end`. + * + * @param {number} start Range start value (inclusive) + * @param {number} [end] Range end value (exclusive) + * @param {number} [step=1] Value to increment by + * @return {number[]} Array of numbers + */ +function range(start, end, step) { + /* jshint eqeqeq:false, maxcomplexity:7 */ + start = Number(start) || 0; + end = end == null ? end : Number(end); + step = step == null ? 1 : Number(step); + + if (end == null) { + end = start; + start = 0; + } + + var length = Math.max(Math.ceil((end - start) / (step || 1)), 0); + var result = new Array(length); + + for (var i = 0; i < length; i += 1) { + result[i] = start; + start += step; + } + + return result; +} + export const registerHandlebarsHelpers = function () { Handlebars.registerHelper('concat', (...args) => args.slice(0, -1).join('')); Handlebars.registerHelper('lower', e => e.toLocaleLowerCase()); @@ -176,4 +206,15 @@ export const registerHandlebarsHelpers = function () { if (isNpc) return "npc"; }); + + Handlebars.registerHelper('range', function() { + var args = Array.prototype.slice.call(arguments), + rangeArgs = args.slice(0, -1), + options = args[args.length - 1]; + + return range.apply(null, rangeArgs) + .map(function(num) { return options.fn(num); }) + .join(''); + }); + } \ No newline at end of file diff --git a/template.json b/template.json index cfe6235..ac452fc 100644 --- a/template.json +++ b/template.json @@ -5,20 +5,20 @@ "base": { "minorWound": { "threshold":1, - "value": 0, - "min": 0, - "max": 4 + "value": 4, + "min": 1, + "max": 5 }, "majorWound": { "threshold":4, - "value": 0, - "min": 0, - "max": 2 - } , + "value": 3, + "min": 1, + "max": 4 + }, "deadlyWound": { "threshold":8, - "value": 0, - "min": 0, + "value": 2, + "min": 1, "max": 2 } } diff --git a/templates/actor/parts/actor-combat.html b/templates/actor/parts/actor-combat.html index bab9db2..a490227 100644 --- a/templates/actor/parts/actor-combat.html +++ b/templates/actor/parts/actor-combat.html @@ -2,21 +2,33 @@

{{ localize "VERMINE.self_control"}}

- + / {{ system.attributes.self_control.max }}

{{ localize "VERMINE.effort"}}

- + / {{ system.attributes.effort.max }}

{{ localize "VERMINE.wounds.name"}}