From e5e271e424e0fa97ba2ffb6d73c4948f266f3a3d Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 19 Oct 2025 18:51:55 +0200 Subject: [PATCH 01/10] Corrections majuscules/couleurs --- module/actor/random/app-personnage-aleatoire.js | 2 +- .../commerce_Liste_d__quipement_1Nng9d8r6lrPHCaJ.yml | 10 +++++----- .../archetypes/personnage_Artisan_ryUZTa17LzNv25UY.yml | 2 +- .../personnage_Brigand_niv_3_ohmz9Jn4jxD88Kll.yml | 4 ++-- .../personnage_Brigand_niv_4_JARnWt2MQWDyRwQt.yml | 4 ++-- .../personnage_Chasseur_ranger_SJb0c8FDcYdd41rB.yml | 4 ++-- .../personnage_Chef_Brigand_niv_5_JQCwAOK64Yijwtch.yml | 4 ++-- .../archetypes/personnage_Erudit_CRRP8ucJpljX6tq8.yml | 2 +- .../personnage_Garde___Arc_niv_5_51vL4MhEE0asjgF2.yml | 4 ++-- ...onnage_Garde___Capitaine_niv_6_NX1nAqKKIcQlyGua.yml | 2 +- ...personnage_Garde___Lance_niv_5_2bRaEDuwZezKAyEq.yml | 4 ++-- ...ge_Garde____p_e_bouclier_niv_5_IeKSXignUpfUTU4m.yml | 4 ++-- .../personnage_M_nestrel_pSM0ku0RJNLvHSvF.yml | 2 +- .../personnage_M_nestrelle_5xPFHgrY5AIP9Mnb.yml | 2 +- .../personnage_Marchand_U9NNcXQBJmsI9Ttk.yml | 2 +- .../personnage_Noble__femme__oLDROOdwfctyRusH.yml | 2 +- .../personnage_Noble__homme__2KN3nKGZ36Qkn7Mf.yml | 2 +- .../archetypes/personnage_Paysan_V2WOs8deCYdBT2Jo.yml | 2 +- .../archetypes/personnage_Serveur_UNs4RBLYiGbfxd1c.yml | 2 +- .../personnage_Serveuse_jfXs7qaHEWQpIHud.yml | 2 +- .../personnage_Taverni_re_awZg7bGbTjEGRMiw.yml | 2 +- .../personnage_Tavernier_dMdBctaRRdGJgced.yml | 2 +- .../competence_Survie_en_D_sert_vDOAyWc2YnuhNnFF.yml | 2 +- .../armure_Cuir___M_tal_fDwsTMuug0Z5BdaA.yml | 2 +- .../armure_Drap_Matelass__vQ494sD9FgFI08kZ.yml | 2 +- .../personnage_Ch_vre_pied_qscItDC5z6Hr2Lrh.yml | 4 ++-- .../personnage_Chafouin_zACge7QxwyJkC6nD.yml | 2 +- .../humanoides/personnage_Cyan_esJWonwDGLFaMRK3.yml | 4 ++-- .../personnage_Cynof_rox_gscYFtwk73WrGvA5.yml | 4 ++-- .../humanoides/personnage_Dr_le_dW4RMKpz2WaXbW3h.yml | 2 +- .../personnage_Fi_rabras_ncXFs8oaZWG68Tzn.yml | 2 +- .../humanoides/personnage_Gigant_OKMXH6YpPXUyvqzN.yml | 4 ++-- .../humanoides/personnage_Gnome_EzV1Zxuwi7jwa6bj.yml | 4 ++-- .../humanoides/personnage_Groin_YQ6vavAVyZecPvGQ.yml | 2 +- .../humanoides/personnage_Ogre_b7ThiitioBVXxU7D.yml | 4 ++-- .../humanoides/personnage_Sagouin_XnBXyRyE2BUVVT1k.yml | 2 +- .../humanoides/personnage_Saure_kKI9izKrKftYVnvs.yml | 2 +- .../humanoides/personnage_Sylvain_nzw2q9BHSDN6TIQQ.yml | 2 +- .../personnage_Tortemoque_Pf4cLn0kandYzviD.yml | 2 +- .../personnage_Guerrier_Turme_z87rV5CJ3inc6ZPc.yml | 2 +- ...nation_al_atoire_de_comp_tence_E0WLgjn6LA9WsvKJ.yml | 2 +- ...personnage_l__rudit_Alchimiste_GJWEoGXy5kSd4sT8.yml | 4 ++-- .../personnage_le_Baladin_m63oPEPvCrds4akp.yml | 2 +- ...rsonnage_le_Combattant_de_Choc_jtJqqegMrF3fuND3.yml | 4 ++-- ...personnage_le_Coureur_des_Bois_8Jeas59CdpnnYabL.yml | 4 ++-- ...personnage_le_Coureur_des_Mers_7WgNJwO7p5QNraXA.yml | 4 ++-- ...personnage_le_Coureur_des_Rues_N5ybrpVwbpL8aPG0.yml | 4 ++-- ...nnage_le_Cuisinier_Haut_R_vant_X9d5McdSAT1Ivp39.yml | 4 ++-- .../personnage_le_Dilettante_hvNej1XRliayVZu1.yml | 4 ++-- ...nage_le_Haut_R_vant_Dilettante_4bI9HX4oomMEXrOT.yml | 4 ++-- ...rsonnage_le_Haut_R_vant_Erudit_AZBxORb7IYgXaOfb.yml | 2 +- ...rsonnage_le_Haut_R_vant_Muscl__OOIjBdFjCKdgJKff.yml | 4 ++-- ...ersonnage_le_Voyageur__tranger_Jas7Wr22jSllfkin.yml | 4 ++-- 53 files changed, 80 insertions(+), 80 deletions(-) diff --git a/module/actor/random/app-personnage-aleatoire.js b/module/actor/random/app-personnage-aleatoire.js index fabd2219..53d79f71 100644 --- a/module/actor/random/app-personnage-aleatoire.js +++ b/module/actor/random/app-personnage-aleatoire.js @@ -21,7 +21,7 @@ const RANDOM_VALUES = { 'system.sexe': { 'masculin': 1, 'féminin': 1 }, 'system.main': { 'droitier': 51, 'gaucher': 15, 'ambidextre': 6 }, 'system.cheveux': { 'noirs': 2, 'bruns': 5, 'châtains': 3, 'châtain clair': 5, 'blonds': 4, 'blond platine': 1, 'roux carotte': 1, 'roux cuivré': 3, 'chauve': 1 }, - 'system.yeux': { 'noirs': 2, 'noisette': 3, 'brun vert': 4, 'verts': 3, 'bleu clair': 3, 'bleu gris': 2, 'gris': 1, 'mauves': 1, 'indigos': 1 }, + 'system.yeux': { 'noirs': 2, 'noisette': 3, 'brun-vert': 4, 'verts': 3, 'bleu clair': 3, 'bleu gris': 2, 'gris': 1, 'mauves': 1, 'indigos': 1 }, } export class AppPersonnageAleatoire extends FormApplication { diff --git a/packs_src/archetypes/commerce_Liste_d__quipement_1Nng9d8r6lrPHCaJ.yml b/packs_src/archetypes/commerce_Liste_d__quipement_1Nng9d8r6lrPHCaJ.yml index 84675208..034bc2a3 100644 --- a/packs_src/archetypes/commerce_Liste_d__quipement_1Nng9d8r6lrPHCaJ.yml +++ b/packs_src/archetypes/commerce_Liste_d__quipement_1Nng9d8r6lrPHCaJ.yml @@ -1408,7 +1408,7 @@ items: coreVersion: '12.331' _key: '!actors.items!1Nng9d8r6lrPHCaJ.MxFDPQmm1900bWin' - _id: bNUVmIoLEROEIOIm - name: Cuir / Métal + name: Cuir / métal type: armure img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_metal.webp effects: [] @@ -1447,7 +1447,7 @@ items: coreVersion: '12.331' _key: '!actors.items!1Nng9d8r6lrPHCaJ.bNUVmIoLEROEIOIm' - _id: OKZvybZ9jJuX8ZDY - name: Cuir Epais + name: Cuir épais type: armure img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_epais.webp effects: [] @@ -1485,7 +1485,7 @@ items: coreVersion: '12.331' _key: '!actors.items!1Nng9d8r6lrPHCaJ.OKZvybZ9jJuX8ZDY' - _id: sgvPgIF2ars8IeHv - name: Cuir Souple + name: Cuir souple type: armure img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp effects: [] @@ -1553,7 +1553,7 @@ items: coreVersion: '12.331' _key: '!actors.items!1Nng9d8r6lrPHCaJ.rZxksRn5Ih4Sj4rN' - _id: oKCl27wSt33w6j7O - name: Drap Matelassé + name: Drap matelassé type: armure img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/drap_matelasse.webp effects: [] @@ -1625,7 +1625,7 @@ items: coreVersion: '12.331' _key: '!actors.items!1Nng9d8r6lrPHCaJ.Kv9Lb28qekqLU1F7' - _id: sFm86jqLy1K6q4Px - name: Mailles de Fer + name: Mailles de fer type: armure img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/mailles.webp effects: [] diff --git a/packs_src/archetypes/personnage_Artisan_ryUZTa17LzNv25UY.yml b/packs_src/archetypes/personnage_Artisan_ryUZTa17LzNv25UY.yml index 4df3ce95..f81ae942 100644 --- a/packs_src/archetypes/personnage_Artisan_ryUZTa17LzNv25UY.yml +++ b/packs_src/archetypes/personnage_Artisan_ryUZTa17LzNv25UY.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!ryUZTa17LzNv25UY.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} diff --git a/packs_src/archetypes/personnage_Brigand_niv_3_ohmz9Jn4jxD88Kll.yml b/packs_src/archetypes/personnage_Brigand_niv_3_ohmz9Jn4jxD88Kll.yml index 78c5f5f9..1f905d68 100644 --- a/packs_src/archetypes/personnage_Brigand_niv_3_ohmz9Jn4jxD88Kll.yml +++ b/packs_src/archetypes/personnage_Brigand_niv_3_ohmz9Jn4jxD88Kll.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!ohmz9Jn4jxD88Kll.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} @@ -2028,7 +2028,7 @@ items: coreVersion: '12.331' _key: '!actors.items!ohmz9Jn4jxD88Kll.c5wursWW03ckpyqn' - _id: i42zzohNKPYS0kMp - name: Drap Matelassé + name: Drap matelassé type: armure sort: 6900000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/drap_matelasse.webp diff --git a/packs_src/archetypes/personnage_Brigand_niv_4_JARnWt2MQWDyRwQt.yml b/packs_src/archetypes/personnage_Brigand_niv_4_JARnWt2MQWDyRwQt.yml index 007b8921..cc0fbb60 100644 --- a/packs_src/archetypes/personnage_Brigand_niv_4_JARnWt2MQWDyRwQt.yml +++ b/packs_src/archetypes/personnage_Brigand_niv_4_JARnWt2MQWDyRwQt.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!JARnWt2MQWDyRwQt.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} @@ -2390,7 +2390,7 @@ items: coreVersion: '12.331' _key: '!actors.items!JARnWt2MQWDyRwQt.RYIOLj7To0rr9RuH' - _id: bycXvPmShoXAnteu - name: Cuir Souple + name: Cuir souple type: armure sort: 8100000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/archetypes/personnage_Chasseur_ranger_SJb0c8FDcYdd41rB.yml b/packs_src/archetypes/personnage_Chasseur_ranger_SJb0c8FDcYdd41rB.yml index c38ac81d..b8f7d7e8 100644 --- a/packs_src/archetypes/personnage_Chasseur_ranger_SJb0c8FDcYdd41rB.yml +++ b/packs_src/archetypes/personnage_Chasseur_ranger_SJb0c8FDcYdd41rB.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!SJb0c8FDcYdd41rB.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2060,7 +2060,7 @@ items: coreVersion: '12.331' _key: '!actors.items!SJb0c8FDcYdd41rB.EqKsIbamIeYP3GHz' - _id: tei7L0X6H6kNrQaI - name: Cuir Souple + name: Cuir souple type: armure sort: 7100000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/archetypes/personnage_Chef_Brigand_niv_5_JQCwAOK64Yijwtch.yml b/packs_src/archetypes/personnage_Chef_Brigand_niv_5_JQCwAOK64Yijwtch.yml index e95b2d84..b335dabe 100644 --- a/packs_src/archetypes/personnage_Chef_Brigand_niv_5_JQCwAOK64Yijwtch.yml +++ b/packs_src/archetypes/personnage_Chef_Brigand_niv_5_JQCwAOK64Yijwtch.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!JQCwAOK64Yijwtch.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} @@ -2297,7 +2297,7 @@ items: coreVersion: '12.331' _key: '!actors.items!JQCwAOK64Yijwtch.9mOVjXVNdvnf7isr' - _id: ISONFNOaWkW2TaE8 - name: Cuir / Métal + name: Cuir / métal type: armure sort: 8400000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_metal.webp diff --git a/packs_src/archetypes/personnage_Erudit_CRRP8ucJpljX6tq8.yml b/packs_src/archetypes/personnage_Erudit_CRRP8ucJpljX6tq8.yml index c63d85f5..0054eb31 100644 --- a/packs_src/archetypes/personnage_Erudit_CRRP8ucJpljX6tq8.yml +++ b/packs_src/archetypes/personnage_Erudit_CRRP8ucJpljX6tq8.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!CRRP8ucJpljX6tq8.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} diff --git a/packs_src/archetypes/personnage_Garde___Arc_niv_5_51vL4MhEE0asjgF2.yml b/packs_src/archetypes/personnage_Garde___Arc_niv_5_51vL4MhEE0asjgF2.yml index aa0c0696..a40827dc 100644 --- a/packs_src/archetypes/personnage_Garde___Arc_niv_5_51vL4MhEE0asjgF2.yml +++ b/packs_src/archetypes/personnage_Garde___Arc_niv_5_51vL4MhEE0asjgF2.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!51vL4MhEE0asjgF2.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} @@ -2202,7 +2202,7 @@ items: coreVersion: '12.331' _key: '!actors.items!51vL4MhEE0asjgF2.EqKsIbamIeYP3GHz' - _id: tei7L0X6H6kNrQaI - name: Cuir Souple + name: Cuir souple type: armure sort: 7100000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/archetypes/personnage_Garde___Capitaine_niv_6_NX1nAqKKIcQlyGua.yml b/packs_src/archetypes/personnage_Garde___Capitaine_niv_6_NX1nAqKKIcQlyGua.yml index b99a87af..0aa70c37 100644 --- a/packs_src/archetypes/personnage_Garde___Capitaine_niv_6_NX1nAqKKIcQlyGua.yml +++ b/packs_src/archetypes/personnage_Garde___Capitaine_niv_6_NX1nAqKKIcQlyGua.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!NX1nAqKKIcQlyGua.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} diff --git a/packs_src/archetypes/personnage_Garde___Lance_niv_5_2bRaEDuwZezKAyEq.yml b/packs_src/archetypes/personnage_Garde___Lance_niv_5_2bRaEDuwZezKAyEq.yml index c3178754..b5b2852a 100644 --- a/packs_src/archetypes/personnage_Garde___Lance_niv_5_2bRaEDuwZezKAyEq.yml +++ b/packs_src/archetypes/personnage_Garde___Lance_niv_5_2bRaEDuwZezKAyEq.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!2bRaEDuwZezKAyEq.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} @@ -2028,7 +2028,7 @@ items: coreVersion: '12.331' _key: '!actors.items!2bRaEDuwZezKAyEq.c5wursWW03ckpyqn' - _id: cMiKr3BxOauOkMIm - name: Mailles de Fer + name: Mailles de fer type: armure sort: 6900000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/mailles.webp diff --git a/packs_src/archetypes/personnage_Garde____p_e_bouclier_niv_5_IeKSXignUpfUTU4m.yml b/packs_src/archetypes/personnage_Garde____p_e_bouclier_niv_5_IeKSXignUpfUTU4m.yml index e49fb49f..026ea282 100644 --- a/packs_src/archetypes/personnage_Garde____p_e_bouclier_niv_5_IeKSXignUpfUTU4m.yml +++ b/packs_src/archetypes/personnage_Garde____p_e_bouclier_niv_5_IeKSXignUpfUTU4m.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!IeKSXignUpfUTU4m.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} @@ -2028,7 +2028,7 @@ items: coreVersion: '12.331' _key: '!actors.items!IeKSXignUpfUTU4m.c5wursWW03ckpyqn' - _id: cMiKr3BxOauOkMIm - name: Mailles de Fer + name: Mailles de fer type: armure sort: 6900000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/mailles.webp diff --git a/packs_src/archetypes/personnage_M_nestrel_pSM0ku0RJNLvHSvF.yml b/packs_src/archetypes/personnage_M_nestrel_pSM0ku0RJNLvHSvF.yml index cbed326e..dc5a0fd2 100644 --- a/packs_src/archetypes/personnage_M_nestrel_pSM0ku0RJNLvHSvF.yml +++ b/packs_src/archetypes/personnage_M_nestrel_pSM0ku0RJNLvHSvF.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!pSM0ku0RJNLvHSvF.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/archetypes/personnage_M_nestrelle_5xPFHgrY5AIP9Mnb.yml b/packs_src/archetypes/personnage_M_nestrelle_5xPFHgrY5AIP9Mnb.yml index a035b897..e2f10d85 100644 --- a/packs_src/archetypes/personnage_M_nestrelle_5xPFHgrY5AIP9Mnb.yml +++ b/packs_src/archetypes/personnage_M_nestrelle_5xPFHgrY5AIP9Mnb.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!5xPFHgrY5AIP9Mnb.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/archetypes/personnage_Marchand_U9NNcXQBJmsI9Ttk.yml b/packs_src/archetypes/personnage_Marchand_U9NNcXQBJmsI9Ttk.yml index e1f66f21..a05209ae 100644 --- a/packs_src/archetypes/personnage_Marchand_U9NNcXQBJmsI9Ttk.yml +++ b/packs_src/archetypes/personnage_Marchand_U9NNcXQBJmsI9Ttk.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!U9NNcXQBJmsI9Ttk.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} diff --git a/packs_src/archetypes/personnage_Noble__femme__oLDROOdwfctyRusH.yml b/packs_src/archetypes/personnage_Noble__femme__oLDROOdwfctyRusH.yml index db6c465f..8da2ac77 100644 --- a/packs_src/archetypes/personnage_Noble__femme__oLDROOdwfctyRusH.yml +++ b/packs_src/archetypes/personnage_Noble__femme__oLDROOdwfctyRusH.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!oLDROOdwfctyRusH.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/archetypes/personnage_Noble__homme__2KN3nKGZ36Qkn7Mf.yml b/packs_src/archetypes/personnage_Noble__homme__2KN3nKGZ36Qkn7Mf.yml index 8fe5519e..33f7636f 100644 --- a/packs_src/archetypes/personnage_Noble__homme__2KN3nKGZ36Qkn7Mf.yml +++ b/packs_src/archetypes/personnage_Noble__homme__2KN3nKGZ36Qkn7Mf.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!2KN3nKGZ36Qkn7Mf.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/archetypes/personnage_Paysan_V2WOs8deCYdBT2Jo.yml b/packs_src/archetypes/personnage_Paysan_V2WOs8deCYdBT2Jo.yml index b6de8275..30d64b44 100644 --- a/packs_src/archetypes/personnage_Paysan_V2WOs8deCYdBT2Jo.yml +++ b/packs_src/archetypes/personnage_Paysan_V2WOs8deCYdBT2Jo.yml @@ -1605,7 +1605,7 @@ items: coreVersion: '12.331' _key: '!actors.items!V2WOs8deCYdBT2Jo.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} diff --git a/packs_src/archetypes/personnage_Serveur_UNs4RBLYiGbfxd1c.yml b/packs_src/archetypes/personnage_Serveur_UNs4RBLYiGbfxd1c.yml index 38435133..75a815d5 100644 --- a/packs_src/archetypes/personnage_Serveur_UNs4RBLYiGbfxd1c.yml +++ b/packs_src/archetypes/personnage_Serveur_UNs4RBLYiGbfxd1c.yml @@ -1605,7 +1605,7 @@ items: coreVersion: '12.331' _key: '!actors.items!UNs4RBLYiGbfxd1c.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} diff --git a/packs_src/archetypes/personnage_Serveuse_jfXs7qaHEWQpIHud.yml b/packs_src/archetypes/personnage_Serveuse_jfXs7qaHEWQpIHud.yml index 09828fee..1e2a24e8 100644 --- a/packs_src/archetypes/personnage_Serveuse_jfXs7qaHEWQpIHud.yml +++ b/packs_src/archetypes/personnage_Serveuse_jfXs7qaHEWQpIHud.yml @@ -1605,7 +1605,7 @@ items: coreVersion: '12.331' _key: '!actors.items!jfXs7qaHEWQpIHud.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} diff --git a/packs_src/archetypes/personnage_Taverni_re_awZg7bGbTjEGRMiw.yml b/packs_src/archetypes/personnage_Taverni_re_awZg7bGbTjEGRMiw.yml index d3bf64c8..d39f67d5 100644 --- a/packs_src/archetypes/personnage_Taverni_re_awZg7bGbTjEGRMiw.yml +++ b/packs_src/archetypes/personnage_Taverni_re_awZg7bGbTjEGRMiw.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!awZg7bGbTjEGRMiw.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} diff --git a/packs_src/archetypes/personnage_Tavernier_dMdBctaRRdGJgced.yml b/packs_src/archetypes/personnage_Tavernier_dMdBctaRRdGJgced.yml index abf7a744..28828eae 100644 --- a/packs_src/archetypes/personnage_Tavernier_dMdBctaRRdGJgced.yml +++ b/packs_src/archetypes/personnage_Tavernier_dMdBctaRRdGJgced.yml @@ -1604,7 +1604,7 @@ items: coreVersion: '12.331' _key: '!actors.items!dMdBctaRRdGJgced.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 flags: {} diff --git a/packs_src/competences/competence_Survie_en_D_sert_vDOAyWc2YnuhNnFF.yml b/packs_src/competences/competence_Survie_en_D_sert_vDOAyWc2YnuhNnFF.yml index 518e9f32..d51599e8 100644 --- a/packs_src/competences/competence_Survie_en_D_sert_vDOAyWc2YnuhNnFF.yml +++ b/packs_src/competences/competence_Survie_en_D_sert_vDOAyWc2YnuhNnFF.yml @@ -1,4 +1,4 @@ -name: Survie en Désert +name: Survie en désert type: competence img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp _id: vDOAyWc2YnuhNnFF diff --git a/packs_src/equipement/armure_Cuir___M_tal_fDwsTMuug0Z5BdaA.yml b/packs_src/equipement/armure_Cuir___M_tal_fDwsTMuug0Z5BdaA.yml index 03314d08..89a5e39e 100644 --- a/packs_src/equipement/armure_Cuir___M_tal_fDwsTMuug0Z5BdaA.yml +++ b/packs_src/equipement/armure_Cuir___M_tal_fDwsTMuug0Z5BdaA.yml @@ -1,5 +1,5 @@ _id: fDwsTMuug0Z5BdaA -name: Cuir / Métal +name: Cuir / métal type: armure img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_metal.webp effects: [] diff --git a/packs_src/equipement/armure_Drap_Matelass__vQ494sD9FgFI08kZ.yml b/packs_src/equipement/armure_Drap_Matelass__vQ494sD9FgFI08kZ.yml index 34ce55f1..97a73aaf 100644 --- a/packs_src/equipement/armure_Drap_Matelass__vQ494sD9FgFI08kZ.yml +++ b/packs_src/equipement/armure_Drap_Matelass__vQ494sD9FgFI08kZ.yml @@ -1,5 +1,5 @@ _id: vQ494sD9FgFI08kZ -name: Drap Matelassé +name: Drap matelassé type: armure img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/drap_matelasse.webp effects: [] diff --git a/packs_src/humanoides/personnage_Ch_vre_pied_qscItDC5z6Hr2Lrh.yml b/packs_src/humanoides/personnage_Ch_vre_pied_qscItDC5z6Hr2Lrh.yml index 08f1d2b0..f904a849 100644 --- a/packs_src/humanoides/personnage_Ch_vre_pied_qscItDC5z6Hr2Lrh.yml +++ b/packs_src/humanoides/personnage_Ch_vre_pied_qscItDC5z6Hr2Lrh.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!qscItDC5z6Hr2Lrh.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -1961,7 +1961,7 @@ items: coreVersion: '12.331' _key: '!actors.items!qscItDC5z6Hr2Lrh.c5wursWW03ckpyqn' - _id: 0s8mKVg0m9CzQKoa - name: Cuir Souple + name: Cuir souple type: armure sort: 100000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/humanoides/personnage_Chafouin_zACge7QxwyJkC6nD.yml b/packs_src/humanoides/personnage_Chafouin_zACge7QxwyJkC6nD.yml index 9ff1e461..5f47cc85 100644 --- a/packs_src/humanoides/personnage_Chafouin_zACge7QxwyJkC6nD.yml +++ b/packs_src/humanoides/personnage_Chafouin_zACge7QxwyJkC6nD.yml @@ -1550,7 +1550,7 @@ items: coreVersion: '12.331' _key: '!actors.items!zACge7QxwyJkC6nD.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5500000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/humanoides/personnage_Cyan_esJWonwDGLFaMRK3.yml b/packs_src/humanoides/personnage_Cyan_esJWonwDGLFaMRK3.yml index cd12dac8..60d2b56d 100644 --- a/packs_src/humanoides/personnage_Cyan_esJWonwDGLFaMRK3.yml +++ b/packs_src/humanoides/personnage_Cyan_esJWonwDGLFaMRK3.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!esJWonwDGLFaMRK3.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2006,7 +2006,7 @@ items: coreVersion: '12.331' _key: '!actors.items!esJWonwDGLFaMRK3.LkCSQ9Kh4HD0ENBj' - _id: RCexiBHCy0K6tGlx - name: Cuir Souple + name: Cuir souple type: armure sort: 6900000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/humanoides/personnage_Cynof_rox_gscYFtwk73WrGvA5.yml b/packs_src/humanoides/personnage_Cynof_rox_gscYFtwk73WrGvA5.yml index 90fc257b..3ce814a6 100644 --- a/packs_src/humanoides/personnage_Cynof_rox_gscYFtwk73WrGvA5.yml +++ b/packs_src/humanoides/personnage_Cynof_rox_gscYFtwk73WrGvA5.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!gscYFtwk73WrGvA5.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2059,7 +2059,7 @@ items: coreVersion: '12.331' _key: '!actors.items!gscYFtwk73WrGvA5.lzKudaY9nzr7DkEq' - _id: 1wjf9mDIMSMHF4Jj - name: Cuir Souple + name: Cuir souple type: armure sort: 7000000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/humanoides/personnage_Dr_le_dW4RMKpz2WaXbW3h.yml b/packs_src/humanoides/personnage_Dr_le_dW4RMKpz2WaXbW3h.yml index e2540b1e..c0198978 100644 --- a/packs_src/humanoides/personnage_Dr_le_dW4RMKpz2WaXbW3h.yml +++ b/packs_src/humanoides/personnage_Dr_le_dW4RMKpz2WaXbW3h.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!dW4RMKpz2WaXbW3h.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/humanoides/personnage_Fi_rabras_ncXFs8oaZWG68Tzn.yml b/packs_src/humanoides/personnage_Fi_rabras_ncXFs8oaZWG68Tzn.yml index 23d2d2ab..9b6d13a8 100644 --- a/packs_src/humanoides/personnage_Fi_rabras_ncXFs8oaZWG68Tzn.yml +++ b/packs_src/humanoides/personnage_Fi_rabras_ncXFs8oaZWG68Tzn.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!ncXFs8oaZWG68Tzn.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/humanoides/personnage_Gigant_OKMXH6YpPXUyvqzN.yml b/packs_src/humanoides/personnage_Gigant_OKMXH6YpPXUyvqzN.yml index 27e5f22d..1ee71a8a 100644 --- a/packs_src/humanoides/personnage_Gigant_OKMXH6YpPXUyvqzN.yml +++ b/packs_src/humanoides/personnage_Gigant_OKMXH6YpPXUyvqzN.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!OKMXH6YpPXUyvqzN.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2052,7 +2052,7 @@ items: coreVersion: '12.331' _key: '!actors.items!OKMXH6YpPXUyvqzN.a6dPg35gmlWfgbbm' - _id: nYijZF3MgDRAeOwb - name: Cuir Souple + name: Cuir souple type: armure sort: 7000000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/humanoides/personnage_Gnome_EzV1Zxuwi7jwa6bj.yml b/packs_src/humanoides/personnage_Gnome_EzV1Zxuwi7jwa6bj.yml index d4fcec41..dc2c4d3b 100644 --- a/packs_src/humanoides/personnage_Gnome_EzV1Zxuwi7jwa6bj.yml +++ b/packs_src/humanoides/personnage_Gnome_EzV1Zxuwi7jwa6bj.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!EzV1Zxuwi7jwa6bj.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -1961,7 +1961,7 @@ items: coreVersion: '12.331' _key: '!actors.items!EzV1Zxuwi7jwa6bj.c5wursWW03ckpyqn' - _id: Q359FY95mPDxyQEb - name: Cuir Souple + name: Cuir souple type: armure sort: 6800000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/humanoides/personnage_Groin_YQ6vavAVyZecPvGQ.yml b/packs_src/humanoides/personnage_Groin_YQ6vavAVyZecPvGQ.yml index 5fc957ad..1d88be34 100644 --- a/packs_src/humanoides/personnage_Groin_YQ6vavAVyZecPvGQ.yml +++ b/packs_src/humanoides/personnage_Groin_YQ6vavAVyZecPvGQ.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!YQ6vavAVyZecPvGQ.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/humanoides/personnage_Ogre_b7ThiitioBVXxU7D.yml b/packs_src/humanoides/personnage_Ogre_b7ThiitioBVXxU7D.yml index 172c82f5..6008068d 100644 --- a/packs_src/humanoides/personnage_Ogre_b7ThiitioBVXxU7D.yml +++ b/packs_src/humanoides/personnage_Ogre_b7ThiitioBVXxU7D.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!b7ThiitioBVXxU7D.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2047,7 +2047,7 @@ items: coreVersion: '12.331' _key: '!actors.items!b7ThiitioBVXxU7D.KT8qpVHGD0Ku8TV7' - _id: YFFEw7kpUAgEdo5R - name: Cuir Souple + name: Cuir souple type: armure sort: 900001 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/humanoides/personnage_Sagouin_XnBXyRyE2BUVVT1k.yml b/packs_src/humanoides/personnage_Sagouin_XnBXyRyE2BUVVT1k.yml index 5a93e392..6e761b94 100644 --- a/packs_src/humanoides/personnage_Sagouin_XnBXyRyE2BUVVT1k.yml +++ b/packs_src/humanoides/personnage_Sagouin_XnBXyRyE2BUVVT1k.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!XnBXyRyE2BUVVT1k.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/humanoides/personnage_Saure_kKI9izKrKftYVnvs.yml b/packs_src/humanoides/personnage_Saure_kKI9izKrKftYVnvs.yml index 9846b519..66aa3582 100644 --- a/packs_src/humanoides/personnage_Saure_kKI9izKrKftYVnvs.yml +++ b/packs_src/humanoides/personnage_Saure_kKI9izKrKftYVnvs.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!kKI9izKrKftYVnvs.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/humanoides/personnage_Sylvain_nzw2q9BHSDN6TIQQ.yml b/packs_src/humanoides/personnage_Sylvain_nzw2q9BHSDN6TIQQ.yml index 3ca50869..5fcae43d 100644 --- a/packs_src/humanoides/personnage_Sylvain_nzw2q9BHSDN6TIQQ.yml +++ b/packs_src/humanoides/personnage_Sylvain_nzw2q9BHSDN6TIQQ.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!nzw2q9BHSDN6TIQQ.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/humanoides/personnage_Tortemoque_Pf4cLn0kandYzviD.yml b/packs_src/humanoides/personnage_Tortemoque_Pf4cLn0kandYzviD.yml index 391fc71a..f78e34aa 100644 --- a/packs_src/humanoides/personnage_Tortemoque_Pf4cLn0kandYzviD.yml +++ b/packs_src/humanoides/personnage_Tortemoque_Pf4cLn0kandYzviD.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!Pf4cLn0kandYzviD.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/invocations/personnage_Guerrier_Turme_z87rV5CJ3inc6ZPc.yml b/packs_src/invocations/personnage_Guerrier_Turme_z87rV5CJ3inc6ZPc.yml index dd1568cc..c9603efb 100644 --- a/packs_src/invocations/personnage_Guerrier_Turme_z87rV5CJ3inc6ZPc.yml +++ b/packs_src/invocations/personnage_Guerrier_Turme_z87rV5CJ3inc6ZPc.yml @@ -128,7 +128,7 @@ items: coreVersion: '12.331' _key: '!actors.items!z87rV5CJ3inc6ZPc.VyAJK54OPjiRt8oH' - _id: KR10Pvv0bzDem5OP - name: Cuir Souple + name: Cuir souple type: armure sort: 7200000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/tables-diverses/tables_D_termination_al_atoire_de_comp_tence_E0WLgjn6LA9WsvKJ.yml b/packs_src/tables-diverses/tables_D_termination_al_atoire_de_comp_tence_E0WLgjn6LA9WsvKJ.yml index fc904c00..bebd3dd0 100644 --- a/packs_src/tables-diverses/tables_D_termination_al_atoire_de_comp_tence_E0WLgjn6LA9WsvKJ.yml +++ b/packs_src/tables-diverses/tables_D_termination_al_atoire_de_comp_tence_E0WLgjn6LA9WsvKJ.yml @@ -668,7 +668,7 @@ results: - _id: ZhPRAyUuEYcG9X5z flags: {} type: pack - text: Survie en Désert + text: Survie en désert img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp weight: 1 range: diff --git a/packs_src/voyageurs/personnage_l__rudit_Alchimiste_GJWEoGXy5kSd4sT8.yml b/packs_src/voyageurs/personnage_l__rudit_Alchimiste_GJWEoGXy5kSd4sT8.yml index 70214543..ee67571b 100644 --- a/packs_src/voyageurs/personnage_l__rudit_Alchimiste_GJWEoGXy5kSd4sT8.yml +++ b/packs_src/voyageurs/personnage_l__rudit_Alchimiste_GJWEoGXy5kSd4sT8.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!GJWEoGXy5kSd4sT8.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2180,7 +2180,7 @@ items: coreVersion: '12.331' _key: '!actors.items!GJWEoGXy5kSd4sT8.v9ZBfOr9DzqsXj99' - _id: bRqg1kGSwJ6S82lQ - name: Drap Matelassé + name: Drap matelassé type: armure sort: 7600000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/drap_matelasse.webp diff --git a/packs_src/voyageurs/personnage_le_Baladin_m63oPEPvCrds4akp.yml b/packs_src/voyageurs/personnage_le_Baladin_m63oPEPvCrds4akp.yml index a48d5d2d..d46eccf4 100644 --- a/packs_src/voyageurs/personnage_le_Baladin_m63oPEPvCrds4akp.yml +++ b/packs_src/voyageurs/personnage_le_Baladin_m63oPEPvCrds4akp.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!m63oPEPvCrds4akp.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/voyageurs/personnage_le_Combattant_de_Choc_jtJqqegMrF3fuND3.yml b/packs_src/voyageurs/personnage_le_Combattant_de_Choc_jtJqqegMrF3fuND3.yml index fbaaa5dc..f5d548fa 100644 --- a/packs_src/voyageurs/personnage_le_Combattant_de_Choc_jtJqqegMrF3fuND3.yml +++ b/packs_src/voyageurs/personnage_le_Combattant_de_Choc_jtJqqegMrF3fuND3.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!jtJqqegMrF3fuND3.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2129,7 +2129,7 @@ items: coreVersion: '12.331' _key: '!actors.items!jtJqqegMrF3fuND3.R34t4VV4k8eotNl1' - _id: YIIwnf5q41kYDvYg - name: Cuir Souple + name: Cuir souple type: armure sort: 7500000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/voyageurs/personnage_le_Coureur_des_Bois_8Jeas59CdpnnYabL.yml b/packs_src/voyageurs/personnage_le_Coureur_des_Bois_8Jeas59CdpnnYabL.yml index 9787221c..db52c67c 100644 --- a/packs_src/voyageurs/personnage_le_Coureur_des_Bois_8Jeas59CdpnnYabL.yml +++ b/packs_src/voyageurs/personnage_le_Coureur_des_Bois_8Jeas59CdpnnYabL.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!8Jeas59CdpnnYabL.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2079,7 +2079,7 @@ items: coreVersion: '12.331' _key: '!actors.items!8Jeas59CdpnnYabL.8nMoKLsPd73xCozD' - _id: 9hg8nq9rCNP1Te02 - name: Cuir Souple incomplet + name: Cuir souple incomplet type: armure sort: 7300000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/voyageurs/personnage_le_Coureur_des_Mers_7WgNJwO7p5QNraXA.yml b/packs_src/voyageurs/personnage_le_Coureur_des_Mers_7WgNJwO7p5QNraXA.yml index 76b88d96..345aa2c9 100644 --- a/packs_src/voyageurs/personnage_le_Coureur_des_Mers_7WgNJwO7p5QNraXA.yml +++ b/packs_src/voyageurs/personnage_le_Coureur_des_Mers_7WgNJwO7p5QNraXA.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!7WgNJwO7p5QNraXA.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2079,7 +2079,7 @@ items: coreVersion: '12.331' _key: '!actors.items!7WgNJwO7p5QNraXA.FfAGblYROMNVtNYr' - _id: VULMiJlcvgYZnabY - name: Cuir Souple + name: Cuir souple type: armure sort: 7300000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/voyageurs/personnage_le_Coureur_des_Rues_N5ybrpVwbpL8aPG0.yml b/packs_src/voyageurs/personnage_le_Coureur_des_Rues_N5ybrpVwbpL8aPG0.yml index 8de39dd6..5abb7613 100644 --- a/packs_src/voyageurs/personnage_le_Coureur_des_Rues_N5ybrpVwbpL8aPG0.yml +++ b/packs_src/voyageurs/personnage_le_Coureur_des_Rues_N5ybrpVwbpL8aPG0.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!N5ybrpVwbpL8aPG0.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp effects: [] @@ -2103,7 +2103,7 @@ items: coreVersion: '12.331' _key: '!actors.items!N5ybrpVwbpL8aPG0.wJSlyiNwOTPDRjwu' - _id: YIIwnf5q41kYDvYg - name: Cuir Souple + name: Cuir souple type: armure img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp effects: [] diff --git a/packs_src/voyageurs/personnage_le_Cuisinier_Haut_R_vant_X9d5McdSAT1Ivp39.yml b/packs_src/voyageurs/personnage_le_Cuisinier_Haut_R_vant_X9d5McdSAT1Ivp39.yml index fdaaaf3a..6e372ff4 100644 --- a/packs_src/voyageurs/personnage_le_Cuisinier_Haut_R_vant_X9d5McdSAT1Ivp39.yml +++ b/packs_src/voyageurs/personnage_le_Cuisinier_Haut_R_vant_X9d5McdSAT1Ivp39.yml @@ -1551,7 +1551,7 @@ items: coreVersion: '12.331' _key: '!actors.items!X9d5McdSAT1Ivp39.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp effects: [] @@ -2280,7 +2280,7 @@ items: coreVersion: '12.331' _key: '!actors.items!X9d5McdSAT1Ivp39.vnJF9zTr7ZuBsqCN' - _id: GbkCGqshpBmNBjcq - name: Cuir Souple + name: Cuir souple type: armure img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp effects: [] diff --git a/packs_src/voyageurs/personnage_le_Dilettante_hvNej1XRliayVZu1.yml b/packs_src/voyageurs/personnage_le_Dilettante_hvNej1XRliayVZu1.yml index 6a03e0f3..dc67d1ba 100644 --- a/packs_src/voyageurs/personnage_le_Dilettante_hvNej1XRliayVZu1.yml +++ b/packs_src/voyageurs/personnage_le_Dilettante_hvNej1XRliayVZu1.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!hvNej1XRliayVZu1.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2829,7 +2829,7 @@ items: coreVersion: '12.331' _key: '!actors.items!hvNej1XRliayVZu1.nymiOzYMEtQuNHUQ' - _id: EVsJLqAunGusLuG3 - name: Drap Matelassé + name: Drap matelassé type: armure sort: 12200000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/drap_matelasse.webp diff --git a/packs_src/voyageurs/personnage_le_Haut_R_vant_Dilettante_4bI9HX4oomMEXrOT.yml b/packs_src/voyageurs/personnage_le_Haut_R_vant_Dilettante_4bI9HX4oomMEXrOT.yml index d159e2b7..740819cf 100644 --- a/packs_src/voyageurs/personnage_le_Haut_R_vant_Dilettante_4bI9HX4oomMEXrOT.yml +++ b/packs_src/voyageurs/personnage_le_Haut_R_vant_Dilettante_4bI9HX4oomMEXrOT.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!4bI9HX4oomMEXrOT.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2349,7 +2349,7 @@ items: coreVersion: '12.331' _key: '!actors.items!4bI9HX4oomMEXrOT.Pt9tHXRughUSa8ip' - _id: YN17FdeS2OoIk8ZO - name: Cuir Souple + name: Cuir souple type: armure sort: 7900000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp diff --git a/packs_src/voyageurs/personnage_le_Haut_R_vant_Erudit_AZBxORb7IYgXaOfb.yml b/packs_src/voyageurs/personnage_le_Haut_R_vant_Erudit_AZBxORb7IYgXaOfb.yml index 410335b7..ca2b4896 100644 --- a/packs_src/voyageurs/personnage_le_Haut_R_vant_Erudit_AZBxORb7IYgXaOfb.yml +++ b/packs_src/voyageurs/personnage_le_Haut_R_vant_Erudit_AZBxORb7IYgXaOfb.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!AZBxORb7IYgXaOfb.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp diff --git a/packs_src/voyageurs/personnage_le_Haut_R_vant_Muscl__OOIjBdFjCKdgJKff.yml b/packs_src/voyageurs/personnage_le_Haut_R_vant_Muscl__OOIjBdFjCKdgJKff.yml index 30066b17..df23ab86 100644 --- a/packs_src/voyageurs/personnage_le_Haut_R_vant_Muscl__OOIjBdFjCKdgJKff.yml +++ b/packs_src/voyageurs/personnage_le_Haut_R_vant_Muscl__OOIjBdFjCKdgJKff.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!OOIjBdFjCKdgJKff.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2645,7 +2645,7 @@ items: coreVersion: '12.331' _key: '!actors.items!OOIjBdFjCKdgJKff.U5UPKOmTUiMgQg2Q' - _id: S1P1xUzJU7EacoqZ - name: Cuir Epais + name: Cuir épais type: armure sort: 8200000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_epais.webp diff --git a/packs_src/voyageurs/personnage_le_Voyageur__tranger_Jas7Wr22jSllfkin.yml b/packs_src/voyageurs/personnage_le_Voyageur__tranger_Jas7Wr22jSllfkin.yml index 9a783f8f..f40ba536 100644 --- a/packs_src/voyageurs/personnage_le_Voyageur__tranger_Jas7Wr22jSllfkin.yml +++ b/packs_src/voyageurs/personnage_le_Voyageur__tranger_Jas7Wr22jSllfkin.yml @@ -1552,7 +1552,7 @@ items: coreVersion: '12.331' _key: '!actors.items!Jas7Wr22jSllfkin.oHnSnCw1RAW5t15S' - _id: vDOAyWc2YnuhNnFF - name: Survie en Désert + name: Survie en désert type: competence sort: 5400000 img: systems/foundryvtt-reve-de-dragon/icons/competence_survie_desert.webp @@ -2079,7 +2079,7 @@ items: coreVersion: '12.331' _key: '!actors.items!Jas7Wr22jSllfkin.NkdJ8b6AqVmuILUM' - _id: e1c2XoWbmqovIbWL - name: Cuir Souple + name: Cuir souple type: armure sort: 7300000 img: systems/foundryvtt-reve-de-dragon/icons/armes_armures/cuir_souple.webp From 77f2de2c5f0a9cca0096d2b39e0a50e863327c3a Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 19 Oct 2025 23:45:30 +0200 Subject: [PATCH 02/10] =?UTF-8?q?Jet=20V2=20pour=20les=20cr=C3=A9atures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.md | 5 ++ module/actor.js | 6 +- module/actor/base-actor-reve.js | 65 +++++++++++----------- module/actor/base-actor-sheet.js | 3 +- module/actor/export-scriptarium/mapping.js | 5 +- module/item-competencecreature.js | 4 +- module/rdd-combat.js | 2 - module/roll/roll-constants.mjs | 2 +- module/roll/roll-part-attaque.mjs | 2 +- module/roll/roll-part-carac.mjs | 17 ++++-- module/roll/roll-part-meditation.mjs | 9 +-- templates/actor/combat.hbs | 2 +- templates/roll/result/chat-attaque.hbs | 3 +- templates/roll/result/chat-comp.hbs | 3 +- templates/roll/result/chat-cuisine.hbs | 3 +- templates/roll/result/chat-defense.hbs | 3 +- templates/roll/result/chat-jeu.hbs | 3 +- templates/roll/result/chat-meditation.hbs | 3 +- templates/roll/result/chat-oeuvre.hbs | 3 +- templates/roll/result/chat-sort.hbs | 3 +- templates/roll/result/chat-tache.hbs | 3 +- templates/roll/result/partial-infojet.hbs | 6 ++ 22 files changed, 83 insertions(+), 72 deletions(-) diff --git a/changelog.md b/changelog.md index bd15a1c3..3adce903 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,9 @@ # 13.0 +## 13.0.14 - Le familier d'Illysis + +- Nouvelle fenêtre de jets de dés + - Attaque/défense des créatures + ## 13.0.13 - L'épanouissement d'Illysis - Fix d'erreur au chargement de templates RollDialog diff --git a/module/actor.js b/module/actor.js index 914aa630..24368810 100644 --- a/module/actor.js +++ b/module/actor.js @@ -186,12 +186,12 @@ export class RdDActor extends RdDBaseActorSang { const uniques = [] const addAttaque = (arme, main = undefined, action = 'attaque') => { - const dommagesArme = RdDItemArme.valeurMain(arme.system.dommages, main) + const dommages = RdDItemArme.valeurMain(arme.system.dommages, main) const forceRequise = RdDItemArme.valeurMain(arme.system.force ?? 0, main) const ecaillesEfficacite = arme.system.magique ? arme.system.ecaille_efficacite : 0; const comp = this.getCompetence(RdDActor.$getCompetenceAction(arme, main)) - const unique = [comp.id, arme.name, dommagesArme, forceRequise, ecaillesEfficacite].join('|'); + const unique = [comp.id, arme.name, dommages, forceRequise, ecaillesEfficacite].join('|'); if (uniques.includes(unique)) { return } @@ -212,7 +212,7 @@ export class RdDActor extends RdDBaseActorSang { main: main, carac: { key: caracCode, value: caracValue }, equipe: arme.system.equipe, - dommagesArme: dommagesArme, + dommages: dommages, forceRequise: forceRequise, initiative: RdDInitiative.getRollInitiative(caracValue, niveau, ajustement) }) diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 65dd8f57..9193dd5d 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -176,10 +176,11 @@ export class RdDBaseActorReve extends RdDBaseActor { } getCompetences(name = undefined, options = { onMessage: message => { } }) { + const all = [...this.itemTypes[ITEM_TYPES.competence], ...this.itemTypes[ITEM_TYPES.competencecreature]] if (name == undefined) { - return this.itemTypes[ITEM_TYPES.competence] + return all } - return RdDItemCompetence.findCompetences(this.itemTypes[ITEM_TYPES.competence], name, options) + return RdDItemCompetence.findCompetences(all, name, options) } getCompetenceCorpsACorps(options = { onMessage: message => { } }) { @@ -246,10 +247,10 @@ export class RdDBaseActorReve extends RdDBaseActor { if (this.isEffectAllowed(statusId)) { const effect = this.getEffectByStatus(statusId); if (!status && effect) { - await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id], { render: true}) + await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id], { render: true }) } if (status && !effect) { - await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(statusId)], { render: true}) + await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(statusId)], { render: true }) } } } @@ -309,6 +310,22 @@ export class RdDBaseActorReve extends RdDBaseActor { async rollCaracCompetence(caracName, compName, diff, options = { title: "" }) { RdDEmpoignade.checkEmpoignadeEnCours(this) + + if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) { + const competence = this.getCompetence(compName); + const rollData = { + ids: { actorId: this.id }, + type: { allowed: DEFAULT_ROLL_TYPES, current: PART_COMP }, + selected: { + carac: { key: caracName }, + comp: { key: competence.name }, + diff: { value: diff } + } + } + RollDialog.create(rollData, options) + return + } + const competence = this.getCompetence(compName); await this.openRollDialog({ name: 'jet-competence', @@ -423,32 +440,22 @@ export class RdDBaseActorReve extends RdDBaseActor { await RdDRollResult.displayRollData(rollData, this, 'chat-resultat-general.hbs'); } - /* -------------------------------------------- */ - async rollCompetenceV2(rollData) { - rollData.ids = rollData?.ids ?? {} - rollData.type = rollData.type ?? { allowed: DEFAULT_ROLL_TYPES } - rollData.ids.actorId = this.id - await RollDialog.create(rollData) - } - async rollCompetence(idOrName, options = { tryTarget: true, arme: undefined }) { RdDEmpoignade.checkEmpoignadeEnCours(this) const competence = this.getCompetence(idOrName); - if (competence.type != ITEM_TYPES.competencecreature && OptionsAvancees.isUsing(ROLL_DIALOG_V2)) { + if (OptionsAvancees.isUsing(ROLL_DIALOG_V2)) { const rollData = { + ids: { actorId: this.id }, + type: { allowed: options.arme ? ATTAQUE_ROLL_TYPES : DEFAULT_ROLL_TYPES }, selected: { + carac: competence.type == ITEM_TYPES.competencecreature ? { key: competence.name } : undefined, comp: { key: competence.name }, - diff: { type: DIFF.LIBRE, value: competence.system.default_diffLibre ?? 0 } + diff: { type: options.arme ? DIFF.ATTAQUE : DIFF.LIBRE, value: competence.system.default_diffLibre ?? 0 }, + attaque: options.arme ? { arme: { key: options.arme.id } } : undefined } } - if (options.arme) { - rollData.selected.attaque = { arme: { id: options.arme.id }, comp: { id: competence.id } } - rollData.type = { allowed: ATTAQUE_ROLL_TYPES } - } - - await this.rollCompetenceV2(rollData) - return + return await RollDialog.create(rollData) } let rollData = { @@ -512,19 +519,13 @@ export class RdDBaseActorReve extends RdDBaseActor { title: 'Ne pas utiliser les automatisation de combat', buttonLabel: "Pas d'automatisation", onAction: async () => { - this.rollCompetenceV2({ - ids: { - actorId: this.id, - actorTokenId: token?.id, - }, - selected: { - conditions: { value: 0 } - }, + const rollData = { + ids: { actorId: this.id, actorTokenId: token?.id, }, type: { - allowed: [ROLL_TYPE_COMP, ROLL_TYPE_ATTAQUE, ROLL_TYPE_OEUVRE, ROLL_TYPE_TACHE, ROLL_TYPE_JEU], - current: ROLL_TYPE_COMP + allowed: [ROLL_TYPE_ATTAQUE], current: ROLL_TYPE_ATTAQUE } - }) + }; + return await RollDialog.create(rollData) } }) } diff --git a/module/actor/base-actor-sheet.js b/module/actor/base-actor-sheet.js index bdbca38f..8be9575a 100644 --- a/module/actor/base-actor-sheet.js +++ b/module/actor/base-actor-sheet.js @@ -56,8 +56,7 @@ export class RdDBaseActorSheet extends foundry.appv1.sheets.ActorSheet { this._appliquerRechercheObjets(formData.conteneurs, formData.inventaires); formData.conteneurs = RdDUtility.conteneursRacine(formData.conteneurs); formData.competences.filter(it => it.type == ITEM_TYPES.competencecreature) - .forEach(it => it.isdommages = it.isDommages() - ) + .forEach(it => it.isdommages = it.isDommages()) return formData; } diff --git a/module/actor/export-scriptarium/mapping.js b/module/actor/export-scriptarium/mapping.js index 3b0fa256..b16ca758 100644 --- a/module/actor/export-scriptarium/mapping.js +++ b/module/actor/export-scriptarium/mapping.js @@ -160,7 +160,7 @@ export class Mapping { return undefined } const categorie = Mapping.complementCategorie(arme, maniement) - const dommages = Mapping.dommagesArme(actor, arme, maniement) + const dommages = Mapping.dommages(actor, arme, maniement) return { name: arme.name + categorie, niveau: Misc.toSignedString(competence.system.niveau), @@ -170,7 +170,8 @@ export class Mapping { arme: arme } } - static dommagesArme(actor, arme, maniement) { + + static dommages(actor, arme, maniement) { const dmgArme = RdDItemArme.dommagesReels(arme, maniement) const dommages = Misc.toSignedString(dmgArme + RdDBonus.bonusDmg(actor, maniement, dmgArme)) switch (arme.system.mortalite) { diff --git a/module/item-competencecreature.js b/module/item-competencecreature.js index 35519b3f..80b735e6 100644 --- a/module/item-competencecreature.js +++ b/module/item-competencecreature.js @@ -32,6 +32,7 @@ export class RdDItemCompetenceCreature extends RdDItem { initiative: initative, mortalite: this.system.mortalite, dommages: this.system.dommages, + forceRequise: 0, equipe: true, resistance: 100, penetration: 0, @@ -43,7 +44,8 @@ export class RdDItemCompetenceCreature extends RdDItem { carac: { key: this.name, value: this.system.carac_value }, equipe: true, mortalite: this.system.mortalite, - dmg: this.system.dommages, + dommages: this.system.dommages, + //dmg: this.system.dommages, initiative: initative }; return attaque diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 6bb9c2b0..58f01421 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -727,8 +727,6 @@ export class RdDCombat { RollBasicParts.loadSurprises(attackerRoll) attackerRoll.passeArme = attackerRoll.passeArme ?? foundry.utils.randomID(16) attackerRoll.dmg = RdDBonus.dmgRollV2(attackerRoll, attackerRoll.current.attaque) - // attackerRoll.current.attaque.dmg = attackerRoll.dmg - // attaque.dmg = attackerRoll.current.attaque.dmg const attaque = RollDialog.saveParts(attackerRoll) const defense = { attackerRoll: attaque, diff --git a/module/roll/roll-constants.mjs b/module/roll/roll-constants.mjs index 5a44584b..d99d3760 100644 --- a/module/roll/roll-constants.mjs +++ b/module/roll/roll-constants.mjs @@ -12,7 +12,7 @@ export const ROLL_TYPE_TACHE = 'tache' export const ATTAQUE_ROLL_TYPES = [ROLL_TYPE_ATTAQUE] export const COMBAT_ROLL_TYPES = [ROLL_TYPE_ATTAQUE, ROLL_TYPE_DEFENSE] export const DEMIREVE_ROLL_TYPES = [ROLL_TYPE_SORT] -export const DEFAULT_ROLL_TYPES = [ROLL_TYPE_COMP, ROLL_TYPE_TACHE, ROLL_TYPE_MEDITATION, ROLL_TYPE_CUISINE, ROLL_TYPE_OEUVRE, ROLL_TYPE_JEU] +export const DEFAULT_ROLL_TYPES = [ROLL_TYPE_COMP, ROLL_TYPE_ATTAQUE, ROLL_TYPE_TACHE, ROLL_TYPE_MEDITATION, ROLL_TYPE_CUISINE, ROLL_TYPE_OEUVRE, ROLL_TYPE_JEU] export const DIFF = { diff --git a/module/roll/roll-part-attaque.mjs b/module/roll/roll-part-attaque.mjs index 5519ede1..914260e8 100644 --- a/module/roll/roll-part-attaque.mjs +++ b/module/roll/roll-part-attaque.mjs @@ -36,7 +36,7 @@ export class RollPartAttaque extends RollPartSelect { restore(rollData) { const saved = this.getSaved(rollData) super.restore(rollData) - if (saved.dmg) { + if (saved.dmg != undefined) { this.getCurrent(rollData).dmg = this.getSaved(rollData).dmg } } diff --git a/module/roll/roll-part-carac.mjs b/module/roll/roll-part-carac.mjs index b143859f..065549ca 100644 --- a/module/roll/roll-part-carac.mjs +++ b/module/roll/roll-part-carac.mjs @@ -12,22 +12,30 @@ export class RollPartCarac extends RollPartSelect { loadRefs(rollData) { const refs = this.getRefs(rollData) - refs.all = this.$getActorCaracs(rollData) + const actor = rollData.active.actor + refs.all = [...this.$getActorCaracs(actor), ...this.$getCaracCompetenceCreature(actor)] refs.caracs = refs.all this.$selectCarac(rollData) } choices(refs) { return refs.caracs } - $getActorCaracs(rollData) { - return Object.entries(rollData.active.actor.getCarac()) + $getActorCaracs(actor) { + return Object.entries(actor.getCarac()) .filter(([key, c]) => key != 'taille') - /* TODO: filter by context */ .map(([key, carac]) => { return RollPartCarac.$extractCarac(key, carac) }) } + $getCaracCompetenceCreature(actor) { + if (actor.isPersonnage()) { + return [] + } + return actor.getCompetences() + .map(it => { return { key: it.name, label: it.name, value: parseInt(it.system.carac_value) } }) + } + static $extractCarac(key, carac) { return { key: key, @@ -40,7 +48,6 @@ export class RollPartCarac extends RollPartSelect { allowed = allowed.filter(it => it != undefined) const refs = this.getRefs(rollData) refs.caracs = allowed.length > 0 - // ? refs.all.filter(it => allowed.includes(Grammar.toLowerCaseNoAccent(it.key))) ? refs.all.filter(it => allowed.includes(it.key)) : refs.all this.$selectCarac(rollData) diff --git a/module/roll/roll-part-meditation.mjs b/module/roll/roll-part-meditation.mjs index 90b971dd..e892719c 100644 --- a/module/roll/roll-part-meditation.mjs +++ b/module/roll/roll-part-meditation.mjs @@ -1,10 +1,10 @@ import { ITEM_TYPES } from "../constants.js" import { Grammar } from "../grammar.js" -import { CARACS, RdDCarac } from "../rdd-carac.js" +import { CARACS } from "../rdd-carac.js" import { RdDTimestamp } from "../time/rdd-timestamp.js" import { TMRUtility } from "../tmr-utility.js" import { ROLL_TYPE_MEDITATION } from "./roll-constants.mjs" -import { PART_CARAC } from "./roll-part-carac.mjs" +import { PART_CARAC, RollPartCarac } from "./roll-part-carac.mjs" import { PART_COMP } from "./roll-part-comp.mjs" import { RollPartSelect } from "./roll-part-select.mjs" import { ROLLDIALOG_SECTION } from "./roll-part.mjs" @@ -34,8 +34,9 @@ export class RollPartMeditation extends RollPartSelect { loadRefs(rollData) { const refs = this.getRefs(rollData) - refs.meditations = rollData.active.actor.itemTypes[ITEM_TYPES.meditation] - .map(it => RollPartMeditation.$extractMeditation(it, rollData.active.actor)) + const actor = rollData.active.actor + refs.meditations = actor.itemTypes[ITEM_TYPES.meditation] + .map(it => RollPartMeditation.$extractMeditation(it, actor)) if (refs.meditations.length > 0) { this.$selectMeditation(rollData) diff --git a/templates/actor/combat.hbs b/templates/actor/combat.hbs index 68f686e4..5c32a9f2 100644 --- a/templates/actor/combat.hbs +++ b/templates/actor/combat.hbs @@ -20,7 +20,7 @@ {{>"systems/foundryvtt-reve-de-dragon/templates/item/icon-arme-broken.hbs" action.arme}} {{plusMoins action.comp.system.niveau}} - {{plusMoins action.dommagesArme}} + {{plusMoins action.dommages}} diff --git a/templates/roll/result/chat-attaque.hbs b/templates/roll/result/chat-attaque.hbs index f4c81494..e1502e7f 100644 --- a/templates/roll/result/chat-attaque.hbs +++ b/templates/roll/result/chat-attaque.hbs @@ -10,8 +10,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-comp.hbs b/templates/roll/result/chat-comp.hbs index b380b32a..080c1030 100644 --- a/templates/roll/result/chat-comp.hbs +++ b/templates/roll/result/chat-comp.hbs @@ -8,8 +8,7 @@
- {{current.carac.label}}{{#unless (eq current.comp.key '')}} / {{current.comp.label}}{{/unless}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-cuisine.hbs b/templates/roll/result/chat-cuisine.hbs index a9469c70..0eeba85d 100644 --- a/templates/roll/result/chat-cuisine.hbs +++ b/templates/roll/result/chat-cuisine.hbs @@ -13,8 +13,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> "partial-infojet"}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-defense.hbs b/templates/roll/result/chat-defense.hbs index 2000cfb8..f9851cc1 100644 --- a/templates/roll/result/chat-defense.hbs +++ b/templates/roll/result/chat-defense.hbs @@ -10,8 +10,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-jeu.hbs b/templates/roll/result/chat-jeu.hbs index 2b0f53a5..a7246bf2 100644 --- a/templates/roll/result/chat-jeu.hbs +++ b/templates/roll/result/chat-jeu.hbs @@ -8,8 +8,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-meditation.hbs b/templates/roll/result/chat-meditation.hbs index 1066de5e..5c18e7b2 100644 --- a/templates/roll/result/chat-meditation.hbs +++ b/templates/roll/result/chat-meditation.hbs @@ -8,8 +8,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-oeuvre.hbs b/templates/roll/result/chat-oeuvre.hbs index f8c9559a..4978ff5c 100644 --- a/templates/roll/result/chat-oeuvre.hbs +++ b/templates/roll/result/chat-oeuvre.hbs @@ -8,8 +8,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/chat-sort.hbs b/templates/roll/result/chat-sort.hbs index 035a3f3b..5636af5b 100644 --- a/templates/roll/result/chat-sort.hbs +++ b/templates/roll/result/chat-sort.hbs @@ -15,8 +15,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}

diff --git a/templates/roll/result/chat-tache.hbs b/templates/roll/result/chat-tache.hbs index 6829d90e..31c6206a 100644 --- a/templates/roll/result/chat-tache.hbs +++ b/templates/roll/result/chat-tache.hbs @@ -8,8 +8,7 @@
- {{current.carac.label}} / {{current.comp.label}} à {{current.diff.value}} -
{{> 'partial-infojet'}} + {{> 'partial-infojet'}}
diff --git a/templates/roll/result/partial-infojet.hbs b/templates/roll/result/partial-infojet.hbs index c373383d..18992ba5 100644 --- a/templates/roll/result/partial-infojet.hbs +++ b/templates/roll/result/partial-infojet.hbs @@ -1,3 +1,9 @@ +{{current.carac.label}} +{{#if (and (ne current.comp.key '') (ne current.carac.label current.comp.label))}} + / {{current.comp.label}} +{{/if}} + à {{current.diff.value}} +
{{#if ajustements}}
From 8f4df1af560aecfef1b68caeb3c790acefd2b816 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Sun, 19 Oct 2025 23:47:18 +0200 Subject: [PATCH 03/10] Fix: ajustements surprises Affichage de l'image de la surprise --- assets/actions/armes-disparates.svg | 1 + css/foundryvtt-reve-de-dragon.css | 9 ++++++++- less/foundryvtt-reve-de-dragon.less | 9 ++++++++- module/constants.js | 12 +++++++++--- module/rdd-bonus.js | 8 ++++---- module/roll/roll-dialog-adapter.mjs | 4 +--- module/roll/roll-part-sign.mjs | 26 ++++++++++++++++++-------- module/roll/roll-part.mjs | 3 ++- module/settings/status-effects.js | 12 +++++++----- 9 files changed, 58 insertions(+), 26 deletions(-) create mode 100644 assets/actions/armes-disparates.svg diff --git a/assets/actions/armes-disparates.svg b/assets/actions/armes-disparates.svg new file mode 100644 index 00000000..38a4c94e --- /dev/null +++ b/assets/actions/armes-disparates.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/css/foundryvtt-reve-de-dragon.css b/css/foundryvtt-reve-de-dragon.css index ff117aac..a7739aef 100644 --- a/css/foundryvtt-reve-de-dragon.css +++ b/css/foundryvtt-reve-de-dragon.css @@ -855,7 +855,7 @@ select, max-width: 1.4rem; max-height: 1.4rem; border: 1px; - background: center / contain no-repeat url('../../assets/ui/icone_parchement_vierge.webp'); + background: center / contain no-repeat url('../../icons/templates/icone_parchement_vierge.webp'); } .system-foundryvtt-reve-de-dragon .sheet-header .header-compteurs { width: calc(60% - 110px - 1rem); @@ -2708,6 +2708,13 @@ select, .system-foundryvtt-reve-de-dragon :is(.tooltip, .tooltip-overflow) .ttt-ajustements div:nth-child(odd) { background: var(--background-tooltip-alt); } +.system-foundryvtt-reve-de-dragon :is(.tooltip, .tooltip-overflow) .ttt-ajustements div img { + display: inline; + margin: 0; + max-width: 1rem; + max-height: 1rem; + filter: invert(0.8); +} .system-foundryvtt-reve-de-dragon aside#tooltip { max-width: 15rem; background: var(--background-tooltip); diff --git a/less/foundryvtt-reve-de-dragon.less b/less/foundryvtt-reve-de-dragon.less index fd96d073..9059f90a 100644 --- a/less/foundryvtt-reve-de-dragon.less +++ b/less/foundryvtt-reve-de-dragon.less @@ -118,7 +118,7 @@ max-width: 1.4rem; max-height: 1.4rem; border: 1px; - background: center / contain no-repeat url('../../assets/ui/icone_parchement_vierge.webp'); + background: center / contain no-repeat url('../../icons/templates/icone_parchement_vierge.webp'); } .sheet-header .header-compteurs { @@ -1955,6 +1955,13 @@ div:nth-child(odd) { background: var(--background-tooltip-alt); } + div img { + display: inline; + margin: 0; + max-width: 1rem; + max-height: 1rem; + filter: invert(0.8); + } } } diff --git a/module/constants.js b/module/constants.js index 20eb0b4b..4dc65e74 100644 --- a/module/constants.js +++ b/module/constants.js @@ -53,9 +53,15 @@ export const RDD_CONFIG = { { value: "Rarissime", label: "Rarissime" } ], particuliere: { - force: { key: 'force', descr: 'en force', img: 'systems/foundryvtt-reve-de-dragon/assets/ui/part-force.svg'}, - finesse: { key: 'finesse', descr: 'en finesse', img: 'systems/foundryvtt-reve-de-dragon/assets/ui/part-finesse.svg'}, - rapidite: { key: 'rapidite', descr: 'en rapidité', img: 'systems/foundryvtt-reve-de-dragon/assets/ui/part-rapidite.svg'}, + force: { key: 'force', descr: 'en force', img: 'systems/foundryvtt-reve-de-dragon/assets/ui/part-force.svg' }, + finesse: { key: 'finesse', descr: 'en finesse', img: 'systems/foundryvtt-reve-de-dragon/assets/ui/part-finesse.svg' }, + rapidite: { key: 'rapidite', descr: 'en rapidité', img: 'systems/foundryvtt-reve-de-dragon/assets/ui/part-rapidite.svg' }, + }, + icons: { + armesDisparates: 'systems/foundryvtt-reve-de-dragon/assets/actions/armes-disparates.svg', + demiReve: 'systems/foundryvtt-reve-de-dragon/assets/actions/sort.svg', + empoignade: 'systems/foundryvtt-reve-de-dragon/icons/empoignade.webp', + forceWeak: 'systems/foundryvtt-reve-de-dragon/assets/actions/weak.svg', } } diff --git a/module/rdd-bonus.js b/module/rdd-bonus.js index ff755333..2df7f67e 100644 --- a/module/rdd-bonus.js +++ b/module/rdd-bonus.js @@ -59,7 +59,7 @@ export class RdDBonus { static dmgRollV2(rollData, attaque) { const actor = rollData.active.actor const arme = attaque.arme - const dmgArme = RdDBonus.dmgArme(arme, attaque.dommagesArme) + const dmgArme = RdDBonus.dmgArme(arme, attaque.dommages) const dmg = { total: 0, dmgArme: dmgArme, @@ -70,7 +70,7 @@ export class RdDBonus { dmgSurprise: rollData.opponent?.surprise?.dmg ?? 0, mortalite: RdDBonus.mortalite(attaque.dmg?.mortalite, arme?.system.mortalite, rollData.opponent?.actor?.isEntite()), dmgActor: RdDBonus.bonusDmg(actor, attaque.carac.key, dmgArme, attaque.forceRequise), - dmgForceInsuffisante: Math.min(0, actor.getForce() - attaque.forceRequise), + dmgForceInsuffisante: Math.min(0, actor.getForce() - (attaque.forceRequise ?? 0)), dmgDiffLibre: ReglesOptionnelles.isUsing('degat-ajout-malus-libre') ? Math.abs(attaque.diff ?? 0) : 0 } dmg.total = dmg.dmgSurprise + dmg.dmgTactique + dmg.dmgArme + dmg.dmgActor + dmg.dmgParticuliere + dmg.dmgForceInsuffisante + dmg.dmgDiffLibre @@ -105,9 +105,9 @@ export class RdDBonus { } /* -------------------------------------------- */ - static dmgArme(arme, dommagesMain) { + static dmgArme(arme, dommages) { if (arme) { - let dmgBase = dommagesMain ?? Number(arme.system.dommages ?? 0); + let dmgBase = dommages ?? Number(arme.system.dommages ?? 0); //Le bonus dégats magiques ne peut pas faire dépasser le bonus de l'arme (cf p.278) return dmgBase + Math.min(dmgBase, arme.system.magique ? arme.system.ecaille_efficacite : 0); } diff --git a/module/roll/roll-dialog-adapter.mjs b/module/roll/roll-dialog-adapter.mjs index 6f5a7c9a..809b3258 100644 --- a/module/roll/roll-dialog-adapter.mjs +++ b/module/roll/roll-dialog-adapter.mjs @@ -96,7 +96,7 @@ export class RollDialogAdapter { rolled.niveauNecessaire = RdDResolutionTable.findNiveauNecessaire(rollData.selectedCarac.value, rolled.roll) rolled.ajustementNecessaire = rolled.niveauNecessaire - diff } - rollData.ajustements = rollData.ajustements.map(aj => { return { label: aj.label, value: aj.value } }) + rollData.ajustements = rollData.ajustements.map(a => { return { label: a.label, value: a.value } }) } static adjustDemiSurprise(rollData) { @@ -165,8 +165,6 @@ export class RollDialogAdapter { comp: attackerRoll.competence, main: RdDItemArme.getMainAttaque(attackerRoll.competence), equipe: attackerRoll.arme.system.equipe, - // carac: { key: caracCode, value: caracValue }, - // dommagesArme: dommagesArme, diff: attackerRoll.diffLibre, particuliere: attackerRoll.particuliere, tactique: RdDBonus.find(attackerRoll.tactique), diff --git a/module/roll/roll-part-sign.mjs b/module/roll/roll-part-sign.mjs index 8dd24c11..12ec40ba 100644 --- a/module/roll/roll-part-sign.mjs +++ b/module/roll/roll-part-sign.mjs @@ -1,6 +1,7 @@ +import { RDD_CONFIG } from "../constants.js" import { Misc } from "../misc.js" import { ReglesOptionnelles } from "../settings/regles-optionnelles.js" -import { StatusEffects } from "../settings/status-effects.js" +import { demiReveStatusEffect, StatusEffects } from "../settings/status-effects.js" import { ROLL_TYPE_ATTAQUE, ROLL_TYPE_DEFENSE } from "./roll-constants.mjs" import { ROLLDIALOG_SECTION, RollPart } from "./roll-part.mjs" @@ -40,28 +41,29 @@ export class RollPartSign extends RollPart { const current = this.getCurrent(rollData) current.armeDisparate = isCombat && current.armeDisparate current.surprise = actor.getSurprise(isCombat) // TODO: could be from rollData.active.surprise?? - current.reasons = actor.getEffects(it => StatusEffects.niveauSurprise(it) > 0).map(it => it.name) + current.reasons = actor.getEffects(it => StatusEffects.niveauSurprise(it) > 0) + .map(it => { return { img: it.img, label: game.i18n.localize(it.name) } }) current.diviseur = 1 if (current.surprise == 'demi') { current.diviseur *= 2 } if (isCombat && actor.isDemiReve()) { - current.reasons.push('Demi-rêve en combat') + current.reasons.push({ img: RDD_CONFIG.icons.demiReve, label: 'Demi-rêve en combat' }) } if (this.isParadeArmeDisparate(current)) { current.diviseur *= 2 - current.reasons.push('Armes disparates') + current.reasons.push({ img: RDD_CONFIG.icons.armesDisparates, label: 'Armes disparates' }) } if (this.isAttaqueFinesse(rollData)) { current.diviseur *= 2 - current.reasons.push('Particulière en finesse') + current.reasons.push({ img: RDD_CONFIG.particuliere.finesse.img, label: 'Particulière en finesse' }) } if (!ReglesOptionnelles.isUsing('tripleSignificative')) { current.diviseur = Math.min(current.diviseur, 4); } - current.reason = current.reasons.join(', ') + current.reason = current.reasons.map(it => it.label).join(', ') } isAttaqueFinesse(rollData) { @@ -76,8 +78,16 @@ export class RollPartSign extends RollPart { const current = this.getCurrent(rollData) if (current.surprise == 'demi') { return [ - { label: 'Significative requise ' + Misc.getFractionOneN(current.diviseur) }, - ...current.reasons.map(it => { return { label: ' ' + it } }) + { + label: 'Significative requise ' + Misc.getFractionOneN(current.diviseur) + }, + ...current.reasons.map(it => { + return { + label: it.img + ? ` ${it.label}` + : ` ${it.label}` + } + }) ] } return [] diff --git a/module/roll/roll-part.mjs b/module/roll/roll-part.mjs index 386cc709..d54b560f 100644 --- a/module/roll/roll-part.mjs +++ b/module/roll/roll-part.mjs @@ -30,7 +30,8 @@ export class RollPart { rollData.selected[this.code] = {} } } - + /** l'acteur actif du jet */ + getActor(rollData) { return rollData.active.actor } /** le conteneur de données du RollPart */ getRefs(rollData) { return rollData.refs[this.code] diff --git a/module/settings/status-effects.js b/module/settings/status-effects.js index 219ed4c2..0f8e8a9d 100644 --- a/module/settings/status-effects.js +++ b/module/settings/status-effects.js @@ -1,4 +1,4 @@ -import { SYSTEM_RDD } from "../constants.js"; +import { RDD_CONFIG, SYSTEM_RDD } from "../constants.js"; import { Misc } from "../misc.js"; import { RdDBonus } from "../rdd-bonus.js"; @@ -17,11 +17,13 @@ export const STATUSES = { StatusForceWeak: 'force insuffisante', } -const forceWeakStatusEffect = { rdd: true, id: STATUSES.StatusForceWeak, name: 'EFFECT.StatusForceWeak', img: 'systems/foundryvtt-reve-de-dragon/assets/actions/weak.svg' }; -const demiReveStatusEffect = { rdd: true, id: STATUSES.StatusDemiReve, name: 'EFFECT.StatusDemiReve', img: 'systems/foundryvtt-reve-de-dragon/assets/actions/sort.svg' }; +export const forceWeakStatusEffect = { rdd: true, id: STATUSES.StatusForceWeak, name: 'EFFECT.StatusForceWeak', img: RDD_CONFIG.icons.forceWeak }; +export const demiReveStatusEffect = { + rdd: true, id: STATUSES.StatusDemiReve, name: 'EFFECT.StatusDemiReve', img: RDD_CONFIG.icons.demiReve +}; const rddStatusEffects = [ - { rdd: true, id: STATUSES.StatusGrappling, tint: '#33cc33', name: 'EFFECT.StatusGrappling', img: 'systems/foundryvtt-reve-de-dragon/icons/empoignade.webp' }, - { rdd: true, id: STATUSES.StatusGrappled, tint: '#ff9900', name: 'EFFECT.StatusGrappled', img: 'systems/foundryvtt-reve-de-dragon/icons/empoignade.webp' }, + { rdd: true, id: STATUSES.StatusGrappling, tint: '#33cc33', name: 'EFFECT.StatusGrappling', img: RDD_CONFIG.icons.empoignade }, + { rdd: true, id: STATUSES.StatusGrappled, tint: '#ff9900', name: 'EFFECT.StatusGrappled', img: RDD_CONFIG.icons.empoignade }, { rdd: true, id: STATUSES.StatusRestrained, name: 'EFFECT.StatusRestrained', img: 'icons/svg/net.svg' }, { rdd: true, id: STATUSES.StatusStunned, name: 'EFFECT.StatusStunned', img: 'icons/svg/stoned.svg', "duration.rounds": 1 }, From 7f4f942d5083542d8169a6d2c982c77b5b7d22a0 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 21 Oct 2025 00:36:54 +0200 Subject: [PATCH 04/10] =?UTF-8?q?Am=C3=A9lioration=20des=20entit=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - l'attaquant ne sait plus que c'est une entité de cauchemar (surprise!) - l'encaissement indique une blessure dans le tchat... même si ce n'est que de l'endurance - les blurettes suivent les règles des entités de cauchemar (p322) --- changelog.md | 4 + module/actor/base-actor-reve.js | 4 +- module/actor/base-actor.js | 6 +- module/actor/entite-sheet.js | 2 +- module/actor/entite.js | 34 ++++--- module/actor/export-scriptarium/mapping.js | 6 +- module/constants.js | 67 +++++++------ module/item.js | 4 +- module/item/arme.js | 12 +-- module/item/blessure.js | 16 ++-- module/rdd-bonus.js | 20 ++-- module/rdd-combat.js | 14 +-- module/rdd-empoignade.js | 2 +- module/rdd-possession.js | 2 +- module/rdd-roll-encaisser.js | 39 ++++---- module/rdd-roll.js | 6 +- module/rdd-utility.js | 105 +++++++++++---------- module/roll/roll-part-attaque.mjs | 3 +- templates/chat-resultat-encaissement.hbs | 10 +- 19 files changed, 184 insertions(+), 172 deletions(-) diff --git a/changelog.md b/changelog.md index 3adce903..7bb4e19d 100644 --- a/changelog.md +++ b/changelog.md @@ -1,6 +1,10 @@ # 13.0 ## 13.0.14 - Le familier d'Illysis +- Amélioration des entités: + - l'attaquant ne sait plus que c'est une entité de cauchemar (surprise!) + - l'encaissement indique une blessure dans le tchat... même si ce n'est que de l'endurance + - les blurettes suivent les règles des entités de cauchemar (p322) - Nouvelle fenêtre de jets de dés - Attaque/défense des créatures diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 9193dd5d..667253a0 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -1,4 +1,4 @@ -import { ENTITE_INCARNE, renderTemplate, SHOW_DICE, SYSTEM_RDD } from "../constants.js"; +import { renderTemplate, SHOW_DICE, SYSTEM_RDD } from "../constants.js"; import { Grammar } from "../grammar.js"; import { Misc } from "../misc.js"; import { RdDResolutionTable } from "../rdd-resolution-table.js"; @@ -670,7 +670,7 @@ export class RdDBaseActorReve extends RdDBaseActor { async accorder(entite, when = 'avant-encaissement') { if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar") || entite == undefined - || !entite.isEntite([ENTITE_INCARNE]) + || !entite.isEntiteIncarnee() || entite.isEntiteAccordee(this)) { return true } diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index a1a9b6cb..8c0c9b2a 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -215,9 +215,11 @@ export class RdDBaseActor extends Actor { return game.users.players.find(player => player.active && player.character?.id == this.id); } - isCreatureEntite() { return this.isCreature() || this.isEntite() } + isCreatureOuEntite() { return this.isCreature() || this.isEntite() } isCreature() { return false } - isEntite(typeentite = []) { return false } + isEntite() { return false } + isEntiteIncarnee() { return false } + isEntiteNonIncarnee() { return false } isHautRevant() { return false } isVehicule() { return false } isPersonnage() { return false } diff --git a/module/actor/entite-sheet.js b/module/actor/entite-sheet.js index 70303215..fb6bb820 100644 --- a/module/actor/entite-sheet.js +++ b/module/actor/entite-sheet.js @@ -43,7 +43,7 @@ export class RdDActorEntiteSheet extends RdDBaseActorReveSheet { this.html.find('.resonance-add').click(async event => await DialogSelect.select({ label: "Choisir un acteur à accorder", - list: game.actors.filter(it => it.isPersonnage() && it.prototypeToken.actorLink) + list: game.actors.filter(it => true) }, it => this.resonanceAdd(it.id)) ) diff --git a/module/actor/entite.js b/module/actor/entite.js index eeacd5e4..17eef287 100644 --- a/module/actor/entite.js +++ b/module/actor/entite.js @@ -1,5 +1,6 @@ -import { ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js"; +import { ENTITE_BLURETTE, ENTITE_INCARNE, ENTITE_NONINCARNE } from "../constants.js"; import { ITEM_TYPES } from "../constants.js"; +import { RdDItemBlessure } from "../item/blessure.js"; import { Misc } from "../misc.js"; import { RdDCarac } from "../rdd-carac.js"; import { RdDEncaisser } from "../rdd-roll-encaisser.js"; @@ -16,11 +17,10 @@ export class RdDEntite extends RdDBaseActorReve { return item.type == ITEM_TYPES.competencecreature } - isEntite(typeentite = []) { - return (typeentite.length == 0 || typeentite.includes(this.system.definition.typeentite)); - } - - isNonIncarnee() { return this.isEntite([ENTITE_NONINCARNE]) } + isEntite() { return true } + isEntiteNonIncarnee() { return this.system.definition.typeentite == ENTITE_NONINCARNE } + isEntiteIncarnee() { return [ENTITE_INCARNE, ENTITE_BLURETTE].includes(this.system.definition.typeentite) } + isEntiteBlurette() { return this.system.definition.typeentite !== ENTITE_BLURETTE } getReveActuel() { return Misc.toInt(this.system.carac.reve?.value) @@ -49,20 +49,20 @@ export class RdDEntite extends RdDBaseActorReve { } async remiseANeuf() { - await this.removeEffects(e => true); - if (!this.isNonIncarnee()) { + if (!this.isEntiteNonIncarnee()) { await this.update({ 'system.sante.endurance.value': this.system.sante.endurance.max }); } + await this.removeEffects(e => true) } isDead() { - return this.isNonIncarnee() ? false : this.system.sante.endurance.value <= 0 + return this.isEntiteNonIncarnee() ? false : this.system.sante.endurance.value <= 0 } async santeIncDec(name, inc, isCritique = false) { - if (name == 'endurance' && !this.isNonIncarnee()) { + if (name == 'endurance' && !this.isEntiteNonIncarnee()) { const oldValue = this.system.sante.endurance.value; const endurance = Math.max(0, Math.min(oldValue + inc, @@ -78,7 +78,7 @@ export class RdDEntite extends RdDBaseActorReve { } async encaisser() { - if (this.isNonIncarnee()) { + if (this.isEntiteNonIncarnee()) { return } await RdDEncaisser.encaisser(this) @@ -89,15 +89,19 @@ export class RdDEntite extends RdDBaseActorReve { } async onAppliquerJetEncaissement(encaissement, attackerToken) { + if (this.isEntiteNonIncarnee()) { + return + } const perteEndurance = await this.santeIncDec("endurance", -encaissement.endurance); foundry.utils.mergeObject(encaissement, { resteEndurance: perteEndurance.newValue, - endurance: perteEndurance.perte - }); + endurance: perteEndurance.perte, + blessure: RdDItemBlessure.prepareBlessure(encaissement.gravite, encaissement.dmg?.loc.label ?? '', attackerToken) + }) } isEntiteAccordee(attacker) { - if (this.isEntite([ENTITE_INCARNE])) { + if (this.isEntiteIncarnee()) { let resonnance = this.system.sante.resonnance return (resonnance.actors.find(it => it == attacker.id)) } @@ -106,7 +110,7 @@ export class RdDEntite extends RdDBaseActorReve { /* -------------------------------------------- */ async setEntiteReveAccordee(actor) { - if (this.isEntite([ENTITE_INCARNE])) { + if (this.isEntiteIncarnee()) { if (this.system.sante.resonnance.actors.find(it => it == actor.id)) { // déjà accordé return diff --git a/module/actor/export-scriptarium/mapping.js b/module/actor/export-scriptarium/mapping.js index b16ca758..aca7d6f5 100644 --- a/module/actor/export-scriptarium/mapping.js +++ b/module/actor/export-scriptarium/mapping.js @@ -2,7 +2,7 @@ import { Grammar } from "../../grammar.js" import { EMPOIGNADE, RdDItemArme } from "../../item/arme.js" import { RdDItemCompetence } from "../../item-competence.js" import { RdDItemSort } from "../../item-sort.js" -import { ITEM_TYPES } from "../../constants.js" +import { ITEM_TYPES, RDD_CONFIG } from "../../constants.js" import { Misc } from "../../misc.js" import { RdDTimestamp } from "../../time/rdd-timestamp.js" import { RdDBonus } from "../../rdd-bonus.js" @@ -175,8 +175,8 @@ export class Mapping { const dmgArme = RdDItemArme.dommagesReels(arme, maniement) const dommages = Misc.toSignedString(dmgArme + RdDBonus.bonusDmg(actor, maniement, dmgArme)) switch (arme.system.mortalite) { - case 'non-mortel': return `(${dommages})` - case EMPOIGNADE: return '-' + case RDD_CONFIG.encaissement.nonmortel: return `(${dommages})` + case RDD_CONFIG.encaissement.empoignade: return '-' } return dommages } diff --git a/module/constants.js b/module/constants.js index 4dc65e74..37e45b6f 100644 --- a/module/constants.js +++ b/module/constants.js @@ -13,44 +13,44 @@ export const renderTemplate = foundry.applications.handlebars.renderTemplate export const RDD_CONFIG = { niveauEthylisme: [ - { value: "1", label: "Aucun" }, - { value: "0", label: "Eméché (0)" }, - { value: "-1", label: "Gris (-1)" }, - { value: "-2", label: "Pinté (-2)" }, - { value: "-3", label: "Pas Frais (-3)" }, - { value: "-4", label: "Ivre (-4)" }, - { value: "-5", label: "Bu (-5)" }, - { value: "-6", label: "Complètement fait (-6)" }, - { value: "-7", label: "Ivre mort (-7)" } + { value: '1', label: 'Aucun' }, + { value: '0', label: 'Eméché (0)' }, + { value: '-1', label: 'Gris (-1)' }, + { value: '-2', label: 'Pinté (-2)' }, + { value: '-3', label: 'Pas Frais (-3)' }, + { value: '-4', label: 'Ivre (-4)' }, + { value: '-5', label: 'Bu (-5)' }, + { value: '-6', label: 'Complètement fait (-6)' }, + { value: '-7', label: 'Ivre mort (-7)' } ], categorieEntite: { - "cauchemar": "Cauchemar", - "reve": "Rêve" + 'cauchemar': 'Cauchemar', + 'reve': 'Rêve' }, typeEntite: { - "incarne": "Incarnée", - "nonincarne": "Non Incarnée", - "blurette": "Blurette" + [ENTITE_INCARNE]: 'Incarnée', + [ENTITE_NONINCARNE]: 'Non Incarnée', + [ENTITE_BLURETTE]: 'Blurette' }, heuresRdD: [ - { value: "vaisseau", label: "Vaisseau", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd01.webp" }, - { value: "sirene", label: "Sirène", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd02.webp" }, - { value: "faucon", label: "Faucon", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd03.webp" }, - { value: "couronne", label: "Couronne", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd04.webp" }, - { value: "dragon", label: "Dragon", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd05.webp" }, - { value: "epees", label: "Epées", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd06.webp" }, - { value: "lyre", label: "Lyre", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd07.webp" }, - { value: "serpent", label: "Serpent", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd08.webp" }, - { value: "poissonacrobate", label: "Poisson Acrobate", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd09.webp" }, - { value: "araignee", label: "Araignée", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd10.webp" }, - { value: "roseau", label: "Roseau", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd11.webp" }, - { value: "chateaudormant", label: "Chateau Dormant", img: "systems/foundryvtt-reve-de-dragon/icons/heures/hd12.webp" } + { value: 'vaisseau', label: 'Vaisseau', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd01.webp' }, + { value: 'sirene', label: 'Sirène', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd02.webp' }, + { value: 'faucon', label: 'Faucon', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd03.webp' }, + { value: 'couronne', label: 'Couronne', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd04.webp' }, + { value: 'dragon', label: 'Dragon', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd05.webp' }, + { value: 'epees', label: 'Epées', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd06.webp' }, + { value: 'lyre', label: 'Lyre', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd07.webp' }, + { value: 'serpent', label: 'Serpent', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd08.webp' }, + { value: 'poissonacrobate', label: 'Poisson Acrobate', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd09.webp' }, + { value: 'araignee', label: 'Araignée', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd10.webp' }, + { value: 'roseau', label: 'Roseau', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd11.webp' }, + { value: 'chateaudormant', label: 'Chateau Dormant', img: 'systems/foundryvtt-reve-de-dragon/icons/heures/hd12.webp' } ], raretes: [ - { value: "Commune", label: "Commune" }, - { value: "Frequente", label: "Fréquente" }, - { value: "Rare", label: "Rare" }, - { value: "Rarissime", label: "Rarissime" } + { value: 'Commune', label: 'Commune' }, + { value: 'Frequente', label: 'Fréquente' }, + { value: 'Rare', label: 'Rare' }, + { value: 'Rarissime', label: 'Rarissime' } ], particuliere: { force: { key: 'force', descr: 'en force', img: 'systems/foundryvtt-reve-de-dragon/assets/ui/part-force.svg' }, @@ -62,10 +62,15 @@ export const RDD_CONFIG = { demiReve: 'systems/foundryvtt-reve-de-dragon/assets/actions/sort.svg', empoignade: 'systems/foundryvtt-reve-de-dragon/icons/empoignade.webp', forceWeak: 'systems/foundryvtt-reve-de-dragon/assets/actions/weak.svg', + }, + encaissement: { + mortel: 'mortel', + nonmortel: 'non-mortel', + entiteincarnee: 'entiteincarnee', + empoignade: 'empoignade' } } - export const ACTOR_TYPES = { personnage: 'personnage', creature: 'creature', diff --git a/module/item.js b/module/item.js index 44829cd2..a59e78ca 100644 --- a/module/item.js +++ b/module/item.js @@ -1,4 +1,4 @@ -import { ITEM_TYPES, renderTemplate } from "./constants.js"; +import { ITEM_TYPES, RDD_CONFIG, renderTemplate } from "./constants.js"; import { BASE_CORPS_A_CORPS, BASE_ESQUIVE, CATEGORIES_COMPETENCES, CATEGORIES_COMPETENCES_CREATURES } from "./item/base-items.js"; import { ITEM_ACTIONS, DEFAULT_ACTIONS, COMMON_ACTIONS } from "./item/item-actions.js"; @@ -629,7 +629,7 @@ export class RdDItem extends Item { _armeChatData() { return [ `Compétence: ${this.system.competence}`, - `Dommages: ${this.system.dommages} ${this.system.mortalite == 'non-mortel' ? '(Non mortel)' : ''}`, + `Dommages: ${this.system.dommages} ${this.system.mortalite == RDD_CONFIG.encaissement.nonmortel ? '(Non mortel)' : ''}`, `Force minimum: ${this.system.force}`, `Resistance: ${this.system.resistance}`, ...this._inventaireTemplateChatData() diff --git a/module/item/arme.js b/module/item/arme.js index b775a1b2..bd29ead1 100644 --- a/module/item/arme.js +++ b/module/item/arme.js @@ -1,4 +1,4 @@ -import { ITEM_TYPES } from "../constants.js"; +import { ITEM_TYPES, RDD_CONFIG } from "../constants.js"; import { RdDItem } from "../item.js"; import { BASE_CORPS_A_CORPS } from "./base-items.js"; import { Grammar } from "../grammar.js"; @@ -30,7 +30,7 @@ export const ATTAQUE_TYPE = { export const CORPS_A_CORPS = 'Corps à corps' export const PUGILAT = 'pugilat' -export const EMPOIGNADE = 'empoignade' +export const EMPOIGNADE = RDD_CONFIG.encaissement.empoignade /* -------------------------------------------- */ export class RdDItemArme extends RdDItem { @@ -259,10 +259,10 @@ export class RdDItemArme extends RdDItem { } static empoignade(actor) { - return RdDItemArme.$corpsACorps(actor, 'Empoignade', EMPOIGNADE) + return RdDItemArme.$corpsACorps(actor, 'Empoignade', RDD_CONFIG.encaissement.empoignade) } - static $corpsACorps(actor, name, cac, system) { + static $corpsACorps(actor, name, cac) { const competence = actor?.getCompetenceCorpsACorps() ?? BASE_CORPS_A_CORPS const melee = actor ? actor.system.carac['melee'].value : 0 return new RdDItemArme({ @@ -277,10 +277,10 @@ export class RdDItemArme extends RdDItem { force: 0, dommages: "0", dommagesReels: 0, - mortalite: cac == EMPOIGNADE ? EMPOIGNADE : 'non-mortel', + mortalite: cac == RDD_CONFIG.encaissement.empoignade ? RDD_CONFIG.encaissement.empoignade : RDD_CONFIG.encaissement.nonmortel, competence: CORPS_A_CORPS, resistance: 1, - baseInit: cac == EMPOIGNADE ? 3 : 4, + baseInit: cac == RDD_CONFIG.encaissement.empoignade ? 3 : 4, cac: cac, deuxmains: true, categorie_parade: 'sans-armes' diff --git a/module/item/blessure.js b/module/item/blessure.js index ac282db3..0bdb9b37 100644 --- a/module/item/blessure.js +++ b/module/item/blessure.js @@ -71,21 +71,25 @@ export class RdDItemBlessure extends RdDItem { return 0 } - static async createBlessure(actor, gravite, localisation = '', attackerToken) { - const definition = RdDItemBlessure.getDefinition(gravite) - const blessure = { + static async createBlessure(actor, gravite, localisation = '', attackerToken = undefined) { + const blessure = RdDItemBlessure.prepareBlessure(gravite, localisation, attackerToken); + const blessures = await actor.createEmbeddedDocuments('Item', [blessure]) + return blessures[0] + } + + static prepareBlessure(gravite, localisation, attackerToken) { + const definition = RdDItemBlessure.getDefinition(gravite); + return { name: definition.label, type: 'blessure', img: definition.icon, system: { gravite: gravite, - difficulte: - gravite, + difficulte: -gravite, localisation: localisation, origine: attackerToken?.name ?? "" } } - const blessures = await actor.createEmbeddedDocuments('Item', [blessure]) - return blessures[0] } static async createTacheSoinBlessure(actor, gravite) { diff --git a/module/rdd-bonus.js b/module/rdd-bonus.js index 2df7f67e..42d0f812 100644 --- a/module/rdd-bonus.js +++ b/module/rdd-bonus.js @@ -1,3 +1,4 @@ +import { RDD_CONFIG } from "./constants.js"; import { RdDItemArme } from "./item/arme.js"; import { RdDPossession } from "./rdd-possession.js"; import { ReglesOptionnelles } from "./settings/regles-optionnelles.js"; @@ -35,7 +36,7 @@ export class RdDBonus { } /* -------------------------------------------- */ - static dmg(rollData, actor, isEntiteIncarnee = false) { + static dmg(rollData, actor) { const diff = rollData.diffLibre; const dmgArme = RdDBonus.dmgArme(rollData.arme, rollData.arme?.system.dommagesReels) const forceRequise = rollData.arme ? RdDItemArme.valeurMain(rollData.arme.system.force ?? 0, RdDItemArme.getMainAttaque(rollData.competence)) : 0 @@ -48,12 +49,12 @@ export class RdDBonus { dmgTactique: RdDBonus.dmgBonus(rollData.tactique), dmgParticuliere: RdDBonus._dmgParticuliere(rollData), dmgSurprise: RdDBonus.dmgBonus(rollData.ajustements?.attaqueDefenseurSurpris?.used), - mortalite: RdDBonus._calculMortalite(rollData, isEntiteIncarnee), + mortalite: RdDBonus.mortalite(rollData.dmg?.mortalite, rollData.arme?.system.mortalite), dmgActor: RdDBonus.bonusDmg(actor, rollData.selectedCarac?.label.toLowerCase(), dmgArme), dmgForceInsuffisante: Math.min(0, actor.getForce() - forceRequise) } dmg.total = dmg.dmgSurprise + dmg.dmgTactique + dmg.dmgArme + dmg.dmgActor + dmg.dmgParticuliere + dmg.dmgForceInsuffisante - return dmg; + return dmg } static dmgRollV2(rollData, attaque) { @@ -68,7 +69,7 @@ export class RdDBonus { dmgTactique: attaque.tactique?.dmg ?? 0, dmgParticuliere: RdDBonus._dmgParticuliere(rollData), dmgSurprise: rollData.opponent?.surprise?.dmg ?? 0, - mortalite: RdDBonus.mortalite(attaque.dmg?.mortalite, arme?.system.mortalite, rollData.opponent?.actor?.isEntite()), + mortalite: RdDBonus.mortalite(attaque.dmg?.mortalite, arme?.system.mortalite), dmgActor: RdDBonus.bonusDmg(actor, attaque.carac.key, dmgArme, attaque.forceRequise), dmgForceInsuffisante: Math.min(0, actor.getForce() - (attaque.forceRequise ?? 0)), dmgDiffLibre: ReglesOptionnelles.isUsing('degat-ajout-malus-libre') ? Math.abs(attaque.diff ?? 0) : 0 @@ -93,15 +94,8 @@ export class RdDBonus { } /* -------------------------------------------- */ - static _calculMortalite(rollData, isEntiteIncarnee) { - return RdDBonus.mortalite(rollData.dmg?.mortalite, rollData.arme?.system.mortalite, isEntiteIncarnee) - } - - static mortalite(mortaliteSelect, mortaliteArme, isEntiteIncarnee) { - return isEntiteIncarnee ? "entiteincarnee" - : mortaliteSelect - ?? mortaliteArme - ?? "mortel"; + static mortalite(mortaliteSelect, mortaliteArme) { + return mortaliteSelect ?? mortaliteArme ?? RDD_CONFIG.encaissement.mortel } /* -------------------------------------------- */ diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 58f01421..72d10848 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -1,5 +1,5 @@ import { ChatUtility } from "./chat-utility.js"; -import { ENTITE_BLURETTE, HIDE_DICE, renderTemplate, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; +import { HIDE_DICE, renderTemplate, SYSTEM_RDD, SYSTEM_SOCKET_ID } from "./constants.js"; import { Grammar } from "./grammar.js"; import { Misc } from "./misc.js"; import { RdDBonus } from "./rdd-bonus.js"; @@ -15,7 +15,7 @@ import { RdDItemCompetence } from "./item-competence.js"; import { MAP_PHASE, RdDInitiative } from "./initiative.mjs"; import RollDialog from "./roll/roll-dialog.mjs"; import { PART_DEFENSE } from "./roll/roll-part-defense.mjs"; -import { DIFF, ROLL_TYPE_ATTAQUE, ROLL_TYPE_DEFENSE } from "./roll/roll-constants.mjs"; +import { ROLL_TYPE_ATTAQUE, ROLL_TYPE_DEFENSE } from "./roll/roll-constants.mjs"; import { OptionsAvancees, ROLL_DIALOG_V2 } from "./settings/options-avancees.js"; import { MappingCreatureArme } from "./item/mapping-creature-arme.mjs"; import { RollBasicParts } from "./roll/roll-basic-parts.mjs"; @@ -601,7 +601,7 @@ export class RdDCombat { /* -------------------------------------------- */ async proposerAjustementTirLancer(rollData) { if (['tir', 'lancer'].includes(rollData.competence.system.categorie)) { - if (this.defender.isEntite([ENTITE_BLURETTE])) { + if (this.defender.isEntiteBlurette()) { ChatMessage.create({ content: `La cible est une blurette, l'arme à distance sera perdue dans le blurêve`, whisper: ChatUtility.getGMs() @@ -797,7 +797,7 @@ export class RdDCombat { essais: {} }; - if (this.attacker.isCreatureEntite()) { + if (this.attacker.isCreatureOuEntite()) { MappingCreatureArme.setRollDataCreature(rollData); } else if (arme) { @@ -866,7 +866,7 @@ export class RdDCombat { async _onAttaqueNormale(attackerRoll) { console.log("RdDCombat.onAttaqueNormale >>>", attackerRoll); - attackerRoll.dmg = RdDBonus.dmg(attackerRoll, this.attacker, this.defender.isEntite()); + attackerRoll.dmg = RdDBonus.dmg(attackerRoll, this.attacker); let defenderRoll = { attackerRoll: attackerRoll, passeArme: attackerRoll.passeArme, show: {} } attackerRoll.show = { cible: this.defender?.getAlias() ?? 'la cible', @@ -1104,7 +1104,7 @@ export class RdDCombat { show: {} }; - if (this.defender.isCreatureEntite()) { + if (this.defender.isCreatureOuEntite()) { MappingCreatureArme.setRollDataCreature(defenderRoll); } @@ -1231,7 +1231,7 @@ export class RdDCombat { show: {} }; - if (this.defender.isCreatureEntite()) { + if (this.defender.isCreatureOuEntite()) { MappingCreatureArme.setRollDataCreature(rollData); } return rollData; diff --git a/module/rdd-empoignade.js b/module/rdd-empoignade.js index 475c6147..dbdf0208 100644 --- a/module/rdd-empoignade.js +++ b/module/rdd-empoignade.js @@ -184,7 +184,7 @@ export class RdDEmpoignade { selectedCarac: attacker.system.carac.melee, malusTaille: RdDEmpoignade.getMalusTaille(empoignade, attacker, defender) } - if (attacker.isCreatureEntite()) { + if (attacker.isCreatureOuEntite()) { MappingCreatureArme.setRollDataCreature(rollData) } if (empoignade.system.pointsemp >= 2) { diff --git a/module/rdd-possession.js b/module/rdd-possession.js index 1588a917..bf0b5c85 100644 --- a/module/rdd-possession.js +++ b/module/rdd-possession.js @@ -95,7 +95,7 @@ export class RdDPossession { static selectCompetenceDraconicOuPossession(rollData, rollingActor) { rollData.competence = rollingActor.getDraconicOuPossession(); - if (rollingActor.isCreatureEntite()) { + if (rollingActor.isCreatureOuEntite()) { const carac = rollingActor.system.carac rollData.carac = carac rollData.competence.system.defaut_carac = 'reve' diff --git a/module/rdd-roll-encaisser.js b/module/rdd-roll-encaisser.js index 058c93ff..813b1266 100644 --- a/module/rdd-roll-encaisser.js +++ b/module/rdd-roll-encaisser.js @@ -1,4 +1,4 @@ -import { ENTITE_BLURETTE, ENTITE_INCARNE, renderTemplate } from "./constants.js"; +import { ENTITE_NONINCARNE, RDD_CONFIG, renderTemplate } from "./constants.js"; import { RdDUtility } from "./rdd-utility.js"; /** @@ -16,34 +16,29 @@ export class RdDEncaisser extends Dialog { /* -------------------------------------------- */ constructor(html, actor) { - let dialogConf = { + if (actor.isEntiteNonIncarnee([ENTITE_NONINCARNE])) { + throw `${actor.name} est une entité non incarnée et ne peut pas subnir de dommages` + } + + const dialogConf = { title: "Jet d'Encaissement", content: html, - } - - if (!actor.isEntite()) { - dialogConf.default = "mortel"; - dialogConf.buttons = { - "mortel": { label: "Mortel", callback: html => this.performEncaisser("mortel") }, - "non-mortel": { label: "Non-mortel", callback: html => this.performEncaisser("non-mortel") }, - "sonne": { label: "Sonné", callback: html => this.actor.setSonne() }, - }; - } - else if (actor.isEntite([ENTITE_BLURETTE, ENTITE_INCARNE])) { - dialogConf.default = "entiteincarnee" - dialogConf.buttons = { - "entiteincarnee": { label: "Entité incarnée", callback: html => this.performEncaisser("entiteincarnee") } + default: RDD_CONFIG.encaissement.mortel, + buttons: { + [RDD_CONFIG.encaissement.mortel]: { label: "Mortel", callback: html => this.performEncaisser(RDD_CONFIG.encaissement.mortel) }, } } - - let dialogOptions = { - classes: ["rdd-roll-dialog"], - width: 320, - height: 'fit-content' + if (!actor.isEntite()) { + dialogConf.buttons[RDD_CONFIG.encaissement.nonmortel] = { label: "Non-mortel", callback: html => this.performEncaisser(RDD_CONFIG.encaissement.nonmortel) } + dialogConf.buttons["sonne"] = { label: "Sonné", callback: html => this.actor.setSonne() } } // Select proper roll dialog template and stuff - super(dialogConf, dialogOptions); + super(dialogConf, { + classes: ["rdd-roll-dialog"], + width: 320, + height: 'fit-content' + }); this.actor = actor; this.modifier = 0; diff --git a/module/rdd-roll.js b/module/rdd-roll.js index 3c369ecd..3c2bd93b 100644 --- a/module/rdd-roll.js +++ b/module/rdd-roll.js @@ -8,7 +8,7 @@ import { RdDCarac } from "./rdd-carac.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { ReglesOptionnelles } from "./settings/regles-optionnelles.js"; import { Grammar } from "./grammar.js"; -import { ACTOR_TYPES, renderTemplate } from "./constants.js"; +import { ACTOR_TYPES, RDD_CONFIG, renderTemplate } from "./constants.js"; import { EMPOIGNADE } from "./item/arme.js"; /** @@ -206,7 +206,7 @@ export class RdDRoll extends Dialog { this.updateRollResult(html); }); this.html.find("input.check-mortalite").change((event) => { - this.rollData.dmg.mortalite = event.currentTarget.checked ? "non-mortel" : "mortel"; + this.rollData.dmg.mortalite = event.currentTarget.checked ? RDD_CONFIG.encaissement.nonmortel : RDD_CONFIG.encaissement.mortel; this.updateRollResult(html); }); this.html.find('.cuisine-proportions').change((event) => { @@ -333,7 +333,7 @@ export class RdDRoll extends Dialog { // Mise à jour valeurs this.html.find(".dialog-roll-title").text(this._getTitle(rollData)); - this.html.find("input.check-mortalite").prop('checked', rollData.dmg.mortalite == 'non-mortel'); + this.html.find("input.check-mortalite").prop('checked', rollData.dmg.mortalite == RDD_CONFIG.encaissement.nonmortel); this.html.find("label.dmg-arme-actor").text(rollData.dmg.mortalite == EMPOIGNADE ? EMPOIGNADE : Misc.toSignedString(rollData.dmg.total)); this.html.find("label.arme-mortalite").text(rollData.dmg.mortalite); this.html.find("div.placeholder-ajustements").empty().append(adjustements); diff --git a/module/rdd-utility.js b/module/rdd-utility.js index b37b79c5..4ffd88ff 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -75,30 +75,27 @@ const fatigueLineMalus = [0, -1, -2, -3, -4, -5, -6, -7]; /* -------------------------------------------- */ const nomEthylisme = ["Emeché", "Gris", "Pinté", "Pas frais", "Ivre", "Bu", "Complètement fait", "Ivre mort"]; -/* -------------------------------------------- */ -const definitionsEncaissement = { - "mortel": [ - { minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1 }, - { minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0 }, - { minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 2 }, - { minimum: 16, maximum: 19, endurance: "2d6", vie: "2", gravite: 4 }, - { minimum: 20, maximum: undefined, endurance: "100", vie: "4 + @over20", gravite: 6 }, - ], - "non-mortel": [ - { minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1 }, - { minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0 }, - { minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 0 }, - { minimum: 16, maximum: 19, endurance: "2d6", vie: "0", gravite: 2 }, - { minimum: 20, maximum: undefined, endurance: "100", vie: "0", gravite: 2 }, - ], - "entiteincarnee": [ - { minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1 }, - { minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0 }, - { minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 0 }, - { minimum: 16, maximum: 19, endurance: "2d6", vie: "0", gravite: 0 }, - { minimum: 20, maximum: undefined, endurance: "3d6 + @over20", vie: "0", gravite: 0 }, - ] -}; +const TABLE_ENCAISSEMENT_MORTEL = [ + { minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1 }, + { minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0 }, + { minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 2 }, + { minimum: 16, maximum: 19, endurance: "2d6", vie: "2", gravite: 4 }, + { minimum: 20, maximum: undefined, endurance: "100", vie: "4 + @over20", gravite: 6 }, +] +const TABLE_ENCAISSEMENT_NONMORTEL = [ + { minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1 }, + { minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0 }, + { minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 0 }, + { minimum: 16, maximum: 19, endurance: "2d6", vie: "0", gravite: 2 }, + { minimum: 20, maximum: undefined, endurance: "100", vie: "0", gravite: 2 }, +] +const TABLE_ENCAISSEMENT_ENTITE = [ + { minimum: undefined, maximum: 0, endurance: "0", vie: "0", gravite: -1 }, + { minimum: 1, maximum: 10, endurance: "1d4", vie: "0", gravite: 0 }, + { minimum: 11, maximum: 15, endurance: "1d6", vie: "0", gravite: 2 }, + { minimum: 16, maximum: 19, endurance: "2d6", vie: "0", gravite: 4 }, + { minimum: 20, maximum: undefined, endurance: "3d6 + @over20", vie: "0", gravite: 6 }, +] /* -------------------------------------------- */ export class RdDUtility { @@ -278,7 +275,7 @@ export class RdDUtility { Handlebars.registerHelper('plusMoins', diff => parseInt(diff) ? (diff > 0 ? '+' : '') + Math.round(diff) : diff) Handlebars.registerHelper('fractionOneN', n => new Handlebars.SafeString(Misc.getFractionOneN(n))) - + // Handle v12 removal of this helper Handlebars.registerHelper('select', function (selected, options) { const escapedValue = RegExp.escape(Handlebars.escapeExpression(selected)); @@ -286,7 +283,7 @@ export class RdDUtility { const html = options.fn(this); return html.replace(rgx, "$& selected"); }) - + // logic Handlebars.registerHelper('either', (a, b) => a ?? b); // string manipulation @@ -299,7 +296,7 @@ export class RdDUtility { Handlebars.registerHelper('grammar-un', str => Grammar.articleIndetermine(str)); Handlebars.registerHelper('grammar-accord', (genre, ...args) => Grammar.accord(genre, args)); Handlebars.registerHelper('json-stringify', object => JSON.stringify(object)) - + // math Handlebars.registerHelper('math-sum', (...values) => values.slice(0, -1).reduce(Misc.sum(), 0)) Handlebars.registerHelper('math-abs', diff => Math.abs(parseInt(diff))) @@ -613,20 +610,20 @@ export class RdDUtility { /* -------------------------------------------- */ static async getLocalisation(type = 'personnage') { - const loc = { result: await RdDDice.rollTotal("1d20")}; + const loc = { result: await RdDDice.rollTotal("1d20") }; if (type == 'personnage') { - if (loc.result <= 3) loc.txt = "Jambe, genou, pied, jarret"; - else if (loc.result <= 7) loc.txt = "Hanche, cuisse, fesse"; - else if (loc.result <= 9) loc.txt = "Ventre, reins"; - else if (loc.result <= 12) loc.txt = "Poitrine, dos"; - else if (loc.result <= 14) loc.txt = "Avant-bras, main, coude"; - else if (loc.result <= 18) loc.txt = "Epaule, bras, omoplate"; - else if (loc.result == 19) loc.txt = "Tête"; - else if (loc.result == 20) loc.txt = "Tête (visage)"; + if (loc.result <= 3) loc.txt = "Jambe, genou, pied, jarret"; + else if (loc.result <= 7) loc.txt = "Hanche, cuisse, fesse"; + else if (loc.result <= 9) loc.txt = "Ventre, reins"; + else if (loc.result <= 12) loc.txt = "Poitrine, dos"; + else if (loc.result <= 14) loc.txt = "Avant-bras, main, coude"; + else if (loc.result <= 18) loc.txt = "Epaule, bras, omoplate"; + else if (loc.result == 19) loc.txt = "Tête"; + else if (loc.result == 20) loc.txt = "Tête (visage)"; } else { - if (loc.result <= 7) loc.txt = "Jambes/Pattes"; - else if (loc.result <= 18) loc.txt = "Corps"; - else if (loc.result <= 20) loc.txt = "Tête"; + if (loc.result <= 7) loc.txt = "Jambes/Pattes"; + else if (loc.result <= 18) loc.txt = "Corps"; + else if (loc.result <= 20) loc.txt = "Tête"; } return loc } @@ -671,13 +668,13 @@ export class RdDUtility { } /* -------------------------------------------- */ - static async prepareEncaissement(actor, dmg, roll, armure) { + static async prepareEncaissement(targetActor, dmg, roll, armure) { const jetTotal = roll.total + dmg.total - armure - const encaissement = RdDUtility._selectEncaissement(jetTotal, dmg.mortalite); - const over20 = Math.max(jetTotal - 20, 0); + const encaissement = RdDUtility.$selectEncaissement(targetActor, jetTotal, dmg.mortalite) + const over20 = Math.max(jetTotal - 20, 0) encaissement.dmg = dmg if (ReglesOptionnelles.isUsing('localisation-aleatoire')) { - encaissement.dmg.loc = dmg.loc ?? await RdDUtility.getLocalisation(actor.type) + encaissement.dmg.loc = dmg.loc ?? await RdDUtility.getLocalisation(targetActor.type) encaissement.dmg.loc.label = encaissement.dmg.loc.label ?? 'Corps;' } else { @@ -693,15 +690,21 @@ export class RdDUtility { } /* -------------------------------------------- */ - static _selectEncaissement(degats, mortalite) { - const table = definitionsEncaissement[mortalite] === undefined ? definitionsEncaissement["mortel"] : definitionsEncaissement[mortalite]; - for (let encaissement of table) { - if ((encaissement.minimum === undefined || encaissement.minimum <= degats) - && (encaissement.maximum === undefined || degats <= encaissement.maximum)) { - return foundry.utils.duplicate(encaissement); - } + static $selectEncaissement(targetActor, degats, mortalite) { + const table = RdDUtility.$getTableEncaissement(targetActor, mortalite) + const encaissement = table.find(it => ((it.minimum ?? degats) <= degats && degats <= (it.maximum ?? degats))) + return foundry.utils.duplicate(encaissement ?? table[0]) + } + + static $getTableEncaissement(targetActor, mortalite) { + if (targetActor.isEntite()) { + return TABLE_ENCAISSEMENT_ENTITE } - return foundry.utils.duplicate(table[0]); + switch (mortalite) { + case RDD_CONFIG.encaissement.nonmortel: return TABLE_ENCAISSEMENT_NONMORTEL + case RDD_CONFIG.encaissement.entiteincarnee: return TABLE_ENCAISSEMENT_ENTITE + } + return TABLE_ENCAISSEMENT_MORTEL } /* -------------------------------------------- */ diff --git a/module/roll/roll-part-attaque.mjs b/module/roll/roll-part-attaque.mjs index 914260e8..ccf27bc4 100644 --- a/module/roll/roll-part-attaque.mjs +++ b/module/roll/roll-part-attaque.mjs @@ -1,3 +1,4 @@ +import { RDD_CONFIG } from "../constants.js" import { RdDBonus } from "../rdd-bonus.js" import { DIFF, ROLL_TYPE_ATTAQUE } from "./roll-constants.mjs" import { PART_CARAC } from "./roll-part-carac.mjs" @@ -94,7 +95,7 @@ export class RollPartAttaque extends RollPartSelect { }) checkMortalite?.addEventListener("change", e => { - current.dmg.mortalite = (e.currentTarget.checked ? 'mortel' : 'non-mortel') + current.dmg.mortalite = (e.currentTarget.checked ? RDD_CONFIG.encaissement.mortel : RDD_CONFIG.encaissement.nonmortel) rollDialog.render() }) } diff --git a/templates/chat-resultat-encaissement.hbs b/templates/chat-resultat-encaissement.hbs index f10b9ee5..9a843721 100644 --- a/templates/chat-resultat-encaissement.hbs +++ b/templates/chat-resultat-encaissement.hbs @@ -21,12 +21,12 @@ {{~#unless (eq penetration 0)}} (pénétration de {{penetration}}){{/unless}} {{~/unless~}}, total: {{total}}
- {{alias}} - {{#if (eq dmg.mortalite 'entiteincarnee')}}subit le coup - {{else if mort}}vient de mourir + {{alias}} + {{log 'encaissement' this}} + {{#if mort}}vient de mourir {{else if blessure}} - {{#if (gt blessure.system.gravite 0)}}subit une blessure {{blessure.system.label}} - {{~else~}}subit une contusion + {{#if (gt blessure.system.gravite 0)}}subit une blessure {{blessure.name}} + {{~else~}}subit une éraflure {{~/if~}} {{~else~}}s'en sort sans une égratignure {{~/if~}} From 147e49f2cb05b40ad0f1bf6e8b5b3d58cca35d38 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 21 Oct 2025 01:37:54 +0200 Subject: [PATCH 05/10] Gestion des significatives --- changelog.md | 2 ++ module/actor/base-actor-reve.js | 4 ++-- module/rdd-resolution-table.js | 14 +++++++++----- module/roll/roll-basic-parts.mjs | 2 +- module/roll/roll-part-attaque.mjs | 3 +++ module/roll/roll-part-defense.mjs | 2 +- module/roll/roll-part-sign.mjs | 10 ++++++---- module/settings/status-effects.js | 4 ++-- 8 files changed, 26 insertions(+), 15 deletions(-) diff --git a/changelog.md b/changelog.md index 7bb4e19d..a690eebf 100644 --- a/changelog.md +++ b/changelog.md @@ -1,12 +1,14 @@ # 13.0 ## 13.0.14 - Le familier d'Illysis +- Les réussites particulières en demi-surprise sont de simples réussites - Amélioration des entités: - l'attaquant ne sait plus que c'est une entité de cauchemar (surprise!) - l'encaissement indique une blessure dans le tchat... même si ce n'est que de l'endurance - les blurettes suivent les règles des entités de cauchemar (p322) - Nouvelle fenêtre de jets de dés - Attaque/défense des créatures + - les attaques/parades avec une arme trop lourde se font en demi-surprise ## 13.0.13 - L'épanouissement d'Illysis diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 667253a0..6379cfd7 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -272,8 +272,8 @@ export class RdDBaseActorReve extends RdDBaseActor { return this.getEffectByStatus(STATUSES.StatusDemiReve) != undefined } - getSurprise(isCombat = undefined) { - return StatusEffects.getSurprise(this.getEffects(), isCombat) + getSurprise(isCombat = undefined, forceRequise = undefined) { + return StatusEffects.getSurprise(this.getEffects(e => true, isCombat, forceRequise), isCombat) } /* -------------------------------------------- */ diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index b3adb522..ed6f69f6 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -16,17 +16,20 @@ const levelDown = [ ]; const levelImpossible = { score: 0, norm: 0, sign: 0, part: 0, epart: 0, etotal: 1 }; +const reussiteNormale = { code: "norm", isPart: false, isSign: false, isSuccess: true, isEchec: false, isEPart: false, isETotal: false, ptTache: 1, ptQualite: 0, quality: "Réussite normale", condition: (target, roll) => (roll > target.sign && roll <= target.norm) }; +const reussiteSignificative = { code: "sign", isPart: false, isSign: true, isSuccess: true, isEchec: false, isEPart: false, isETotal: false, ptTache: 2, ptQualite: 1, quality: "Réussite significative", condition: (target, roll) => (roll > target.part && roll <= target.sign) }; +const reussiteInsuffisante = { code: "notSign", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: false, isETotal: false, ptTache: 0, ptQualite: -2, quality: "Réussite insuffisante", condition: (target, roll) => false } + const reussites = [ { code: "etotal", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: true, isETotal: true, ptTache: -4, ptQualite: -6, quality: "Echec total", condition: (target, roll) => roll >= target.etotal && roll <= 100 }, { code: "epart", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: true, isETotal: false, ptTache: -2, ptQualite: -4, quality: "Echec particulier", condition: (target, roll) => (roll >= target.epart && roll < target.etotal) }, { code: "echec", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: false, isETotal: false, ptTache: 0, ptQualite: -2, quality: "Echec normal", condition: (target, roll) => (roll > target.norm && roll < target.etotal) }, - { code: "norm", isPart: false, isSign: false, isSuccess: true, isEchec: false, isEPart: false, isETotal: false, ptTache: 1, ptQualite: 0, quality: "Réussite normale", condition: (target, roll) => (roll > target.sign && roll <= target.norm) }, - { code: "sign", isPart: false, isSign: true, isSuccess: true, isEchec: false, isEPart: false, isETotal: false, ptTache: 2, ptQualite: 1, quality: "Réussite significative", condition: (target, roll) => (roll > target.part && roll <= target.sign) }, + reussiteNormale, + reussiteSignificative, { code: "part", isPart: true, isSign: true, isSuccess: true, isEchec: false, isEPart: false, isETotal: false, ptTache: 3, ptQualite: 2, quality: "Réussite Particulière!", condition: (target, roll) => (roll > 0 && roll <= target.part) }, { code: "error", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: true, isETotal: true, ptTache: 0, ptQualite: 0, quality: "Jet de dés invalide", condition: (target, roll) => (roll <= 0 || roll > 100) } ]; -const reussiteInsuffisante = { code: "notSign", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: false, isETotal: false, ptTache: 0, ptQualite: -2, quality: "Réussite insuffisante", condition: (target, roll) => false } /* -------------------------------------------- */ const CARAC_MAXIMUM_RESOLUTION = 40; /* -------------------------------------------- */ @@ -157,7 +160,7 @@ export class RdDResolutionTable { } /* -------------------------------------------- */ - static replaceParticuliereDemiSurprise(chances){ + static replaceParticuliereDemiSurprise(chances) { foundry.utils.mergeObject(chances, reussites.find(x => x.code == 'part'), { overwrite: true }); } @@ -165,7 +168,7 @@ export class RdDResolutionTable { static significativeRequise(chances) { chances.roll = Math.min(chances.part + 1, chances.sign) foundry.utils.mergeObject(chances, reussites.find(x => x.code == 'sign'), { overwrite: true }); - } + } /* -------------------------------------------- */ static succesRequis(chances) { @@ -197,6 +200,7 @@ export class RdDResolutionTable { if (chances.norm < roll * diviseur) { return reussiteInsuffisante } + return reussiteSignificative } return reussite } diff --git a/module/roll/roll-basic-parts.mjs b/module/roll/roll-basic-parts.mjs index 513470a0..8e5365e2 100644 --- a/module/roll/roll-basic-parts.mjs +++ b/module/roll/roll-basic-parts.mjs @@ -26,7 +26,7 @@ export class RollBasicParts { static loadSurprise(who, forceRequise) { if (who?.actor) { foundry.utils.mergeObject(who, - StatusEffects.getActorEffetSurprise(who.actor, forceRequise), + StatusEffects.getActorEffetSurprise(who.actor), { overwrite: true, inPlace: true }) } } diff --git a/module/roll/roll-part-attaque.mjs b/module/roll/roll-part-attaque.mjs index ccf27bc4..20b0c52b 100644 --- a/module/roll/roll-part-attaque.mjs +++ b/module/roll/roll-part-attaque.mjs @@ -5,6 +5,7 @@ import { PART_CARAC } from "./roll-part-carac.mjs" import { PART_COMP } from "./roll-part-comp.mjs" import { PART_DIFF } from "./roll-part-diff.mjs" import { RollPartSelect } from "./roll-part-select.mjs" +import { PART_SIGN } from "./roll-part-sign.mjs" import { ROLLDIALOG_SECTION } from "./roll-part.mjs" export const PART_ATTAQUE = 'attaque' @@ -111,7 +112,9 @@ export class RollPartAttaque extends RollPartSelect { part.setDiff(rollData, { type: DIFF.ATTAQUE, value: current.initialDiff }) current.initialDiff = undefined } + break } + case PART_SIGN: return part.setArme(rollData, false, current.forceRequise) } } return undefined diff --git a/module/roll/roll-part-defense.mjs b/module/roll/roll-part-defense.mjs index 63ef5dcd..88a0c595 100644 --- a/module/roll/roll-part-defense.mjs +++ b/module/roll/roll-part-defense.mjs @@ -101,7 +101,7 @@ export class RollPartDefense extends RollPartSelect { case PART_CARAC: return part.filterCaracs(rollData, [current.carac]) case PART_COMP: return part.filterComps(rollData, [current.comp?.name]) case PART_DIFF: return part.setDiff(rollData, this.getDiffDefense(rollData)) - case PART_SIGN: return part.setArmeDisparate(rollData, this.isArmeDisparate(rollData)) + case PART_SIGN: return part.setArme(rollData, this.isArmeDisparate(rollData), current.forceRequise) } } return undefined diff --git a/module/roll/roll-part-sign.mjs b/module/roll/roll-part-sign.mjs index 12ec40ba..3fd26a2d 100644 --- a/module/roll/roll-part-sign.mjs +++ b/module/roll/roll-part-sign.mjs @@ -40,8 +40,8 @@ export class RollPartSign extends RollPart { const isCombat = this.isCombat(rollData) const current = this.getCurrent(rollData) current.armeDisparate = isCombat && current.armeDisparate - current.surprise = actor.getSurprise(isCombat) // TODO: could be from rollData.active.surprise?? - current.reasons = actor.getEffects(it => StatusEffects.niveauSurprise(it) > 0) + current.surprise = actor.getSurprise(isCombat, current.forceRequise ?? 0) + current.reasons = actor.getEffects(it => StatusEffects.niveauSurprise(it, isCombat) > 0, current.forceRequise ?? 0) .map(it => { return { img: it.img, label: game.i18n.localize(it.name) } }) current.diviseur = 1 if (current.surprise == 'demi') { @@ -102,7 +102,9 @@ export class RollPartSign extends RollPart { }) } - setArmeDisparate(rollData, armeDisparate) { - this.getCurrent(rollData).armeDisparate = armeDisparate + setArme(rollData, armeDisparate, forceRequise) { + const current = this.getCurrent(rollData) + current.armeDisparate = armeDisparate + current.forceRequise = forceRequise } } \ No newline at end of file diff --git a/module/settings/status-effects.js b/module/settings/status-effects.js index 0f8e8a9d..74589c8c 100644 --- a/module/settings/status-effects.js +++ b/module/settings/status-effects.js @@ -84,8 +84,8 @@ export class StatusEffects extends FormApplication { ) } - static getActorEffetSurprise(actor, forceRequise) { - const effets = actor?.getEffects(StatusEffects.isSurprise, forceRequise) ?? [] + static getActorEffetSurprise(actor) { + const effets = actor?.getEffects(StatusEffects.isSurprise) ?? [] return { effets: effets, surprise: effets.length > 0 From c47fc4f5b6471dcaa82e8570d614633b22da1b63 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Wed, 22 Oct 2025 18:57:52 +0200 Subject: [PATCH 06/10] Fix scenes image locations --- changelog.md | 1 + .../scenes_Accueil_RdD_YSpVuLeMCX9tAmgn.yml | 2 +- ...scenes_Ecran_Reve_de_Dragon_9fmf9lcb3L9XO3bJ.yml | 4 ++-- {assets/scenes => pic}/9fmf9lcb3L9XO3bJ-thumb.png | Bin {assets/scenes => pic}/YSpVuLeMCX9tAmgn-thumb.webp | Bin {assets/ui => pic}/ecran_rdd.webp | Bin 6 files changed, 4 insertions(+), 3 deletions(-) rename {assets/scenes => pic}/9fmf9lcb3L9XO3bJ-thumb.png (100%) rename {assets/scenes => pic}/YSpVuLeMCX9tAmgn-thumb.webp (100%) rename {assets/ui => pic}/ecran_rdd.webp (100%) diff --git a/changelog.md b/changelog.md index a690eebf..c995eef6 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,7 @@ ## 13.0.14 - Le familier d'Illysis - Les réussites particulières en demi-surprise sont de simples réussites +- Les images des scènes par défaut sont corrigées - Amélioration des entités: - l'attaquant ne sait plus que c'est une entité de cauchemar (surprise!) - l'encaissement indique une blessure dans le tchat... même si ce n'est que de l'endurance diff --git a/packs_src/scenes-rdd/scenes_Accueil_RdD_YSpVuLeMCX9tAmgn.yml b/packs_src/scenes-rdd/scenes_Accueil_RdD_YSpVuLeMCX9tAmgn.yml index c0120a8e..9a0bb9a6 100644 --- a/packs_src/scenes-rdd/scenes_Accueil_RdD_YSpVuLeMCX9tAmgn.yml +++ b/packs_src/scenes-rdd/scenes_Accueil_RdD_YSpVuLeMCX9tAmgn.yml @@ -16,7 +16,7 @@ background: alphaThreshold: 0 foreground: null foregroundElevation: 4 -thumb: systems/foundryvtt-reve-de-dragon/assets/scenes/YSpVuLeMCX9tAmgn-thumb.webp +thumb: systems/foundryvtt-reve-de-dragon/pic/YSpVuLeMCX9tAmgn-thumb.webp width: 1920 height: 1080 padding: 0.25 diff --git a/packs_src/scenes-rdd/scenes_Ecran_Reve_de_Dragon_9fmf9lcb3L9XO3bJ.yml b/packs_src/scenes-rdd/scenes_Ecran_Reve_de_Dragon_9fmf9lcb3L9XO3bJ.yml index a0de63a0..a9f82d0a 100644 --- a/packs_src/scenes-rdd/scenes_Ecran_Reve_de_Dragon_9fmf9lcb3L9XO3bJ.yml +++ b/packs_src/scenes-rdd/scenes_Ecran_Reve_de_Dragon_9fmf9lcb3L9XO3bJ.yml @@ -7,7 +7,7 @@ initial: x: null 'y': null scale: 0.5 -thumb: systems/foundryvtt-reve-de-dragon/assets/scenes/9fmf9lcb3L9XO3bJ-thumb.png +thumb: systems/foundryvtt-reve-de-dragon/pic/9fmf9lcb3L9XO3bJ-thumb.png width: 3521 height: 2492 padding: 0.25 @@ -38,7 +38,7 @@ regions: [] ownership: default: 0 background: - src: systems/foundryvtt-reve-de-dragon/assets/ecran_rdd.webp + src: systems/foundryvtt-reve-de-dragon/pic/ecran_rdd.webp offsetX: 0 offsetY: 0 anchorX: 0 diff --git a/assets/scenes/9fmf9lcb3L9XO3bJ-thumb.png b/pic/9fmf9lcb3L9XO3bJ-thumb.png similarity index 100% rename from assets/scenes/9fmf9lcb3L9XO3bJ-thumb.png rename to pic/9fmf9lcb3L9XO3bJ-thumb.png diff --git a/assets/scenes/YSpVuLeMCX9tAmgn-thumb.webp b/pic/YSpVuLeMCX9tAmgn-thumb.webp similarity index 100% rename from assets/scenes/YSpVuLeMCX9tAmgn-thumb.webp rename to pic/YSpVuLeMCX9tAmgn-thumb.webp diff --git a/assets/ui/ecran_rdd.webp b/pic/ecran_rdd.webp similarity index 100% rename from assets/ui/ecran_rdd.webp rename to pic/ecran_rdd.webp From 02cea84ebbd9f97416bf0d2feb97e47c87d5efc5 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Tue, 21 Oct 2025 02:26:44 +0200 Subject: [PATCH 07/10] Empoignade V2 --- assets/actions/empoignade.svg | 1 + assets/{ui => actions}/encaisser.svg | 0 changelog.md | 12 +- css/foundryvtt-reve-de-dragon.css | 12 +- less/roll-dialog.less | 12 +- module/actor.js | 9 +- module/actor/base-actor-reve.js | 5 +- module/constants.js | 2 +- module/initiative.mjs | 1 + module/item/arme.js | 9 ++ module/rdd-bonus.js | 1 + module/rdd-combat.js | 31 +++--- module/rdd-empoignade.js | 105 ++++++++++++++---- module/rdd-roll.js | 2 +- module/roll/chat-roll-result.mjs | 42 +++++-- module/roll/roll-basic-parts.mjs | 16 ++- module/roll/roll-dialog-adapter.mjs | 2 +- module/roll/roll-dialog.mjs | 4 + module/roll/roll-part-attaque.mjs | 48 +++++++- module/roll/roll-part-carac.mjs | 7 ++ module/roll/roll-part-comp.mjs | 16 ++- module/roll/roll-part-defense.mjs | 23 +++- module/roll/roll-part-empoignade-taille.mjs | 40 +++++++ module/roll/roll-part-empoignade.mjs | 30 +++++ module/roll/roll-type.mjs | 1 + module/settings/status-effects.js | 7 +- templates/chat-demande-defense.hbs | 42 +++---- .../roll/result/partial-encaissement.hbs | 34 ++++-- templates/roll/roll-part-attaque.hbs | 31 ++++-- 29 files changed, 423 insertions(+), 122 deletions(-) create mode 100644 assets/actions/empoignade.svg rename assets/{ui => actions}/encaisser.svg (100%) create mode 100644 module/roll/roll-part-empoignade-taille.mjs create mode 100644 module/roll/roll-part-empoignade.mjs diff --git a/assets/actions/empoignade.svg b/assets/actions/empoignade.svg new file mode 100644 index 00000000..3385ffc2 --- /dev/null +++ b/assets/actions/empoignade.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/ui/encaisser.svg b/assets/actions/encaisser.svg similarity index 100% rename from assets/ui/encaisser.svg rename to assets/actions/encaisser.svg diff --git a/changelog.md b/changelog.md index c995eef6..4045f266 100644 --- a/changelog.md +++ b/changelog.md @@ -8,8 +8,18 @@ - l'encaissement indique une blessure dans le tchat... même si ce n'est que de l'endurance - les blurettes suivent les règles des entités de cauchemar (p322) - Nouvelle fenêtre de jets de dés - - Attaque/défense des créatures + - attaque/défense des créatures - les attaques/parades avec une arme trop lourde se font en demi-surprise + - les demandes de défense disparaîssent une fois prises en compte + - empoignade + - l'empoignade est possible avec une initiative d'empoignade, ou en cours d'empoignade + - seule la dague, le pugilat et la dague sont possibles en cours d'empoignade + - jet de Dextérité/Dague pour utiliser la dague en cours d'empoignade (p136) + - attaquer avec une arme un empoigneur donne un +4 si pas d'empoignade (p134) + - la différence de taille donne un bonus/malus en cours d'empoignade (p135) + - les dommages de l'empoignade ajoutent/enlèvent un point d'empoignade + - le statut d'empoignade est affiché sur les tokens + - les défenses contre une empoignade sont corrigées ## 13.0.13 - L'épanouissement d'Illysis diff --git a/css/foundryvtt-reve-de-dragon.css b/css/foundryvtt-reve-de-dragon.css index a7739aef..cc54159d 100644 --- a/css/foundryvtt-reve-de-dragon.css +++ b/css/foundryvtt-reve-de-dragon.css @@ -648,15 +648,19 @@ select, .system-foundryvtt-reve-de-dragon .roll-dialog roll-conditions roll-section[name="coeur"] select[name="coeur"] { max-width: 4rem; } -.system-foundryvtt-reve-de-dragon .roll-dialog roll-conditions roll-section[name="tricher"] img { - /* image de d100 */ - max-width: 2.5rem; - max-height: 2.5rem; +.system-foundryvtt-reve-de-dragon .roll-dialog roll-conditions roll-section img { + max-width: 1rem; + max-height: 1rem; gap: 0; margin: 0; padding: 0; filter: invert(0.8); } +.system-foundryvtt-reve-de-dragon .roll-dialog roll-conditions roll-section[name="tricher"] img { + /* image de d100 */ + max-width: 2.5rem; + max-height: 2.5rem; +} .system-foundryvtt-reve-de-dragon .roll-dialog roll-buttons { display: flex; flex-direction: row-reverse; diff --git a/less/roll-dialog.less b/less/roll-dialog.less index 567c0f33..cb995f33 100644 --- a/less/roll-dialog.less +++ b/less/roll-dialog.less @@ -224,15 +224,19 @@ max-width: 4rem; } - roll-conditions roll-section[name="tricher"] img { - /* image de d100 */ - max-width: 2.5rem; - max-height: 2.5rem; + roll-conditions roll-section img { + max-width: 1rem; + max-height: 1rem; gap: 0; margin: 0; padding: 0; filter: invert(0.8); } + roll-conditions roll-section[name="tricher"] img { + /* image de d100 */ + max-width: 2.5rem; + max-height: 2.5rem; + } roll-buttons { display: flex; diff --git a/module/actor.js b/module/actor.js index 24368810..98b67afd 100644 --- a/module/actor.js +++ b/module/actor.js @@ -185,7 +185,7 @@ export class RdDActor extends RdDBaseActorSang { const actions = [] const uniques = [] - const addAttaque = (arme, main = undefined, action = 'attaque') => { + const addAttaque = (arme, main = undefined) => { const dommages = RdDItemArme.valeurMain(arme.system.dommages, main) const forceRequise = RdDItemArme.valeurMain(arme.system.force ?? 0, main) const ecaillesEfficacite = arme.system.magique ? arme.system.ecaille_efficacite : 0; @@ -218,6 +218,7 @@ export class RdDActor extends RdDBaseActorSang { }) } + addAttaque(RdDItemArme.empoignade(this), ATTAQUE_TYPE.CORPS_A_CORPS) this.itemTypes[ITEM_TYPES.arme] .filter(it => it.isAttaque()) .sort(Misc.ascending(it => it.name)) @@ -227,9 +228,7 @@ export class RdDActor extends RdDBaseActorSang { if (arme.system.lancer && arme.system.resistance > 0) { addAttaque(arme, ATTAQUE_TYPE.LANCER) } if (arme.system.tir) { addAttaque(arme, ATTAQUE_TYPE.TIR) } }) - - addAttaque(RdDItemArme.pugilat(this), ATTAQUE_TYPE.CORPS_A_CORPS) - addAttaque(RdDItemArme.empoignade(this), ATTAQUE_TYPE.CORPS_A_CORPS, 'empoignade') + addAttaque(RdDItemArme.pugilat(this), ATTAQUE_TYPE.CORPS_A_CORPS) return actions } @@ -3040,6 +3039,8 @@ export class RdDActor extends RdDBaseActorSang { await this.onDeleteOwnedCaseTmr(item, options, id) break case ITEM_TYPES.empoignade: + await this.setEffect(STATUSES.StatusGrappled, false) + await this.setEffect(STATUSES.StatusGrappling, false) await RdDEmpoignade.deleteLinkedEmpoignade(this.id, item) break } diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 6379cfd7..92a60e9d 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -126,6 +126,8 @@ export class RdDBaseActorReve extends RdDBaseActor { async remiseANeuf() { } async appliquerAjoutExperience(rollData, hideChatMessage = 'show') { } + computeResumeBlessure() {} + countBlessures(filter = it => !it.isContusion()) { return 0 } async santeIncDec(name, inc, isCritique = false) { } async finDeRound(options = { terminer: false }) { @@ -204,6 +206,7 @@ export class RdDBaseActorReve extends RdDBaseActor { getPossession(possessionId) { return this.itemTypes[ITEM_TYPES.possession].find(it => it.system.possessionid == possessionId); } + getEmpoignades() { return this.itemTypes[ITEM_TYPES.empoignade]; } @@ -245,7 +248,7 @@ export class RdDBaseActorReve extends RdDBaseActor { async setEffect(statusId, status) { if (this.isEffectAllowed(statusId)) { - const effect = this.getEffectByStatus(statusId); + const effect = this.getEffectByStatus(statusId) if (!status && effect) { await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id], { render: true }) } diff --git a/module/constants.js b/module/constants.js index 37e45b6f..fbd60dc0 100644 --- a/module/constants.js +++ b/module/constants.js @@ -60,7 +60,7 @@ export const RDD_CONFIG = { icons: { armesDisparates: 'systems/foundryvtt-reve-de-dragon/assets/actions/armes-disparates.svg', demiReve: 'systems/foundryvtt-reve-de-dragon/assets/actions/sort.svg', - empoignade: 'systems/foundryvtt-reve-de-dragon/icons/empoignade.webp', + empoignade: 'systems/foundryvtt-reve-de-dragon/assets/actions/empoignade.svg', forceWeak: 'systems/foundryvtt-reve-de-dragon/assets/actions/weak.svg', }, encaissement: { diff --git a/module/initiative.mjs b/module/initiative.mjs index 4ddf5c10..d1ceed40 100644 --- a/module/initiative.mjs +++ b/module/initiative.mjs @@ -58,6 +58,7 @@ export class RdDInitiative { return { roll: roll, value: value, + rang: formule.phase.rang, init: formule.phase.rang + value / 100, label: formule.phase.label } diff --git a/module/item/arme.js b/module/item/arme.js index bd29ead1..74ff0d35 100644 --- a/module/item/arme.js +++ b/module/item/arme.js @@ -27,6 +27,7 @@ export const ATTAQUE_TYPE = { TIR: '(tir)', LANCER: '(lancer)' } +export const ATTAQUE_TYPE_MELEE = [ATTAQUE_TYPE.UNE_MAIN, ATTAQUE_TYPE.DEUX_MAINS, ATTAQUE_TYPE.CORPS_A_CORPS] export const CORPS_A_CORPS = 'Corps à corps' export const PUGILAT = 'pugilat' @@ -254,6 +255,14 @@ export class RdDItemArme extends RdDItem { return this.system.resistance > 0 || (this.system.tir != '' && this.system.portee_courte > 0) } + isEmpoignade() { + return this.system.mortalite == RDD_CONFIG.encaissement.empoignade + } + + isUtilisableEmpoigne() { + return this.system.baseInit == 3 || this.system.baseInit == 4 || this.system.competence == "Dague" + } + static pugilat(actor) { return RdDItemArme.$corpsACorps(actor, 'Pugilat', PUGILAT) } diff --git a/module/rdd-bonus.js b/module/rdd-bonus.js index 42d0f812..be0efff0 100644 --- a/module/rdd-bonus.js +++ b/module/rdd-bonus.js @@ -74,6 +74,7 @@ export class RdDBonus { dmgForceInsuffisante: Math.min(0, actor.getForce() - (attaque.forceRequise ?? 0)), dmgDiffLibre: ReglesOptionnelles.isUsing('degat-ajout-malus-libre') ? Math.abs(attaque.diff ?? 0) : 0 } + dmg.isEmpoignade = dmg.mortalite == RDD_CONFIG.encaissement.empoignade dmg.total = dmg.dmgSurprise + dmg.dmgTactique + dmg.dmgArme + dmg.dmgActor + dmg.dmgParticuliere + dmg.dmgForceInsuffisante + dmg.dmgDiffLibre return dmg } diff --git a/module/rdd-combat.js b/module/rdd-combat.js index 72d10848..676f6a13 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -56,6 +56,12 @@ export class RdDCombatManager extends Combat { } } + + static getCombatant(actorId, tokenId) { + return game.combat.combatants.find(it => it.actor.id == actorId && + it.token.id == tokenId + ); + } /* -------------------------------------------- */ async nextRound() { await this.finDeRound(); @@ -402,7 +408,6 @@ export class RdDCombat { /* -------------------------------------------- */ static registerChatCallbacks(html) { for (let button of [ - '.button-defense', '.button-parade', '.button-esquive', '.button-encaisser', @@ -474,8 +479,6 @@ export class RdDCombat { switch (button) { case '.particuliere-attaque': return await this.choixParticuliere(attackerRoll, event.currentTarget.attributes['data-mode'].value); - case '.button-defense': return this.defenseV2(attackerRoll); - case '.button-parade': return this.parade(attackerRoll, armeParadeId); case '.button-esquive': return this.esquive(attackerRoll, compId, competence); case '.button-encaisser': return this.encaisser(attackerRoll, defenderRoll); @@ -725,24 +728,24 @@ export class RdDCombat { async _chatMessageDefenseV2(paramDemandeDefense) { const attackerRoll = paramDemandeDefense.attackerRoll; RollBasicParts.loadSurprises(attackerRoll) - attackerRoll.passeArme = attackerRoll.passeArme ?? foundry.utils.randomID(16) attackerRoll.dmg = RdDBonus.dmgRollV2(attackerRoll, attackerRoll.current.attaque) - const attaque = RollDialog.saveParts(attackerRoll) - const defense = { - attackerRoll: attaque, - ids: RollBasicParts.reverseIds(attaque), - passeArme: attaque.passeArme ?? foundry.utils.randomID(16) - } + + const defenseData = RollBasicParts.prepareDefense(attackerRoll) const choixDefense = await ChatMessage.create({ // message privé: du défenseur à lui même (et aux GMs) speaker: ChatMessage.getSpeaker(this.defender, canvas.tokens.get(this.defenderTokenId)), alias: this.attacker?.getAlias(), whisper: ChatUtility.getOwners(this.defender), - content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.hbs', attackerRoll) + content: await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-demande-defense.hbs', defenseData) }); // flag pour garder les jets d'attaque/defense - ChatUtility.setMessageData(choixDefense, 'rollData', defense) + ChatUtility.setMessageData(choixDefense, 'demande-defense', true) + ChatUtility.setMessageData(choixDefense, 'rollData', { + ids: defenseData.ids, + attackerRoll: RollDialog.saveParts(attackerRoll), + passeArme: defenseData.passeArme + }) } /* -------------------------------------------- */ @@ -1052,7 +1055,7 @@ export class RdDCombat { dialog.render(true); } - async defenseV2(attackerRoll) { + async defenseV2(attackerRoll, callbacks = []) { // this._prepareParade(attackerRoll, arme, competence); RollDialog.loadRollData(attackerRoll) await this.doRollDefense({ @@ -1065,7 +1068,7 @@ export class RdDCombat { type: { allowed: [ROLL_TYPE_DEFENSE], current: ROLL_TYPE_DEFENSE }, attackerRoll: attackerRoll, passeArme: attackerRoll.passeArme, - }) + }, callbacks) } async doRollDefense(rollData, callbacks = []) { diff --git a/module/rdd-empoignade.js b/module/rdd-empoignade.js index dbdf0208..4536dac6 100644 --- a/module/rdd-empoignade.js +++ b/module/rdd-empoignade.js @@ -4,6 +4,8 @@ import { ChatUtility } from "./chat-utility.js"; import { RdDRollResult } from "./rdd-roll-result.js"; import { RdDRoll } from "./rdd-roll.js"; import { MappingCreatureArme } from "./item/mapping-creature-arme.mjs"; +import { MAP_PHASE } from "./initiative.mjs"; +import { RdDCombatManager } from "./rdd-combat.js"; /* -------------------------------------------- */ export class RdDEmpoignade { @@ -12,6 +14,49 @@ export class RdDEmpoignade { static init() { } + /* -------------------------------------------- */ + static isCombatantEmpoignade(actorId, tokenId) { + const combatant = RdDCombatManager.getCombatant(actorId, tokenId) + return MAP_PHASE.empoignade.rang == combatant?.system.init.rang + } + + static async ajustementEmpoignade(attacker, defender, adjust = 1) { + const empoignade = RdDEmpoignade.getEmpoignade(attacker, defender) + const empId = empoignade?.system.empoignadeid ?? foundry.utils.randomID(16) + if (empoignade) { + if (empoignade.system.empoigneurid == defender.id) { + adjust = - adjust + } + empoignade.system.pointsemp += adjust + await RdDEmpoignade.$updateEtatEmpoignade(empoignade, attacker, defender) + } + else { + await RdDEmpoignade.$createEtatEmpoignade({ + name: `Empoignade de ${attacker.name} sur ${defender.name}`, + type: ITEM_TYPES.empoignade, + system: { + description: "", + empoignadeid: empId, + empoigneurid: attacker.id, + empoigneid: defender.id, + pointsemp: adjust, + empoigneurname: attacker.name, + empoignename: defender.name + } + }, attacker, defender) + } + const result = RdDEmpoignade.getEmpoignadeById(defender, empId); + const defGrappled = result.system.pointsemp == (result.system.empoigneid == defender.id ? 2 : -2) + const attGrappled = result.system.pointsemp == (result.system.empoigneurid == attacker.id ? -2 : 2) + const grappling = Math.abs(result.system.pointsemp) > 0 + await defender.setEffect(STATUSES.StatusGrappling, grappling && !defGrappled) + await attacker.setEffect(STATUSES.StatusGrappling, grappling && !attGrappled) + await defender.setEffect(STATUSES.StatusGrappled, defGrappled) + await attacker.setEffect(STATUSES.StatusGrappled, attGrappled) + return result + } + + /* -------------------------------------------- */ static registerChatCallbacks(html) { $(html).on("click", '.defense-empoignade-cac', event => { @@ -237,10 +282,7 @@ export class RdDEmpoignade { if (rollData.rolled.isSuccess && isNouvelle) { - const objectEmpoignade = rollData.empoignade.toObject(); - // Creer l'empoignade sur attaquant/defenseur - attacker.creerObjetParMJ(objectEmpoignade); - defender.creerObjetParMJ(objectEmpoignade); + RdDEmpoignade.$createEtatEmpoignade(rollData.empoignade) } rollData.empoignade.isSuccess = rollData.rolled.isSuccess; @@ -259,7 +301,7 @@ export class RdDEmpoignade { return } - let empoignade = this.getEmpoignade(attacker, defender) + let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender) if (!empoignade) { ui.notifications.warn("Une erreur s'est produite : Aucune empoignade trouvée !!") @@ -317,18 +359,33 @@ export class RdDEmpoignade { } /* -------------------------------------------- */ - static async $updateEtatEmpoignade(empoignade) { - console.log("UPDATE Empoignade", empoignade) + static async $createEtatEmpoignade(empoignade) { + console.log("CREATE Empoignade", empoignade) let defender = game.actors.get(empoignade.system.empoigneid) - let emp = RdDEmpoignade.getEmpoignadeById(defender, empoignade.system.empoignadeid) - let update = { _id: emp._id, "system.pointsemp": empoignade.system.pointsemp, "system.ausol": empoignade.system.ausol } - await defender.updateEmbeddedDocuments('Item', [update]) - let attacker = game.actors.get(empoignade.system.empoigneurid) - emp = RdDEmpoignade.getEmpoignadeById(attacker, empoignade.system.empoignadeid) - update = { _id: emp._id, "system.pointsemp": empoignade.system.pointsemp, "system.ausol": empoignade.system.ausol } - await attacker.updateEmbeddedDocuments('Item', [update]) + + // Creer l'empoignade sur attaquant/defenseur + await attacker.creerObjetParMJ(empoignade) + await defender.creerObjetParMJ(empoignade) + } + + /* -------------------------------------------- */ + static async $updateEtatEmpoignade(empoignade, attacker, defender) { + console.log("UPDATE Empoignade", empoignade) + const belligerants = [ + attacker ?? game.actors.get(empoignade.system.empoigneurid), + defender ?? game.actors.get(empoignade.system.empoigneid)] + + await Promise.all( + belligerants.map(async belligerant => { + const emp = RdDEmpoignade.getEmpoignadeById(belligerant, empoignade.system.empoignadeid) + return await belligerant.updateEmbeddedDocuments('Item', [{ + _id: emp._id, + "system.pointsemp": empoignade.system.pointsemp, + "system.ausol": empoignade.system.ausol + }]) + })) } /* -------------------------------------------- */ @@ -347,7 +404,7 @@ export class RdDEmpoignade { if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) { return } - let empoignade = this.getEmpoignade(attacker, defender) + let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender) empoignade.system.ausol = true await this.$updateEtatEmpoignade(empoignade) @@ -366,7 +423,7 @@ export class RdDEmpoignade { if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) { return } - let empoignade = this.getEmpoignade(attacker, defender) + let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender) await defender.setEffect(STATUSES.StatusProne, true); await this.$deleteEmpoignade(empoignade) @@ -382,7 +439,7 @@ export class RdDEmpoignade { if (!RdDEmpoignade.isActionAutorisee("immobilise", attacker, defender)) { return } - let empoignade = this.getEmpoignade(attacker, defender) + let empoignade = RdDEmpoignade.getEmpoignade(attacker, defender) //console.log("Perte d'endurance :!!!", perteMode) let endValue = defender.system.sante.endurance.value @@ -423,9 +480,17 @@ export class RdDEmpoignade { /* -------------------------------------------- */ static async createEmpoignade(attacker, defender) { return await Item.create({ - name: "Empoignade en cours de " + attacker.name + ' sur ' + defender.name, - type: 'empoignade', - system: { description: "", empoignadeid: foundry.utils.randomID(16), compteempoigne: 0, empoigneurid: attacker.id, empoigneid: defender.id, ptsemp: 0, empoigneurname: attacker.name, empoignename: defender.name } + name: "Empoignade de " + attacker.name + ' sur ' + defender.name, + type: ITEM_TYPES.empoignade, + system: { + description: "", + empoignadeid: foundry.utils.randomID(16), + empoigneurid: attacker.id, + empoigneid: defender.id, + pointsemp: 0, + empoigneurname: attacker.name, + empoignename: defender.name + } }, { temporary: true diff --git a/module/rdd-roll.js b/module/rdd-roll.js index 3c2bd93b..5eeda886 100644 --- a/module/rdd-roll.js +++ b/module/rdd-roll.js @@ -334,7 +334,7 @@ export class RdDRoll extends Dialog { // Mise à jour valeurs this.html.find(".dialog-roll-title").text(this._getTitle(rollData)); this.html.find("input.check-mortalite").prop('checked', rollData.dmg.mortalite == RDD_CONFIG.encaissement.nonmortel); - this.html.find("label.dmg-arme-actor").text(rollData.dmg.mortalite == EMPOIGNADE ? EMPOIGNADE : Misc.toSignedString(rollData.dmg.total)); + this.html.find("label.dmg-arme-actor").text(rollData.dmg.isEmpoignade ? EMPOIGNADE : Misc.toSignedString(rollData.dmg.total)); this.html.find("label.arme-mortalite").text(rollData.dmg.mortalite); this.html.find("div.placeholder-ajustements").empty().append(adjustements); this.html.find("div.placeholder-resolution").empty().append(resolutionTable) diff --git a/module/roll/chat-roll-result.mjs b/module/roll/chat-roll-result.mjs index d64212bd..6a90fb2d 100644 --- a/module/roll/chat-roll-result.mjs +++ b/module/roll/chat-roll-result.mjs @@ -5,13 +5,13 @@ import { RdDCombat } from "../rdd-combat.js" import { ROLL_TYPE_ATTAQUE, ROLL_TYPE_DEFENSE } from "./roll-constants.mjs" import { RdDResolutionTable } from "../rdd-resolution-table.js" import { RDD_CONFIG, renderTemplate } from "../constants.js" -import { EMPOIGNADE } from "../item/arme.js" import { RdDTextEditor } from "../apps/rdd-text-roll-editor.js" import { RollTypeCuisine } from "./roll-type-cuisine.mjs" import { RollTypeMeditation } from "./roll-type-meditation.mjs" import { PART_DEFENSE } from "./roll-part-defense.mjs" import { PART_ATTAQUE } from "./roll-part-attaque.mjs" import { RdDRollTables } from "../rdd-rolltables.js" +import { RdDEmpoignade } from "../rdd-empoignade.js" export default class ChatRollResult { static init() { @@ -67,7 +67,7 @@ export default class ChatRollResult { isShowEncaissement(roll) { switch (roll.type.current) { case ROLL_TYPE_DEFENSE: - return roll.rolled.isEchec && roll.attackerRoll?.dmg.mortalite != EMPOIGNADE + return roll.rolled.isEchec } return false } @@ -132,6 +132,7 @@ export default class ChatRollResult { async chatListeners(html) { $(html).on("click", '.appel-chance', event => this.onClickAppelChance(event)) $(html).on("click", '.appel-destinee', event => this.onClickAppelDestinee(event)) + $(html).on("click", '.button-defense', event => this.onClickDefense(event)) $(html).on("click", '.encaissement', event => this.onClickEncaissement(event)) $(html).on("click", '.resister-recul', event => this.onClickRecul(event)) $(html).on("click", '.choix-particuliere', event => this.onClickChoixParticuliere(event)) @@ -219,18 +220,41 @@ export default class ChatRollResult { }) } - async onClickEncaissement(event) { + async onClickDefense(event) { const chatMessage = ChatUtility.getChatMessage(event) const savedRoll = this.loadChatMessageRoll(chatMessage) + const attackerRoll = savedRoll.attackerRoll + this.getCombat(attackerRoll)?.defenseV2(attackerRoll, + [roll => { ChatUtility.removeChatMessageId(chatMessage.id) }] + ) + } + + async onClickEncaissement(event) { + const chatMessage = ChatUtility.getChatMessage(event) + const isMessageDemande = ChatUtility.getMessageData(chatMessage, 'demande-defense') + const savedRoll = this.loadChatMessageRoll(chatMessage) const attaque = savedRoll.attackerRoll - const defender = game.actors.get(savedRoll.ids.actorId) - const attacker = game.actors.get(savedRoll.ids.opponentId) const defenderToken = savedRoll.ids.actorTokenId ? canvas.tokens.get(savedRoll.ids.actorTokenId) : undefined const attackerToken = savedRoll.ids.opponentTokenId ? canvas.tokens.get(savedRoll.ids.opponentTokenId) : undefined - await defender?.encaisserDommages(attaque.dmg, attacker, undefined, attackerToken, defenderToken) - - savedRoll.done.encaissement = true - await this.updateChatMessage(chatMessage, savedRoll) + switch (attaque.dmg.mortalite) { + case RDD_CONFIG.encaissement.empoignade: + savedRoll.done = savedRoll.done ?? {} + savedRoll.done.empoignade = await RdDEmpoignade.ajustementEmpoignade(attackerToken.actor, defenderToken.actor) + break + case RDD_CONFIG.encaissement.entiteincarnee: + case RDD_CONFIG.encaissement.nonmortel: + case RDD_CONFIG.encaissement.mortel: + const defender = defenderToken?.actor ?? game.actors.get(savedRoll.ids.actorId) + const attacker = attackerToken?.actor ?? game.actors.get(savedRoll.ids.opponentId) + await defender?.encaisserDommages(attaque.dmg, attacker, undefined, attackerToken, defenderToken) + break + } + if (isMessageDemande) { + ChatUtility.removeChatMessageId(chatMessage.id) + } else { + savedRoll.done.encaissement = true + await this.updateChatMessage(chatMessage, savedRoll) + } } async onClickRecul(event) { diff --git a/module/roll/roll-basic-parts.mjs b/module/roll/roll-basic-parts.mjs index 8e5365e2..d8c9c51b 100644 --- a/module/roll/roll-basic-parts.mjs +++ b/module/roll/roll-basic-parts.mjs @@ -54,13 +54,27 @@ export class RollBasicParts { } } + static prepareDefense(attackerRoll) { + if (!attackerRoll.passeArme) { + attackerRoll.passeArme = foundry.utils.randomID(16); + } + return { + ids: RollBasicParts.reverseIds(attackerRoll), + active: attackerRoll.opponent, + opponent: attackerRoll.active, + attackerRoll: attackerRoll, + passeArme: attackerRoll.passeArme, + show: { encaissement: true } + } + } + static reverseIds(rollData) { return { sceneId: rollData.ids.sceneId, actorId: rollData.ids.opponentId, actorTokenId: rollData.ids.opponentTokenId, opponentId: rollData.ids.actorId, - opponentTokenId: rollData.actorTokenId + opponentTokenId: rollData.ids.actorTokenId } } diff --git a/module/roll/roll-dialog-adapter.mjs b/module/roll/roll-dialog-adapter.mjs index 809b3258..dc653679 100644 --- a/module/roll/roll-dialog-adapter.mjs +++ b/module/roll/roll-dialog-adapter.mjs @@ -124,7 +124,7 @@ export class RollDialogAdapter { const attaque = rollData.current.attaque; const choix = [] - const isEmpoignade = attaque.dmg.mortalite == 'empoignade'; + const isEmpoignade = attaque.dmg.isEmpoignade const isCharge = attaque.tactique == 'charge' /* TODO: cas de créatures faisant des lancers, Glou, Glipzouk */ const isMeleeDiffNegative = (attaque.comp.type == ITEM_TYPES.competencecreature || rollData.current.carac.key == CARACS.MELEE) diff --git a/module/roll/roll-dialog.mjs b/module/roll/roll-dialog.mjs index d2eefe70..0797a68a 100644 --- a/module/roll/roll-dialog.mjs +++ b/module/roll/roll-dialog.mjs @@ -44,6 +44,8 @@ import { RollTypeCuisine } from "./roll-type-cuisine.mjs"; import { RollPartCuisine } from "./roll-part-cuisine.mjs"; import { OptionsAvancees, ROLL_DIALOG_V2_TEST } from "../settings/options-avancees.js"; import { ActorImpacts } from "../technical/actor-impacts.mjs"; +import { RollPartEmpoignade } from "./roll-part-empoignade.mjs"; +import { RollPartEmpoignadeTaille } from "./roll-part-empoignade-taille.mjs"; const { HandlebarsApplicationMixin, ApplicationV2 } = foundry.applications.api @@ -85,6 +87,8 @@ const ROLL_PARTS = [ new RollPartConditions(), new RollPartEthylisme(), new RollPartMalusArmure(), + new RollPartEmpoignadeTaille(), + new RollPartEmpoignade(), new RollPartEncTotal(), new RollPartSurEnc(), new RollPartAppelMoral(), diff --git a/module/roll/roll-part-attaque.mjs b/module/roll/roll-part-attaque.mjs index 20b0c52b..6ca3827a 100644 --- a/module/roll/roll-part-attaque.mjs +++ b/module/roll/roll-part-attaque.mjs @@ -1,6 +1,10 @@ import { RDD_CONFIG } from "../constants.js" +import { ATTAQUE_TYPE_MELEE } from "../item/arme.js" import { RdDBonus } from "../rdd-bonus.js" -import { DIFF, ROLL_TYPE_ATTAQUE } from "./roll-constants.mjs" +import { CARACS } from "../rdd-carac.js" +import { RdDEmpoignade } from "../rdd-empoignade.js" +import { DIFF, ROLL_TYPE_ATTAQUE, ROLL_TYPE_COMP } from "./roll-constants.mjs" +import RollDialog from "./roll-dialog.mjs" import { PART_CARAC } from "./roll-part-carac.mjs" import { PART_COMP } from "./roll-part-comp.mjs" import { PART_DIFF } from "./roll-part-diff.mjs" @@ -12,6 +16,10 @@ export const PART_ATTAQUE = 'attaque' const TACTIQUES = RdDBonus.tactiques.filter(it => it.isTactique) +const FILTER_ATTAQUE_EMPOIGNADE = attaque => attaque.arme.isEmpoignade() +const FILTER_ATTAQUE_NON_EMPOIGNADE = attaque => !attaque.arme.isEmpoignade() +const FILTER_ATTAQUE_EMPOIGNE = attaque => attaque.arme.isUtilisableEmpoigne() && ATTAQUE_TYPE_MELEE.includes(attaque.main) + export class RollPartAttaque extends RollPartSelect { get code() { return PART_ATTAQUE } @@ -22,7 +30,8 @@ export class RollPartAttaque extends RollPartSelect { loadRefs(rollData) { const refs = this.getRefs(rollData) const attaques = rollData.active.actor.listAttaques() - refs.attaques = attaques.map(it => RollPartAttaque.$extractAttaque(it, rollData.active.actor)) + refs.all = attaques.map(it => RollPartAttaque.$extractAttaque(it, rollData.active.actor)) + this.filterAttaquesEmpoignade(rollData) refs.tactiques = TACTIQUES if (refs.attaques.length > 0) { const attaque = this.findAttaque(refs.attaques, this.getSaved(rollData)) @@ -30,6 +39,10 @@ export class RollPartAttaque extends RollPartSelect { } } + isAttaqueEmpoignade(it) { + return it.arme.isEmpoignade() + } + store(rollData, targetData) { super.store(rollData, targetData) this.getSaved(targetData).dmg = this.getCurrent(rollData).dmg @@ -59,10 +72,23 @@ export class RollPartAttaque extends RollPartSelect { } prepareContext(rollData) { + this.filterAttaquesEmpoignade(rollData) const current = this.getCurrent(rollData) current.dmg = RdDBonus.dmgRollV2(rollData, current) } + filterAttaquesEmpoignade(rollData) { + const refs = this.getRefs(rollData) + const isEmpoignade = RdDEmpoignade.isCombatantEmpoignade(rollData.ids.actorId, rollData.ids.actorTokenId) + refs.isEmpoignadeEnCours = RdDEmpoignade.isEmpoignadeEnCours(rollData.active.actor) + const filterAttaques = isEmpoignade ? + FILTER_ATTAQUE_EMPOIGNADE + : refs.isEmpoignadeEnCours + ? FILTER_ATTAQUE_EMPOIGNE + : FILTER_ATTAQUE_NON_EMPOIGNADE + refs.attaques = refs.all.filter(filterAttaques) + } + getAjustements(rollData) { const current = this.getCurrent(rollData) const tactique = current.tactique ? [{ label: current.tactique.label, value: current.tactique.attaque }] : [] @@ -79,6 +105,7 @@ export class RollPartAttaque extends RollPartSelect { const selectAttaque = rollDialog.element.querySelector(`roll-section[name="${this.code}"] select[name="select-attaque"]`) const selectTactique = rollDialog.element.querySelector(`roll-section[name="${this.code}"] select[name="select-tactique"]`) const checkMortalite = rollDialog.element.querySelector(`roll-section[name="${this.code}"] input[name="check-mortalite"]`) + const utiliserDagueEmpoignade = rollDialog.element.querySelector(`roll-section[name="${this.code}"] a.utiliser-dague-empoignade`) const current = this.getCurrent(rollDialog.rollData) selectAttaque.addEventListener("change", e => { @@ -99,6 +126,23 @@ export class RollPartAttaque extends RollPartSelect { current.dmg.mortalite = (e.currentTarget.checked ? RDD_CONFIG.encaissement.mortel : RDD_CONFIG.encaissement.nonmortel) rollDialog.render() }) + utiliserDagueEmpoignade?.addEventListener("click", e => { + e.preventDefault() + const rollData = rollDialog.rollData + this.utiliserDagueEmpoignade(rollData) + }) + } + + utiliserDagueEmpoignade(rollData) { + RollDialog.create({ + ids: { actorId: rollData.ids.actorId, actorTokenId: rollData.ids.actorTokenId }, + type: { allowed: [ROLL_TYPE_COMP], current: ROLL_TYPE_COMP }, + selected: { + carac: { key: CARACS.DEXTERITE, forced: true }, + comp: { key: 'Dague', forced: true }, + diff: { type: DIFF.IMPOSEE, value: -4 } + } + }) } impactOtherPart(part, rollData) { diff --git a/module/roll/roll-part-carac.mjs b/module/roll/roll-part-carac.mjs index 065549ca..55801b36 100644 --- a/module/roll/roll-part-carac.mjs +++ b/module/roll/roll-part-carac.mjs @@ -1,3 +1,4 @@ +import { Grammar } from "../grammar.js" import { RollPartSelect } from "./roll-part-select.mjs" import { ROLLDIALOG_SECTION } from "./roll-part.mjs" @@ -12,8 +13,14 @@ export class RollPartCarac extends RollPartSelect { loadRefs(rollData) { const refs = this.getRefs(rollData) + const selected = this.getSelected(rollData) const actor = rollData.active.actor refs.all = [...this.$getActorCaracs(actor), ...this.$getCaracCompetenceCreature(actor)] + .filter(c => !selected.forced || + (selected.key ? + Grammar.includesLowerCaseNoAccent(c.label, selected.key) + : c.key == '') + ) refs.caracs = refs.all this.$selectCarac(rollData) } diff --git a/module/roll/roll-part-comp.mjs b/module/roll/roll-part-comp.mjs index 06f3f5cc..e38832be 100644 --- a/module/roll/roll-part-comp.mjs +++ b/module/roll/roll-part-comp.mjs @@ -18,12 +18,16 @@ export class RollPartComp extends RollPartSelect { loadRefs(rollData) { const refs = this.getRefs(rollData) const selected = this.getSelected(rollData) - refs.all = this.$getActorComps(rollData) - .filter(comp => !selected.forced || - (selected.key ? - Grammar.includesLowerCaseNoAccent(comp.name, selected.key) - : comp.key == '') - ) + const all = this.$getActorComps(rollData) + if (selected.forced) { + refs.all = all.filter(comp => Grammar.equalsInsensitive(comp.label, selected.key)) + if (refs.all.length == 0) { + refs.all = all.filter(comp => Grammar.includesLowerCaseNoAccent(comp.label, selected.key)) + } + } + else { + refs.all = all + } refs.comps = refs.all this.$selectComp(rollData) } diff --git a/module/roll/roll-part-defense.mjs b/module/roll/roll-part-defense.mjs index 88a0c595..d89935d6 100644 --- a/module/roll/roll-part-defense.mjs +++ b/module/roll/roll-part-defense.mjs @@ -1,4 +1,4 @@ -import { ITEM_TYPES } from "../constants.js" +import { ITEM_TYPES, RDD_CONFIG } from "../constants.js" import { ATTAQUE_TYPE, RdDItemArme } from "../item/arme.js" import { CARACS } from "../rdd-carac.js" import { DIFF, ROLL_TYPE_DEFENSE } from "./roll-constants.mjs" @@ -15,6 +15,8 @@ export class RollPartDefense extends RollPartSelect { get code() { return PART_DEFENSE } get section() { return ROLLDIALOG_SECTION.CHOIX } + + isValid(rollData) { return rollData.attackerRoll != undefined } visible(rollData) { return this.isRollType(rollData, ROLL_TYPE_DEFENSE) } static getDiffAttaque(attackerRoll) { @@ -27,13 +29,22 @@ export class RollPartDefense extends RollPartSelect { const attackerRoll = rollData.attackerRoll const defenseur = rollData.active.actor refs.isDistance = [ATTAQUE_TYPE.TIR, ATTAQUE_TYPE.LANCER].find(it => it == attackerRoll?.main) - const esquives = refs.isDistance == ATTAQUE_TYPE.TIR ? [] : defenseur.getCompetencesEsquive() - .map(it => RollPartDefense.$extractEsquive(it, defenseur)) + const isEmpoignade = attackerRoll.dmg.isEmpoignade + const isEmpoignadeEnCours = isEmpoignade && defenseur.itemTypes[ITEM_TYPES.empoignade].find(it => + [it.system.empoigneurid, it.system.empoigneid].includes(rollData.ids.opponentId) && + it.system.pointsemp != 0) - const parades = defenseur.items.filter(it => it.isParade() && (!refs.isDistance || it.isBouclier())) - .map(it => RollPartDefense.$extractParade(it, attackerRoll?.arme, defenseur)) + const esquives = (refs.isDistance == ATTAQUE_TYPE.TIR || isEmpoignadeEnCours) + ? [] + : defenseur.getCompetencesEsquive() + const parades = isEmpoignade + ? [RdDItemArme.empoignade(defenseur)] + : defenseur.items.filter(it => it.isParade() && (!refs.isDistance || it.isBouclier())) - refs.defenses = [...esquives, ...parades].filter(it => it != undefined) + refs.defenses = [ + ...esquives.map(it => RollPartDefense.$extractEsquive(it, defenseur)), + ...parades.map(it => RollPartDefense.$extractParade(it, attackerRoll?.arme, defenseur)) + ] this.$selectDefense(rollData) } diff --git a/module/roll/roll-part-empoignade-taille.mjs b/module/roll/roll-part-empoignade-taille.mjs new file mode 100644 index 00000000..92745a71 --- /dev/null +++ b/module/roll/roll-part-empoignade-taille.mjs @@ -0,0 +1,40 @@ +import { RDD_CONFIG } from "../constants.js" +import { ATTAQUE_TYPE_MELEE } from "../item/arme.js" +import { RdDEmpoignade } from "../rdd-empoignade.js" +import { COMBAT_ROLL_TYPES } from "./roll-constants.mjs" +import { PART_ATTAQUE } from "./roll-part-attaque.mjs" +import { RollPartCheckbox } from "./roll-part-checkbox.mjs" + +const EMPOIGNADE_TAILLE = "empoignade-taille" + +export class RollPartEmpoignadeTaille extends RollPartCheckbox { + + get code() { return EMPOIGNADE_TAILLE } + + isValid(rollData) { + return RdDEmpoignade.isCombatantEmpoignade(rollData.ids.actorId, rollData.ids.actorTokenId) + } + + visible(rollData) { + return COMBAT_ROLL_TYPES.includes(rollData.type.current) && + RdDEmpoignade.isEmpoignadeEnCours(rollData.active.actor) && + this.getTailleDiff(rollData) != 0 + } + + getTailleDiff(rollData) { + const taille = rollData.active.actor.getTaille() + const tailleOpponent = rollData.opponent.actor.getTaille() + const diff = taille - tailleOpponent + const diffTailleAbs = Math.max(0, Math.abs(diff) - 1) + const signDiff = Math.sign(diff) + return signDiff * diffTailleAbs + } + + getCheckboxIcon(rollData) { return `` } + getCheckboxLabel(rollData) { + return `Taille ${rollData.active.actor.getTaille()} vs ${rollData.opponent.actor.getTaille()} ` + } + getCheckboxValue(rollData) { + return this.getTailleDiff(rollData) + } +} diff --git a/module/roll/roll-part-empoignade.mjs b/module/roll/roll-part-empoignade.mjs new file mode 100644 index 00000000..fd7a5f0f --- /dev/null +++ b/module/roll/roll-part-empoignade.mjs @@ -0,0 +1,30 @@ +import { RDD_CONFIG } from "../constants.js" +import { ATTAQUE_TYPE_MELEE } from "../item/arme.js" +import { RdDEmpoignade } from "../rdd-empoignade.js" +import { ROLL_TYPE_ATTAQUE } from "./roll-constants.mjs" +import { PART_ATTAQUE } from "./roll-part-attaque.mjs" +import { RollPartCheckbox } from "./roll-part-checkbox.mjs" + +const EMPOIGNADE = "empoignade" + +export class RollPartEmpoignade extends RollPartCheckbox { + + get code() { return EMPOIGNADE } + + isValid(rollData) { + return RdDEmpoignade.isCombatantEmpoignade(rollData.ids.opponentId, rollData.ids.opponentTokenId) && + !RdDEmpoignade.isCombatantEmpoignade(rollData.ids.actorId, rollData.ids.actorTokenId) + } + + visible(rollData) { + return rollData.type.current == ROLL_TYPE_ATTAQUE && + ATTAQUE_TYPE_MELEE.includes(rollData.current[PART_ATTAQUE].main) && + RdDEmpoignade.isCombatantEmpoignade(rollData.ids.opponentId, rollData.ids.opponentTokenId) && + !RdDEmpoignade.isCombatantEmpoignade(rollData.ids.actorId, rollData.ids.actorTokenId) && + !RdDEmpoignade.isEmpoignadeEnCours(rollData.active.actor) + } + + getCheckboxIcon(rollData) { return `` } + getCheckboxLabel(rollData) { return "vs. empoigneur" } + getCheckboxValue(rollData) { return 4 } +} diff --git a/module/roll/roll-type.mjs b/module/roll/roll-type.mjs index 4f7ed51e..bc21742c 100644 --- a/module/roll/roll-type.mjs +++ b/module/roll/roll-type.mjs @@ -47,6 +47,7 @@ export class RollType { } setDiffType(rollData, type) { + type = rollData.selected[PART_DIFF].type ?? type rollData.current[PART_DIFF].type = type this.setRollDataType(rollData) } diff --git a/module/settings/status-effects.js b/module/settings/status-effects.js index 74589c8c..43ce4a20 100644 --- a/module/settings/status-effects.js +++ b/module/settings/status-effects.js @@ -22,8 +22,8 @@ export const demiReveStatusEffect = { rdd: true, id: STATUSES.StatusDemiReve, name: 'EFFECT.StatusDemiReve', img: RDD_CONFIG.icons.demiReve }; const rddStatusEffects = [ - { rdd: true, id: STATUSES.StatusGrappling, tint: '#33cc33', name: 'EFFECT.StatusGrappling', img: RDD_CONFIG.icons.empoignade }, - { rdd: true, id: STATUSES.StatusGrappled, tint: '#ff9900', name: 'EFFECT.StatusGrappled', img: RDD_CONFIG.icons.empoignade }, + { rdd: true, id: STATUSES.StatusGrappling, name: 'EFFECT.StatusGrappling', img: RDD_CONFIG.icons.empoignade }, + { rdd: true, id: STATUSES.StatusGrappled, tint: '#d5633d', name: 'EFFECT.StatusGrappled', img: RDD_CONFIG.icons.empoignade }, { rdd: true, id: STATUSES.StatusRestrained, name: 'EFFECT.StatusRestrained', img: 'icons/svg/net.svg' }, { rdd: true, id: STATUSES.StatusStunned, name: 'EFFECT.StatusStunned', img: 'icons/svg/stoned.svg', "duration.rounds": 1 }, @@ -45,8 +45,9 @@ const statusSurpriseTotale = new Set([STATUSES.StatusUnconscious, STATUSES.Statu export class StatusEffects extends FormApplication { static onReady() { - const rddEffectIds = rddStatusEffects.map(it => it.id); + const rddEffectIds = rddStatusEffects.map(it => it.id) rddStatusEffects.forEach(it => { + it.name = game.i18n.localize(it.name) it.statuses = new Set([it.id]) }) const defaultStatusEffectIds = CONFIG.statusEffects.map(it => it.id); diff --git a/templates/chat-demande-defense.hbs b/templates/chat-demande-defense.hbs index 75d544be..62ae5807 100644 --- a/templates/chat-demande-defense.hbs +++ b/templates/chat-demande-defense.hbs @@ -1,25 +1,24 @@ -{{log this}}
- +
-

Défense de {{opponent.name}}

+

Défense de {{active.name}}

- {{#if (eq opponent.surprise.key 'totale')}} - {{opponent.name}} est totalement surpris + {{#if (eq active.surprise.key 'totale')}} + {{active.name}} est totalement surpris {{else}} - {{opponent.name}} doit se défendre - {{~#if (eq opponent.surprise.key 'demi')}} avec une significative {{/if}} d'une attaque - {{~#if particuliere}} particulière en - {{~#if (eq particuliere 'finesse')}} finesse + {{active.name}} doit se défendre + {{~#if (eq active.surprise.key 'demi')}} avec une significative {{/if}} d'une attaque + {{~#if attackerRoll.particuliere}} particulière en + {{~#if (eq attackerRoll.particuliere 'finesse')}} finesse {{else if (eq particuliere 'force')}} force {{else if (eq particuliere 'rapidite')}} rapidité {{/if~}} - {{/if}} de {{active.name}} ({{current.attaque.label}}): + {{/if}} de {{opponent.name}} ({{attackerRoll.current.attaque.label}}): {{/if}}
@@ -28,30 +27,23 @@
diff --git a/templates/roll/result/partial-encaissement.hbs b/templates/roll/result/partial-encaissement.hbs index 8adbcb60..45a29d44 100644 --- a/templates/roll/result/partial-encaissement.hbs +++ b/templates/roll/result/partial-encaissement.hbs @@ -1,15 +1,29 @@ +{{log 'partial-encaissement' this}} {{#if show.encaissement}} {{#if done.encaissement}} - - - {{active.name}} a encaissé - + + {{#if (eq attackerRoll.dmg.mortalite 'empoignade')}} + + {{opponent.name}} a {{done.empoignade.system.pointsemp}} point d'empoignade contre {{active.name}}. + {{#if (gt done.empoignade.system.pointsemp 2)}} Si {{active.name}} ne se libère pas, il sera immobilisé à la fin du round{{/if}} + {{else}} + + {{active.name}} a encaissé + {{/if}} + {{else}} - - Encaisser à {{plusMoins attackerRoll.dmg.total}} - {{#if (eq attackerRoll.dmg.mortalite 'non-mortel')~}}(non-mortel){{/if}} - + {{#if (eq attackerRoll.dmg.mortalite 'empoignade')}} + + + Marquer un point d'empoignade + + {{else}} + + Encaisser à {{plusMoins attackerRoll.dmg.total}} + {{#if (eq attackerRoll.dmg.mortalite 'non-mortel')~}}(non-mortel){{/if}} + + {{/if}} {{/if}} {{/if}} diff --git a/templates/roll/roll-part-attaque.hbs b/templates/roll/roll-part-attaque.hbs index 28b6e7dd..2b1bf3e9 100644 --- a/templates/roll/roll-part-attaque.hbs +++ b/templates/roll/roll-part-attaque.hbs @@ -15,19 +15,32 @@ {{selectOptions refs.tactiques selected=current.tactique.key valueAttr="key" labelAttr="label"}} - - {{#if (eq current.arme.system.mortalite 'empoignade')}} - Empoignade, pas de dommages directs - {{else}} - {{#if (and (ne current.arme.system.mortalite 'non-mortel') (eq current.dmg.penetration 0))}} - - {{/if}} + {{#if (and refs.isEmpoignadeEnCours (eq current.arme.system.competence 'Dague'))}} + + + Pour pouvoir attaquer avec une dague en cours d'empoignade, il faut réussir:
+ DEXTÉRITÉ / Dague à -4 +
En cas d'échec total, {{rollData.active.name}} sera désarmé. +
+
+ {{/if}} + {{#if (eq current.arme.system.mortalite 'empoignade')}} + + Empoignade, pas de dommages directs.
+ Si {{either rollData.opponent.name}} est équipé d'une arme de mêlée, ou attaque + à mains nues (pugilat), il bénéficie d'un bonus de +4 à son attaque. +
+ {{else}} + + {{#if (and (ne current.arme.system.mortalite 'non-mortel') (eq current.dmg.penetration 0))}} + + {{/if}} - {{/if}} - +
+ {{/if}} {{#if rollData.active.effets}} From 755d15509e7b4ecfd214876547dd04e0d12df3f8 Mon Sep 17 00:00:00 2001 From: Vincent Vandemeulebrouck Date: Thu, 23 Oct 2025 18:09:12 +0200 Subject: [PATCH 08/10] =?UTF-8?q?Ajout=20du=20StatusEffect=20surencombr?= =?UTF-8?q?=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/actions/surenc.svg | 65 ++++++++++++++++++++++ changelog.md | 1 + lang/fr.json | 5 +- module/actor-sheet.js | 8 --- module/actor.js | 20 +++---- module/actor/base-actor-reve-sheet.js | 10 ++-- module/actor/base-actor-reve.js | 45 +--------------- module/actor/base-actor-sang.js | 4 +- module/actor/base-actor-sheet.js | 10 +--- module/actor/base-actor.js | 77 +++++++++++++++++++++++---- module/actor/experience-log.js | 2 +- module/constants.js | 1 + module/item-sheet.js | 5 +- module/roll/roll-part-enctotal.mjs | 3 +- module/roll/roll-part-surenc.mjs | 3 +- module/settings/status-effects.js | 12 +++-- templates/actor/carac-main.hbs | 4 +- 17 files changed, 175 insertions(+), 100 deletions(-) create mode 100644 assets/actions/surenc.svg diff --git a/assets/actions/surenc.svg b/assets/actions/surenc.svg new file mode 100644 index 00000000..c9e8313a --- /dev/null +++ b/assets/actions/surenc.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/changelog.md b/changelog.md index 4045f266..82f528ed 100644 --- a/changelog.md +++ b/changelog.md @@ -3,6 +3,7 @@ - Les réussites particulières en demi-surprise sont de simples réussites - Les images des scènes par défaut sont corrigées +- Ajout d'une image de status "sur-encombré" - Amélioration des entités: - l'attaquant ne sait plus que c'est une entité de cauchemar (surprise!) - l'encaissement indique une blessure dans le tchat... même si ce n'est que de l'endurance diff --git a/lang/fr.json b/lang/fr.json index 26e9a883..e44d03db 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -1,6 +1,6 @@ { "TYPES": { - "Actor": { + "Actor": { "personnage": "Personnage", "creature": "Créature", "entite": "Entité de cauchemar", @@ -67,6 +67,7 @@ "StatusComma": "Comma", "StatusDead": "Mort", "StatusDemiReve": "Demi-rêve", + "StatusSurEnc": "Sur-encombrement", "StatusForceWeak": "Force insuffisante" } -} \ No newline at end of file +} diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 6fdbdc07..80d79326 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -375,14 +375,6 @@ export class RdDActorSheet extends RdDBaseActorSangSheet { return position; } - - /* -------------------------------------------- */ - /** @override */ - _updateObject(event, formData) { - // Update the Actor - return this.actor.update(formData); - } - async splitItem(item) { const dialog = await DialogSplitItem.create(item, (item, split) => this._onSplitItem(item, split)); dialog.render(true); diff --git a/module/actor.js b/module/actor.js index 98b67afd..97b6e228 100644 --- a/module/actor.js +++ b/module/actor.js @@ -228,7 +228,7 @@ export class RdDActor extends RdDBaseActorSang { if (arme.system.lancer && arme.system.resistance > 0) { addAttaque(arme, ATTAQUE_TYPE.LANCER) } if (arme.system.tir) { addAttaque(arme, ATTAQUE_TYPE.TIR) } }) - addAttaque(RdDItemArme.pugilat(this), ATTAQUE_TYPE.CORPS_A_CORPS) + addAttaque(RdDItemArme.pugilat(this), ATTAQUE_TYPE.CORPS_A_CORPS) return actions } @@ -755,20 +755,18 @@ export class RdDActor extends RdDBaseActorSang { let updates = {}; if (caracName == LIST_CARAC_PERSONNAGE.reve.code) { if (to > Misc.toInt(this.system.reve.seuil.value)) { - updates[`system.reve.seuil.value`] = to; // SFA : Direct and packed changes - //this.setPointsDeSeuil(to); + updates[`system.reve.seuil.value`] = to } } if (caracName == LIST_CARAC_PERSONNAGE.chance.code) { if (to > Misc.toInt(this.system.compteurs.chance.value)) { - updates[`system.compteurs.chance.value`] = to; // SFA : Direct and packed changes - //this.setPointsDeChance(to); + updates[`system.compteurs.chance.value`] = to } } let selectedCarac = this.findCaracByName(caracName); const from = selectedCarac.value updates[`system.carac.${caracName}.value`] = to; - await this.update(updates); + await this.update(updates, { noHook: true }); await ExperienceLog.add(this, XP_TOPIC.CARAC, from, to, caracName); } @@ -1753,7 +1751,7 @@ export class RdDActor extends RdDBaseActorSang { this.tmrApp?.close(); this.tmrApp = undefined; } - } ], + }], onRollDone: RollDialog.onRollDoneClose, onClose: () => { this.tmrApp?.restoreTMRAfterAction(); @@ -2607,7 +2605,7 @@ export class RdDActor extends RdDBaseActorSang { if (item?.isEquipable()) { const isEquipe = !item.system.equipe; await item.update({ "system.equipe": isEquipe }); - this.computeEncTotal(); + this.computeEncTotal() if (isEquipe) this.verifierForceMin(item); } @@ -2998,6 +2996,7 @@ export class RdDActor extends RdDBaseActorSang { if (updatedEndurance && options.diff) { await this.setEffect(STATUSES.StatusUnconscious, updatedEndurance.value == 0) } + await super.onUpdateActor(update, options, actorId) } /* -------------------------------------------- */ @@ -3039,12 +3038,13 @@ export class RdDActor extends RdDBaseActorSang { await this.onDeleteOwnedCaseTmr(item, options, id) break case ITEM_TYPES.empoignade: + await RdDEmpoignade.deleteLinkedEmpoignade(this.id, item) + // TODO: check remaining emp. await this.setEffect(STATUSES.StatusGrappled, false) await this.setEffect(STATUSES.StatusGrappling, false) - await RdDEmpoignade.deleteLinkedEmpoignade(this.id, item) break } - super.onDeleteItem(item, options, id) + await super.onDeleteItem(item, options, id) } /* -------------------------------------------- */ diff --git a/module/actor/base-actor-reve-sheet.js b/module/actor/base-actor-reve-sheet.js index 9003a3e2..bdccb641 100644 --- a/module/actor/base-actor-reve-sheet.js +++ b/module/actor/base-actor-reve-sheet.js @@ -56,13 +56,15 @@ export class RdDBaseActorReveSheet extends RdDBaseActorSheet { if (this.options.vueDetaillee) { // On carac change this.html.find('.carac-value').change(async event => { - let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", "") - await this.actor.updateCarac(caracName, parseInt(event.target.value)) - }); + if (event.currentTarget.name.includes("carac.")) { + let caracName = event.currentTarget.name.replace("carac.", "") + await this.actor.updateCarac(caracName, parseInt(event.currentTarget.value)) + } + }) // On competence change this.html.find('.competence-value').change(async event => { let compName = event.currentTarget.attributes.compname.value - await this.actor.updateCompetence(compName, parseInt(event.target.value)) + await this.actor.updateCompetence(compName, parseInt(event.currentTarget.value)) }); } } diff --git a/module/actor/base-actor-reve.js b/module/actor/base-actor-reve.js index 92a60e9d..6f3da2ab 100644 --- a/module/actor/base-actor-reve.js +++ b/module/actor/base-actor-reve.js @@ -89,7 +89,6 @@ export class RdDBaseActorReve extends RdDBaseActor { getSConst() { return 0 } /* -------------------------------------------- */ - isSurenc() { return false } computeMalusSurEncombrement() { return 0 } ajustementAstrologique() { return 0 } @@ -126,7 +125,7 @@ export class RdDBaseActorReve extends RdDBaseActor { async remiseANeuf() { } async appliquerAjoutExperience(rollData, hideChatMessage = 'show') { } - computeResumeBlessure() {} + computeResumeBlessure() { } countBlessures(filter = it => !it.isContusion()) { return 0 } async santeIncDec(name, inc, isCritique = false) { } @@ -230,49 +229,9 @@ export class RdDBaseActorReve extends RdDBaseActor { } } - /* -------------------------------------------- */ - isEffectAllowed(effectId) { return false } - - getEffects(filter = e => true, forceRequise = undefined) { - const effects = this.getEmbeddedCollection("ActiveEffect") - const selected = effects.filter(filter) - if (forceRequise && this.isForceInsuffisante(forceRequise)) { - selected.push(StatusEffects.prepareActiveEffect(STATUSES.StatusForceWeak)) - } - return selected - } - - getEffectByStatus(statusId) { - return this.getEffects().find(it => it.statuses.has(statusId)); - } - - async setEffect(statusId, status) { - if (this.isEffectAllowed(statusId)) { - const effect = this.getEffectByStatus(statusId) - if (!status && effect) { - await this.deleteEmbeddedDocuments('ActiveEffect', [effect.id], { render: true }) - } - if (status && !effect) { - await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(statusId)], { render: true }) - } - } - } - - async removeEffect(id) { - this.removeEffects(it => it.id == id) - } - - async removeEffects(filter = e => true) { - if (game.user.isGM) { - const effectsToRemove = this.getEffects(filter); - const ids = effectsToRemove.map(it => it.id); - await this.deleteEmbeddedDocuments('ActiveEffect', ids); - } - } - /* -------------------------------------------- */ isDemiReve() { - return this.getEffectByStatus(STATUSES.StatusDemiReve) != undefined + return this.getEffectsByStatus(STATUSES.StatusDemiReve).length > 0 } getSurprise(isCombat = undefined, forceRequise = undefined) { diff --git a/module/actor/base-actor-sang.js b/module/actor/base-actor-sang.js index 59bdcbb5..69dda7e2 100644 --- a/module/actor/base-actor-sang.js +++ b/module/actor/base-actor-sang.js @@ -186,6 +186,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve { await this.changeBleedingState() break } + await super.onCreateItem(item, options, id) } async onUpdateItem(item, options, id) { @@ -194,6 +195,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve { await this.changeBleedingState() break } + await super.onUpdateItem(item, options, id) } async changeBleedingState() { @@ -313,7 +315,7 @@ export class RdDBaseActorSang extends RdDBaseActorReve { } isSonne() { - return this.getEffectByStatus(STATUSES.StatusStunned) + return this.getEffectsByStatus(STATUSES.StatusStunned).length > 0 } isEffectAllowed(effectId) { return true } diff --git a/module/actor/base-actor-sheet.js b/module/actor/base-actor-sheet.js index 8be9575a..18530449 100644 --- a/module/actor/base-actor-sheet.js +++ b/module/actor/base-actor-sheet.js @@ -49,7 +49,7 @@ export class RdDBaseActorSheet extends foundry.appv1.sheets.ActorSheet { formData.calc = { fortune: Monnaie.toSolsDeniers(this.actor.getFortune()), prixTotalEquipement: this.actor.computePrixTotalEquipement(), - encTotal: await this.actor.computeEncTotal(), + encTotal: this.actor.getEncTotal(), } this.objetVersConteneur = RdDUtility.buildArbreDeConteneurs(formData.conteneurs, formData.inventaires); @@ -229,14 +229,6 @@ export class RdDBaseActorSheet extends foundry.appv1.sheets.ActorSheet { return position; } - - /* -------------------------------------------- */ - /** @override */ - _updateObject(event, formData) { - // Update the Actor - return this.actor.update(formData); - } - async splitItem(item) { const dialog = await DialogSplitItem.create(item, (item, split) => this._onSplitItem(item, split)); dialog.render(true); diff --git a/module/actor/base-actor.js b/module/actor/base-actor.js index 8c0c9b2a..37c49a23 100644 --- a/module/actor/base-actor.js +++ b/module/actor/base-actor.js @@ -10,7 +10,7 @@ import { RdDConfirm } from "../rdd-confirm.js"; import { RdDUtility } from "../rdd-utility.js"; import { SystemCompendiums } from "../settings/system-compendiums.js"; import { RdDItem } from "../item.js"; -import { STATUSES } from "../settings/status-effects.js"; +import { StatusEffects, STATUSES } from "../settings/status-effects.js"; export class RdDBaseActor extends Actor { @@ -243,18 +243,68 @@ export class RdDBaseActor extends Actor { getMonnaie(id) { return this.findItemLike(id, 'monnaie'); } getEncombrementMax() { return 0 } + isSurenc() { return false } + + /* -------------------------------------------- */ + isEffectAllowed(effectId) { return false } + + getEffects(filter = e => true, forceRequise = undefined) { + const effects = this.getEmbeddedCollection("ActiveEffect") + const selected = effects.filter(filter) + if (forceRequise && this.isForceInsuffisante(forceRequise)) { + selected.push(StatusEffects.prepareActiveEffect(STATUSES.StatusForceWeak)) + } + return selected + } + + getEffectsByStatus(effectId) { + return this.getEffects().filter(it => it.statuses.has(effectId)) + } + + async setEffect(effectId, status) { + if (this.isEffectAllowed(effectId)) { + const effects = this.getEffectsByStatus(effectId) + if (!status && effects.length > 0) { + await this.deleteEmbeddedDocuments('ActiveEffect', effects.map(it => it.id), { render: true }) + } + if (status && effects.length == 0) { + await this.createEmbeddedDocuments("ActiveEffect", [StatusEffects.prepareActiveEffect(effectId)], { render: true }) + } + } + } + + async removeEffect(id) { + this.removeEffects(it => it.id == id) + } + + async removeEffects(filter = e => true) { + if (game.user.isGM) { + const effectsToRemove = this.getEffects(filter); + const ids = effectsToRemove.map(it => it.id); + await this.deleteEmbeddedDocuments('ActiveEffect', ids); + } + } /* -------------------------------------------- */ async updateCarac(caracName, to) { } + + async onUpdateActor(change, options, actorId) { + const updatedCarac = change?.system?.carac + if (updatedCarac && (updatedCarac.force || updatedCarac.reve || updatedCarac.taille)) { + console.log(' onUpdateActor', change, options, actorId) + await this.setEffect(STATUSES.StatusSurEnc, this.isSurenc()) + } + } + /* -------------------------------------------- */ async onPreUpdateItem(item, change, options, id) { } - async onCreateItem(item, options, id) { } + async onCreateItem(item, options, id) { + } - async onUpdateItem(item, options, id) { } - - async onUpdateActor(update, options, actorId) { } + async onUpdateItem(item, options, id) { + } async onDeleteItem(item, options, id) { if (item.isInventaire()) { @@ -262,6 +312,7 @@ export class RdDBaseActor extends Actor { } } + async _removeItemFromConteneur(item) { const updates = this.items.filter(it => it.isConteneur() && it.system.contenu.includes(item.id)) .map(conteneur => { @@ -510,16 +561,22 @@ export class RdDBaseActor extends Actor { /* -------------------------------------------- */ async computeEncTotal() { - if (!this.pack) { + if (this.pack) { + this.encTotal = 0 + } + else { + const wasSurenc = this.isSurenc() this.encTotal = this.items.filter(it => RdDItem.getItemTypesInventaire().includes(it.type)) .map(it => it.getEncTotal()).reduce(Misc.sum(), 0) - return this.encTotal; + const isSurenc = this.isSurenc() + if (isSurenc != wasSurenc) { + await this.setEffect(STATUSES.StatusSurEnc, isSurenc) + } } - return 0; } getEncTotal() { - return Math.floor(this.encTotal ?? 0); + return Math.floor(this.encTotal ?? 0) } async createItem(type, name = undefined) { @@ -570,7 +627,7 @@ export class RdDBaseActor extends Actor { } } } - await this.computeEncTotal(); + await this.computeEncTotal() return result; } diff --git a/module/actor/experience-log.js b/module/actor/experience-log.js index ad282e78..1e7e9ce0 100644 --- a/module/actor/experience-log.js +++ b/module/actor/experience-log.js @@ -29,7 +29,7 @@ export class ExperienceLog { }; console.log('ExperienceLog.add', newXpLog) const newExperienceLog = (actor.system.experiencelog ?? []).concat([newXpLog]); - await actor.update({ [`system.experiencelog`]: newExperienceLog }); + await actor.update({ [`system.experiencelog`]: newExperienceLog }, { noHook: true }); } static labelTopic(topic) { diff --git a/module/constants.js b/module/constants.js index fbd60dc0..cf8a91f1 100644 --- a/module/constants.js +++ b/module/constants.js @@ -62,6 +62,7 @@ export const RDD_CONFIG = { demiReve: 'systems/foundryvtt-reve-de-dragon/assets/actions/sort.svg', empoignade: 'systems/foundryvtt-reve-de-dragon/assets/actions/empoignade.svg', forceWeak: 'systems/foundryvtt-reve-de-dragon/assets/actions/weak.svg', + surenc: 'systems/foundryvtt-reve-de-dragon/assets/actions/surenc.svg', }, encaissement: { mortel: 'mortel', diff --git a/module/item-sheet.js b/module/item-sheet.js index 0e441d31..5b3cc994 100644 --- a/module/item-sheet.js +++ b/module/item-sheet.js @@ -260,7 +260,7 @@ export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet { /* -------------------------------------------- */ /** @override */ - _updateObject(event, formData) { + async _updateObject(event, formData) { switch (this.item.type) { case ITEM_TYPES.sort: formData['system.bonuscase'] = RdDItemSort.bonuscasesToString(RdDItemSheetV1._listCaseTmr( @@ -273,8 +273,7 @@ export class RdDItemSheetV1 extends foundry.appv1.sheets.ItemSheet { formData['system.niveau'] = formData['system.niveau'] ?? formData['system.base'] break } - - return this.item.update(formData) + return await super._updateObject(event, formData) } /* -------------------------------------------- */ diff --git a/module/roll/roll-part-enctotal.mjs b/module/roll/roll-part-enctotal.mjs index 5595b58a..4be5366e 100644 --- a/module/roll/roll-part-enctotal.mjs +++ b/module/roll/roll-part-enctotal.mjs @@ -1,3 +1,4 @@ +import { RDD_CONFIG } from "../constants.js" import { RdDItemCompetence } from "../item-competence.js" import { RdDCarac } from "../rdd-carac.js" import { RollPartCheckbox } from "./roll-part-checkbox.mjs" @@ -25,7 +26,7 @@ export class RollPartEncTotal extends RollPartCheckbox { }) } - getCheckboxIcon(rollData) { return '' } + getCheckboxIcon(rollData) { return `` } getCheckboxLabel(rollData) { return "Enc. total" } getCheckboxValue(rollData) { return - rollData.active.actor.getEncTotal() } } diff --git a/module/roll/roll-part-surenc.mjs b/module/roll/roll-part-surenc.mjs index 89abc579..c5be7cd8 100644 --- a/module/roll/roll-part-surenc.mjs +++ b/module/roll/roll-part-surenc.mjs @@ -1,3 +1,4 @@ +import { RDD_CONFIG } from "../constants.js" import { RdDCarac } from "../rdd-carac.js" import { RollPartCheckbox } from "./roll-part-checkbox.mjs" @@ -10,7 +11,7 @@ export class RollPartSurEnc extends RollPartCheckbox { visible(rollData) { return RdDCarac.isActionPhysique(rollData.current.carac.key) && rollData.active.actor.isSurenc() } - getCheckboxIcon(rollData) { return '' } + getCheckboxIcon(rollData) { return `` } getCheckboxLabel(rollData) { return "Sur-enc." } getCheckboxValue(rollData) { return rollData.active.actor.computeMalusSurEncombrement() } } diff --git a/module/settings/status-effects.js b/module/settings/status-effects.js index 43ce4a20..06e349e4 100644 --- a/module/settings/status-effects.js +++ b/module/settings/status-effects.js @@ -14,13 +14,14 @@ export const STATUSES = { StatusBleeding: 'bleeding', StatusDead: 'dead', StatusDemiReve: 'demi-reve', + StatusSurEnc: 'sur-encombrement', StatusForceWeak: 'force insuffisante', } export const forceWeakStatusEffect = { rdd: true, id: STATUSES.StatusForceWeak, name: 'EFFECT.StatusForceWeak', img: RDD_CONFIG.icons.forceWeak }; -export const demiReveStatusEffect = { - rdd: true, id: STATUSES.StatusDemiReve, name: 'EFFECT.StatusDemiReve', img: RDD_CONFIG.icons.demiReve -}; +export const surEncEffect = { rdd: true, id: STATUSES.StatusSurEnc, name: 'EFFECT.StatusSurEnc', img: RDD_CONFIG.icons.surenc }; +export const demiReveStatusEffect = { rdd: true, id: STATUSES.StatusDemiReve, name: 'EFFECT.StatusDemiReve', img: RDD_CONFIG.icons.demiReve }; + const rddStatusEffects = [ { rdd: true, id: STATUSES.StatusGrappling, name: 'EFFECT.StatusGrappling', img: RDD_CONFIG.icons.empoignade }, { rdd: true, id: STATUSES.StatusGrappled, tint: '#d5633d', name: 'EFFECT.StatusGrappled', img: RDD_CONFIG.icons.empoignade }, @@ -36,7 +37,8 @@ const rddStatusEffects = [ { rdd: true, id: STATUSES.StatusBleeding, name: 'EFFECT.StatusBleeding', img: 'icons/svg/blood.svg' }, { rdd: true, id: STATUSES.StatusDead, name: 'EFFECT.StatusDead', img: 'icons/svg/skull.svg' }, demiReveStatusEffect, - forceWeakStatusEffect + forceWeakStatusEffect, + surEncEffect, ]; const statusDemiSurprise = new Set([STATUSES.StatusStunned, STATUSES.StatusProne, STATUSES.StatusRestrained, STATUSES.StatusForceWeak]) @@ -136,7 +138,7 @@ export class StatusEffects extends FormApplication { } static prepareActiveEffect(effectId) { - let status = rddStatusEffects.find(it => it.id == effectId) + let status = rddStatusEffects.find(it => it.statuses.has(effectId)) if (status) { status = foundry.utils.duplicate(status) status.statuses = new Set([effectId]) diff --git a/templates/actor/carac-main.hbs b/templates/actor/carac-main.hbs index 5b26ef21..ac09cffb 100644 --- a/templates/actor/carac-main.hbs +++ b/templates/actor/carac-main.hbs @@ -4,7 +4,7 @@
  • {{#if (eq key 'taille')}} {{carac.label}} - +