From f525b6c07afcb41f970341f6cef47f35f3d9b15e Mon Sep 17 00:00:00 2001 From: LeRatierBretonnien Date: Wed, 7 Jan 2026 15:04:49 +0100 Subject: [PATCH] Ajout de la commande /voyage et grosse MAJK de la commande /auberge --- module.json | 5 +- modules/addon-register.js | 51 +- modules/inn/InnRoller.js | 410 + modules/inn/README.md | 148 + modules/inn/inn-init.js | 93 + modules/travelv2/TravelDistanceV2.js | 339 + modules/travelv2/debug-display.js | 30 + modules/travelv2/diagnostic.js | 69 + modules/travelv2/index.js | 8 + modules/travelv2/pathfinding.js | 218 + modules/travelv2/test.js | 53 + modules/travelv2/travel_data.json | 2745 +++++++ modules/travelv2/travelv2-init.js | 67 + .../{001233.log => 001249.log} | 0 packs/aides-de-jeu-fr/CURRENT | 2 +- packs/aides-de-jeu-fr/LOG | 14 +- packs/aides-de-jeu-fr/LOG.old | 14 +- .../{MANIFEST-001231 => MANIFEST-001247} | Bin 226 -> 226 bytes .../{001235.log => 001251.log} | 0 packs/antidotes-and-remedes/CURRENT | 2 +- packs/antidotes-and-remedes/LOG | 14 +- packs/antidotes-and-remedes/LOG.old | 14 +- .../{MANIFEST-001233 => MANIFEST-001249} | Bin 178 -> 178 bytes packs/apothicarium/{001233.log => 001249.log} | 0 packs/apothicarium/CURRENT | 2 +- packs/apothicarium/LOG | 14 +- packs/apothicarium/LOG.old | 14 +- .../{MANIFEST-001231 => MANIFEST-001247} | Bin 226 -> 226 bytes packs/dons-de-rhya/{001233.log => 001249.log} | 0 packs/dons-de-rhya/CURRENT | 2 +- packs/dons-de-rhya/LOG | 14 +- packs/dons-de-rhya/LOG.old | 14 +- .../{MANIFEST-001231 => MANIFEST-001247} | Bin 226 -> 226 bytes .../{001233.log => 001249.log} | 0 packs/plats-dauberges/CURRENT | 2 +- packs/plats-dauberges/LOG | 14 +- packs/plats-dauberges/LOG.old | 14 +- .../{MANIFEST-001231 => MANIFEST-001247} | Bin 229 -> 229 bytes .../{000876.log => 000892.log} | 0 packs/tables-des-traductions/CURRENT | 2 +- packs/tables-des-traductions/LOG | 14 +- packs/tables-des-traductions/LOG.old | 14 +- .../{MANIFEST-000874 => MANIFEST-000890} | Bin 226 -> 226 bytes patch-styles.css | 312 +- scripts/01VFjGVxkjb5P1ve.js | 2 +- scripts/03mJu59V4iByWlsO.js | 22 +- scripts/07tvKnPT8ICtv2us.js | 3 + scripts/0BP5l7bIkf744G1k.js | 2 +- scripts/0FNOq4J1AdPd2A0q.js | 1 - scripts/0FWto1oEr3jbWggw.js | 8 +- scripts/0H2syk6qc0sCY0pj.js | 4 + scripts/0IAc5VFR2ogXOaGE.js | 1 + scripts/0NAD1LNcVyAZ1fC7.js | 1 + scripts/0PzfGjGhHQbxEwlb.js | 1 + scripts/0R0QAr3D024kWPfo.js | 8 +- scripts/0Uly7OmkH0zqYbxQ.js | 6 +- scripts/0YKQGbsKdHSmYGE7.js | 9 - scripts/0abwNjpzo3SbEOeO.js | 4 +- scripts/0amHqfjTRp5ff6Op.js | 3 + scripts/0hAbiNR1nFkpFMRz.js | 1 + scripts/0hgTyeaEhMBLwzUn.js | 5 + scripts/0jTqyz0wRlK6XPF7.js | 2 +- scripts/0kUalAsb4OhtYbaJ.js | 1 + scripts/0mrUnxzufYgsR0Ph.js | 7 - scripts/0uUxvBLJC76WIIBC.js | 3 + scripts/0wR0LWpfhLFA240I.js | 7 + scripts/0wmIC2MssUX6LW3N.js | 4 + scripts/0yyofYHeDRQlFliO.js | 2 +- scripts/11uCC0mK2uL783al.js | 2 +- scripts/18MeEQ0As3JvER71.js | 4 +- scripts/190PHSHKGaJ74wsR.js | 26 +- scripts/1A87vGLh2PXH0rG0.js | 1 - scripts/1BT0MWM2cbhlEnrn.js | 13 +- scripts/1CeYp5MlPcH68UIw.js | 28 +- scripts/1Du4e27M8WgP2iui.js | 10 + scripts/1JwxZujbDcueLWBL.js | 2 +- scripts/1LDSzXeO5CzXgTOc.js | 1 - scripts/1OpT3CXs07XFWWCT.js | 2 +- scripts/1PPh4vHd5sPKtudZ.js | 1 + scripts/1UvL0XA1EpQtjDNn.js | 8 + scripts/1ZArMNUI8qqH6zkX.js | 7 +- scripts/1exiWlVUHsXDLLAH.js | 2 +- scripts/1fQr1Dg7DX0vfz3r.js | 2 +- scripts/1jQq9v8fXK8zuEBU.js | 6 +- scripts/1kB2su7hLRYDhZ2H.js | 19 - scripts/1l7Jz2ZHbAWko7Vm.js | 2 +- scripts/1mNkLj9JYNr3ofC6.js | 7 - scripts/1wKVvxRTHOyV4Qdv.js | 1 - scripts/1wrPvP6lJwIAfmsl.js | 2 +- scripts/1yOvw74jzFfaI87b.js | 2 +- scripts/20fvE9nJmcfGYVzw.js | 8 + scripts/22PMOW0G5MWiBQmg.js | 4 + scripts/22bW97lkvCqisfHX.js | 1 - scripts/23HgjCB1oecxANvA.js | 5 - scripts/23vWiHUjxtRQ3Efz.js | 2 +- scripts/2AOo7KUyzMrgIlgM.js | 2 +- scripts/2AdSBXw7IwCiqawQ.js | 1 - scripts/2EAYX5G9Fh3HJwiP.js | 6 + ...TBVDHUndI3qDOXM.js => 2Ej6LUqn8frTRURo.js} | 4 +- scripts/2IPTF0akWw9y48br.js | 3 + scripts/2NLINicPQWbuvp2n.js | 1 - scripts/2QB0LjueuJcIaHaC.js | 2 +- scripts/2Qi1hwLYhdE6v6Hs.js | 2 +- scripts/2S6XlGCdRlXuaaVw.js | 1 + scripts/2VNnVrtktdGUqXEV.js | 9 - scripts/2W9uMTT6iJhfQ044.js | 19 - scripts/2WSN306tL4apjRtD.js | 4 - scripts/2XXqxAF5s5Sws6qj.js | 1 + scripts/2XaJNYUMQAmSOsqi.js | 9 + scripts/2Yh4vQm0ZJukRH1x.js | 1 + scripts/2cKarG9ToyW2ptCd.js | 2 +- scripts/2hzDv8ROulOe1elK.js | 1 - scripts/2kRwCc31fuZgrsy8.js | 1 + scripts/2rzxQlL7A9ujZ9uK.js | 2 +- scripts/2sDH6RvoOAR40oqH.js | 20 - scripts/2uyajbon5QX1CewS.js | 1 + scripts/2vTVR0quRZQtjNfQ.js | 18 - scripts/2yW0kuwLfgRzJR2S.js | 2 + scripts/2yctEihGmdCfTTVx.js | 4 +- scripts/2zeP2nMSURjxrqYz.js | 4 +- scripts/33US8YRgaMqYu2We.js | 2 +- scripts/37UN17gb8suFeZIW.js | 2 +- scripts/3CeKfDcMEVgQlcXm.js | 1 + scripts/3D5ImpMgpOTPucvv.js | 2 +- scripts/3IGO7xEjRjat937X.js | 2 +- scripts/3JEzEzF1SeYA9lsV.js | 44 - scripts/3KH6OE7L7uJESI2Z.js | 5 + scripts/3SuLF6SImYWEHMo2.js | 1 + scripts/3eSaX0BeaUalNkEP.js | 2 +- scripts/3hfMQkUKYI4rCuBy.js | 1 - scripts/3ixqbsEMfSSTzAXU.js | 12 + scripts/3j8yybMaAZSwzxIE.js | 21 + scripts/3jm0NoYpgB6ZuUSl.js | 2 +- scripts/3l7MQSa10Kve2K3P.js | 2 +- scripts/3na3lnAt3bfysvcD.js | 3 + scripts/3plV9WFqs2prfAdp.js | 1 - scripts/3sfD1nedXLzuYoXJ.js | 4 - scripts/42UATqzohYML6a9t.js | 3 + scripts/454x3Q95pLvZm0Kx.js | 1 - scripts/4AO7Fowek5sSmE4g.js | 14 + scripts/4FGKZk2f0xrmIDnp.js | 1 - scripts/4KYraZSHAEYmL6xx.js | 4 + scripts/4MQ7u4INxp51oyyR.js | 16 +- scripts/4OlwxU60UqKg81yb.js | 2 +- scripts/4Q3Mp04O2sMgKv9x.js | 1 + scripts/4ZR7p8G3OzOBWx0L.js | 1 - scripts/4fnTKgl0HW9ZrWyJ.js | 10 - scripts/4iu3CmOI19soOYuA.js | 50 + scripts/4iuTz0uInAfMaoGl.js | 1 - scripts/4jLe2XZQVUB8LztP.js | 1 + scripts/4pQW4WLyhjbZR85k.js | 7 - scripts/4rTmV3TNxctUe0ly.js | 6 +- scripts/4rb7LfMq9CTnlrpn.js | 10 - scripts/4ylzjgUdHY5D0yVh.js | 30 +- scripts/52mwb33mGrQjq89B.js | 1 - scripts/55eYGvSXetDMK80S.js | 2 + scripts/58rFc9HiBoX66J6p.js | 4 +- scripts/5DI6cHAg1LHo54Yv.js | 5 +- scripts/5Fe1ELaS6Gnvy0Cj.js | 1 - scripts/5GHQxfxlmjyt1fNq.js | 4 + scripts/5GP9UJMvBZv6kWtI.js | 27 + scripts/5JWC0l3JEpOsqbR9.js | 12 +- scripts/5JvKJZPcd6Hz5zvn.js | 14 +- scripts/5KIozV7HxyGvskeD.js | 1 + scripts/5KVslRqhqzuFLyk4.js | 3 + scripts/5M6IgCUncCwyxHok.js | 8 +- scripts/5MxRDXzUBPfp2KKD.js | 2 +- scripts/5ScjIdRUOxblHdWS.js | 10 +- scripts/5XAYjiq1i4M7Ky7j.js | 49 + scripts/5dR7Erj3nwsxLAV7.js | 16 +- scripts/5gPAT5Bb2FvQwYNQ.js | 2 + scripts/5lpR78CLhYH6Mjnu.js | 3 + scripts/5o1XiceC4rutjMms.js | 1 - scripts/5sI9iYh5j2nx2XyT.js | 1 - scripts/5uokSqQsjgMapnCi.js | 9 + scripts/5z5nGwZC5RIwokev.js | 1 + scripts/6136BMmiGLwZ16H1.js | 1 + scripts/62Ky6bC1EnTllSJA.js | 2 +- scripts/64aJznxPMUHAuf7F.js | 17 + scripts/65xE9OV5sA1ZWT7j.js | 2 +- scripts/6A6ddQDJo23oOWtK.js | 3 + scripts/6Aqq4F4Xui923sc6.js | 14 +- scripts/6AsCMHZ4IYPq7Uxf.js | 1 + scripts/6BmvV9c03FkfisnE.js | 16 +- scripts/6H6vNjzvMGl2ZqCR.js | 2 +- scripts/6HfCvw24X6oEe2vn.js | 4 + scripts/6JrUjs3g5x6bFnj3.js | 8 - scripts/6LMzIdmCSYctgmGx.js | 5 + scripts/6P2QNPKfwQ1xwxZT.js | 1 + scripts/6QZUX7ZrFxOzqI0b.js | 2 +- scripts/6V3qHON3mcerlBlB.js | 6 - scripts/6Ws3ieQ7pG5poUyT.js | 2 +- scripts/6ZS1rQLkNvMDO0Fp.js | 11 - scripts/6elUNF58TaiYjxcx.js | 6 +- scripts/6fElmBxTjdAaubbK.js | 6 - scripts/6frithfMs7Nbv0IZ.js | 1 + scripts/6jcTzK1XEuWqAacN.js | 2 +- scripts/6jp8slPU33oBQe1V.js | 2 +- scripts/6kifXp2jXEaQVJsg.js | 20 +- scripts/6maNAmREdataXmo4.js | 5 + scripts/6mpw9cGseG4W4eyd.js | 6 +- scripts/6nA5LPXneAahHX2W.js | 7 + scripts/6oSs8qKFNFz2lSmh.js | 2 +- scripts/6qJP0hpShEM43ohx.js | 12 +- scripts/6qUKKep5vhFYmo1J.js | 1 - scripts/6tjn0RH4VyOPFneS.js | 1 - scripts/6uldpFvKOCoW92cC.js | 4 +- scripts/6xTtJEhRc4OjcDTf.js | 4 +- scripts/713v1T8HNste94pr.js | 1 + scripts/715G1Bf0haOHvmYQ.js | 1 - scripts/7Ck0fkzE4WQ62qVe.js | 4 - scripts/7F6aGxZJjwxm5e5P.js | 10 +- scripts/7H6wYyJ6cpaoc2QQ.js | 1 - scripts/7JW9t8AYSDkkzG2V.js | 20 +- scripts/7T3iXgrL72fea67C.js | 22 + scripts/7UUS0gX2Pbi0HHiz.js | 1 + scripts/7VAhXHov6pR1SkgD.js | 1 - scripts/7WR2hJjHPhHhHxAq.js | 6 +- scripts/7ZoFUMDG2WJd8RMg.js | 2 +- scripts/7e8FgQUF2oANANmx.js | 1 - scripts/7f6OsttTzE7Hvzfk.js | 10 +- scripts/7n3SEAGRA5ESK8gV.js | 2 +- scripts/7szLG4VALuuy1cPm.js | 6 - scripts/7w7QA7GBhzZ98OS0.js | 12 +- scripts/7wBWUw05q0igh508.js | 18 +- scripts/7y89OcMmGbjRMgTg.js | 5 + scripts/84IB8CWa55XzoAkv.js | 1 - scripts/86ivOsBQAuu0UmFg.js | 6 - scripts/873KaarAnJ2qf1r2.js | 1 + scripts/8BCzpjFU0GeA17Wp.js | 1 + scripts/8ByuHnUZ4RNTdGVv.js | 16 - scripts/8GyJgdHVBaLrHCY8.js | 6 +- scripts/8N3Uqjq1ZxPxo4pk.js | 1 - scripts/8R7O63iC0yANtkJ9.js | 5 + scripts/8RNziYGGb4sp3BGQ.js | 5 - scripts/8TRiAJ8thIKE4IoL.js | 2 +- scripts/8ZAUBSH9CM9OTpTL.js | 11 - scripts/8araLuwmBq8GKEw3.js | 2 +- scripts/8pbVGsVFlDebu2Ac.js | 1 + scripts/8qOGotfGFA0HYQ6W.js | 7 + scripts/8rq4GL5d5nCn4kO7.js | 2 +- scripts/8tyMXDfHR8AJBdDu.js | 2 +- scripts/8xqYrBIf1Zhlwizg.js | 4 +- scripts/8zTkDVziBPaNbMQX.js | 4 +- scripts/96Y1yIH1lRjTs5hL.js | 9 +- scripts/98nKfcimlaPeM9h5.js | 2 +- scripts/9A7rYY3FKi5XLihG.js | 2 +- scripts/9AMoFRATTAfdKlKN.js | 16 + scripts/9EVj4bmZJex45Mt7.js | 1 - scripts/9JnPK1jNUEso7Pv8.js | 4 - scripts/9RFoasDcFnYZ1txR.js | 1 - scripts/9VfeubiCV83LN9iY.js | 2 +- scripts/9WZa63lr0K3SsP4G.js | 2 +- scripts/9Yn9uViEjcuaESJ2.js | 2 +- scripts/9eL5JbQQmCY030ba.js | 1 + scripts/9fK07tqqZyPg7dpx.js | 12 - scripts/9fNHye2N2DORR0A3.js | 1 + scripts/A0OK0qAMmnf8iNJf.js | 4 +- scripts/A1odAcuRbq9797ZB.js | 34 +- scripts/A3XrFB7SvV2vcg1a.js | 4 + scripts/A3fvV69RS1lYgma0.js | 15 - scripts/A6DcKPzAGntzSCil.js | 4 +- scripts/ACgKpKrEEHoNGG0h.js | 1 - scripts/ACtDCTLZXmd5uXjX.js | 4 +- scripts/AGD7zCyV4zruvnWu.js | 2 +- scripts/AHZ8f7dfN8jNsYk6.js | 22 - scripts/AI7iVbQMPzXMP5on.js | 11 + scripts/ALuPRzf85dmkEfLo.js | 1 - scripts/AMI2wDJqsIZsoq1e.js | 2 +- scripts/AMxezwtYnWCF6Oza.js | 1 - scripts/AV2Kj6jgmIc45zKi.js | 1 - scripts/AYEiCx2Es3QtMY28.js | 55 + scripts/Adgs6Zs0FdefO6qx.js | 2 +- scripts/Ah2wyywkL8hjJNXM.js | 2 +- scripts/ApaLcUhuty3EzJoP.js | 2 +- scripts/AqHLHp4kH6KULk3e.js | 4 +- scripts/AvRbjpBfTX3mn3bz.js | 11 + scripts/AyNb5sj6FD2Z3Q5T.js | 2 +- scripts/B6ZbY3bxTPg6nCng.js | 1 - scripts/B950b0XnIUYCdVwu.js | 11 - scripts/BAOv7moTxsKlT3JS.js | 6 - scripts/BD7bVTU2pVoRSRBe.js | 11 +- scripts/BEEvU2hE5ymcNOH9.js | 6 + scripts/BHbFqhJPzZI2txLs.js | 5 +- scripts/BNJRV66jlrp51qZK.js | 2 - scripts/BVNKF9omCppWPLys.js | 24 +- scripts/BY4feKp244bQOWlB.js | 1 + scripts/Bj6bxItlgtI2sXVN.js | 2 +- scripts/BtyFhdGMKiMamGhM.js | 15 - scripts/Bu0KUpGvfmFF7LJs.js | 15 + scripts/Bv3431tnG3VKaTJr.js | 2 +- scripts/C5NIkJwXL85Qbpe7.js | 1 + scripts/CCK1iIfPmB398ziT.js | 2 - scripts/CHnaBPHk6HdFS512.js | 2 +- scripts/CIxZYkHggBQ6EsHP.js | 2 +- scripts/CS6O7UUjQcUJoOUP.js | 19 +- scripts/CUBpU1imu2eRS06C.js | 5 + scripts/CW5Vlr57OaMkKJ8Q.js | 4 +- scripts/CWNGrg7se91RC95g.js | 10 +- scripts/CbfUDhUr5R4UnPPq.js | 5 + scripts/CcR9i3UzUXx7ieep.js | 1 + scripts/CiFeduksZJ6PRulx.js | 1 - scripts/Cjj4iLkdY1NaZRCi.js | 21 +- scripts/CkE8NZOhzPkuRrKJ.js | 14 - scripts/ClkT2WG2UjVwQ97T.js | 4 +- scripts/Cri5Q7ux6ni7zNVS.js | 7 + scripts/CxsKWGwQqtAaQdzX.js | 1 + scripts/CynUM4ZEiB9QbNQq.js | 3 + scripts/DHxUKY9LMyifFgCi.js | 2 +- scripts/DTiHS6RfwhF4THbf.js | 1 - scripts/DUFSlDO38fQWclBE.js | 6 + scripts/DVlZGbiuMIHEQOnM.js | 2 +- scripts/DhZqJso1JWYtGrKk.js | 2 +- scripts/Dk4VF4UXSMK5SaVP.js | 2 + scripts/DmbWR9s5I8LHBwxB.js | 2 +- scripts/DsE6rTSzxEn6uWMz.js | 7 - scripts/DuM5l2Yb4bdvDeaG.js | 1 - scripts/DvJvHsjgkzIfFaks.js | 3 + scripts/DxM3NRgQYc7moMPc.js | 1 + scripts/DxQnamsb2AuW0p2e.js | 1 - scripts/Dy67jQmeGwHwV9NY.js | 1 + scripts/E0HHBSdQR3oH8KaL.js | 7 + scripts/E1vUepgop09FF5wy.js | 8 +- scripts/E33J9JixYVGxaktQ.js | 3 + scripts/E3om295BMQojnM2F.js | 2 +- scripts/E4CHDe1xfmcV3oGv.js | 1 - scripts/E6DMqfDeczqmVMFV.js | 3 - scripts/E7D4bxz8gy4e1wL7.js | 1 - scripts/E7ksDLhihkJN4Vpt.js | 1 + scripts/EBNrA6FNX4d05EUx.js | 2 +- scripts/EC8cZmqrE095cDc2.js | 18 +- scripts/ECUIJLcKt2TCSFS3.js | 1 + scripts/EDAMEOzdBfkoKHxP.js | 1 - scripts/EGWF3LHav3e2zFL4.js | 1 - scripts/EHfOyVwYhFGWNjw1.js | 6 + scripts/EJObiSth3WdcJOXN.js | 4 +- scripts/EJaBfqADqlo92Fx6.js | 2 +- scripts/ENGmwaItRXO5s0XY.js | 2 +- scripts/EQ5dtGW5kQhtAb87.js | 7 - scripts/ERxrWzSpw8qwxFVi.js | 2 +- scripts/ETfmit2Cx0Py77ai.js | 48 + scripts/ETrfkHI0B9YjJqM2.js | 1 + scripts/EU5j0hnDTG9Z6d1e.js | 6 - scripts/EVBSHEC5nmmj2X41.js | 1 - scripts/EdTChmSouS0MSmk5.js | 12 +- scripts/ElHBPMMx37SZMvOC.js | 2 + scripts/EmXwcuycEH8slEn5.js | 6 - scripts/EmmG49pMOPHRwDzR.js | 8 - scripts/EsZx8cY34quYG4MQ.js | 5 + scripts/Ew3C2WmLCtc1KT46.js | 1 - scripts/F2u4L4o0r1LTWeWK.js | 2 +- scripts/F7BHb4a7fqWMnYxH.js | 1 + scripts/F7E0Dr3sT7kkc2p7.js | 1 + scripts/F8Bmh6w01YvKsBIO.js | 6 + scripts/FGIHAkNdYXbTnewG.js | 6 + scripts/FKEH7DeqU0FH4dkk.js | 7 + scripts/FMA16PvoObBV8vDl.js | 2 +- scripts/FPQp6XfbUH1BMafj.js | 7 + scripts/FPYNcxm21678boLT.js | 8 +- scripts/FSqUqSByMiztYOQM.js | 2 +- scripts/FXuyiJoXdAh6WhRK.js | 1 - scripts/FYUPfYyTYZkxRLFT.js | 1 - scripts/FZFOC7bip0oiWEzk.js | 2 +- scripts/FbfJjYUyp0ArtZMb.js | 1 + scripts/FiD3mvWIBHNNIuO9.js | 2 +- scripts/FkTwk8hfHpRLbAp2.js | 6 - scripts/FmLx9pwOkzqqU7Ph.js | 1 - scripts/FqevMs0ukQ9WuUHl.js | 2 +- scripts/FtZf56VI6Qsspu0D.js | 10 +- scripts/FttdVBQiNssDAARh.js | 1 + scripts/Fu8DTvSgLufcB5mr.js | 44 + scripts/Fvlc4RkeF4dHjW3m.js | 16 - scripts/G7sFEnJlXZvfXL3V.js | 4 +- scripts/G9ZPojp8qdjiXKZ5.js | 3 + scripts/GNgMG95jfabBeIwy.js | 4 + scripts/GOq4TcnWbfyfCo2V.js | 26 - scripts/GRfCxtYzmEx2LYU7.js | 4 +- scripts/GTZUO73pUJKpM1JB.js | 4 +- scripts/GYhPhHIVrhx4pkgF.js | 4 + scripts/GZFsuynUhgZqwTGo.js | 10 - scripts/GbPEy22VuCNzlNv2.js | 1 - scripts/Gc8S5TYlVdV8NnOT.js | 8 - scripts/GePFbu5kp2ymGYEQ.js | 1 + scripts/GjUD5L4h8FXGVgGQ.js | 1 + scripts/GjkxWj9wCAclM9WA.js | 4 +- scripts/GsAyB5xnK3ASeoah.js | 10 +- scripts/Gsilp71BmIyHHce6.js | 1 + scripts/GtfHQA9T1ip463le.js | 1 + scripts/GuSIY4Zqhc68qVEH.js | 6 + scripts/GzSFlqL1YrIK1dxh.js | 3 +- scripts/GzsuEg7gZy1f0ljy.js | 8 +- scripts/H06Ysj7oPiemW7S6.js | 2 +- scripts/H2CJvApKMnfGNNoo.js | 7 - scripts/H3pZ9UeIzIz3luKh.js | 2 +- scripts/H85k4L3yICm7cfIk.js | 10 +- scripts/H8jDtK1Ewn4hL3A1.js | 1 + scripts/HASsi6wYHVALExWq.js | 14 - scripts/HG2fKOfruT5QV3A4.js | 6 +- scripts/HJ2X4ZtXei0BXbxf.js | 4 +- scripts/HKhyn0kijKfzW6cw.js | 3 - scripts/HMC6hPND9DWLFfZE.js | 43 - scripts/HUKzssLxeQo1wbx9.js | 9 - scripts/HYrl5aNMm8BAdqH7.js | 13 +- scripts/Hcpn1gU58DIKIhty.js | 4 - scripts/HdTuY2IGhdlMDOy3.js | 12 - scripts/HfCxNd7mFGZH4s9Y.js | 13 - scripts/HfZAQWoY8n3clLlo.js | 6 - scripts/HgzIi6m6dkXbVWHp.js | 5 + scripts/Hi005w1Ul17Q8Uty.js | 6 + scripts/HiMBS6GeOwEydWYN.js | 1 - scripts/HmImVzvw6ecBy99l.js | 4 +- scripts/HrOBAXsEX073ReKl.js | 21 - scripts/I2I4ZJjN3EUSow0t.js | 3 + scripts/I67tdJctEqXSQPE0.js | 1 + scripts/I79D8V8OFzMCtL40.js | 2 + scripts/I7ieW0hNYvvX0KFg.js | 1 - scripts/I8JS4z90PtWIG2nb.js | 1 + scripts/I9QAPKbaXwMMMBT4.js | 17 - scripts/IAGla7HJlYN0wa4H.js | 6 +- scripts/ID8mCcjkl7PCQhDq.js | 8 - scripts/IDvpVMkR2HXoNpPp.js | 1 + scripts/IEDJHIYaZLhmrK4X.js | 1 + scripts/IFXsTRAVDUeVvcRc.js | 7 + scripts/ILqHxk7deotgI3KD.js | 2 +- scripts/IM8nRo6Jx2I8RJ0L.js | 1 + scripts/IPPDvZdE8kn3H9z7.js | 7 - scripts/IR5URcjnCuWBFMoN.js | 15 - scripts/IXXrxNSLqXEqtuDU.js | 3 + scripts/IfEu1hO8sKEZBpvg.js | 7 +- scripts/IhoCoul5okDx0jBa.js | 7 + scripts/IkVcIRmmgQjsBUUf.js | 8 + scripts/IrkWq7IiFS65bTvC.js | 2 +- scripts/IsLAvY9ikR1cOJWw.js | 1 - scripts/IupskvzvoGyD2H5o.js | 31 +- scripts/IurWrdbjsmMtTWuq.js | 1 + scripts/IuxMr6SFdJhqFtVD.js | 1 + scripts/IzoOmDywGLqLNljN.js | 2 +- scripts/J0IWUhxada2ONowP.js | 1 - scripts/J8k4ahQdZhXDfU1l.js | 1 + scripts/JBoKPBr27C3PMoSD.js | 1 - scripts/JEbs0WlqhKNDOo5A.js | 6 - scripts/JQruHprM5R5vZ9DA.js | 10 - scripts/JXBUE0XuJOJNG7zE.js | 4 +- scripts/JeThJbOf6Xmbtgo1.js | 8 - scripts/JgCcgDVZX54slrWx.js | 1 - scripts/JhCMYHHYA860Kka8.js | 1 - scripts/JhbZWZhOJ23yOBmG.js | 10 +- scripts/JibNjuQrJRnY0yf9.js | 1 - scripts/Jjq3oPYbI26zjxME.js | 6 +- scripts/Jk7OHqx06oCUVAzb.js | 1 - scripts/JmZQRvdWjm9ykYfn.js | 2 +- scripts/Jnp5c09sPzDD61EK.js | 2 +- scripts/JstrA46EYSEuRSy5.js | 2 - scripts/JwYZJGkZMSM2M3Si.js | 2 +- scripts/JyTxUG5dNW670Sf7.js | 11 - scripts/K54XxyNJa5PIWDEH.js | 2 + scripts/KD4nCSdSXJVJmk0R.js | 2 +- scripts/KGK9vL1Yl0qmCeCN.js | 52 +- scripts/KICZPwLvbUSxbDrE.js | 6 +- scripts/KPQfupKuaf4LCv4R.js | 2 - scripts/KQzbrpb0T5a7it4k.js | 2 +- scripts/KSGIwJxR0qn10RLX.js | 1 + scripts/KSjsDlsx3DD6cT16.js | 1 - scripts/KUx0deSF3xNzMucL.js | 1 - scripts/KVpDUEjHhd3nLa0f.js | 8 +- scripts/KkE8DtsTDYDyk1gN.js | 1 + scripts/KkjkYAGI9Em1NgiQ.js | 19 - scripts/KmngDrPD72xn22kZ.js | 8 +- scripts/KxIRA51YA0rktcSP.js | 1 + scripts/KyUPYV1RXJxPOfyA.js | 6 - scripts/L41ao2Mw1miE0yri.js | 2 + scripts/L9eAtDyaoHvqryk4.js | 1 - scripts/L9pUSX8Z4y2zIAn7.js | 1 + scripts/LLqAT9wEUGMLfDhU.js | 2 +- scripts/LNxKkPI37im0bSjy.js | 5 + scripts/LQEWSN5KnHHATPsf.js | 2 +- scripts/LXEUhHuXe8keEPI9.js | 8 +- scripts/LeKLtvEDrWh4yHsx.js | 1 - scripts/Lg1oRg4oNRvucsvi.js | 1 - scripts/Lh3Ccqx3utIu6w0d.js | 5 + scripts/LjfScVGBf0Egr70E.js | 9 - scripts/Lp261O9fgEXmgPf3.js | 2 +- scripts/Lpv2N9LK9loeumiW.js | 6 - scripts/Lrb1S2aK7SFVD0C7.js | 9 - scripts/Lu27iXtJVkrJ8bOx.js | 1 - scripts/LyAK0dVDS5L09yq2.js | 2 +- scripts/M0XhKnWjG14pk3iH.js | 1 - scripts/M2FshTX4PjKFVU8y.js | 9 - scripts/M5bh0heeafA2fQQ8.js | 2 +- scripts/M6sb1yAdEAMlIvac.js | 1 + scripts/M9VgeYGiUO97ZUW4.js | 12 - scripts/MB058H6OslhfBmxR.js | 2 + scripts/MDLttXplnNthncGr.js | 2 +- scripts/MFKhU9vp8bQpHP3I.js | 2 +- scripts/MJB6WbZSF6Briz30.js | 1 - scripts/MKxYbHOrv0UuA7JB.js | 9 + scripts/MMv2B8TH7jxNCtdl.js | 44 - scripts/MMx8f5uJ15XOgJGg.js | 1 - scripts/MPK7U4HLmIAsjdqs.js | 5 + scripts/MSJWJEUrX7ZmMvAD.js | 1 - scripts/Me1wS5XdqUEy7OGt.js | 4 +- scripts/MfxWXZwaZUjGSBqw.js | 2 +- scripts/MfxzwJz2o9ho2hOM.js | 2 +- scripts/MgMMoC4Umpg7fmNI.js | 23 +- scripts/Mhb67xufvA9uWO21.js | 8 +- scripts/Mir4FMHQRdVqazAF.js | 14 +- scripts/MnqQkXVp20Lw84I1.js | 4 +- scripts/Mp8UjuCLa9jdzhBS.js | 20 - scripts/Mqbjr3t7IXwFnfCv.js | 19 + scripts/Msygc7oQQPB5fw0b.js | 10 +- scripts/MwUzyAgd0yPnmZCH.js | 2 +- scripts/N6E9Jsd8n2ubCfz8.js | 4 + scripts/N7nGncsPrTz2ZbDA.js | 2 +- scripts/N8hA6ysHCTlLd8Kj.js | 12 +- scripts/N9kA46ZQ9LiRjy6T.js | 1 - scripts/NDvNGATDM2xPFJK0.js | 21 - scripts/NEKLTgJJsayC7tpF.js | 1 + scripts/NI3ZzIAlpQfVSjvf.js | 2 +- scripts/NMZ3Fb164tUfwChF.js | 1 + scripts/NQSvFWhmBQAyx5Zz.js | 2 +- scripts/NTFpkiGyBpOtrV0s.js | 18 + scripts/NX9fApO15NQuTipW.js | 1 + scripts/Na7Nanl9YmxZlTo7.js | 2 +- scripts/NdquQqyuOkGCj8Uo.js | 2 +- scripts/NkqtQaLEGYst0PUO.js | 5 - scripts/NnA4zpuO6iUXKhH7.js | 7 - scripts/NnDq4miIPNEtZUWb.js | 7 - scripts/Np25JqEiaoqerEk8.js | 3 + scripts/Np8P8IPT2GYlrh6G.js | 1 - scripts/NqFvdCKDLqIXaE9m.js | 1 + scripts/NrVFrIXM8GnIbojv.js | 2 +- scripts/Nuth9S5UHIhpEuIC.js | 1 + scripts/NvaPNfZt5d9RqKSE.js | 6 + scripts/O45vpR4jDbQQnmvJ.js | 2 +- scripts/O7lXFZLrLdFaShGR.js | 2 +- scripts/OBF6r2CsMOEokAsS.js | 2 + scripts/OEy2lxvic37dRBEt.js | 4 +- scripts/OF4sSVOvHoKuPk7L.js | 8 + scripts/OFViRemr1cpnO3af.js | 6 + scripts/OGX4BneaYAnV25TO.js | 32 +- scripts/OYLqLl6vikJD8flg.js | 4 + scripts/OYRUSP7Q0Je0jdCY.js | 3 + scripts/OeCgX3hIsfLfmGvC.js | 6 - scripts/OeKeQAAcJhdI4Qky.js | 2 +- scripts/OgSI0Z6SHjYuqKIz.js | 16 - scripts/OicQSEVZBbqLtrcf.js | 4 +- scripts/On1itZhp0AOzNyyc.js | 3 + scripts/Op88kMtimSEWlY2h.js | 2 +- scripts/OqLKL0PiCvYH2QxW.js | 13 - scripts/OsLXutfXyQCAkhAf.js | 10 +- scripts/OxsBnnVI3Smpknpb.js | 2 +- scripts/Oz7pWF9mEc1pQypj.js | 2 +- scripts/P29tT1eMMdAw3CPF.js | 12 - scripts/PBW6IZtwawNHxB6y.js | 2 +- scripts/PGHvFHBIygB5pnWT.js | 3 + scripts/PI1QNaKFeqood6d7.js | 4 +- scripts/PMISUsaEDBA7D3od.js | 33 - scripts/PMNjdEAusVBfam09.js | 1 - scripts/PVjaKAHTKDA0rA9J.js | 2 - scripts/PdClojv7yNgQpOUc.js | 1 - scripts/PeZYj8b0vedyJj00.js | 6 +- scripts/Ph3TdQw1lGiFr049.js | 4 +- scripts/PjOi61gB2nSYooLs.js | 1 + scripts/PmELrzD3RmF9qKkO.js | 15 +- scripts/Pn5fekTbkwlr61XU.js | 10 +- scripts/PoNnT5EqvLj2r5yf.js | 1 - scripts/PsO7aTdELJt35eHP.js | 4 +- scripts/Puv2wLrSVe6b1jLf.js | 4 + scripts/PwqTmw7rsG8hzqCS.js | 2 +- scripts/Q1trEhtqjIiDvFPF.js | 2 +- scripts/Q4EQgP4gZR8TTm7S.js | 9 - scripts/Q5gh5Y9dCdclcwsD.js | 1 - scripts/Q68WiUWY7GxiXBbT.js | 2 +- scripts/Q7eULXQ9AfDRmUGO.js | 10 +- scripts/Q9EmlWmuDac83cJw.js | 1 - scripts/QBBrzcSAe8QqE4WP.js | 18 + scripts/QKt9ZYpVpznncfJ1.js | 7 + scripts/QLBxcP85duX1Z7LX.js | 3 + scripts/QLUaOkwuSPvBp7jU.js | 2 + scripts/QNxmImpLTou6WdMQ.js | 2 +- scripts/QPVVDPcJ4Xi5FmQl.js | 9 - scripts/QQ2gHThZHdO4yLLX.js | 1 - scripts/QRSACifDrvojIXHB.js | 4 +- scripts/QfTBRGXVfwQSghmd.js | 18 - scripts/Qgn92fZyc3Psn8QJ.js | 19 +- scripts/Qk7t2l5ep9RDVpgE.js | 2 +- scripts/QoEOxRruQXYrZrv3.js | 2 +- scripts/QqybHxNCzPEzG1Qh.js | 2 +- scripts/QwHoqu2oO8QO8Mad.js | 4 +- scripts/R32U01LBjBrK1pns.js | 22 +- scripts/R3OfRdi6xv0e9mzB.js | 1 + scripts/R6SnyF3y4Vsq6oga.js | 5 +- scripts/R8FBHZaaARA3z9pB.js | 10 +- scripts/R8ecKGRzOr4ThvVa.js | 10 +- scripts/RDtJXji3hgcKnEBk.js | 33 - scripts/RHyBLYT5oHf7EPnG.js | 21 - scripts/RKIFGN583PQnqHGk.js | 2 +- scripts/RNr9CwyvLhlnwD2h.js | 1 - scripts/ROXCqAFSTLouJniL.js | 2 +- scripts/RPqgRUkiLY5thVbC.js | 10 +- scripts/RRK91ySi5SzYCRvy.js | 1 + scripts/RSsGiDFibuqg3sHr.js | 2 +- scripts/RUpVgB0czqg95K1Q.js | 4 + scripts/ReJpL0IVesKUbXgj.js | 1 + scripts/RgNdS87nO7RVawuw.js | 1 + scripts/RlVvlmhOfscaJqCd.js | 9 + scripts/RlhOAKfN0ghrrooR.js | 2 +- scripts/Rnpw6UQdJifLeuna.js | 2 +- scripts/RprZWlnopSqZt7KZ.js | 1 - scripts/RrchOMpEdIvceJxl.js | 1 - scripts/RvipIYj9H7n4UDMe.js | 14 +- scripts/RwMw848y13Jq2L4f.js | 10 +- scripts/RyQtuiRykUCQ6Xag.js | 3 + scripts/S1QihXuvdEVzeRtB.js | 4 +- scripts/S1SQe0Do7ZcuNV5j.js | 4 + scripts/S3Dev4hleOYqDNe9.js | 6 +- scripts/S4793DLFhjMxpM8x.js | 2 +- scripts/SGr50Hq1AHIEzIFN.js | 2 +- scripts/SK8paBvnvc5YLFI1.js | 12 + scripts/SKn61f2ykhzuwMdw.js | 10 + scripts/SLy1Fs3oXcHgFgjK.js | 2 +- scripts/SNjG7IvgQzvCGczR.js | 12 - scripts/SThruXFhxUdNKCG4.js | 6 +- scripts/SWIJjM2RCmzfr64u.js | 6 +- scripts/SjDNjLBGsd9fYObo.js | 1 + scripts/SlrslcNdnYONcSH3.js | 16 + scripts/SlzPn7ONIKab9URj.js | 5 + scripts/SrCHfOJFZwDickqa.js | 6 - scripts/SreM9Jyj2XZjoezH.js | 1 + scripts/StAderQaQQsxb6Rv.js | 2 +- scripts/SwliIjjjFtZMnJH3.js | 1 + scripts/T0KBl8iEkcPq08RI.js | 5 + scripts/T3RfSt3VMEat3iDD.js | 1 - scripts/T4JEEDYCEIUbVHv4.js | 6 + scripts/T5fiTzhXEQAv9Drf.js | 2 +- scripts/TAw9vXnfyIAl5DGs.js | 4 +- scripts/TBpNFRL5uehs0fze.js | 2 +- scripts/TCgEBuMPPd5SLAsc.js | 1 + scripts/TCtXPvDpbfz1yrVZ.js | 44 +- scripts/TGN070HeJLl3gSMY.js | 6 +- scripts/TIoUbjOtj7PTK2t8.js | 15 + scripts/TKjBb75exjae87fa.js | 1 + scripts/TOyQLrugFGzwc5nY.js | 1 - scripts/TSsHcn4EDulD03RU.js | 1 + scripts/TU2xjbJ0zFtytF3J.js | 1 - scripts/TXce477AiXHKbepk.js | 1 + scripts/Td8M5K1P92GbM2IA.js | 6 + scripts/TdjlJro0RRVSh8g8.js | 1 - scripts/ToKlHDAjJOsC51ag.js | 11 - scripts/TpZItJ5Ugbazaobd.js | 2 +- scripts/TpgK2aAe93ui3Rbs.js | 8 + scripts/Tq45Nd8J3eTvHT41.js | 1 - scripts/TrIYdcG3jDER4WgY.js | 4 - scripts/TwgdEucxcHloc4cX.js | 97 +- scripts/TwwKxFjK6TNGKbRB.js | 8 - scripts/TxfmxDGBj04AQQpt.js | 2 +- scripts/U1RUcgP8LD2qeGTm.js | 2 +- scripts/U1UpSRJOSjPpO4HS.js | 8 +- scripts/U26XMie3Kjoddisj.js | 6 +- scripts/U4A8FDNmwBGTuQZO.js | 5 - scripts/U78c4oUjKwyUu6jT.js | 1 - scripts/U7lRf56BFaTfsC6B.js | 10 - scripts/UC6G3pFQwzUhrw6F.js | 1 - scripts/UDPsaymtZf39UsMk.js | 11 +- scripts/UH5MIzqi2MvEqTwj.js | 2 +- scripts/ULmZMLezDamerN04.js | 10 +- scripts/UQtXuQmUlTyDKqhe.js | 20 +- scripts/UTlgF4azrGQZsoDv.js | 2 - scripts/UUHQRPRrrRSr9MIA.js | 5 + scripts/UaImulhbPURkLJg2.js | 1 - scripts/UfkysrAftCs09Fct.js | 1 + scripts/UgQW0UMPOZ0jwfVJ.js | 2 +- scripts/UlRSaZG4ZUU6fMND.js | 10 +- scripts/UlygtNPSDlWPIFCI.js | 1 + scripts/UnqnWi0dZYLf5fTT.js | 63 +- scripts/UsAHQecRlWL5PhP6.js | 8 - scripts/UsuwsmU1TUQLQVM2.js | 3 +- scripts/UvycHOjSPm5Zv9KJ.js | 10 - scripts/UxVfVoH7cbC9ESDr.js | 13 + scripts/V0b4yLTawjCnm9ke.js | 5 + scripts/V1D2Uo3WDKYQePU3.js | 4 +- scripts/V4PcjtHde941wv6J.js | 17 + scripts/V9wD9FWHWxZUOGSI.js | 6 +- scripts/V9xm4X1x3lPYTQaI.js | 2 +- scripts/V9zm2hKUVLVZtAcN.js | 92 +- scripts/VAPsww9x3HAw1sKP.js | 2 +- scripts/VAs1nXvicdQK18Do.js | 1 - scripts/VCnNWmRBH28Rx0JH.js | 1 - scripts/VGuZMIR1lE8I1F1y.js | 5 + scripts/VINX6TBAJQznhVcN.js | 14 +- scripts/VLdF2HPnCrNIgp7a.js | 4 +- scripts/VNOKTzCrFbZ6PJUj.js | 1 - scripts/VOc9sKag2Vy4vGGZ.js | 59 + scripts/VQaC6ynouW5EQCbC.js | 13 - scripts/VRDS4lkwSAzbtvm4.js | 4 + scripts/VTzpExK3QSCaFQPf.js | 13 + scripts/VXERNoc5IazQGuGO.js | 4 +- scripts/VbI0Al6rJfypV3qY.js | 4 + scripts/VbL0TgaBAmYjrezZ.js | 2 - scripts/VcE8Hie2jbpuyuM3.js | 34 + scripts/VlFUDaKUYoBYKYn0.js | 7 - scripts/VlHuDIAvPr8JM1P5.js | 1 - scripts/Vns6WrafVq8NjX7t.js | 1 - scripts/VqTrKPtxv9hpn0Hr.js | 1 - scripts/VurA2XNqC0d9U49C.js | 8 - scripts/VzO0ZDcTWvaBn4vm.js | 13 - scripts/VzgTGb5QXKoyPNh3.js | 4 +- scripts/W2rdTwflbUVxFyfd.js | 14 + scripts/W5qtA7Ul5cOj18Nd.js | 1 + scripts/W9nyUNQStMr1pUHJ.js | 4 +- scripts/WB6sIpLEPC8YPX67.js | 4 +- scripts/WO5n7Vbx8AgoVrwC.js | 12 +- scripts/WOpRJluHKER1MdgI.js | 14 + scripts/WR0Kqn8CF5iwToak.js | 10 +- scripts/WTRYAEzwxRuGENyI.js | 18 - scripts/WaeL2I8VVJmBBKHk.js | 19 + scripts/Wh1VV3javfzcV3bP.js | 7 + scripts/WiYtNU2Y5BJfIpeM.js | 2 +- scripts/Wo4wQKUxSItAhRzZ.js | 5 +- scripts/Wqff6ICWYzvLDYC8.js | 12 - scripts/WsN2R1qOzuLa2qyB.js | 59 + scripts/WtbSIghR0q4euE7J.js | 4 + scripts/X3vpmNUj9SL2CDnF.js | 2 +- scripts/XClTZOjuhcxWLF51.js | 13 - scripts/XO9m2AvFRAAeEuty.js | 2 +- scripts/XPpHYTTT0hqYuSfa.js | 4 + scripts/XSbQKrrbjsN15Zp9.js | 7 + scripts/XcvDYNZgJ2rpAdDV.js | 11 +- scripts/Xe8ijqWU3bbtq7ZY.js | 2 +- scripts/Xf4FcZ4ZLdWmOXBa.js | 1 - scripts/XfSxXatjEYlPEbaK.js | 3 + scripts/XjUXxUA0hbwjUatW.js | 12 + scripts/Xk9XPklxxTvFlwpI.js | 2 +- scripts/XuFxKPYheYF4WMmQ.js | 1 - scripts/XzJotwVUIuQu6b0G.js | 1 + scripts/Y27MmN5KFw45d5vQ.js | 10 + scripts/Y43z8YCohJMA8Ia7.js | 3 + scripts/Y7McxsHFeGhwQx0J.js | 2 +- scripts/Y8J66v8VTKUASGuK.js | 4 +- scripts/YDANERWYHyJ2ACeo.js | 1 + scripts/YDqpKJVy8ijEKdLX.js | 1 - scripts/YEBw2CzHYxsTpTy5.js | 1 - scripts/YFSgWRXel0bWE3EE.js | 1 - scripts/YHEIkBKWXKNPqglh.js | 2 +- scripts/YJX7WnxzXXIVdH6P.js | 6 +- scripts/YMaxpXnml01bLGpO.js | 1 - scripts/YN8719gme9AxYtyY.js | 20 +- scripts/YQ2LnLxp0xgy3meI.js | 2 +- scripts/YRUTliBzAQvncGNX.js | 2 +- scripts/YaKnYEbmmZZtByJc.js | 2 +- scripts/YdiQFkm8j48Xs7gI.js | 5 + scripts/YfRPSgJjvHvl50HW.js | 1 + scripts/YhhiWEQbox3WZA3Q.js | 1 - scripts/YjJcRdytVRm88qLn.js | 2 +- scripts/YrXhk2YJaWSChMhp.js | 24 + scripts/YsUdMhQ2AArcJIqy.js | 57 + scripts/YwLEw4BiKq4EMy57.js | 6 +- scripts/YySjPfSAPdMAfjsh.js | 2 +- scripts/Z52yZDm6lP6fOP3O.js | 2 +- scripts/Z6OmmC0irJzxSnMH.js | 59 - scripts/Z6jNlyZMECkW4Hon.js | 6 +- scripts/ZCBcwbVFHFTFRntb.js | 10 +- scripts/ZCkYe5XMVY1RWMXG.js | 2 +- scripts/ZCrfdLPOxiNDCDSg.js | 2 +- scripts/ZCuOjLAeENKN1Q4L.js | 4 +- scripts/ZEXhYJqqxF6QAixX.js | 2 +- scripts/ZLspFT2I3ZdWWr2H.js | 1 - scripts/ZNW3ubbKIYXAyE48.js | 29 - scripts/ZNu4B0OdjkM9lmtu.js | 2 +- scripts/ZRoG7GiMDQWso6gN.js | 10 +- scripts/ZTE8LdRblyG4yYoE.js | 2 +- scripts/ZURBQYTYcP5jci5k.js | 3 + scripts/ZYsMgB4BwXBJcpYf.js | 4 +- scripts/ZdHvGvSJBsIuPphF.js | 2 +- scripts/Ze9E2zR1GFGWGMVH.js | 1 - scripts/ZfgPAtNKA5KrETer.js | 1 + scripts/ZgF1sYdbAKaOuHmK.js | 1 - scripts/ZingXNvYyZ2BEvfY.js | 85 - scripts/Znz4g56UH23SSCg7.js | 7 + scripts/ZqTW093qENOwGONP.js | 2 +- scripts/ZvbBM4gTJHPdU8jU.js | 3 - scripts/a02tlRCXpaoaDjSN.js | 10 +- scripts/a0YU3whUm16wGBNu.js | 7 - scripts/a4Aza4a9v8JMU8dC.js | 2 - scripts/a6gacHsvgwtsIFSQ.js | 2 - scripts/a7pEvCycVnFBXGAQ.js | 6 +- scripts/a81IMxqmMtHgYnIF.js | 1 + scripts/a8i0sA1RBnD8nHZt.js | 49 +- scripts/aAvJrAKLzXhS9qN6.js | 1 - scripts/aCVtaW8ag1WibcAr.js | 2 +- scripts/aFwNs7TMVF90i9JF.js | 6 + scripts/aIYUsBIDKWJ3CEtj.js | 2 +- scripts/aPZiVhgwR0Xql6AM.js | 7 + scripts/aRvJUcgYqhRmmWYC.js | 1 + scripts/abLWYtNTu1UVDQAs.js | 2 +- scripts/aeBetniKqq5SD9Ou.js | 28 +- scripts/aedzdFyjI80Ah3qC.js | 3 + scripts/afdmOvPGMpEdZvCb.js | 1 - scripts/b2Kb4IuD22RhKhR0.js | 2 +- scripts/b2WaqRna5CFXmbDG.js | 2 +- scripts/b4CIeJF2L4E1qikC.js | 1 + scripts/b5DfAWtpV1x2R8If.js | 2 +- scripts/b5prg1FLjCAvBjLy.js | 13 - scripts/b787rIfyHF5LnALd.js | 7 + scripts/b8XFmEUu1d2YNQ7F.js | 17 + scripts/bBdXzBmxgFFBwMMS.js | 2 +- scripts/bDS62ctjfnTU4xIu.js | 1 + scripts/bEVlJOOA1kLlzpWx.js | 12 +- scripts/bLkt8VpTTPoTxW0W.js | 2 +- scripts/bMEFHPCei2evnZZw.js | 8 +- scripts/bNhpJPWwoHLq68zD.js | 67 + scripts/bQyVajMN1ETwlzvM.js | 2 +- scripts/bRiFHPC1StKxqNIC.js | 2 +- scripts/bT4gLrE3W36DIP4k.js | 6 + scripts/bgLeMqihLya2iobP.js | 6 + scripts/bh2qDCKiAIWM0UPi.js | 1 - scripts/bhXUW7IJtEaUGAoV.js | 7 - scripts/bidoOQSAofp4NPf6.js | 1 + scripts/bkbWgG9COvZWZbAX.js | 1 + scripts/bwtQOSWn120NICkf.js | 4 +- scripts/bwx9wuEOJPF7btD1.js | 1 - scripts/c3KA1knL2NYNUEww.js | 1 - scripts/c7HTWfg3CbjN9e1M.js | 1 + scripts/c9xxdOCaQSwooK8n.js | 1 + scripts/cAKqUBuJBsU85erO.js | 1 - scripts/cC7jjJDSVPi5BJUq.js | 3 + scripts/cJFDnq1HI4gXWcJo.js | 2 +- scripts/cK1Jysfu5IMUUH0C.js | 2 +- scripts/cTYNaKbepMwqYsZ8.js | 14 - scripts/cUnbADgOQ4fMKgrH.js | 10 +- scripts/cV9JiAgUPOeUHKnS.js | 5 - scripts/cW8ZuQ9YIUG5uvhf.js | 1 + scripts/cZVrzR4fxV86lxNW.js | 7 + scripts/chUpiI3el8IO8MSs.js | 2 +- scripts/cipTp0OS2bfKLjZS.js | 4 + scripts/clO7l82UYMJ4XVks.js | 1 + scripts/cqYgZQk1C3kMARy5.js | 1 - scripts/cxgGYbuiXM3NxIOI.js | 4 + scripts/czZI8S09By0Mqlsr.js | 1 + scripts/dAMtbn3uQwF8KpKU.js | 1 - scripts/dEx8xfG7VLbN69Ha.js | 14 + scripts/dIxYt421K010eogY.js | 2 +- scripts/dM449AU0FQRnOc3l.js | 2 +- scripts/dMeSZGdvw7zlnUKh.js | 1 + scripts/dSmRhZ6o1bUcOSF9.js | 1 - scripts/dVF5ywnzeiZQx9ke.js | 6 + scripts/dWr3tkFoIzsAgelu.js | 18 +- scripts/dXGosSxdoYbET2O8.js | 11 - scripts/dZ4c5pKDqQV02aIK.js | 2 +- scripts/dbOSvpgcPjsc2uvq.js | 4 +- scripts/dcwY8dCd3PNCEzk6.js | 2 +- scripts/dfEgat3jz4EtWszH.js | 1 - scripts/dfnCK8jCPXNLM7Gh.js | 12 - scripts/dkiNmwFXztIVbuxg.js | 8 - scripts/dr9VJKGY3TeGuzXj.js | 1 + scripts/dsXGavzXLerXR8Xg.js | 1 - scripts/dtFvpY96RPzNnphq.js | 1 - scripts/dwSgcFxKN3S0hLJL.js | 1 - scripts/dxt3p07po06J9fO1.js | 14 + scripts/e0eKVlOSk3Vw1HiD.js | 1 + scripts/e2JlsKoW8oaFjn6Y.js | 8 + scripts/e34s1XxHckAWfwHt.js | 2 +- scripts/e3dBud1keWyhw6nw.js | 10 + scripts/e7IxnxePdXSy6L4E.js | 2 +- scripts/eC61buStv62b3sN9.js | 1 + scripts/eGQAyzCFZAEQhyJl.js | 5 - scripts/eIiiDhJohYez26qY.js | 12 + scripts/eLxdRg8LX3AdYSEq.js | 9 + scripts/ePPgxQOqL1Uhz2k9.js | 82 +- scripts/ePv2YYcr4lz3AkGu.js | 2 + scripts/eRVVn8YtU8nnOW2q.js | 16 + scripts/eTHJSRutCEpuyPkR.js | 1 + scripts/eViKAYOtuaOqo6c7.js | 1 + scripts/eWvHTkxsjKuH2IKm.js | 8 + scripts/ebDQH0MdGAG02CHl.js | 4 +- scripts/ed7Sud9HM3uB2j6b.js | 6 +- scripts/egc02UIueJgEQMqx.js | 1 + scripts/eieFcF4BxIvDTN3C.js | 1 + scripts/ekjJQHyMbZT2vqdc.js | 6 +- scripts/eq32dKXeTAbKhhLf.js | 4 + scripts/eqxE7nBO13yJS7hc.js | 2 +- scripts/eu4mHsdZukvUEAGJ.js | 31 + scripts/eyrUJQAuHvdllCwi.js | 2 + scripts/ezGqDoC9hNRBnFTB.js | 2 +- scripts/f062aa2BNClx08D6.js | 16 - scripts/f29Pv6TQtgILxt1h.js | 4 +- scripts/f3rXusHh6VIpVPUl.js | 1 - scripts/f4vvAGQ8OGoEbrgy.js | 8 +- scripts/f5Mp3kXwCFdPkW6N.js | 1 - scripts/fA1dIV1ANo4RVEqy.js | 10 + scripts/fC4KcY9S6V30IJyX.js | 1 + scripts/fEFfHFeJxkR0aIJK.js | 5 +- scripts/fFGuTi0HLjwneMcJ.js | 2 +- scripts/fKzlu6fFE2th9uIJ.js | 1 - scripts/fLg90csmdOOKmEE6.js | 9 + scripts/fP2edYbj6QjPPAjL.js | 1 - scripts/fPKYkBllp7Et62lX.js | 2 +- scripts/fSDFCHAo97RLpwGU.js | 9 + scripts/fUD4gMdKe6P3sFdJ.js | 1 + scripts/fYLSe6CrYciap5y8.js | 74 - scripts/fcY3pa72dELnOFXV.js | 2 +- scripts/feMPZhhFeXRtKdKY.js | 2 +- scripts/fiF9sM5UpcHMYa33.js | 2 +- scripts/fq2fqlWlrVfitkcB.js | 48 + scripts/ft0LaRWZT5WtnptP.js | 4 +- scripts/fwiBeetIsvpXKtUc.js | 10 + scripts/fyjYWg7ekj8JJcmq.js | 4 + scripts/fzTB7t3x4bLmAXji.js | 2 +- scripts/g07HI7vyqiFXPB0o.js | 29 - scripts/g0SzfsLyW7aD2F19.js | 6 +- scripts/g1L8OYO9nCOhdKGL.js | 2 +- scripts/g4t56A09yrpZaJQ2.js | 6 +- scripts/g5y0tdoHCDs7cBy7.js | 3 + scripts/gFUXBbTskQBKjxqm.js | 8 - scripts/gKIPujyuFSn0No9v.js | 2 +- scripts/gKPL3t4vlZAsvtGr.js | 1 - scripts/gMIenSmLklAkB2Zm.js | 2 +- scripts/gPQrszvIgGlW9yM4.js | 2 +- scripts/gQJJaxbN83KSgi36.js | 6 + scripts/gSDhsSB8573joL64.js | 10 + scripts/ga6bQzPuoIiQQrKg.js | 2 +- scripts/gnVpxOeBZpNF4HIF.js | 4 - scripts/goz8yTlMozlsz3uY.js | 10 +- scripts/gqZLfIr6svrtdwdC.js | 1 - scripts/groEX1wJ9l00PkDF.js | 25 +- scripts/gu72JaTs9GrSiVTd.js | 1 - scripts/gull3qgCahzk2xYu.js | 10 + scripts/h0DfPwUUOBjyAHMZ.js | 1 - scripts/h1XKoMuVnS0bagRO.js | 1 - scripts/h4lnexDYAhyQuiR5.js | 9 + scripts/h766UvswLCsxcMow.js | 28 +- scripts/h8JqPMh2mM2uhpxk.js | 11 + scripts/hA8PzeiCsHqqlUZm.js | 2 +- scripts/hCzxUyO6mjLNIpaM.js | 2 +- scripts/hDC6lroDEPVBituR.js | 12 - scripts/hEDuYAgc1O1zG3Rr.js | 1 + scripts/hL3JUSY3xMA4zj2Q.js | 18 + scripts/hO2CFW9hygGSYuJ2.js | 1 + scripts/hR1qD2kpFHF8JT8h.js | 1 - scripts/hSImyYjL0CENTvXf.js | 10 +- scripts/hTsnYKgw0kK10PiC.js | 1 + scripts/hYNWp75ggWSTht55.js | 4 +- scripts/hadXFC43VKyrE9jC.js | 1 + ...3K85NnVwjVNXlZq.js => hg89FU1NAp8tIsgO.js} | 2 +- scripts/hhCs5VBKx50S5IsY.js | 2 +- scripts/hhv7PrRdlf9sfC82.js | 12 +- scripts/hlHKeFWrOA8CsLr9.js | 4 +- scripts/hmk8zV1LTElHUI8A.js | 6 +- scripts/hnsmzvcuiUYB065I.js | 1 - scripts/hpbraeEbjkXnmD75.js | 2 + scripts/hpwJRAhCsXTp9bd9.js | 43 +- scripts/hqMwzPozAVTzoCxa.js | 10 + scripts/hwOZxgt7e65iWvYz.js | 2 +- scripts/hxmwtw5zAHyS2upG.js | 2 +- scripts/i5AN97A7IOeygEFA.js | 4 +- scripts/i93PGV1lDSdi3BJu.js | 7 + scripts/iAo3wxMLA64rsKjj.js | 2 +- scripts/iH9o7t8vGDn6pm1d.js | 13 + scripts/iLpq4yCFN6YACrYA.js | 2 +- scripts/iM6JLF8jDXMViReZ.js | 1 - scripts/iMu8BZ7eHMAbPEO1.js | 2 +- scripts/iNAQJa5HyaEckknX.js | 12 +- scripts/iO2hCDwyQ7v4qrOI.js | 2 +- scripts/iT0h3VZLEBQnn5Bx.js | 1 - scripts/iT3C15fMyQrj1RmG.js | 8 - scripts/iX0ctHYHg12pjaCU.js | 4 +- scripts/id9ZdkERMZnZTWXt.js | 4 +- scripts/ij3BLXzNk7eZ3V95.js | 1 + scripts/imKVsCy8rya2gkwO.js | 14 +- scripts/iuSoKntfJ4eAPafQ.js | 8 +- scripts/iuoVkjFdL1rHdbqR.js | 1 + scripts/ivxpmCKu3pEMG05c.js | 5 + scripts/j98hvy6r9G2Vjmid.js | 10 +- scripts/jFKnf2UdoxAQx76R.js | 8 + scripts/jFwema0iwzBphxie.js | 2 +- scripts/jGDk7avWFSnyFoql.js | 2 +- scripts/jHgxpe6TJDlP3oTn.js | 6 +- scripts/jOCLEsjNzERyVLsP.js | 5 + scripts/jOSCsBRUO117spv8.js | 1 + scripts/jObJanFoev4N6ZRv.js | 2 +- scripts/jOm7RxGFm1y6mCpN.js | 2 +- scripts/jRSgPhpfN7MH7TTp.js | 16 - scripts/jW87rmQLtROdVEhW.js | 2 +- scripts/jXbrIGxznqf1SNxZ.js | 2 +- scripts/jb1ouw0eIBVy3Wwg.js | 9 + scripts/jdS2u1tQPYeO55WI.js | 14 +- scripts/jgO1Kf60Ctt6R0qO.js | 1 - scripts/jpcU8FFWSlQ3gD0L.js | 1 - scripts/jsgLEVYvMieyYT6L.js | 10 +- ...9xh2wriSqCosugW.js => jvNuIbOtB46p0esq.js} | 8 +- scripts/k0AkkBLtE8oZhBwn.js | 2 +- scripts/k1Wdehpgdc0hP63E.js | 11 + scripts/k3FqFgsF6a3TkxAD.js | 3 - scripts/k465TgRelwcSUdS2.js | 19 + scripts/k5792iKWEqKmVZMk.js | 1 + scripts/k8TC0yzp4xfOXD2n.js | 10 - scripts/kEaBLoIHt1FpQVKq.js | 12 - scripts/kMSdRskYDI2J1gnp.js | 7 - scripts/kWynO1lQzjiSs8RK.js | 1 - scripts/kY50G53IXdNXX9Sc.js | 7 + scripts/kYTEqcs8JpO2OmB9.js | 4 + scripts/kYiDBPRKIokFkr4Z.js | 4 - scripts/kYmscP2HuXjDovBD.js | 1 - scripts/kiJ6AiaYVUjt6aV6.js | 2 +- scripts/kiolpXGbkmxfPiuI.js | 5 + scripts/kkC5EhqA05U6U0gU.js | 17 - scripts/kmsGLWGxCY8Z8jVG.js | 1 - scripts/knq8lNYLw0v757dQ.js | 3 + scripts/kvaN100w0nBUlLbj.js | 2 +- scripts/kvqJbHBvFr6iGLcI.js | 1 + scripts/l1ntrpa8RE3Lg5xE.js | 1 - scripts/l8qFKSnMpy4P7XQR.js | 1 - scripts/lDIWlQvD6MGyP3QP.js | 1 + scripts/lG5lfAzNuM4t0rpM.js | 1 + scripts/lII4KMRblqwFBlsV.js | 30 +- scripts/lMRsQRgjMexY9dxE.js | 1 + scripts/lOIHiAIDtj91kllN.js | 10 +- scripts/lOzkngzye4RmvALp.js | 2 +- scripts/lPudo1grrVp05i7a.js | 11 - scripts/lQJ68n3y1xDyNicE.js | 2 +- scripts/lU4s3UTtBkU38djI.js | 4 +- scripts/lYYkGzqNshiYc7WI.js | 6 - scripts/laWHBP2jLrVxcgp9.js | 1 + scripts/laptAldsT0Fm1rDt.js | 4 +- scripts/lhemR8EP5tGNKout.js | 14 - scripts/lmBAZCtofsC8hHHG.js | 31 + scripts/luEuwzYCUrch58Bp.js | 3 + scripts/lvjcddwRiN9iGruy.js | 16 +- scripts/m4eagTrVOXtotonR.js | 11 + scripts/m8qBlbH7ROoqa22o.js | 2 +- scripts/mPxmCsXYirAIT913.js | 2 +- scripts/mRvLsSVxNyt8LVZb.js | 2 +- scripts/mTnmPcjWmvScIBWY.js | 1 - scripts/mYL4i1vNlMl4vFYy.js | 1 - scripts/mlulnXQo8XU8vKLD.js | 2 +- scripts/mnvczEiu7gUSWvuV.js | 10 + scripts/mr8qm5Bg6k1idZ6Q.js | 1 - scripts/mziJBUYcsrhkdcCJ.js | 6 - scripts/n5RJqJL9fdRIxkuN.js | 4 +- scripts/n5wowuDE8Dz1uBZn.js | 11 + scripts/n8X4Vgmrs4M5pyHK.js | 1 + scripts/n99CqhPx3uABCU15.js | 4 + scripts/nD2QVg3DrPK3foMf.js | 7 - scripts/nEaF3jbCiVYD8jia.js | 1 - scripts/nGTxNWBUBgTr87wU.js | 2 +- scripts/nIOeK0BrtdZeZW8X.js | 17 - scripts/nNwAFEURKlFhPcvA.js | 1 + scripts/nSXzktHyNjGUXjaw.js | 2 +- scripts/nZtN0zM49xTuG86V.js | 12 + scripts/naF5EWr1CBkYRZTK.js | 23 +- scripts/ncIjDE6TFx88IQA1.js | 1 - scripts/ngMm7SgtVqVovFJG.js | 2 +- scripts/njPP9wDAsdh4WHIj.js | 2 +- scripts/nkSmu7v9WiAaK4vq.js | 10 +- scripts/nkbTnaeBpthyhw4J.js | 2 +- scripts/nkdKBJ8ItqWiRAWL.js | 20 +- scripts/nqWu0ZplxzRiUEAg.js | 6 +- scripts/nvrFhHHVq3KzirlR.js | 1 - scripts/o2QhtiLAmUEpDgBX.js | 1 + scripts/o3JUBKLvE6bBxK2n.js | 20 - scripts/o88xuUConwt0vFLw.js | 2 +- scripts/oA197GIqHpU5WR9V.js | 4 + scripts/oDNfCNyt5KaUYmg2.js | 6 +- scripts/oEsUsI74yGTZ9CwU.js | 1 - scripts/oGdsGPgJWcyWkiWl.js | 6 - scripts/oHmtdXWVwm7y7BtO.js | 1 + scripts/oPg4se8iQRD14kmB.js | 2 +- scripts/oQI06eh8mJ9UqETO.js | 5 + scripts/oTXPA6rbPnYOKNmo.js | 34 +- scripts/oV81zgbZsuTFG6L2.js | 2 +- scripts/oWM43EdUiyHgUlfW.js | 2 - scripts/oWa7RkScnl6lR5vd.js | 8 +- scripts/obIXhQXKFyyQoNNV.js | 7 - scripts/okW06V9UiPC4Vcrn.js | 15 +- scripts/p222EiR8RRtlPm31.js | 3 - scripts/p7NJB1PsY6X5q8OO.js | 15 - scripts/pAgiAGyaLJY10894.js | 1 - scripts/pHyXdPnWwoFrUA5n.js | 1 - scripts/pNPjXEoQGHLKzq0r.js | 12 - scripts/pR4Q2OnPxXtwRVli.js | 6 +- scripts/pRp6hoBJ0JQa4NNG.js | 1 + scripts/pdvCwjxHI56EmxuU.js | 7 + scripts/pj7gjxHrnrZonC6U.js | 4 + scripts/pkKpxVqRHIzywerL.js | 2 +- scripts/ppc8L3WtIx6JzlAd.js | 5 + scripts/pq1YQffxtOcqCRTn.js | 6 - scripts/pqQkeUVpuZ0jOKnZ.js | 25 + scripts/pvTcazVvW4v04otW.js | 3 + scripts/pzknBcJtZWeliE27.js | 1 - scripts/q0LvphC8RDSyR0oY.js | 2 +- scripts/q5RgoYr12kBF6FA5.js | 1 + scripts/q8lOAWr2970sZeTw.js | 10 +- scripts/qAEZgtu5CrfUkxhx.js | 10 +- scripts/qDYJnO2JosPJrjpz.js | 20 + scripts/qITSQMvvkgj81fW1.js | 1 + scripts/qSwCYMMiIHmSV1X5.js | 4 +- scripts/qTk96NKh14YOIShf.js | 1 - scripts/qZ8TBagp2d4dJAqI.js | 1 + scripts/qaVde0sTuMBRi2nl.js | 1 - scripts/qhjU1QdsfqA8h5iI.js | 1 + scripts/qijgjcOBCDmhglRX.js | 1 - scripts/qmGwT929EiZ3lW2x.js | 8 + scripts/qmH61HmrEJcmQTiu.js | 3 + scripts/qmOt7h17hGAKqQe0.js | 29 +- scripts/qu194dVXm9Vx1TGk.js | 12 +- scripts/quPcuKsq2fcild4a.js | 6 - scripts/qxzhPtysAjPWspKf.js | 2 +- scripts/qyBmkCJo5606o4J9.js | 1 + scripts/qzGPJflVW7c2Ciim.js | 1 - scripts/rBAoyhzeU3Q8MVSk.js | 10 +- scripts/rCh3ltUrUMovd2Kc.js | 2 +- scripts/rF0Z3hTUUnSxL3Mq.js | 14 +- scripts/rJ8pspSekyDLkiqG.js | 1 + scripts/rX8FTinyTMj9WJri.js | 14 +- scripts/rXMylpnEtZpwou6x.js | 8 - scripts/ramav4ymrDDkPKK4.js | 6 +- scripts/ratP9ByLjQPiLlFK.js | 2 +- scripts/rdaMhMyHrJjQ6vVC.js | 2 +- scripts/re1UFtxvRRjpPB7Z.js | 4 +- scripts/red2bt4PGgIWAdTR.js | 14 - scripts/rgnGu3IQrS8Vj9Op.js | 3 + scripts/rlTvhnDpj4lzfusf.js | 1 - scripts/rly9iBUy8EX7NhQT.js | 10 +- scripts/rnioLwiJP7ps5Jwy.js | 4 - scripts/roKvPHDSpX4IV11C.js | 1 - scripts/roYVcP5Zqcsa8jVw.js | 1 + scripts/rpxQU26BU7nwjtqY.js | 8 +- scripts/rr4htuVq45onXdRG.js | 2 - scripts/rxB1AqfVMDqTRieE.js | 1 - scripts/s6eZXfZkC1My6EXl.js | 6 +- scripts/s7gJQdzuM3fz2zQK.js | 11 - scripts/s7kW3lm2eU5IPrLP.js | 9 + scripts/s9J1TUkpGdvSWvPO.js | 1 + scripts/s9KcytRE7i0cU06n.js | 5 + scripts/sB4KB9bT3nQhAoqG.js | 6 +- scripts/sKO8TcLIkCTnFvXu.js | 2 +- scripts/sNSfDBIA2k17hPYI.js | 2 +- scripts/sPvfYQEnyAYNpIhF.js | 6 +- scripts/sSMg43ZjnNmpytfj.js | 2 - scripts/sUHuj00IpoZ7Gd03.js | 1 - scripts/sWyO1DNaqb2EdHoW.js | 11 - scripts/sZwLitzwKBTaFca3.js | 2 +- scripts/sagKJM6oDFlw4ED2.js | 3 - scripts/sbK1a7txpSoXFzyB.js | 17 +- scripts/sgS9rblPkQB36C8S.js | 29 - scripts/shkBUtUuMPDKvFm7.js | 2 +- scripts/sjnoYbWpAugyDilW.js | 4 +- scripts/sm9d5lk6cM0OuUkf.js | 2 +- scripts/svCqdytEOtqFXCcs.js | 24 +- scripts/sx7Ikn8WW00gBFb4.js | 12 +- scripts/syBgPp7rOymCZejX.js | 6 - scripts/syRJs8P4aBFB5USD.js | 7 + scripts/syqqBkyP5tGqZ78t.js | 4 +- scripts/sz0PqS1kroMOzUZk.js | 18 +- scripts/t48hkacYdOpzWvK9.js | 2 +- scripts/t56mnblo1kv3gM1M.js | 1 - scripts/tCIT1a12Gt6k2ohA.js | 8 +- scripts/tDrs0aNIYmZPsOoS.js | 6 - scripts/tG1qGqzBLmAR3WHm.js | 15 - scripts/tGVEV6TLl310mFLP.js | 2 +- scripts/tHBlC7SpYiQ7SUGo.js | 1 + scripts/tNTO1LVN7JqHf4YN.js | 6 +- scripts/tUwP7TjrOOOnaCYJ.js | 8 +- scripts/tcZug8ehU6lyYBd9.js | 1 - scripts/tfdKU6nmvUtEjXE2.js | 38 - scripts/tg9N6aUo8WRPKj3H.js | 11 + scripts/tkZ8Ybqu518LQYEn.js | 2 + scripts/tn6SwmjAuNzqE6dx.js | 14 - scripts/tnE8LF6E3svIlLca.js | 1 - scripts/tnilBagajWM8UGQt.js | 1 - scripts/toSrgcvWq9b5eN0K.js | 2 +- scripts/tolkNN5P7oOC8GKZ.js | 11 - scripts/tpz88eQFTjWHdFL5.js | 1 + scripts/tuIsytv3jl2yAIb2.js | 1 - scripts/tyQLkRLk1AXB4g2u.js | 13 + scripts/u3olS2p7Ls1JXfAH.js | 2 +- scripts/u46KnlxCjP42F6QY.js | 10 + scripts/u4fKgGFEnOCnvvsv.js | 1 + scripts/uA5qaat5EXzkzltq.js | 10 + scripts/uACa6u4JLNMRgFlr.js | 2 - scripts/uCJk19rijMPRU8jg.js | 3 + scripts/uEVSUTTam4Z96JJ2.js | 7 + scripts/uLBDnWC3S0lRitbj.js | 8 +- scripts/uMvD2HWFNGqCmrBM.js | 5 + scripts/uRiAvo9fb3U7FIIy.js | 1 + scripts/uSwkYENTOcnfRrqA.js | 1 - scripts/uZeNKQ24fToJ7qtY.js | 15 + scripts/ucF4aiJ1gpDB333G.js | 2 +- scripts/ugL5IBB6R2yWyMWd.js | 20 +- scripts/uhCq5NwjQ2a2idPn.js | 10 +- scripts/ulXfbycWUu36vdmS.js | 7 + scripts/upfK6GM33qZCZjll.js | 1 - scripts/uwdQvZtzy2HVeEzx.js | 14 - scripts/ux3jaLpAUhZ5YqA6.js | 1 - scripts/v00nVCRKqqRvY28t.js | 2 +- scripts/v18mmwUmuKiVfwzQ.js | 2 +- scripts/v4CCxVaVGf9i8U7X.js | 20 +- scripts/v5xrDWcrTNFJkyQB.js | 84 +- scripts/v6LIG7EwWYALxCpP.js | 1 - scripts/vBqrydNzHmEHClqZ.js | 2 + scripts/vFUVWZ1l8wpTjLcx.js | 6 +- scripts/vJQRBxDfPwHens0a.js | 8 +- scripts/vNUGuypkhx2P5YIA.js | 1 + scripts/vS2D9QUslR7ZtXXm.js | 10 +- scripts/vSDMygIT9nNvEGWG.js | 2 +- scripts/vc4bELo0cWYoILfB.js | 4 +- ...IoVBinAZK8sMOqD.js => ve3RcfTi49rdYZU0.js} | 6 +- scripts/vejhfB9aI58iF1vr.js | 61 + scripts/vj3zArmX27vCxYJW.js | 1 - scripts/vn13U388mwquGN9y.js | 6 + scripts/vphNSTVxfZjApblV.js | 3 + scripts/vtXJI2VGlU9vODXz.js | 1 + scripts/vuzRRj5d9XdNYx3o.js | 2 +- scripts/vvdo1NxjmGVkmFCT.js | 24 - scripts/vzMxIDjRlQSxXtCW.js | 11 - scripts/vzSj3vvPryp02EVC.js | 8 + scripts/w4JKuTECFmu3YmTR.js | 1 - scripts/w4RuGIfseGoxXA3k.js | 10 +- scripts/w4zubIHP0XgMXsFe.js | 2 +- scripts/w8s2RUzA1jmyu7vy.js | 6 + scripts/wAntJhgb8Og5vJXh.js | 2 +- scripts/wBc8XvkAnv3j93vR.js | 11 + scripts/wFHjQyCR6Wzn6TeQ.js | 1 + scripts/wLg8LbPAPbQgUg0Z.js | 3 + scripts/wS6OIR3QN4mOUHn0.js | 12 - scripts/wb1DpSdIhSqYG5cp.js | 1 + scripts/wbM7tpw4TxvadcWm.js | 10 +- ...4LZnaX0MYgwrszj.js => we6JUzDvybekAbtn.js} | 2 +- scripts/weDTna1dLMwHsNlJ.js | 1 + scripts/whUSkaR1yem21bXp.js | 84 +- scripts/wsqNM4NHnwaAAQym.js | 11 - scripts/wyTCozh9qGTx6yK0.js | 4 +- scripts/wzkxiKjxVEeNS1di.js | 11 - scripts/x1Ecj6MXY94kpcQq.js | 9 + scripts/x2RLUUNB7BiIDYCP.js | 16 - scripts/x76tKw4L8dX00ikE.js | 2 +- scripts/x8XK2fzzXCnSwfjt.js | 7 - scripts/x9iKFYYc4Ocy8PTS.js | 10 +- scripts/xBpLQa7yBPczDMY8.js | 4 +- scripts/xEE0ymsaH2tn2M99.js | 1 + scripts/xJZKVGE04o84Gibo.js | 3 + scripts/xRd6oA1QWLVpfoBm.js | 6 - scripts/xS2su09zcza9du09.js | 8 - scripts/xUpKYT7BZCSmAfUy.js | 2 +- scripts/xVYVegD692CCv8Yl.js | 12 - scripts/xWPgIZOQLba5nZ23.js | 14 - scripts/xcny1zYAphdfrKv9.js | 1 + scripts/xgplXZMs459X7XXM.js | 21 +- scripts/xihniGjgqOhuaKWc.js | 16 +- scripts/xiyQSXozoLxt0MZs.js | 4 +- scripts/xkdQhZ9KKqmocNLO.js | 3 + scripts/xklncIMwQIespDxS.js | 8 +- scripts/xobGBJbgFjQCrwvq.js | 17 - scripts/xqWxV9w5ezBQdJkZ.js | 2 +- scripts/xvH4PKJasHcehOZz.js | 1 - scripts/y3F1K1sYBymPZCjz.js | 28 +- scripts/y7hk7prQ0lLTyv1Y.js | 1 + scripts/y9fwuiqn44t13WAq.js | 3 + scripts/yAL0YwZWVm8o1nxa.js | 2 +- scripts/yCgH3N9AurIiAv0i.js | 12 +- scripts/yDvxF9llUYwJg0sE.js | 6 +- scripts/yFMvxecXAZ6T2O0S.js | 4 +- scripts/yIGItnshXI4W46cp.js | 1 - scripts/yMMzZ7daCqRlGT3N.js | 2 +- scripts/yQziCK8G8I1RYkTj.js | 6 +- scripts/yRRzSKlcN3L7rEEe.js | 1 - scripts/yTmRoUstxHMso91c.js | 2 +- scripts/yXUPiWuQ5o0JBY4i.js | 1 - scripts/yYNBZjmBnytXpRn3.js | 1 + scripts/yatUu0cd7iKs50rq.js | 1 - scripts/ybxDG2ezvRx02LYx.js | 2 +- scripts/ynV7tz0OdCwlsQp6.js | 2 +- scripts/ynoHNXXCGRS6fTqF.js | 8 +- scripts/yvtF2t9aibxibAIM.js | 14 + scripts/yzN7ZNlgCiSVJqsU.js | 2 +- scripts/z5HfNUrHy5MS3K7a.js | 7 - scripts/z8W5PAwBR0PXY6ty.js | 3 + scripts/z8mwLihZQu0JtUHY.js | 26 +- scripts/zA6TDttpwMSMl7D8.js | 14 - scripts/zF1IKmobCB8ea58M.js | 1 + scripts/zFYCaGR0wbFWjl4T.js | 1 - scripts/zGwtyjTUBeSQ110p.js | 17 + scripts/zI5hXv2NLGWqnmDD.js | 4 + scripts/zIErcRiBmIZRbary.js | 8 + scripts/zIpl3SkWv8zzlr2D.js | 6 +- scripts/zK38Rl5t9zbFi4Se.js | 2 +- scripts/zL7ECmBBMAqf5Esn.js | 4 +- scripts/zLBLEDl3aGcAxai2.js | 16 - scripts/zR4WAjzXHTZuiu5G.js | 44 - scripts/zWZG8OmxqTpzHjFV.js | 8 + scripts/zXh8rgMxWoCLTxVd.js | 10 +- scripts/zY4ZjY7uyKIKMYmX.js | 8 - scripts/zadppy7FEbXvgUON.js | 12 +- scripts/zasFOZohkrdFIBwr.js | 6 + scripts/zdGAvfL7zJ7wpYxG.js | 10 +- scripts/zi8Z3NlwVj3IfgAW.js | 2 +- scripts/ziG9H5Kdb7xC3dFE.js | 1 - scripts/zjTEhJuLcFVkzory.js | 9 + scripts/zsiV6XEHlCNGLLPl.js | 1 - scripts/zsoTVkHe4nHY1M52.js | 2 +- scripts/zxG5KbliWE9xWNQD.js | 2 +- scripts/zzk2uRSFjFHB5kjw.js | 8 - tools/GPUCache/data_0 | Bin 8192 -> 0 bytes tools/GPUCache/data_1 | Bin 270336 -> 0 bytes tools/GPUCache/data_2 | Bin 8192 -> 0 bytes tools/GPUCache/data_3 | Bin 8192 -> 0 bytes tools/GPUCache/index | Bin 262512 -> 0 bytes tools/analyze-english-terms.js | 100 + tools/apply-sync.js | 157 + tools/apply-translations.js | 78 + tools/auto-merge-translations.js | 116 + tools/auto-translate-english.js | 219 + tools/auto-translations-applied.json | 251 + tools/english-texts-found.json | 2675 +++++++ tools/extract-translations.js | 216 + tools/find-english-texts.js | 216 + tools/generate-review-report.js | 103 + tools/generate-translation-report.js | 193 + tools/replace-review-scripts.js | 154 + tools/review-comparison.md | 1489 ++++ tools/script-comparison-data.json | 6591 +++++++++++++++++ tools/script-comparison-report.md | 713 ++ tools/scripts-replaced-list.md | 93 + tools/scripts-to-review.json | 186 + tools/sync-scripts.js | 196 + tools/translate-ids.js | 81 + tools/translate-scripts.js | 177 + tools/translation-opportunities.json | 1196 +++ wh4_fr.js | 11 +- 1329 files changed, 24138 insertions(+), 4397 deletions(-) create mode 100644 modules/inn/InnRoller.js create mode 100644 modules/inn/README.md create mode 100644 modules/inn/inn-init.js create mode 100644 modules/travelv2/TravelDistanceV2.js create mode 100644 modules/travelv2/debug-display.js create mode 100644 modules/travelv2/diagnostic.js create mode 100644 modules/travelv2/index.js create mode 100644 modules/travelv2/pathfinding.js create mode 100644 modules/travelv2/test.js create mode 100644 modules/travelv2/travel_data.json create mode 100644 modules/travelv2/travelv2-init.js rename packs/aides-de-jeu-fr/{001233.log => 001249.log} (100%) rename packs/aides-de-jeu-fr/{MANIFEST-001231 => MANIFEST-001247} (84%) rename packs/antidotes-and-remedes/{001235.log => 001251.log} (100%) rename packs/antidotes-and-remedes/{MANIFEST-001233 => MANIFEST-001249} (71%) rename packs/apothicarium/{001233.log => 001249.log} (100%) rename packs/apothicarium/{MANIFEST-001231 => MANIFEST-001247} (84%) rename packs/dons-de-rhya/{001233.log => 001249.log} (100%) rename packs/dons-de-rhya/{MANIFEST-001231 => MANIFEST-001247} (84%) rename packs/plats-dauberges/{001233.log => 001249.log} (100%) rename packs/plats-dauberges/{MANIFEST-001231 => MANIFEST-001247} (83%) rename packs/tables-des-traductions/{000876.log => 000892.log} (100%) rename packs/tables-des-traductions/{MANIFEST-000874 => MANIFEST-000890} (84%) create mode 100644 scripts/07tvKnPT8ICtv2us.js delete mode 100644 scripts/0FNOq4J1AdPd2A0q.js create mode 100644 scripts/0H2syk6qc0sCY0pj.js create mode 100644 scripts/0IAc5VFR2ogXOaGE.js create mode 100644 scripts/0NAD1LNcVyAZ1fC7.js create mode 100644 scripts/0PzfGjGhHQbxEwlb.js delete mode 100644 scripts/0YKQGbsKdHSmYGE7.js create mode 100644 scripts/0amHqfjTRp5ff6Op.js create mode 100644 scripts/0hAbiNR1nFkpFMRz.js create mode 100644 scripts/0hgTyeaEhMBLwzUn.js create mode 100644 scripts/0kUalAsb4OhtYbaJ.js delete mode 100644 scripts/0mrUnxzufYgsR0Ph.js create mode 100644 scripts/0uUxvBLJC76WIIBC.js create mode 100644 scripts/0wR0LWpfhLFA240I.js create mode 100644 scripts/0wmIC2MssUX6LW3N.js delete mode 100644 scripts/1A87vGLh2PXH0rG0.js create mode 100644 scripts/1Du4e27M8WgP2iui.js delete mode 100644 scripts/1LDSzXeO5CzXgTOc.js create mode 100644 scripts/1PPh4vHd5sPKtudZ.js create mode 100644 scripts/1UvL0XA1EpQtjDNn.js delete mode 100644 scripts/1kB2su7hLRYDhZ2H.js delete mode 100644 scripts/1mNkLj9JYNr3ofC6.js delete mode 100644 scripts/1wKVvxRTHOyV4Qdv.js create mode 100644 scripts/20fvE9nJmcfGYVzw.js create mode 100644 scripts/22PMOW0G5MWiBQmg.js delete mode 100644 scripts/22bW97lkvCqisfHX.js delete mode 100644 scripts/23HgjCB1oecxANvA.js delete mode 100644 scripts/2AdSBXw7IwCiqawQ.js create mode 100644 scripts/2EAYX5G9Fh3HJwiP.js rename scripts/{KTBVDHUndI3qDOXM.js => 2Ej6LUqn8frTRURo.js} (56%) create mode 100644 scripts/2IPTF0akWw9y48br.js delete mode 100644 scripts/2NLINicPQWbuvp2n.js create mode 100644 scripts/2S6XlGCdRlXuaaVw.js delete mode 100644 scripts/2VNnVrtktdGUqXEV.js delete mode 100644 scripts/2W9uMTT6iJhfQ044.js delete mode 100644 scripts/2WSN306tL4apjRtD.js create mode 100644 scripts/2XXqxAF5s5Sws6qj.js create mode 100644 scripts/2XaJNYUMQAmSOsqi.js create mode 100644 scripts/2Yh4vQm0ZJukRH1x.js delete mode 100644 scripts/2hzDv8ROulOe1elK.js create mode 100644 scripts/2kRwCc31fuZgrsy8.js delete mode 100644 scripts/2sDH6RvoOAR40oqH.js create mode 100644 scripts/2uyajbon5QX1CewS.js delete mode 100644 scripts/2vTVR0quRZQtjNfQ.js create mode 100644 scripts/2yW0kuwLfgRzJR2S.js create mode 100644 scripts/3CeKfDcMEVgQlcXm.js delete mode 100644 scripts/3JEzEzF1SeYA9lsV.js create mode 100644 scripts/3KH6OE7L7uJESI2Z.js create mode 100644 scripts/3SuLF6SImYWEHMo2.js delete mode 100644 scripts/3hfMQkUKYI4rCuBy.js create mode 100644 scripts/3ixqbsEMfSSTzAXU.js create mode 100644 scripts/3j8yybMaAZSwzxIE.js create mode 100644 scripts/3na3lnAt3bfysvcD.js delete mode 100644 scripts/3plV9WFqs2prfAdp.js delete mode 100644 scripts/3sfD1nedXLzuYoXJ.js create mode 100644 scripts/42UATqzohYML6a9t.js delete mode 100644 scripts/454x3Q95pLvZm0Kx.js create mode 100644 scripts/4AO7Fowek5sSmE4g.js delete mode 100644 scripts/4FGKZk2f0xrmIDnp.js create mode 100644 scripts/4KYraZSHAEYmL6xx.js create mode 100644 scripts/4Q3Mp04O2sMgKv9x.js delete mode 100644 scripts/4ZR7p8G3OzOBWx0L.js delete mode 100644 scripts/4fnTKgl0HW9ZrWyJ.js create mode 100644 scripts/4iu3CmOI19soOYuA.js delete mode 100644 scripts/4iuTz0uInAfMaoGl.js create mode 100644 scripts/4jLe2XZQVUB8LztP.js delete mode 100644 scripts/4pQW4WLyhjbZR85k.js delete mode 100644 scripts/4rb7LfMq9CTnlrpn.js delete mode 100644 scripts/52mwb33mGrQjq89B.js create mode 100644 scripts/55eYGvSXetDMK80S.js delete mode 100644 scripts/5Fe1ELaS6Gnvy0Cj.js create mode 100644 scripts/5GHQxfxlmjyt1fNq.js create mode 100644 scripts/5GP9UJMvBZv6kWtI.js create mode 100644 scripts/5KIozV7HxyGvskeD.js create mode 100644 scripts/5KVslRqhqzuFLyk4.js create mode 100644 scripts/5XAYjiq1i4M7Ky7j.js create mode 100644 scripts/5gPAT5Bb2FvQwYNQ.js create mode 100644 scripts/5lpR78CLhYH6Mjnu.js delete mode 100644 scripts/5o1XiceC4rutjMms.js delete mode 100644 scripts/5sI9iYh5j2nx2XyT.js create mode 100644 scripts/5uokSqQsjgMapnCi.js create mode 100644 scripts/5z5nGwZC5RIwokev.js create mode 100644 scripts/6136BMmiGLwZ16H1.js create mode 100644 scripts/64aJznxPMUHAuf7F.js create mode 100644 scripts/6A6ddQDJo23oOWtK.js create mode 100644 scripts/6AsCMHZ4IYPq7Uxf.js create mode 100644 scripts/6HfCvw24X6oEe2vn.js delete mode 100644 scripts/6JrUjs3g5x6bFnj3.js create mode 100644 scripts/6LMzIdmCSYctgmGx.js create mode 100644 scripts/6P2QNPKfwQ1xwxZT.js delete mode 100644 scripts/6V3qHON3mcerlBlB.js delete mode 100644 scripts/6ZS1rQLkNvMDO0Fp.js delete mode 100644 scripts/6fElmBxTjdAaubbK.js create mode 100644 scripts/6frithfMs7Nbv0IZ.js create mode 100644 scripts/6maNAmREdataXmo4.js create mode 100644 scripts/6nA5LPXneAahHX2W.js delete mode 100644 scripts/6qUKKep5vhFYmo1J.js delete mode 100644 scripts/6tjn0RH4VyOPFneS.js create mode 100644 scripts/713v1T8HNste94pr.js delete mode 100644 scripts/715G1Bf0haOHvmYQ.js delete mode 100644 scripts/7Ck0fkzE4WQ62qVe.js delete mode 100644 scripts/7H6wYyJ6cpaoc2QQ.js create mode 100644 scripts/7T3iXgrL72fea67C.js create mode 100644 scripts/7UUS0gX2Pbi0HHiz.js delete mode 100644 scripts/7VAhXHov6pR1SkgD.js delete mode 100644 scripts/7e8FgQUF2oANANmx.js delete mode 100644 scripts/7szLG4VALuuy1cPm.js create mode 100644 scripts/7y89OcMmGbjRMgTg.js delete mode 100644 scripts/84IB8CWa55XzoAkv.js delete mode 100644 scripts/86ivOsBQAuu0UmFg.js create mode 100644 scripts/873KaarAnJ2qf1r2.js create mode 100644 scripts/8BCzpjFU0GeA17Wp.js delete mode 100644 scripts/8ByuHnUZ4RNTdGVv.js delete mode 100644 scripts/8N3Uqjq1ZxPxo4pk.js create mode 100644 scripts/8R7O63iC0yANtkJ9.js delete mode 100644 scripts/8RNziYGGb4sp3BGQ.js delete mode 100644 scripts/8ZAUBSH9CM9OTpTL.js create mode 100644 scripts/8pbVGsVFlDebu2Ac.js create mode 100644 scripts/8qOGotfGFA0HYQ6W.js create mode 100644 scripts/9AMoFRATTAfdKlKN.js delete mode 100644 scripts/9EVj4bmZJex45Mt7.js delete mode 100644 scripts/9JnPK1jNUEso7Pv8.js delete mode 100644 scripts/9RFoasDcFnYZ1txR.js create mode 100644 scripts/9eL5JbQQmCY030ba.js delete mode 100644 scripts/9fK07tqqZyPg7dpx.js create mode 100644 scripts/9fNHye2N2DORR0A3.js create mode 100644 scripts/A3XrFB7SvV2vcg1a.js delete mode 100644 scripts/A3fvV69RS1lYgma0.js delete mode 100644 scripts/ACgKpKrEEHoNGG0h.js delete mode 100644 scripts/AHZ8f7dfN8jNsYk6.js create mode 100644 scripts/AI7iVbQMPzXMP5on.js delete mode 100644 scripts/ALuPRzf85dmkEfLo.js delete mode 100644 scripts/AMxezwtYnWCF6Oza.js delete mode 100644 scripts/AV2Kj6jgmIc45zKi.js create mode 100644 scripts/AYEiCx2Es3QtMY28.js create mode 100644 scripts/AvRbjpBfTX3mn3bz.js delete mode 100644 scripts/B6ZbY3bxTPg6nCng.js delete mode 100644 scripts/B950b0XnIUYCdVwu.js delete mode 100644 scripts/BAOv7moTxsKlT3JS.js create mode 100644 scripts/BEEvU2hE5ymcNOH9.js delete mode 100644 scripts/BNJRV66jlrp51qZK.js create mode 100644 scripts/BY4feKp244bQOWlB.js delete mode 100644 scripts/BtyFhdGMKiMamGhM.js create mode 100644 scripts/Bu0KUpGvfmFF7LJs.js create mode 100644 scripts/C5NIkJwXL85Qbpe7.js delete mode 100644 scripts/CCK1iIfPmB398ziT.js create mode 100644 scripts/CUBpU1imu2eRS06C.js create mode 100644 scripts/CbfUDhUr5R4UnPPq.js create mode 100644 scripts/CcR9i3UzUXx7ieep.js delete mode 100644 scripts/CiFeduksZJ6PRulx.js delete mode 100644 scripts/CkE8NZOhzPkuRrKJ.js create mode 100644 scripts/Cri5Q7ux6ni7zNVS.js create mode 100644 scripts/CxsKWGwQqtAaQdzX.js create mode 100644 scripts/CynUM4ZEiB9QbNQq.js delete mode 100644 scripts/DTiHS6RfwhF4THbf.js create mode 100644 scripts/DUFSlDO38fQWclBE.js create mode 100644 scripts/Dk4VF4UXSMK5SaVP.js delete mode 100644 scripts/DsE6rTSzxEn6uWMz.js delete mode 100644 scripts/DuM5l2Yb4bdvDeaG.js create mode 100644 scripts/DvJvHsjgkzIfFaks.js create mode 100644 scripts/DxM3NRgQYc7moMPc.js delete mode 100644 scripts/DxQnamsb2AuW0p2e.js create mode 100644 scripts/Dy67jQmeGwHwV9NY.js create mode 100644 scripts/E0HHBSdQR3oH8KaL.js create mode 100644 scripts/E33J9JixYVGxaktQ.js delete mode 100644 scripts/E4CHDe1xfmcV3oGv.js delete mode 100644 scripts/E6DMqfDeczqmVMFV.js delete mode 100644 scripts/E7D4bxz8gy4e1wL7.js create mode 100644 scripts/E7ksDLhihkJN4Vpt.js create mode 100644 scripts/ECUIJLcKt2TCSFS3.js delete mode 100644 scripts/EDAMEOzdBfkoKHxP.js delete mode 100644 scripts/EGWF3LHav3e2zFL4.js create mode 100644 scripts/EHfOyVwYhFGWNjw1.js delete mode 100644 scripts/EQ5dtGW5kQhtAb87.js create mode 100644 scripts/ETfmit2Cx0Py77ai.js create mode 100644 scripts/ETrfkHI0B9YjJqM2.js delete mode 100644 scripts/EU5j0hnDTG9Z6d1e.js delete mode 100644 scripts/EVBSHEC5nmmj2X41.js create mode 100644 scripts/ElHBPMMx37SZMvOC.js delete mode 100644 scripts/EmXwcuycEH8slEn5.js delete mode 100644 scripts/EmmG49pMOPHRwDzR.js create mode 100644 scripts/EsZx8cY34quYG4MQ.js delete mode 100644 scripts/Ew3C2WmLCtc1KT46.js create mode 100644 scripts/F7BHb4a7fqWMnYxH.js create mode 100644 scripts/F7E0Dr3sT7kkc2p7.js create mode 100644 scripts/F8Bmh6w01YvKsBIO.js create mode 100644 scripts/FGIHAkNdYXbTnewG.js create mode 100644 scripts/FKEH7DeqU0FH4dkk.js create mode 100644 scripts/FPQp6XfbUH1BMafj.js delete mode 100644 scripts/FXuyiJoXdAh6WhRK.js delete mode 100644 scripts/FYUPfYyTYZkxRLFT.js create mode 100644 scripts/FbfJjYUyp0ArtZMb.js delete mode 100644 scripts/FkTwk8hfHpRLbAp2.js delete mode 100644 scripts/FmLx9pwOkzqqU7Ph.js create mode 100644 scripts/FttdVBQiNssDAARh.js create mode 100644 scripts/Fu8DTvSgLufcB5mr.js delete mode 100644 scripts/Fvlc4RkeF4dHjW3m.js create mode 100644 scripts/G9ZPojp8qdjiXKZ5.js create mode 100644 scripts/GNgMG95jfabBeIwy.js delete mode 100644 scripts/GOq4TcnWbfyfCo2V.js create mode 100644 scripts/GYhPhHIVrhx4pkgF.js delete mode 100644 scripts/GZFsuynUhgZqwTGo.js delete mode 100644 scripts/GbPEy22VuCNzlNv2.js delete mode 100644 scripts/Gc8S5TYlVdV8NnOT.js create mode 100644 scripts/GePFbu5kp2ymGYEQ.js create mode 100644 scripts/GjUD5L4h8FXGVgGQ.js create mode 100644 scripts/Gsilp71BmIyHHce6.js create mode 100644 scripts/GtfHQA9T1ip463le.js create mode 100644 scripts/GuSIY4Zqhc68qVEH.js delete mode 100644 scripts/H2CJvApKMnfGNNoo.js create mode 100644 scripts/H8jDtK1Ewn4hL3A1.js delete mode 100644 scripts/HASsi6wYHVALExWq.js delete mode 100644 scripts/HKhyn0kijKfzW6cw.js delete mode 100644 scripts/HMC6hPND9DWLFfZE.js delete mode 100644 scripts/HUKzssLxeQo1wbx9.js delete mode 100644 scripts/Hcpn1gU58DIKIhty.js delete mode 100644 scripts/HdTuY2IGhdlMDOy3.js delete mode 100644 scripts/HfCxNd7mFGZH4s9Y.js delete mode 100644 scripts/HfZAQWoY8n3clLlo.js create mode 100644 scripts/HgzIi6m6dkXbVWHp.js create mode 100644 scripts/Hi005w1Ul17Q8Uty.js delete mode 100644 scripts/HiMBS6GeOwEydWYN.js delete mode 100644 scripts/HrOBAXsEX073ReKl.js create mode 100644 scripts/I2I4ZJjN3EUSow0t.js create mode 100644 scripts/I67tdJctEqXSQPE0.js create mode 100644 scripts/I79D8V8OFzMCtL40.js delete mode 100644 scripts/I7ieW0hNYvvX0KFg.js create mode 100644 scripts/I8JS4z90PtWIG2nb.js delete mode 100644 scripts/I9QAPKbaXwMMMBT4.js delete mode 100644 scripts/ID8mCcjkl7PCQhDq.js create mode 100644 scripts/IDvpVMkR2HXoNpPp.js create mode 100644 scripts/IEDJHIYaZLhmrK4X.js create mode 100644 scripts/IFXsTRAVDUeVvcRc.js create mode 100644 scripts/IM8nRo6Jx2I8RJ0L.js delete mode 100644 scripts/IPPDvZdE8kn3H9z7.js delete mode 100644 scripts/IR5URcjnCuWBFMoN.js create mode 100644 scripts/IXXrxNSLqXEqtuDU.js create mode 100644 scripts/IhoCoul5okDx0jBa.js create mode 100644 scripts/IkVcIRmmgQjsBUUf.js delete mode 100644 scripts/IsLAvY9ikR1cOJWw.js create mode 100644 scripts/IurWrdbjsmMtTWuq.js create mode 100644 scripts/IuxMr6SFdJhqFtVD.js delete mode 100644 scripts/J0IWUhxada2ONowP.js create mode 100644 scripts/J8k4ahQdZhXDfU1l.js delete mode 100644 scripts/JBoKPBr27C3PMoSD.js delete mode 100644 scripts/JEbs0WlqhKNDOo5A.js delete mode 100644 scripts/JQruHprM5R5vZ9DA.js delete mode 100644 scripts/JeThJbOf6Xmbtgo1.js delete mode 100644 scripts/JgCcgDVZX54slrWx.js delete mode 100644 scripts/JhCMYHHYA860Kka8.js delete mode 100644 scripts/JibNjuQrJRnY0yf9.js delete mode 100644 scripts/Jk7OHqx06oCUVAzb.js delete mode 100644 scripts/JstrA46EYSEuRSy5.js delete mode 100644 scripts/JyTxUG5dNW670Sf7.js create mode 100644 scripts/K54XxyNJa5PIWDEH.js delete mode 100644 scripts/KPQfupKuaf4LCv4R.js create mode 100644 scripts/KSGIwJxR0qn10RLX.js delete mode 100644 scripts/KSjsDlsx3DD6cT16.js delete mode 100644 scripts/KUx0deSF3xNzMucL.js create mode 100644 scripts/KkE8DtsTDYDyk1gN.js delete mode 100644 scripts/KkjkYAGI9Em1NgiQ.js create mode 100644 scripts/KxIRA51YA0rktcSP.js delete mode 100644 scripts/KyUPYV1RXJxPOfyA.js create mode 100644 scripts/L41ao2Mw1miE0yri.js delete mode 100644 scripts/L9eAtDyaoHvqryk4.js create mode 100644 scripts/L9pUSX8Z4y2zIAn7.js create mode 100644 scripts/LNxKkPI37im0bSjy.js delete mode 100644 scripts/LeKLtvEDrWh4yHsx.js delete mode 100644 scripts/Lg1oRg4oNRvucsvi.js create mode 100644 scripts/Lh3Ccqx3utIu6w0d.js delete mode 100644 scripts/LjfScVGBf0Egr70E.js delete mode 100644 scripts/Lpv2N9LK9loeumiW.js delete mode 100644 scripts/Lrb1S2aK7SFVD0C7.js delete mode 100644 scripts/Lu27iXtJVkrJ8bOx.js delete mode 100644 scripts/M0XhKnWjG14pk3iH.js delete mode 100644 scripts/M2FshTX4PjKFVU8y.js create mode 100644 scripts/M6sb1yAdEAMlIvac.js delete mode 100644 scripts/M9VgeYGiUO97ZUW4.js create mode 100644 scripts/MB058H6OslhfBmxR.js delete mode 100644 scripts/MJB6WbZSF6Briz30.js create mode 100644 scripts/MKxYbHOrv0UuA7JB.js delete mode 100644 scripts/MMv2B8TH7jxNCtdl.js delete mode 100644 scripts/MMx8f5uJ15XOgJGg.js create mode 100644 scripts/MPK7U4HLmIAsjdqs.js delete mode 100644 scripts/MSJWJEUrX7ZmMvAD.js delete mode 100644 scripts/Mp8UjuCLa9jdzhBS.js create mode 100644 scripts/Mqbjr3t7IXwFnfCv.js create mode 100644 scripts/N6E9Jsd8n2ubCfz8.js delete mode 100644 scripts/N9kA46ZQ9LiRjy6T.js delete mode 100644 scripts/NDvNGATDM2xPFJK0.js create mode 100644 scripts/NEKLTgJJsayC7tpF.js create mode 100644 scripts/NMZ3Fb164tUfwChF.js create mode 100644 scripts/NTFpkiGyBpOtrV0s.js create mode 100644 scripts/NX9fApO15NQuTipW.js delete mode 100644 scripts/NkqtQaLEGYst0PUO.js delete mode 100644 scripts/NnA4zpuO6iUXKhH7.js delete mode 100644 scripts/NnDq4miIPNEtZUWb.js create mode 100644 scripts/Np25JqEiaoqerEk8.js delete mode 100644 scripts/Np8P8IPT2GYlrh6G.js create mode 100644 scripts/NqFvdCKDLqIXaE9m.js create mode 100644 scripts/Nuth9S5UHIhpEuIC.js create mode 100644 scripts/NvaPNfZt5d9RqKSE.js create mode 100644 scripts/OBF6r2CsMOEokAsS.js create mode 100644 scripts/OF4sSVOvHoKuPk7L.js create mode 100644 scripts/OFViRemr1cpnO3af.js create mode 100644 scripts/OYLqLl6vikJD8flg.js create mode 100644 scripts/OYRUSP7Q0Je0jdCY.js delete mode 100644 scripts/OeCgX3hIsfLfmGvC.js delete mode 100644 scripts/OgSI0Z6SHjYuqKIz.js create mode 100644 scripts/On1itZhp0AOzNyyc.js delete mode 100644 scripts/OqLKL0PiCvYH2QxW.js delete mode 100644 scripts/P29tT1eMMdAw3CPF.js create mode 100644 scripts/PGHvFHBIygB5pnWT.js delete mode 100644 scripts/PMISUsaEDBA7D3od.js delete mode 100644 scripts/PMNjdEAusVBfam09.js delete mode 100644 scripts/PVjaKAHTKDA0rA9J.js delete mode 100644 scripts/PdClojv7yNgQpOUc.js create mode 100644 scripts/PjOi61gB2nSYooLs.js delete mode 100644 scripts/PoNnT5EqvLj2r5yf.js create mode 100644 scripts/Puv2wLrSVe6b1jLf.js delete mode 100644 scripts/Q4EQgP4gZR8TTm7S.js delete mode 100644 scripts/Q5gh5Y9dCdclcwsD.js delete mode 100644 scripts/Q9EmlWmuDac83cJw.js create mode 100644 scripts/QBBrzcSAe8QqE4WP.js create mode 100644 scripts/QKt9ZYpVpznncfJ1.js create mode 100644 scripts/QLBxcP85duX1Z7LX.js create mode 100644 scripts/QLUaOkwuSPvBp7jU.js delete mode 100644 scripts/QPVVDPcJ4Xi5FmQl.js delete mode 100644 scripts/QQ2gHThZHdO4yLLX.js delete mode 100644 scripts/QfTBRGXVfwQSghmd.js create mode 100644 scripts/R3OfRdi6xv0e9mzB.js delete mode 100644 scripts/RDtJXji3hgcKnEBk.js delete mode 100644 scripts/RHyBLYT5oHf7EPnG.js delete mode 100644 scripts/RNr9CwyvLhlnwD2h.js create mode 100644 scripts/RRK91ySi5SzYCRvy.js create mode 100644 scripts/RUpVgB0czqg95K1Q.js create mode 100644 scripts/ReJpL0IVesKUbXgj.js create mode 100644 scripts/RgNdS87nO7RVawuw.js create mode 100644 scripts/RlVvlmhOfscaJqCd.js delete mode 100644 scripts/RprZWlnopSqZt7KZ.js delete mode 100644 scripts/RrchOMpEdIvceJxl.js create mode 100644 scripts/RyQtuiRykUCQ6Xag.js create mode 100644 scripts/S1SQe0Do7ZcuNV5j.js create mode 100644 scripts/SK8paBvnvc5YLFI1.js create mode 100644 scripts/SKn61f2ykhzuwMdw.js delete mode 100644 scripts/SNjG7IvgQzvCGczR.js create mode 100644 scripts/SjDNjLBGsd9fYObo.js create mode 100644 scripts/SlrslcNdnYONcSH3.js create mode 100644 scripts/SlzPn7ONIKab9URj.js delete mode 100644 scripts/SrCHfOJFZwDickqa.js create mode 100644 scripts/SreM9Jyj2XZjoezH.js create mode 100644 scripts/SwliIjjjFtZMnJH3.js create mode 100644 scripts/T0KBl8iEkcPq08RI.js delete mode 100644 scripts/T3RfSt3VMEat3iDD.js create mode 100644 scripts/T4JEEDYCEIUbVHv4.js create mode 100644 scripts/TCgEBuMPPd5SLAsc.js create mode 100644 scripts/TIoUbjOtj7PTK2t8.js create mode 100644 scripts/TKjBb75exjae87fa.js delete mode 100644 scripts/TOyQLrugFGzwc5nY.js create mode 100644 scripts/TSsHcn4EDulD03RU.js delete mode 100644 scripts/TU2xjbJ0zFtytF3J.js create mode 100644 scripts/TXce477AiXHKbepk.js create mode 100644 scripts/Td8M5K1P92GbM2IA.js delete mode 100644 scripts/TdjlJro0RRVSh8g8.js delete mode 100644 scripts/ToKlHDAjJOsC51ag.js create mode 100644 scripts/TpgK2aAe93ui3Rbs.js delete mode 100644 scripts/Tq45Nd8J3eTvHT41.js delete mode 100644 scripts/TrIYdcG3jDER4WgY.js delete mode 100644 scripts/TwwKxFjK6TNGKbRB.js delete mode 100644 scripts/U4A8FDNmwBGTuQZO.js delete mode 100644 scripts/U78c4oUjKwyUu6jT.js delete mode 100644 scripts/U7lRf56BFaTfsC6B.js delete mode 100644 scripts/UC6G3pFQwzUhrw6F.js delete mode 100644 scripts/UTlgF4azrGQZsoDv.js create mode 100644 scripts/UUHQRPRrrRSr9MIA.js delete mode 100644 scripts/UaImulhbPURkLJg2.js create mode 100644 scripts/UfkysrAftCs09Fct.js create mode 100644 scripts/UlygtNPSDlWPIFCI.js delete mode 100644 scripts/UsAHQecRlWL5PhP6.js delete mode 100644 scripts/UvycHOjSPm5Zv9KJ.js create mode 100644 scripts/UxVfVoH7cbC9ESDr.js create mode 100644 scripts/V0b4yLTawjCnm9ke.js create mode 100644 scripts/V4PcjtHde941wv6J.js delete mode 100644 scripts/VAs1nXvicdQK18Do.js delete mode 100644 scripts/VCnNWmRBH28Rx0JH.js create mode 100644 scripts/VGuZMIR1lE8I1F1y.js delete mode 100644 scripts/VNOKTzCrFbZ6PJUj.js create mode 100644 scripts/VOc9sKag2Vy4vGGZ.js delete mode 100644 scripts/VQaC6ynouW5EQCbC.js create mode 100644 scripts/VRDS4lkwSAzbtvm4.js create mode 100644 scripts/VTzpExK3QSCaFQPf.js create mode 100644 scripts/VbI0Al6rJfypV3qY.js delete mode 100644 scripts/VbL0TgaBAmYjrezZ.js create mode 100644 scripts/VcE8Hie2jbpuyuM3.js delete mode 100644 scripts/VlFUDaKUYoBYKYn0.js delete mode 100644 scripts/VlHuDIAvPr8JM1P5.js delete mode 100644 scripts/Vns6WrafVq8NjX7t.js delete mode 100644 scripts/VqTrKPtxv9hpn0Hr.js delete mode 100644 scripts/VurA2XNqC0d9U49C.js delete mode 100644 scripts/VzO0ZDcTWvaBn4vm.js create mode 100644 scripts/W2rdTwflbUVxFyfd.js create mode 100644 scripts/W5qtA7Ul5cOj18Nd.js create mode 100644 scripts/WOpRJluHKER1MdgI.js delete mode 100644 scripts/WTRYAEzwxRuGENyI.js create mode 100644 scripts/WaeL2I8VVJmBBKHk.js create mode 100644 scripts/Wh1VV3javfzcV3bP.js delete mode 100644 scripts/Wqff6ICWYzvLDYC8.js create mode 100644 scripts/WsN2R1qOzuLa2qyB.js create mode 100644 scripts/WtbSIghR0q4euE7J.js delete mode 100644 scripts/XClTZOjuhcxWLF51.js create mode 100644 scripts/XPpHYTTT0hqYuSfa.js create mode 100644 scripts/XSbQKrrbjsN15Zp9.js delete mode 100644 scripts/Xf4FcZ4ZLdWmOXBa.js create mode 100644 scripts/XfSxXatjEYlPEbaK.js create mode 100644 scripts/XjUXxUA0hbwjUatW.js delete mode 100644 scripts/XuFxKPYheYF4WMmQ.js create mode 100644 scripts/XzJotwVUIuQu6b0G.js create mode 100644 scripts/Y27MmN5KFw45d5vQ.js create mode 100644 scripts/Y43z8YCohJMA8Ia7.js create mode 100644 scripts/YDANERWYHyJ2ACeo.js delete mode 100644 scripts/YDqpKJVy8ijEKdLX.js delete mode 100644 scripts/YEBw2CzHYxsTpTy5.js delete mode 100644 scripts/YFSgWRXel0bWE3EE.js delete mode 100644 scripts/YMaxpXnml01bLGpO.js create mode 100644 scripts/YdiQFkm8j48Xs7gI.js create mode 100644 scripts/YfRPSgJjvHvl50HW.js delete mode 100644 scripts/YhhiWEQbox3WZA3Q.js create mode 100644 scripts/YrXhk2YJaWSChMhp.js create mode 100644 scripts/YsUdMhQ2AArcJIqy.js delete mode 100644 scripts/Z6OmmC0irJzxSnMH.js delete mode 100644 scripts/ZLspFT2I3ZdWWr2H.js delete mode 100644 scripts/ZNW3ubbKIYXAyE48.js create mode 100644 scripts/ZURBQYTYcP5jci5k.js delete mode 100644 scripts/Ze9E2zR1GFGWGMVH.js create mode 100644 scripts/ZfgPAtNKA5KrETer.js delete mode 100644 scripts/ZgF1sYdbAKaOuHmK.js delete mode 100644 scripts/ZingXNvYyZ2BEvfY.js create mode 100644 scripts/Znz4g56UH23SSCg7.js delete mode 100644 scripts/ZvbBM4gTJHPdU8jU.js delete mode 100644 scripts/a0YU3whUm16wGBNu.js delete mode 100644 scripts/a4Aza4a9v8JMU8dC.js delete mode 100644 scripts/a6gacHsvgwtsIFSQ.js create mode 100644 scripts/a81IMxqmMtHgYnIF.js delete mode 100644 scripts/aAvJrAKLzXhS9qN6.js create mode 100644 scripts/aFwNs7TMVF90i9JF.js create mode 100644 scripts/aPZiVhgwR0Xql6AM.js create mode 100644 scripts/aRvJUcgYqhRmmWYC.js create mode 100644 scripts/aedzdFyjI80Ah3qC.js delete mode 100644 scripts/afdmOvPGMpEdZvCb.js create mode 100644 scripts/b4CIeJF2L4E1qikC.js delete mode 100644 scripts/b5prg1FLjCAvBjLy.js create mode 100644 scripts/b787rIfyHF5LnALd.js create mode 100644 scripts/b8XFmEUu1d2YNQ7F.js create mode 100644 scripts/bDS62ctjfnTU4xIu.js create mode 100644 scripts/bNhpJPWwoHLq68zD.js create mode 100644 scripts/bT4gLrE3W36DIP4k.js create mode 100644 scripts/bgLeMqihLya2iobP.js delete mode 100644 scripts/bh2qDCKiAIWM0UPi.js delete mode 100644 scripts/bhXUW7IJtEaUGAoV.js create mode 100644 scripts/bidoOQSAofp4NPf6.js create mode 100644 scripts/bkbWgG9COvZWZbAX.js delete mode 100644 scripts/bwx9wuEOJPF7btD1.js delete mode 100644 scripts/c3KA1knL2NYNUEww.js create mode 100644 scripts/c7HTWfg3CbjN9e1M.js create mode 100644 scripts/c9xxdOCaQSwooK8n.js delete mode 100644 scripts/cAKqUBuJBsU85erO.js create mode 100644 scripts/cC7jjJDSVPi5BJUq.js delete mode 100644 scripts/cTYNaKbepMwqYsZ8.js delete mode 100644 scripts/cV9JiAgUPOeUHKnS.js create mode 100644 scripts/cW8ZuQ9YIUG5uvhf.js create mode 100644 scripts/cZVrzR4fxV86lxNW.js create mode 100644 scripts/cipTp0OS2bfKLjZS.js create mode 100644 scripts/clO7l82UYMJ4XVks.js delete mode 100644 scripts/cqYgZQk1C3kMARy5.js create mode 100644 scripts/cxgGYbuiXM3NxIOI.js create mode 100644 scripts/czZI8S09By0Mqlsr.js delete mode 100644 scripts/dAMtbn3uQwF8KpKU.js create mode 100644 scripts/dEx8xfG7VLbN69Ha.js create mode 100644 scripts/dMeSZGdvw7zlnUKh.js delete mode 100644 scripts/dSmRhZ6o1bUcOSF9.js create mode 100644 scripts/dVF5ywnzeiZQx9ke.js delete mode 100644 scripts/dXGosSxdoYbET2O8.js delete mode 100644 scripts/dfEgat3jz4EtWszH.js delete mode 100644 scripts/dfnCK8jCPXNLM7Gh.js delete mode 100644 scripts/dkiNmwFXztIVbuxg.js create mode 100644 scripts/dr9VJKGY3TeGuzXj.js delete mode 100644 scripts/dsXGavzXLerXR8Xg.js delete mode 100644 scripts/dtFvpY96RPzNnphq.js delete mode 100644 scripts/dwSgcFxKN3S0hLJL.js create mode 100644 scripts/dxt3p07po06J9fO1.js create mode 100644 scripts/e0eKVlOSk3Vw1HiD.js create mode 100644 scripts/e2JlsKoW8oaFjn6Y.js create mode 100644 scripts/e3dBud1keWyhw6nw.js create mode 100644 scripts/eC61buStv62b3sN9.js delete mode 100644 scripts/eGQAyzCFZAEQhyJl.js create mode 100644 scripts/eIiiDhJohYez26qY.js create mode 100644 scripts/eLxdRg8LX3AdYSEq.js create mode 100644 scripts/ePv2YYcr4lz3AkGu.js create mode 100644 scripts/eRVVn8YtU8nnOW2q.js create mode 100644 scripts/eTHJSRutCEpuyPkR.js create mode 100644 scripts/eViKAYOtuaOqo6c7.js create mode 100644 scripts/eWvHTkxsjKuH2IKm.js create mode 100644 scripts/egc02UIueJgEQMqx.js create mode 100644 scripts/eieFcF4BxIvDTN3C.js create mode 100644 scripts/eq32dKXeTAbKhhLf.js create mode 100644 scripts/eu4mHsdZukvUEAGJ.js create mode 100644 scripts/eyrUJQAuHvdllCwi.js delete mode 100644 scripts/f062aa2BNClx08D6.js delete mode 100644 scripts/f3rXusHh6VIpVPUl.js delete mode 100644 scripts/f5Mp3kXwCFdPkW6N.js create mode 100644 scripts/fA1dIV1ANo4RVEqy.js create mode 100644 scripts/fC4KcY9S6V30IJyX.js delete mode 100644 scripts/fKzlu6fFE2th9uIJ.js create mode 100644 scripts/fLg90csmdOOKmEE6.js delete mode 100644 scripts/fP2edYbj6QjPPAjL.js create mode 100644 scripts/fSDFCHAo97RLpwGU.js create mode 100644 scripts/fUD4gMdKe6P3sFdJ.js delete mode 100644 scripts/fYLSe6CrYciap5y8.js create mode 100644 scripts/fq2fqlWlrVfitkcB.js create mode 100644 scripts/fwiBeetIsvpXKtUc.js create mode 100644 scripts/fyjYWg7ekj8JJcmq.js delete mode 100644 scripts/g07HI7vyqiFXPB0o.js create mode 100644 scripts/g5y0tdoHCDs7cBy7.js delete mode 100644 scripts/gFUXBbTskQBKjxqm.js delete mode 100644 scripts/gKPL3t4vlZAsvtGr.js create mode 100644 scripts/gQJJaxbN83KSgi36.js create mode 100644 scripts/gSDhsSB8573joL64.js delete mode 100644 scripts/gnVpxOeBZpNF4HIF.js delete mode 100644 scripts/gqZLfIr6svrtdwdC.js delete mode 100644 scripts/gu72JaTs9GrSiVTd.js create mode 100644 scripts/gull3qgCahzk2xYu.js delete mode 100644 scripts/h0DfPwUUOBjyAHMZ.js delete mode 100644 scripts/h1XKoMuVnS0bagRO.js create mode 100644 scripts/h4lnexDYAhyQuiR5.js create mode 100644 scripts/h8JqPMh2mM2uhpxk.js delete mode 100644 scripts/hDC6lroDEPVBituR.js create mode 100644 scripts/hEDuYAgc1O1zG3Rr.js create mode 100644 scripts/hL3JUSY3xMA4zj2Q.js create mode 100644 scripts/hO2CFW9hygGSYuJ2.js delete mode 100644 scripts/hR1qD2kpFHF8JT8h.js create mode 100644 scripts/hTsnYKgw0kK10PiC.js create mode 100644 scripts/hadXFC43VKyrE9jC.js rename scripts/{93K85NnVwjVNXlZq.js => hg89FU1NAp8tIsgO.js} (94%) delete mode 100644 scripts/hnsmzvcuiUYB065I.js create mode 100644 scripts/hpbraeEbjkXnmD75.js create mode 100644 scripts/hqMwzPozAVTzoCxa.js create mode 100644 scripts/i93PGV1lDSdi3BJu.js create mode 100644 scripts/iH9o7t8vGDn6pm1d.js delete mode 100644 scripts/iM6JLF8jDXMViReZ.js delete mode 100644 scripts/iT0h3VZLEBQnn5Bx.js delete mode 100644 scripts/iT3C15fMyQrj1RmG.js create mode 100644 scripts/ij3BLXzNk7eZ3V95.js create mode 100644 scripts/iuoVkjFdL1rHdbqR.js create mode 100644 scripts/ivxpmCKu3pEMG05c.js create mode 100644 scripts/jFKnf2UdoxAQx76R.js create mode 100644 scripts/jOCLEsjNzERyVLsP.js create mode 100644 scripts/jOSCsBRUO117spv8.js delete mode 100644 scripts/jRSgPhpfN7MH7TTp.js create mode 100644 scripts/jb1ouw0eIBVy3Wwg.js delete mode 100644 scripts/jgO1Kf60Ctt6R0qO.js delete mode 100644 scripts/jpcU8FFWSlQ3gD0L.js rename scripts/{U9xh2wriSqCosugW.js => jvNuIbOtB46p0esq.js} (55%) create mode 100644 scripts/k1Wdehpgdc0hP63E.js delete mode 100644 scripts/k3FqFgsF6a3TkxAD.js create mode 100644 scripts/k465TgRelwcSUdS2.js create mode 100644 scripts/k5792iKWEqKmVZMk.js delete mode 100644 scripts/k8TC0yzp4xfOXD2n.js delete mode 100644 scripts/kEaBLoIHt1FpQVKq.js delete mode 100644 scripts/kMSdRskYDI2J1gnp.js delete mode 100644 scripts/kWynO1lQzjiSs8RK.js create mode 100644 scripts/kY50G53IXdNXX9Sc.js create mode 100644 scripts/kYTEqcs8JpO2OmB9.js delete mode 100644 scripts/kYiDBPRKIokFkr4Z.js delete mode 100644 scripts/kYmscP2HuXjDovBD.js create mode 100644 scripts/kiolpXGbkmxfPiuI.js delete mode 100644 scripts/kkC5EhqA05U6U0gU.js delete mode 100644 scripts/kmsGLWGxCY8Z8jVG.js create mode 100644 scripts/knq8lNYLw0v757dQ.js create mode 100644 scripts/kvqJbHBvFr6iGLcI.js delete mode 100644 scripts/l1ntrpa8RE3Lg5xE.js delete mode 100644 scripts/l8qFKSnMpy4P7XQR.js create mode 100644 scripts/lDIWlQvD6MGyP3QP.js create mode 100644 scripts/lG5lfAzNuM4t0rpM.js create mode 100644 scripts/lMRsQRgjMexY9dxE.js delete mode 100644 scripts/lPudo1grrVp05i7a.js delete mode 100644 scripts/lYYkGzqNshiYc7WI.js create mode 100644 scripts/laWHBP2jLrVxcgp9.js delete mode 100644 scripts/lhemR8EP5tGNKout.js create mode 100644 scripts/lmBAZCtofsC8hHHG.js create mode 100644 scripts/luEuwzYCUrch58Bp.js create mode 100644 scripts/m4eagTrVOXtotonR.js delete mode 100644 scripts/mTnmPcjWmvScIBWY.js delete mode 100644 scripts/mYL4i1vNlMl4vFYy.js create mode 100644 scripts/mnvczEiu7gUSWvuV.js delete mode 100644 scripts/mr8qm5Bg6k1idZ6Q.js delete mode 100644 scripts/mziJBUYcsrhkdcCJ.js create mode 100644 scripts/n5wowuDE8Dz1uBZn.js create mode 100644 scripts/n8X4Vgmrs4M5pyHK.js create mode 100644 scripts/n99CqhPx3uABCU15.js delete mode 100644 scripts/nD2QVg3DrPK3foMf.js delete mode 100644 scripts/nEaF3jbCiVYD8jia.js delete mode 100644 scripts/nIOeK0BrtdZeZW8X.js create mode 100644 scripts/nNwAFEURKlFhPcvA.js create mode 100644 scripts/nZtN0zM49xTuG86V.js delete mode 100644 scripts/ncIjDE6TFx88IQA1.js delete mode 100644 scripts/nvrFhHHVq3KzirlR.js create mode 100644 scripts/o2QhtiLAmUEpDgBX.js delete mode 100644 scripts/o3JUBKLvE6bBxK2n.js create mode 100644 scripts/oA197GIqHpU5WR9V.js delete mode 100644 scripts/oEsUsI74yGTZ9CwU.js delete mode 100644 scripts/oGdsGPgJWcyWkiWl.js create mode 100644 scripts/oHmtdXWVwm7y7BtO.js create mode 100644 scripts/oQI06eh8mJ9UqETO.js delete mode 100644 scripts/oWM43EdUiyHgUlfW.js delete mode 100644 scripts/obIXhQXKFyyQoNNV.js delete mode 100644 scripts/p222EiR8RRtlPm31.js delete mode 100644 scripts/p7NJB1PsY6X5q8OO.js delete mode 100644 scripts/pAgiAGyaLJY10894.js delete mode 100644 scripts/pHyXdPnWwoFrUA5n.js delete mode 100644 scripts/pNPjXEoQGHLKzq0r.js create mode 100644 scripts/pRp6hoBJ0JQa4NNG.js create mode 100644 scripts/pdvCwjxHI56EmxuU.js create mode 100644 scripts/pj7gjxHrnrZonC6U.js create mode 100644 scripts/ppc8L3WtIx6JzlAd.js delete mode 100644 scripts/pq1YQffxtOcqCRTn.js create mode 100644 scripts/pqQkeUVpuZ0jOKnZ.js create mode 100644 scripts/pvTcazVvW4v04otW.js delete mode 100644 scripts/pzknBcJtZWeliE27.js create mode 100644 scripts/q5RgoYr12kBF6FA5.js create mode 100644 scripts/qDYJnO2JosPJrjpz.js create mode 100644 scripts/qITSQMvvkgj81fW1.js delete mode 100644 scripts/qTk96NKh14YOIShf.js create mode 100644 scripts/qZ8TBagp2d4dJAqI.js delete mode 100644 scripts/qaVde0sTuMBRi2nl.js create mode 100644 scripts/qhjU1QdsfqA8h5iI.js delete mode 100644 scripts/qijgjcOBCDmhglRX.js create mode 100644 scripts/qmGwT929EiZ3lW2x.js create mode 100644 scripts/qmH61HmrEJcmQTiu.js delete mode 100644 scripts/quPcuKsq2fcild4a.js create mode 100644 scripts/qyBmkCJo5606o4J9.js delete mode 100644 scripts/qzGPJflVW7c2Ciim.js create mode 100644 scripts/rJ8pspSekyDLkiqG.js delete mode 100644 scripts/rXMylpnEtZpwou6x.js delete mode 100644 scripts/red2bt4PGgIWAdTR.js create mode 100644 scripts/rgnGu3IQrS8Vj9Op.js delete mode 100644 scripts/rlTvhnDpj4lzfusf.js delete mode 100644 scripts/rnioLwiJP7ps5Jwy.js delete mode 100644 scripts/roKvPHDSpX4IV11C.js create mode 100644 scripts/roYVcP5Zqcsa8jVw.js delete mode 100644 scripts/rr4htuVq45onXdRG.js delete mode 100644 scripts/rxB1AqfVMDqTRieE.js delete mode 100644 scripts/s7gJQdzuM3fz2zQK.js create mode 100644 scripts/s7kW3lm2eU5IPrLP.js create mode 100644 scripts/s9J1TUkpGdvSWvPO.js create mode 100644 scripts/s9KcytRE7i0cU06n.js delete mode 100644 scripts/sSMg43ZjnNmpytfj.js delete mode 100644 scripts/sUHuj00IpoZ7Gd03.js delete mode 100644 scripts/sWyO1DNaqb2EdHoW.js delete mode 100644 scripts/sagKJM6oDFlw4ED2.js delete mode 100644 scripts/sgS9rblPkQB36C8S.js delete mode 100644 scripts/syBgPp7rOymCZejX.js create mode 100644 scripts/syRJs8P4aBFB5USD.js delete mode 100644 scripts/t56mnblo1kv3gM1M.js delete mode 100644 scripts/tDrs0aNIYmZPsOoS.js delete mode 100644 scripts/tG1qGqzBLmAR3WHm.js create mode 100644 scripts/tHBlC7SpYiQ7SUGo.js delete mode 100644 scripts/tcZug8ehU6lyYBd9.js delete mode 100644 scripts/tfdKU6nmvUtEjXE2.js create mode 100644 scripts/tg9N6aUo8WRPKj3H.js create mode 100644 scripts/tkZ8Ybqu518LQYEn.js delete mode 100644 scripts/tn6SwmjAuNzqE6dx.js delete mode 100644 scripts/tnE8LF6E3svIlLca.js delete mode 100644 scripts/tnilBagajWM8UGQt.js delete mode 100644 scripts/tolkNN5P7oOC8GKZ.js create mode 100644 scripts/tpz88eQFTjWHdFL5.js delete mode 100644 scripts/tuIsytv3jl2yAIb2.js create mode 100644 scripts/tyQLkRLk1AXB4g2u.js create mode 100644 scripts/u46KnlxCjP42F6QY.js create mode 100644 scripts/u4fKgGFEnOCnvvsv.js create mode 100644 scripts/uA5qaat5EXzkzltq.js delete mode 100644 scripts/uACa6u4JLNMRgFlr.js create mode 100644 scripts/uCJk19rijMPRU8jg.js create mode 100644 scripts/uEVSUTTam4Z96JJ2.js create mode 100644 scripts/uMvD2HWFNGqCmrBM.js create mode 100644 scripts/uRiAvo9fb3U7FIIy.js delete mode 100644 scripts/uSwkYENTOcnfRrqA.js create mode 100644 scripts/uZeNKQ24fToJ7qtY.js create mode 100644 scripts/ulXfbycWUu36vdmS.js delete mode 100644 scripts/upfK6GM33qZCZjll.js delete mode 100644 scripts/uwdQvZtzy2HVeEzx.js delete mode 100644 scripts/ux3jaLpAUhZ5YqA6.js delete mode 100644 scripts/v6LIG7EwWYALxCpP.js create mode 100644 scripts/vBqrydNzHmEHClqZ.js create mode 100644 scripts/vNUGuypkhx2P5YIA.js rename scripts/{KIoVBinAZK8sMOqD.js => ve3RcfTi49rdYZU0.js} (64%) create mode 100644 scripts/vejhfB9aI58iF1vr.js delete mode 100644 scripts/vj3zArmX27vCxYJW.js create mode 100644 scripts/vn13U388mwquGN9y.js create mode 100644 scripts/vphNSTVxfZjApblV.js create mode 100644 scripts/vtXJI2VGlU9vODXz.js delete mode 100644 scripts/vvdo1NxjmGVkmFCT.js delete mode 100644 scripts/vzMxIDjRlQSxXtCW.js create mode 100644 scripts/vzSj3vvPryp02EVC.js delete mode 100644 scripts/w4JKuTECFmu3YmTR.js create mode 100644 scripts/w8s2RUzA1jmyu7vy.js create mode 100644 scripts/wBc8XvkAnv3j93vR.js create mode 100644 scripts/wFHjQyCR6Wzn6TeQ.js create mode 100644 scripts/wLg8LbPAPbQgUg0Z.js delete mode 100644 scripts/wS6OIR3QN4mOUHn0.js create mode 100644 scripts/wb1DpSdIhSqYG5cp.js rename scripts/{C4LZnaX0MYgwrszj.js => we6JUzDvybekAbtn.js} (69%) create mode 100644 scripts/weDTna1dLMwHsNlJ.js delete mode 100644 scripts/wsqNM4NHnwaAAQym.js delete mode 100644 scripts/wzkxiKjxVEeNS1di.js create mode 100644 scripts/x1Ecj6MXY94kpcQq.js delete mode 100644 scripts/x2RLUUNB7BiIDYCP.js delete mode 100644 scripts/x8XK2fzzXCnSwfjt.js create mode 100644 scripts/xEE0ymsaH2tn2M99.js create mode 100644 scripts/xJZKVGE04o84Gibo.js delete mode 100644 scripts/xRd6oA1QWLVpfoBm.js delete mode 100644 scripts/xS2su09zcza9du09.js delete mode 100644 scripts/xVYVegD692CCv8Yl.js delete mode 100644 scripts/xWPgIZOQLba5nZ23.js create mode 100644 scripts/xcny1zYAphdfrKv9.js create mode 100644 scripts/xkdQhZ9KKqmocNLO.js delete mode 100644 scripts/xobGBJbgFjQCrwvq.js delete mode 100644 scripts/xvH4PKJasHcehOZz.js create mode 100644 scripts/y7hk7prQ0lLTyv1Y.js create mode 100644 scripts/y9fwuiqn44t13WAq.js delete mode 100644 scripts/yIGItnshXI4W46cp.js delete mode 100644 scripts/yRRzSKlcN3L7rEEe.js delete mode 100644 scripts/yXUPiWuQ5o0JBY4i.js create mode 100644 scripts/yYNBZjmBnytXpRn3.js delete mode 100644 scripts/yatUu0cd7iKs50rq.js create mode 100644 scripts/yvtF2t9aibxibAIM.js delete mode 100644 scripts/z5HfNUrHy5MS3K7a.js create mode 100644 scripts/z8W5PAwBR0PXY6ty.js delete mode 100644 scripts/zA6TDttpwMSMl7D8.js create mode 100644 scripts/zF1IKmobCB8ea58M.js delete mode 100644 scripts/zFYCaGR0wbFWjl4T.js create mode 100644 scripts/zGwtyjTUBeSQ110p.js create mode 100644 scripts/zI5hXv2NLGWqnmDD.js create mode 100644 scripts/zIErcRiBmIZRbary.js delete mode 100644 scripts/zLBLEDl3aGcAxai2.js delete mode 100644 scripts/zR4WAjzXHTZuiu5G.js create mode 100644 scripts/zWZG8OmxqTpzHjFV.js delete mode 100644 scripts/zY4ZjY7uyKIKMYmX.js create mode 100644 scripts/zasFOZohkrdFIBwr.js delete mode 100644 scripts/ziG9H5Kdb7xC3dFE.js create mode 100644 scripts/zjTEhJuLcFVkzory.js delete mode 100644 scripts/zsiV6XEHlCNGLLPl.js delete mode 100644 scripts/zzk2uRSFjFHB5kjw.js delete mode 100644 tools/GPUCache/data_0 delete mode 100644 tools/GPUCache/data_1 delete mode 100644 tools/GPUCache/data_2 delete mode 100644 tools/GPUCache/data_3 delete mode 100644 tools/GPUCache/index create mode 100644 tools/analyze-english-terms.js create mode 100644 tools/apply-sync.js create mode 100644 tools/apply-translations.js create mode 100644 tools/auto-merge-translations.js create mode 100644 tools/auto-translate-english.js create mode 100644 tools/auto-translations-applied.json create mode 100644 tools/english-texts-found.json create mode 100644 tools/extract-translations.js create mode 100644 tools/find-english-texts.js create mode 100644 tools/generate-review-report.js create mode 100644 tools/generate-translation-report.js create mode 100644 tools/replace-review-scripts.js create mode 100644 tools/review-comparison.md create mode 100644 tools/script-comparison-data.json create mode 100644 tools/script-comparison-report.md create mode 100644 tools/scripts-replaced-list.md create mode 100644 tools/scripts-to-review.json create mode 100644 tools/sync-scripts.js create mode 100644 tools/translate-ids.js create mode 100644 tools/translate-scripts.js create mode 100644 tools/translation-opportunities.json diff --git a/module.json b/module.json index 144524c..cd39d9d 100644 --- a/module.json +++ b/module.json @@ -8,8 +8,9 @@ } ], "url": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr", - "version": "9.3.3", + "version": "9.3.4", "esmodules": [ + "wh4_fr.js", "modules/babele-register.js", "modules/addon-register.js", "modules/import-stat-2.js", @@ -119,7 +120,7 @@ } ], "manifest": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/raw/v10/module.json", - "download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/archive/foundryvtt-wh4-lang-fr-9-3-2.zip", + "download": "https://www.uberwald.me/gitea/public/foundryvtt-wh4-lang-fr-fr/archive/foundryvtt-wh4-lang-fr-9-3-4.zip", "id": "wh4-fr-translation", "compatibility": { "minimum": "13", diff --git a/modules/addon-register.js b/modules/addon-register.js index ec90205..67a4eb6 100644 --- a/modules/addon-register.js +++ b/modules/addon-register.js @@ -82,39 +82,8 @@ const _patch_up_in_arms = () => { } /************************************************************************************/ -/* Manages /auberge command */ -const _manage_inn_roll = async (content, msg) => { - // Split input into arguments - let command = content.split(" ").map(function (item) { - return item.trim(); - }) - - console.log("COMMANDES", command); - if (command[0] == "/auberge" && command[1]) { - msg["type"] = 0; - msg["rollMode"] = "gmroll"; - let compendium = game.packs.get('wh4-fr-translation.plats-dauberges') - game.packs.get(compendium); - let rollList = await compendium.getDocuments() - for (const element of rollList) { - let rollTab = element; - console.log("Got compendium...", rollList, rollTab.name); - if (rollTab.name.toLowerCase().includes(command[1].toLowerCase())) { - let my_rollTable; - await compendium.getDocument(rollTab._id).then(mytab => my_rollTable = mytab); - my_rollTable.draw({ rollMode: "gmroll" }); - return false; - } - } - } - if (content.includes("/auberge")) { - msg["type"] = 0; - msg["rollMode"] = "gmroll"; - msg["content"] = "Syntaxe : /auberge MOT_CLE, avec MOT_CLE parmi:
BoissonsBase, BoissonsFortes, Desserts, PlatsCommuns, PlatsExcellents, PlatsMaritimes, PlatsMédiocres, PlatsQualité, PlatsRivières
Des raccourcis sont possibles avec une partie du nom : /auberge Base (correspond à BoissonBase) ou /auberge Mari (correspond à PlatsMaritimes), etc." - ChatMessage.create(msg); - return false; - } -} +/* Module /auberge géré par modules/inn/inn-init.js */ +// L'ancienne implémentation a été migrée vers le module inn pour cohérence avec /voyage /************************************************************************************/ let __eis_tables = { @@ -262,17 +231,13 @@ const __check_fix_wrong_modules = (chatFlag, patchFinished) => { } } else if (game.user.isGM && patchFinished) { ChatMessage.create({ - content: "
Les modules WFRP4E ont été patchés avec succés. Vous pouvez y aller et que Shallya vous garde !
Derniers changements : Support WFRP4E v8.3.X
", + content: "
Les modules WFRP4E ont été patchés avec succés. Vous pouvez y aller et que Shallya vous garde !
Derniers changements :
  • Ajout de la commande /voyage !
  • Améliorations de la commande /auberge
", user: game.user.id, whisper: ChatMessage.getWhisperRecipients("GM") }); } } -const __history = [ - "Nouveautés 9.0.0:
  • Support Foundry v13 et diverses petites corrections !
" -] - /************************************************************************************/ const convertColumnToMulti = (table) => { let columns = table.columns; @@ -366,14 +331,8 @@ const __add_actors_translation = () => { /************************************************************************************/ -/* Hook for specific command */ -Hooks.on("chatMessage", (html, content, msg) => { - - if (content.toLowerCase().includes('auberge')) { - _manage_inn_roll(content, msg); - return false; - } -}); +/* Hook for specific command - Module /auberge migré vers modules/inn/ */ +// La commande /auberge est désormais gérée par le module inn-init.js /************************************************************************************/ /* Additionnal hooks ready */ diff --git a/modules/inn/InnRoller.js b/modules/inn/InnRoller.js new file mode 100644 index 0000000..fe6342c --- /dev/null +++ b/modules/inn/InnRoller.js @@ -0,0 +1,410 @@ +/** + * InnRoller + * Classe de gestion des jets de tables d'auberge pour WFRP4e + * Module de traduction française + */ + +export default class InnRoller { + static tableNames = { + 'boissonsbase': 'BoissonsBase', + 'boissonsfortes': 'BoissonsFortes', + 'desserts': 'Desserts', + 'platscommuns': 'PlatsCommuns', + 'platsexcellents': 'PlatsExcellents', + 'platsmaritimes': 'PlatsMaritimes', + 'platsmediocres': 'PlatsMédiocres', + 'platsqualite': 'PlatsQualité', + 'platsrivieres': 'PlatsRivières' + }; + + static displayNames = { + 'BoissonsBase': 'Boissons de Base', + 'BoissonsFortes': 'Boissons Fortes', + 'Desserts': 'Desserts', + 'PlatsCommuns': 'Plats Communs', + 'PlatsExcellents': 'Plats Excellents', + 'PlatsMaritimes': 'Plats Maritimes', + 'PlatsMédiocres': 'Plats Médiocres', + 'PlatsQualité': 'Plats de Qualité', + 'PlatsRivières': 'Plats de Rivières' + }; + + /** + * Obtient le nom d'affichage formaté pour une table + * @param {String} tableName + * @returns {String} + */ + static getDisplayName(tableName) { + return this.displayNames[tableName] || tableName; + } + + /** + * Normalise le nom d'une table (enlève accents, espaces, met en minuscules) + * @param {String} name + * @returns {String} + */ + static normalizeTableName(name) { + return name + .toLowerCase() + .normalize("NFD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/\s+/g, ''); + } + + /** + * Trouve la table correspondant au mot-clé + * @param {String} keyword + * @returns {String|null} + */ + static findTableByKeyword(keyword) { + if (!keyword) return null; + + const normalized = this.normalizeTableName(keyword); + + // Recherche exacte + if (this.tableNames[normalized]) { + return this.tableNames[normalized]; + } + + // Recherche partielle + for (let [key, value] of Object.entries(this.tableNames)) { + if (key.includes(normalized) || normalized.includes(key)) { + return value; + } + } + + return null; + } + + /** + * Lance un jet sur une table d'auberge + * @param {String} keyword Mot-clé pour identifier la table + */ + static async rollInnTable(keyword) { + console.log(`InnRoller: rollInnTable appelé avec keyword="${keyword}"`); + + // Si pas de keyword, afficher l'aide + if (!keyword) { + this.displayHelp(); + return; + } + + // Rechercher la table + const tableName = this.findTableByKeyword(keyword); + + if (!tableName) { + this.displayHelp(); + ui.notifications.warn(`Table d'auberge introuvable pour le mot-clé: "${keyword}"`); + return; + } + + console.log(`InnRoller: Table trouvée: ${tableName}`); + + // Charger le compendium + const compendium = game.packs.get('wh4-fr-translation.plats-dauberges'); + + if (!compendium) { + ui.notifications.error("Compendium 'plats-dauberges' introuvable"); + console.error("InnRoller: Compendium wh4-fr-translation.plats-dauberges non trouvé"); + return; + } + + // Récupérer les tables + const tables = await compendium.getDocuments(); + + // Trouver la table correspondante + const rollTable = tables.find(t => t.name === tableName); + + if (!rollTable) { + ui.notifications.error(`Table "${tableName}" non trouvée dans le compendium`); + console.error(`InnRoller: Table ${tableName} non trouvée`); + return; + } + + console.log(`InnRoller: Jet sur la table ${rollTable.name}`); + + // Effectuer le jet sans affichage automatique + try { + const roll = await rollTable.draw({ displayChat: false }); + console.log(`InnRoller: Jet effectué avec succès`, roll); + + // Créer un message personnalisé + await this.displayRollResult(rollTable.name, roll); + } catch (error) { + console.error("InnRoller: Erreur lors du jet:", error); + ui.notifications.error("Erreur lors du jet sur la table d'auberge"); + } + } + + /** + * Affiche le résultat d'un jet de table avec un style personnalisé + * @param {String} tableName Nom de la table + * @param {Object} rollResult Résultat du jet + */ + static async displayRollResult(tableName, rollResult) { + // Déterminer l'icône en fonction du type de table + let icon = "fa-utensils"; + let category = "Plat"; + + if (tableName.toLowerCase().includes('boisson')) { + icon = "fa-wine-glass"; + category = "Boisson"; + } else if (tableName.toLowerCase().includes('dessert')) { + icon = "fa-birthday-cake"; + category = "Dessert"; + } + + // Extraire les informations du résultat + const resultText = rollResult.results[0]?.text || "Résultat inconnu"; + const rollFormula = rollResult.roll?.formula || "1d100"; + const rollTotal = rollResult.roll?.total || 0; + + // Construire le message HTML simplifié + let message = `
`; + message += `
`; + message += ` `; + message += `${category}: ${tableName}`; + message += `
`; + message += `
${resultText}
`; + message += `
${rollFormula} = ${rollTotal}
`; + message += `
`; + + // Créer le message dans le chat + await ChatMessage.create({ + content: message, + speaker: ChatMessage.getSpeaker(), + whisper: ChatMessage.getWhisperRecipients("GM") + }); + } + + /** + * Affiche l'aide pour la commande /auberge avec liste cliquable + */ + static displayHelp() { + let message = `
`; + message += `

Aide pour /auberge

`; + message += `

Usage: /auberge [mot_clé]

`; + + // Bouton Menu + message += `
`; + message += ``; + message += ` Générer un menu complet`; + message += ``; + message += `
`; + + message += `
`; + + // Section avec liste cliquable + message += `

Tables disponibles

`; + message += `
`; + + const sortedTables = Object.values(this.tableNames).sort(); + for (let tableName of sortedTables) { + const normalized = this.normalizeTableName(tableName); + const displayName = this.getDisplayName(tableName); + message += ``; + message += ` ${displayName}`; + message += ``; + } + + message += `
`; + message += `
`; + message += `

Vous pouvez aussi taper /auberge [mot_clé] directement (ex: /auberge base)

`; + message += `
`; + + ChatMessage.create({ + content: message, + whisper: ChatMessage.getWhisperRecipients("GM") + }); + } + + /** + * Liste toutes les tables disponibles + */ + static listTables() { + let message = `
`; + message += `

Tables d'auberge disponibles

`; + message += `
`; + + const sortedTables = Object.values(this.tableNames).sort(); + for (let tableName of sortedTables) { + const normalized = this.normalizeTableName(tableName); + const displayName = this.getDisplayName(tableName); + message += ``; + message += ` ${displayName}`; + message += ``; + } + + message += `
`; + message += `
`; + + ChatMessage.create({ + content: message, + whisper: ChatMessage.getWhisperRecipients("GM") + }); + } + + /** + * Affiche le choix de qualité pour générer un menu complet + */ + static displayMenuChoice() { + let message = ``; + + ChatMessage.create({ + content: message, + whisper: ChatMessage.getWhisperRecipients("GM") + }); + } + + /** + * Génère un menu complet selon la qualité choisie + * @param {String} quality - 'mediocre', 'commun', ou 'qualite' + */ + static async generateMenu(quality) { + console.log(`InnRoller: generateMenu appelé avec quality="${quality}"`); + + let tables = []; + let menuName = ""; + + // Définir les tables à tirer selon la qualité + switch(quality) { + case 'mediocre': + menuName = "Menu Médiocre"; + tables = ['PlatsMédiocres', 'BoissonsBase']; + break; + case 'commun': + menuName = "Menu Commun"; + tables = ['PlatsCommuns', 'BoissonsBase', 'Desserts']; + break; + case 'qualite': + menuName = "Menu de Qualité"; + tables = ['PlatsQualité', 'BoissonsFortes', 'Desserts']; + break; + case 'fluvial': + menuName = "Menu Fluvial"; + tables = ['PlatsRivières', 'BoissonsBase', 'Desserts']; + break; + case 'maritime': + menuName = "Menu Maritime"; + tables = ['PlatsMaritimes', 'BoissonsFortes', 'Desserts']; + break; + case 'excellent': + menuName = "Menu Excellent"; + tables = ['PlatsExcellents', 'BoissonsFortes', 'Desserts']; + break; + default: + ui.notifications.error(`Qualité de menu inconnue: ${quality}`); + return; + } + + // Charger le compendium + const compendium = game.packs.get('wh4-fr-translation.plats-dauberges'); + if (!compendium) { + ui.notifications.error("Compendium 'plats-dauberges' introuvable"); + return; + } + + const allTables = await compendium.getDocuments(); + let results = []; + + // Effectuer les jets sur chaque table + for (let tableName of tables) { + const rollTable = allTables.find(t => t.name === tableName); + if (rollTable) { + try { + const roll = await rollTable.draw({ displayChat: false }); + const resultText = roll.results[0]?.text || "Résultat inconnu"; + results.push({ + category: this.getCategoryName(tableName), + name: resultText, + tableName: tableName + }); + } catch (error) { + console.error(`InnRoller: Erreur lors du jet sur ${tableName}:`, error); + } + } + } + + // Afficher le menu complet + this.displayMenuResult(menuName, results); + } + + /** + * Obtient le nom de catégorie pour une table + * @param {String} tableName + * @returns {String} + */ + static getCategoryName(tableName) { + if (tableName.includes('Boisson')) return 'Boisson'; + if (tableName.includes('Dessert')) return 'Dessert'; + if (tableName.includes('Plat')) return 'Plat'; + return 'Item'; + } + + /** + * Affiche le résultat d'un menu complet + * @param {String} menuName + * @param {Array} results + */ + static async displayMenuResult(menuName, results) { + let message = `
`; + message += `
`; + message += ` `; + message += `${menuName}`; + message += `
`; + + message += `
`; + for (let result of results) { + message += `
`; + let icon = result.category === 'Boisson' ? 'fa-wine-glass' : + result.category === 'Dessert' ? 'fa-birthday-cake' : 'fa-utensils'; + message += ` `; + message += `${result.category}: ${result.name}`; + message += `
`; + } + message += `
`; + message += `
`; + + await ChatMessage.create({ + content: message, + speaker: ChatMessage.getSpeaker(), + whisper: ChatMessage.getWhisperRecipients("GM") + }); + } +} diff --git a/modules/inn/README.md b/modules/inn/README.md new file mode 100644 index 0000000..de77b1d --- /dev/null +++ b/modules/inn/README.md @@ -0,0 +1,148 @@ +# Module Inn (Auberge) + +Module de gestion des jets sur les tables d'auberge pour WFRP4e - Traduction française. + +## Utilisation + +### Commande `/auberge` + +La commande `/auberge` permet d'effectuer des jets sur les tables d'auberge (plats et boissons). + +**Syntaxe :** +``` +/auberge [mot_clé] +``` + +### Exemples + +- `/auberge` - Affiche l'aide avec toutes les tables disponibles **et cliquables** +- `/auberge help` ou `/auberge aide` - Affiche l'aide avec liste cliquable +- `/auberge list` ou `/auberge liste` - Liste toutes les tables avec liens cliquables +- `/auberge menu` - **Génère un menu complet** (6 types disponibles) +- `/auberge base` - Lance un jet sur la table "BoissonsBase" +- `/auberge fortes` - Lance un jet sur la table "BoissonsFortes" +- `/auberge mari` - Lance un jet sur la table "PlatsMaritimes" + +> **Note :** Quand vous tapez `/auberge` sans argument, une liste cliquable s'affiche dans le chat. Vous pouvez cliquer directement sur une table pour effectuer un jet. + +### Génération de menus complets + +La commande `/auberge menu` permet de générer automatiquement un menu complet : + +1. Tapez `/auberge menu` dans le chat +2. Cliquez sur le type de menu souhaité : + - **Menu Médiocre** 🍗 : Plat médiocre + Boisson de base + - **Menu Commun** 🍽️ : Plat commun + Boisson de base + Dessert + - **Menu de Qualité** 👑 : Plat de qualité + Boisson forte + Dessert + - **Menu Fluvial** 🐟 : Plat de rivière + Boisson de base + Dessert + - **Menu Maritime** ⚓ : Plat maritime + Boisson forte + Dessert + - **Menu Excellent** 💎 : Plat excellent + Boisson forte + Dessert +3. Le menu complet est généré automatiquement avec un jet sur chaque table concernée + +### Tables disponibles + +- **BoissonsBase** (`boissonsbase`, `base`) +- **BoissonsFortes** (`boissonsfortes`, `fortes`) +- **Desserts** (`desserts`) +- **PlatsCommuns** (`platscommuns`, `communs`) +- **PlatsExcellents** (`platsexcellents`, `excellents`) +- **PlatsMaritimes** (`platsmaritimes`, `maritimes`, `mari`) +- **PlatsMédiocres** (`platsmediocres`, `mediocres`) +- **PlatsQualité** (`platsqualite`, `qualite`) +- **PlatsRivières** (`platsrivieres`, `rivieres`) + +### Raccourcis + +Le système accepte des raccourcis et ignore les accents : +- `mari` → PlatsMaritimes +- `qualité` ou `qualite` → PlatsQualité +- `médiocres` ou `mediocres` → PlatsMédiocres + +## Architecture + +Le module suit la même architecture que le module TravelV2 (commande `/voyage`) : + +``` +modules/inn/ +├── inn-init.js # Initialisation et enregistrement de la commande +└── InnRoller.js # Logique métier des jets de tables +``` + +### Affichage personnalisé + +Les résultats des jets sont affichés avec un **rendu visuel personnalisé** : +- 🍷 Icône adaptée au type (boisson, plat, dessert) +- 🎨 Carte stylisée avec dégradés et bordures +- 🎲 Affichage du jet de dés (formule et total) +- 📋 Nom de la table et du plat mis en valeur +- 🎉 Message de conclusion thématique + +Le système détecte automatiquement le type de plat/boisson et adapte l'icône : +- **Boissons** : 🍷 Verre de vin +- **Desserts** : 🎂 Gâteau +- **Plats** : 🍴 Couverts + +### Fichiers principaux + +- **inn-init.js** : + - Enregistre la commande `/auberge` via `game.wfrp4e.commands` + - Gère les hooks pour les clics sur les liens de tables + - Expose `game.wfrp4e.inn` pour accès programmatique + +- **InnRoller.js** : + - Gestion des jets sur les tables d'auberge + - Normalisation des noms de tables + - Recherche par mots-clés + - Affichage de l'aide et de la liste des tables + +## Intégration + +Le module est initialisé dans `wh4_fr.js` : + +```javascript +import { initInn } from './modules/inn/inn-init.js'; + +Hooks.once("init", function() { + initInn(); +}); +``` + +## Dépendances + +- Compendium : `wh4-fr-translation.plats-dauberges` +- Système WFRP4e avec support de `game.wfrp4e.commands` + +## Permissions + +La commande `/auberge` est réservée au MJ (GM). + +## API Programmatique + +```javascript +// Afficher l'aide +game.wfrp4e.inn.displayHelp(); + +// Lister les tables +game.wfrp4e.inn.listTables(); + +// Effectuer un jet +game.wfrp4e.inn.rollInnTable('base'); + +// Trouver une table par mot-clé +const tableName = game.wfrp4e.inn.findTableByKeyword('mari'); +``` + +## Migration depuis l'ancien système + +L'ancienne implémentation dans `addon-register.js` (`_manage_inn_roll`) a été remplacée par ce module pour : +- Cohérence avec le module TravelV2 +- Meilleure maintenabilité +- Support des commandes WFRP4e natives +- Interface utilisateur améliorée + +## Styles CSS + +Les styles sont définis dans `patch-styles.css` avec les classes : +- `.wfrp4e-inn-help` - Aide de la commande +- `.wfrp4e-inn-list` - Liste des tables +- `.wfrp4e-inn-table-list` - Liste avec liens cliquables diff --git a/modules/inn/inn-init.js b/modules/inn/inn-init.js new file mode 100644 index 0000000..d05d48f --- /dev/null +++ b/modules/inn/inn-init.js @@ -0,0 +1,93 @@ +import InnRoller from './InnRoller.js'; + +/** + * Initialisation du module Inn (Auberge) + */ +export function initInn() { + console.log("Inn: Initialisation du module d'auberge"); + + // Hook pour initialiser au démarrage + Hooks.once('ready', async () => { + console.log("Inn: Module d'auberge prêt"); + + // Exposer la classe globalement + game.wfrp4e = game.wfrp4e || {}; + game.wfrp4e.inn = InnRoller; + + console.log("Inn: Classe accessible via game.wfrp4e.inn"); + + // Enregistrer la commande dans le système WFRP4e si disponible + if (game.wfrp4e?.commands) { + console.log("Inn: Enregistrement de la commande /auberge"); + game.wfrp4e.commands.add({ + auberge: { + description: "Jets sur les tables d'auberge (FR)", + args: ["table"], + defaultArg: "table", + callback: (table) => { + // Vérifier que l'utilisateur est GM + if (!game.user.isGM) { + ui.notifications.warn("La commande /auberge est réservée au MJ."); + return; + } + + console.log(`Inn: Commande /auberge exécutée avec table="${table}"`); + + // Convertir null en undefined + table = table || undefined; + + // Si pas de table spécifiée, afficher l'aide + if (!table) { + InnRoller.displayHelp(); + } else if (table === 'help' || table === 'aide') { + InnRoller.displayHelp(); + } else if (table === 'list' || table === 'liste') { + InnRoller.listTables(); + } else if (table === 'menu') { + InnRoller.displayMenuChoice(); + } else { + InnRoller.rollInnTable(table); + } + } + } + }); + console.log("Inn: Commande /auberge enregistrée avec succès"); + } else { + console.warn("Inn: game.wfrp4e.commands non disponible"); + } + }); + + // Hook pour gérer les clics sur les liens de tables d'auberge + Hooks.on('renderChatMessage', (message, html, data) => { + // Ajouter un listener pour les clics sur les liens d'auberge + html.find('a[data-action="clickAuberge"]').click((event) => { + event.preventDefault(); + const tableKey = $(event.currentTarget).data('table'); + console.log(`Inn: Clic sur la table ${tableKey}`); + + if (game.user.isGM) { + InnRoller.rollInnTable(tableKey); + } else { + ui.notifications.warn("Seul le MJ peut utiliser les tables d'auberge."); + } + }); + + // Ajouter un listener pour les clics sur les boutons de menu + html.find('a[data-action="clickAubergeMenu"]').click((event) => { + event.preventDefault(); + const quality = $(event.currentTarget).data('quality'); + console.log(`Inn: Clic sur menu de qualité "${quality}"`); + + if (game.user.isGM) { + // Si quality === "menu", afficher le choix, sinon générer directement + if (quality === 'menu') { + InnRoller.displayMenuChoice(); + } else { + InnRoller.generateMenu(quality); + } + } else { + ui.notifications.warn("Seul le MJ peut utiliser les tables d'auberge."); + } + }); + }); +} diff --git a/modules/travelv2/TravelDistanceV2.js b/modules/travelv2/TravelDistanceV2.js new file mode 100644 index 0000000..1d2845e --- /dev/null +++ b/modules/travelv2/TravelDistanceV2.js @@ -0,0 +1,339 @@ +/** + * TravelDistanceV2 + * Classe de gestion du calcul des distances de voyage pour WFRP4e + * Version adaptée pour le module de traduction française + */ +import { PathFinder } from './pathfinding.js'; + +export default class TravelDistanceV2 { + static roadGraph = null; // Graphe pour les routes terrestres uniquement + static waterGraph = null; // Graphe pour les voies fluviales et maritimes + static mixedGraph = null; // Graphe combinant tous les modes de transport + + /** + * Charge les données de voyage depuis le fichier JSON + */ + static async loadTravelData() { + try { + console.log("TravelV2: Début du chargement des données..."); + const response = await fetch('modules/wh4-fr-translation/modules/travelv2/travel_data.json'); + + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + + this.travel_data = await response.json(); + console.log(`TravelV2: ${this.travel_data.length} routes chargées avec succès`); + + // Construire les 3 graphes pour le pathfinding + this.roadGraph = PathFinder.buildGraph(this.travel_data, 'road'); + this.waterGraph = PathFinder.buildGraph(this.travel_data, 'water'); + this.mixedGraph = PathFinder.buildGraph(this.travel_data, 'mixed'); + + console.log(`TravelV2: Graphe routier: ${Object.keys(this.roadGraph).length} villes`); + console.log(`TravelV2: Graphe fluvial/maritime: ${Object.keys(this.waterGraph).length} villes`); + console.log(`TravelV2: Graphe mixte: ${Object.keys(this.mixedGraph).length} villes`); + + ui.notifications.info(`TravelV2: ${this.travel_data.length} routes de voyage chargées`); + } catch (error) { + console.error("TravelV2: Erreur lors du chargement des données de voyage:", error); + ui.notifications.error("Erreur lors du chargement des données de voyage. Vérifiez la console."); + this.travel_data = []; // Initialiser avec un tableau vide pour éviter les erreurs + } + } + + /** + * Retourne une chaîne lisible pour le niveau de danger + * @param {String} dangerLevel + * @returns {String} + */ + static dangerToString(dangerLevel) { + if (dangerLevel == "") return "Très bas"; + if (dangerLevel == '!') return "Bas"; + if (dangerLevel == '!!') return "Moyen"; + if (dangerLevel == '!!!') return "Élevé"; + return "Très élevé"; + } + + /** + * Arrondit la durée à une valeur entière ou .5 + * @param {Number} duration + * @returns {Number} + */ + static roundDuration(duration) { + let trunc = Math.trunc(duration); + let frac = duration - trunc; + let adjust = 0; + if (frac > 0.75) adjust = 1; + else if (frac >= 0.25) adjust = 0.5; + return trunc + adjust; + } + + /** + * Affiche les distances de voyage entre deux villes ou liste les destinations + * @param {String} fromTown Ville de départ + * @param {String} toTown Ville d'arrivée (optionnel) + */ + static displayTravelDistance(fromTown, toTown) { + // Vérifier que les données sont chargées + if (!this.travel_data || this.travel_data.length === 0) { + ui.notifications.error("Les données de voyage ne sont pas encore chargées. Veuillez patienter..."); + console.error("TravelV2: travel_data n'est pas chargé"); + return; + } + + console.log(`TravelV2: displayTravelDistance appelé avec fromTown="${fromTown}", toTown="${toTown}"`); + console.log(`TravelV2: fromTown type: ${typeof fromTown}, valeur falsy: ${!fromTown}`); + console.log(`TravelV2: toTown type: ${typeof toTown}, valeur falsy: ${!toTown}`); + console.log(`TravelV2: ${this.travel_data.length} routes disponibles`); + + let message = ""; + + console.log("TravelV2: Vérification des conditions..."); + console.log(`TravelV2: toTown ? ${!!toTown}`); + console.log(`TravelV2: fromTown == 'help' ? ${fromTown == 'help'}`); + console.log(`TravelV2: fromTown ? ${!!fromTown}`); + console.log(`TravelV2: else (pas de fromTown) ? ${!fromTown && !toTown}`); + + if (toTown) { + console.log("TravelV2: Branche: Affichage des détails entre deux villes"); + // Afficher les détails de voyage entre deux villes spécifiques + const originalFrom = fromTown; + const originalTo = toTown; + fromTown = fromTown.toLowerCase(); + toTown = toTown.toLowerCase(); + + // Chercher d'abord une route directe + let directRoute = null; + for (const travel of this.travel_data) { + if (travel.from.toLowerCase() == fromTown && travel.to.toLowerCase() == toTown) { + directRoute = travel; + break; + } + } + + if (directRoute) { + // Route directe trouvée - affichage classique avec toutes les options + message += this.formatDirectRoute(directRoute); + } else { + // Pas de route directe - calculer les 3 types de trajets + console.log("TravelV2: Pas de route directe, calcul des itinéraires..."); + + const mixedPath = PathFinder.dijkstra(this.mixedGraph, originalFrom, originalTo, 'days'); + const roadPath = PathFinder.dijkstra(this.roadGraph, originalFrom, originalTo, 'days'); + const waterPath = PathFinder.dijkstra(this.waterGraph, originalFrom, originalTo, 'days'); + + if (!mixedPath && !roadPath && !waterPath) { + message += `

Aucun chemin trouvé entre ${originalFrom} et ${originalTo}

`; + message += `

Il n'existe pas de route reliant ces deux villes dans les données disponibles.

`; + } else { + message += `
De ${originalFrom} à ${originalTo}
`; + message += `

Différentes options de voyage disponibles :


`; + + // Option 1 : Trajet mixte optimal (le plus rapide) + if (mixedPath) { + message += this.formatMultiStepRoute(mixedPath, originalFrom, originalTo, 'mixed'); + message += `
`; + } + + // Option 2 : Trajet 100% terrestre + if (roadPath) { + message += this.formatMultiStepRoute(roadPath, originalFrom, originalTo, 'road'); + message += `
`; + } + + // Option 3 : Trajet 100% eau (fleuve/mer) + if (waterPath) { + message += this.formatMultiStepRoute(waterPath, originalFrom, originalTo, 'water'); + } + } + } + } else if (fromTown && fromTown == "help") { + console.log("TravelV2: Branche: Affichage de l'aide"); + // Afficher l'aide + message += `

Aide pour /voyage
`; + message += `Usage: /voyage [ville_départ] [ville_arrivée]

`; + message += `Exemples:
`; + message += `/voyage - Liste toutes les villes de départ
`; + message += `/voyage Altdorf - Liste les destinations depuis Altdorf
`; + message += `/voyage Altdorf Nuln - Affiche les détails de voyage entre Altdorf et Nuln`; + message += `

`; + } else if (fromTown) { + console.log("TravelV2: Branche: Liste des destinations depuis une ville"); + // Lister toutes les destinations possibles depuis une ville (avec pathfinding) + const normalizedFrom = PathFinder.findCityInGraph(this.roadGraph, fromTown); + + if (normalizedFrom) { + message += `
Destinations depuis ${normalizedFrom}
`; + message += `

Toutes les villes accessibles (routes directes et itinéraires calculés)

`; + + // Récupérer toutes les villes du graphe sauf la ville de départ + const allCities = Object.keys(this.roadGraph) + .filter(city => city.toLowerCase() !== normalizedFrom.toLowerCase()) + .sort((a, b) => a.localeCompare(b)); + + // Afficher toutes les destinations + for (const city of allCities) { + message += `

${city}

`; + } + } else { + message += `

Ville inconnue: ${fromTown}

`; + message += `

Cette ville n'existe pas dans la base de données.

`; + } + } else { + console.log("TravelV2: Branche: Liste de toutes les villes de départ"); + // Lister toutes les villes de départ + message += `
Sélectionnez une ville de départ
`; + let uniqTown = {}; + + for (const travel of this.travel_data) { + if (uniqTown[travel.from] == undefined) { + uniqTown[travel.from] = 1; + message += `

${travel.from}

`; + } + } + } + + console.log(`TravelV2: Message généré (longueur: ${message.length})`); + + if (message.length === 0) { + console.warn("TravelV2: Aucune donnée trouvée pour les critères fournis"); + ui.notifications.warn("Aucune route trouvée pour ces critères"); + return; + } + + ChatMessage.create({ + content: message, + whisper: [game.user.id], // Afficher uniquement pour le GM qui a lancé la commande + speaker: { alias: "Outil de voyage" } + }); + + console.log("TravelV2: ChatMessage créé avec succès"); + } + + /** + * Gère le clic sur un lien de voyage + * @param {Event} event + * @param {HTMLElement} target + */ + static handleTravelClick(event, target) { + let fromTown = target.dataset.from; + let toTown = target.dataset.to; + TravelDistanceV2.displayTravelDistance(fromTown, toTown); + } + + /** + * Formate l'affichage d'une route directe + * @param {Object} travel - Données de la route + * @returns {String} HTML formaté + */ + static formatDirectRoute(travel) { + let message = `

De ${travel.from} à ${travel.to} (Route directe)`; + + if (travel.road_distance != "") { + let road_horse_heavy_days = this.roundDuration(travel.road_days * 0.8); + let road_horse_fast_days = this.roundDuration(travel.road_days * 0.65); + let road_feet_days = this.roundDuration(travel.road_days * 1.25); + let road_danger_string = this.dangerToString(travel.road_danger); + let road_danger_feet_string = this.dangerToString(travel.road_danger + "!"); + + message += `

Par route:`; + message += `
Distance: ${travel.road_distance} km`; + message += `
Durée (chariot): ${travel.road_days} jours - Danger: ${road_danger_string}`; + message += `
Durée (cheval de charge): ${road_horse_heavy_days} jours - Danger: ${road_danger_string}`; + message += `
Durée (cheval rapide): ${road_horse_fast_days} jours - Danger: ${road_danger_string}`; + message += `
Durée (à pied): ${road_feet_days} jours - Danger: ${road_danger_feet_string}`; + } + + if (travel.river_distance != "") { + let river_danger_string = this.dangerToString(travel.river_danger); + message += `

Par rivière:`; + message += `
Distance: ${travel.river_distance} km`; + message += `
Durée: ${travel.river_days} jours - Danger: ${river_danger_string}`; + } + + if (travel.sea_distance != "") { + let sea_danger_string = this.dangerToString(travel.sea_danger); + message += `

Par mer:`; + message += `
Distance: ${travel.sea_distance} km`; + message += `
Durée: ${travel.sea_days} jours - Danger: ${sea_danger_string}`; + } + + message += "

"; + return message; + } + + /** + * Formate l'affichage d'une route multi-étapes + * @param {Object} pathResult - Résultat du pathfinding + * @param {String} fromCity - Ville de départ + * @param {String} toCity - Ville d'arrivée + * @param {String} routeType - Type de route ('mixed', 'road', 'water') + * @returns {String} HTML formaté + */ + static formatMultiStepRoute(pathResult, fromCity, toCity, routeType = 'road') { + // Déterminer le titre selon le type + let routeTitle = ""; + + if (routeType === 'mixed') { + routeTitle = "🌟 Itinéraire optimal (tous modes de transport)"; + } else if (routeType === 'road') { + routeTitle = "🛤️ Itinéraire 100% terrestre"; + } else if (routeType === 'water') { + routeTitle = "⛵ Itinéraire 100% fluvial/maritime"; + } + + let message = `
${routeTitle}
`; + message += `

${fromCity} → ${toCity} (${pathResult.steps} étape${pathResult.steps > 1 ? 's' : ''})`; + + // Résumé du voyage + const totalDistance = Math.round(pathResult.totalDistance); + const totalDays = Math.round(pathResult.totalDays); + const danger_string = this.dangerToString(pathResult.maxDanger); + + // Pour les routes terrestres, afficher les variantes de durée + const includesRoad = !pathResult.modesUsed || pathResult.modesUsed.includes('road'); + + message += `

📊 Résumé du voyage:`; + message += `
Distance totale: ${totalDistance} km`; + + if (includesRoad) { + const road_horse_heavy_days = this.roundDuration(pathResult.totalDays * 0.8); + const road_horse_fast_days = this.roundDuration(pathResult.totalDays * 0.65); + const road_feet_days = this.roundDuration(pathResult.totalDays * 1.25); + const danger_feet_string = this.dangerToString(pathResult.maxDanger + "!"); + + message += `
Durée (chariot): ${totalDays} jours - Danger max: ${danger_string}`; + message += `
Durée (cheval de charge): ${road_horse_heavy_days} jours - Danger max: ${danger_string}`; + message += `
Durée (cheval rapide): ${road_horse_fast_days} jours - Danger max: ${danger_string}`; + message += `
Durée (à pied): ${road_feet_days} jours - Danger max: ${danger_feet_string}`; + } else { + message += `
Durée totale: ${totalDays} jours - Danger max: ${danger_string}`; + } + + // Détails des étapes avec mode de transport + message += `

🗺️ Itinéraire détaillé:`; + for (let i = 0; i < pathResult.path.length; i++) { + const step = pathResult.path[i]; + const stepNum = i + 1; + const stepDanger = this.dangerToString(step.danger); + + // Icône selon le mode de transport + let modeIcon = "🛤️"; + let modeName = "route"; + if (step.mode === 'river') { + modeIcon = "🚣"; + modeName = "fleuve"; + } else if (step.mode === 'sea') { + modeIcon = "⛵"; + modeName = "mer"; + } + + message += `

Étape ${stepNum}: ${step.from} → ${step.to}`; + message += `
${modeIcon} Par ${modeName}: ${Math.round(step.distance)} km, ${step.days} jour${step.days > 1 ? 's' : ''} - Danger: ${stepDanger}`; + } + + message += "

"; + return message; + } +} diff --git a/modules/travelv2/debug-display.js b/modules/travelv2/debug-display.js new file mode 100644 index 0000000..0969307 --- /dev/null +++ b/modules/travelv2/debug-display.js @@ -0,0 +1,30 @@ +/** + * Script de débogage pour vérifier l'affichage du message + */ + +// Vérifier que les données sont chargées +console.log("=== DEBUG DISPLAY ==="); +console.log("travel_data:", game.wfrp4e.travelv2.travel_data); +console.log("Nombre de routes:", game.wfrp4e.travelv2.travel_data?.length); + +// Générer le message manuellement comme le fait la fonction +let message = ""; +message += `

Sélectionnez une ville de départ

`; +let uniqTown = {}; + +for (var travel of game.wfrp4e.travelv2.travel_data) { + if (uniqTown[travel.from] == undefined) { + uniqTown[travel.from] = 1; + message += `

${travel.from}

`; + } +} + +console.log("Message généré:", message); +console.log("Longueur du message:", message.length); +console.log("Nombre de villes uniques:", Object.keys(uniqTown).length); + +// Tester ChatMessage.create +ChatMessage.create({ + content: message, + whisper: game.user.isGM ? [] : [game.user.id] +}); diff --git a/modules/travelv2/diagnostic.js b/modules/travelv2/diagnostic.js new file mode 100644 index 0000000..9f6c6eb --- /dev/null +++ b/modules/travelv2/diagnostic.js @@ -0,0 +1,69 @@ +/** + * Script de diagnostic pour TravelV2 + * + * Copiez-collez ce code dans la console de Foundry VTT (F12) + * pour diagnostiquer les problèmes de chargement + */ + +console.log("=== Diagnostic TravelV2 ===\n"); + +// Test 1: Vérifier si la classe existe +console.log("1. Classe TravelDistanceV2 existe ?"); +if (typeof TravelDistanceV2 !== 'undefined') { + console.log(" ✓ OUI - La classe est disponible"); +} else { + console.log(" ✗ NON - La classe n'est pas chargée !"); + console.log(" → Vérifiez que le module est activé et rechargez (F5)"); +} + +// Test 2: Vérifier les données +console.log("\n2. Données chargées ?"); +if (typeof TravelDistanceV2 !== 'undefined' && TravelDistanceV2.travel_data) { + console.log(` ✓ OUI - ${TravelDistanceV2.travel_data.length} routes chargées`); + console.log(` → Première route: ${TravelDistanceV2.travel_data[0]?.from} → ${TravelDistanceV2.travel_data[0]?.to}`); +} else { + console.log(" ✗ NON - Les données ne sont pas chargées"); + console.log(" → Essayez de les charger manuellement:"); + console.log(" → await TravelDistanceV2.loadTravelData()"); +} + +// Test 3: Tester le chargement manuel +console.log("\n3. Test de chargement manuel:"); +console.log(" Exécutez: await TravelDistanceV2.loadTravelData()"); +console.log(" Puis vérifiez avec: TravelDistanceV2.travel_data.length"); + +// Test 4: Tester le chemin du fichier +console.log("\n4. Vérification du chemin du fichier:"); +const path = 'modules/foundryvtt-wh4-lang-fr-fr/modules/travelv2/travel_data.json'; +console.log(` Chemin: ${path}`); +console.log(" Test de fetch..."); +fetch(path) + .then(response => { + console.log(` ✓ Fichier accessible - Status: ${response.status}`); + return response.json(); + }) + .then(data => { + console.log(` ✓ JSON valide - ${data.length} routes trouvées`); + }) + .catch(error => { + console.log(` ✗ Erreur: ${error.message}`); + console.log(" → Vérifiez que le fichier travel_data.json existe bien"); + }); + +// Test 5: Afficher l'état du module +console.log("\n5. État du module:"); +console.log(` game.modules = ${game.modules ? 'Disponible' : 'Non disponible'}`); +const frModule = game.modules.get('foundryvtt-wh4-lang-fr-fr'); +if (frModule) { + console.log(` ✓ Module trouvé: ${frModule.title}`); + console.log(` → Actif: ${frModule.active}`); +} else { + console.log(" ✗ Module 'foundryvtt-wh4-lang-fr-fr' non trouvé"); +} + +console.log("\n=== Fin du diagnostic ==="); +console.log("\nCommandes utiles:"); +console.log("• Charger les données: await TravelDistanceV2.loadTravelData()"); +console.log("• Vérifier les données: TravelDistanceV2.travel_data"); +console.log("• Tester l'affichage: TravelDistanceV2.displayTravelDistance()"); +console.log("• Tester avec ville: TravelDistanceV2.displayTravelDistance('Altdorf')"); diff --git a/modules/travelv2/index.js b/modules/travelv2/index.js new file mode 100644 index 0000000..65c622a --- /dev/null +++ b/modules/travelv2/index.js @@ -0,0 +1,8 @@ +/** + * Index du module TravelV2 + * + * Ce fichier exporte tous les composants du module TravelV2 + */ + +export { default as TravelDistanceV2 } from './TravelDistanceV2.js'; +export { initTravelV2 } from './travelv2-init.js'; diff --git a/modules/travelv2/pathfinding.js b/modules/travelv2/pathfinding.js new file mode 100644 index 0000000..8b67ccd --- /dev/null +++ b/modules/travelv2/pathfinding.js @@ -0,0 +1,218 @@ +/** + * Algorithmes de calcul de plus court chemin pour les voyages + */ + +/** + * Classe pour le calcul de plus court chemin (algorithme de Dijkstra) + */ +export class PathFinder { + /** + * Construit un graphe à partir des données de voyage + * @param {Array} travelData - Données de voyage + * @param {String|Array} modes - Mode(s) de transport ('road', 'river', 'sea', ['road', 'river', 'sea'], 'water') + * @returns {Object} Graphe avec adjacence et poids + */ + static buildGraph(travelData, modes = 'road') { + const graph = {}; + + // Normaliser modes en tableau + let modeList = []; + if (modes === 'water') { + modeList = ['river', 'sea']; + } else if (modes === 'mixed') { + modeList = ['road', 'river', 'sea']; + } else if (Array.isArray(modes)) { + modeList = modes; + } else { + modeList = [modes]; + } + + for (const route of travelData) { + const from = route.from; + const to = route.to; + + // Initialiser les nœuds + if (!graph[from]) { + graph[from] = []; + } + if (!graph[to]) { + graph[to] = []; + } + + // Pour chaque mode de transport disponible + for (const mode of modeList) { + const distanceKey = `${mode}_distance`; + const daysKey = `${mode}_days`; + const distance = route[distanceKey]; + const days = route[daysKey]; + + // Ignorer les routes sans ce mode de transport + if (!distance || distance === "" || !days || days === "") { + continue; + } + + // Ajouter les arêtes (bidirectionnelles) + graph[from].push({ + destination: to, + distance: parseFloat(distance), + days: parseFloat(days), + danger: route[`${mode}_danger`] || "", + mode: mode + }); + + graph[to].push({ + destination: from, + distance: parseFloat(distance), + days: parseFloat(days), + danger: route[`${mode}_danger`] || "", + mode: mode + }); + } + } + + return graph; + } + + /** + * Algorithme de Dijkstra pour trouver le plus court chemin + * @param {Object} graph - Graphe d'adjacence + * @param {String} start - Ville de départ + * @param {String} end - Ville d'arrivée + * @param {String} metric - Métrique à minimiser ('distance' ou 'days') + * @returns {Object|null} Chemin trouvé avec détails ou null si pas de chemin + */ + static dijkstra(graph, start, end, metric = 'days') { + // Normaliser les noms de villes + const normalizedStart = this.findCityInGraph(graph, start); + const normalizedEnd = this.findCityInGraph(graph, end); + + if (!normalizedStart || !normalizedEnd) { + console.warn(`PathFinder: Ville non trouvée - start: ${start}, end: ${end}`); + return null; + } + + // Initialisation + const distances = {}; + const previous = {}; + const visited = new Set(); + const queue = []; + + // Initialiser toutes les distances à l'infini + for (const node in graph) { + distances[node] = Infinity; + previous[node] = null; + } + + distances[normalizedStart] = 0; + queue.push({ node: normalizedStart, distance: 0 }); + + while (queue.length > 0) { + // Trouver le nœud avec la plus petite distance + queue.sort((a, b) => a.distance - b.distance); + const { node: current } = queue.shift(); + + if (visited.has(current)) continue; + visited.add(current); + + // Si on a atteint la destination + if (current === normalizedEnd) { + return this.reconstructPath(previous, normalizedStart, normalizedEnd, graph, metric); + } + + // Explorer les voisins + const neighbors = graph[current] || []; + for (const neighbor of neighbors) { + if (visited.has(neighbor.destination)) continue; + + const weight = neighbor[metric]; // 'distance' ou 'days' + const newDistance = distances[current] + weight; + + if (newDistance < distances[neighbor.destination]) { + distances[neighbor.destination] = newDistance; + previous[neighbor.destination] = { + from: current, + edge: neighbor + }; + queue.push({ node: neighbor.destination, distance: newDistance }); + } + } + } + + // Pas de chemin trouvé + console.warn(`PathFinder: Aucun chemin trouvé entre ${start} et ${end}`); + return null; + } + + /** + * Trouve une ville dans le graphe (insensible à la casse) + * @param {Object} graph - Graphe + * @param {String} cityName - Nom de la ville + * @returns {String|null} Nom normalisé de la ville ou null + */ + static findCityInGraph(graph, cityName) { + const lowerName = cityName.toLowerCase(); + for (const city in graph) { + if (city.toLowerCase() === lowerName) { + return city; + } + } + return null; + } + + /** + * Reconstruit le chemin à partir des prédécesseurs + * @param {Object} previous - Map des prédécesseurs + * @param {String} start - Ville de départ + * @param {String} end - Ville d'arrivée + * @param {Object} graph - Graphe d'adjacence + * @param {String} metric - Métrique utilisée + * @returns {Object} Détails du chemin + */ + static reconstructPath(previous, start, end, graph, metric) { + const path = []; + let current = end; + let totalDistance = 0; + let totalDays = 0; + let maxDanger = ""; + const modesUsed = new Set(); + + // Reconstruire le chemin en remontant + while (current !== start) { + const prev = previous[current]; + if (!prev) break; + + const mode = prev.edge.mode || 'road'; + modesUsed.add(mode); + + path.unshift({ + from: prev.from, + to: current, + distance: prev.edge.distance, + days: prev.edge.days, + danger: prev.edge.danger, + mode: mode + }); + + totalDistance += prev.edge.distance; + totalDays += prev.edge.days; + + // Calculer le danger maximum + const dangerLevel = (prev.edge.danger || "").length; + const currentMaxLevel = maxDanger.length; + if (dangerLevel > currentMaxLevel) { + maxDanger = prev.edge.danger; + } + + current = prev.from; + } + + return { + path: path, + totalDistance: totalDistance, + totalDays: totalDays, + maxDanger: maxDanger, + steps: path.length, + modesUsed: Array.from(modesUsed) + }; + } +} diff --git a/modules/travelv2/test.js b/modules/travelv2/test.js new file mode 100644 index 0000000..0266b45 --- /dev/null +++ b/modules/travelv2/test.js @@ -0,0 +1,53 @@ +/** + * Fichier de test pour le module TravelV2 + * + * Pour tester le module dans la console de développement de Foundry VTT: + * + * 1. Charger le module + * 2. Ouvrir la console (F12) + * 3. Exécuter ces tests + */ + +// Test 1: Vérifier que la classe est chargée +console.log("Test 1: Classe TravelDistanceV2 disponible?"); +console.log(typeof TravelDistanceV2 !== 'undefined' ? "✓ OK" : "✗ ÉCHEC"); + +// Test 2: Vérifier que les données sont chargées +console.log("\nTest 2: Données de voyage chargées?"); +console.log(TravelDistanceV2.travel_data ? "✓ OK - " + TravelDistanceV2.travel_data.length + " routes trouvées" : "✗ ÉCHEC"); + +// Test 3: Tester dangerToString +console.log("\nTest 3: Test de dangerToString"); +console.log("'' -> " + TravelDistanceV2.dangerToString("")); +console.log("'!' -> " + TravelDistanceV2.dangerToString("!")); +console.log("'!!' -> " + TravelDistanceV2.dangerToString("!!")); +console.log("'!!!' -> " + TravelDistanceV2.dangerToString("!!!")); + +// Test 4: Tester roundDuration +console.log("\nTest 4: Test de roundDuration"); +console.log("22.1 -> " + TravelDistanceV2.roundDuration(22.1)); +console.log("22.3 -> " + TravelDistanceV2.roundDuration(22.3)); +console.log("22.5 -> " + TravelDistanceV2.roundDuration(22.5)); +console.log("22.8 -> " + TravelDistanceV2.roundDuration(22.8)); + +// Test 5: Tester displayTravelDistance avec une ville +console.log("\nTest 5: Affichage des destinations depuis Altdorf"); +// TravelDistanceV2.displayTravelDistance("Altdorf"); +console.log("Exécutez manuellement: TravelDistanceV2.displayTravelDistance('Altdorf')"); + +// Test 6: Tester displayTravelDistance avec deux villes +console.log("\nTest 6: Affichage du trajet Altdorf -> Nuln"); +// TravelDistanceV2.displayTravelDistance("Altdorf", "Nuln"); +console.log("Exécutez manuellement: TravelDistanceV2.displayTravelDistance('Altdorf', 'Nuln')"); + +// Test 7: Tester la commande help +console.log("\nTest 7: Affichage de l'aide"); +// TravelDistanceV2.displayTravelDistance("help"); +console.log("Exécutez manuellement: TravelDistanceV2.displayTravelDistance('help')"); + +console.log("\n=== Tests terminés ==="); +console.log("\nPour tester la commande complète, tapez dans le chat:"); +console.log("/travel2"); +console.log("/travel2 Altdorf"); +console.log("/travel2 Altdorf Nuln"); +console.log("/travel2 help"); diff --git a/modules/travelv2/travel_data.json b/modules/travelv2/travel_data.json new file mode 100644 index 0000000..900e380 --- /dev/null +++ b/modules/travelv2/travel_data.json @@ -0,0 +1,2745 @@ +[ + { + "from": "Altdorf", + "to": "Averheim", + "road_distance": 877, + "road_days": 22, + "road_danger": "", + "river_distance": 821, + "river_days": 16, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Barak Varr (Dwarfs/ Border Princes)", + "road_distance": 2044, + "road_days": 51, + "road_danger": "!!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Bechafen", + "road_distance": 1078, + "road_days": 27, + "road_danger": "!", + "river_distance": 1054, + "river_days": 20, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Bögenhafen", + "road_distance": 145, + "road_days": 4, + "road_danger": "", + "river_distance": 217, + "river_days": 4, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Carroburg", + "road_distance": 145, + "road_days": 4, + "road_danger": "", + "river_distance": 137, + "river_days": 1, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Delberz", + "road_distance": 322, + "road_days": 8, + "road_danger": "!", + "river_distance": 257, + "river_days": 5, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Drakenhof", + "road_distance": 1489, + "road_days": 37, + "road_danger": "!!", + "river_distance": 1440, + "river_days": 27, + "river_danger": "!!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Eicheschatten (Mootland)", + "road_distance": 1102, + "road_days": 28, + "road_danger": "", + "river_distance": 1030, + "river_days": 20, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Erengrad (Kislev)", + "road_distance": 1279, + "road_days": 32, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Grenzstadt (Black Fire Pass)", + "road_distance": 1143, + "road_days": 29, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Helmgart (Axe Bite Pass)", + "road_distance": 266, + "road_days": 7, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Hergig", + "road_distance": 523, + "road_days": 13, + "road_danger": "!", + "river_distance": 579, + "river_days": 10, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Hochsleben", + "road_distance": 1070, + "road_days": 27, + "road_danger": "", + "river_distance": 1022, + "river_days": 20, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Karak Hirn (Dwarfs/Black Mountains)", + "road_distance": 1199, + "road_days": 30, + "road_danger": "!", + "river_distance": 1151, + "river_days": 21, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Kemperbad", + "road_distance": 298, + "road_days": 7, + "road_danger": "", + "river_distance": 282, + "river_days": 5, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Kislev (Kislev)", + "road_distance": 1143, + "road_days": 29, + "road_danger": "!", + "river_distance": 1279, + "river_days": 23, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Kreutzhofen (Winter’s Teeth & Montdidier Passes)", + "road_distance": 1207, + "road_days": 30, + "road_danger": "!", + "river_distance": 1167, + "river_days": 22, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "L’Anguille (Bretonnia)", + "road_distance": 1682, + "road_days": 42, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Marienburg", + "road_distance": 547, + "road_days": 14, + "road_danger": "", + "river_distance": 612, + "river_days": 6, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Middenheim", + "road_distance": 515, + "road_days": 13, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Montfort (Bretonnia)", + "road_distance": 443, + "road_days": 11, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Mortensholm (The Border Princes)", + "road_distance": 1408, + "road_days": 35, + "road_danger": "!!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Neues Emskrank", + "road_distance": 837, + "road_days": 21, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Nuln", + "road_distance": 507, + "road_days": 13, + "road_danger": "", + "river_distance": 499, + "river_days": 9, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Pfeildorf", + "road_distance": 636, + "road_days": 16, + "road_danger": "", + "river_distance": 587, + "river_days": 10, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Praag (Kislev)", + "road_distance": 1996, + "road_days": 50, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Salzenmund", + "road_distance": 676, + "road_days": 17, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Salkalten", + "road_distance": 1070, + "road_days": 27, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Talabheim", + "road_distance": 475, + "road_days": 12, + "road_danger": "", + "river_distance": 451, + "river_days": 8, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Wolfenburg", + "road_distance": 700, + "road_days": 18, + "road_danger": "!", + "river_distance": 740, + "river_days": 14, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Wusterburg", + "road_distance": 982, + "road_days": 25, + "road_danger": "", + "river_distance": 933, + "river_days": 17, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Zavstra (Kislev)", + "road_distance": 983, + "road_days": 25, + "road_danger": "!", + "river_distance": 909, + "river_days": 17, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Essen", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 1191, + "river_days": 17, + "river_danger": "!!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Peak Pass (Karak Kadrin)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 1545, + "river_days": 29, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Übersreik", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 338, + "river_days": 6, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Waldenhof", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 1304, + "river_days": 25, + "river_danger": "!!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Altdorf", + "to": "Wurtbad", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 604, + "river_days": 12, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Averheim", + "to": "Eicheschatten (Mootland)", + "road_distance": 225, + "road_days": 6, + "road_danger": "", + "river_distance": 209, + "river_days": 4, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Averheim", + "to": "Grenzstadt (Black Fire Pass)", + "road_distance": 298, + "road_days": 7, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Averheim", + "to": "Nuln", + "road_distance": 370, + "road_days": 9, + "road_danger": "", + "river_distance": 322, + "river_days": 6, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Averheim", + "to": "Pfeildorf", + "road_distance": 451, + "road_days": 11, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Averheim", + "to": "Wurtbad", + "road_distance": 241, + "road_days": 6, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Barak Varr (Dwarfs/The Border Princes)", + "to": "Grenzstadt (Black Fire Pass)", + "road_distance": 901, + "road_days": 23, + "road_danger": "!!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Bechafen", + "to": "Essen", + "road_distance": 668, + "road_days": 17, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Bechafen", + "to": "Peak Pass (Karak Kadrin)", + "road_distance": 491, + "road_days": 12, + "road_danger": "!", + "river_distance": 491, + "river_days": 5, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Bechafen", + "to": "Talabheim", + "road_distance": 604, + "road_days": 15, + "road_danger": "!", + "river_distance": 604, + "river_days": 6, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Bechafen", + "to": "Wurtbad", + "road_distance": 756, + "road_days": 19, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Bechafen", + "to": "Zavstra (Kislev)", + "road_distance": 145, + "road_days": 4, + "road_danger": "!", + "river_distance": 145, + "river_days": 1, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Bechafen", + "to": "Hergig", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 604, + "river_days": 6, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Bögenhafen", + "to": "Altdorf", + "road_distance": 145, + "road_days": 4, + "road_danger": "", + "river_distance": 217, + "river_days": 2, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Bögenhafen", + "to": "Helmgart (Axe Bite Pass)", + "road_distance": 121, + "road_days": 3, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Bögenhafen", + "to": "Übersreik", + "road_distance": 169, + "road_days": 4, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Bögenhafen", + "to": "Carroburg", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 161, + "river_days": 1, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Carroburg", + "to": "Altdorf", + "road_distance": 145, + "road_days": 4, + "road_danger": "", + "river_distance": 137, + "river_days": 3, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Carroburg", + "to": "Delberz", + "road_distance": 515, + "road_days": 13, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Carroburg", + "to": "Marienburg", + "road_distance": 402, + "road_days": 10, + "road_danger": "", + "river_distance": 475, + "river_days": 5, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Carroburg", + "to": "Altdorf", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Carroburg", + "to": "Bögenhafen", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 161, + "river_days": 3, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Carroburg", + "to": "Marienburg", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Delberz", + "to": "Altdorf", + "road_distance": 322, + "road_days": 8, + "road_danger": "!", + "river_distance": 257, + "river_days": 3, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Delberz", + "to": "Carroburg", + "road_distance": 515, + "road_days": 13, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Delberz", + "to": "Middenheim", + "road_distance": 193, + "road_days": 5, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Drakenhof", + "to": "Eicheschatten (Mootland)", + "road_distance": 386, + "road_days": 10, + "road_danger": "!!", + "river_distance": 410, + "river_days": 4, + "river_danger": "!!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Drakenhof", + "to": "Essen", + "road_distance": 209, + "road_days": 5, + "road_danger": "!!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Drakenhof", + "to": "Waldenhof", + "road_distance": 193, + "road_days": 5, + "road_danger": "!!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Eicheschatten (Mootland)", + "to": "Averheim", + "road_distance": 225, + "road_days": 6, + "road_danger": "", + "river_distance": 209, + "river_days": 2, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Eicheschatten (Mootland)", + "to": "Drakenhof", + "road_distance": 386, + "road_days": 10, + "road_danger": "!!", + "river_distance": 410, + "river_days": 8, + "river_danger": "!!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Eicheschatten (Mootland)", + "to": "Nuln", + "road_distance": 539, + "road_days": 13, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Eicheschatten (Mootland)", + "to": "Wurtbad", + "road_distance": 378, + "road_days": 9, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Erengrad (Kislev)", + "to": "Kislev (Kislev)", + "road_distance": 636, + "road_days": 16, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Erengrad (Kislev)", + "to": "Praag (Kislev)", + "road_distance": 716, + "road_days": 18, + "road_danger": "!", + "river_distance": 716, + "river_days": 13, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Erengrad (Kislev)", + "to": "Salkalten", + "road_distance": 209, + "road_days": 5, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 104, + "sea_days": 2, + "sea_danger": "!" + }, + { + "from": "Erengrad (Kislev)", + "to": "Wolfenburg", + "road_distance": 451, + "road_days": 11, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Erengrad (Kislev)", + "to": "L’AnguilleBretonnia)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 1064, + "sea_days": 26, + "sea_danger": "!" + }, + { + "from": "Erengrad (Kislev)", + "to": "Marienburg", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 925, + "sea_days": 23, + "sea_danger": "!" + }, + { + "from": "Erengrad (Kislev)", + "to": "Neues Emskrank", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 269, + "sea_days": 7, + "sea_danger": "!" + }, + { + "from": "Erengrad (Kislev)", + "to": "Olricstaad (Norsca: Skaelings)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 843, + "sea_days": 21, + "sea_danger": "!" + }, + { + "from": "Erengrad (Kislev)", + "to": "Stromstaad (Norsca: Sarls)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 395, + "sea_days": 10, + "sea_danger": "!" + }, + { + "from": "Essen", + "to": "Bechafen", + "road_distance": 668, + "road_days": 17, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Essen", + "to": "Drakenhof", + "road_distance": 209, + "road_days": 5, + "road_danger": "!!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Essen", + "to": "Peak Pass (Karak Kadrin", + "road_distance": 402, + "road_days": 10, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Essen", + "to": "Waldenhof", + "road_distance": 97, + "road_days": 2, + "road_danger": "!!", + "river_distance": 113, + "river_days": 3, + "river_danger": "!!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Essen", + "to": "Wurtbad", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 587, + "river_days": 10, + "river_danger": "!!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Grenzstadt (Black Fire Pass)", + "to": "Averheim", + "road_distance": 298, + "road_days": 7, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Grenzstadt (Black Fire Pass)", + "to": "Barak Varr (Dwarfs/The Border Princes)", + "road_distance": 901, + "road_days": 23, + "road_danger": "!!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Grenzstadt (Black Fire Pass)", + "to": "Hochsleben", + "road_distance": 72, + "road_days": 2, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Helmgart (Axe Bite Pass)", + "to": "Bögenhafen", + "road_distance": 121, + "road_days": 3, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Helmgart (Axe Bite Pass)", + "to": "Montfort (Bretonnia)", + "road_distance": 177, + "road_days": 4, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Hergig", + "to": "Middenheim", + "road_distance": 483, + "road_days": 12, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Hergig", + "to": "Talabheim", + "road_distance": 113, + "road_days": 3, + "road_danger": "!", + "river_distance": 129, + "river_days": 1, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Hergig", + "to": "Wolfenburg", + "road_distance": 177, + "road_days": 4, + "road_danger": "!", + "river_distance": 161, + "river_days": 3, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Hergig", + "to": "Bechafen", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 604, + "river_days": 11, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Hergig", + "to": "Zavstra (Kislev)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 459, + "river_days": 9, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Hochsleben", + "to": "Grenzstadt (Black Fire Pass)", + "road_distance": 72, + "road_days": 2, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Hochsleben", + "to": "Pfeildorf", + "road_distance": 435, + "road_days": 11, + "road_danger": "", + "river_distance": 435, + "river_days": 4, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Karak Azgaraz (Dwarfs/Grey Mountains)", + "to": "Übersreik", + "road_distance": 97, + "road_days": 2, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Karak Hirn (Dwarfs/Black Mountains)", + "to": "Wusterburg", + "road_distance": 217, + "road_days": 5, + "road_danger": "!", + "river_distance": 217, + "river_days": 2, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kemperbad", + "to": "Altdorf", + "road_distance": 298, + "road_days": 7, + "road_danger": "", + "river_distance": 282, + "river_days": 3, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kemperbad", + "to": "Nuln", + "road_distance": 209, + "road_days": 5, + "road_danger": "", + "river_distance": 217, + "river_days": 4, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kemperbad", + "to": "Übersreik", + "road_distance": 233, + "road_days": 6, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kemperbad", + "to": "Wurtbad", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 322, + "river_days": 7, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kislev (Kislev)", + "to": "Zavstra (Kislev)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 370, + "river_days": 7, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kislev (Kislev)", + "to": "Erengrad (Kislev)", + "road_distance": 636, + "road_days": 16, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kislev (Kislev)", + "to": "Praag (Kislev)", + "road_distance": 523, + "road_days": 13, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kislev (Kislev)", + "to": "Zavstra (Kislev)", + "road_distance": 370, + "road_days": 9, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kreutzhofen (Winter’s Teeth & Montdidier Passes)", + "to": "Mortensholm (The Border Princes)", + "road_distance": 201, + "road_days": 5, + "road_danger": "!!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kreutzhofen (Winter’s Teeth & Montdidier Passes)", + "to": "Quenelles (Bretonnia)", + "road_distance": 684, + "road_days": 17, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Kreutzhofen (Winter’s Teeth & Montdidier Passes)", + "to": "Wusterburg", + "road_distance": 225, + "road_days": 6, + "road_danger": "!", + "river_distance": 233, + "river_days": 2, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "L’Anguille (Bretonnia)", + "to": "Marienburg", + "road_distance": 1135, + "road_days": 28, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 586, + "sea_days": 14, + "sea_danger": "!" + }, + { + "from": "L’Anguille (Bretonnia)", + "to": "Erengrad (Kislev)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 1064, + "sea_days": 26, + "sea_danger": "!" + }, + { + "from": "L’Anguille (Bretonnia)", + "to": "Neues Emskrank", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 795, + "sea_days": 20, + "sea_danger": "!" + }, + { + "from": "L’Anguille (Bretonnia)", + "to": "Olricstaad (Norsca: Skaelings)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 408, + "sea_days": 10, + "sea_danger": "!!" + }, + { + "from": "L’Anguille (Bretonnia)", + "to": "Salkalten", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 960, + "sea_days": 24, + "sea_danger": "!" + }, + { + "from": "L’Anguille (Bretonnia)", + "to": "Stromstaad (Norsca: Sarls)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 877, + "sea_days": 22, + "sea_danger": "!!" + }, + { + "from": "Marienburg", + "to": "Carroburg", + "road_distance": 402, + "road_days": 10, + "road_danger": "", + "river_distance": 457, + "river_days": 9, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Marienburg", + "to": "L’Anguille (Bretonnia)", + "road_distance": 1135, + "road_days": 28, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 586, + "sea_days": 14, + "sea_danger": "!" + }, + { + "from": "Marienburg", + "to": "Middenheim", + "road_distance": 612, + "road_days": 15, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Marienburg", + "to": "Erengrad (Kislev)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 925, + "sea_days": 23, + "sea_danger": "!" + }, + { + "from": "Marienburg", + "to": "Neues Emskrank", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 656, + "sea_days": 16, + "sea_danger": "!" + }, + { + "from": "Marienburg", + "to": "Olricstaad (Norsca: Skaelings)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 448, + "sea_days": 11, + "sea_danger": "!!" + }, + { + "from": "Marienburg", + "to": "Salkalten", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 821, + "sea_days": 20, + "sea_danger": "!" + }, + { + "from": "Marienburg", + "to": "Stromstaad (Norsca: Sarls)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 695, + "sea_days": 17, + "sea_danger": "!!" + }, + { + "from": "Middenheim", + "to": "Delberz", + "road_distance": 193, + "road_days": 5, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Middenheim", + "to": "Hergig", + "road_distance": 483, + "road_days": 12, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Middenheim", + "to": "Marienburg", + "road_distance": 612, + "road_days": 15, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Middenheim", + "to": "Salzenmund", + "road_distance": 177, + "road_days": 4, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Middenheim", + "to": "Talabheim", + "road_distance": 443, + "road_days": 11, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Middenheim", + "to": "Wolfenburg", + "road_distance": 483, + "road_days": 12, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Montfort (Bretonnia)", + "to": "Helmgart (Axe Bite Pass)", + "road_distance": 177, + "road_days": 4, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Mortensholm (The Border Princes)", + "to": "Kreutzhofen (Winter’s Teeth & Montdidier Passes)", + "road_distance": 201, + "road_days": 5, + "road_danger": "!!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Neues Emskrank", + "to": "Salzenmund", + "road_distance": 161, + "road_days": 4, + "road_danger": "", + "river_distance": 137, + "river_days": 3, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Neues Emskrank", + "to": "Erengrad (Kislev)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 269, + "sea_days": 7, + "sea_danger": "!" + }, + { + "from": "Neues Emskrank", + "to": "L’Anguille (Bretonnia)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 795, + "sea_days": 20, + "sea_danger": "!" + }, + { + "from": "Neues Emskrank", + "to": "Marienburg", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 656, + "sea_days": 16, + "sea_danger": "!" + }, + { + "from": "Neues Emskrank", + "to": "Olricstaad (Norsca: Skaelings)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 578, + "sea_days": 14, + "sea_danger": "!!" + }, + { + "from": "Neues Emskrank", + "to": "Salkalten", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 165, + "sea_days": 4, + "sea_danger": "!" + }, + { + "from": "Neues Emskrank", + "to": "Stromstaad (Norsca: Sarls)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 269, + "sea_days": 7, + "sea_danger": "!!" + }, + { + "from": "Nuln", + "to": "Averheim", + "road_distance": 370, + "road_days": 9, + "road_danger": "", + "river_distance": 322, + "river_days": 7, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Nuln", + "to": "Eicheschatten (Mootland)", + "road_distance": 539, + "road_days": 13, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Nuln", + "to": "Kemperbad", + "road_distance": 209, + "road_days": 5, + "road_danger": "", + "river_distance": 177, + "river_days": 2, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Nuln", + "to": "Pfeildorf", + "road_distance": 129, + "road_days": 3, + "road_danger": "", + "river_distance": 129, + "river_days": 3, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Nuln", + "to": "Übersreik", + "road_distance": 217, + "road_days": 5, + "road_danger": "!", + "river_distance": 225, + "river_days": 4, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Nuln", + "to": "Wurtbad", + "road_distance": 459, + "road_days": 11, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Olricstaad (Norsca: Skaelings)", + "to": "Erengrad (Kislev)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 843, + "sea_days": 21, + "sea_danger": "!!" + }, + { + "from": "Olricstaad (Norsca: Skaelings)", + "to": "L’Anguille (Bretonnia)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 408, + "sea_days": 10, + "sea_danger": "!!" + }, + { + "from": "Olricstaad (Norsca: Skaelings)", + "to": "Marienburg", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 448, + "sea_days": 11, + "sea_danger": "!!" + }, + { + "from": "Olricstaad (Norsca: Skaelings)", + "to": "Neues Emskrank", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 578, + "sea_days": 14, + "sea_danger": "!!" + }, + { + "from": "Olricstaad (Norsca: Skaelings)", + "to": "Stromstaad (Norsca: Sarls)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 660, + "sea_days": 16, + "sea_danger": "!!" + }, + { + "from": "Olricstaad (Norsca: Skaelings)", + "to": "Salkalten", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 747, + "sea_days": 18, + "sea_danger": "!!" + }, + { + "from": "Parravon (Bretonnia)", + "to": "Übersreik", + "road_distance": 282, + "road_days": 7, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Peak Pass (Karak Kadrin)", + "to": "Bechafen", + "road_distance": 491, + "road_days": 12, + "road_danger": "!", + "river_distance": 491, + "river_days": 5, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Peak Pass (Karak Kadrin)", + "to": "Essen", + "road_distance": 402, + "road_days": 10, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Pfeildorf", + "to": "Averheim", + "road_distance": 451, + "road_days": 11, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Pfeildorf", + "to": "Hochsleben", + "road_distance": 435, + "road_days": 11, + "road_danger": "", + "river_distance": 435, + "river_days": 8, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Pfeildorf", + "to": "Nuln", + "road_distance": 129, + "road_days": 3, + "road_danger": "", + "river_distance": 129, + "river_days": 1, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Pfeildorf", + "to": "Wusterburg", + "road_distance": 346, + "road_days": 9, + "road_danger": "", + "river_distance": 346, + "river_days": 7, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Praag (Kislev)", + "to": "Erengrad (Kislev)", + "road_distance": 716, + "road_days": 18, + "road_danger": "!", + "river_distance": 716, + "river_days": 13, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Praag (Kislev)", + "to": "Kislev (Kislev)", + "road_distance": 523, + "road_days": 13, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Quenelles (Bretonnia)", + "to": "Kreutzhofen (Winter’s Teeth & Montdidier Passes)", + "road_distance": 684, + "road_days": 17, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Salkalten", + "to": "Erengrad (Kislev)", + "road_distance": 209, + "road_days": 5, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Salkalten", + "to": "Salzenmund", + "road_distance": 378, + "road_days": 9, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Salkalten", + "to": "Wolfenburg", + "road_distance": 412, + "road_days": 10, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Salkalten", + "to": "Erengrad (Kislev)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 104, + "sea_days": 2, + "sea_danger": "!" + }, + { + "from": "Salkalten", + "to": "L’Anguille (Bretonnia)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 960, + "sea_days": 24, + "sea_danger": "!" + }, + { + "from": "Salkalten", + "to": "Marienburg", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 821, + "sea_days": 20, + "sea_danger": "!" + }, + { + "from": "Salkalten", + "to": "Neues Emskrank", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 165, + "sea_days": 4, + "sea_danger": "!" + }, + { + "from": "Salkalten", + "to": "Olricstaad (Norsca: Skaelings)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 747, + "sea_days": 18, + "sea_danger": "!!" + }, + { + "from": "Salkalten", + "to": "Stromstaad (Norsca: Sarls)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 326, + "sea_days": 8, + "sea_danger": "!!" + }, + { + "from": "Salzenmund", + "to": "Middenheim", + "road_distance": 177, + "road_days": 4, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Salzenmund", + "to": "Neues Emskrank", + "road_distance": 161, + "road_days": 4, + "road_danger": "", + "river_distance": 137, + "river_days": 1, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Salzenmund", + "to": "Salkalten", + "road_distance": 378, + "road_days": 9, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Salzenmund", + "to": "Neues Emskran", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Stromstaad (Norsca: Sarls)", + "to": "Erengrad (Kislev)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 395, + "sea_days": 10, + "sea_danger": "!!" + }, + { + "from": "Stromstaad (Norsca: Sarls)", + "to": "L’Anguille (Bretonnia)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 877, + "sea_days": 22, + "sea_danger": "!!" + }, + { + "from": "Stromstaad (Norsca: Sarls)", + "to": "Marienburg", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 695, + "sea_days": 17, + "sea_danger": "!!" + }, + { + "from": "Stromstaad (Norsca: Sarls)", + "to": "Neues Emskrank", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 269, + "sea_days": 7, + "sea_danger": "!!" + }, + { + "from": "Stromstaad (Norsca: Sarls)", + "to": "Olricstaad (Norsca: Skaelings)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 660, + "sea_days": 16, + "sea_danger": "!!" + }, + { + "from": "Stromstaad (Norsca: Sarls)", + "to": "Salkalten", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": 326, + "sea_days": 8, + "sea_danger": "!!" + }, + { + "from": "Talabheim", + "to": "Altdorf", + "road_distance": 475, + "road_days": 12, + "road_danger": "", + "river_distance": 451, + "river_days": 4, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Talabheim", + "to": "Bechafen", + "road_distance": 604, + "road_days": 15, + "road_danger": "!", + "river_distance": 604, + "river_days": 12, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Talabheim", + "to": "Hergig", + "road_distance": 113, + "road_days": 3, + "road_danger": "!", + "river_distance": 129, + "river_days": 3, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Talabheim", + "to": "Middenheim", + "road_distance": 443, + "road_days": 11, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Talabheim", + "to": "Wurtbad", + "road_distance": 306, + "road_days": 8, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Talabheim", + "to": "Zavstra (Kislev)", + "road_distance": 459, + "road_days": 11, + "road_danger": "!", + "river_distance": 459, + "river_days": 9, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Übersreik", + "to": "Bögenhafen", + "road_distance": 169, + "road_days": 4, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Übersreik", + "to": "Karak Azgaraz (Dwarfs/Grey Mountains)", + "road_distance": 105, + "road_days": 3, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Übersreik", + "to": "Kemperbad", + "road_distance": 233, + "road_days": 6, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Übersreik", + "to": "Nuln", + "road_distance": 217, + "road_days": 5, + "road_danger": "!", + "river_distance": 225, + "river_days": 4, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Übersreik", + "to": "Parravon (Bretonnia)", + "road_distance": 282, + "road_days": 7, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Übersreik", + "to": "Altdorf", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 338, + "river_days": 3, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Waldenhof", + "to": "Essen", + "road_distance": 97, + "road_days": 2, + "road_danger": "!!", + "river_distance": 113, + "river_days": 1, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Waldenhof", + "to": "Drakenhof", + "road_distance": 193, + "road_days": 5, + "road_danger": "!!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wolfenburg", + "to": "Erengrad (Kislev)", + "road_distance": 451, + "road_days": 11, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wolfenburg", + "to": "Hergig", + "road_distance": 177, + "road_days": 4, + "road_danger": "!", + "river_distance": 161, + "river_days": 1, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wolfenburg", + "to": "Middenheim", + "road_distance": 483, + "road_days": 12, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wolfenburg", + "to": "Salkalten", + "road_distance": 410, + "road_days": 10, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wurtbad", + "to": "Averheim", + "road_distance": 241, + "road_days": 6, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wurtbad", + "to": "Bechafen", + "road_distance": 756, + "road_days": 19, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wurtbad", + "to": "Eicheschatten (Mootland)", + "road_distance": 378, + "road_days": 9, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wurtbad", + "to": "Nuln", + "road_distance": 459, + "road_days": 11, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wurtbad", + "to": "Talabheim", + "road_distance": 306, + "road_days": 8, + "road_danger": "!", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wurtbad", + "to": "Essen", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 587, + "river_days": 10, + "river_danger": "!!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wurtbad", + "to": "Kemperbad", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 322, + "river_days": 3, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wusterburg", + "to": "Kreutzhofen (Winter’s Teeth & Montdidier Passes)", + "road_distance": 225, + "road_days": 6, + "road_danger": "", + "river_distance": "", + "river_days": "", + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wusterburg", + "to": "Pfeildorf", + "road_distance": 346, + "road_days": 9, + "road_danger": "", + "river_distance": 346, + "river_days": 3, + "river_danger": "", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wusterburg", + "to": "Karak Hirn (Dwarfs/Black Mountains)", + "road_distance": 217, + "road_days": 5, + "road_danger": "!", + "river_distance": 217, + "river_days": 4, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Wusterburg", + "to": "Kreutzhofen (Winter’s Teeth & Montdidier Passes)", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 233, + "river_days": 4, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Zavstra (Kislev)", + "to": "Bechafen", + "road_distance": 45, + "road_days": 1, + "road_danger": "!", + "river_distance": 145, + "river_days": 2, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Zavstra (Kislev)", + "to": "Hergig", + "road_distance": "", + "road_days": "", + "road_danger": "", + "river_distance": 459, + "river_days": 5, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Zavstra (Kislev)", + "to": "Kislev (Kislev)", + "road_distance": 370, + "road_days": 9, + "road_danger": "!", + "river_distance": 370, + "river_days": 7, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + }, + { + "from": "Zavstra (Kislev)", + "to": "Talabheim", + "road_distance": 459, + "road_days": 11, + "road_danger": "!", + "river_distance": 459, + "river_days": 5, + "river_danger": "!", + "sea_distance": "", + "sea_days": "", + "sea_danger": "" + } +] \ No newline at end of file diff --git a/modules/travelv2/travelv2-init.js b/modules/travelv2/travelv2-init.js new file mode 100644 index 0000000..044a7b9 --- /dev/null +++ b/modules/travelv2/travelv2-init.js @@ -0,0 +1,67 @@ +import TravelDistanceV2 from './TravelDistanceV2.js'; + +/** + * Initialisation du module TravelV2 + */ +export function initTravelV2() { + console.log("TravelV2: Initialisation du module de voyage"); + + // Hook pour charger les données au démarrage + Hooks.once('ready', async () => { + console.log("TravelV2: Chargement des données de voyage"); + + // Exposer la classe globalement pour accès depuis la console + game.wfrp4e = game.wfrp4e || {}; + game.wfrp4e.travelv2 = TravelDistanceV2; + + await TravelDistanceV2.loadTravelData(); + + console.log("TravelV2: Classe accessible via game.wfrp4e.travelv2"); + + // Enregistrer la commande dans le système WFRP4e si disponible + if (game.wfrp4e?.commands) { + console.log("TravelV2: Enregistrement de la commande /voyage"); + game.wfrp4e.commands.add({ + voyage: { + description: "Outil de calcul de distances de voyage (FR)", + args: ["from", "to"], + defaultArg: "from", + callback: (from, to) => { + // Vérifier que l'utilisateur est GM + if (!game.user.isGM) { + ui.notifications.warn("La commande /voyage est réservée au MJ."); + return; + } + + console.log(`TravelV2: Commande /voyage exécutée`); + console.log(`TravelV2: from =`, from, `(type: ${typeof from})`); + console.log(`TravelV2: to =`, to, `(type: ${typeof to})`); + console.log(`TravelV2: from === null ?`, from === null); + console.log(`TravelV2: to === null ?`, to === null); + + // Convertir null en undefined pour que la logique fonctionne + from = from || undefined; + to = to || undefined; + + TravelDistanceV2.displayTravelDistance(from, to); + } + } + }); + console.log("TravelV2: Commande /voyage enregistrée avec succès"); + } else { + console.warn("TravelV2: game.wfrp4e.commands non disponible"); + } + }); + + // Hook pour ajouter un gestionnaire de clics sur les liens de voyage + Hooks.on('renderChatMessage', (message, html, data) => { + // Ajouter un listener pour les clics sur les liens de voyage + html.find('a[data-action="clickVoyage"]').click((event) => { + event.preventDefault(); + const target = event.currentTarget; + TravelDistanceV2.handleTravelClick(event, target); + }); + }); + + console.log("TravelV2: Module de voyage initialisé"); +} diff --git a/packs/aides-de-jeu-fr/001233.log b/packs/aides-de-jeu-fr/001249.log similarity index 100% rename from packs/aides-de-jeu-fr/001233.log rename to packs/aides-de-jeu-fr/001249.log diff --git a/packs/aides-de-jeu-fr/CURRENT b/packs/aides-de-jeu-fr/CURRENT index d5f316e..444bc90 100644 --- a/packs/aides-de-jeu-fr/CURRENT +++ b/packs/aides-de-jeu-fr/CURRENT @@ -1 +1 @@ -MANIFEST-001231 +MANIFEST-001247 diff --git a/packs/aides-de-jeu-fr/LOG b/packs/aides-de-jeu-fr/LOG index 7eb2888..ef5c6d2 100644 --- a/packs/aides-de-jeu-fr/LOG +++ b/packs/aides-de-jeu-fr/LOG @@ -1,7 +1,7 @@ -2026/01/05-17:20:14.396780 7f93eb7fe6c0 Recovering log #1229 -2026/01/05-17:20:14.456467 7f93eb7fe6c0 Delete type=3 #1227 -2026/01/05-17:20:14.456537 7f93eb7fe6c0 Delete type=0 #1229 -2026/01/05-17:22:12.851160 7f93e9ffb6c0 Level-0 table #1234: started -2026/01/05-17:22:12.851180 7f93e9ffb6c0 Level-0 table #1234: 0 bytes OK -2026/01/05-17:22:12.857087 7f93e9ffb6c0 Delete type=0 #1232 -2026/01/05-17:22:12.870416 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end) +2026/01/07-14:19:22.396531 7f93ebfff6c0 Recovering log #1245 +2026/01/07-14:19:22.406238 7f93ebfff6c0 Delete type=3 #1243 +2026/01/07-14:19:22.406300 7f93ebfff6c0 Delete type=0 #1245 +2026/01/07-15:04:29.638874 7f93e9ffb6c0 Level-0 table #1250: started +2026/01/07-15:04:29.638900 7f93e9ffb6c0 Level-0 table #1250: 0 bytes OK +2026/01/07-15:04:29.650961 7f93e9ffb6c0 Delete type=0 #1248 +2026/01/07-15:04:29.667055 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end) diff --git a/packs/aides-de-jeu-fr/LOG.old b/packs/aides-de-jeu-fr/LOG.old index 604cdf6..3dc5826 100644 --- a/packs/aides-de-jeu-fr/LOG.old +++ b/packs/aides-de-jeu-fr/LOG.old @@ -1,7 +1,7 @@ -2026/01/04-22:01:24.254078 7f93eaffd6c0 Recovering log #1224 -2026/01/04-22:01:24.350065 7f93eaffd6c0 Delete type=3 #1222 -2026/01/04-22:01:24.350146 7f93eaffd6c0 Delete type=0 #1224 -2026/01/04-22:02:13.377643 7f93e9ffb6c0 Level-0 table #1230: started -2026/01/04-22:02:13.377670 7f93e9ffb6c0 Level-0 table #1230: 0 bytes OK -2026/01/04-22:02:13.384805 7f93e9ffb6c0 Delete type=0 #1228 -2026/01/04-22:02:13.385131 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end) +2026/01/07-11:52:43.553005 7f93eb7fe6c0 Recovering log #1241 +2026/01/07-11:52:43.562263 7f93eb7fe6c0 Delete type=3 #1239 +2026/01/07-11:52:43.562323 7f93eb7fe6c0 Delete type=0 #1241 +2026/01/07-14:13:58.261989 7f93e9ffb6c0 Level-0 table #1246: started +2026/01/07-14:13:58.262029 7f93e9ffb6c0 Level-0 table #1246: 0 bytes OK +2026/01/07-14:13:58.268966 7f93e9ffb6c0 Delete type=0 #1244 +2026/01/07-14:13:58.287503 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!3IgmiprzLB6Lwenc' @ 72057594037927935 : 1 .. '!journal.pages!suuYN87Al1ZZWtQQ.jhgNnhWhrkOpKs1B' @ 0 : 0; will stop at (end) diff --git a/packs/aides-de-jeu-fr/MANIFEST-001231 b/packs/aides-de-jeu-fr/MANIFEST-001247 similarity index 84% rename from packs/aides-de-jeu-fr/MANIFEST-001231 rename to packs/aides-de-jeu-fr/MANIFEST-001247 index bf26cc66bee2ea820857f3979a56677db8231788..9421a4aff032a0520a2847ed3f077fde80f17e2e 100644 GIT binary patch delta 41 scmaFF_=s`B0i~lc3uCw#7?~b$axySKk delta 41 scmaFF_=s`B0VRDo6B{lDMy3m#oD9qtIa%cQOjsrY61WHwxC|5k0PMvH-2eap diff --git a/packs/antidotes-and-remedes/001235.log b/packs/antidotes-and-remedes/001251.log similarity index 100% rename from packs/antidotes-and-remedes/001235.log rename to packs/antidotes-and-remedes/001251.log diff --git a/packs/antidotes-and-remedes/CURRENT b/packs/antidotes-and-remedes/CURRENT index c0d5c45..6d05ed4 100644 --- a/packs/antidotes-and-remedes/CURRENT +++ b/packs/antidotes-and-remedes/CURRENT @@ -1 +1 @@ -MANIFEST-001233 +MANIFEST-001249 diff --git a/packs/antidotes-and-remedes/LOG b/packs/antidotes-and-remedes/LOG index 86014d7..7757958 100644 --- a/packs/antidotes-and-remedes/LOG +++ b/packs/antidotes-and-remedes/LOG @@ -1,7 +1,7 @@ -2026/01/05-17:20:14.458755 7f93eb7fe6c0 Recovering log #1231 -2026/01/05-17:20:14.498635 7f93eb7fe6c0 Delete type=3 #1229 -2026/01/05-17:20:14.498701 7f93eb7fe6c0 Delete type=0 #1231 -2026/01/05-17:22:12.845184 7f93e9ffb6c0 Level-0 table #1236: started -2026/01/05-17:22:12.845214 7f93e9ffb6c0 Level-0 table #1236: 0 bytes OK -2026/01/05-17:22:12.851070 7f93e9ffb6c0 Delete type=0 #1234 -2026/01/05-17:22:12.870407 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end) +2026/01/07-14:19:22.408420 7f93ea7fc6c0 Recovering log #1247 +2026/01/07-14:19:22.419450 7f93ea7fc6c0 Delete type=3 #1245 +2026/01/07-14:19:22.419496 7f93ea7fc6c0 Delete type=0 #1247 +2026/01/07-15:04:29.689520 7f93e9ffb6c0 Level-0 table #1252: started +2026/01/07-15:04:29.689548 7f93e9ffb6c0 Level-0 table #1252: 0 bytes OK +2026/01/07-15:04:29.701802 7f93e9ffb6c0 Delete type=0 #1250 +2026/01/07-15:04:29.713438 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end) diff --git a/packs/antidotes-and-remedes/LOG.old b/packs/antidotes-and-remedes/LOG.old index 606c5e9..2730f59 100644 --- a/packs/antidotes-and-remedes/LOG.old +++ b/packs/antidotes-and-remedes/LOG.old @@ -1,7 +1,7 @@ -2026/01/04-22:01:24.357771 7f93ebfff6c0 Recovering log #1226 -2026/01/04-22:01:24.468440 7f93ebfff6c0 Delete type=3 #1224 -2026/01/04-22:01:24.468504 7f93ebfff6c0 Delete type=0 #1226 -2026/01/04-22:02:13.391738 7f93e9ffb6c0 Level-0 table #1232: started -2026/01/04-22:02:13.391763 7f93e9ffb6c0 Level-0 table #1232: 0 bytes OK -2026/01/04-22:02:13.397715 7f93e9ffb6c0 Delete type=0 #1230 -2026/01/04-22:02:13.410782 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end) +2026/01/07-11:52:43.564696 7f93eaffd6c0 Recovering log #1243 +2026/01/07-11:52:43.574474 7f93eaffd6c0 Delete type=3 #1241 +2026/01/07-11:52:43.574525 7f93eaffd6c0 Delete type=0 #1243 +2026/01/07-14:13:58.147558 7f93e9ffb6c0 Level-0 table #1248: started +2026/01/07-14:13:58.147600 7f93e9ffb6c0 Level-0 table #1248: 0 bytes OK +2026/01/07-14:13:58.155066 7f93e9ffb6c0 Delete type=0 #1246 +2026/01/07-14:13:58.161970 7f93e9ffb6c0 Manual compaction at level-0 from '!folders!3uquYH73ttCdoH0I' @ 72057594037927935 : 1 .. '!items!ylFhk7mGZOnAJTUT' @ 0 : 0; will stop at (end) diff --git a/packs/antidotes-and-remedes/MANIFEST-001233 b/packs/antidotes-and-remedes/MANIFEST-001249 similarity index 71% rename from packs/antidotes-and-remedes/MANIFEST-001233 rename to packs/antidotes-and-remedes/MANIFEST-001249 index 0a6f9d7dcf9c40dd54d111048db2ac40ee4c8bb0..812138097009ca796704abb1041bb628c29a2295 100644 GIT binary patch delta 43 tcmdnQxQTH>pUO||FMiw%j7*O>IT@HAbFwU8mVT6H4H9__5_t*|0RSk%3+Mm< delta 43 tcmdnQxQTH>pNfWM*nVyXMy5-goD9sDIawAkb3HzD3M6tFBytrb0ss%)3zYx> diff --git a/packs/apothicarium/001233.log b/packs/apothicarium/001249.log similarity index 100% rename from packs/apothicarium/001233.log rename to packs/apothicarium/001249.log diff --git a/packs/apothicarium/CURRENT b/packs/apothicarium/CURRENT index d5f316e..444bc90 100644 --- a/packs/apothicarium/CURRENT +++ b/packs/apothicarium/CURRENT @@ -1 +1 @@ -MANIFEST-001231 +MANIFEST-001247 diff --git a/packs/apothicarium/LOG b/packs/apothicarium/LOG index 5507c07..5dc0a1c 100644 --- a/packs/apothicarium/LOG +++ b/packs/apothicarium/LOG @@ -1,7 +1,7 @@ -2026/01/05-17:20:14.575428 7f93ea7fc6c0 Recovering log #1229 -2026/01/05-17:20:14.619638 7f93ea7fc6c0 Delete type=3 #1227 -2026/01/05-17:20:14.619716 7f93ea7fc6c0 Delete type=0 #1229 -2026/01/05-17:22:12.876750 7f93e9ffb6c0 Level-0 table #1234: started -2026/01/05-17:22:12.876780 7f93e9ffb6c0 Level-0 table #1234: 0 bytes OK -2026/01/05-17:22:12.884154 7f93e9ffb6c0 Delete type=0 #1232 -2026/01/05-17:22:12.900968 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end) +2026/01/07-14:19:22.434524 7f93ea7fc6c0 Recovering log #1245 +2026/01/07-14:19:22.444128 7f93ea7fc6c0 Delete type=3 #1243 +2026/01/07-14:19:22.444200 7f93ea7fc6c0 Delete type=0 #1245 +2026/01/07-15:04:29.701936 7f93e9ffb6c0 Level-0 table #1250: started +2026/01/07-15:04:29.701958 7f93e9ffb6c0 Level-0 table #1250: 0 bytes OK +2026/01/07-15:04:29.713305 7f93e9ffb6c0 Delete type=0 #1248 +2026/01/07-15:04:29.713449 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end) diff --git a/packs/apothicarium/LOG.old b/packs/apothicarium/LOG.old index d94d2a5..9c3da27 100644 --- a/packs/apothicarium/LOG.old +++ b/packs/apothicarium/LOG.old @@ -1,7 +1,7 @@ -2026/01/04-22:01:24.562817 7f93eb7fe6c0 Recovering log #1224 -2026/01/04-22:01:24.662382 7f93eb7fe6c0 Delete type=3 #1222 -2026/01/04-22:01:24.662455 7f93eb7fe6c0 Delete type=0 #1224 -2026/01/04-22:02:13.397968 7f93e9ffb6c0 Level-0 table #1230: started -2026/01/04-22:02:13.398010 7f93e9ffb6c0 Level-0 table #1230: 0 bytes OK -2026/01/04-22:02:13.404471 7f93e9ffb6c0 Delete type=0 #1228 -2026/01/04-22:02:13.410790 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end) +2026/01/07-11:52:43.591322 7f93ebfff6c0 Recovering log #1241 +2026/01/07-11:52:43.600886 7f93ebfff6c0 Delete type=3 #1239 +2026/01/07-11:52:43.600949 7f93ebfff6c0 Delete type=0 #1241 +2026/01/07-14:13:58.155183 7f93e9ffb6c0 Level-0 table #1246: started +2026/01/07-14:13:58.155206 7f93e9ffb6c0 Level-0 table #1246: 0 bytes OK +2026/01/07-14:13:58.161725 7f93e9ffb6c0 Delete type=0 #1244 +2026/01/07-14:13:58.161982 7f93e9ffb6c0 Manual compaction at level-0 from '!journal!cZtNgayIw2QFhC9u' @ 72057594037927935 : 1 .. '!journal.pages!cZtNgayIw2QFhC9u.ts265H1XkisLgdow' @ 0 : 0; will stop at (end) diff --git a/packs/apothicarium/MANIFEST-001231 b/packs/apothicarium/MANIFEST-001247 similarity index 84% rename from packs/apothicarium/MANIFEST-001231 rename to packs/apothicarium/MANIFEST-001247 index 03976035b77d6363069d1b61d5419a0b9e52bbc8..efd99fcffd4462260cc56a1a0b20575d292dee45 100644 GIT binary patch delta 41 scmaFF_=s`B0i|8~kJPys7?~b$axySKz>% delta 41 scmaFF_=s`B0VUJWh{IeAj7%3eIT@HQa diff --git a/packs/plats-dauberges/001233.log b/packs/plats-dauberges/001249.log similarity index 100% rename from packs/plats-dauberges/001233.log rename to packs/plats-dauberges/001249.log diff --git a/packs/plats-dauberges/CURRENT b/packs/plats-dauberges/CURRENT index d5f316e..444bc90 100644 --- a/packs/plats-dauberges/CURRENT +++ b/packs/plats-dauberges/CURRENT @@ -1 +1 @@ -MANIFEST-001231 +MANIFEST-001247 diff --git a/packs/plats-dauberges/LOG b/packs/plats-dauberges/LOG index daa9a28..5026e5a 100644 --- a/packs/plats-dauberges/LOG +++ b/packs/plats-dauberges/LOG @@ -1,7 +1,7 @@ -2026/01/05-17:20:14.280921 7f93ea7fc6c0 Recovering log #1229 -2026/01/05-17:20:14.337958 7f93ea7fc6c0 Delete type=3 #1227 -2026/01/05-17:20:14.338043 7f93ea7fc6c0 Delete type=0 #1229 -2026/01/05-17:22:12.838440 7f93e9ffb6c0 Level-0 table #1234: started -2026/01/05-17:22:12.838473 7f93e9ffb6c0 Level-0 table #1234: 0 bytes OK -2026/01/05-17:22:12.844706 7f93e9ffb6c0 Delete type=0 #1232 -2026/01/05-17:22:12.844991 7f93e9ffb6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end) +2026/01/07-14:19:22.369653 7f93ebfff6c0 Recovering log #1245 +2026/01/07-14:19:22.381041 7f93ebfff6c0 Delete type=3 #1243 +2026/01/07-14:19:22.381133 7f93ebfff6c0 Delete type=0 #1245 +2026/01/07-15:04:29.629205 7f93e9ffb6c0 Level-0 table #1250: started +2026/01/07-15:04:29.629243 7f93e9ffb6c0 Level-0 table #1250: 0 bytes OK +2026/01/07-15:04:29.638743 7f93e9ffb6c0 Delete type=0 #1248 +2026/01/07-15:04:29.667035 7f93e9ffb6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end) diff --git a/packs/plats-dauberges/LOG.old b/packs/plats-dauberges/LOG.old index bc1a6dd..740337d 100644 --- a/packs/plats-dauberges/LOG.old +++ b/packs/plats-dauberges/LOG.old @@ -1,7 +1,7 @@ -2026/01/04-22:01:24.060098 7f93ebfff6c0 Recovering log #1224 -2026/01/04-22:01:24.158104 7f93ebfff6c0 Delete type=3 #1222 -2026/01/04-22:01:24.158187 7f93ebfff6c0 Delete type=0 #1224 -2026/01/04-22:02:13.363838 7f93e9ffb6c0 Level-0 table #1230: started -2026/01/04-22:02:13.363872 7f93e9ffb6c0 Level-0 table #1230: 0 bytes OK -2026/01/04-22:02:13.371335 7f93e9ffb6c0 Delete type=0 #1228 -2026/01/04-22:02:13.385100 7f93e9ffb6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end) +2026/01/07-11:52:43.526877 7f93eaffd6c0 Recovering log #1241 +2026/01/07-11:52:43.536850 7f93eaffd6c0 Delete type=3 #1239 +2026/01/07-11:52:43.536897 7f93eaffd6c0 Delete type=0 #1241 +2026/01/07-14:13:58.117963 7f93e9ffb6c0 Level-0 table #1246: started +2026/01/07-14:13:58.118017 7f93e9ffb6c0 Level-0 table #1246: 0 bytes OK +2026/01/07-14:13:58.125919 7f93e9ffb6c0 Delete type=0 #1244 +2026/01/07-14:13:58.134208 7f93e9ffb6c0 Manual compaction at level-0 from '!tables!4l60Lxv8cpsyy2Cg' @ 72057594037927935 : 1 .. '!tables.results!tfaYKDZqu7kgZvRG.yvbwKursaixh2dby' @ 0 : 0; will stop at (end) diff --git a/packs/plats-dauberges/MANIFEST-001231 b/packs/plats-dauberges/MANIFEST-001247 similarity index 83% rename from packs/plats-dauberges/MANIFEST-001231 rename to packs/plats-dauberges/MANIFEST-001247 index dbd97cd9cd3807e1921f82fb68d83467562f2cf1..204101f0f34ce483eeb91ce8c762a26c12ce50d7 100644 GIT binary patch delta 43 tcmaFL_>^(NL6su+FT1!I7?~b$axySKMhFq1tjtiB=Q&}0suUg40Qki delta 43 tcmaFL_>^(NL6yUHVcy&fj7%3eIT@HQaI?zvnHj7+cDI2oAVu(8-kTz5PI5_kg=cn1^!0Q7MRegFUf diff --git a/patch-styles.css b/patch-styles.css index 77baca6..b9ca565 100644 --- a/patch-styles.css +++ b/patch-styles.css @@ -7,4 +7,314 @@ color: darkolivegreen; align-self: center; text-align: center; -} \ No newline at end of file +} + +/* Styles pour le module de voyage TravelV2 */ +.voyage-main-title { + font-size: 1.3em; + font-weight: bold; + margin-top: 0.5em; + margin-bottom: 0.3em; +} + +.voyage-route-title { + font-size: 1.15em; + font-weight: bold; + margin-top: 0.8em; + margin-bottom: 0.3em; + color: #4a5568; +} + +.voyage-section-title { + font-size: 1em; + font-weight: bold; + margin-top: 0.5em; + margin-bottom: 0.2em; +} + +.voyage-destinations-title { + font-size: 1.2em; + font-weight: bold; + margin-bottom: 0.3em; +} + +.voyage-separator { + margin-top: 1em; + margin-bottom: 1em; + border: 0; + border-top: 1px solid #ccc; +} + +/* Styles pour le module Inn (Auberge) */ +.wfrp4e-inn-help h3, +.wfrp4e-inn-list h3 { + font-size: 1.3em; + font-weight: bold; + margin-top: 0.5em; + margin-bottom: 0.5em; + color: #8b4513; + border-bottom: 2px solid #d2691e; + padding-bottom: 0.3em; +} + +.wfrp4e-inn-help ul, +.wfrp4e-inn-list ul { + margin-left: 1.5em; + list-style-type: disc; +} + +.wfrp4e-inn-help li, +.wfrp4e-inn-table-list li { + margin: 0.3em 0; +} + +.wfrp4e-inn-help hr { + margin: 1em 0; + border: 0; + border-top: 1px solid #ccc; +} + +.wfrp4e-inn-help code { + background-color: #f5f5f5; + padding: 0.2em 0.4em; + border-radius: 3px; + font-family: monospace; + color: #d63384; +} + +.wfrp4e-inn-help h4 { + font-size: 1em; + font-weight: bold; + margin: 0.8em 0 0.5em 0; + color: var(--color-warm); +} + +/* Grille de boutons pour les tables */ +.wfrp4e-inn-table-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); + gap: 0.5em; + margin: 0.5em 0; +} + +.inn-table-btn { + display: block; + padding: 0.6em 0.8em; + background: rgba(139, 69, 19, 0.12); + border: 2px solid rgba(139, 69, 19, 0.35); + border-radius: 4px; + text-align: center; + font-weight: 600; + font-size: 0.95em; + color: var(--color-warm); + transition: all 0.2s; + text-decoration: none; +} + +.inn-table-btn:hover { + background: rgba(139, 69, 19, 0.2); + border-color: rgba(139, 69, 19, 0.5); + transform: translateY(-1px); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15); +} + +.inn-table-btn i { + margin-right: 0.4em; + color: var(--color-warm-3); +} + +/* Anciens styles - à supprimer ou garder pour compatibilité */ +.wfrp4e-inn-table-list { + list-style: none; + margin-left: 0; +} + +.wfrp4e-inn-table-list li { + margin: 0.5em 0; + padding-left: 0; +} + +.wfrp4e-inn-table-list a.action-link { + display: inline-block; + padding: 0.3em 0.8em; + background-color: #8b4513; + color: white; + text-decoration: none; + border-radius: 4px; + transition: background-color 0.2s; +} + +.wfrp4e-inn-table-list a.action-link:hover { + background-color: #a0522d; +} + +.wfrp4e-inn-table-list a.action-link i { + margin-right: 0.5em; +} + +.inn-keyword { + font-size: 0.85em; + color: var(--color-grey2); + font-style: italic; +} + +/* Styles pour les résultats de jets d'auberge - Thème WFRP4e */ +.wfrp4e-inn-result { + margin: 0.3em 0; +} + +.wfrp4e-inn-result .message-header { + text-shadow: 0px 0px 1px #00000087; + border: 2px solid rgba(62, 0, 0, 0.3); + padding: 0.4em 0.6em; + margin-bottom: 0.5em; + background: rgba(0, 0, 0, 0.05); +} + +.wfrp4e-inn-result .flavor-text { + color: var(--color-warm); + font-weight: bold; + font-size: 1em; +} + +.wfrp4e-inn-result .message-header i { + margin-right: 0.3em; + color: var(--color-warm-3); +} + +.inn-dish-name { + font-size: 1.15em; + font-weight: bold; + text-align: center; + padding: 0.6em; + margin: 0.3em 0; + background: rgba(255, 255, 255, 0.3); + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 3px; +} + +.inn-roll-info { + text-align: center; + font-size: 0.85em; + color: var(--color-grey2); + margin-top: 0.4em; + padding: 0.3em; +} + +.inn-roll-info i { + margin-right: 0.2em; +} + +/* Styles pour le choix de menu */ +.wfrp4e-inn-menu-choice { + padding: 0.5em; +} + +.wfrp4e-inn-menu-choice h3 { + color: var(--color-warm); + margin: 0 0 0.5em 0; +} + +.inn-menu-buttons { + display: flex; + flex-direction: column; + gap: 0.5em; + margin: 0.5em 0; +} + +.inn-menu-btn { + display: block; + padding: 0.6em 1em; + background: rgba(139, 69, 19, 0.1); + border: 2px solid rgba(139, 69, 19, 0.3); + border-radius: 4px; + text-align: center; + font-weight: bold; + transition: all 0.2s; +} + +.inn-menu-btn:hover { + background: rgba(139, 69, 19, 0.2); + border-color: rgba(139, 69, 19, 0.5); + transform: translateY(-1px); +} + +.inn-menu-btn i { + margin-right: 0.4em; + color: var(--color-warm-3); +} + +.inn-menu-desc { + display: block; + font-size: 0.85em; + font-weight: normal; + color: var(--color-grey2); + margin-top: 0.2em; +} + +/* Styles pour le résultat de menu */ +.wfrp4e-inn-menu-result { + margin: 0.3em 0; +} + +.wfrp4e-inn-menu-result .message-header { + text-shadow: 0px 0px 1px #00000087; + border: 2px solid rgba(62, 0, 0, 0.3); + padding: 0.4em 0.6em; + margin-bottom: 0.5em; + background: rgba(0, 0, 0, 0.05); +} + +.wfrp4e-inn-menu-result .flavor-text { + color: var(--color-warm); + font-weight: bold; + font-size: 1em; +} + +.inn-menu-items { + display: flex; + flex-direction: column; + gap: 0.3em; +} + +.inn-menu-item { + padding: 0.5em; + background: rgba(255, 255, 255, 0.3); + border: 1px solid rgba(0, 0, 0, 0.1); + border-radius: 3px; +} + +.inn-menu-item i { + margin-right: 0.4em; + color: var(--color-warm-3); +} + +.inn-menu-item strong { + color: var(--color-warm); +} + +/* Bouton rapide Menu dans l'aide */ +.inn-menu-quick-btn { + display: block; + padding: 0.7em 1em; + background: rgba(139, 69, 19, 0.15); + border: 2px solid rgba(139, 69, 19, 0.4); + border-radius: 4px; + text-align: center; + font-weight: bold; + font-size: 1.05em; + color: var(--color-warm); + transition: all 0.2s; +} + +.inn-menu-quick-btn:hover { + background: rgba(139, 69, 19, 0.25); + border-color: rgba(139, 69, 19, 0.6); + transform: translateY(-1px); + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); +} + +.inn-menu-quick-btn i { + margin-right: 0.5em; + color: var(--color-warm-3); +} diff --git a/scripts/01VFjGVxkjb5P1ve.js b/scripts/01VFjGVxkjb5P1ve.js index fe302f4..5091acb 100644 --- a/scripts/01VFjGVxkjb5P1ve.js +++ b/scripts/01VFjGVxkjb5P1ve.js @@ -1 +1 @@ -return args.item?.system?.isRanged && args.data.targets[0]?.actor?.sizeNum < 3 \ No newline at end of file +return args.item?.system?.isProjectiles && args.data.targets[0]?.actor?.sizeNum < 3 \ No newline at end of file diff --git a/scripts/03mJu59V4iByWlsO.js b/scripts/03mJu59V4iByWlsO.js index 6cec61b..50da945 100644 --- a/scripts/03mJu59V4iByWlsO.js +++ b/scripts/03mJu59V4iByWlsO.js @@ -2,24 +2,24 @@ // takes 3 Poisoned Conditions that cannot be resisted at first, await this.actor.addCondition("poisoned", 3) -// recovers a number of Wounds equal to their Toughness Bonus, +// recovers a number of Wounds equal to their Toughness Bonus, await this.actor.modifyWounds(this.actor.system.characteristics.t.bonus) -// and acquires the Regenerate Creature Trait. -const hasRegenerate = this.actor.has("Régénération") -if (hasRegenerate === undefined) { +// and acquires the Régénération Creature Trait. +const hasRégénération = this.actor.has("Régénération") +if (hasRégénération === undefined) { fromUuid("Compendium.wfrp4e-core.items.SfUUdOGjdYpr3KSR").then(trait => { let traitItem = trait.toObject() this.actor.createEmbeddedDocuments("Item", [traitItem], {fromEffect: this.effect.id}) }) } -this.script.scriptMessage(`

${this.actor.prototypeToken.name} : +this.script.message(`

${this.actor.prototypeToken.name} a :

    -
  • Reçoit 3 états Empoisonnés, sans Test de Résistance possible
  • -
  • Récupère ${this.actor.system.characteristics.t.bonus} Blessures
  • -
  • Acuiert le Trait de Creature Régénération.
  • +
  • Acquis 3 états Empoisonné qui ne peuvent pas être résistés au début du round.
  • +
  • Récupération de ${this.actor.system.characteristics.t.bonus} Blessures
  • +
  • Acquisition du Trait de Créature Régénération.
- C'est à Ranaldde choisir si la régénératin peut guérir de l'empoisonnement.

-

Lorsque tout les états Empoisonnés sont terminés, le Trait Régénération est perdu également.

`, - { whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) + C’est à Ranald de décider si leur régénération peut dépasser leur empoisonnement.

+

Lorsque tous les états Empoisonné sont perdus, la Régénération l’est aussi.

`, + { whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) diff --git a/scripts/07tvKnPT8ICtv2us.js b/scripts/07tvKnPT8ICtv2us.js new file mode 100644 index 0000000..c172e06 --- /dev/null +++ b/scripts/07tvKnPT8ICtv2us.js @@ -0,0 +1,3 @@ +if (args.test.result.misfire && args.test.result.roll !== 100) { + delete args.test.result.misfire +} \ No newline at end of file diff --git a/scripts/0BP5l7bIkf744G1k.js b/scripts/0BP5l7bIkf744G1k.js index 22f117a..ef2b1c2 100644 --- a/scripts/0BP5l7bIkf744G1k.js +++ b/scripts/0BP5l7bIkf744G1k.js @@ -1 +1 @@ -return !args.options.terror && !args.extendedTest?.flags.wfrp4e?.fear \ No newline at end of file +return !args.context.terror && !args.extendedTest?.flags.wfrp4e?.fear \ No newline at end of file diff --git a/scripts/0FNOq4J1AdPd2A0q.js b/scripts/0FNOq4J1AdPd2A0q.js deleted file mode 100644 index ed69d87..0000000 --- a/scripts/0FNOq4J1AdPd2A0q.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Row")) && !args.skill?.name.includes(game.i18n.localize("NAME.Sail")); \ No newline at end of file diff --git a/scripts/0FWto1oEr3jbWggw.js b/scripts/0FWto1oEr3jbWggw.js index deb265e..9dd91cc 100644 --- a/scripts/0FWto1oEr3jbWggw.js +++ b/scripts/0FWto1oEr3jbWggw.js @@ -1,4 +1,4 @@ -let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts") +let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts", true, ["system.lore.value"]) let text = (await game.wfrp4e.tables.rollTable("random-caster", {hideDSN: true})).result @@ -6,15 +6,15 @@ lore = Array.from(text.matchAll(/{(.+?)}/gm))[0][1] if (text == "GM's Choice") { - return this.script.scriptNotification(text) + return this.script.notification(text) } if (spellsWithLore.length > 0) { let spellsWithLore = spells.filter(i => game.wfrp4e.config.magicLores[i.system.lore.value] == lore) let selectedSpell = spellsWithLore[Math.floor(CONFIG.Dice.randomUniform() * spellsWithLore.length)] - this.script.scriptNotification(selectedSpell.name); - this.actor.createEmbeddedDocuments("Item", [selectedSpell]) + this.script.notification(selectedSpell.name); + this.actor.createEmbeddedDocuments("Item", [(await fromUuid(selectedSpell)).toObject()]) } else { diff --git a/scripts/0H2syk6qc0sCY0pj.js b/scripts/0H2syk6qc0sCY0pj.js new file mode 100644 index 0000000..713877c --- /dev/null +++ b/scripts/0H2syk6qc0sCY0pj.js @@ -0,0 +1,4 @@ +if ( args.actor.has(game.i18n.localize("NAME.AA"), "talent") || +args.actor.has(game.i18n.localize("NAME.SecondSight"), "talent") ) { + args.modifiers.other.push({label : this.effect.name, value : 5, details : "La Cible possède Harmonisation Aethyrique ou Seconde Vue"}); +} \ No newline at end of file diff --git a/scripts/0IAc5VFR2ogXOaGE.js b/scripts/0IAc5VFR2ogXOaGE.js new file mode 100644 index 0000000..a2f0ee3 --- /dev/null +++ b/scripts/0IAc5VFR2ogXOaGE.js @@ -0,0 +1 @@ +return args.characteristic != "int" || args.type != "characteristic" \ No newline at end of file diff --git a/scripts/0NAD1LNcVyAZ1fC7.js b/scripts/0NAD1LNcVyAZ1fC7.js new file mode 100644 index 0000000..fd83f3a --- /dev/null +++ b/scripts/0NAD1LNcVyAZ1fC7.js @@ -0,0 +1 @@ +return args.skill?.name !== game.i18n.localize("NAME.Cool") && args.skill?.name !== game.i18n.localize("NAME.Résistance"); \ No newline at end of file diff --git a/scripts/0PzfGjGhHQbxEwlb.js b/scripts/0PzfGjGhHQbxEwlb.js new file mode 100644 index 0000000..c5b016c --- /dev/null +++ b/scripts/0PzfGjGhHQbxEwlb.js @@ -0,0 +1 @@ +this.item.update({"system.AP" : {lArm : 0, rArm : 0, lLeg : 0, rLeg: 0}}); \ No newline at end of file diff --git a/scripts/0R0QAr3D024kWPfo.js b/scripts/0R0QAr3D024kWPfo.js index ee3ed07..3ac6d60 100644 --- a/scripts/0R0QAr3D024kWPfo.js +++ b/scripts/0R0QAr3D024kWPfo.js @@ -1,7 +1,7 @@ let table = game.wfrp4e.tables.findTable("mutatephys"); if (!table) { - return ui.notifications.error("La table des Mutations n'a pas été trouvée. Assurez vous que la table avec la clé `mutatephys` est bien importée dans le monde.") + return ui.notifications.error("Table de Mutation introuvable, veuillez vous assurer qu'une table avec la clé `mutatephys` est importée dans le monde.") } let result = (await table.roll()).results[0]; let uuid = `Compendium.${result.documentCollection}.${result.documentId}` @@ -9,10 +9,10 @@ let item = await fromUuid(uuid); if (item) { - this.script.scriptNotification(`${item.name} added`) + this.script.notification(`${item.name} added`) this.actor.createEmbeddedDocuments("Item", [item]) } -else +else { - ui.notifications.error("L'item ne peut être trouvé: " + uuid) + ui.notifications.error("Impossible de trouver l'objet : " + uuid) } \ No newline at end of file diff --git a/scripts/0Uly7OmkH0zqYbxQ.js b/scripts/0Uly7OmkH0zqYbxQ.js index 70ed1ac..f522907 100644 --- a/scripts/0Uly7OmkH0zqYbxQ.js +++ b/scripts/0Uly7OmkH0zqYbxQ.js @@ -6,7 +6,7 @@ if (location) if (dropped.length) { - this.script.scriptNotification(`Lache ${dropped.map(i => i.name).join(", ")}!`) + this.script.notification(`Lache ${dropped.map(i => i.name).join(", ")}!`) for(let weapon of dropped) { await weapon.system.toggleEquip(); @@ -16,6 +16,6 @@ if (location) let roll = await new Roll("max(1, 1d10 - @system.characteristics.t.bonus)", this.actor).roll() -roll.toMessage(this.script.getChatData({flavor : `${this.effect.name} (Durée)`})); +roll.toMessage(this.script.getChatData({flavor : `${this.effet.name} (Durée)`})); -this.effect.updateSource({"duration.rounds" : roll.total}) \ No newline at end of file +this.effet.updateSource({"duration.rounds" : roll.total}) \ No newline at end of file diff --git a/scripts/0YKQGbsKdHSmYGE7.js b/scripts/0YKQGbsKdHSmYGE7.js deleted file mode 100644 index bb5ad3c..0000000 --- a/scripts/0YKQGbsKdHSmYGE7.js +++ /dev/null @@ -1,9 +0,0 @@ -if (args.skill?.name != game.i18n.localize("NAME.Gossip")) -{ - return true; -} -else -{ - args.data.canReverse = true; // Kind of a kludge here, the talent Tests has a specific condition, but the description simply says "any gossip test can be reversed" so check it here instead of submission -} - \ No newline at end of file diff --git a/scripts/0abwNjpzo3SbEOeO.js b/scripts/0abwNjpzo3SbEOeO.js index c4345be..e67d89b 100644 --- a/scripts/0abwNjpzo3SbEOeO.js +++ b/scripts/0abwNjpzo3SbEOeO.js @@ -1,6 +1,6 @@ -if (args.applyAP && args.modifiers.ap.metal) +if (args.applyAP && args.modifiers.ap.metal) { args.modifiers.ap.ignored += args.modifiers.ap.metal - args.modifiers.ap.details.push("" + this.effect.name + ": Ignore le mtal (" + args.modifiers.ap.metal + ")"); + args.modifiers.ap.details.push("" + this.effect.name + ": Ignorer Métal (" + args.modifiers.ap.metal + ")"); args.modifiers.ap.metal = 0 } \ No newline at end of file diff --git a/scripts/0amHqfjTRp5ff6Op.js b/scripts/0amHqfjTRp5ff6Op.js new file mode 100644 index 0000000..7e6972e --- /dev/null +++ b/scripts/0amHqfjTRp5ff6Op.js @@ -0,0 +1,3 @@ +let wounds = this.effect.sourceActor.system.characteristics.wp.bonus; +this.actor.modifyWounds(wounds); +this.script.message(`Soigne ${wounds} Blessures`); \ No newline at end of file diff --git a/scripts/0hAbiNR1nFkpFMRz.js b/scripts/0hAbiNR1nFkpFMRz.js new file mode 100644 index 0000000..56432f6 --- /dev/null +++ b/scripts/0hAbiNR1nFkpFMRz.js @@ -0,0 +1 @@ +if (!this.actor.has(game.i18n.localize("NAME.SecondSight"),"talent")) this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.OEjUvJKi0xmBwbS2", this.effect) \ No newline at end of file diff --git a/scripts/0hgTyeaEhMBLwzUn.js b/scripts/0hgTyeaEhMBLwzUn.js new file mode 100644 index 0000000..3f3ba56 --- /dev/null +++ b/scripts/0hgTyeaEhMBLwzUn.js @@ -0,0 +1,5 @@ +let fearCounter = this.item.effects.filter(i => i.name == this.effect.name).length; + +fearCounter += Number(this.actor.has("Peur")?.system.specification.value) || 0 + +game.wfrp4e.utility.postPeur(fearCounter || 1, this.effect.name) \ No newline at end of file diff --git a/scripts/0jTqyz0wRlK6XPF7.js b/scripts/0jTqyz0wRlK6XPF7.js index 6961383..5770541 100644 --- a/scripts/0jTqyz0wRlK6XPF7.js +++ b/scripts/0jTqyz0wRlK6XPF7.js @@ -1,4 +1,4 @@ if (args.test.spell) { - args.test.result.other.push(`${this.effect.name}: Automatic Failure`) + args.test.result.other.push(`${this.effect.name}: Echec Automatique`) } \ No newline at end of file diff --git a/scripts/0kUalAsb4OhtYbaJ.js b/scripts/0kUalAsb4OhtYbaJ.js new file mode 100644 index 0000000..5e22b47 --- /dev/null +++ b/scripts/0kUalAsb4OhtYbaJ.js @@ -0,0 +1 @@ +return args.item?.system?.attackType == "ranged" && !this.actor.system.canFly.effects.filter(e => e.name == "Flying")[0].disabled \ No newline at end of file diff --git a/scripts/0mrUnxzufYgsR0Ph.js b/scripts/0mrUnxzufYgsR0Ph.js deleted file mode 100644 index 2c22c29..0000000 --- a/scripts/0mrUnxzufYgsR0Ph.js +++ /dev/null @@ -1,7 +0,0 @@ -this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => { - await test.roll() - if (test.failed) - { - this.actor.addCondition("stunned") - } -}) diff --git a/scripts/0uUxvBLJC76WIIBC.js b/scripts/0uUxvBLJC76WIIBC.js new file mode 100644 index 0000000..fc4206b --- /dev/null +++ b/scripts/0uUxvBLJC76WIIBC.js @@ -0,0 +1,3 @@ +let species = await ValueDialog.create({text : "Saisir l'espèce cible (singulier)", title : this.effect.name}) + +this.effect.updateSource({name : this.effect.setSpecifier(species)}); \ No newline at end of file diff --git a/scripts/0wR0LWpfhLFA240I.js b/scripts/0wR0LWpfhLFA240I.js new file mode 100644 index 0000000..6a4b29b --- /dev/null +++ b/scripts/0wR0LWpfhLFA240I.js @@ -0,0 +1,7 @@ +let value = await ValueDialog.create({ + title : this.script.label, + text: "Notes de Victoire pour le Journal d'Expérience" +}); +value + ? this.actor.system.awardExp(50, value) + : this.actor.system.awardExp(50, this.script.label) \ No newline at end of file diff --git a/scripts/0wmIC2MssUX6LW3N.js b/scripts/0wmIC2MssUX6LW3N.js new file mode 100644 index 0000000..ca4adae --- /dev/null +++ b/scripts/0wmIC2MssUX6LW3N.js @@ -0,0 +1,4 @@ +if (args.test.options.doomboltRolled) +{ + args.test.result.damage += 4; +} \ No newline at end of file diff --git a/scripts/0yyofYHeDRQlFliO.js b/scripts/0yyofYHeDRQlFliO.js index dda0e0e..6beb512 100644 --- a/scripts/0yyofYHeDRQlFliO.js +++ b/scripts/0yyofYHeDRQlFliO.js @@ -1 +1 @@ -return args.options.terror || args.extendedTest?.flags.wfrp4e?.fear \ No newline at end of file +return args.context.terror || args.extendedTest?.flags.wfrp4e?.fear \ No newline at end of file diff --git a/scripts/11uCC0mK2uL783al.js b/scripts/11uCC0mK2uL783al.js index 951bdf7..100b843 100644 --- a/scripts/11uCC0mK2uL783al.js +++ b/scripts/11uCC0mK2uL783al.js @@ -1,6 +1,6 @@ let type = this.item.getFlag("wfrp4e", "breath"); -if (["feu", "electricité", "poison"].includes(type)) +if (["fire", "electricity", "poison"].includes(type)) { args.applyAP = false; } \ No newline at end of file diff --git a/scripts/18MeEQ0As3JvER71.js b/scripts/18MeEQ0As3JvER71.js index 122146a..596e73b 100644 --- a/scripts/18MeEQ0As3JvER71.js +++ b/scripts/18MeEQ0As3JvER71.js @@ -2,6 +2,6 @@ let state = !this.effect.disabled; this.effect.update({"disabled": state}); if (state) - return ui.notifications.info("EFFECT.CreatureBackInWater", {localize: true}) + return ui.notifications.info("Effet.CreatureBackInWater", {localize: true}) -return ui.notifications.info("EFFECT.CreatureOutOfWater", {localize: true}); \ No newline at end of file +return ui.notifications.info("Effet.CreatureOutOfWater", {localize: true}); \ No newline at end of file diff --git a/scripts/190PHSHKGaJ74wsR.js b/scripts/190PHSHKGaJ74wsR.js index 803ba72..2ada486 100644 --- a/scripts/190PHSHKGaJ74wsR.js +++ b/scripts/190PHSHKGaJ74wsR.js @@ -1,31 +1,31 @@ -if (!this.item.name.includes("(") || this.item.system.tests.value.includes("Terrain")) +if (!this.item.name.includes("(") || this.item.system.Tests.value.includes("Terrain") || this.item.system.Tests.value.toLowerCase().includes("(any)")) { - let tests = this.item.system.tests.value + let Tests = this.item.system.Tests.value let name = this.item.name - // If name already specifies, make sure tests value reflects that - if (name.includes("(")) + // If name already specifies, make sure Tests value reflects that + if (name.includes("(") && !name.toLowerCase().includes("(any)")) { let terrain = name.split("(")[1].split(")")[0] - tests = tests.replace("Terrain", terrain) + tests = tests.replace("the Terrain", terrain) } else // If no sense specified, provide dialog choice { let choice = await ItemDialog.create(ItemDialog.objectToArray({ - coastal : "Côtes", + coastal : "Littoral", deserts : "Déserts", - marshes : "Marches", - rocky : "Rocailles", - tundra : "Tundra", - woodlands : "Forêts" - }, this.item.img), 1, "Choisir le Terrain"); + marshes : "Marécages", + rocky : "Rocailleux", + tundra : "Toundra", + woodlands : "Régions boisées" + }, this.item.img), 1, "Choisissez un Terrain"); if (choice[0]) { name = `${name.split("(")[0].trim()} (${choice[0].name})` - tests = tests.replace("Terrain", "Terrain " + choice[0].name ) + tests = tests.replace("Terrain", choice[0].name + " Terrain") } } - this.effect.updateSource({name}) + this.effet.updateSource({name}) this.item.updateSource({name, "system.tests.value" : tests}) } \ No newline at end of file diff --git a/scripts/1A87vGLh2PXH0rG0.js b/scripts/1A87vGLh2PXH0rG0.js deleted file mode 100644 index 8a4090c..0000000 --- a/scripts/1A87vGLh2PXH0rG0.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Language")); \ No newline at end of file diff --git a/scripts/1BT0MWM2cbhlEnrn.js b/scripts/1BT0MWM2cbhlEnrn.js index 9a091ad..7da6342 100644 --- a/scripts/1BT0MWM2cbhlEnrn.js +++ b/scripts/1BT0MWM2cbhlEnrn.js @@ -14,13 +14,13 @@ let updateObj = this.actor.toObject(); - let talents = (await Promise.all([game.wfrp4e.tables.rollTable("talents"), game.wfrp4e.tables.rollTable("talents"), game.wfrp4e.tables.rollTable("talents")])).map(i => i.text) - + let talents = (await Promise.tout([game.wfrp4e.tables.rollTable("talents"), game.wfrp4e.tables.rollTable("talents"), game.wfrp4e.tables.rollTable("talents")])).map(i => i.text) + for (let ch in characteristics) { updateObj.system.characteristics[ch].modifier += characteristics[ch]; } - + for (let talent of talents) { let talentItem = await game.wfrp4e.utility.findTalent(talent) @@ -28,13 +28,12 @@ { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } - - + + await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); - diff --git a/scripts/1CeYp5MlPcH68UIw.js b/scripts/1CeYp5MlPcH68UIw.js index db14547..73f3491 100644 --- a/scripts/1CeYp5MlPcH68UIw.js +++ b/scripts/1CeYp5MlPcH68UIw.js @@ -10,12 +10,12 @@ let characteristics = { "wp" : 10, "fel" : 10 } -let skills = ["Intimidate", "Commandement" , "Perception"] +let skills = ["Intimidation", "Commandement", "Perception"] let skillAdvancements = [10, 10, 10] -let talents = ["Combat Aware", "Drilled", "Menaçant", "Robust"] -let trappings = ["Arme simple", "Mail Coat", "Mail Chausses"] -let specialItems = [ -] +let talents = ["Vigilance", "Coude-à-coude", "Menaçant", "Robuste"] +let trappings = ["Arme simple", "Cotte de Mailles", "Chausses de Mailles"] +let specialItems = [ +] let items = []; let updateObj = this.actor.toObject(); @@ -28,11 +28,11 @@ for (let ch in characteristics) for (let item of specialItems) { let newItem if (item.type == "weapon") { - newItem = new ItemWfrp4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) + newItem = new ItemWFRP4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) } else if (item.type == "trapping") { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) } else { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) } items.push(newItem.toObject()) } @@ -44,7 +44,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -60,13 +60,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -77,13 +77,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); \ No newline at end of file diff --git a/scripts/1Du4e27M8WgP2iui.js b/scripts/1Du4e27M8WgP2iui.js new file mode 100644 index 0000000..2e22950 --- /dev/null +++ b/scripts/1Du4e27M8WgP2iui.js @@ -0,0 +1,10 @@ +if (args.equipped === true && this.actor.name !== "Kurgorn Three-eyes") +{ + this.actor.addCondition("blinded", 1, {"statuses" : ["blinded", "blind"]}) + this.script.notification(`Aveuglé en portant ${this.item.name}`); +} + +if (args.equipped === false && this.actor.name !== "Kurgorn Three-eyes") +{ + this.actor.removeCondition("blinded") +} \ No newline at end of file diff --git a/scripts/1JwxZujbDcueLWBL.js b/scripts/1JwxZujbDcueLWBL.js index 133c071..efdc349 100644 --- a/scripts/1JwxZujbDcueLWBL.js +++ b/scripts/1JwxZujbDcueLWBL.js @@ -1,2 +1,2 @@ await this.actor.addCondition("ablaze", 2) -await this.script.scriptMessage(await this.actor.applyBasicDamage(this.effect.sourceTest.result.damage, {suppressMsg: true})) \ No newline at end of file +await this.script.message(await this.actor.applyBasicDamage(this.effect.sourceTest.result.damage, {suppressMsg: true})) \ No newline at end of file diff --git a/scripts/1LDSzXeO5CzXgTOc.js b/scripts/1LDSzXeO5CzXgTOc.js deleted file mode 100644 index 031e1ac..0000000 --- a/scripts/1LDSzXeO5CzXgTOc.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) || args.skill?.name == `${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})` \ No newline at end of file diff --git a/scripts/1OpT3CXs07XFWWCT.js b/scripts/1OpT3CXs07XFWWCT.js index 4e10bbf..04ab65b 100644 --- a/scripts/1OpT3CXs07XFWWCT.js +++ b/scripts/1OpT3CXs07XFWWCT.js @@ -1 +1 @@ -args.options.cardsharp = true; \ No newline at end of file +args.context.cardsharp = true; \ No newline at end of file diff --git a/scripts/1PPh4vHd5sPKtudZ.js b/scripts/1PPh4vHd5sPKtudZ.js new file mode 100644 index 0000000..e467951 --- /dev/null +++ b/scripts/1PPh4vHd5sPKtudZ.js @@ -0,0 +1 @@ +this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.eowbsW6oHGSNJmxV", this.effect) \ No newline at end of file diff --git a/scripts/1UvL0XA1EpQtjDNn.js b/scripts/1UvL0XA1EpQtjDNn.js new file mode 100644 index 0000000..e52f4bc --- /dev/null +++ b/scripts/1UvL0XA1EpQtjDNn.js @@ -0,0 +1,8 @@ +let effects = this.item.effects.contents.filter(i => i.id != this.effect.id); + +let choice = await ItemDialog.create(effects, 1, {title : this.effect.name, text: "Choisissez une Rune"}); + +if (choice[0]) +{ + choice[0].performEffectApplication(); +} \ No newline at end of file diff --git a/scripts/1ZArMNUI8qqH6zkX.js b/scripts/1ZArMNUI8qqH6zkX.js index 8bee756..137943c 100644 --- a/scripts/1ZArMNUI8qqH6zkX.js +++ b/scripts/1ZArMNUI8qqH6zkX.js @@ -1,7 +1,6 @@ -let test = await args.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : " - " + this.effect.name, context : {failure: "Gain d'un état Assomé"}}) -await test.roll(); -if (test.failed) +let test = await args.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : " - " + this.effet.name, context : {failure: "Gain de 1 état Sonné"}}) +await Test.roll(); +if (Test.Échoué) { args.actor.addCondition("stunned") } - diff --git a/scripts/1exiWlVUHsXDLLAH.js b/scripts/1exiWlVUHsXDLLAH.js index 5a275f6..dcfb22c 100644 --- a/scripts/1exiWlVUHsXDLLAH.js +++ b/scripts/1exiWlVUHsXDLLAH.js @@ -1 +1 @@ -this.script.scriptNotification(`Ne peut saisir ${this.effect.name}!`); \ No newline at end of file +this.script.notification(`Impossible d'entrer dans ${this.effect.name} !`); \ No newline at end of file diff --git a/scripts/1fQr1Dg7DX0vfz3r.js b/scripts/1fQr1Dg7DX0vfz3r.js index 206a4f6..01c32fa 100644 --- a/scripts/1fQr1Dg7DX0vfz3r.js +++ b/scripts/1fQr1Dg7DX0vfz3r.js @@ -1,3 +1,3 @@ let healed = parseInt(this.effect.sourceTest.result.SL) this.actor.modifyWounds(healed) -this.script.scriptMessage(`Soins de ${healed} Blessures`) \ No newline at end of file +this.script.message(`Soin de ${healed} Blessures`) \ No newline at end of file diff --git a/scripts/1jQq9v8fXK8zuEBU.js b/scripts/1jQq9v8fXK8zuEBU.js index f6758b8..65b2107 100644 --- a/scripts/1jQq9v8fXK8zuEBU.js +++ b/scripts/1jQq9v8fXK8zuEBU.js @@ -11,10 +11,10 @@ let APused = Math.max(0, APatLoc.value - metalAP); // remove metal AP at locatio damage -= (APused + this.actor.system.characteristics.t.bonus) let msg = await this.actor.applyBasicDamage(damage, {suppressMsg : true, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL}); -msg += ` (ignore ${metalAP} PA de métal sur ${game.wfrp4e.config.locations[loc]})` -this.script.scriptMessage(msg) +msg += ` (Ignore ${metalAP} PA de métal sur ${game.wfrp4e.config.locations[loc]})` +this.script.message(msg) -let test = await this.actor.setupSkill("Résistance", {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`}); +let Test = await this.actor.setupSkill("Résistance", {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`}); await test.roll(); if (test.failed) this.actor.addCondition("stunned"); \ No newline at end of file diff --git a/scripts/1kB2su7hLRYDhZ2H.js b/scripts/1kB2su7hLRYDhZ2H.js deleted file mode 100644 index 61a4ede..0000000 --- a/scripts/1kB2su7hLRYDhZ2H.js +++ /dev/null @@ -1,19 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : " - " + this.effect.name}) -await test.roll(); -if (!test.succeeded) -{ - let item = await fromUuid("Compendium.wfrp4e-core.items.ZhMADOqoo0y8Q9bx") - let data = item.toObject(); - if (this.item.system.location.key == "rLeg") - { - data.system.location.value = "Pied droit" - data.system.location.key = "rToe"; - } - else if (this.item.system.location.key == "lLeg") - { - data.system.location.value = "Pied gauche" - data.system.location.key = "lToe"; - } - this.actor.createEmbeddedDocuments("Item", [data]) -} -this.effect.delete(); \ No newline at end of file diff --git a/scripts/1l7Jz2ZHbAWko7Vm.js b/scripts/1l7Jz2ZHbAWko7Vm.js index ac7048c..d1c741a 100644 --- a/scripts/1l7Jz2ZHbAWko7Vm.js +++ b/scripts/1l7Jz2ZHbAWko7Vm.js @@ -1 +1 @@ -args.options.ballockKnife = true; \ No newline at end of file +args.context.ballockKnife = true; \ No newline at end of file diff --git a/scripts/1mNkLj9JYNr3ofC6.js b/scripts/1mNkLj9JYNr3ofC6.js deleted file mode 100644 index d64facd..0000000 --- a/scripts/1mNkLj9JYNr3ofC6.js +++ /dev/null @@ -1,7 +0,0 @@ -this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => { - await test.roll(); - if (test.failed) - { - this.actor.addCondition("stunned", 3) - } -}) \ No newline at end of file diff --git a/scripts/1wKVvxRTHOyV4Qdv.js b/scripts/1wKVvxRTHOyV4Qdv.js deleted file mode 100644 index 2ea9f2a..0000000 --- a/scripts/1wKVvxRTHOyV4Qdv.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name?.includes(game.i18n.localize("NAME.Sail")) \ No newline at end of file diff --git a/scripts/1wrPvP6lJwIAfmsl.js b/scripts/1wrPvP6lJwIAfmsl.js index 9e40d5a..8e1bf0e 100644 --- a/scripts/1wrPvP6lJwIAfmsl.js +++ b/scripts/1wrPvP6lJwIAfmsl.js @@ -1,4 +1,4 @@ -let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.locations), 1, "Choisir une localisation"); +let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.locations), 1, "Choisir la localisation"); let location = choice[0].id; diff --git a/scripts/1yOvw74jzFfaI87b.js b/scripts/1yOvw74jzFfaI87b.js index 73649e3..29f9688 100644 --- a/scripts/1yOvw74jzFfaI87b.js +++ b/scripts/1yOvw74jzFfaI87b.js @@ -1 +1 @@ -return args.options.reload +return args.context.reload diff --git a/scripts/20fvE9nJmcfGYVzw.js b/scripts/20fvE9nJmcfGYVzw.js new file mode 100644 index 0000000..5b3137c --- /dev/null +++ b/scripts/20fvE9nJmcfGYVzw.js @@ -0,0 +1,8 @@ +if ( args.totalWoundLoss > 0 ) { + let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {difficulty: "average"}) + await test.roll(); + if (!test.succeeded) + { + this.actor.addSystemEffect("gangrene"); + } +} \ No newline at end of file diff --git a/scripts/22PMOW0G5MWiBQmg.js b/scripts/22PMOW0G5MWiBQmg.js new file mode 100644 index 0000000..81c1db6 --- /dev/null +++ b/scripts/22PMOW0G5MWiBQmg.js @@ -0,0 +1,4 @@ +let fear = await fromUuid("Compendium.wfrp4e-core.items.Item.pTorrE0l3VybAbtn") +fear = fear.toObject(); +fear.system.specification.value = 1; +await this.actor.createEmbeddedDocuments("Item", [fear], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/22bW97lkvCqisfHX.js b/scripts/22bW97lkvCqisfHX.js deleted file mode 100644 index 5ab83db..0000000 --- a/scripts/22bW97lkvCqisfHX.js +++ /dev/null @@ -1 +0,0 @@ -return args.type != "channelling" && !args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) \ No newline at end of file diff --git a/scripts/23HgjCB1oecxANvA.js b/scripts/23HgjCB1oecxANvA.js deleted file mode 100644 index 275f379..0000000 --- a/scripts/23HgjCB1oecxANvA.js +++ /dev/null @@ -1,5 +0,0 @@ -if (args.item.range && args.item.range.bands) -{ -args.item.range.bands[game.i18n.localize("Long Range")].modifier = 0 -args.item.range.bands[game.i18n.localize("Extreme")].modifier /= 2 -} \ No newline at end of file diff --git a/scripts/23vWiHUjxtRQ3Efz.js b/scripts/23vWiHUjxtRQ3Efz.js index 27078fa..5fdc693 100644 --- a/scripts/23vWiHUjxtRQ3Efz.js +++ b/scripts/23vWiHUjxtRQ3Efz.js @@ -1,4 +1,4 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.eWPN3CV2Eddwz8aM") let data = item.toObject(); -data.system.location.value = "Dos" +data.system.location.value = "Back" this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) \ No newline at end of file diff --git a/scripts/2AOo7KUyzMrgIlgM.js b/scripts/2AOo7KUyzMrgIlgM.js index 2982f22..efcc387 100644 --- a/scripts/2AOo7KUyzMrgIlgM.js +++ b/scripts/2AOo7KUyzMrgIlgM.js @@ -1 +1 @@ -game.wfrp4e.utility.postCorruptionTest(this.item.system.specification.value, {speaker : {alias: this.actor.prototypeToken.name}}) \ No newline at end of file +CorruptionMessageModel.createCorruptionMessage(this.item.system.specification.value, {speaker : {alias: this.actor.prototypeToken.name}}) \ No newline at end of file diff --git a/scripts/2AdSBXw7IwCiqawQ.js b/scripts/2AdSBXw7IwCiqawQ.js deleted file mode 100644 index 00a7def..0000000 --- a/scripts/2AdSBXw7IwCiqawQ.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Bribery") || args.skill?.name.includes(game.i18n.localize("NAME.Stealth")); \ No newline at end of file diff --git a/scripts/2EAYX5G9Fh3HJwiP.js b/scripts/2EAYX5G9Fh3HJwiP.js new file mode 100644 index 0000000..c2a5681 --- /dev/null +++ b/scripts/2EAYX5G9Fh3HJwiP.js @@ -0,0 +1,6 @@ +let broken = this.actor.hasCondition("broken"); + +if (broken) { + broken.delete(); + this.script.notification("Etat Brisé supprimé."); +} \ No newline at end of file diff --git a/scripts/KTBVDHUndI3qDOXM.js b/scripts/2Ej6LUqn8frTRURo.js similarity index 56% rename from scripts/KTBVDHUndI3qDOXM.js rename to scripts/2Ej6LUqn8frTRURo.js index b9aa611..a825d0e 100644 --- a/scripts/KTBVDHUndI3qDOXM.js +++ b/scripts/2Ej6LUqn8frTRURo.js @@ -1,6 +1,6 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance")) +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {difficulty: "hard"}) await test.roll(); if (!test.succeeded) { - args.actor.addCondition("stunned") + await this.actor.addCondition("unconscious"); } \ No newline at end of file diff --git a/scripts/2IPTF0akWw9y48br.js b/scripts/2IPTF0akWw9y48br.js new file mode 100644 index 0000000..9023ff5 --- /dev/null +++ b/scripts/2IPTF0akWw9y48br.js @@ -0,0 +1,3 @@ +return !this.item.equipped.value + || !args?.weapon + || !(["goblin"].includes(args.target.Species.toLowerCase())) \ No newline at end of file diff --git a/scripts/2NLINicPQWbuvp2n.js b/scripts/2NLINicPQWbuvp2n.js deleted file mode 100644 index f98dd93..0000000 --- a/scripts/2NLINicPQWbuvp2n.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name != game.i18n.localize("NAME.Navigation") \ No newline at end of file diff --git a/scripts/2QB0LjueuJcIaHaC.js b/scripts/2QB0LjueuJcIaHaC.js index aeaf157..f4f1e6d 100644 --- a/scripts/2QB0LjueuJcIaHaC.js +++ b/scripts/2QB0LjueuJcIaHaC.js @@ -3,7 +3,7 @@ if (isNaN(parseInt(this.item.system.specification.value))) let value = this.item.specifier; if (!value) { - value = await ValueDialog.create({text : "Enter Armour value", title : this.effect.name}); + value = await ValueDialog.create({text : "Entrez la valeur d'Armure", title : this.effect.name}); } if (value) { diff --git a/scripts/2Qi1hwLYhdE6v6Hs.js b/scripts/2Qi1hwLYhdE6v6Hs.js index 2782756..cc12394 100644 --- a/scripts/2Qi1hwLYhdE6v6Hs.js +++ b/scripts/2Qi1hwLYhdE6v6Hs.js @@ -1,7 +1,7 @@ if (!["rLeg", "lLeg"].includes(this.effect.getFlag("wfrp4e", "location"))) return true; -if (args.options.dodge) +if (args.context.dodge) { args.abort = true; this.script.scriptNotification("Impossible d'Esquiver!") diff --git a/scripts/2S6XlGCdRlXuaaVw.js b/scripts/2S6XlGCdRlXuaaVw.js new file mode 100644 index 0000000..1cf92ec --- /dev/null +++ b/scripts/2S6XlGCdRlXuaaVw.js @@ -0,0 +1 @@ +this.actor.system.status.corruption.value += 1 \ No newline at end of file diff --git a/scripts/2VNnVrtktdGUqXEV.js b/scripts/2VNnVrtktdGUqXEV.js deleted file mode 100644 index 38a1edd..0000000 --- a/scripts/2VNnVrtktdGUqXEV.js +++ /dev/null @@ -1,9 +0,0 @@ -if (args.totalWoundLoss > 0) -{ - let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) - await test.roll(); - if (test.failed && parseInt(args.opposedTest.attackerTest.result.SL) > 0) - { - args.actor.addCondition("stunned", parseInt(args.opposedTest.attackerTest.result.SL)) - } -} \ No newline at end of file diff --git a/scripts/2W9uMTT6iJhfQ044.js b/scripts/2W9uMTT6iJhfQ044.js deleted file mode 100644 index 2c067f6..0000000 --- a/scripts/2W9uMTT6iJhfQ044.js +++ /dev/null @@ -1,19 +0,0 @@ -let skill = `${game.i18n.localize("NAME.Trade")} (${this.item.parenthesesText})` -let currentCareer = this.actor.system.currentCareer; -let existingSkill = this.actor.itemTypes.skill.find(i => i.name == skill); - -if (!currentCareer) return - - -let inCurrentCareer = currentCareer.system.skills.concat(currentCareer.system.addedSkills).includes(skill); -let craftsmanAdded = this.actor.getFlag("wfrp4e", "craftsmanAdded") || {}; -if (existingSkill && inCurrentCareer && !craftsmanAdded[existingSkill.name]) -{ - existingSkill.system.advances.costModifier = -5; -} -else -{ - craftsmanAdded[skill] = true; - currentCareer.system.addedSkills.push(skill); - foundry.utils.setProperty(this.actor, "flags.wfrp4e.craftsmanAdded", craftsmanAdded) -} \ No newline at end of file diff --git a/scripts/2WSN306tL4apjRtD.js b/scripts/2WSN306tL4apjRtD.js deleted file mode 100644 index f43717a..0000000 --- a/scripts/2WSN306tL4apjRtD.js +++ /dev/null @@ -1,4 +0,0 @@ -let item = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS") -let data = item.toObject(); -data.name = data.name += " (Ouïe)" -this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/2XXqxAF5s5Sws6qj.js b/scripts/2XXqxAF5s5Sws6qj.js new file mode 100644 index 0000000..67a9784 --- /dev/null +++ b/scripts/2XXqxAF5s5Sws6qj.js @@ -0,0 +1 @@ +this.actor.system.status.corruption.value += 2 \ No newline at end of file diff --git a/scripts/2XaJNYUMQAmSOsqi.js b/scripts/2XaJNYUMQAmSOsqi.js new file mode 100644 index 0000000..705d20d --- /dev/null +++ b/scripts/2XaJNYUMQAmSOsqi.js @@ -0,0 +1,9 @@ +const {targetUuid} = this.effect.flags.wfrp4e; + +if (args.attacker.uuid !== targetUuid) return; + +let recordedWounds = this.effect.getFlag("wfrp4e", "damageToReturn") ?? 0; + +recordedWounds += args.totalWoundLoss; + +this.effect.setFlag("wfrp4e", "damageToReturn", recordedWounds); \ No newline at end of file diff --git a/scripts/2Yh4vQm0ZJukRH1x.js b/scripts/2Yh4vQm0ZJukRH1x.js new file mode 100644 index 0000000..7578d05 --- /dev/null +++ b/scripts/2Yh4vQm0ZJukRH1x.js @@ -0,0 +1 @@ +return !args.skill?.name.includes("Focalisation"); \ No newline at end of file diff --git a/scripts/2cKarG9ToyW2ptCd.js b/scripts/2cKarG9ToyW2ptCd.js index bdeca2b..8a7390d 100644 --- a/scripts/2cKarG9ToyW2ptCd.js +++ b/scripts/2cKarG9ToyW2ptCd.js @@ -6,5 +6,5 @@ if (this.item.system.quantity.value) } else { - this.script.scriptNotification("Vide !", "error") + this.script.notification("Plus rien !", "error") } \ No newline at end of file diff --git a/scripts/2hzDv8ROulOe1elK.js b/scripts/2hzDv8ROulOe1elK.js deleted file mode 100644 index 1a9e5bd..0000000 --- a/scripts/2hzDv8ROulOe1elK.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Lore")); \ No newline at end of file diff --git a/scripts/2kRwCc31fuZgrsy8.js b/scripts/2kRwCc31fuZgrsy8.js new file mode 100644 index 0000000..4c08a9e --- /dev/null +++ b/scripts/2kRwCc31fuZgrsy8.js @@ -0,0 +1 @@ +CorruptionMessageModel.createCorruptionMessage("major", this.script.getChatData()); \ No newline at end of file diff --git a/scripts/2rzxQlL7A9ujZ9uK.js b/scripts/2rzxQlL7A9ujZ9uK.js index 4c9c7f1..52779f1 100644 --- a/scripts/2rzxQlL7A9ujZ9uK.js +++ b/scripts/2rzxQlL7A9ujZ9uK.js @@ -1,6 +1,6 @@ if (args.opposedTest.result.winner == "attacker") { if (args.opposedTest.defenderTest.weapon && args.opposedTest.defenderTest.item.properties.qualities.shield) { - ui.notifications.notify(`${this.effect.name}: Gain de ${this.item.Advances} Avantages`) + ui.notifications.notify(`${this.effect.name}: Gain de ${this.item.Advances} Avantage(s)`) this.actor.setAdvantage(this.item.Advances) } } \ No newline at end of file diff --git a/scripts/2sDH6RvoOAR40oqH.js b/scripts/2sDH6RvoOAR40oqH.js deleted file mode 100644 index 6efdf20..0000000 --- a/scripts/2sDH6RvoOAR40oqH.js +++ /dev/null @@ -1,20 +0,0 @@ - - -if (!["Goblin", "Orc"].includes(this.actor.system.details.species.value)) { - let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), { appendTitle: ` - ${this.effect.name}` }) - await test.roll(); - if (test.failed) { - let infection = await fromUuid("Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg") - this.actor.createEmbeddedDocuments("Item", [infection]) - } -} - -// Since wounds change when the effect is deleted, need to wait until after -// the max wounds have been recalculated to apply damage -game.wfrp4e.utility.sleep(1000).then(async () => { - let roll = await new Roll("1d10").roll(); - - roll.toMessage(this.script.getChatData()); - this.script.scriptMessage(await this.actor.applyBasicDamage(roll.total, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg: true })) - -}) \ No newline at end of file diff --git a/scripts/2uyajbon5QX1CewS.js b/scripts/2uyajbon5QX1CewS.js new file mode 100644 index 0000000..256bb19 --- /dev/null +++ b/scripts/2uyajbon5QX1CewS.js @@ -0,0 +1 @@ +return args.skill?.name == "Voile (Aéronavale)" \ No newline at end of file diff --git a/scripts/2vTVR0quRZQtjNfQ.js b/scripts/2vTVR0quRZQtjNfQ.js deleted file mode 100644 index fa60eaf..0000000 --- a/scripts/2vTVR0quRZQtjNfQ.js +++ /dev/null @@ -1,18 +0,0 @@ -let currentCareer = this.actor.system.currentCareer; -if (!currentCareer) -{ - return; -} - -let talents = ["Harmonisation Aethyrique", -"Magie des Arcanes (Domaine)", -"Magie du Chaos (Tzeentch)", -"Mains agiles", -"Diction Instinctive", -"Sens de la Magie", -"Magie Mineure", -"Seconde Vue", -"Mage de guerre", -"Sorcier!"].filter(t => !currentCareer.system.talents.includes(t)) - -currentCareer.system.talents = currentCareer.system.talents.concat(talents) \ No newline at end of file diff --git a/scripts/2yW0kuwLfgRzJR2S.js b/scripts/2yW0kuwLfgRzJR2S.js new file mode 100644 index 0000000..bc0883a --- /dev/null +++ b/scripts/2yW0kuwLfgRzJR2S.js @@ -0,0 +1,2 @@ +const duration = 3600 * (1 + Number(this.effect.sourceTest.result.SL)); +this.effect.update({"duration.seconds": duration}); \ No newline at end of file diff --git a/scripts/2yctEihGmdCfTTVx.js b/scripts/2yctEihGmdCfTTVx.js index a6d16a1..3fcba0a 100644 --- a/scripts/2yctEihGmdCfTTVx.js +++ b/scripts/2yctEihGmdCfTTVx.js @@ -1,2 +1,2 @@ -args.data.canReverse = true; -args.options.fieldDressing = true; \ No newline at end of file +args.data.reversal = {allowed : true, if: "success"}; +args.context.fieldDressing = true; \ No newline at end of file diff --git a/scripts/2zeP2nMSURjxrqYz.js b/scripts/2zeP2nMSURjxrqYz.js index 674dd05..504a3fb 100644 --- a/scripts/2zeP2nMSURjxrqYz.js +++ b/scripts/2zeP2nMSURjxrqYz.js @@ -1,6 +1,6 @@ let wounds = this.actor.system.status.wounds if (wounds.value == 0) - return this.script.scriptNotification("Aucun effet à 0 Blessures", "error") + return this.script.notification("Aucun effet à 0 Blessures", "error") -this.script.scriptNotification(`Soin de ${this.actor.characteristics.t.bonus} Blessures`) +this.script.notification(`Soin de ${this.actor.characteristics.t.bonus} Blessures`) await this.actor.modifyWounds(this.actor.characteristics.t.bonus) \ No newline at end of file diff --git a/scripts/33US8YRgaMqYu2We.js b/scripts/33US8YRgaMqYu2We.js index 6569e71..74eed59 100644 --- a/scripts/33US8YRgaMqYu2We.js +++ b/scripts/33US8YRgaMqYu2We.js @@ -1 +1 @@ -return !args.options.handling \ No newline at end of file +return !args.context.handling \ No newline at end of file diff --git a/scripts/37UN17gb8suFeZIW.js b/scripts/37UN17gb8suFeZIW.js index 145ebc8..5b2ea2b 100644 --- a/scripts/37UN17gb8suFeZIW.js +++ b/scripts/37UN17gb8suFeZIW.js @@ -1 +1 @@ -this.script.scriptMessage(await this.actor.applyBasicDamage(8, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true})) \ No newline at end of file +this.script.message(await this.actor.applyBasicDamage(8, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true})) \ No newline at end of file diff --git a/scripts/3CeKfDcMEVgQlcXm.js b/scripts/3CeKfDcMEVgQlcXm.js new file mode 100644 index 0000000..368dd39 --- /dev/null +++ b/scripts/3CeKfDcMEVgQlcXm.js @@ -0,0 +1 @@ +await this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.5hH73j2NgPdsLCZN", this.effect, {name: "Haine (Tous les ennemis)"}); \ No newline at end of file diff --git a/scripts/3D5ImpMgpOTPucvv.js b/scripts/3D5ImpMgpOTPucvv.js index 72bd340..5d19d12 100644 --- a/scripts/3D5ImpMgpOTPucvv.js +++ b/scripts/3D5ImpMgpOTPucvv.js @@ -5,5 +5,5 @@ let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll / let ones = Number(args.test.result.roll.toString().split("").pop()) if (ones > SL) - args.test.result.other.push(`${this.effect.name}: ${ones + args.test.successBonus + args.test.slBonus} DR`) + args.Test.result.other.push(`${this.effect.name}: ${ones + args.test.successBonus + args.test.slBonus} DR`) } \ No newline at end of file diff --git a/scripts/3IGO7xEjRjat937X.js b/scripts/3IGO7xEjRjat937X.js index 7362443..6505c0b 100644 --- a/scripts/3IGO7xEjRjat937X.js +++ b/scripts/3IGO7xEjRjat937X.js @@ -1,7 +1,7 @@ let fatigue = this.actor.hasCondition("fatigued") if (fatigue) { - this.script.scriptNotification("Suppression de l'état Fatigué, effet désactivé.") + this.script.notification("Etat Extenué - Suppression de la condition Extenué, effet désactivé") this.effect.update({disabled : true}) await this.actor.removeCondition("fatigued") } \ No newline at end of file diff --git a/scripts/3JEzEzF1SeYA9lsV.js b/scripts/3JEzEzF1SeYA9lsV.js deleted file mode 100644 index 0c45aea..0000000 --- a/scripts/3JEzEzF1SeYA9lsV.js +++ /dev/null @@ -1,44 +0,0 @@ -let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.locations, this.effect.img), 1, "Choisissez Location"); -if (choice[0]) -{ - this.effect.updateSource({name : `${this.effect.name} (${choice[0].name})`}) -this.effect.updateSource({"flags.wfrp4e.location" : choice[0].id}) -} - -let location = choice[0].id; - -if (["lArm", "rArm"].includes(location)) -{ - let dropped = this.actor.itemTypes.weapon.filter(i => i.isEquipped & i.system.usesHands.includes(location)); - - if (dropped.length) - { - this.script.scriptNotification(`Lache ${dropped.map(i => i.name).join(", ")}!`) - for(let weapon of dropped) - { - await weapon.system.toggleEquip(); - } - } -} - -if (location == "body") -{ - await this.actor.addCondition("fatigued"); - test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "hard"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) - await test.roll(); - if (test.failed) - { - this.actor.addCondition("prone"); - } -} - -if (location == "head") -{ - await this.actor.addCondition("stunned"); - test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) - await test.roll(); - if (test.failed) - { - this.actor.addCondition("unconscious"); - } -} \ No newline at end of file diff --git a/scripts/3KH6OE7L7uJESI2Z.js b/scripts/3KH6OE7L7uJESI2Z.js new file mode 100644 index 0000000..f13d15e --- /dev/null +++ b/scripts/3KH6OE7L7uJESI2Z.js @@ -0,0 +1,5 @@ +if (["dragon"].includes(args.opposedTest.defender.details.species.value.toLowerCase())) + { + args.applyTB = false; + args.opposedTest.result.other.push("Wyrmslayer: Ignore le BE contre les Dragons") + } \ No newline at end of file diff --git a/scripts/3SuLF6SImYWEHMo2.js b/scripts/3SuLF6SImYWEHMo2.js new file mode 100644 index 0000000..1d5ddc7 --- /dev/null +++ b/scripts/3SuLF6SImYWEHMo2.js @@ -0,0 +1 @@ +args.context.doombolt = true; \ No newline at end of file diff --git a/scripts/3eSaX0BeaUalNkEP.js b/scripts/3eSaX0BeaUalNkEP.js index 077517d..c83f067 100644 --- a/scripts/3eSaX0BeaUalNkEP.js +++ b/scripts/3eSaX0BeaUalNkEP.js @@ -1 +1 @@ -return args.options.mutate \ No newline at end of file +return args.context.mutate \ No newline at end of file diff --git a/scripts/3hfMQkUKYI4rCuBy.js b/scripts/3hfMQkUKYI4rCuBy.js deleted file mode 100644 index 7cf8f33..0000000 --- a/scripts/3hfMQkUKYI4rCuBy.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.CharmAnimal") && !args.skill?.name.includes(game.i18n.localize("NAME.AnimalTraining")); \ No newline at end of file diff --git a/scripts/3ixqbsEMfSSTzAXU.js b/scripts/3ixqbsEMfSSTzAXU.js new file mode 100644 index 0000000..a545172 --- /dev/null +++ b/scripts/3ixqbsEMfSSTzAXU.js @@ -0,0 +1,12 @@ +const test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), { + difficulty: "challenging", + context: { + failure: "Subi l'état @Condition[Fatigued] à cause de cauchemars.", + success: "A souffert de cauchemars, mais a assez bien dormi." + } +}); +await test.roll(); + +if (test.failed) { + await this.actor.addCondition("fatigued"); +} \ No newline at end of file diff --git a/scripts/3j8yybMaAZSwzxIE.js b/scripts/3j8yybMaAZSwzxIE.js new file mode 100644 index 0000000..655e11f --- /dev/null +++ b/scripts/3j8yybMaAZSwzxIE.js @@ -0,0 +1,21 @@ +let weaponData = await this.effect.setFlag("wfrp4e", "weaponData", this.item.system.toObject()); + +try { + + + await this.item.update({ + system: { + "weaponGroup.value": "throwing", + "qualities.value": this.item.system.qualities.value.concat([{ name: "accurate" }]), + "range.value": "SB * 3", + "consumesAmmo.value" : false + } + }) + + let test = await this.actor.setupWeapon(this.item, {}, {resolveClose : true}); + await test?.roll(); + this.item.update({ system: this.effect.getFlag("wfrp4e", "weaponData") }) +} +catch (e) { + this.item.update({ system: this.effect.getFlag("wfrp4e", "weaponData") }) +} \ No newline at end of file diff --git a/scripts/3jm0NoYpgB6ZuUSl.js b/scripts/3jm0NoYpgB6ZuUSl.js index a7b132e..7e6ffd3 100644 --- a/scripts/3jm0NoYpgB6ZuUSl.js +++ b/scripts/3jm0NoYpgB6ZuUSl.js @@ -1 +1 @@ -args.options.useOnesAttractive = true; \ No newline at end of file +args.context.useOnesAttractive = true; \ No newline at end of file diff --git a/scripts/3l7MQSa10Kve2K3P.js b/scripts/3l7MQSa10Kve2K3P.js index 0d12a2b..fabe7f0 100644 --- a/scripts/3l7MQSa10Kve2K3P.js +++ b/scripts/3l7MQSa10Kve2K3P.js @@ -1,2 +1,2 @@ -this.script.scriptMessage(await this.actor.applyBasicDamage(Math.ceil(CONFIG.Dice.randomUniform() * 10) + 6, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true})) +this.script.message(await this.actor.applyBasicDamage(Math.ceil(CONFIG.Dice.randomUniform() * 10) + 6, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true})) this.actor.addCondition("ablaze"); \ No newline at end of file diff --git a/scripts/3na3lnAt3bfysvcD.js b/scripts/3na3lnAt3bfysvcD.js new file mode 100644 index 0000000..1e27fa4 --- /dev/null +++ b/scripts/3na3lnAt3bfysvcD.js @@ -0,0 +1,3 @@ +const blinded = this.actor.hasCondition("blinded"); +if (!blinded) + this.actor.addCondition("blinded"); \ No newline at end of file diff --git a/scripts/3plV9WFqs2prfAdp.js b/scripts/3plV9WFqs2prfAdp.js deleted file mode 100644 index 9ec91ac..0000000 --- a/scripts/3plV9WFqs2prfAdp.js +++ /dev/null @@ -1 +0,0 @@ -return !["NAME.Evaluate", "NAME.Gamble"].map(i => game.i18n.localize(i)).includes(args.skill?.name) \ No newline at end of file diff --git a/scripts/3sfD1nedXLzuYoXJ.js b/scripts/3sfD1nedXLzuYoXJ.js deleted file mode 100644 index 674133f..0000000 --- a/scripts/3sfD1nedXLzuYoXJ.js +++ /dev/null @@ -1,4 +0,0 @@ -if (this.actor.hasCondition("surprised")) -{ - this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : " - " + this.effect.name}).then(test => test.roll()) -} diff --git a/scripts/42UATqzohYML6a9t.js b/scripts/42UATqzohYML6a9t.js new file mode 100644 index 0000000..59fb892 --- /dev/null +++ b/scripts/42UATqzohYML6a9t.js @@ -0,0 +1,3 @@ +if ( !this.actor.hasCondition("poisoned") ) { + this.effect.delete(); +} \ No newline at end of file diff --git a/scripts/454x3Q95pLvZm0Kx.js b/scripts/454x3Q95pLvZm0Kx.js deleted file mode 100644 index 0072c5f..0000000 --- a/scripts/454x3Q95pLvZm0Kx.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.ConsumeAlcohol"); \ No newline at end of file diff --git a/scripts/4AO7Fowek5sSmE4g.js b/scripts/4AO7Fowek5sSmE4g.js new file mode 100644 index 0000000..ab27f28 --- /dev/null +++ b/scripts/4AO7Fowek5sSmE4g.js @@ -0,0 +1,14 @@ +const venomUUID = "Compendium.wfrp4e-core.items.gFkRm9wS65qe18Xv"; +const venom = this.actor.itemTags.trait.find(t => t.name === "Venin"); + +if (venom) { + await this.effect.setFlag("wfrp4e-tribes", "venom", { + _id: venom.id, + "system.specification.value": venom.system.specification.value + }); + await venom.update({"system.specification.value": "Difficult"}); +} else { + await this.actor.addEffectItems(venomUUID, this.effect, { + "system.specification.value": "Challenging" + }); +} \ No newline at end of file diff --git a/scripts/4FGKZk2f0xrmIDnp.js b/scripts/4FGKZk2f0xrmIDnp.js deleted file mode 100644 index 59535fd..0000000 --- a/scripts/4FGKZk2f0xrmIDnp.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Research") && !args.skill?.name?.includes(game.i18n.localize("NAME.Language")); \ No newline at end of file diff --git a/scripts/4KYraZSHAEYmL6xx.js b/scripts/4KYraZSHAEYmL6xx.js new file mode 100644 index 0000000..02b6d74 --- /dev/null +++ b/scripts/4KYraZSHAEYmL6xx.js @@ -0,0 +1,4 @@ +if (this.item.equipped.value && args.totalWoundLoss > 10) { + args.totalWoundLoss = Math.min(10, args.totalWoundLoss) + args.extraMessages.push(`${this.effect.name}: Perte de Blessures limitée à 10`) +} \ No newline at end of file diff --git a/scripts/4MQ7u4INxp51oyyR.js b/scripts/4MQ7u4INxp51oyyR.js index df7b1a2..feb325f 100644 --- a/scripts/4MQ7u4INxp51oyyR.js +++ b/scripts/4MQ7u4INxp51oyyR.js @@ -10,10 +10,10 @@ let characteristics = { "wp" : 25, "fel" : 10 } -let skills = ["Calme", "Esquive", "Intimidate", "Intuition", "Commandement" , "Lore (Warfare)", "Perception"] +let skills = ["Calme", "Esquive", "Intimidation", "Intuition", "Commandement", "Savoir (Guerre)", "Perception"] let skillAdvancements = [15, 15, 15, 15, 15, 10, 10] -let talents = ["Combat Aware", "Combat Reflexes", "Feint", "Inspiring", "Resolute", "War Leader"] -let trappings = ["Arme simple", "Shield"] +let talents = ["Vigilance", "Combat Instinctif", "Feinte", "Inspiring", "Déterminé", "Seigneur de guerre"] +let trappings = ["Arme simple", "Bouclier"] let items = []; let updateObj = this.actor.toObject(); @@ -30,7 +30,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,13 +63,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); \ No newline at end of file diff --git a/scripts/4OlwxU60UqKg81yb.js b/scripts/4OlwxU60UqKg81yb.js index 5fa28d1..c2c0b4f 100644 --- a/scripts/4OlwxU60UqKg81yb.js +++ b/scripts/4OlwxU60UqKg81yb.js @@ -1,6 +1,6 @@ const target = args.actor; -if (target.has("Ethereal") || target.has("Corruption")) { +if (target.has("Éthéré") || target.has("Corruption")) { args.totalWoundLoss += 6; args.modifiers.other.push({label: this.effect.name, value: 6}) } \ No newline at end of file diff --git a/scripts/4Q3Mp04O2sMgKv9x.js b/scripts/4Q3Mp04O2sMgKv9x.js new file mode 100644 index 0000000..85ada34 --- /dev/null +++ b/scripts/4Q3Mp04O2sMgKv9x.js @@ -0,0 +1 @@ +return !args.title.includes("Spellbreaking") \ No newline at end of file diff --git a/scripts/4ZR7p8G3OzOBWx0L.js b/scripts/4ZR7p8G3OzOBWx0L.js deleted file mode 100644 index 6e89db8..0000000 --- a/scripts/4ZR7p8G3OzOBWx0L.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Endurance"); \ No newline at end of file diff --git a/scripts/4fnTKgl0HW9ZrWyJ.js b/scripts/4fnTKgl0HW9ZrWyJ.js deleted file mode 100644 index 2b3f659..0000000 --- a/scripts/4fnTKgl0HW9ZrWyJ.js +++ /dev/null @@ -1,10 +0,0 @@ -this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty : "average"}}).then(async test => -{ - await test.roll() - if (test.failed) - { - let char = Math.ceil(CONFIG.Dice.randomUniform() * 2) == 2 ? "s" : "t"; - this.script.scriptMessage(`${this.actor.name} perd 1 point de ${game.wfrp4e.config.characteristics[char]}`) - this.actor.update({[`system.characteristics.${char}.initial`] : this.actor.system.characteristics[char].initial - 1}) - } -}) \ No newline at end of file diff --git a/scripts/4iu3CmOI19soOYuA.js b/scripts/4iu3CmOI19soOYuA.js new file mode 100644 index 0000000..0004c62 --- /dev/null +++ b/scripts/4iu3CmOI19soOYuA.js @@ -0,0 +1,50 @@ +let characteristics = { + "ws" : -10, + "bs" : -10, + "s" : 0, + "t" : 0, + "i" : -10, + "ag" : -10, + "dex" : 0, + "int" : -200, + "wp" : -200, + "fel" : -200 +} +let traits = [ {name:"Armure", value: 2}, {name:"Fabriqué"}, {name:"Vision dans l'obscurité"}, {name:"Peur", value: 2}, {name:"Insensible à la douleur"},{name:"Mort-vivant"},{name:"Instable"} ]; +let items = []; + +let updateObj = this.actor.toObject(); +for (let ch in characteristics) +{ + updateObj.system.characteristics[ch].modifier += characteristics[ch]; +} + +updateObj.system.characteristics.int.initial = 0; +updateObj.system.characteristics.wp.initial = 0; +updateObj.system.characteristics.fel.initial = 0; + +for (let trait of traits) +{ + let traitItem = await game.wfrp4e.utility.find(trait.name, "trait") + if (traitItem) + { + let t = traitItem.toObject(); + t.system.specification.value = trait.value; + if (trait.disabled) + { + t.system.disabled = true; + } + items.push(t); + } + else + { + ui.notifications.warn(`Impossible de trouver ${trait.name}`, {permanent : true}) + } +} + + + +updateObj.name = updateObj.name += " " + this.effet.name + +await this.actor.update(updateObj) +this.actor.createEmbeddedDocuments("Item", items); diff --git a/scripts/4iuTz0uInAfMaoGl.js b/scripts/4iuTz0uInAfMaoGl.js deleted file mode 100644 index d3f97d5..0000000 --- a/scripts/4iuTz0uInAfMaoGl.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name?.includes(game.i18n.localize("NAME.Language")) || args.type == "cast" \ No newline at end of file diff --git a/scripts/4jLe2XZQVUB8LztP.js b/scripts/4jLe2XZQVUB8LztP.js new file mode 100644 index 0000000..c2c4432 --- /dev/null +++ b/scripts/4jLe2XZQVUB8LztP.js @@ -0,0 +1 @@ +args.fields.slBonus += this.effect.getFlag("wfrp4e", "slBonus") || 0; \ No newline at end of file diff --git a/scripts/4pQW4WLyhjbZR85k.js b/scripts/4pQW4WLyhjbZR85k.js deleted file mode 100644 index ffdc6ea..0000000 --- a/scripts/4pQW4WLyhjbZR85k.js +++ /dev/null @@ -1,7 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "average"}, context : {failure: "1 Corruption Point Gained"}}) -await test.roll(); -if (test.failed && this.actor.type == "character") -{ - this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + 1}) - this.script.scriptMessage("Gain d'un Point de Corruption", {whisper : ChatMessage.getWhisperRecipients("GM")}) -} \ No newline at end of file diff --git a/scripts/4rTmV3TNxctUe0ly.js b/scripts/4rTmV3TNxctUe0ly.js index 30a0737..83e509e 100644 --- a/scripts/4rTmV3TNxctUe0ly.js +++ b/scripts/4rTmV3TNxctUe0ly.js @@ -1,6 +1,6 @@ -let test = await this.actor.setupCharacteristic("ag", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}); -await test.roll(); -if (test.failed) +let test = await this.actor.setupCharacteristic("ag", {skipTargets: true, appendTitle : ` - ${this.effet.name}`}); +await Test.roll(); +if (Test.Échoué) { this.actor.addCondition("bleeding"); } diff --git a/scripts/4rb7LfMq9CTnlrpn.js b/scripts/4rb7LfMq9CTnlrpn.js deleted file mode 100644 index 214bdc9..0000000 --- a/scripts/4rb7LfMq9CTnlrpn.js +++ /dev/null @@ -1,10 +0,0 @@ -if (args.totalWoundLoss > 0) -{ - let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : " - " + this.effect.name}) - await test.roll(); - if (test.failed) - { - args.totalWoundLoss += 5; - args.modifiers.other.push({label : this.effect.name, value : 5}) - } -} \ No newline at end of file diff --git a/scripts/4ylzjgUdHY5D0yVh.js b/scripts/4ylzjgUdHY5D0yVh.js index 561499c..436668d 100644 --- a/scripts/4ylzjgUdHY5D0yVh.js +++ b/scripts/4ylzjgUdHY5D0yVh.js @@ -10,12 +10,12 @@ let characteristics = { "wp" : 25, "fel" : 10 } -let skills = ["Calme", "Esquive", "Intimidate", "Intuition", "Langue (Battle)", "Commandement" , "Lore (Warfare)", "Perception"] +let skills = ["Calme", "Esquive", "Intimidation", "Intuition", "Langue (Bataille)", "Commandement", "Savoir (Guerre)", "Perception"] let skillAdvancements = [15, 15, 15, 15, 10, 15, 10, 10] -let talents = ["Combat Aware", "Combat Master", "Combat Reflexes", "Inspiring", "Resolute", "War Leader"] -let trappings = ["Arme simple", "Shield", "Plate Breastplate", "Plate Bracers", "Plate Helm", "Plate Leggings"] -let specialItems = [] +let talents = ["Vigilance", "Maîtrise du combat", "Combat Instinctif", "Inspiring", "Déterminé", "Seigneur de guerre"] +let trappings = ["Arme simple", "Bouclier", "Plastron d'acier", "Brassards", "Heaume", "Jambières d'acier"] +let specialItems = [] let items = []; let updateObj = this.actor.toObject(); @@ -28,11 +28,11 @@ for (let ch in characteristics) for (let item of specialItems) { let newItem if (item.type == "weapon") { - newItem = new ItemWfrp4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) + newItem = new ItemWFRP4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) } else if (item.type == "trapping") { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) } else { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) } items.push(newItem.toObject()) } @@ -44,7 +44,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -60,13 +60,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -77,7 +77,7 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } @@ -94,19 +94,19 @@ let filters = [ } ] -items = items.concat(await ItemDialog.createFromFilters(filters, 1, "Choisissez an appropriate Polearm or Two-Handed Weapon")) +items = items.concat(await ItemDialog.createFromFilters(filters, 1, {text : "Choisissez une arme d'hast ou une arme à deux mains appropriée"})) -let ride = await Dialog.confirm({title : "Skill", content : "Add Chaos Steed and +20 Ride (Horse)?"}) +let ride = await foundry.applications.api.DialogV2.confirm({title : "Compétence", content : "Ajouter Chaos Steed et +20 en Monte (Cheval) ?", window : {title : this.effect.name}}) if (ride) { - let skill = await game.wfrp4e.utility.findSkill("Ride (Horse)") + let skill = await game.wfrp4e.utility.findSkill("Monte (Cheval)") skill = skill.toObject(); skill.system.advances.value = 20; items = items.concat({name : "Chaos Steed", type: "trapping", "system.trappingType.value" : "misc"}, skill) } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); \ No newline at end of file diff --git a/scripts/52mwb33mGrQjq89B.js b/scripts/52mwb33mGrQjq89B.js deleted file mode 100644 index 33c3e75..0000000 --- a/scripts/52mwb33mGrQjq89B.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Research"); \ No newline at end of file diff --git a/scripts/55eYGvSXetDMK80S.js b/scripts/55eYGvSXetDMK80S.js new file mode 100644 index 0000000..219704b --- /dev/null +++ b/scripts/55eYGvSXetDMK80S.js @@ -0,0 +1,2 @@ +const diseaseIds = this.actor.items.filter(i => i.type == "disease").map(i => i.id) +this.actor.deleteEmbeddedDocuments("Item", diseaseIds) \ No newline at end of file diff --git a/scripts/58rFc9HiBoX66J6p.js b/scripts/58rFc9HiBoX66J6p.js index 7c3ebd8..69232b8 100644 --- a/scripts/58rFc9HiBoX66J6p.js +++ b/scripts/58rFc9HiBoX66J6p.js @@ -1,9 +1,9 @@ let sourceActor = this.effect.sourceActor; let damage = args.totalWoundLoss; let tb = sourceActor.system.characteristics.t.bonus -args.abort = `${this.effect.name}: Dommages appliqués à ${sourceActor.name}`; +args.abort = `${this.effect.name}: Dégâts appliqués à ${sourceActor.name}`; let message = await sourceActor.applyBasicDamage(damage - tb, {damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true}) -this.script.scriptMessage(message.replace(`${tb} TB`, `${tb} × 2 TB`)) +this.script.message(message.replace(`${tb} TB`, `${tb} × 2 TB`)) args.abort = true; \ No newline at end of file diff --git a/scripts/5DI6cHAg1LHo54Yv.js b/scripts/5DI6cHAg1LHo54Yv.js index ecba952..9ff5752 100644 --- a/scripts/5DI6cHAg1LHo54Yv.js +++ b/scripts/5DI6cHAg1LHo54Yv.js @@ -1,5 +1,6 @@ if (args.opposedTest.result.differenceSL >= 0 && args.opposedTest.result.differenceSL <= 2 && args.opposedTest.result.winner == "attacker") -{ +{ this.actor.update({"system.status.fortune.value" : Math.max(0, (this.actor.system.status.fortune?.value - 1) || 0)}) - this.script.scriptMessage(`1 Point de Fortune volé à ${this.actor.name}`, {blind : true, whisper : ChatMessage.getWhisperRecipients("GM")}) + this.script.message(`1 Point de Chance volé à ${this.actor.name}`, {blind : true, whisper : ChatMessage.getWhisperRecipients("GM")}) + } \ No newline at end of file diff --git a/scripts/5Fe1ELaS6Gnvy0Cj.js b/scripts/5Fe1ELaS6Gnvy0Cj.js deleted file mode 100644 index a62afb6..0000000 --- a/scripts/5Fe1ELaS6Gnvy0Cj.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes("Focalisation") || args.type == "channelling" || args.skill?.name == game.i18n.localize("NAME.Charm") || args.skill?.name.includes("Langue (Magick)") || args.type == "cast" \ No newline at end of file diff --git a/scripts/5GHQxfxlmjyt1fNq.js b/scripts/5GHQxfxlmjyt1fNq.js new file mode 100644 index 0000000..e62670f --- /dev/null +++ b/scripts/5GHQxfxlmjyt1fNq.js @@ -0,0 +1,4 @@ +let item1 = await fromUuid("Compendium.wfrp4e-core.items.Item.EO05HX7jql0g605A") +let item2 = await fromUuid("Compendium.wfrp4e-core.items.Item.Bvd2aZ0gQUXHfCTh") +let ids = await this.actor.createEmbeddedDocuments("Item", [item1, item2], {fromEffect : this.effect.id}) +this.actor.updateEmbeddedDocuments('Item', [ {_id: ids[0].id, 'system.specification.value': 16} ] ) \ No newline at end of file diff --git a/scripts/5GP9UJMvBZv6kWtI.js b/scripts/5GP9UJMvBZv6kWtI.js new file mode 100644 index 0000000..d9cf4bf --- /dev/null +++ b/scripts/5GP9UJMvBZv6kWtI.js @@ -0,0 +1,27 @@ +this.script.message(await this.actor.applyBasicDamage(8, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true})) + + +let msg = `` +let weapons = args.actor.itemTypes.weapon.filter(i => !i.system.location.value); +let armour = args.actor.itemTags.armour.filter(i => !i.system.location.value); +for(let item of weapons) +{ + if (item.system.properties.qualities.shield) + { + await item.system.damageItem(1, "shield"); + } + else + { + await item.system.damageItem(1); + } + msg += `

${item.name} endommagé de 1

` +} +for(let item of armour) +{ + await item.system.damageItem(1); + msg += `

${item.name} endommagé de 1

` +} +if (msg) +{ + this.script.message(msg, {speaker : {alias : args.actor.name}}); +} \ No newline at end of file diff --git a/scripts/5JWC0l3JEpOsqbR9.js b/scripts/5JWC0l3JEpOsqbR9.js index f51b369..b75111b 100644 --- a/scripts/5JWC0l3JEpOsqbR9.js +++ b/scripts/5JWC0l3JEpOsqbR9.js @@ -12,7 +12,7 @@ let characteristics = { } let skills = ["Esquive", "Perception"] let skillAdvancements = [10, 10] -let talents = ["Flee!", "Marksman"] +let talents = ["Fuite !", "Tireur de précision"] let trappings = ["Arme simple"] let items = []; @@ -30,7 +30,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,13 +63,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); diff --git a/scripts/5JvKJZPcd6Hz5zvn.js b/scripts/5JvKJZPcd6Hz5zvn.js index 237e3c9..340a967 100644 --- a/scripts/5JvKJZPcd6Hz5zvn.js +++ b/scripts/5JvKJZPcd6Hz5zvn.js @@ -10,10 +10,10 @@ let characteristics = { "wp" : 15, "fel" : 0 } -let skills = ["Calme", "Esquive", "Intimidate", "Commandement" ] +let skills = ["Calme", "Esquive", "Intimidation", "Commandement"] let skillAdvancements = [15, 15, 10, 5] -let talents = ["Combat Aware", "Combat Reflexes", "Feint", "Resolute"] -let trappings = ["Mail Coat", "Mail Chausses", "Mail Coif", "Arme simple", "Shield"] +let talents = ["Vigilance", "Combat Instinctif", "Feinte", "Déterminé"] +let trappings = ["Cotte de Mailles", "Chausses de Mailles", "Coiffe de Mailles", "Arme simple", "Bouclier"] let items = []; let updateObj = this.actor.toObject(); @@ -30,7 +30,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,7 +63,7 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } diff --git a/scripts/5KIozV7HxyGvskeD.js b/scripts/5KIozV7HxyGvskeD.js new file mode 100644 index 0000000..425fa2a --- /dev/null +++ b/scripts/5KIozV7HxyGvskeD.js @@ -0,0 +1 @@ +args.data.reversal = {allowed : true, if: "worse"}; \ No newline at end of file diff --git a/scripts/5KVslRqhqzuFLyk4.js b/scripts/5KVslRqhqzuFLyk4.js new file mode 100644 index 0000000..73f347f --- /dev/null +++ b/scripts/5KVslRqhqzuFLyk4.js @@ -0,0 +1,3 @@ +if (!this.actor.has("Béni (Taal)", "talent")) return; + +this.actor.system.characteristics.wp.modifier += 15; \ No newline at end of file diff --git a/scripts/5M6IgCUncCwyxHok.js b/scripts/5M6IgCUncCwyxHok.js index 330998b..bbbca4c 100644 --- a/scripts/5M6IgCUncCwyxHok.js +++ b/scripts/5M6IgCUncCwyxHok.js @@ -4,12 +4,12 @@ etiquette.name += ` (Suivants de Tzeentch)`; let animosity = (await fromUuid("Compendium.wfrp4e-core.items.Item.0VpT5yubw4UL7j6f")).toObject(); animosity.system.specification.value = "Suivants de Nurgle"; -let roll = await new Roll("ceil(1d10 / 3)").roll(); +let roll = await new Roll("ceil(1d10 / 3)").roll({allowInteractive : false}); roll.toMessage(this.script.getChatData()); let mutations = []; -let msg = `

Mutations acquises

` +let msg = `

Mutations Acquises

` for(let i = 0; i < roll.total; i++) { let item; @@ -19,7 +19,7 @@ for(let i = 0; i < roll.total; i++) { result = await game.wfrp4e.tables.rollTable("mutatemental", {hideDSN: true}, "Tzeentch") } - else + else { result = await game.wfrp4e.tables.rollTable("mutatephys", {hideDSN: true}, "Tzeentch") } @@ -32,4 +32,4 @@ for(let i = 0; i < roll.total; i++) } } this.actor.createEmbeddedDocuments("Item", mutations.concat([etiquette, animosity]), {fromEffect : this.effect.id}) -this.script.scriptMessage(msg); \ No newline at end of file +this.script.message(msg); \ No newline at end of file diff --git a/scripts/5MxRDXzUBPfp2KKD.js b/scripts/5MxRDXzUBPfp2KKD.js index 578674f..9a0d3ef 100644 --- a/scripts/5MxRDXzUBPfp2KKD.js +++ b/scripts/5MxRDXzUBPfp2KKD.js @@ -1 +1 @@ -args.options.useOnesSupportive = true; \ No newline at end of file +args.context.useOnesSupportive = true; \ No newline at end of file diff --git a/scripts/5ScjIdRUOxblHdWS.js b/scripts/5ScjIdRUOxblHdWS.js index a0923ec..979fc13 100644 --- a/scripts/5ScjIdRUOxblHdWS.js +++ b/scripts/5ScjIdRUOxblHdWS.js @@ -1,5 +1,5 @@ -const repaired_message = `

Réparation finie ${this.item.name}.

`; -const test = 'Trade (Carpenter)'; +const repaired_message = `

Réparation terminée ${this.item.name}.

`; +const Test = 'Métier (Charpentier)'; const difficulty = 'challenging'; const target = 40; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/5XAYjiq1i4M7Ky7j.js b/scripts/5XAYjiq1i4M7Ky7j.js new file mode 100644 index 0000000..f48b002 --- /dev/null +++ b/scripts/5XAYjiq1i4M7Ky7j.js @@ -0,0 +1,49 @@ +const trait = this.actor.itemTags.trait.find(t => t.name === "Régénération"); +const name = "Régénération Pourrie"; + +if (!trait) return; + +const effect = trait.effects.find(e => e.name === "Régénération"); +const scriptData = effect.system.scriptData; + +scriptData[0].script = ` + let chatData = {whisper: ChatMessage.getWhisperRecipients("GM")}; + let message = ""; + + let Blessures = foundry.utils.duplicate(this.actor.status.Blessures); + let regenRoll = await new Roll("1d10").roll({allowInteractive : false}); + let regen = regenRoll.total; + + if (Blessures.value >= Blessures.max) + return; + + if (Blessures.value > 0) { + Blessures.value += Math.floor(regen / 2); + if (Blessures.value > Blessures.max) { + Blessures.value = Blessures.max; + } + message += \`\${this.actor.name} regagne \${regen} Blessures.\`; + + if (regen === 10) { + message += "
De plus, il régénère une Blessure Critique."; + } + } else if (regen >= 8) { + message += \`\${this.actor.name} a obtenu un \${regen} et regagne 1 Blessure.\`; + Blessures.value += 1; + if (regen === 10) { + message += "
De plus, il régénère une Blessure Critique."; + } + } else { + message += \`\${this.actor.name} Résultat de régénération de \${regen} - Aucun effet.\`; + } + + await this.actor.update({"system.status.wounds": Blessures}); + this.script.message(message, {whisper: ChatMessage.getWhisperRecipients("GM")}); +` + +await effet.update({ + name, + "system.scriptData": scriptData +}); + +await trait.update({name}); \ No newline at end of file diff --git a/scripts/5dR7Erj3nwsxLAV7.js b/scripts/5dR7Erj3nwsxLAV7.js index b27afbe..30fae57 100644 --- a/scripts/5dR7Erj3nwsxLAV7.js +++ b/scripts/5dR7Erj3nwsxLAV7.js @@ -10,10 +10,10 @@ let characteristics = { "wp" : 35, "fel" : 15 } -let skills = ["Calme", "Esquive", "Intimidate", "Intuition", "Commandement" , "Lore (Warfare)", "Perception"] +let skills = ["Calme", "Esquive", "Intimidation", "Intuition", "Commandement", "Savoir (Guerre)", "Perception"] let skillAdvancements = [25, 15, 25, 25, 30, 20, 20] -let talents = ["Combat Aware", "Combat Reflexes", "Feint", "Inspiring", "Chance", "Resolute", "Unshakable", "War Leader"] -let trappings = ["Arme simple", "Shield"] +let talents = ["Vigilance", "Combat Instinctif", "Feinte", "Inspiring", "Chanceux", "Déterminé", "Inébranlable", "Seigneur de guerre"] +let trappings = ["Arme simple", "Bouclier"] let items = []; let updateObj = this.actor.toObject(); @@ -30,7 +30,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,13 +63,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); \ No newline at end of file diff --git a/scripts/5gPAT5Bb2FvQwYNQ.js b/scripts/5gPAT5Bb2FvQwYNQ.js new file mode 100644 index 0000000..d092652 --- /dev/null +++ b/scripts/5gPAT5Bb2FvQwYNQ.js @@ -0,0 +1,2 @@ +args.test.preData.reversal = {allowed : true, if: "better"}; +this.effect.delete(); \ No newline at end of file diff --git a/scripts/5lpR78CLhYH6Mjnu.js b/scripts/5lpR78CLhYH6Mjnu.js new file mode 100644 index 0000000..89ba187 --- /dev/null +++ b/scripts/5lpR78CLhYH6Mjnu.js @@ -0,0 +1,3 @@ +if (this.actor.has("Arboricole","trait")) return + +this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.rOV2s6PQBBrhpMOv", this.effect) \ No newline at end of file diff --git a/scripts/5o1XiceC4rutjMms.js b/scripts/5o1XiceC4rutjMms.js deleted file mode 100644 index 2646b2f..0000000 --- a/scripts/5o1XiceC4rutjMms.js +++ /dev/null @@ -1 +0,0 @@ -return !args.item?.name.includes(game.i18n.localize("NAME.Stealth")) \ No newline at end of file diff --git a/scripts/5sI9iYh5j2nx2XyT.js b/scripts/5sI9iYh5j2nx2XyT.js deleted file mode 100644 index 9834162..0000000 --- a/scripts/5sI9iYh5j2nx2XyT.js +++ /dev/null @@ -1 +0,0 @@ -return !(["Soin aux animaux", "Emprise sur les animaux"].includes(args.item?.name) || args.item?.name.includes("Chevaucher") || args.item?.name.includes("Dressage")) \ No newline at end of file diff --git a/scripts/5uokSqQsjgMapnCi.js b/scripts/5uokSqQsjgMapnCi.js new file mode 100644 index 0000000..12f6c92 --- /dev/null +++ b/scripts/5uokSqQsjgMapnCi.js @@ -0,0 +1,9 @@ +if ( + this.item == args.defenderTest.item + && args.defenderTest.succeeded + && args.defenderTest.item?.system?.attackType == 'melee' + && (args.attackerTest.item.properties.qualities?.magical || args.attackerTest.item.properties.unusedQualities?.magical) +) +{ + args.opposedTest.result.other.push(`${this.effect.name}: détruit magique ${args.attackerTest.item.name}.`) +} \ No newline at end of file diff --git a/scripts/5z5nGwZC5RIwokev.js b/scripts/5z5nGwZC5RIwokev.js new file mode 100644 index 0000000..b0ccc5f --- /dev/null +++ b/scripts/5z5nGwZC5RIwokev.js @@ -0,0 +1 @@ +this.script.message(await this.actor.applyBasicDamage(12, {suppressMsg: true, loc: "roll"})) \ No newline at end of file diff --git a/scripts/6136BMmiGLwZ16H1.js b/scripts/6136BMmiGLwZ16H1.js new file mode 100644 index 0000000..cba7e1e --- /dev/null +++ b/scripts/6136BMmiGLwZ16H1.js @@ -0,0 +1 @@ +return !!args.skill \ No newline at end of file diff --git a/scripts/62Ky6bC1EnTllSJA.js b/scripts/62Ky6bC1EnTllSJA.js index 8d0a535..f041446 100644 --- a/scripts/62Ky6bC1EnTllSJA.js +++ b/scripts/62Ky6bC1EnTllSJA.js @@ -1,4 +1,4 @@ if (this.effect.sourceActor.uuid != args.actor.uuid) { - this.script.scriptMessage(await this.actor.applyBasicDamage(this.effect.sourceTest.result.overcast.usage.other.current, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg: true})); + this.script.message(await this.actor.applyBasicDamage(this.effect.sourceTest.result.overcast.usage.other.current, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg: true})); } \ No newline at end of file diff --git a/scripts/64aJznxPMUHAuf7F.js b/scripts/64aJznxPMUHAuf7F.js new file mode 100644 index 0000000..95c6580 --- /dev/null +++ b/scripts/64aJznxPMUHAuf7F.js @@ -0,0 +1,17 @@ +if (this.item.flags.runeOfLuck || this.actor.type != "character") return + +const currentFortune = this.actor.status.fortune.value +const runesOfLuck = this.item.effects.contents.filter(e => e.name == this.effect.name) +const runeFortune = parseInt(runesOfLuck.length) + +if (args.equipped) { + this.item.flags.runeOfLuck = true + await this.actor.update({"system.status.fortune.value" : runeFortune + currentFortune}) + this.script.message(`Points de Chance augmentés de ${currentFortune} à ${runeFortune + currentFortune}.`) +} +else +{ + this.item.flags.runeOfLuck = true + await this.actor.update({"system.status.fortune.value" : Math.max(0, currentFortune - runeFortune)}) + this.script.message(`Points de Chance réduits à ${Math.max(0, currentFortune - runeFortune)}.`) +} \ No newline at end of file diff --git a/scripts/65xE9OV5sA1ZWT7j.js b/scripts/65xE9OV5sA1ZWT7j.js index 7ece796..68bc98e 100644 --- a/scripts/65xE9OV5sA1ZWT7j.js +++ b/scripts/65xE9OV5sA1ZWT7j.js @@ -5,5 +5,5 @@ let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll / let ones = Number(args.test.result.roll.toString().split("").pop()) if (ones > SL) - args.test.result.other.push(`${this.effect.name}: ${ones + args.test.successBonus + args.test.slBonus} DR`) + args.Test.result.other.push(`${this.effect.name}: ${ones + args.test.successBonus + args.test.slBonus} DR`) } \ No newline at end of file diff --git a/scripts/6A6ddQDJo23oOWtK.js b/scripts/6A6ddQDJo23oOWtK.js new file mode 100644 index 0000000..738db8e --- /dev/null +++ b/scripts/6A6ddQDJo23oOWtK.js @@ -0,0 +1,3 @@ +const SL = this.effect.getFlag("wfrp4e", "SL") ?? 0; + +args.fields.slBonus += SL; \ No newline at end of file diff --git a/scripts/6Aqq4F4Xui923sc6.js b/scripts/6Aqq4F4Xui923sc6.js index 1e4990b..832d788 100644 --- a/scripts/6Aqq4F4Xui923sc6.js +++ b/scripts/6Aqq4F4Xui923sc6.js @@ -1,12 +1,12 @@ -// Imbibing this substance grants the user the Painless Creature Trait. -const hasColdBlooded = this.actor.has("A Sang Froid") -if (hasColdBlooded === undefined) +// Imbibing this substance grants the user the utilisateur d Creature Trait. +const hasColdBlooded = this.actor.has("À Sang Froid") +if (hasColdBlooded === undefined) { let item = await fromUuid("Compendium.wfrp4e-core.items.mCh1KK9jomwFZcLB") let data = item.toObject() this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) - - this.script.scriptMessage(`

${this.actor.prototypeToken.name} reçoit le Trait de Créatuer A Sang Froid et peut inverser n'importe quel test de Force Mentale échoué.

-

Si il reçoit un état Surpris, cet état n'est pas perdu la première fois (typiquement à la fin du Round ou si il est attaqué).

`, - {whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) + + this.script.message(`

${this.actor.prototypeToken.name} a acquis le Trait de Créature À Sang Froid et peut annuler tout test de Volonté raté.

+

Si ils gagnent une Condition Surpris, cette Condition n'est pas perdue la première fois qu'elle devrait l'être (ce qui est généralement à la fin du Round ou si la victime est attaquée).

`, + {whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) } \ No newline at end of file diff --git a/scripts/6AsCMHZ4IYPq7Uxf.js b/scripts/6AsCMHZ4IYPq7Uxf.js new file mode 100644 index 0000000..54d3740 --- /dev/null +++ b/scripts/6AsCMHZ4IYPq7Uxf.js @@ -0,0 +1 @@ +return args.skill?.name.includes("Focalisation"); \ No newline at end of file diff --git a/scripts/6BmvV9c03FkfisnE.js b/scripts/6BmvV9c03FkfisnE.js index 77954b8..9bdf9d6 100644 --- a/scripts/6BmvV9c03FkfisnE.js +++ b/scripts/6BmvV9c03FkfisnE.js @@ -1,20 +1,20 @@ // Apply changes when the mask is worn -if (args.equipped) { - this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) - this.script.scriptMessage(`${this.actor.name} porte le ${this.item.name}.
- Il gagne +1 Point de Corruption point si un Test de Corruption est échoué, à appliquer manuellement.
Si le personnage porte le masque pendant plus d'une heure ou utilise les effets du masque, il est exposé à une @Corruption[moderate]{Corruption Modérée} +if (args.equipped) { + this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) + this.script.message(`${this.actor.name} porte le ${this.item.name}.
+ Ils gagnent +1 point de Corruption si un Test d'exposition échoue, ce qui devra être appliqué manuellement.
S'ils portent le masque pendant plus d'une heure ou bénéficient de l'un de ses effets, ils sont exposés à @Corruption[modérée]{Corruption Modérée} `, - {whisper: ChatMessage.getWhisperRecipients("GM")}) + {whisper: ChatMessage.getWhisperRecipients("GM")}) } -// Notify of lingering effects when mask is removed +// Notify of lingering effects when mask is Retiré else if (!args.equipped) { await this.item.effects.contents[0].delete(); await this.item.update({name : this.item.name += " (Utilisé)"}) - this.script.scriptMessage(`${this.item.name} de ${this.actor.name} a été enlevé et a perdu ses propriétés. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils devront être manuellement supprimés.`, + this.script.message(`${this.item.name} porté par ${this.actor.name} a été retiré et perd ses propriétés. Cependant, les effets durent [[1d10+4]] jours, après quoi ils doivent être retirés manuellement.`, {whisper: ChatMessage.getWhisperRecipients("GM")} ) - + } \ No newline at end of file diff --git a/scripts/6H6vNjzvMGl2ZqCR.js b/scripts/6H6vNjzvMGl2ZqCR.js index adcbe71..96a95e6 100644 --- a/scripts/6H6vNjzvMGl2ZqCR.js +++ b/scripts/6H6vNjzvMGl2ZqCR.js @@ -1,2 +1,2 @@ if (args.totalWoundLoss > 0) - this.script.scriptMessage(`Lame de Nurglitch: ${args.actor.name} doit réussir un Test d'Endurance Difficile (-10) ou recevoir une @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Blessure Purulente}`, {whisper: ChatMessage.getWhisperRecipients("GM") }) \ No newline at end of file + this.script.message(`Blade of Nurglitch: ${args.actor.name} doit réussir un Test d'Résistance de Difficulté (-10) ou recevoir une @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Blessure Purulente}`, {whisper: ChatMessage.getWhisperRecipients("GM") }) \ No newline at end of file diff --git a/scripts/6HfCvw24X6oEe2vn.js b/scripts/6HfCvw24X6oEe2vn.js new file mode 100644 index 0000000..4bc9e12 --- /dev/null +++ b/scripts/6HfCvw24X6oEe2vn.js @@ -0,0 +1,4 @@ +if (["t", "s"].includes(args.characteristic)) +{ + args.fields.modifier += 10; +} \ No newline at end of file diff --git a/scripts/6JrUjs3g5x6bFnj3.js b/scripts/6JrUjs3g5x6bFnj3.js deleted file mode 100644 index 5655bd3..0000000 --- a/scripts/6JrUjs3g5x6bFnj3.js +++ /dev/null @@ -1,8 +0,0 @@ -let bite = await fromUuid("Compendium.wfrp4e-core.items.pLW9SVX0TVTYPiPv") -let sense = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS") -let biteData = bite.toObject(); -let senseData = sense.toObject(); - -biteData.system.specification.value = 6 - this.actor.characteristics.s.bonus; -senseData.name = senseData.name += " (Odorat)" -this.actor.createEmbeddedDocuments("Item", [biteData, senseData], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/6LMzIdmCSYctgmGx.js b/scripts/6LMzIdmCSYctgmGx.js new file mode 100644 index 0000000..327e763 --- /dev/null +++ b/scripts/6LMzIdmCSYctgmGx.js @@ -0,0 +1,5 @@ +const stupid = this.actor.items.find(i => i.name === "Stupidee"); + +if (!stupid) return; + +await stupid.update({"system.disabled": true}); \ No newline at end of file diff --git a/scripts/6P2QNPKfwQ1xwxZT.js b/scripts/6P2QNPKfwQ1xwxZT.js new file mode 100644 index 0000000..cb8a845 --- /dev/null +++ b/scripts/6P2QNPKfwQ1xwxZT.js @@ -0,0 +1 @@ +args.fields.slBonus ++ \ No newline at end of file diff --git a/scripts/6QZUX7ZrFxOzqI0b.js b/scripts/6QZUX7ZrFxOzqI0b.js index fb1222e..162744e 100644 --- a/scripts/6QZUX7ZrFxOzqI0b.js +++ b/scripts/6QZUX7ZrFxOzqI0b.js @@ -3,7 +3,7 @@ let regenerate = this.actor.items.getName('Régénération') if (regenerate) { let effect = regenerate.effects.contents[0] - let scriptData = effect.getFlag("wfrp4e", "scriptData"); + let scriptData = effect.system.scriptData; scriptData[0].script = scriptData[0].script.replace("1d10", "1d10 * 2") } \ No newline at end of file diff --git a/scripts/6V3qHON3mcerlBlB.js b/scripts/6V3qHON3mcerlBlB.js deleted file mode 100644 index 67380e8..0000000 --- a/scripts/6V3qHON3mcerlBlB.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone"); -} \ No newline at end of file diff --git a/scripts/6Ws3ieQ7pG5poUyT.js b/scripts/6Ws3ieQ7pG5poUyT.js index bc5e5f3..1c68014 100644 --- a/scripts/6Ws3ieQ7pG5poUyT.js +++ b/scripts/6Ws3ieQ7pG5poUyT.js @@ -1,6 +1,6 @@ if (isNaN(parseInt(this.item.system.specification.value))) { - let value = await ValueDialog.create({text : "Enter Spellcasting Lore", title : this.effect.name}, "", Object.values(game.wfrp4e.config.magicLores)); + let value = await ValueDialog.create({text : "Entrez le Savoir d'Incantation", title : this.effect.name}, "", Object.values(game.wfrp4e.config.magicLores)); if (value) { this.item.updateSource({"system.specification.value" : value}); diff --git a/scripts/6ZS1rQLkNvMDO0Fp.js b/scripts/6ZS1rQLkNvMDO0Fp.js deleted file mode 100644 index f1c2324..0000000 --- a/scripts/6ZS1rQLkNvMDO0Fp.js +++ /dev/null @@ -1,11 +0,0 @@ -let roll = Math.ceil(CONFIG.Dice.randomUniform() * 10) -if (args.test.isFumble && roll == 1 && !args.test.result.misfire) -{ - args.test.result.misfire = game.i18n.localize("Misfire") + " (Résultat 1)" - args.test.result.misfireDamage = eval(parseInt(args.test.result.roll.toString().split('').pop()) + args.test.item.Damage) -} -else if (args.test.isFumble && roll != 1) -{ - args.test.result.other.push("Résultat du Raté: " + roll) -} - diff --git a/scripts/6elUNF58TaiYjxcx.js b/scripts/6elUNF58TaiYjxcx.js index d0b4d13..f0fd865 100644 --- a/scripts/6elUNF58TaiYjxcx.js +++ b/scripts/6elUNF58TaiYjxcx.js @@ -1,6 +1,6 @@ -let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : " - " + this.effect.name, context : {failure: "Gained a Stunned Condition"}}) -await test.roll(); -if (test.failed) +let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : " - " + this.effet.name, context : {failure: "GAin d'1 état Sonné"}}) +await Test.roll(); +if (Test.Échoué) { this.actor.addCondition("stunned"); } \ No newline at end of file diff --git a/scripts/6fElmBxTjdAaubbK.js b/scripts/6fElmBxTjdAaubbK.js deleted file mode 100644 index f1d5302..0000000 --- a/scripts/6fElmBxTjdAaubbK.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "average"}}); -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone") -} diff --git a/scripts/6frithfMs7Nbv0IZ.js b/scripts/6frithfMs7Nbv0IZ.js new file mode 100644 index 0000000..8cea0b5 --- /dev/null +++ b/scripts/6frithfMs7Nbv0IZ.js @@ -0,0 +1 @@ +args.fields.slBonus += this.effect.sourceActor.system.characteristics.fel.bonus; \ No newline at end of file diff --git a/scripts/6jcTzK1XEuWqAacN.js b/scripts/6jcTzK1XEuWqAacN.js index 6da3cb5..3ba7bf0 100644 --- a/scripts/6jcTzK1XEuWqAacN.js +++ b/scripts/6jcTzK1XEuWqAacN.js @@ -1,2 +1,2 @@ args.abort = true; -this.script.scriptNotification(`Impossible d'utiliser ${game.wfrp4e.config.locations[this.effect.getFlag("wfrp4e", "location")]}!`, "error") \ No newline at end of file +this.script.notification(`Impossible d'utiliser ${game.wfrp4e.config.locations[this.effect.getFlag("wfrp4e", "location")]}!`, "error") \ No newline at end of file diff --git a/scripts/6jp8slPU33oBQe1V.js b/scripts/6jp8slPU33oBQe1V.js index e38825c..c38c365 100644 --- a/scripts/6jp8slPU33oBQe1V.js +++ b/scripts/6jp8slPU33oBQe1V.js @@ -1 +1 @@ -return args.options.crewTest?.system.handling !== true; \ No newline at end of file +return args.context.crewTest?.system.handling !== true; \ No newline at end of file diff --git a/scripts/6kifXp2jXEaQVJsg.js b/scripts/6kifXp2jXEaQVJsg.js index d715b54..c7ca127 100644 --- a/scripts/6kifXp2jXEaQVJsg.js +++ b/scripts/6kifXp2jXEaQVJsg.js @@ -1,19 +1,7 @@ -let useWard = await Dialog.wait({ - title : this.effect.name, - content : `

Utiliser Ward fourni par ${this.effect.name}?`, - buttons : { - yes : { - label : "Yes", - callback: () => { - return true; - } - }, - no : { - label: "No", - callback: () => { - return false; - } - } +let useWard = await foundry.applications.api.DialogV2.confirm({ + content : `

Utiliser la Protection fournie par ${this.effect.name}?`, + window : { + title : this.effect.name, } }) diff --git a/scripts/6maNAmREdataXmo4.js b/scripts/6maNAmREdataXmo4.js new file mode 100644 index 0000000..51c4380 --- /dev/null +++ b/scripts/6maNAmREdataXmo4.js @@ -0,0 +1,5 @@ +if (this.actor.system.status?.ward?.value) { + this.actor.system.status.ward.value = Math.max(7, this.actor.system.status.ward.value-1); +} else { + this.actor.system.status.ward.value = 9; +} \ No newline at end of file diff --git a/scripts/6mpw9cGseG4W4eyd.js b/scripts/6mpw9cGseG4W4eyd.js index e927ba5..87306c1 100644 --- a/scripts/6mpw9cGseG4W4eyd.js +++ b/scripts/6mpw9cGseG4W4eyd.js @@ -1,11 +1,11 @@ if (this.actor.system.status.advantage.value >= 2) { await this.actor.modifyAdvantage(-2); - this.script.scriptNotification("Avvantage soustrait") + this.script.notification("Avantage retiré") } -else +else { - return this.script.scriptNotification("Pas assez d'Avantages!", "error") + return this.script.notification("Pas assez d'Avantage!", "error") } let test = await this.actor.setupTrait(this.item) diff --git a/scripts/6nA5LPXneAahHX2W.js b/scripts/6nA5LPXneAahHX2W.js new file mode 100644 index 0000000..66db238 --- /dev/null +++ b/scripts/6nA5LPXneAahHX2W.js @@ -0,0 +1,7 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Dodge"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) +await test.roll(); +if (test.failed) +{ + let sourceActor = this.effect.sourceActor; + this.script.message(await this.actor.applyBasicDamage(4 + sourceActor.system.characteristics.s.bonus, {suppressMsg : true})) +} \ No newline at end of file diff --git a/scripts/6oSs8qKFNFz2lSmh.js b/scripts/6oSs8qKFNFz2lSmh.js index a96cb59..104acde 100644 --- a/scripts/6oSs8qKFNFz2lSmh.js +++ b/scripts/6oSs8qKFNFz2lSmh.js @@ -1,2 +1,2 @@ -if (args.actorsystem.details.move.sail.value > 0) +if (args.actor.system.details.move.sail.value > 0) args.actor.system.details.move.sail.value = 0; diff --git a/scripts/6qJP0hpShEM43ohx.js b/scripts/6qJP0hpShEM43ohx.js index 3b9591f..3959aff 100644 --- a/scripts/6qJP0hpShEM43ohx.js +++ b/scripts/6qJP0hpShEM43ohx.js @@ -13,19 +13,19 @@ if (actor.itemTypes.skill.find(s => s.name === "Savoir (Océans)")) { loreTest.result.other.push(`${actor.name} reconnaît l'attrait du Léviathan.`); loreTest.renderRollCard(); return; - } + } } -let test = await actor.setupSkill('Calme', { - appendTitle: ` – ${this.effect.name}`, +let Test = await actor.setupSkill('Calme', { + appendTitle: ` – ${this.effet.name}`, skipTargets: true, fields: {difficulty: 'easy'}, characteristic: 'wp', }); -await test.roll(); +await Test.roll(); -if (!test.succeeded) { - test.result.other.push(`${actor.name} devien @Condition[Assommé] par cette vision.`); +if (!Test.succeeded) { + Test.result.other.push(`${actor.name} est devenu @Condition[Stunned] par la vue.`); test.renderRollCard(); actor.addCondition("stunned"); } \ No newline at end of file diff --git a/scripts/6qUKKep5vhFYmo1J.js b/scripts/6qUKKep5vhFYmo1J.js deleted file mode 100644 index 0fc2aa5..0000000 --- a/scripts/6qUKKep5vhFYmo1J.js +++ /dev/null @@ -1 +0,0 @@ -return args.type == "channelling" || args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) \ No newline at end of file diff --git a/scripts/6tjn0RH4VyOPFneS.js b/scripts/6tjn0RH4VyOPFneS.js deleted file mode 100644 index 0001110..0000000 --- a/scripts/6tjn0RH4VyOPFneS.js +++ /dev/null @@ -1 +0,0 @@ -return ["NAME.Row", "NAME.Swim"].map(i => game.i18n.localize(i)).includes(args.skill?.name); \ No newline at end of file diff --git a/scripts/6uldpFvKOCoW92cC.js b/scripts/6uldpFvKOCoW92cC.js index 087f48d..70c5b53 100644 --- a/scripts/6uldpFvKOCoW92cC.js +++ b/scripts/6uldpFvKOCoW92cC.js @@ -2,7 +2,7 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.uqGxFOEqeurwkAO3") item = item.toObject() item.system.specification.value = 10; -item.name += " (Feu)" -setProperty(item, "flags.wfrp4e.breath", "fire") +item.name += " (Fire)" +foundry.utils.setProperty(item, "flags.wfrp4e.breath", "fire") Item.create(item, {parent : this.actor, fromEffect: this.effect.id}) \ No newline at end of file diff --git a/scripts/6xTtJEhRc4OjcDTf.js b/scripts/6xTtJEhRc4OjcDTf.js index 1851340..c432305 100644 --- a/scripts/6xTtJEhRc4OjcDTf.js +++ b/scripts/6xTtJEhRc4OjcDTf.js @@ -1,5 +1,5 @@ -if (getProperty(args.data, "system.status.fortune.value")) +if (foundry.utils.getProperty(args.data, "system.status.fortune.value")) { - this.script.scriptNotification("Impossible de mettre à jour la Fortune"); + this.script.scriptNotification("Impossible de mettre à jour la Chance"); delete args.data.system.status.wounds.value; } \ No newline at end of file diff --git a/scripts/713v1T8HNste94pr.js b/scripts/713v1T8HNste94pr.js new file mode 100644 index 0000000..5bb59f2 --- /dev/null +++ b/scripts/713v1T8HNste94pr.js @@ -0,0 +1 @@ +args.context.grudge = true; \ No newline at end of file diff --git a/scripts/715G1Bf0haOHvmYQ.js b/scripts/715G1Bf0haOHvmYQ.js deleted file mode 100644 index 56674c9..0000000 --- a/scripts/715G1Bf0haOHvmYQ.js +++ /dev/null @@ -1 +0,0 @@ -return !(args.skill?.name == game.i18n.localize("NAME.Bribery") || args.skill?.name.includes(game.i18n.localize("NAME.Stealth"))) \ No newline at end of file diff --git a/scripts/7Ck0fkzE4WQ62qVe.js b/scripts/7Ck0fkzE4WQ62qVe.js deleted file mode 100644 index 5fc2ca7..0000000 --- a/scripts/7Ck0fkzE4WQ62qVe.js +++ /dev/null @@ -1,4 +0,0 @@ -if (args.item.type == "skill" && args.item.name == "Corps à corps (Base)") -{ - args.item.system.modifier.value += 20; -} \ No newline at end of file diff --git a/scripts/7F6aGxZJjwxm5e5P.js b/scripts/7F6aGxZJjwxm5e5P.js index 78ac070..d32ebb0 100644 --- a/scripts/7F6aGxZJjwxm5e5P.js +++ b/scripts/7F6aGxZJjwxm5e5P.js @@ -1,18 +1,18 @@ if (args.test.result.castOutcome == "failure") { - ValueDialog.create({text : "Enter Wounds Lost to gain SL", title : this.effect.name}, "0").then(async value => { - value = Math.clamped(value, 0, 3) + ValueDialog.create({text : "Entrez les Blessures Perdues pour gagner des DR", title : this.effect.name}, "0").then(async value => { + value = Math.clamp(value, 0, 3) if (value == 0) { - return; + return; } else if (Number.isNumeric(value)) { this.script.notification(`Lost ${value} Wounds`) this.actor.modifyWounds(-1 * value) await this.item.system.toggleEquip(); - args.test.addSL(value); - args.test.preData.other.push(`${this.effect.name}: +${value} SL`) + args.Test.addSL(value); + args.Test.preData.other.push(`${this.effect.name}: +${value} SL`) } }) } \ No newline at end of file diff --git a/scripts/7H6wYyJ6cpaoc2QQ.js b/scripts/7H6wYyJ6cpaoc2QQ.js deleted file mode 100644 index 05cbeea..0000000 --- a/scripts/7H6wYyJ6cpaoc2QQ.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Cool"); \ No newline at end of file diff --git a/scripts/7JW9t8AYSDkkzG2V.js b/scripts/7JW9t8AYSDkkzG2V.js index fe58e6c..506bfa0 100644 --- a/scripts/7JW9t8AYSDkkzG2V.js +++ b/scripts/7JW9t8AYSDkkzG2V.js @@ -1,21 +1,21 @@ // Apply changes when the mask is worn -if (args.equipped) -{ - this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) - this.script.scriptMessage(`${this.actor.name} porte le ${this.item.name}.
- Si le personnage porte le masque pendant plus d'une heure ou bénéficie de ses effets, il s'espose à une @Corruption[moderate]{Corruption Modérée}. +if (args.equipped) +{ + this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) + this.script.message(`${this.actor.name} porte le ${this.item.name}.
+ S'ils portent le masque pendant plus d'une heure ou bénéficient de l'un de ses effets, ils sont exposés à @Corruption[moderate]{Corruption Modérée}. `, - {whisper: ChatMessage.getWhisperRecipients("GM")}) + {whisper: ChatMessage.getWhisperRecipients("GM")}) } -// Notify of lingering effects when mask is removed +// Notify of lingering effects when mask is Retiré else if (!args.equipped) { await this.item.effects.contents[0].delete(); - await this.item.update({name : this.item.name += " (Utilisé)"}) - this.script.scriptMessage(`${this.item.name} porté par ${this.actor.name} a été enlevé et a perdu ses capacités. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils doivent être retirés manuellement.`, + await this.item.update({name : this.item.name += " (Used)"}) + this.script.message(`${this.item.name} sur ${this.actor.name} a été retiré et perd ses propriétés. Cependant, les effets durent [[1d10+4]] jours, après quoi ils doivent être retirés manuellement.`, {whisper: ChatMessage.getWhisperRecipients("GM")} ) - + } \ No newline at end of file diff --git a/scripts/7T3iXgrL72fea67C.js b/scripts/7T3iXgrL72fea67C.js new file mode 100644 index 0000000..3e5cd95 --- /dev/null +++ b/scripts/7T3iXgrL72fea67C.js @@ -0,0 +1,22 @@ +const bloodyFluxUUID = "Compendium.wfrp4e-core.items.Item.herUmN51D9TiL2Vn"; + +const test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), { + skipTargets: true, + appendTitle: ` — ${this.effect.name}`, + fields: {difficulty: "easy"}, + context: { + success: `Butcher est soigné.`, + failure: `Butcher contracte @UUID[${bloodyFluxUUID}].` + } +}); + +await Test.roll(); + +if (Test.Échoué) { + await this.actor.addEffectItems(bloodyFluxUUID, this.effet); +} else { + const SL = Test.result.SL; + const heal = 1 + SL; + await this.actor.modifyWounds(heal); + this.script.message(`Butcher a soigné ${heal} Blessures.`); +} \ No newline at end of file diff --git a/scripts/7UUS0gX2Pbi0HHiz.js b/scripts/7UUS0gX2Pbi0HHiz.js new file mode 100644 index 0000000..b0c77f9 --- /dev/null +++ b/scripts/7UUS0gX2Pbi0HHiz.js @@ -0,0 +1 @@ +return args.skill?.name !== game.i18n.localize("NAME.Swim"); \ No newline at end of file diff --git a/scripts/7VAhXHov6pR1SkgD.js b/scripts/7VAhXHov6pR1SkgD.js deleted file mode 100644 index 67dfce8..0000000 --- a/scripts/7VAhXHov6pR1SkgD.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name == game.i18n.localize("NAME.Endurance"); \ No newline at end of file diff --git a/scripts/7WR2hJjHPhHhHxAq.js b/scripts/7WR2hJjHPhHhHxAq.js index 1743398..86cf368 100644 --- a/scripts/7WR2hJjHPhHhHxAq.js +++ b/scripts/7WR2hJjHPhHhHxAq.js @@ -1,8 +1,8 @@ let poisoned = args.actor.hasCondition("poisoned") if (poisoned) { - this.script.scriptNotification(`Suppression de ${poisoned.conditionValue} états Empoisonné`) - poisoned.delete(); + this.script.notification(`SSuppression de ${poisoned.conditionValue} états Empoisonnés`) + poisoned.delete(); } else - this.script.scriptNotification(`Aucun état Empoisonné`) \ No newline at end of file + this.script.notification(`Aucun état Empoisonné à supprimer.`) \ No newline at end of file diff --git a/scripts/7ZoFUMDG2WJd8RMg.js b/scripts/7ZoFUMDG2WJd8RMg.js index d32f444..dfecb16 100644 --- a/scripts/7ZoFUMDG2WJd8RMg.js +++ b/scripts/7ZoFUMDG2WJd8RMg.js @@ -1 +1 @@ -this.script.scriptMessage(`Revendiquer le Bonus de ${this.effect.name} `); \ No newline at end of file +this.script.message(`Bonus utilisé : ${this.effect.name}`); \ No newline at end of file diff --git a/scripts/7e8FgQUF2oANANmx.js b/scripts/7e8FgQUF2oANANmx.js deleted file mode 100644 index 8f24b0a..0000000 --- a/scripts/7e8FgQUF2oANANmx.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == "Corps à corps (Bagarre)" || args.item?.weaponGroup?.value == "brawling" \ No newline at end of file diff --git a/scripts/7f6OsttTzE7Hvzfk.js b/scripts/7f6OsttTzE7Hvzfk.js index aff4c37..fc12296 100644 --- a/scripts/7f6OsttTzE7Hvzfk.js +++ b/scripts/7f6OsttTzE7Hvzfk.js @@ -1,5 +1,7 @@ -if (this.actor.statuses.has("infighting")) // Only add +10 if already infighting - args.prefillModifiers.modifier += 10; +if (this.actor.statuses.has("infighting") && !args.flags.infighter) +{ + args.fields.modifier += 10; + args.flags.infighter = true; +} - -args.prefillModifiers.successBonus += 1; +args.fields.successBonus += 1; \ No newline at end of file diff --git a/scripts/7n3SEAGRA5ESK8gV.js b/scripts/7n3SEAGRA5ESK8gV.js index f577178..d71fc40 100644 --- a/scripts/7n3SEAGRA5ESK8gV.js +++ b/scripts/7n3SEAGRA5ESK8gV.js @@ -1 +1 @@ -args.options.disarm = true; \ No newline at end of file +args.context.disarm = true; \ No newline at end of file diff --git a/scripts/7szLG4VALuuy1cPm.js b/scripts/7szLG4VALuuy1cPm.js deleted file mode 100644 index 1fbcead..0000000 --- a/scripts/7szLG4VALuuy1cPm.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "easy"}}) -await test.roll(); -if (test.failed) -{ - await this.actor.addCondition("fatigued") -} \ No newline at end of file diff --git a/scripts/7w7QA7GBhzZ98OS0.js b/scripts/7w7QA7GBhzZ98OS0.js index 2227fc2..d910777 100644 --- a/scripts/7w7QA7GBhzZ98OS0.js +++ b/scripts/7w7QA7GBhzZ98OS0.js @@ -1,26 +1,26 @@ const sin = this.effect.sourceActor.system.status.sin.value; const result = await WFRP_Tables.rollTable("manann-mood-made-meaningless", sin); -let match = result.text.match(/b>([^<]+)/i); +let match = result.description.match(/b>([^<]+)/i); let key = match[1]; let roll = new Roll("5d10"); let value = undefined; -await this.script.scriptMessage(result.text, {flavor: result.title}); +await this.script.message(result.description, {flavor: result.title}); switch (key) { - case 'Stromfels Triumphant!': + case 'Triopmhe de Stromfels!': value = 0; break; - case 'Stromfels Ascends!': + case 'Stromfels monte!': await roll.evaluate(); if (this.actor.system.status.mood.value > 0) value = -roll.total; else if (this.actor.system.status.mood.value < 0) value = roll.total; break; - case 'No effect.': + case 'Aucun effet.': break; - case 'Manann Provoked!': + case 'Manann est provoqué!': await roll.evaluate(); value = -roll.total; break; diff --git a/scripts/7wBWUw05q0igh508.js b/scripts/7wBWUw05q0igh508.js index 0c02215..dcfcffa 100644 --- a/scripts/7wBWUw05q0igh508.js +++ b/scripts/7wBWUw05q0igh508.js @@ -1,13 +1,17 @@ -// Imbibing this substance grants the user the Painless Creature Trait. -const hasPainless = this.actor.has("Insensible à la douleur"); -if (hasPainless === undefined) +// Imbibing this substance grants the user the utilisateur d Creature Trait. +const hasutilisateur d = this.actor.has("Insensible à la douleur"); +if (hasutilisateur d === undefined) { let item = await fromUuid("Compendium.wfrp4e-core.items.wMwSRDmgiF2IdCJr"); let data = item.toObject() this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) - - this.script.scriptMessage( - `

${this.actor.prototypeToken.name} gagne le Trait de Creature Insensible à la Douleur. Cet effet dure 1 heure, après quoi il disparait et le total des Blessures encaissés par le buveur sont encaissés d'un coup.

-

Notez que cela n'empêche pas le buveur de recevoir une Blessure Critique ou de mourrir. Cela permet par contre d'éviter la majorité de leur effets.

`, + + this.script.message( + `

${this.actor.prototypeToken.name} a acquis le Trait de Créature Insensible à la douleur. Cet + effet dure une heure, après quoi il se dissipe et l'effet complet + de toutes les blessures du buveur s'abat d'un coup.

+

Notez que cela n'empêche pas l'utilisateur d'acquérir une Blessure Critique + ou d'en mourir. Cela leur permet simplement d'ignorer la plupart + de leurs effets.

`, { whisper: ChatMessage.getWhisperRecipients("GM"), blind: true}) } \ No newline at end of file diff --git a/scripts/7y89OcMmGbjRMgTg.js b/scripts/7y89OcMmGbjRMgTg.js new file mode 100644 index 0000000..c80f57a --- /dev/null +++ b/scripts/7y89OcMmGbjRMgTg.js @@ -0,0 +1,5 @@ +return !this.item.equipped.value + || !args?.skill + || !([game.i18n.localize("NAME.Charm"), + game.i18n.localize("NAME.Intimidate"), + game.i18n.localize("NAME.Leadership")].includes(args.skill.name)) \ No newline at end of file diff --git a/scripts/84IB8CWa55XzoAkv.js b/scripts/84IB8CWa55XzoAkv.js deleted file mode 100644 index a324f4b..0000000 --- a/scripts/84IB8CWa55XzoAkv.js +++ /dev/null @@ -1 +0,0 @@ -return (["Soin aux animaux", "Emprise sur les animaux"].includes(args.item?.name) || args.item?.name.includes("Chevaucher") || args.item?.name.includes("Dressage")) \ No newline at end of file diff --git a/scripts/86ivOsBQAuu0UmFg.js b/scripts/86ivOsBQAuu0UmFg.js deleted file mode 100644 index e440e5a..0000000 --- a/scripts/86ivOsBQAuu0UmFg.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "hard"}, appendTitle : ` - ${this.effect.name}`, skipTargets: true}); -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("poisoned"); -} \ No newline at end of file diff --git a/scripts/873KaarAnJ2qf1r2.js b/scripts/873KaarAnJ2qf1r2.js new file mode 100644 index 0000000..1d74f13 --- /dev/null +++ b/scripts/873KaarAnJ2qf1r2.js @@ -0,0 +1 @@ +args.modifiers.other.push({label : this.effect.name, details : "Augmentation des Dégâts", value : 1}) \ No newline at end of file diff --git a/scripts/8BCzpjFU0GeA17Wp.js b/scripts/8BCzpjFU0GeA17Wp.js new file mode 100644 index 0000000..9368c20 --- /dev/null +++ b/scripts/8BCzpjFU0GeA17Wp.js @@ -0,0 +1 @@ +args.fields.modifier +=20; \ No newline at end of file diff --git a/scripts/8ByuHnUZ4RNTdGVv.js b/scripts/8ByuHnUZ4RNTdGVv.js deleted file mode 100644 index 8952a02..0000000 --- a/scripts/8ByuHnUZ4RNTdGVv.js +++ /dev/null @@ -1,16 +0,0 @@ -let strLoss = Math.ceil(CONFIG.Dice.randomUniform() * 10) -let tghLoss = Math.ceil(CONFIG.Dice.randomUniform() * 10) - -if (!this.actor.has("Mort-vivant") && !this.actor.has("Démoniaque")) -{ - this.actor.setupSkill(game.i18n.localize("NAME.Cool"), { appendTitle: " - " + this.effect.name, fields: { difficulty: "average" }, context: { failure: `Pert de ${strLoss} en Force et ${tghLoss} en Endurance` } }).then(async test => { - await test.roll(); - if (test.failed) { - this.actor.update({ "system.characteristics.s.initial": this.actor.system.characteristics.s.initial - strLoss, "system.characteristics.t.initial": this.actor.system.characteristics.t.initial - tghLoss }) - } - }) - -} -else { - this.script.scriptNotification(`${this.actor.name} est immunisé à ${this.effect.name}`) -} diff --git a/scripts/8GyJgdHVBaLrHCY8.js b/scripts/8GyJgdHVBaLrHCY8.js index 56adde3..4a88ecb 100644 --- a/scripts/8GyJgdHVBaLrHCY8.js +++ b/scripts/8GyJgdHVBaLrHCY8.js @@ -1,17 +1,17 @@ let type = this.item.getFlag("wfrp4e", "breath") let types = { - none : "Aucun", + none : "None", cold : "Froid", corrosion : "Corrosion", fire : "Feu", - electricity : "Electricité", + electricity : "Électricité", poison : "Poison", smoke : "Fumée", various : "Divers" } if (!type) { - type = (await ItemDialog.create(ItemDialog.objectToArray(types, this.item.img), 1, "Choisir le Souffle"))[0]?.id; + type = (await ItemDialog.create(ItemDialog.objectToArray(types, this.item.img), 1, "Choisir Souffle"))[0]?.id; this.item.updateSource({"flags.wfrp4e.breath" : type}) } diff --git a/scripts/8N3Uqjq1ZxPxo4pk.js b/scripts/8N3Uqjq1ZxPxo4pk.js deleted file mode 100644 index 43dddd4..0000000 --- a/scripts/8N3Uqjq1ZxPxo4pk.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name?.includes(game.i18n.localize("NAME.Lore")) \ No newline at end of file diff --git a/scripts/8R7O63iC0yANtkJ9.js b/scripts/8R7O63iC0yANtkJ9.js new file mode 100644 index 0000000..cf78a0e --- /dev/null +++ b/scripts/8R7O63iC0yANtkJ9.js @@ -0,0 +1,5 @@ +if (this.item.equipped.value && this.actor.hasCondition("ablaze")) +{ + await this.actor.removeCondition("ablaze") + this.script.notification(`Ne peut recevoir un état En Flammes`,"info"); +} \ No newline at end of file diff --git a/scripts/8RNziYGGb4sp3BGQ.js b/scripts/8RNziYGGb4sp3BGQ.js deleted file mode 100644 index b853c6b..0000000 --- a/scripts/8RNziYGGb4sp3BGQ.js +++ /dev/null @@ -1,5 +0,0 @@ -if (!args.test.weapon?.name.includes("Drakefire")) -{ - args.test.result.misfire = game.i18n.localize("Misfire"); - args.test.result.misfireDamage = (0, eval)(parseInt(args.test.result.roll.toString().split('').pop()) + args.test.weapon.system.Damage); -} \ No newline at end of file diff --git a/scripts/8TRiAJ8thIKE4IoL.js b/scripts/8TRiAJ8thIKE4IoL.js index 3814c2c..08313b3 100644 --- a/scripts/8TRiAJ8thIKE4IoL.js +++ b/scripts/8TRiAJ8thIKE4IoL.js @@ -1,5 +1,5 @@ -let SL = Number(getProperty(this.item, "flags.wfrp4e.sourceTest.result.SL") || 1) +let SL = Number(foundry.utils.getProperty(this.item, "flags.wfrp4e.sourceTest.result.SL") || 1) args.actor.characteristics.i.modifier += 10 * SL args.actor.characteristics.ag.modifier += 10 * SL \ No newline at end of file diff --git a/scripts/8ZAUBSH9CM9OTpTL.js b/scripts/8ZAUBSH9CM9OTpTL.js deleted file mode 100644 index eb0439d..0000000 --- a/scripts/8ZAUBSH9CM9OTpTL.js +++ /dev/null @@ -1,11 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Perception"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "easy"}}); -await test.roll(); - -if (test.succeeded) -{ - this.actor.addCondition("stunned") -} -else if (test.failed) -{ - this.actor.addCondition("poisoned", 2); -} \ No newline at end of file diff --git a/scripts/8araLuwmBq8GKEw3.js b/scripts/8araLuwmBq8GKEw3.js index ff0d686..0f181e1 100644 --- a/scripts/8araLuwmBq8GKEw3.js +++ b/scripts/8araLuwmBq8GKEw3.js @@ -3,5 +3,5 @@ let APIgnored = args.AP.layers.reduce((prev, current) => prev + ((current.weakpo if (APIgnored) { args.modifiers.ap.ignored += APIgnored - args.modifiers.ap.details.push(`${this.effect.name}: Ignorer les PA avec des Points Faibles (${APIgnored})`) + args.modifiers.ap.details.push(`${this.effect.name}: Ignore les PA avec des points faibles (${APIgnored})`) } \ No newline at end of file diff --git a/scripts/8pbVGsVFlDebu2Ac.js b/scripts/8pbVGsVFlDebu2Ac.js new file mode 100644 index 0000000..e401526 --- /dev/null +++ b/scripts/8pbVGsVFlDebu2Ac.js @@ -0,0 +1 @@ +args.wounds += 2; \ No newline at end of file diff --git a/scripts/8qOGotfGFA0HYQ6W.js b/scripts/8qOGotfGFA0HYQ6W.js new file mode 100644 index 0000000..f974ec7 --- /dev/null +++ b/scripts/8qOGotfGFA0HYQ6W.js @@ -0,0 +1,7 @@ +let resistances = this.actor.itemTags.talent.filter(i => i.name == game.i18n.localize("NAME.MagicResistanceTalent")); + +for(let talent of resistances) +{ + talent.system.max.value = "custom"; + talent.system.max.formula = "@characteristics.t.bonus + 2" +} \ No newline at end of file diff --git a/scripts/8rq4GL5d5nCn4kO7.js b/scripts/8rq4GL5d5nCn4kO7.js index c94cb1c..5a58ec9 100644 --- a/scripts/8rq4GL5d5nCn4kO7.js +++ b/scripts/8rq4GL5d5nCn4kO7.js @@ -3,5 +3,5 @@ if (caster) { let healed= caster.characteristics.wp.bonus this.actor.modifyWounds(healed); - this.script.scriptMessage(`${this.actor.prototypeToken.name} regagne ${healed} Blessures`) + this.script.message(`${this.actor.prototypeToken.name} regagne ${healed} Blessures`) } \ No newline at end of file diff --git a/scripts/8tyMXDfHR8AJBdDu.js b/scripts/8tyMXDfHR8AJBdDu.js index 8ba19d6..24d0f1d 100644 --- a/scripts/8tyMXDfHR8AJBdDu.js +++ b/scripts/8tyMXDfHR8AJBdDu.js @@ -3,5 +3,5 @@ let weakpointsAP = args.AP.layers.filter(i => !i.ignored && i.weakpoints).reduce if (weakpointsAP > 0) { args.modifiers.ap.ignored += weakpointsAP; - args.modifiers.ap.details.push(`${this.effect.name} - Ignore les Points Faibles (${weakpointsAP})`); + args.modifiers.ap.details.push(`${this.effect.name} - Ignore les points faibles (${weakpointsAP})`); } \ No newline at end of file diff --git a/scripts/8xqYrBIf1Zhlwizg.js b/scripts/8xqYrBIf1Zhlwizg.js index fd50370..4c84f0e 100644 --- a/scripts/8xqYrBIf1Zhlwizg.js +++ b/scripts/8xqYrBIf1Zhlwizg.js @@ -1,4 +1,4 @@ -const repaired_message = `

Finished raisint the anchor.

`; +const repaired_message = `

Ancre terminée.

`; const test = 'Strength'; const difficulty = 'vhard'; const target = 20; @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/8zTkDVziBPaNbMQX.js b/scripts/8zTkDVziBPaNbMQX.js index fdd905a..7bd8205 100644 --- a/scripts/8zTkDVziBPaNbMQX.js +++ b/scripts/8zTkDVziBPaNbMQX.js @@ -9,7 +9,7 @@ let filters = [ } ] -let petty = await ItemDialog.createFromFilters(filters, 6, "Choisissez 6 Sorts de Magie Mineure") +let petty = await ItemDialog.createFromFilters(filters, 6, {text : "Choisissez 6 Sorts Mineurs"}) filters = [ @@ -23,7 +23,7 @@ filters = [ } ] -let arcane = await ItemDialog.createFromFilters(filters, 9, "Choisissez 9 Sorts de Magie d'Arcane") +let arcane = await ItemDialog.createFromFilters(filters, 9, {text : "Choisissez 9 Sorts d'Arcane"}) let items = petty.concat(arcane).map(i => i.toObject()) diff --git a/scripts/96Y1yIH1lRjTs5hL.js b/scripts/96Y1yIH1lRjTs5hL.js index 1fab3ce..55282ad 100644 --- a/scripts/96Y1yIH1lRjTs5hL.js +++ b/scripts/96Y1yIH1lRjTs5hL.js @@ -1,5 +1,4 @@ -if (args.test.succeeded) - return - -if (args.test.characteristicKey == "wp") - this.actor.addCondition("broken") \ No newline at end of file +if (args.test.failed && args.test.characteristicKey == "wp") +{ + this.actor.addCondition("broken") +} \ No newline at end of file diff --git a/scripts/98nKfcimlaPeM9h5.js b/scripts/98nKfcimlaPeM9h5.js index dde67fd..230dea9 100644 --- a/scripts/98nKfcimlaPeM9h5.js +++ b/scripts/98nKfcimlaPeM9h5.js @@ -1,2 +1,2 @@ await this.actor.addCondition("bleeding") -await this.script.scriptMessage(await this.actor.applyBasicDamage(10, {suppressMsg : true})); \ No newline at end of file +await this.script.message(await this.actor.applyBasicDamage(10, {suppressMsg : true})); \ No newline at end of file diff --git a/scripts/9A7rYY3FKi5XLihG.js b/scripts/9A7rYY3FKi5XLihG.js index 4977a44..cd0c830 100644 --- a/scripts/9A7rYY3FKi5XLihG.js +++ b/scripts/9A7rYY3FKi5XLihG.js @@ -1,6 +1,6 @@ fromUuid("Compendium.wfrp4e-core.items.5QcrpLQWWrsbKR79").then(item => { let data = item.toObject(); data.system.tests.value = data.system.tests.value.replace("coins", "metal objects"); - data.system.description.value += "

Ce Talent s'applique également à tout objet métallique à cause de l'Affinité Metallique

" + data.system.description.value += "

Ce talent s'applique à tout objet métallique en raison de Affinité Métallique

" this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) }) \ No newline at end of file diff --git a/scripts/9AMoFRATTAfdKlKN.js b/scripts/9AMoFRATTAfdKlKN.js new file mode 100644 index 0000000..2c5ec60 --- /dev/null +++ b/scripts/9AMoFRATTAfdKlKN.js @@ -0,0 +1,16 @@ +const test = await args.actor.setupSkill(game.i18n.localize("NAME.Résistance"), { + skipTargets: true, + appendTitle: ` — ${this.effect.name}`, + fields: {difficulty: "challenging"}, + context: { + failure: `Gain de 1 état @Condition[Poisoned].` + } +}); + +await Test.roll(); + +if (Test.Échoué) { + args.actor.addCondition("poisoned"); + const speaker = ChatMessage.getSpeaker({actor: args.actor}); + this.script.message(`

${speaker.alias} a reçu 1 état @Condition[Poisoned] de Venin d'Araignée.

Les victimes réduites à 0 blessures et qui souffrent d'un état @Condition[Poisoned] de ces flèches deviennent @Condition[Unconcious], mais ne risquent pas la mort à cause des états @Condition[Poisoned] restants comme ce serait normalement le cas.

`); +} \ No newline at end of file diff --git a/scripts/9EVj4bmZJex45Mt7.js b/scripts/9EVj4bmZJex45Mt7.js deleted file mode 100644 index a17d972..0000000 --- a/scripts/9EVj4bmZJex45Mt7.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Athletics"); \ No newline at end of file diff --git a/scripts/9JnPK1jNUEso7Pv8.js b/scripts/9JnPK1jNUEso7Pv8.js deleted file mode 100644 index db4cfc0..0000000 --- a/scripts/9JnPK1jNUEso7Pv8.js +++ /dev/null @@ -1,4 +0,0 @@ -let item = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS") -let data = item.toObject(); -data.name += ` (Odorat)` -this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/9RFoasDcFnYZ1txR.js b/scripts/9RFoasDcFnYZ1txR.js deleted file mode 100644 index 8a60a20..0000000 --- a/scripts/9RFoasDcFnYZ1txR.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Perception"); \ No newline at end of file diff --git a/scripts/9VfeubiCV83LN9iY.js b/scripts/9VfeubiCV83LN9iY.js index b48a14a..ad175b1 100644 --- a/scripts/9VfeubiCV83LN9iY.js +++ b/scripts/9VfeubiCV83LN9iY.js @@ -1,4 +1,4 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.AtpAudHA4ybXVlWM") let data = item.toObject(); -data.name += ` (Si Charge)` +data.name += ` (En charge)` this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/9WZa63lr0K3SsP4G.js b/scripts/9WZa63lr0K3SsP4G.js index cf89e60..6c6143e 100644 --- a/scripts/9WZa63lr0K3SsP4G.js +++ b/scripts/9WZa63lr0K3SsP4G.js @@ -3,5 +3,5 @@ let sourceItem = this.effect.sourceItem; if (sourceItem) { this.actor.applyEffect({effectUuids : [sourceItem.effects.contents[2].uuid]}) - this.script.scriptNotification("Applique après les effets"); + this.script.notification("Effets secondaires appliqués"); } \ No newline at end of file diff --git a/scripts/9Yn9uViEjcuaESJ2.js b/scripts/9Yn9uViEjcuaESJ2.js index b09b963..f964391 100644 --- a/scripts/9Yn9uViEjcuaESJ2.js +++ b/scripts/9Yn9uViEjcuaESJ2.js @@ -1,6 +1,6 @@ if (this.item.getFlag("wfrp4e", "failedCool")) { - this.item.name += " (Aucun PA)" + this.item.name += " (No AP)" this.item.system.AP = { "head": 0, "lArm": 0, diff --git a/scripts/9eL5JbQQmCY030ba.js b/scripts/9eL5JbQQmCY030ba.js new file mode 100644 index 0000000..1cd6858 --- /dev/null +++ b/scripts/9eL5JbQQmCY030ba.js @@ -0,0 +1 @@ +this.actor.addCondition("poisoned"); \ No newline at end of file diff --git a/scripts/9fK07tqqZyPg7dpx.js b/scripts/9fK07tqqZyPg7dpx.js deleted file mode 100644 index 1613f20..0000000 --- a/scripts/9fK07tqqZyPg7dpx.js +++ /dev/null @@ -1,12 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty: "veasy"}}) -await test.roll(); -if (test.failed) -{ - this.script.scriptNotification("Subi une Blessure Purulente") - let item = await fromUuid("Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb") - this.actor.createEmbeddedDocuments("Item", [item.toObject()]) -} -else -{ - this.script.scriptNotification("Evite une Blessure Purulente") -} diff --git a/scripts/9fNHye2N2DORR0A3.js b/scripts/9fNHye2N2DORR0A3.js new file mode 100644 index 0000000..821cb0f --- /dev/null +++ b/scripts/9fNHye2N2DORR0A3.js @@ -0,0 +1 @@ +return !args.item.name.includes("Arme") \ No newline at end of file diff --git a/scripts/A0OK0qAMmnf8iNJf.js b/scripts/A0OK0qAMmnf8iNJf.js index 2f137f4..14283ca 100644 --- a/scripts/A0OK0qAMmnf8iNJf.js +++ b/scripts/A0OK0qAMmnf8iNJf.js @@ -1,7 +1,7 @@ if (args.test.result.SL < 0) { - this.script.scriptMessage(`Reçoit ${Math.abs(args.test.result.SL)} Points de Corruption`, {whisper : ChatMessage.getWhisperRecipients("GM")}) - if (args.test.failed && this.actor.type == "character") + this.script.message(`Gain de ${Math.abs(args.test.result.SL)} Points de Corruption`, {whisper : ChatMessage.getWhisperRecipients("GM")}) + if (args.Test.Échoué && this.actor.type == "character") { this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + Math.abs(args.test.result.SL)}) } diff --git a/scripts/A1odAcuRbq9797ZB.js b/scripts/A1odAcuRbq9797ZB.js index c26eb0e..9ed7577 100644 --- a/scripts/A1odAcuRbq9797ZB.js +++ b/scripts/A1odAcuRbq9797ZB.js @@ -1,7 +1,7 @@ let choice1 = [ { type : "skill", - name : "Melee (Basic)", + name : "Mêlée (Base)", diff : { system : { advances : { @@ -14,7 +14,7 @@ let choice1 = [ let choice2 = [ { type : "skill", - name : "Melee (Polearm)", + name : "Mêlée (arme d'hast)", diff : { system : { advances : { @@ -25,38 +25,40 @@ let choice2 = [ } ] -let choice = await Dialog.wait({ - title : "Choice", - content : +let choice = await foundry.applications.api.DialogV2.wait({ + window : { + title : "Choix" + }, + content : `

- Select your choice + Sélectionnez votre choix

    -
  1. Melee (Basic)
  2. -
  3. Melee (Polearm)
  4. -
+
  • Mêlée (Base)
  • +
  • Mêlée (arme d'hast)
  • + `, - buttons : { - 1 : { - label : "Basic", + buttons : [ + { + label : "Base", callback : () => { return choice1; } }, - 2 : { - label : "Polearm", + { + label : "Arme d'hast", callback : () => { return choice2; } } - } + ] }) let updateObj = this.actor.toObject(); let items = [] for (let c of choice) { - let existing + let existing if (c.type == "skill") { existing = updateObj.items.find(i => i.name == c.name && i.type == c.type) diff --git a/scripts/A3XrFB7SvV2vcg1a.js b/scripts/A3XrFB7SvV2vcg1a.js new file mode 100644 index 0000000..074c22d --- /dev/null +++ b/scripts/A3XrFB7SvV2vcg1a.js @@ -0,0 +1,4 @@ +if (args.applyAP) +{ + args.applyAP = false; +} \ No newline at end of file diff --git a/scripts/A3fvV69RS1lYgma0.js b/scripts/A3fvV69RS1lYgma0.js deleted file mode 100644 index 73c68ae..0000000 --- a/scripts/A3fvV69RS1lYgma0.js +++ /dev/null @@ -1,15 +0,0 @@ -if (this.actor.type == "character") - this.actor.corruptionDialog("minor") - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : " - " + this.effect.name}) -await test.roll(); -if(test.failed) -{ - await this.actor.addCondition("unconscious"); - let secondTest = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : "easy"}, skipTargets: true, appendTitle : " - Despair"}) - await secondTest.roll(); - if(secondTest.failed) - { - await this.actor.addCondition("fatigued"); - } -} \ No newline at end of file diff --git a/scripts/A6DcKPzAGntzSCil.js b/scripts/A6DcKPzAGntzSCil.js index e061eac..3c057d9 100644 --- a/scripts/A6DcKPzAGntzSCil.js +++ b/scripts/A6DcKPzAGntzSCil.js @@ -1,5 +1,5 @@ let roll = await new Roll("1d10").roll() -roll.toMessage(this.script.getChatData({flavor : `${this.effect.name} (Durée)`})); +roll.toMessage(this.script.getChatData({flavor : `Lâche ${dropped.map(i => i.name).join(", ")}!`})); -this.effect.updateSource({"duration.rounds" : roll.total}) \ No newline at end of file +this.effet.updateSource({"duration.rounds" : roll.total}) \ No newline at end of file diff --git a/scripts/ACgKpKrEEHoNGG0h.js b/scripts/ACgKpKrEEHoNGG0h.js deleted file mode 100644 index ba1d9d6..0000000 --- a/scripts/ACgKpKrEEHoNGG0h.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes("Focalisation") && args.type != "channelling" \ No newline at end of file diff --git a/scripts/ACtDCTLZXmd5uXjX.js b/scripts/ACtDCTLZXmd5uXjX.js index 903591c..0cb3fd8 100644 --- a/scripts/ACtDCTLZXmd5uXjX.js +++ b/scripts/ACtDCTLZXmd5uXjX.js @@ -1,7 +1,7 @@ let halve; if (args.opposedTest.attackerTest.item?.type != "spell") { - halve = await Dialog.confirm({title : this.effect.name, content : "Diviser les dommages? (Divise par 2 tout les dommages autre que ceux causés par le feu, le froid et magiques)"}) + halve = await foundry.applications.api.DialogV2.confirm({window : {title : this.effect.name}, content : "Diviser les dégâts par deux ? (Divise tous les dégâts sauf le feu, le froid et la magie)"}) } else { @@ -11,5 +11,5 @@ else if (halve) { args.totalWoundLoss /= 2; - args.modifiers.other.push({label : this.effect.name, details : "Divisé par 2", value : "× 0.5"}) + args.modifiers.other.push({label : this.effect.name, details : "Divisé par deux", value : "× 0.5"}) } \ No newline at end of file diff --git a/scripts/AGD7zCyV4zruvnWu.js b/scripts/AGD7zCyV4zruvnWu.js index f55bee5..f7eb0f9 100644 --- a/scripts/AGD7zCyV4zruvnWu.js +++ b/scripts/AGD7zCyV4zruvnWu.js @@ -1 +1 @@ -return args.type != "cast" || !["mort", "nécromancie", "vie", "lumière", "cieux"].includes(args.spell?.system.lore.value) \ No newline at end of file +return args.type != "cast" || !["death", "necromancy", "life", "light", "heavens"].includes(args.spell?.system.lore.value) \ No newline at end of file diff --git a/scripts/AHZ8f7dfN8jNsYk6.js b/scripts/AHZ8f7dfN8jNsYk6.js deleted file mode 100644 index 80ece08..0000000 --- a/scripts/AHZ8f7dfN8jNsYk6.js +++ /dev/null @@ -1,22 +0,0 @@ -let token = this.actor.getActiveTokens()[0]; -let target = args.data.targets[0]; -let weapon = args.weapon; - -if(!target || !token) -{ - return; -} - -let distance = canvas.grid.measureDistances([{ ray: new Ray({ x: token.center.x, y: token.center.y }, { x: target.center.x, y: target.center.y }) }], { gridSpaces: true })[0] -let currentBand - -for (let band in weapon.range.bands) -{ - if (distance >= weapon.range.bands[band].range[0] && distance <= weapon.range.bands[band].range[1]) - { - currentBand = band; - break; - } -} - -return [game.i18n.localize("Long Range"), game.i18n.localize("Extreme")].includes(currentBand) \ No newline at end of file diff --git a/scripts/AI7iVbQMPzXMP5on.js b/scripts/AI7iVbQMPzXMP5on.js new file mode 100644 index 0000000..d1a3693 --- /dev/null +++ b/scripts/AI7iVbQMPzXMP5on.js @@ -0,0 +1,11 @@ +const hours = new Roll("2d10"); +await hours.toMessage({flavor: this.effect.name + " (heures)"}); + +const bonus = new Roll("2d10"); +await bonus.toMessage({flavor: this.effect.name + " (heures)"}); + + +await this.effect.update({ + "duration.seconds": hours.total * 3600 +}); +await this.effect.setFlag("wfrp4e-tribes", "bonus", bonus.total); \ No newline at end of file diff --git a/scripts/ALuPRzf85dmkEfLo.js b/scripts/ALuPRzf85dmkEfLo.js deleted file mode 100644 index b624bba..0000000 --- a/scripts/ALuPRzf85dmkEfLo.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Intuition"); \ No newline at end of file diff --git a/scripts/AMI2wDJqsIZsoq1e.js b/scripts/AMI2wDJqsIZsoq1e.js index f826c60..57e2597 100644 --- a/scripts/AMI2wDJqsIZsoq1e.js +++ b/scripts/AMI2wDJqsIZsoq1e.js @@ -1,4 +1,4 @@ if (args.opposedTest.result.differenceSL >= 0 && args.opposedTest.result.differenceSL <= 2 && args.opposedTest.result.winner == "attacker") { - this.script.scriptMessage(`Émet un nuage de poudre noire nauséabonde. Active l'effet Fellowship Penalty sur @UUID[${this.actor.uuid}].`, {blind : true, whisper : ChatMessage.getWhisperRecipients("GM")}) + this.script.message(`Emits a cloud of foul-smelling blackpowder. Enable the Fellowship Penalty Active Effect on @UUID[${this.actor.uuid}].`, {blind : true, whisper : ChatMessage.getWhisperRecipients("GM")}) } \ No newline at end of file diff --git a/scripts/AMxezwtYnWCF6Oza.js b/scripts/AMxezwtYnWCF6Oza.js deleted file mode 100644 index 5fad3df..0000000 --- a/scripts/AMxezwtYnWCF6Oza.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == "Projectiles (Poudre noire)" \ No newline at end of file diff --git a/scripts/AV2Kj6jgmIc45zKi.js b/scripts/AV2Kj6jgmIc45zKi.js deleted file mode 100644 index 77024fc..0000000 --- a/scripts/AV2Kj6jgmIc45zKi.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Stealth")); \ No newline at end of file diff --git a/scripts/AYEiCx2Es3QtMY28.js b/scripts/AYEiCx2Es3QtMY28.js new file mode 100644 index 0000000..3842a95 --- /dev/null +++ b/scripts/AYEiCx2Es3QtMY28.js @@ -0,0 +1,55 @@ +let choice1 = [ + { + type: "trait", + name: "Bestial", + }, + { + type: "trait", + name: "Regeneration", + }, + { + type: "trait", + name: "Taille (Large)", + }, + { + type: "trait", + name: "Territorial", + } +] + +let updateObj; +let actor; + +async function addTrait(c) { + let items = []; + let existing; + if (c.type == "trait") { + existing = updateObj.items.find(i => i.name == c.name && i.type == c.type); + } + if (!existing) { + let item = await game.wfrp4e.utility.find(c.name, c.type); + if (item) { + item = item.toObject(); + items.push(item); + } + else + ui.notifications.warn(`Impossible de trouver ${c}`, { permanent: true }); + } + console.log("WISH LIST2", choice1, items); + actor.createEmbeddedDocuments("Item", items); +} + +async function dialogChoice() { + for (let c of choice1) + { + if (await foundry.applications.api.DialogV2.confirm({window : {title: "Option"}, content:`

    Add Option?

    1. ${c.name}
    `})) + { + addTrait(c) + c.valid = true; + } + } +} + +updateObj = this.actor.toObject(); +actor = this.actor +await dialogChoice(); diff --git a/scripts/Adgs6Zs0FdefO6qx.js b/scripts/Adgs6Zs0FdefO6qx.js index 210f054..dd41f6a 100644 --- a/scripts/Adgs6Zs0FdefO6qx.js +++ b/scripts/Adgs6Zs0FdefO6qx.js @@ -1,5 +1,5 @@ if (args.test.options.pilot && args.test.result.reversed) { args.test.data.result.SL = "+" + Math.min(1, Number(args.test.data.result.SL)) - args.test.result.other.push(`${this.effect.name}: DR limité à 1`) + args.test.result.other.push(`${this.effect.name}: SL limited to 1`) } \ No newline at end of file diff --git a/scripts/Ah2wyywkL8hjJNXM.js b/scripts/Ah2wyywkL8hjJNXM.js index 887ba7c..ccff451 100644 --- a/scripts/Ah2wyywkL8hjJNXM.js +++ b/scripts/Ah2wyywkL8hjJNXM.js @@ -1 +1 @@ -args.options.healWounds = true; \ No newline at end of file +args.context.healWounds = true; \ No newline at end of file diff --git a/scripts/ApaLcUhuty3EzJoP.js b/scripts/ApaLcUhuty3EzJoP.js index ba42e39..107d645 100644 --- a/scripts/ApaLcUhuty3EzJoP.js +++ b/scripts/ApaLcUhuty3EzJoP.js @@ -3,4 +3,4 @@ let current = this.actor.status.fortune.value this.actor.update({"system.status.fortune.value" : fortunePoints + current}) -this.script.scriptMessage(`${this.actor.prototypeToken.name} voit ses points de Destin augmentés de ${current} à ${fortunePoints + current}`) \ No newline at end of file +this.script.message(`${this.actor.prototypeToken.name} fortune points increased from ${current} to ${fortunePoints + current}`) \ No newline at end of file diff --git a/scripts/AqHLHp4kH6KULk3e.js b/scripts/AqHLHp4kH6KULk3e.js index 16b9c43..fdac29c 100644 --- a/scripts/AqHLHp4kH6KULk3e.js +++ b/scripts/AqHLHp4kH6KULk3e.js @@ -3,10 +3,10 @@ if (this.item.system.quantity.value) this.item.system.reduceQuantity(); let actor = Array.from(game.user.targets)[0]?.actor || this.actor; let effectData = this.item.effects.contents[0].convertToApplied(); - effectData.flags.wfrp4e.sourceItem = this.item.uuid + effectData.system.sourceData.item = this.item.uuid actor.applyEffect({effectData : [effectData]}) } else { - this.script.scriptNotification("Aucun disponible!", "error") + this.script.notification("Plus rien !", "error") } \ No newline at end of file diff --git a/scripts/AvRbjpBfTX3mn3bz.js b/scripts/AvRbjpBfTX3mn3bz.js new file mode 100644 index 0000000..8a6e0fe --- /dev/null +++ b/scripts/AvRbjpBfTX3mn3bz.js @@ -0,0 +1,11 @@ +if (this.actor.effects.contents.filter(e => e.name === "Liquid Fortification").length === 0) { + let effectData = this.item.effects.contents[0].convertToApplied(); + effectData.duration.seconds = 3600 + this.actor.applyEffect({effectData : [effectData]}); + this.script.notification("Durée de l'effet Liquid Fortification réglée à 1 heure."); +} +else { + let effect = this.actor.effects.contents.filter(e => e.name === "Liquid Fortification")[0]; + effect.update({duration: {seconds: 3600}}); + this.script.notification("Durée de l'effet Liquid Fortification réinitialisée à 1 heure."); +} \ No newline at end of file diff --git a/scripts/AyNb5sj6FD2Z3Q5T.js b/scripts/AyNb5sj6FD2Z3Q5T.js index 2d4490d..14a16c3 100644 --- a/scripts/AyNb5sj6FD2Z3Q5T.js +++ b/scripts/AyNb5sj6FD2Z3Q5T.js @@ -1,3 +1,3 @@ this.actor.addCondition("dead") this.actor.setWounds(0); -this.script.scriptMessage(await game.wfrp4e.tables.formatChatRoll("scatter")) \ No newline at end of file +this.script.message(await game.wfrp4e.tables.formatChatRoll("scatter")) \ No newline at end of file diff --git a/scripts/B6ZbY3bxTPg6nCng.js b/scripts/B6ZbY3bxTPg6nCng.js deleted file mode 100644 index 82df2d2..0000000 --- a/scripts/B6ZbY3bxTPg6nCng.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Bribery"); \ No newline at end of file diff --git a/scripts/B950b0XnIUYCdVwu.js b/scripts/B950b0XnIUYCdVwu.js deleted file mode 100644 index 8a61d3b..0000000 --- a/scripts/B950b0XnIUYCdVwu.js +++ /dev/null @@ -1,11 +0,0 @@ -let test = await args.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : " - " + this.effect.name}) -await test.roll(); - -if (test.succeeded) -{ - if (args.totalWoundLoss <= parseInt(test.result.SL)) - { - args.abort = `${this.effect.name}: Attaque détournée et renvoyée` - } - args.modifiers.other.push({label : this.effect.name, value : -1 * parseInt(test.result.SL)}) -} \ No newline at end of file diff --git a/scripts/BAOv7moTxsKlT3JS.js b/scripts/BAOv7moTxsKlT3JS.js deleted file mode 100644 index 7adeacf..0000000 --- a/scripts/BAOv7moTxsKlT3JS.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : "easy"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("broken") -} \ No newline at end of file diff --git a/scripts/BD7bVTU2pVoRSRBe.js b/scripts/BD7bVTU2pVoRSRBe.js index b436fd6..74c79fb 100644 --- a/scripts/BD7bVTU2pVoRSRBe.js +++ b/scripts/BD7bVTU2pVoRSRBe.js @@ -1,15 +1,15 @@ let symptoms = { convulsions : "Convulsions", - coughsandsneezes : "Coughs and Sneezes", - fever : "Fever", - flux : "Flux", + coughsandsneezes : "Toux et Éternuements", + fever : "Fièvre", + flux : "FMalaiselux", nausea : "Nausée" } let roll = await (new Roll(`max(0, 1d10 - ${this.actor.characteristics.wp.bonus})`).roll()) roll.toMessage(this.script.getChatData()); -let choices = await ItemDialog.create(ItemDialog.objectToArray(symptoms), roll.total, "Choisissez les Symptomes"); +let choices = await ItemDialog.create(ItemDialog.objectToArray(symptoms), roll.total, "Choisir Symptômes"); if (choices.length) { @@ -23,8 +23,7 @@ if (choices.length) } this.actor.createEmbeddedDocuments("ActiveEffect", added) } -else +else { this.effect.delete(); } - diff --git a/scripts/BEEvU2hE5ymcNOH9.js b/scripts/BEEvU2hE5ymcNOH9.js new file mode 100644 index 0000000..f8afa88 --- /dev/null +++ b/scripts/BEEvU2hE5ymcNOH9.js @@ -0,0 +1,6 @@ +let fatigued = this.actor.hasCondition("fatigued") + if (!fatigued) + { + this.actor.addCondition("fatigued") + ui.notifications.notify("Etat Exténué ajouté à " + this.actor.name + " qui est impossible à retirer tant que le symptôme de Malaise est présent.") + } \ No newline at end of file diff --git a/scripts/BHbFqhJPzZI2txLs.js b/scripts/BHbFqhJPzZI2txLs.js index 5107a0c..abf139c 100644 --- a/scripts/BHbFqhJPzZI2txLs.js +++ b/scripts/BHbFqhJPzZI2txLs.js @@ -1,9 +1,8 @@ let lore = this.effect.name.split("(")[1].split(")")[0].toLowerCase(); -let spellLore = game.wfrp4e.config.magicLores[args.spell.system.lore.value].toLowerCase(); // If channelling corresponding lore -if (args.type == "channelling" && spellLore == lore) +if (args.type == "channelling" && args.spell.system.lore.value == lore) args.prefillModifiers.slBonus += 2 // If channelling or casting different lore -else if (spellLore != lore && args.spell.system.lore.value != "petty") +else if (args.spell.system.lore.value != lore && args.spell.system.lore.value != "petty") args.prefillModifiers.slBonus -= 1 \ No newline at end of file diff --git a/scripts/BNJRV66jlrp51qZK.js b/scripts/BNJRV66jlrp51qZK.js deleted file mode 100644 index e0fe8a0..0000000 --- a/scripts/BNJRV66jlrp51qZK.js +++ /dev/null @@ -1,2 +0,0 @@ -args.abort = true; -this.script.notification(game.i18n.localize("SCRIPT.Sightstep")); \ No newline at end of file diff --git a/scripts/BVNKF9omCppWPLys.js b/scripts/BVNKF9omCppWPLys.js index 42c557a..553a241 100644 --- a/scripts/BVNKF9omCppWPLys.js +++ b/scripts/BVNKF9omCppWPLys.js @@ -1,28 +1,28 @@ let actor = game.user.character ?? canvas.tokens.controlled[0]?.actor; if (!actor || !(actor.system instanceof StandardActorModel)) - return ui.notifications.warn("You must control an Actor capable of performing a Strength Test"); + return ui.notifications.warn("Vous devez contrôler un acteur capable d'effectuer un test de Force"); let test = await actor.setupCharacteristic("s", { - skipTargets: true, - appendTitle: " - Bailing Out", + skipTargets: true, + appendTitle: " - Évacuation", fields: { difficulty: "challenging" }, context: { - success: "Reduced the Holed rating!" + success: "Réduction du niveau de Perforation !" } }); -await test.roll(); -if (test.succeeded) { - let SL = parseInt(test.result.SL); - let name = this.effect.name.replace(/\d+/, rating => parseInt(rating) - SL); - await this.effect.update({name}); +await Test.roll(); +if (Test.succeeded) { + let SL = parseInt(Test.result.SL); + let name = this.effet.name.replace(/\d+/, rating => parseInt(rating) - SL); + await this.effet.update({name}); } -let rating = parseInt(this.effect.name.match(/\d+/)?.[0]); +let rating = parseInt(this.effet.name.match(/\d+/)?.[0]); if (rating <= 1) { - const scriptData = this.effect.system.scriptData + const scriptData = this.effet.system.scriptData scriptData[2].trigger = ''; - await this.effect.update({disabled: true, "system.scriptData": scriptData}); + await this.effet.update({disabled: true, "system.scriptData": scriptData}); } \ No newline at end of file diff --git a/scripts/BY4feKp244bQOWlB.js b/scripts/BY4feKp244bQOWlB.js new file mode 100644 index 0000000..0fa1dc5 --- /dev/null +++ b/scripts/BY4feKp244bQOWlB.js @@ -0,0 +1 @@ +args.test.result.canDualWield = true; \ No newline at end of file diff --git a/scripts/Bj6bxItlgtI2sXVN.js b/scripts/Bj6bxItlgtI2sXVN.js index 65b1b9e..de6bc08 100644 --- a/scripts/Bj6bxItlgtI2sXVN.js +++ b/scripts/Bj6bxItlgtI2sXVN.js @@ -1,4 +1,4 @@ -let roll = await new Roll("1d10").roll(); +let roll = await new Roll("1d10").roll({allowInteractive : false}); roll.toMessage(this.script.getChatData()); args.totalWoundLoss = Math.max(0, args.totalWoundLoss - roll.total) args.modifiers.other.push({label: this.effect.name, value : -1 * roll.total}) diff --git a/scripts/BtyFhdGMKiMamGhM.js b/scripts/BtyFhdGMKiMamGhM.js deleted file mode 100644 index 9f4b6b1..0000000 --- a/scripts/BtyFhdGMKiMamGhM.js +++ /dev/null @@ -1,15 +0,0 @@ -let test = await args.actor.setupSkill("Esquive", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -let damage = parseInt(this.effect.sourceTest.result.SL) - -if (test.succeded) -{ - damage = damage + 8 - parseInt(test.result.SL) -} - -else -{ - damage = damage + 10 - this.actor.addCondition("entangled", 3) -} -this.script.scriptMessage(await this.actor.applyBasicDamage(damage, {loc : "roll", suppressMsg: true})) diff --git a/scripts/Bu0KUpGvfmFF7LJs.js b/scripts/Bu0KUpGvfmFF7LJs.js new file mode 100644 index 0000000..3b86af0 --- /dev/null +++ b/scripts/Bu0KUpGvfmFF7LJs.js @@ -0,0 +1,15 @@ +let test = await this.actor.setupCharacteristic("s", {appendTitle : ` - ${this.effet.name}`, fields : {difficulty : "difficult"}}); + +await Test.roll(); + +if (Test.Échoué) +{ + + if (Test.isCriticalFumble == "fumble") + { + return this.script.message(`${this.actor.name} meurt alors qu'il est entraîné dans l'Aethyr (à moins qu'il ne dépense un point de Destinée pour éviter cela).`); + } + + await this.script.message(await this.actor.applyBasicDamage(3, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg: true })) + +} \ No newline at end of file diff --git a/scripts/Bv3431tnG3VKaTJr.js b/scripts/Bv3431tnG3VKaTJr.js index 9aa3165..148db69 100644 --- a/scripts/Bv3431tnG3VKaTJr.js +++ b/scripts/Bv3431tnG3VKaTJr.js @@ -1,4 +1,4 @@ if (args.test.result.castOutcome == "success") { - args.test.result.other.push(`@Fear[2,${this.actor.name}]`); + args.test.result.other.push(`@Peur[2,${this.actor.name}]`); } \ No newline at end of file diff --git a/scripts/C5NIkJwXL85Qbpe7.js b/scripts/C5NIkJwXL85Qbpe7.js new file mode 100644 index 0000000..7ba0cf6 --- /dev/null +++ b/scripts/C5NIkJwXL85Qbpe7.js @@ -0,0 +1 @@ +args.weaponProperties.impale = true; \ No newline at end of file diff --git a/scripts/CCK1iIfPmB398ziT.js b/scripts/CCK1iIfPmB398ziT.js deleted file mode 100644 index 4d67bea..0000000 --- a/scripts/CCK1iIfPmB398ziT.js +++ /dev/null @@ -1,2 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Athletics"), {fields : {difficulty : "difficult"}, skipTargets: true, appendTitle : " - Walking"}) -test.roll(); \ No newline at end of file diff --git a/scripts/CHnaBPHk6HdFS512.js b/scripts/CHnaBPHk6HdFS512.js index 93dbc6d..0bdfb7c 100644 --- a/scripts/CHnaBPHk6HdFS512.js +++ b/scripts/CHnaBPHk6HdFS512.js @@ -1,6 +1,6 @@ let arm = await fromUuid("Compendium.wfrp4e-core.items.MnMZv7ZXoRqoH9dS"); let leg = await fromUuid("Compendium.wfrp4e-core.items.k00PimCWkff11IA0"); -let choice = await ItemDialog.create([arm, leg], 1, "Choisir le Membre") +let choice = await ItemDialog.create([arm, leg], 1, "Choisir le membre") this.actor.createEmbeddedDocuments("Item", choice, {fromEffect: this.effect.id}) \ No newline at end of file diff --git a/scripts/CIxZYkHggBQ6EsHP.js b/scripts/CIxZYkHggBQ6EsHP.js index d5c9c31..03fbf4c 100644 --- a/scripts/CIxZYkHggBQ6EsHP.js +++ b/scripts/CIxZYkHggBQ6EsHP.js @@ -1,2 +1,2 @@ -this.script.scriptNotification("Effet utilisé"); +this.script.notification("Effet utilisé"); this.effect.delete(); \ No newline at end of file diff --git a/scripts/CS6O7UUjQcUJoOUP.js b/scripts/CS6O7UUjQcUJoOUP.js index 1a8a772..22260d5 100644 --- a/scripts/CS6O7UUjQcUJoOUP.js +++ b/scripts/CS6O7UUjQcUJoOUP.js @@ -1,9 +1,10 @@ -if (args.test.failed) { - let SL = Number(args.test.result.SL) - if (SL <= -2 && SL > -4) - this.actor.addCondition("stunned") - else if (SL <= -4 && SL > -6) - this.script.scriptMessage(this.actor.prototypeToken.name + " doit réaliser un Test de Force Mentale -4) + this.actor.addCondition("stunned") + else if (SL <= -4 && SL > -6) + this.script.message(this.actor.prototypeToken.name + " Doit réaliser un test a FM être @Condition[Prone].") + else if (SL <= -6) + this.actor.addCondition("unconscious") + } \ No newline at end of file diff --git a/scripts/CUBpU1imu2eRS06C.js b/scripts/CUBpU1imu2eRS06C.js new file mode 100644 index 0000000..1a0a33e --- /dev/null +++ b/scripts/CUBpU1imu2eRS06C.js @@ -0,0 +1,5 @@ +if (args.opposedTest.attackerTest.weapon?.system.properties?.qualities.hack && !args.hackReminder) +{ + args.hackReminder = true; + args.opposedTest.result.other.push(`${this.effect.name}: Hack causes ${this.item.Advances} extra damage`) +} \ No newline at end of file diff --git a/scripts/CW5Vlr57OaMkKJ8Q.js b/scripts/CW5Vlr57OaMkKJ8Q.js index 56db697..88cec81 100644 --- a/scripts/CW5Vlr57OaMkKJ8Q.js +++ b/scripts/CW5Vlr57OaMkKJ8Q.js @@ -1,11 +1,11 @@ if (this.actor.system.status.advantage.value >= 3) { this.actor.modifyAdvantage(-3); - this.script.scriptNotification("Avantage soustrait") + this.script.notification("Avantage retiré") } else { - return this.script.scriptNotification("Pas assez d'Avantages!", "error") + return this.script.notification("Avantage retiré", "error") } let test = await this.actor.setupTrait(this.item) diff --git a/scripts/CWNGrg7se91RC95g.js b/scripts/CWNGrg7se91RC95g.js index ca54b5c..13d9446 100644 --- a/scripts/CWNGrg7se91RC95g.js +++ b/scripts/CWNGrg7se91RC95g.js @@ -1,11 +1,11 @@ if (args.totalWoundLoss > 0) { args.opposedTest.result.other.push( - `@Corruption[minor]{Exposition Mineure à la Corruption}` + `@Corruption[minor]{Moderate Exposure to Corruption}` ) - this.script.scriptMessage(`${this.effect.name}: - @Corruption[moderate]{Exposition Modérée à la Corruption}
    - ${args.actor.prototypeToken.name} doit réussir un - Test de Corruption (Modéré)`, + this.script.message(`${this.effect.name}: + @Corruption[moderate]{Moderate Exposure to Corruption}
    + ${args.actor.prototypeToken.name} must take an + Corruption (Moderate) Test`, {whisper: ChatMessage.getWhisperRecipients("GM")} ) } \ No newline at end of file diff --git a/scripts/CbfUDhUr5R4UnPPq.js b/scripts/CbfUDhUr5R4UnPPq.js new file mode 100644 index 0000000..1185304 --- /dev/null +++ b/scripts/CbfUDhUr5R4UnPPq.js @@ -0,0 +1,5 @@ +if (this.actor && this.actor?.name !== "Kurgorn Three-eyes" && !this.actor.hasCondition("blinded") && !args.itemUpdated) +{ + this.script.notification(`Impossible de supprimer l'état Aveuglé.`); + await this.actor.addCondition("blinded", 1, {statuses : ["blinded", "blind"]}) +} \ No newline at end of file diff --git a/scripts/CcR9i3UzUXx7ieep.js b/scripts/CcR9i3UzUXx7ieep.js new file mode 100644 index 0000000..33ccf55 --- /dev/null +++ b/scripts/CcR9i3UzUXx7ieep.js @@ -0,0 +1 @@ +args.fields.modifier +=10; \ No newline at end of file diff --git a/scripts/CiFeduksZJ6PRulx.js b/scripts/CiFeduksZJ6PRulx.js deleted file mode 100644 index 57463db..0000000 --- a/scripts/CiFeduksZJ6PRulx.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == "Chevaucher (Cheval)" || (args.options.dodge && this.actor.isMounted); \ No newline at end of file diff --git a/scripts/Cjj4iLkdY1NaZRCi.js b/scripts/Cjj4iLkdY1NaZRCi.js index 1bb4744..8b2de55 100644 --- a/scripts/Cjj4iLkdY1NaZRCi.js +++ b/scripts/Cjj4iLkdY1NaZRCi.js @@ -1,26 +1,9 @@ if ((args.opposedTest.attackerTest.item && args.opposedTest.attackerTest.item.isMelee) || (args.opposedTest.attackerTest.item && !args.opposedTest.attackerTest.item.name.includes("Projectiles"))) { - let choice = await Dialog.wait({ - title: this.effect.name, - content: `

    Appliquer les dommages de ${this.effect.name} à l'attquant?`, - buttons: { - yes: { - label: "Oui", - callback: () => { - return true; - } - }, - no: { - label: "Non", - callback: () => { - return false; - } - } - } - }) + let choice = await foundry.applications.api.DialogV2.confirm({window : {title : this.effect.name}, content : `

    Apply damage with ${this.effect.name} to attacker?`}) if (choice) { - this.script.scriptMessage(await args.attacker.applyBasicDamage(this.actor.system.characteristics.wp.bonus, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true})); + this.script.message(await args.attacker.applyBasicDamage(this.actor.system.characteristics.wp.bonus, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true})); } } \ No newline at end of file diff --git a/scripts/CkE8NZOhzPkuRrKJ.js b/scripts/CkE8NZOhzPkuRrKJ.js deleted file mode 100644 index d4e519f..0000000 --- a/scripts/CkE8NZOhzPkuRrKJ.js +++ /dev/null @@ -1,14 +0,0 @@ -let item = await fromUuid("Compendium.wfrp4e-core.items.MnMZv7ZXoRqoH9dS") -let data = item.toObject(); -data.system.location.key = this.item.system.location.key -this.actor.createEmbeddedDocuments("Item", [data]) - - - - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty: "hard"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("unconscious") -} \ No newline at end of file diff --git a/scripts/ClkT2WG2UjVwQ97T.js b/scripts/ClkT2WG2UjVwQ97T.js index d53f472..6c3623f 100644 --- a/scripts/ClkT2WG2UjVwQ97T.js +++ b/scripts/ClkT2WG2UjVwQ97T.js @@ -3,12 +3,12 @@ if (args.actor.has("Démoniaque")) { args.modifiers.other.push({label: this.effect.name, value: 3}); } -let test = await args.actor.setupSkill("Endurance", { +let test = await args.actor.setupSkill("Résistance", { appendTitle: ` – ${this.effect.name}`, skipTargets: true, characteristic: 't', context: { - failure: "Received 1 Blinded Condition" + failure: "Reçoit 1 État Aveuglé" } }); await test.roll(); diff --git a/scripts/Cri5Q7ux6ni7zNVS.js b/scripts/Cri5Q7ux6ni7zNVS.js new file mode 100644 index 0000000..4d81c3f --- /dev/null +++ b/scripts/Cri5Q7ux6ni7zNVS.js @@ -0,0 +1,7 @@ +// Cannot be Surprised in combat. + +if (this.actor.hasCondition("surprised")) +{ + this.actor.removeCondition("surprised") + ui.notifications.notify(`${this.effect.name}: Cannot be surprised`); +} \ No newline at end of file diff --git a/scripts/CxsKWGwQqtAaQdzX.js b/scripts/CxsKWGwQqtAaQdzX.js new file mode 100644 index 0000000..f1c461a --- /dev/null +++ b/scripts/CxsKWGwQqtAaQdzX.js @@ -0,0 +1 @@ +return args.characteristic === "fel"; \ No newline at end of file diff --git a/scripts/CynUM4ZEiB9QbNQq.js b/scripts/CynUM4ZEiB9QbNQq.js new file mode 100644 index 0000000..c9419fd --- /dev/null +++ b/scripts/CynUM4ZEiB9QbNQq.js @@ -0,0 +1,3 @@ +const bonus = game.settings.get("wfrp4e", "homebrew").advantageBonus; + +args.fields.modifier += 2 * bonus; \ No newline at end of file diff --git a/scripts/DHxUKY9LMyifFgCi.js b/scripts/DHxUKY9LMyifFgCi.js index f05e6f3..28c06b3 100644 --- a/scripts/DHxUKY9LMyifFgCi.js +++ b/scripts/DHxUKY9LMyifFgCi.js @@ -1 +1 @@ -return args.skill?.name == "Métier (Apothicaire)" || args.skill?.name == "Métier (Alchimiste)" \ No newline at end of file +return args.skill?.name == "Métier (Apothicaire)" || args.skill?.name == "Trade (Alchemist)" \ No newline at end of file diff --git a/scripts/DTiHS6RfwhF4THbf.js b/scripts/DTiHS6RfwhF4THbf.js deleted file mode 100644 index 1a7339b..0000000 --- a/scripts/DTiHS6RfwhF4THbf.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Drive") && !args.skill?.name.includes(game.i18n.localize("NAME.Ride")); \ No newline at end of file diff --git a/scripts/DUFSlDO38fQWclBE.js b/scripts/DUFSlDO38fQWclBE.js new file mode 100644 index 0000000..708b63c --- /dev/null +++ b/scripts/DUFSlDO38fQWclBE.js @@ -0,0 +1,6 @@ +// Characters wounded by the ravens gain the ability to read, understand and speak rudimentary Classical. +// This ability does not last beyond this adventure. + +this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.61L9aX2z164cjm7K", this.effect) + +this.script.message(`${args.actor.name} gains the ability to read, understand and speak rudimentary @UUID[Compendium.wfrp4e-core.items.Item.61L9aX2z164cjm7K]{Classical}. This ability does not last beyond this adventure.`) \ No newline at end of file diff --git a/scripts/DVlZGbiuMIHEQOnM.js b/scripts/DVlZGbiuMIHEQOnM.js index 9ecada3..d475efa 100644 --- a/scripts/DVlZGbiuMIHEQOnM.js +++ b/scripts/DVlZGbiuMIHEQOnM.js @@ -4,7 +4,7 @@ if (this.actor.getFlag("wfrp4e", "isAttached")) await roll.toMessage(this.script.getChatData()); if (roll.total == 9 || roll.total == 10) { - this.script.scriptMessage(`${this.actor.name} attaché à ${this.actor.getFlag("wfrp4e", "isAttached")} tombe.`) + this.script.message(`${this.actor.name} attached to ${this.actor.getFlag("wfrp4e", "isAttached")} gorges and falls off.`) await this.actor.unsetFlag("wfrp4e", "isAttached") } } \ No newline at end of file diff --git a/scripts/DhZqJso1JWYtGrKk.js b/scripts/DhZqJso1JWYtGrKk.js index 5808036..bf582e3 100644 --- a/scripts/DhZqJso1JWYtGrKk.js +++ b/scripts/DhZqJso1JWYtGrKk.js @@ -1,3 +1,3 @@ this.actor.addCondition("ablaze") let damage = this.effect.sourceTest.result.damage + this.effect.sourceTest.result.additionalDamage -this.script.scriptMessage(await this.actor.applyBasicDamage(damage, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})) \ No newline at end of file +this.script.message(await this.actor.applyBasicDamage(damage, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})) \ No newline at end of file diff --git a/scripts/Dk4VF4UXSMK5SaVP.js b/scripts/Dk4VF4UXSMK5SaVP.js new file mode 100644 index 0000000..2a2f2c6 --- /dev/null +++ b/scripts/Dk4VF4UXSMK5SaVP.js @@ -0,0 +1,2 @@ +this.script.message("Activé pour annulé les Échecs critiques / Echecs") +this.effect.update({disabled: true}) \ No newline at end of file diff --git a/scripts/DmbWR9s5I8LHBwxB.js b/scripts/DmbWR9s5I8LHBwxB.js index 27af841..365de2d 100644 --- a/scripts/DmbWR9s5I8LHBwxB.js +++ b/scripts/DmbWR9s5I8LHBwxB.js @@ -1,4 +1,4 @@ -let column = await ValueDialog.create({text : "Select the column to roll on to determine Beast Head", title : "Select Column"}, "", ["Undivided", "Khorne", "Nurgle", "Slaanesh", "Tzeentch"]); +let column = await ValueDialog.create({text : "Sélectionnez la colonne de lancer pour déterminer la Tête de Bête", title : "Sélectionnez une Colonne"}, "", ["Undivided", "Khorne", "Nurgle", "Slaanesh", "Tzeentch"]); if (column) { diff --git a/scripts/DsE6rTSzxEn6uWMz.js b/scripts/DsE6rTSzxEn6uWMz.js deleted file mode 100644 index 63b87e9..0000000 --- a/scripts/DsE6rTSzxEn6uWMz.js +++ /dev/null @@ -1,7 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "average"}}) -await test.roll(); -if (test.failed) -{ - await this.actor.addCondition("blinded"); - await this.actor.addCondition("fatigued") -} \ No newline at end of file diff --git a/scripts/DuM5l2Yb4bdvDeaG.js b/scripts/DuM5l2Yb4bdvDeaG.js deleted file mode 100644 index bf15220..0000000 --- a/scripts/DuM5l2Yb4bdvDeaG.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != "Athlétisme" \ No newline at end of file diff --git a/scripts/DvJvHsjgkzIfFaks.js b/scripts/DvJvHsjgkzIfFaks.js new file mode 100644 index 0000000..a011aeb --- /dev/null +++ b/scripts/DvJvHsjgkzIfFaks.js @@ -0,0 +1,3 @@ +if (!args.test.preData.options?.runeOfParrying) return +if (!this.item.equipped.value || !args.test.item) return; +args.test.preData.canReverse = true \ No newline at end of file diff --git a/scripts/DxM3NRgQYc7moMPc.js b/scripts/DxM3NRgQYc7moMPc.js new file mode 100644 index 0000000..3531ec6 --- /dev/null +++ b/scripts/DxM3NRgQYc7moMPc.js @@ -0,0 +1 @@ +this.actor.reset() \ No newline at end of file diff --git a/scripts/DxQnamsb2AuW0p2e.js b/scripts/DxQnamsb2AuW0p2e.js deleted file mode 100644 index fbdcd2f..0000000 --- a/scripts/DxQnamsb2AuW0p2e.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Lore")); \ No newline at end of file diff --git a/scripts/Dy67jQmeGwHwV9NY.js b/scripts/Dy67jQmeGwHwV9NY.js new file mode 100644 index 0000000..9698637 --- /dev/null +++ b/scripts/Dy67jQmeGwHwV9NY.js @@ -0,0 +1 @@ +args.fields.modifier -=10; \ No newline at end of file diff --git a/scripts/E0HHBSdQR3oH8KaL.js b/scripts/E0HHBSdQR3oH8KaL.js new file mode 100644 index 0000000..2f6f93f --- /dev/null +++ b/scripts/E0HHBSdQR3oH8KaL.js @@ -0,0 +1,7 @@ +if (args.totalWoundLoss > 0) { + let frenzy = await fromUuid("Compendium.wfrp4e-core.items.Item.DrNUTPeodEgpWTnT"); + frenzy = frenzy.toObject(); + frenzy.effects[0].disabled = false; + this.actor.createEmbeddedDocuments("Item", [frenzy], {fromEffect : this.effect.id}); + this.script.scriptMessage("Carnosaur gains Frenzy"); +} \ No newline at end of file diff --git a/scripts/E1vUepgop09FF5wy.js b/scripts/E1vUepgop09FF5wy.js index 058587a..7d069eb 100644 --- a/scripts/E1vUepgop09FF5wy.js +++ b/scripts/E1vUepgop09FF5wy.js @@ -1,6 +1,6 @@ if (this.actor.system.status.advantage.value == 0) { - return this.script.scriptNotification("Pas assez d'Avantages!", "error") + return this.script.notification("Avantage retiré", "error") } let hatred = await fromUuid("Compendium.wfrp4e-core.items.Item.aE3pyW20Orvdjzj0") @@ -8,15 +8,15 @@ let frenzy = await fromUuid("Compendium.wfrp4e-core.items.Item.yRhhOlt18COq4e1q" if (this.actor.system.status.advantage.value >= 3) { - this.script.scriptNotification(`Ajout de ${frenzy.name}`) + this.script.notification(`Ajout de ${frenzy.name}`) this.actor.setAdvantage(0) this.actor.createEmbeddedDocuments("Item", [frenzy]) } else if (this.actor.system.status.advantage.value >= 1) { let data = hatred.toObject(); - data.system.specification.value = "Combatants au corps à corps" - this.script.scriptNotification(`Ajout de ${hatred.name}`) + data.system.specification.value = "Opposants au corps à corps" + this.script.notification(`Ajout de ${hatred.name}`) this.actor.setAdvantage(0) this.actor.createEmbeddedDocuments("Item", [data]) } \ No newline at end of file diff --git a/scripts/E33J9JixYVGxaktQ.js b/scripts/E33J9JixYVGxaktQ.js new file mode 100644 index 0000000..65bf20f --- /dev/null +++ b/scripts/E33J9JixYVGxaktQ.js @@ -0,0 +1,3 @@ +if (this.effect.getFlag("wfrp4e", "fistsOfGork") && args.item.type == "skill" && args.item.name == "Corps à corps (Bagarre)") { + args.item.system.modifier.value += this.effect.getFlag("wfrp4e", "fistsOfGork") +} \ No newline at end of file diff --git a/scripts/E3om295BMQojnM2F.js b/scripts/E3om295BMQojnM2F.js index 8060980..1b34090 100644 --- a/scripts/E3om295BMQojnM2F.js +++ b/scripts/E3om295BMQojnM2F.js @@ -2,5 +2,5 @@ let fatigued = this.actor.hasCondition("fatigued") if (fatigued) { fatigued.delete(); - this.script.scriptNotification("Fatigue supprimée") + this.script.notification("Retiré Exténué") } \ No newline at end of file diff --git a/scripts/E4CHDe1xfmcV3oGv.js b/scripts/E4CHDe1xfmcV3oGv.js deleted file mode 100644 index c1e0400..0000000 --- a/scripts/E4CHDe1xfmcV3oGv.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Navigation"); \ No newline at end of file diff --git a/scripts/E6DMqfDeczqmVMFV.js b/scripts/E6DMqfDeczqmVMFV.js deleted file mode 100644 index 2a0bc28..0000000 --- a/scripts/E6DMqfDeczqmVMFV.js +++ /dev/null @@ -1,3 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "average"}}) - -await test.roll(); \ No newline at end of file diff --git a/scripts/E7D4bxz8gy4e1wL7.js b/scripts/E7D4bxz8gy4e1wL7.js deleted file mode 100644 index ec82dce..0000000 --- a/scripts/E7D4bxz8gy4e1wL7.js +++ /dev/null @@ -1 +0,0 @@ -if (["Stealth (Rural)", "Track", "Outdoor Survival", "Swim", "Perception", "Intuition"].includes(args.item?.name)) \ No newline at end of file diff --git a/scripts/E7ksDLhihkJN4Vpt.js b/scripts/E7ksDLhihkJN4Vpt.js new file mode 100644 index 0000000..55ad3bd --- /dev/null +++ b/scripts/E7ksDLhihkJN4Vpt.js @@ -0,0 +1 @@ +return args.characteristic != "s" || args.type != "characteristic" \ No newline at end of file diff --git a/scripts/EBNrA6FNX4d05EUx.js b/scripts/EBNrA6FNX4d05EUx.js index 1ad25de..349e285 100644 --- a/scripts/EBNrA6FNX4d05EUx.js +++ b/scripts/EBNrA6FNX4d05EUx.js @@ -1 +1 @@ -return !args.options.crewTest; \ No newline at end of file +return !args.context.crewTest; \ No newline at end of file diff --git a/scripts/EC8cZmqrE095cDc2.js b/scripts/EC8cZmqrE095cDc2.js index 528f927..869c322 100644 --- a/scripts/EC8cZmqrE095cDc2.js +++ b/scripts/EC8cZmqrE095cDc2.js @@ -1,7 +1,7 @@ const actor = args.actor; -if (actor.itemTypes.skill.find(s => s.name === "Savoir (Savoir)")) { - const loreTest = await actor.setupSkill('Savoir (Savoir)', { +if (actor.itemTypes.skill.find(s => s.name === "Savoir (Voies fluviales)")) { + const loreTest = await actor.setupSkill('Savoir (Voies fluviales)', { appendTitle: ` – ${this.effect.name}`, skipTargets: true, fields: {difficulty: 'hard'}, @@ -10,22 +10,22 @@ if (actor.itemTypes.skill.find(s => s.name === "Savoir (Savoir)")) { await loreTest.roll(); if (loreTest.succeeded) { - loreTest.result.other.push(`${actor.name} reconnaît les leurres de Lurkerfis.`); + loreTest.result.other.push(`${actor.name} reconnaît les leurres des Lurkerfish.`); loreTest.renderRollCard(); return; - } + } } -let test = await actor.setupSkill('Calme', { +let Test = await actor.setupSkill('Calme', { appendTitle: ` – ${this.effect.name}`, skipTargets: true, fields: {difficulty: 'easy'}, characteristic: 'wp', }); -await test.roll(); +await Test.roll(); -if (!test.succeeded) { - test.result.other.push(`${actor.name} est devenu séduit par la vue et incapable d'effectuer aucune action sauf se diriger vers la lumière`); - test.renderRollCard(); +if (!Test.succeeded) { + Test.result.other.push(`${actor.name} est devenu fasciné par la vue et incapable d'effectuer une quelconque action autre que de se déplacer vers la lumière.`); + Test.renderRollCard(); actor.addCondition("unconscious"); } \ No newline at end of file diff --git a/scripts/ECUIJLcKt2TCSFS3.js b/scripts/ECUIJLcKt2TCSFS3.js new file mode 100644 index 0000000..1e4cb7f --- /dev/null +++ b/scripts/ECUIJLcKt2TCSFS3.js @@ -0,0 +1 @@ +return !args.weapon?.system?.attackType || game.settings.get("wfrp4e", "useGroupAdvantage") \ No newline at end of file diff --git a/scripts/EDAMEOzdBfkoKHxP.js b/scripts/EDAMEOzdBfkoKHxP.js deleted file mode 100644 index 6b1f28e..0000000 --- a/scripts/EDAMEOzdBfkoKHxP.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Navigation"); \ No newline at end of file diff --git a/scripts/EGWF3LHav3e2zFL4.js b/scripts/EGWF3LHav3e2zFL4.js deleted file mode 100644 index cb217a7..0000000 --- a/scripts/EGWF3LHav3e2zFL4.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Ranged")) || args.item?.isRanged || args.item?.name == game.i18n.localize("NAME.Charm"); \ No newline at end of file diff --git a/scripts/EHfOyVwYhFGWNjw1.js b/scripts/EHfOyVwYhFGWNjw1.js new file mode 100644 index 0000000..5de470f --- /dev/null +++ b/scripts/EHfOyVwYhFGWNjw1.js @@ -0,0 +1,6 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {difficulty: "difficult"}) + await test.roll(); + if (!test.succeeded) + { + await this.actor.addCondition("poisoned"); + } \ No newline at end of file diff --git a/scripts/EJObiSth3WdcJOXN.js b/scripts/EJObiSth3WdcJOXN.js index 79bf488..753c2bc 100644 --- a/scripts/EJObiSth3WdcJOXN.js +++ b/scripts/EJObiSth3WdcJOXN.js @@ -1,5 +1,5 @@ -if (args.test.characteristicKey == "wp" && args.test.failed && args.test.result.SL <= -3) +if (args.test.characteristicKey == "wp" && args.Test.Échoué && args.Test.result.SL <= -3) { - this.script.scriptNotification("Ajout de A Terre"); + this.script.notification("Ajout de A Terre"); this.actor.addCondition("prone") } \ No newline at end of file diff --git a/scripts/EJaBfqADqlo92Fx6.js b/scripts/EJaBfqADqlo92Fx6.js index 1902c51..0a5f078 100644 --- a/scripts/EJaBfqADqlo92Fx6.js +++ b/scripts/EJaBfqADqlo92Fx6.js @@ -1,4 +1,4 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.oGbDwnLOn3isPJpO") let data = item.toObject(); -data.name += " (A déterminer)" +data.name += " (Au choix)" this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/ENGmwaItRXO5s0XY.js b/scripts/ENGmwaItRXO5s0XY.js index 8d8a308..9df13ab 100644 --- a/scripts/ENGmwaItRXO5s0XY.js +++ b/scripts/ENGmwaItRXO5s0XY.js @@ -1,5 +1,5 @@ await this.actor.modifyWounds(this.actor.system.characteristics.t.bonus * 3) -this.script.scriptMessage(`Soigne ${this.actor.system.characteristics.t.bonus * 3} Blessures`) +this.script.message(`Heals ${this.actor.system.characteristics.t.bonus * 3} Wounds`) this.actor.hasCondition("bleeding")?.delete() this.actor.hasCondition("fatigued")?.delete() diff --git a/scripts/EQ5dtGW5kQhtAb87.js b/scripts/EQ5dtGW5kQhtAb87.js deleted file mode 100644 index 767e730..0000000 --- a/scripts/EQ5dtGW5kQhtAb87.js +++ /dev/null @@ -1,7 +0,0 @@ -await this.actor.addCondition("prone") -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty : "hard"}, skipTargets: true, appendTitle : " - " + this.effect.name}) -await test.roll(); -if (test.failed) -{ - await this.actor.addCondition("stunned") -} \ No newline at end of file diff --git a/scripts/ERxrWzSpw8qwxFVi.js b/scripts/ERxrWzSpw8qwxFVi.js index 6eb7ef4..51d4503 100644 --- a/scripts/ERxrWzSpw8qwxFVi.js +++ b/scripts/ERxrWzSpw8qwxFVi.js @@ -1 +1 @@ -this.script.scriptNotification(`Ne peut entrer ${this.effect.name}!`); this.actor.addCondition("broken"); \ No newline at end of file +this.script.notification(`Impossible d'entrer dans ${this.effect.name} !`); this.actor.addCondition("broken"); \ No newline at end of file diff --git a/scripts/ETfmit2Cx0Py77ai.js b/scripts/ETfmit2Cx0Py77ai.js new file mode 100644 index 0000000..cbb98a3 --- /dev/null +++ b/scripts/ETfmit2Cx0Py77ai.js @@ -0,0 +1,48 @@ +let characteristics = { + "ws" : -10, + "bs" : 0, + "s" : 0, + "t" : 0, + "i" : -25, + "ag" : -20, + "dex" : 0, + "int" : -200, + "wp" : -200, + "fel" : -200 +} +let traits = [ {name:"Fabriqué"}, {name:"Vision dans l'obscurité"}, {name:"Peur", value: 2}, {name:"Insensible à la douleur"},{name:"Mort-vivant"},{name:"Instable"} ]; +let items = []; + +let updateObj = this.actor.toObject(); +for (let ch in characteristics) +{ + updateObj.system.characteristics[ch].modifier += characteristics[ch]; +} + +updateObj.system.characteristics.int.initial = 0; +updateObj.system.characteristics.wp.initial = 0; +updateObj.system.characteristics.fel.initial = 0; + +for (let trait of traits) +{ + let traitItem = await game.wfrp4e.utility.find(trait.name, "trait") + if (traitItem) + { + let t = traitItem.toObject(); + t.system.specification.value = trait.value; + items.push(t); + } + else + { + ui.notifications.warn(`: -200 +} +let traits = [ {name:`, {permanent : true}) + } +} + + +updateObj.name = updateObj.name += " " + this.effet.name + +await this.actor.update(updateObj) +this.actor.createEmbeddedDocuments("Item", items); + diff --git a/scripts/ETrfkHI0B9YjJqM2.js b/scripts/ETrfkHI0B9YjJqM2.js new file mode 100644 index 0000000..5f20584 --- /dev/null +++ b/scripts/ETrfkHI0B9YjJqM2.js @@ -0,0 +1 @@ +return this.item.equipped.value && this.actor.isOpposing && this.actor.attacker.test.item.attackType == "melee" \ No newline at end of file diff --git a/scripts/EU5j0hnDTG9Z6d1e.js b/scripts/EU5j0hnDTG9Z6d1e.js deleted file mode 100644 index 82d6a1d..0000000 --- a/scripts/EU5j0hnDTG9Z6d1e.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "hard"}}) -await test.roll(); -if(test.failed) -{ - this.actor.addCondition("stunned", 2) -} \ No newline at end of file diff --git a/scripts/EVBSHEC5nmmj2X41.js b/scripts/EVBSHEC5nmmj2X41.js deleted file mode 100644 index c08a5ea..0000000 --- a/scripts/EVBSHEC5nmmj2X41.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Climb") && !args.skill?.name?.includes(game.i18n.localize("NAME.Stealth")); \ No newline at end of file diff --git a/scripts/EdTChmSouS0MSmk5.js b/scripts/EdTChmSouS0MSmk5.js index a6566d8..c9ff27e 100644 --- a/scripts/EdTChmSouS0MSmk5.js +++ b/scripts/EdTChmSouS0MSmk5.js @@ -1,10 +1,10 @@ -let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.succeeded) +let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : ` - ${this.effet.name}`}) +await Test.roll(); +if (Test.succeeded) { - this.script.scriptMessage("Peut effectuer une Action ou un Mouvement (en choisir un)") + this.script.message("Peut réaliser une Action ou un Déplacement (choisissez-en un)") } -else +else { - this.script.scriptMessage("Ne peut pas effectuer d'Action ou de Mouvement ce round") + this.script.message("Ne peut pas réaliser une Action ou un Déplacement ce tour-ci") } \ No newline at end of file diff --git a/scripts/ElHBPMMx37SZMvOC.js b/scripts/ElHBPMMx37SZMvOC.js new file mode 100644 index 0000000..4fa3858 --- /dev/null +++ b/scripts/ElHBPMMx37SZMvOC.js @@ -0,0 +1,2 @@ +this.actor.addCondition("ablaze"); +this.script.scriptMessage(`${this.actor.name} has a received a @Condition[Ablaze]`) \ No newline at end of file diff --git a/scripts/EmXwcuycEH8slEn5.js b/scripts/EmXwcuycEH8slEn5.js deleted file mode 100644 index 4bd0b62..0000000 --- a/scripts/EmXwcuycEH8slEn5.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "hard"}}) -await test.roll(); -if(test.failed) -{ - this.actor.addCondition("unconscious") -} \ No newline at end of file diff --git a/scripts/EmmG49pMOPHRwDzR.js b/scripts/EmmG49pMOPHRwDzR.js deleted file mode 100644 index 2c59128..0000000 --- a/scripts/EmmG49pMOPHRwDzR.js +++ /dev/null @@ -1,8 +0,0 @@ - let roll = Math.ceil(CONFIG.Dice.randomUniform() * 10) - if (args.test.isFumble && roll == 1 && !args.test.result.misfire) - { - args.test.result.misfire = game.i18n.localize("Misfire") + " (Résultat 1)" - args.test.result.misfireDamage = eval(parseInt(args.test.result.roll.toString().split('').pop()) + args.test.item.Damage) - } - else if (args.test.isFumble && roll != 1) - args.test.result.other.push("Raté résultat: " + roll) diff --git a/scripts/EsZx8cY34quYG4MQ.js b/scripts/EsZx8cY34quYG4MQ.js new file mode 100644 index 0000000..2c537af --- /dev/null +++ b/scripts/EsZx8cY34quYG4MQ.js @@ -0,0 +1,5 @@ +let runes = this.actor.itemTypes["wfrp4e-dwarfs.rune"] +if (runes.length === 0) return ui.notifications.error("Cet acteur ne connaît aucune rune.") + +let rune = await ItemDialog.create(this.actor.itemTypes["wfrp4e-dwarfs.rune"], 1, {text: "Sélectionnez une Rune", title: this.effect.name}) +rune[0].system.use({initialTooltip: "Bonus Enclume de la Destinée", fields: {modifier: 20}}) \ No newline at end of file diff --git a/scripts/Ew3C2WmLCtc1KT46.js b/scripts/Ew3C2WmLCtc1KT46.js deleted file mode 100644 index 9e8991b..0000000 --- a/scripts/Ew3C2WmLCtc1KT46.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Stealth")) || args.item?.id == this.item?.id \ No newline at end of file diff --git a/scripts/F2u4L4o0r1LTWeWK.js b/scripts/F2u4L4o0r1LTWeWK.js index eafbde8..d2915d2 100644 --- a/scripts/F2u4L4o0r1LTWeWK.js +++ b/scripts/F2u4L4o0r1LTWeWK.js @@ -1,6 +1,6 @@ if (isNaN(parseInt(this.item.system.specification.value))) { - let value = await ValueDialog.create({text : "Enter Terror value", title : this.effect.name}); + let value = await ValueDialog.create({text : "Entrez la valeur de Terreur", title : this.effect.name}); if (value) { this.item.updateSource({"system.specification.value" : value}); diff --git a/scripts/F7BHb4a7fqWMnYxH.js b/scripts/F7BHb4a7fqWMnYxH.js new file mode 100644 index 0000000..dcf04fa --- /dev/null +++ b/scripts/F7BHb4a7fqWMnYxH.js @@ -0,0 +1 @@ +args.test.data.result.other.push(`You may not use Fortune Points because of ${this.effect.name}`); \ No newline at end of file diff --git a/scripts/F7E0Dr3sT7kkc2p7.js b/scripts/F7E0Dr3sT7kkc2p7.js new file mode 100644 index 0000000..5568bbb --- /dev/null +++ b/scripts/F7E0Dr3sT7kkc2p7.js @@ -0,0 +1 @@ +return this.actor.hasCondition("fatigued") \ No newline at end of file diff --git a/scripts/F8Bmh6w01YvKsBIO.js b/scripts/F8Bmh6w01YvKsBIO.js new file mode 100644 index 0000000..3a49636 --- /dev/null +++ b/scripts/F8Bmh6w01YvKsBIO.js @@ -0,0 +1,6 @@ +for (const weapon of args.actor.itemTags.weapon) { + weapon.system.qualities.value.push( + {name: "impale", value: null}, + {name: "penetrating", value: null}, + ); +} \ No newline at end of file diff --git a/scripts/FGIHAkNdYXbTnewG.js b/scripts/FGIHAkNdYXbTnewG.js new file mode 100644 index 0000000..60f29d1 --- /dev/null +++ b/scripts/FGIHAkNdYXbTnewG.js @@ -0,0 +1,6 @@ +if (!game.settings.get("wfrp4e", "useGroupAdvantage")) + return; + + +await this.actor.modifyAdvantage(1); +this.effect.delete(); \ No newline at end of file diff --git a/scripts/FKEH7DeqU0FH4dkk.js b/scripts/FKEH7DeqU0FH4dkk.js new file mode 100644 index 0000000..6bdbcd2 --- /dev/null +++ b/scripts/FKEH7DeqU0FH4dkk.js @@ -0,0 +1,7 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Dodge"), {fields : {difficulty : "hard"}, appendTitle : ` - ${this.effect.name}`}) +await Test.roll(); + +if (Test.Échoué) { + this.script.scriptMessage(await this.actor.applyBasicDamage(20, {suppressMsg: true})); + this.script.scriptMessage(`${this.actor.name} est victime de @UUID[Compendium.wfrp4e-core.journals.JournalEntry.NS3YGlJQxwTggjRX.JournalEntryPage.WCivInLZrqEtZzF4#drowning-and-suffocation]{Suffocation}`); +} \ No newline at end of file diff --git a/scripts/FMA16PvoObBV8vDl.js b/scripts/FMA16PvoObBV8vDl.js index 873a4f2..82214b9 100644 --- a/scripts/FMA16PvoObBV8vDl.js +++ b/scripts/FMA16PvoObBV8vDl.js @@ -2,4 +2,4 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.EO05HX7jql0g605A") item = item.toObject() item.system.specification.value = 20 this.actor.createEmbeddedDocuments("Item", [item], {fromEffect : this.effect.id}) -this.script.scriptNotification(item.name + " added") \ No newline at end of file +this.script.notification(item.name + " added") \ No newline at end of file diff --git a/scripts/FPQp6XfbUH1BMafj.js b/scripts/FPQp6XfbUH1BMafj.js new file mode 100644 index 0000000..1266f98 --- /dev/null +++ b/scripts/FPQp6XfbUH1BMafj.js @@ -0,0 +1,7 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Athletics"), {fields : {difficulty : "vhard"}, appendTitle : ` - ${this.effect.name}`}) +await test.roll(); +if (test.failed) +{ + this.actor.addCondition("prone"); + this.script.scriptMessage("Impossible de se déplacer ou d'agir ce tour"); +} \ No newline at end of file diff --git a/scripts/FPYNcxm21678boLT.js b/scripts/FPYNcxm21678boLT.js index ccdea9e..f52f8b0 100644 --- a/scripts/FPYNcxm21678boLT.js +++ b/scripts/FPYNcxm21678boLT.js @@ -3,16 +3,16 @@ if (args.attackerTest.data.preData.characteristic !== "s") return; const SL = args.opposedTest.data.opposeResult.differenceSL; -const targetId = this.effect.getFlag("wfrp4e", "target"); +const targetId = this.effet.getFlag("wfrp4e", "target"); const target = canvas.scene.tokens.get(targetId); if (SL > 4) { - args.opposedTest.data.opposeResult.other.push(`${args.defenderTest.actor.name} a été obligé de lâcher çà ${target.name}.`); - return await this.effect.delete(); + args.opposedTest.data.opposeResult.other.push(`${args.defenderTest.actor.name} a été forcé de laisser partir ${target.name}.`); + return await this.effet.delete(); } if (SL > 0) { - args.opposedTest.data.opposeResult.other.push(`${args.defenderTest.actor.name} a été empêché de presser ${target.name} pour un tour.`); + args.opposedTest.data.opposeResult.other.push(`${args.defenderTest.actor.name} a été empêché de serrer ${target.name} pendant un tour.`); let turns = this.effect.getFlag("wfrp4e", "turns"); this.effect.setFlag("wfrp4e", "turns", turns + 1); } \ No newline at end of file diff --git a/scripts/FSqUqSByMiztYOQM.js b/scripts/FSqUqSByMiztYOQM.js index 6d55901..bddfa30 100644 --- a/scripts/FSqUqSByMiztYOQM.js +++ b/scripts/FSqUqSByMiztYOQM.js @@ -1,2 +1,2 @@ if (args.totalWoundLoss > 0) - this.script.scriptMessage(`Infecté: ${args.actor.name} doit réussir un Test de Résistance Facile (+40) ou recevoir une @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Blessure Purulente}`, {whisper: ChatMessage.getWhisperRecipients("GM") }) \ No newline at end of file + this.script.message(`Infected: ${args.actor.name} must pass an Easy (+40) Résistance Test or gain a @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Festering Wound}`, {whisper: ChatMessage.getWhisperRecipients("GM") }) \ No newline at end of file diff --git a/scripts/FXuyiJoXdAh6WhRK.js b/scripts/FXuyiJoXdAh6WhRK.js deleted file mode 100644 index dc55d15..0000000 --- a/scripts/FXuyiJoXdAh6WhRK.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == "Chevaucher (Cheval)" && game.combat?.active \ No newline at end of file diff --git a/scripts/FYUPfYyTYZkxRLFT.js b/scripts/FYUPfYyTYZkxRLFT.js deleted file mode 100644 index 35e86d3..0000000 --- a/scripts/FYUPfYyTYZkxRLFT.js +++ /dev/null @@ -1 +0,0 @@ -return !["NAME.Endurance", "NAME.Cool"].map(i => game.i18n.localize(i)).includes(args.skill?.name) \ No newline at end of file diff --git a/scripts/FZFOC7bip0oiWEzk.js b/scripts/FZFOC7bip0oiWEzk.js index 9886f41..700aee7 100644 --- a/scripts/FZFOC7bip0oiWEzk.js +++ b/scripts/FZFOC7bip0oiWEzk.js @@ -1,5 +1,5 @@ if (args.opposedTest.result.hitloc.value == this.item.system.location.key && args.totalWoundLoss > 0) { args.actor.addCondition("bleeding", 2); - this.script.scriptNotification("Ajout d'Hémorragie") + this.script.notification("Etat Hémorragique ajouté") } \ No newline at end of file diff --git a/scripts/FbfJjYUyp0ArtZMb.js b/scripts/FbfJjYUyp0ArtZMb.js new file mode 100644 index 0000000..0bee2c1 --- /dev/null +++ b/scripts/FbfJjYUyp0ArtZMb.js @@ -0,0 +1 @@ +args.fields.modifier += 15 \ No newline at end of file diff --git a/scripts/FiD3mvWIBHNNIuO9.js b/scripts/FiD3mvWIBHNNIuO9.js index 6c38499..181bb7e 100644 --- a/scripts/FiD3mvWIBHNNIuO9.js +++ b/scripts/FiD3mvWIBHNNIuO9.js @@ -3,6 +3,6 @@ if (args.opposedTest.result.hitloc.value == "body") if ((await new Roll("1d2").roll()).total == 1) { args.opposedTest.result.hitloc.value = "head" - this.script.scriptMessage(`Localisation changée : Tête`) + this.script.message(`Localisation du coup changé pour la tête`) } } \ No newline at end of file diff --git a/scripts/FkTwk8hfHpRLbAp2.js b/scripts/FkTwk8hfHpRLbAp2.js deleted file mode 100644 index cd051cb..0000000 --- a/scripts/FkTwk8hfHpRLbAp2.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}); -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone") -} \ No newline at end of file diff --git a/scripts/FmLx9pwOkzqqU7Ph.js b/scripts/FmLx9pwOkzqqU7Ph.js deleted file mode 100644 index c54d1df..0000000 --- a/scripts/FmLx9pwOkzqqU7Ph.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Track"); \ No newline at end of file diff --git a/scripts/FqevMs0ukQ9WuUHl.js b/scripts/FqevMs0ukQ9WuUHl.js index 3c05bd9..d352c76 100644 --- a/scripts/FqevMs0ukQ9WuUHl.js +++ b/scripts/FqevMs0ukQ9WuUHl.js @@ -5,5 +5,5 @@ if (this.item.getFlag("wfrp4e", "brittle")) { ChatMessage.create({content: `${this.item.name} shatters!`}) - this.item.update({name : `${this.item.name} (Brisé)`}) + this.item.update({name : `${this.item.name} (Shattered)`}) } \ No newline at end of file diff --git a/scripts/FtZf56VI6Qsspu0D.js b/scripts/FtZf56VI6Qsspu0D.js index dddf87c..b0c2102 100644 --- a/scripts/FtZf56VI6Qsspu0D.js +++ b/scripts/FtZf56VI6Qsspu0D.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpenter)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Métier (Charpentier)'; const difficulty = 'difficult'; const target = 20; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/FttdVBQiNssDAARh.js b/scripts/FttdVBQiNssDAARh.js new file mode 100644 index 0000000..33ed33d --- /dev/null +++ b/scripts/FttdVBQiNssDAARh.js @@ -0,0 +1 @@ +return args.data.targets[0]?.actor?.hasCondition("entangled") \ No newline at end of file diff --git a/scripts/Fu8DTvSgLufcB5mr.js b/scripts/Fu8DTvSgLufcB5mr.js new file mode 100644 index 0000000..58af111 --- /dev/null +++ b/scripts/Fu8DTvSgLufcB5mr.js @@ -0,0 +1,44 @@ +async function rollTable(characteristics, formula, name) { + const roll = new Roll(formula); + await roll.toMessage({flavor: name}); + + const values = roll.dice[0].values; + + for (const value of values) { + let characteristic; + switch (value) { + case 1: case 2: characteristic = "ws"; break; + case 3: case 4: characteristic = "i"; break; + case 5: case 6: characteristic = "int"; break; + case 7: case 8: characteristic = "fel"; break; + case 9: case 10: characteristic = "*"; break; + default: continue; + } + + if (characteristics.has(characteristic)) { + await rollTable(characteristics, "1d10", name); + } else { + characteristics.add(characteristic); + } + } +} + +const characteristics = new Set(); +await rollTable(characteristics, "2d10", this.effet.name) + +if (characteristics.has("*")) { + characteristics.delete("*"); + const availableChoices = foundry.utils.duplicate(game.wfrp4e.config.characteristics); + + for (const ch of characteristics) delete availableChoices[ch]; + + const result = warhammer.apps.ValueDialog.create({ + text: "Choisissez une caractéristique", + }, "", availableChoices); + + if (!result) return; + + characteristics.add(result); +} + +this.effet.setFlag("wfrp4e", "characteristicsToSwap", Array.from(characteristics)); \ No newline at end of file diff --git a/scripts/Fvlc4RkeF4dHjW3m.js b/scripts/Fvlc4RkeF4dHjW3m.js deleted file mode 100644 index 7b1ea9e..0000000 --- a/scripts/Fvlc4RkeF4dHjW3m.js +++ /dev/null @@ -1,16 +0,0 @@ -let caster = this.effect.sourceActor -if (caster && (this.actor.has(game.i18n.localize("NAME.Undead")) || this.actor.has(game.i18n.localize("NAME.Daemonic")))) { - let wp = caster.system.characteristics.wp.value - if (wp > this.actor.system.characteristics.t.value) { - if (this.actor.has(game.i18n.localize("NAME.Unstable"))) { - this.actor.update({ "system.status.wounds.value": 0 }) - this.actor.addCondition("dead") - } - else { - fromUuid("Compendium.wfrp4e-core.items.D0ImWEIMSDgElsnl").then(item => { - this.actor.createEmbeddedDocuments("Item", [item.toObject()], { fromEffect: this.effect.id }) - ChatMessage.create({ content: `Ajout de Instable à ${this.actor.prototypeToken.name}`, speaker: { alias: caster.name } }) - }) - } - } -} \ No newline at end of file diff --git a/scripts/G7sFEnJlXZvfXL3V.js b/scripts/G7sFEnJlXZvfXL3V.js index fe20e58..a7ab1bd 100644 --- a/scripts/G7sFEnJlXZvfXL3V.js +++ b/scripts/G7sFEnJlXZvfXL3V.js @@ -3,10 +3,10 @@ if (this.item.system.quantity.value) this.item.system.reduceQuantity(); let actor = Array.from(game.user.targets)[0]?.actor || this.actor; let effectData = this.item.effects.contents[1].convertToApplied(); - effectData.flags.wfrp4e.sourceItem = this.item.uuid + effectData.system.sourceData.item = this.item.uuid actor.applyEffect({effectData : [effectData]}) } else { - this.script.scriptNotification("Aucun restant!", "error") + this.script.notification("Plus rien !", "error") } \ No newline at end of file diff --git a/scripts/G9ZPojp8qdjiXKZ5.js b/scripts/G9ZPojp8qdjiXKZ5.js new file mode 100644 index 0000000..76f0287 --- /dev/null +++ b/scripts/G9ZPojp8qdjiXKZ5.js @@ -0,0 +1,3 @@ +if (!args.test.preData.options?.masterslayer) return +if (!this.item.equipped.value || !args.test.item) return; +args.test.preData.canReverse = true \ No newline at end of file diff --git a/scripts/GNgMG95jfabBeIwy.js b/scripts/GNgMG95jfabBeIwy.js new file mode 100644 index 0000000..f921857 --- /dev/null +++ b/scripts/GNgMG95jfabBeIwy.js @@ -0,0 +1,4 @@ +if (!this.item.system.qualities.value.find(i => i.name == "fast")) +{ + this.item.system.qualities.value.push({name : "fast"}) +} \ No newline at end of file diff --git a/scripts/GOq4TcnWbfyfCo2V.js b/scripts/GOq4TcnWbfyfCo2V.js deleted file mode 100644 index 72c7243..0000000 --- a/scripts/GOq4TcnWbfyfCo2V.js +++ /dev/null @@ -1,26 +0,0 @@ -this.script.scriptNotification(`Healed ${this.actor.characteristics.t.bonus * 2} Wounds`) -await this.actor.modifyWounds(this.actor.characteristics.t.bonus * 2) - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - Effets secondaires`,fields : {difficulty : "difficult"}}) -await test.roll(); -if (test.failed) -{ - let roll = await new Roll("1d10").roll(); - await roll.toMessage(this.script.getChatData()) - if (roll.total <= 3) - { - this.actor.addCondition("blinded", 3) - } - else if (roll.total <= 6) - { - this.actor.addCondition("broken"); - } - else if (roll.total <= 9) - { - this.actor.addCondition("stunned"); - } - else if (roll.total == 10) - { - this.actor.addConditon("unconscious") - } -} \ No newline at end of file diff --git a/scripts/GRfCxtYzmEx2LYU7.js b/scripts/GRfCxtYzmEx2LYU7.js index 81769f5..8d64bb0 100644 --- a/scripts/GRfCxtYzmEx2LYU7.js +++ b/scripts/GRfCxtYzmEx2LYU7.js @@ -1,9 +1,9 @@ if (args.totalWoundLoss >= 1) { - let roll = await new Roll("1d10").roll(); + let roll = await new Roll("1d10").roll({allowInteractive : false}); await roll.toMessage(this.script.getChatData()); if (roll.total == 9) { - this.script.scriptMessage(`Deux @UUID[Compendium.wfrp4e-eis.actors.iDy8SDTwJSlCzZMl]{Horreurs Bleues de Tzeentch} sortent de la chair hurlante de ${this.actor.name}, le tuant au passage.`, {whisper : ChatMessage.getWhisperRecipients("GM")}) + this.script.message(`Two @UUID[Compendium.wfrp4e-eis.actors.iDy8SDTwJSlCzZMl]{Blue Horror of Tzeentch} claw their way out of ${this.actor.name}'s screaming flesh, killing them in the process.`, {whisper : ChatMessage.getWhisperRecipients("GM")}) } } \ No newline at end of file diff --git a/scripts/GTZUO73pUJKpM1JB.js b/scripts/GTZUO73pUJKpM1JB.js index 3d99c30..744022f 100644 --- a/scripts/GTZUO73pUJKpM1JB.js +++ b/scripts/GTZUO73pUJKpM1JB.js @@ -1,3 +1,3 @@ - let roll = await new Roll("1d10").roll(); + let roll = await new Roll("1d10").roll({allowInteractive : false}); game.dice3d?.showForRoll(roll); - this.script.scriptMessage(await this.actor.applyBasicDamage(roll.total, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})) + this.script.message(await this.actor.applyBasicDamage(roll.total, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})) diff --git a/scripts/GYhPhHIVrhx4pkgF.js b/scripts/GYhPhHIVrhx4pkgF.js new file mode 100644 index 0000000..31e98e7 --- /dev/null +++ b/scripts/GYhPhHIVrhx4pkgF.js @@ -0,0 +1,4 @@ +if (args.combat.combatant.actor.uuid === this.effect.sourceItem.parent.uuid) +{ + this.effect.delete(); +} \ No newline at end of file diff --git a/scripts/GZFsuynUhgZqwTGo.js b/scripts/GZFsuynUhgZqwTGo.js deleted file mode 100644 index bf5a7a7..0000000 --- a/scripts/GZFsuynUhgZqwTGo.js +++ /dev/null @@ -1,10 +0,0 @@ -if (args.totalWoundLoss >= 1) -{ - let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, context: { failure: "Gained a Poisoned Condition", success: "Resisted the poison" }}) - await test.roll(); - if (test.failed) - { - args.actor.addCondition("poisoned"); - } -} - \ No newline at end of file diff --git a/scripts/GbPEy22VuCNzlNv2.js b/scripts/GbPEy22VuCNzlNv2.js deleted file mode 100644 index be6b4de..0000000 --- a/scripts/GbPEy22VuCNzlNv2.js +++ /dev/null @@ -1 +0,0 @@ -return !this.actor.isMounted || (!args.skill?.name?.includes(game.i18n.localize("NAME.Ride")) && !args.options.dodge) \ No newline at end of file diff --git a/scripts/Gc8S5TYlVdV8NnOT.js b/scripts/Gc8S5TYlVdV8NnOT.js deleted file mode 100644 index 154ee3e..0000000 --- a/scripts/Gc8S5TYlVdV8NnOT.js +++ /dev/null @@ -1,8 +0,0 @@ -let test = await args.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : " - " + this.effect.name, context: { failure: "Gained a Broken Condition", success: "Resisted the Broken Condition" } }) - - await test.roll(); - - if (!test.succeeded) - { - args.actor.addCondition("broken"); - } \ No newline at end of file diff --git a/scripts/GePFbu5kp2ymGYEQ.js b/scripts/GePFbu5kp2ymGYEQ.js new file mode 100644 index 0000000..a65aebf --- /dev/null +++ b/scripts/GePFbu5kp2ymGYEQ.js @@ -0,0 +1 @@ +await this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.IAWyzDfC286a9MPz", this.effect); \ No newline at end of file diff --git a/scripts/GjUD5L4h8FXGVgGQ.js b/scripts/GjUD5L4h8FXGVgGQ.js new file mode 100644 index 0000000..bb4d8de --- /dev/null +++ b/scripts/GjUD5L4h8FXGVgGQ.js @@ -0,0 +1 @@ +args.initiative += "+30"; \ No newline at end of file diff --git a/scripts/GjkxWj9wCAclM9WA.js b/scripts/GjkxWj9wCAclM9WA.js index d57eb59..08b43ff 100644 --- a/scripts/GjkxWj9wCAclM9WA.js +++ b/scripts/GjkxWj9wCAclM9WA.js @@ -4,9 +4,9 @@ effects.splice(effects.length - 1); if (effects.length == 0) { - return this.script.scriptNotification("Tous les effets ont été utilisés. Les remettre à 0 pour les utiliser à nouveau") + return this.script.notification("Tous les effets ont été utilisés. Réinitialisez pour les sélectionner à nouveau") } -let choice = await ItemDialog.create(effects, 1, "Choisissez le Pouvoir à gagner"); +let choice = await ItemDialog.create(effects, 1, "Choisir un effet à gagner"); if (choice[0]) { diff --git a/scripts/GsAyB5xnK3ASeoah.js b/scripts/GsAyB5xnK3ASeoah.js index 4b75fa2..cd22f5f 100644 --- a/scripts/GsAyB5xnK3ASeoah.js +++ b/scripts/GsAyB5xnK3ASeoah.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpentry)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Trade (Carpentry)'; const difficulty = 'easy'; const target = 20; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/Gsilp71BmIyHHce6.js b/scripts/Gsilp71BmIyHHce6.js new file mode 100644 index 0000000..8499770 --- /dev/null +++ b/scripts/Gsilp71BmIyHHce6.js @@ -0,0 +1 @@ +args.context.masterslayer = true \ No newline at end of file diff --git a/scripts/GtfHQA9T1ip463le.js b/scripts/GtfHQA9T1ip463le.js new file mode 100644 index 0000000..5e51672 --- /dev/null +++ b/scripts/GtfHQA9T1ip463le.js @@ -0,0 +1 @@ +return !["ws", "bs"].includes(args.characteristic) \ No newline at end of file diff --git a/scripts/GuSIY4Zqhc68qVEH.js b/scripts/GuSIY4Zqhc68qVEH.js new file mode 100644 index 0000000..93de7b4 --- /dev/null +++ b/scripts/GuSIY4Zqhc68qVEH.js @@ -0,0 +1,6 @@ +if (!args.messageSent) +{ + args.messageSent = true; + let runes = this.item.effects.contents.filter(i => i.name == this.effect.name); + this.script.message(`${args.attacker.speaker.alias} reduce Run speed by ${runes.length * 4} yds.`) +} \ No newline at end of file diff --git a/scripts/GzSFlqL1YrIK1dxh.js b/scripts/GzSFlqL1YrIK1dxh.js index 77201c3..a5c3c2c 100644 --- a/scripts/GzSFlqL1YrIK1dxh.js +++ b/scripts/GzSFlqL1YrIK1dxh.js @@ -7,10 +7,9 @@ let items = await Promise.all(["Compendium.wfrp4e-wom.items.Item.EjGYZ4CgX2jZW7O "Compendium.wfrp4e-wom.items.Item.CkMYRYCLrkMnyVm5", "Compendium.wfrp4e-wom.items.Item.0Xdm4r7l2EwC4fcg"].map(fromUuid)); -let choice = await game.wfrp4e.apps.ItemDialog.create(items, 1, "Sélectionner le Vent") +let choice = await game.wfrp4e.apps.ItemDialog.create(items, 1, "Sélectionner un Vent") //this.actor.createEmbeddedDocuments("Item", items); this.item.update(choice[0]?.toObject(), {diff: false, recursive : false}); //this.actor.items.getName(this.effect.item.name).delete() // For some reason this.effect.item.delete() throws an error - diff --git a/scripts/GzsuEg7gZy1f0ljy.js b/scripts/GzsuEg7gZy1f0ljy.js index 48f3dfe..320c5bd 100644 --- a/scripts/GzsuEg7gZy1f0ljy.js +++ b/scripts/GzsuEg7gZy1f0ljy.js @@ -1,10 +1,10 @@ let bleeding = this.actor.hasCondition("bleeding") if (bleeding) { - this.script.scriptNotification(`Suppression de ${bleeding.conditionValue} états Hémorragiques`) - bleeding.delete(); + this.script.notification(`Suppression de ${bleeding.conditionValue} états Hémorragique`) + Saignement.delete(); } -else +else { - this.script.scriptNotification(`Aucune Hémorragie`) + this.script.notification(`Aucun état Hémorragique`) } \ No newline at end of file diff --git a/scripts/H06Ysj7oPiemW7S6.js b/scripts/H06Ysj7oPiemW7S6.js index 518fffb..84c6ea5 100644 --- a/scripts/H06Ysj7oPiemW7S6.js +++ b/scripts/H06Ysj7oPiemW7S6.js @@ -14,5 +14,5 @@ if (args.test.options.income && !args.test.options.criminal) let moneyString = `${moneyEarned}${coin}` let transactionString = `${moneyEarned}${term}` - this.script.scriptMessage(`Gain d'un supplément de ${game.wfrp4e.market.amountToString(game.wfrp4e.market.parseMoneyTransactionString(transactionString))}`, {whisper : ChatMessage.getWhisperRecipients("GM")}) + this.script.message(`Gain additionnel de ${game.wfrp4e.market.amountToString(game.wfrp4e.market.parseMoneyTransactionString(transactionString))}`, {whisper : ChatMessage.getWhisperRecipients("GM")}) } \ No newline at end of file diff --git a/scripts/H2CJvApKMnfGNNoo.js b/scripts/H2CJvApKMnfGNNoo.js deleted file mode 100644 index 39d38a9..0000000 --- a/scripts/H2CJvApKMnfGNNoo.js +++ /dev/null @@ -1,7 +0,0 @@ - if (args.test.item?.type == "skill" && args.test.item.name.includes(game.i18n.localize("NAME.Stealth"))) -{ - args.test.result.description = "Echech Stupéfiant"; - args.test.result.outcome = "failure"; - ChatMessage.create({content : "SQUEAK", speaker : ChatMessage.getSpeaker({token: this.actor.getActiveTokens()[0]?.document, actor: this.actor})}, {chatBubble : true}) - AudioHelper.play({ src: `${game.settings.get("wfrp4e", "soundPath")}squeek.wav` }, true); -} \ No newline at end of file diff --git a/scripts/H3pZ9UeIzIz3luKh.js b/scripts/H3pZ9UeIzIz3luKh.js index 70f99c0..e277e69 100644 --- a/scripts/H3pZ9UeIzIz3luKh.js +++ b/scripts/H3pZ9UeIzIz3luKh.js @@ -2,4 +2,4 @@ args.actor.addCondition("bleeding") this.actor.setFlag("wfrp4e", "isAttached", args.actor.name) -this.script.scriptMessage(`Affecté à ${args.actor.name}`) \ No newline at end of file +this.script.message(`Attaches to ${args.actor.name}`) \ No newline at end of file diff --git a/scripts/H85k4L3yICm7cfIk.js b/scripts/H85k4L3yICm7cfIk.js index 5a12712..da69535 100644 --- a/scripts/H85k4L3yICm7cfIk.js +++ b/scripts/H85k4L3yICm7cfIk.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Voile'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Voile'; const difficulty = 'easy'; const target = 10; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/H8jDtK1Ewn4hL3A1.js b/scripts/H8jDtK1Ewn4hL3A1.js new file mode 100644 index 0000000..bae8485 --- /dev/null +++ b/scripts/H8jDtK1Ewn4hL3A1.js @@ -0,0 +1 @@ +args.fields.slBonus += 4; \ No newline at end of file diff --git a/scripts/HASsi6wYHVALExWq.js b/scripts/HASsi6wYHVALExWq.js deleted file mode 100644 index 7b94541..0000000 --- a/scripts/HASsi6wYHVALExWq.js +++ /dev/null @@ -1,14 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, context: { failure: "1 Point de Corruption Point gagné" } }) -await test.roll(); - -if (test.failed && args.actor.type == "character") -{ - let msg = "" - msg += `

    ${this.actor.prototypeToken.name} gagne 1 Point de Corruption

    ` - if (test.result.roll % 11 == 0 || test.result.roll == 100) - { - msg += `${args.actor.prototypeToken.name} gagne une mutation (@Table[expandedmutatephys]{Physique} ou @Table[expandedmutatemental]{Mentale}) et gagne @UUID[Compendium.wfrp4e-core.items.hiU7vhBOVpVI8c7C]{Magie du Chaos (Tzeentch)}` - } - this.script.scriptMessage(msg, {whisper : ChatMessage.getWhisperRecipients("GM")}) - await this.actor.update({ "system.status.corruption.value": parseInt(args.actor.status.corruption.value) + 1 }) -} \ No newline at end of file diff --git a/scripts/HG2fKOfruT5QV3A4.js b/scripts/HG2fKOfruT5QV3A4.js index 55e63df..72b6a34 100644 --- a/scripts/HG2fKOfruT5QV3A4.js +++ b/scripts/HG2fKOfruT5QV3A4.js @@ -1,4 +1,4 @@ -let lore = await ValueDialog.create({text : "Choisissez Lore", title : "Lore"}, "", {"fire" : "Feu", "death" : "Mort", "metal" : "Métal", "shadow" : "Ombres"}); +let lore = await ValueDialog.create({text : "Choisissez un Savoir", title : "Savoir"}, "", {"fire" : "Fire", "death" : "Death", "metal" : "Metal", "shadow" : "Discret"}); let filters = [ { @@ -11,7 +11,7 @@ let filters = [ } ] -let petty = await ItemDialog.createFromFilters(filters, 3, "Choisissez 3 Sorts de Magie Mineure") +let petty = await ItemDialog.createFromFilters(filters, 3, {text: "Choisissez 3 Sorts Mineurs"}) filters = [ @@ -25,7 +25,7 @@ filters = [ } ] -let arcane = await ItemDialog.createFromFilters(filters, 6, "Choisissez 6 Sorts de Magie d'Arcane") +let arcane = await ItemDialog.createFromFilters(filters, 6, {text: "Choisissez 6 Sorts d'Arcane"}) let items = petty.map(i => i.toObject()).concat(arcane.map(i => { let spell = i.toObject(); diff --git a/scripts/HJ2X4ZtXei0BXbxf.js b/scripts/HJ2X4ZtXei0BXbxf.js index 12d88ba..85f0b0b 100644 --- a/scripts/HJ2X4ZtXei0BXbxf.js +++ b/scripts/HJ2X4ZtXei0BXbxf.js @@ -1,9 +1,9 @@ let choices = await Promise.all([warhammer.utility.findItemId("PzimjNx9Ojq4g6mV"), warhammer.utility.findItemId("rOPmyLWa37e7s9v6")]) - let items = await game.wfrp4e.apps.ItemDialog.create(choices, 1, "Choisissez a Skill") + let items = await game.wfrp4e.apps.ItemDialog.create(choices, 1, "Choisir une Compétence") items = items.map(i => i.toObject()) items.forEach(i => i.system.advances.value = 20) -items.forEach(i => i.system.equipped.value = true;) +items.forEach(i => i.system.equipped.value = true) this.actor.createEmbeddedDocuments("Item", items); diff --git a/scripts/HKhyn0kijKfzW6cw.js b/scripts/HKhyn0kijKfzW6cw.js deleted file mode 100644 index bb191fa..0000000 --- a/scripts/HKhyn0kijKfzW6cw.js +++ /dev/null @@ -1,3 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "hard"}}) -await test.roll(); -this.item.updateSource({"flags.wfrp4e.passed" : test.succeeded}) \ No newline at end of file diff --git a/scripts/HMC6hPND9DWLFfZE.js b/scripts/HMC6hPND9DWLFfZE.js deleted file mode 100644 index 61a0bb8..0000000 --- a/scripts/HMC6hPND9DWLFfZE.js +++ /dev/null @@ -1,43 +0,0 @@ -if (this.item.name.includes("(")) -{ - return; -} - -let index = game.packs -.filter(i => i.metadata.type == "Item") -.reduce((acc, pack) => acc.concat(pack.index.contents), []) -.filter(i => i.type == "skill" && i.name.includes(game.i18n.localize("NAME.Lore"))) -.map(i => { - i.id = i._id - return i -}) - -let choice = await ItemDialog.create(index, 1, "Choisir un Savoir") -let text; -if (!choice[0]) -{ - let custom = await Dialog.wait({ - title : "Saisir le savoir", - content : "", - buttons : { - confirm : { - label : game.i18n.localize("Confirmer"), - callback : (dlg) => { - return dlg.find("input")[0].value - } - } - }, - default : "confirm", - close : () => { - return "" - } - }) - text = custom || "" -} -else -{ - text = game.wfrp4e.utility.extractParenthesesText(choice[0].name) -} - -await this.item.updateSource({name : this.item.name + ` (${text})`, "system.tests.value" : this.item.system.tests.value.replace("chosen Lore", text)}) -await this.effect.updateSource({name : this.effect.name + ` (${text})`}) \ No newline at end of file diff --git a/scripts/HUKzssLxeQo1wbx9.js b/scripts/HUKzssLxeQo1wbx9.js deleted file mode 100644 index e1129c3..0000000 --- a/scripts/HUKzssLxeQo1wbx9.js +++ /dev/null @@ -1,9 +0,0 @@ - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), { fields: { difficulty: "average" }, appendTitle: " - - Blessé" }) -await test.roll(); -if (test.failed) { - fromUuid("Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb").then(disease => { - this.actor.createEmbeddedDocuments("Item", [disease.toObject()]) - this.script.scriptNotification("Gain de " + disease.name) - }) -} diff --git a/scripts/HYrl5aNMm8BAdqH7.js b/scripts/HYrl5aNMm8BAdqH7.js index 2a4f990..b628745 100644 --- a/scripts/HYrl5aNMm8BAdqH7.js +++ b/scripts/HYrl5aNMm8BAdqH7.js @@ -1,7 +1,8 @@ -let modifier = 0 -if (this.effect.name.includes("Moderate")) - modifier = -20 -else - modifier = -10 -args.fields.modifier += modifier + let modifier = 0 + if (this.effect.name.includes("Moderate")) + modifier = -20 + else + modifier = -10 + args.fields.modifier += modifier + \ No newline at end of file diff --git a/scripts/Hcpn1gU58DIKIhty.js b/scripts/Hcpn1gU58DIKIhty.js deleted file mode 100644 index 2ae5ada..0000000 --- a/scripts/Hcpn1gU58DIKIhty.js +++ /dev/null @@ -1,4 +0,0 @@ -if (args.item.type == "skill" && args.item.name == "Corps à corps (Fléau)") -{ - args.item.system.modifier.value += 10; -} \ No newline at end of file diff --git a/scripts/HdTuY2IGhdlMDOy3.js b/scripts/HdTuY2IGhdlMDOy3.js deleted file mode 100644 index 8722785..0000000 --- a/scripts/HdTuY2IGhdlMDOy3.js +++ /dev/null @@ -1,12 +0,0 @@ -if (this.actor.system.details.experience.current < 100) { - return this.script.notification(game.i18n.localize("SCRIPT.NotEnoughXP")) -} - -let item = await game.wfrp4e.utility.findItem("Animal Telepathy", "trait") -this.actor.createEmbeddedDocuments("Item", [item]); -let expLog = foundry.utils.duplicate(this.actor.details.experience.log || []); -expLog.push({amount : 100, reason: item.name, spent: this.actor.details.experience.spent + 100, total: this.actor.details.experience.total, type: "spent"}); -this.actor.update({ - "system.details.experience.spent": this.actor.details.experience.spent + 100, - "system.details.experience.log": expLog - }); \ No newline at end of file diff --git a/scripts/HfCxNd7mFGZH4s9Y.js b/scripts/HfCxNd7mFGZH4s9Y.js deleted file mode 100644 index 07fcf28..0000000 --- a/scripts/HfCxNd7mFGZH4s9Y.js +++ /dev/null @@ -1,13 +0,0 @@ -// An opponent that takes more than a single Wound from a Warp Blade strike -// in melee combat must make an Average (+20) Endurance Test -// or take a Stunned Condition - - -if (args.totalWoundLoss > 1) { - let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) - await test.roll(); - if(test.failed) - { - await args.actor.addCondition("stunned"); - } -} \ No newline at end of file diff --git a/scripts/HfZAQWoY8n3clLlo.js b/scripts/HfZAQWoY8n3clLlo.js deleted file mode 100644 index 12e941d..0000000 --- a/scripts/HfZAQWoY8n3clLlo.js +++ /dev/null @@ -1,6 +0,0 @@ -if (!args.itemCreated) return; -if (args.itemCreated.type !== "critical") return; -if (args.itemCreated.system.location.value.toLowerCase() !== "head") return; -if (Number(args.itemCreated.system.wounds.value) > 0) { - this.script.message(game.i18n.format("SCRIPT.Sallet", {name: args.itemCreated.parent.name, wounds: args.itemCreated.system.wounds.value})) -} \ No newline at end of file diff --git a/scripts/HgzIi6m6dkXbVWHp.js b/scripts/HgzIi6m6dkXbVWHp.js new file mode 100644 index 0000000..41980f1 --- /dev/null +++ b/scripts/HgzIi6m6dkXbVWHp.js @@ -0,0 +1,5 @@ +if (args.test.skill?.name == "Calme") +{ + args.test.preData.roll = 1; + args.test.preData.other.push(this.effect.name) +} \ No newline at end of file diff --git a/scripts/Hi005w1Ul17Q8Uty.js b/scripts/Hi005w1Ul17Q8Uty.js new file mode 100644 index 0000000..965eb5d --- /dev/null +++ b/scripts/Hi005w1Ul17Q8Uty.js @@ -0,0 +1,6 @@ +let test = this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : "average"}, appendTitle : ` - ${this.effect.name}`}) +await test.roll(); +if (test.succeeded) +{ + this.effect.delete() +} \ No newline at end of file diff --git a/scripts/HiMBS6GeOwEydWYN.js b/scripts/HiMBS6GeOwEydWYN.js deleted file mode 100644 index 9ad95cd..0000000 --- a/scripts/HiMBS6GeOwEydWYN.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Climb"); \ No newline at end of file diff --git a/scripts/HmImVzvw6ecBy99l.js b/scripts/HmImVzvw6ecBy99l.js index efbb97e..f285e08 100644 --- a/scripts/HmImVzvw6ecBy99l.js +++ b/scripts/HmImVzvw6ecBy99l.js @@ -1,5 +1,5 @@ -if (args.opposedTest.result.hitloc.value == "body" && args.totalWoundLoss > 0) +if (args.opposedTest.result.hitloc.value == "body" && args.totalWoundLoss > 0) { args.actor.addCondition("bleeding", 2) - this.script.scriptNotification("Ajout Hémorragique") + this.script.notification("Etat Hémmoragique appliqué : 2 niveaux de saignement") } \ No newline at end of file diff --git a/scripts/HrOBAXsEX073ReKl.js b/scripts/HrOBAXsEX073ReKl.js deleted file mode 100644 index e799170..0000000 --- a/scripts/HrOBAXsEX073ReKl.js +++ /dev/null @@ -1,21 +0,0 @@ -let skill = `${game.i18n.localize("NAME.Entertain")} (${game.i18n.localize("SPEC.Singing")})`; -let currentCareer = this.actor.system.currentCareer; -let existingSkill = this.actor.itemTypes.skill.find(i => i.name == skill); - -if (!currentCareer) return - - -let inCurrentCareer = currentCareer.system.skills.concat(currentCareer.system.addedSkills).includes(skill); -let perfectPitchAdded = this.actor.getFlag("wfrp4e", "perfectPitchAdded") || {}; -if (existingSkill && inCurrentCareer && !perfectPitchAdded[existingSkill.name]) -{ - existingSkill.system.advances.costModifier = -5; -} -else -{ - perfectPitchAdded[skill] = true; - currentCareer.system.addedSkills.push(skill); - foundry.utils.setProperty(this.actor, "flags.wfrp4e.perfectPitchAdded", perfectPitchAdded) -} - - diff --git a/scripts/I2I4ZJjN3EUSow0t.js b/scripts/I2I4ZJjN3EUSow0t.js new file mode 100644 index 0000000..5bb5da2 --- /dev/null +++ b/scripts/I2I4ZJjN3EUSow0t.js @@ -0,0 +1,3 @@ +return args.item?.system?.attackType != "ranged" + || this.item != args.item + || this.actor.isOpposing \ No newline at end of file diff --git a/scripts/I67tdJctEqXSQPE0.js b/scripts/I67tdJctEqXSQPE0.js new file mode 100644 index 0000000..12502ef --- /dev/null +++ b/scripts/I67tdJctEqXSQPE0.js @@ -0,0 +1 @@ +this.effect.update({"disabled": false}) \ No newline at end of file diff --git a/scripts/I79D8V8OFzMCtL40.js b/scripts/I79D8V8OFzMCtL40.js new file mode 100644 index 0000000..ef308df --- /dev/null +++ b/scripts/I79D8V8OFzMCtL40.js @@ -0,0 +1,2 @@ +const target = await ValueDialog.create({title: "Sélectionnez une Cible", text: "Sélectionnez une Cible pour la Haine"}, "Target"); +await this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.5hH73j2NgPdsLCZN", this.effect, {name: `Hatred (${target})`}); \ No newline at end of file diff --git a/scripts/I7ieW0hNYvvX0KFg.js b/scripts/I7ieW0hNYvvX0KFg.js deleted file mode 100644 index 5327a98..0000000 --- a/scripts/I7ieW0hNYvvX0KFg.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Heal"); \ No newline at end of file diff --git a/scripts/I8JS4z90PtWIG2nb.js b/scripts/I8JS4z90PtWIG2nb.js new file mode 100644 index 0000000..4b65bbd --- /dev/null +++ b/scripts/I8JS4z90PtWIG2nb.js @@ -0,0 +1 @@ +return this.actor.hasCondition("prone") \ No newline at end of file diff --git a/scripts/I9QAPKbaXwMMMBT4.js b/scripts/I9QAPKbaXwMMMBT4.js deleted file mode 100644 index 9e6f662..0000000 --- a/scripts/I9QAPKbaXwMMMBT4.js +++ /dev/null @@ -1,17 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty: "average"}, skipTargets: true, appendTitle : " - " + this.effect.name}) -await test.roll(); -if(test.failed) -{ - await this.actor.addCondition("stunned"); - let secondTest = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty: "easy"}, skipTargets: true, appendTitle : " - Despair"}) - await secondTest.roll(); - if(secondTest.failed) - { - this.effect.updateSource({name : "Taste of Death"}) - await this.actor.addCondition("fatigued"); - } - else - { - return false; - } -} \ No newline at end of file diff --git a/scripts/IAGla7HJlYN0wa4H.js b/scripts/IAGla7HJlYN0wa4H.js index 0a26102..dc38be0 100644 --- a/scripts/IAGla7HJlYN0wa4H.js +++ b/scripts/IAGla7HJlYN0wa4H.js @@ -1,8 +1,8 @@ -if (args.test.characteristicKey == "wp") +if (args.test.characteristicKey == "wp") { - if (args.test.failed) + if (args.Test.Échoué) { this.actor.addSystemEffect("convulsions") - this.script.scriptMessage(`Test de Force Mentale échoué, ${this.actor.prototypeToken.name} subit des @Symptom[Convulsions] pour [[1d10]] heures`) + this.script.message(`Test de FM échoué, ${this.actor.prototypeToken.name} reçoit @Symptom[Convulsions] pour [[1d10]] heures`) } } \ No newline at end of file diff --git a/scripts/ID8mCcjkl7PCQhDq.js b/scripts/ID8mCcjkl7PCQhDq.js deleted file mode 100644 index 4691ac9..0000000 --- a/scripts/ID8mCcjkl7PCQhDq.js +++ /dev/null @@ -1,8 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Dodge"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); - -if(test.failed) -{ - let damage = this.effect.sourceItem.system.computeSpellDamage("3", true); - this.script.scriptMessage(await this.actor.applyBasicDamage(damage, {suppressMsg: true, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP})) -} \ No newline at end of file diff --git a/scripts/IDvpVMkR2HXoNpPp.js b/scripts/IDvpVMkR2HXoNpPp.js new file mode 100644 index 0000000..4a52ac8 --- /dev/null +++ b/scripts/IDvpVMkR2HXoNpPp.js @@ -0,0 +1 @@ +return args.skill?.name !== "Esquive"; \ No newline at end of file diff --git a/scripts/IEDJHIYaZLhmrK4X.js b/scripts/IEDJHIYaZLhmrK4X.js new file mode 100644 index 0000000..4162a66 --- /dev/null +++ b/scripts/IEDJHIYaZLhmrK4X.js @@ -0,0 +1 @@ +return !["weapon", "cast"].includes(args.type) || (!this.item.equipped.value) \ No newline at end of file diff --git a/scripts/IFXsTRAVDUeVvcRc.js b/scripts/IFXsTRAVDUeVvcRc.js new file mode 100644 index 0000000..fd0df89 --- /dev/null +++ b/scripts/IFXsTRAVDUeVvcRc.js @@ -0,0 +1,7 @@ +let roll = await new Roll("1d100") +await roll.evaluate() +await roll.toMessage({"flavor": `Wyssan's Dice Reversal`}) + +if (roll.result % 11 === 0 || roll.result === 100) { + await this.item.setFlag("world", "inert", true) +} \ No newline at end of file diff --git a/scripts/ILqHxk7deotgI3KD.js b/scripts/ILqHxk7deotgI3KD.js index fdb8958..2fc1245 100644 --- a/scripts/ILqHxk7deotgI3KD.js +++ b/scripts/ILqHxk7deotgI3KD.js @@ -5,6 +5,6 @@ let reach = args.item.reach.value let reachNum = game.wfrp4e.config.reachNum[reach] reachNum = Math.min(reachNum + 2, 7) -let key = game.wfrp4e.utility.findKey(reachNum, game.wfrp4e.config.reachNum) +let key = warhammer.utility.findKey(reachNum, game.wfrp4e.config.reachNum) args.item.reach.value = key \ No newline at end of file diff --git a/scripts/IM8nRo6Jx2I8RJ0L.js b/scripts/IM8nRo6Jx2I8RJ0L.js new file mode 100644 index 0000000..3588d04 --- /dev/null +++ b/scripts/IM8nRo6Jx2I8RJ0L.js @@ -0,0 +1 @@ +return (args.item?.skillToUse?.name == args.skill?.name) \ No newline at end of file diff --git a/scripts/IPPDvZdE8kn3H9z7.js b/scripts/IPPDvZdE8kn3H9z7.js deleted file mode 100644 index 624ce26..0000000 --- a/scripts/IPPDvZdE8kn3H9z7.js +++ /dev/null @@ -1,7 +0,0 @@ -let test = await this.actor.setupSkill("Esquive", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}); -await test.roll(); - -if (test.failed) -{ - await this.actor.addCondition("grappling") -} \ No newline at end of file diff --git a/scripts/IR5URcjnCuWBFMoN.js b/scripts/IR5URcjnCuWBFMoN.js deleted file mode 100644 index 27b41b0..0000000 --- a/scripts/IR5URcjnCuWBFMoN.js +++ /dev/null @@ -1,15 +0,0 @@ -// If a full dose is imbibed, -// the victim must pass a Hard (-20) Endurance Test. - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty: "hard"}}) -await test.roll() -if (test.failed) -{ - this.script.scriptMessage(`

    ${this.actor.prototypeToken.name} Jo ne remarque rien d'anormal si ce n'est qu'ils se fatiguent un peu plus tôt que d'habitude. À ce stade, il est encore possible de sauver la victime via un antidote puissant ou des moyens magiques.

    -

    Cependant, une fois qu’ils s’endorment, c’est presque impossible. À ce stade, la victime doit effectuer un test d'Endurance difficile (-20). S'il échoue, il ne se réveille jamais.

    `, - { - whisper: ChatMessage.getWhisperRecipients("GM"), - blind: true - }) -} -return test.failed; \ No newline at end of file diff --git a/scripts/IXXrxNSLqXEqtuDU.js b/scripts/IXXrxNSLqXEqtuDU.js new file mode 100644 index 0000000..ae08c25 --- /dev/null +++ b/scripts/IXXrxNSLqXEqtuDU.js @@ -0,0 +1,3 @@ +if (args.actor.details.move.value > 1) { + args.actor.details.move.value -= 1 +} \ No newline at end of file diff --git a/scripts/IfEu1hO8sKEZBpvg.js b/scripts/IfEu1hO8sKEZBpvg.js index 0b53314..b4078a7 100644 --- a/scripts/IfEu1hO8sKEZBpvg.js +++ b/scripts/IfEu1hO8sKEZBpvg.js @@ -4,11 +4,12 @@ let name = this.actor.prototypeToken.name if (game.user.isGM && game.user.targets.size) { game.user.targets.forEach(t => { - t.actor.applyFear(value, name) + t.actor.applyPeur(value, name) }) - game.user.updateTokenTargets([]); + game.canvas.tokens.setTargets([]) + } else { - game.wfrp4e.utility.postFear(value, name) + game.wfrp4e.utility.postPeur(value, name) } \ No newline at end of file diff --git a/scripts/IhoCoul5okDx0jBa.js b/scripts/IhoCoul5okDx0jBa.js new file mode 100644 index 0000000..229ac2c --- /dev/null +++ b/scripts/IhoCoul5okDx0jBa.js @@ -0,0 +1,7 @@ +if (args.test.weapon.properties.qualities?.blast) { + args.test.weapon.properties.qualities.blast.value ++; + if (args.test.options.shortfuse) { + args.test.result.other.push (`${this.effect.name}: Blast Rating increased`) + } + args.test.options.shortfuse = true +} \ No newline at end of file diff --git a/scripts/IkVcIRmmgQjsBUUf.js b/scripts/IkVcIRmmgQjsBUUf.js new file mode 100644 index 0000000..0be1937 --- /dev/null +++ b/scripts/IkVcIRmmgQjsBUUf.js @@ -0,0 +1,8 @@ +let roll = await new Roll("1d100") +await roll.evaluate() +await roll.toMessage({"flavor": `Wyssan's Dice Reversal`}) + +if (roll.result % 11 === 0 || roll.result === 100) { + await this.item.setFlag("world", "inert", true) + this.script.message(`${this.item.name} loses its magical properties`, {blind: true, whisper: ChatMessage.getWhisperRecipients("GM")}) +} \ No newline at end of file diff --git a/scripts/IrkWq7IiFS65bTvC.js b/scripts/IrkWq7IiFS65bTvC.js index 0b5a84a..fabbd2a 100644 --- a/scripts/IrkWq7IiFS65bTvC.js +++ b/scripts/IrkWq7IiFS65bTvC.js @@ -2,6 +2,6 @@ if (this.actor.flags.holed.half !== true) return; if (this.actor.flags.holed.reminded === true) return; const speaker = ChatMessage.getSpeaker({actor: this.actor}); -this.script.scriptMessage(`

    ${speaker.alias} tombe lourdements dans l'eau. A moins que la cargaison soit étanche, elle perd [[d10]]% de sa valeur.

    `); +this.script.message(`

    ${speaker.alias} sits heavily in the water. Unless the cargo is waterproof, it loses [[d10]]% of its value.

    `); this.actor.flags.holed.reminded = true; \ No newline at end of file diff --git a/scripts/IsLAvY9ikR1cOJWw.js b/scripts/IsLAvY9ikR1cOJWw.js deleted file mode 100644 index c5a06ce..0000000 --- a/scripts/IsLAvY9ikR1cOJWw.js +++ /dev/null @@ -1 +0,0 @@ -return !["NAME.Row", "NAME.Swim"].map(i => game.i18n.localize(i)).includes(args.skill?.name); \ No newline at end of file diff --git a/scripts/IupskvzvoGyD2H5o.js b/scripts/IupskvzvoGyD2H5o.js index c0fa0e1..d104a14 100644 --- a/scripts/IupskvzvoGyD2H5o.js +++ b/scripts/IupskvzvoGyD2H5o.js @@ -3,30 +3,37 @@ if (this.actor.type != "character") return; } -let god = await ValueDialog.create({text : "Enter a Deity", title : "Blessed"}) +let god = await ValueDialog.create({text : "Choisissez un Dieu", title : "Béni"}) if (god) { - let prayers = await warhammer.utility.findAllItems("prayer", "Loading Prayers") + let prayers = await warhammer.utility.findAllItems("prayer", "Chargement des Prières", true, ["system.type.value", "system.god.value"]) let blessings = prayers.filter(p => p.system.god.value.split(",").map(i => i.trim().toLowerCase()).includes(god.toLowerCase()) && p.system.type.value == "blessing") - let godBlessings = game.wfrp4e.config.godBlessings[god.toLowerCase()] || []; - if (god == "Old Faith") + let configBlessings = await Promise.tout((game.wfrp4e.config.godBlessings[god.toLowerCase()] || []).map(fromUuid)); + if (god == "Foi Antique") { - blessings = await ItemDialog.create(prayers.filter(i => i.system.type.value == "blessing"), 6, {text : "Select any 6 Blessings", title : "Blessed"}) + blessings = await ItemDialog.create(prayers.filter(i => i.system.type.value == "blessing"), 6, {text : "Sélectionnez 6 Bénédictions", title : "Béni"}) } - if (godBlessings.length) + if (configBlessings.length) { - blessings = blessings.concat(await Promise.all(godBlessings.filter(bls => !(blessings.map(i => i.uuid).includes(bls.uuid))).map(fromUuid))); + // Combine blessings defined by config with actual blessing items found that specify this god, avoiding duplicates + blessings = blessings.concat( + configBlessings.map(i => {return {uuid : i.uuid, name : i.name}}) + .filter(bls => !(blessings.find(i => i.uuid == bls.uuid))) + ); } if (blessings.length) { - this.script.notification("Adding " + blessings.map(i => i.name).join(", ")) - await this.actor.createEmbeddedDocuments("Item", blessings, {fromEffect : this.effect.id}) + this.script.scriptNotification("Ajout de " + blessings.map(i => i.name).join(", ")) + await this.actor.addEffectItems(blessings.map(i => i.uuid), this.effet) } - else + else { - this.script.notification(`Impossible de trouver any Blessings associated with ${god}.`) + this.script.scriptNotification(`Impossible de trouver des Bénédictions associées à ${god}.`) } - this.item.updateSource({name : this.item.name.replace("Any", god)}) + if (this.item.name.includes("Au choix")) + this.item.updateSource({name: this.item.name.replace("Au choix", god)}); + else + this.item.updateSource({name: this.item.name + ` (${god})`}); await this.actor.update({"system.details.god.value": god}) } \ No newline at end of file diff --git a/scripts/IurWrdbjsmMtTWuq.js b/scripts/IurWrdbjsmMtTWuq.js new file mode 100644 index 0000000..e468d7b --- /dev/null +++ b/scripts/IurWrdbjsmMtTWuq.js @@ -0,0 +1 @@ +return !this.actor.hasCondition("prone") \ No newline at end of file diff --git a/scripts/IuxMr6SFdJhqFtVD.js b/scripts/IuxMr6SFdJhqFtVD.js new file mode 100644 index 0000000..edfbbb6 --- /dev/null +++ b/scripts/IuxMr6SFdJhqFtVD.js @@ -0,0 +1 @@ +this.actor.system.status.corruption.value += 3 \ No newline at end of file diff --git a/scripts/IzoOmDywGLqLNljN.js b/scripts/IzoOmDywGLqLNljN.js index 8a5b8ac..ccfd0e6 100644 --- a/scripts/IzoOmDywGLqLNljN.js +++ b/scripts/IzoOmDywGLqLNljN.js @@ -6,7 +6,7 @@ if (!currentCareer) return let inCurrentCareer = currentCareer.system.skills.concat(currentCareer.system.addedSkills).includes(skill); -let witchAdded = actor.getFlag("wfrp4e", "witchAdded") || {}; +let witchAdded = this.actor.getFlag("wfrp4e", "witchAdded") || {}; if (existingSkill && inCurrentCareer && !witchAdded[existingSkill.name]) { existingSkill.system.advances.costModifier = -5; diff --git a/scripts/J0IWUhxada2ONowP.js b/scripts/J0IWUhxada2ONowP.js deleted file mode 100644 index 29356a0..0000000 --- a/scripts/J0IWUhxada2ONowP.js +++ /dev/null @@ -1 +0,0 @@ - return args.skill?.name == "Divertissement (Chant)" || args.skill?.name == "Divertissement (Chanter)" || (args.skill?.name.includes("Langue") && (args.skill?.name.includes("Magick") || args.skill?.name.includes("Elthárin") || args.skill?.name.includes("Cathayan"))) \ No newline at end of file diff --git a/scripts/J8k4ahQdZhXDfU1l.js b/scripts/J8k4ahQdZhXDfU1l.js new file mode 100644 index 0000000..1444b9f --- /dev/null +++ b/scripts/J8k4ahQdZhXDfU1l.js @@ -0,0 +1 @@ +return args.skill?.name == "Runesmithing" \ No newline at end of file diff --git a/scripts/JBoKPBr27C3PMoSD.js b/scripts/JBoKPBr27C3PMoSD.js deleted file mode 100644 index c1ae1c1..0000000 --- a/scripts/JBoKPBr27C3PMoSD.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name === game.i18n.localize("NAME.Navigation"); \ No newline at end of file diff --git a/scripts/JEbs0WlqhKNDOo5A.js b/scripts/JEbs0WlqhKNDOo5A.js deleted file mode 100644 index 83eb600..0000000 --- a/scripts/JEbs0WlqhKNDOo5A.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "hard"}}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("unconscious") -} diff --git a/scripts/JQruHprM5R5vZ9DA.js b/scripts/JQruHprM5R5vZ9DA.js deleted file mode 100644 index 7506452..0000000 --- a/scripts/JQruHprM5R5vZ9DA.js +++ /dev/null @@ -1,10 +0,0 @@ -let caster = this.effect.sourceActor; -if (caster) -{ - let healed= caster.system.characteristics.wp.bonus + caster.system.characteristics.int.bonus - await this.actor.modifyWounds(healed); - this.script.scriptMessage(`${this.actor.prototypeToken.name} guéri ${healed} Blessures`) -} - - let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "vhard"}, context : {success : "1 Point de Corruption gagné durant la dernière heure doit être supprimé.", failure: "Rien ne se passe"}}) - await test.roll(); \ No newline at end of file diff --git a/scripts/JXBUE0XuJOJNG7zE.js b/scripts/JXBUE0XuJOJNG7zE.js index ffd727d..9d10f92 100644 --- a/scripts/JXBUE0XuJOJNG7zE.js +++ b/scripts/JXBUE0XuJOJNG7zE.js @@ -7,12 +7,12 @@ let options = { characteristic: 'wp', } -let test = await args.actor.setupSkill('Calme', options); +let Test = await args.actor.setupSkill('Calme', options); await test.roll(); if (!test.succeeded) { const targetId = this.effect.getFlag("wfrp4e", "target"); const target = canvas.scene.tokens.get(targetId); await this.effect.delete(); - args.extraMessages.push(`${args.actor.name} perd ${args.totalWoundLoss} Blessures de l'attaque, ce qui l'a amené à lâcher prise ${target.name}.`); + args.extraMessages.push(`${args.actor.name} perd ${args.totalWoundLoss} Points de Blessures lors de l'attaque, ce qui l'a forcé à lâcher ${target.name}.`); } \ No newline at end of file diff --git a/scripts/JeThJbOf6Xmbtgo1.js b/scripts/JeThJbOf6Xmbtgo1.js deleted file mode 100644 index 8147600..0000000 --- a/scripts/JeThJbOf6Xmbtgo1.js +++ /dev/null @@ -1,8 +0,0 @@ -this.script.scriptMessage(await this.actor.applyBasicDamage(8 + parseInt(this.effect.sourceTest.result.SL), {suppressMsg : true})) - -let test = await this.actor.setupSkill("Athlétisme", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone") -} \ No newline at end of file diff --git a/scripts/JgCcgDVZX54slrWx.js b/scripts/JgCcgDVZX54slrWx.js deleted file mode 100644 index b758160..0000000 --- a/scripts/JgCcgDVZX54slrWx.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Melee")) || args.item?.isMelee || args.options.corruption \ No newline at end of file diff --git a/scripts/JhCMYHHYA860Kka8.js b/scripts/JhCMYHHYA860Kka8.js deleted file mode 100644 index 1dcc650..0000000 --- a/scripts/JhCMYHHYA860Kka8.js +++ /dev/null @@ -1 +0,0 @@ -return !this.actor.attacker || args.item?.system?.attackType !== "melee" || args.skill?.name !== game.i18n.localize("NAME.Dodge"); \ No newline at end of file diff --git a/scripts/JhbZWZhOJ23yOBmG.js b/scripts/JhbZWZhOJ23yOBmG.js index 17dca1d..b61b66f 100644 --- a/scripts/JhbZWZhOJ23yOBmG.js +++ b/scripts/JhbZWZhOJ23yOBmG.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpentry)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Trade (Carpentry)'; const difficulty = 'hard'; const target = 30; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/JibNjuQrJRnY0yf9.js b/scripts/JibNjuQrJRnY0yf9.js deleted file mode 100644 index 03aff09..0000000 --- a/scripts/JibNjuQrJRnY0yf9.js +++ /dev/null @@ -1 +0,0 @@ -return this.actor.flags.useless.rEye && this.actor.flags.useless.lEye && (["ws", "bs"].includes(args.characteristic) || args.skill?.name?.includes(game.i18n.localize("NAME.Ride")) || args.weapon || args.options.dodge) \ No newline at end of file diff --git a/scripts/Jjq3oPYbI26zjxME.js b/scripts/Jjq3oPYbI26zjxME.js index c980ba0..903534a 100644 --- a/scripts/Jjq3oPYbI26zjxME.js +++ b/scripts/Jjq3oPYbI26zjxME.js @@ -6,7 +6,7 @@ if (location) if (dropped.length) { - this.script.scriptNotification(`Lache ${dropped.map(i => i.name).join(", ")}!`) + this.script.notification(`Lâche ${dropped.map(i => i.name).join(", ")}!`) for(let weapon of dropped) { await weapon.system.toggleEquip(); @@ -16,6 +16,6 @@ if (location) let roll = await new Roll("1d10").roll() -roll.toMessage(this.script.getChatData({flavor : `${this.effect.name} (Durée)`})); +roll.toMessage(this.script.getChatData({flavor : `Lâche ${dropped.map(i => i.name).join(", ")}!`})); -this.effect.updateSource({"duration.rounds" : roll.total}) \ No newline at end of file +this.effet.updateSource({"duration.rounds" : roll.total}) \ No newline at end of file diff --git a/scripts/Jk7OHqx06oCUVAzb.js b/scripts/Jk7OHqx06oCUVAzb.js deleted file mode 100644 index addba15..0000000 --- a/scripts/Jk7OHqx06oCUVAzb.js +++ /dev/null @@ -1 +0,0 @@ -return !["Langue (Magick)", "Focalisation (Hysh)"].includes(args.skill?.name) \ No newline at end of file diff --git a/scripts/JmZQRvdWjm9ykYfn.js b/scripts/JmZQRvdWjm9ykYfn.js index 55372ed..2b77e68 100644 --- a/scripts/JmZQRvdWjm9ykYfn.js +++ b/scripts/JmZQRvdWjm9ykYfn.js @@ -1,5 +1,5 @@ if (this.actor.hasCondition("surprised")) { this.actor.removeCondition("surprised") - this.script.scriptMessage(`Ne peut être surpris`); + this.script.message(`Impossible d'être surpris`); } \ No newline at end of file diff --git a/scripts/Jnp5c09sPzDD61EK.js b/scripts/Jnp5c09sPzDD61EK.js index f535a69..7c9caf4 100644 --- a/scripts/Jnp5c09sPzDD61EK.js +++ b/scripts/Jnp5c09sPzDD61EK.js @@ -1,3 +1,3 @@ -this.script.scriptNotification(`${args.actor.prototypeToken.name} doit réussir un Test Accessible (+20) de Force Mentale pour attaquer cette cible!`) +this.script.notification(`${args.actor.prototypeToken.name} must pass an Average (+20) Willpower Test to attack this target!`) return true; // No need to show this in the dialog \ No newline at end of file diff --git a/scripts/JstrA46EYSEuRSy5.js b/scripts/JstrA46EYSEuRSy5.js deleted file mode 100644 index f5e7f96..0000000 --- a/scripts/JstrA46EYSEuRSy5.js +++ /dev/null @@ -1,2 +0,0 @@ -if (this.actor.has(game.i18n.localize("NAME.Undead")) && this.actor.has(game.i18n.localize("NAME.Construct"))) - this.actor.addCondition("dead") \ No newline at end of file diff --git a/scripts/JwYZJGkZMSM2M3Si.js b/scripts/JwYZJGkZMSM2M3Si.js index 23dc567..dc4e703 100644 --- a/scripts/JwYZJGkZMSM2M3Si.js +++ b/scripts/JwYZJGkZMSM2M3Si.js @@ -1,6 +1,6 @@ if (args.totalWoundLoss > 0) { - let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "hard"}}) + let test = await args.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "hard"}}) await test.roll() if (test.failed) { diff --git a/scripts/JyTxUG5dNW670Sf7.js b/scripts/JyTxUG5dNW670Sf7.js deleted file mode 100644 index 9421a21..0000000 --- a/scripts/JyTxUG5dNW670Sf7.js +++ /dev/null @@ -1,11 +0,0 @@ -let item = await fromUuid("Compendium.wfrp4e-core.items.7mCcI3q7hgWcmbBU") -let data = item.toObject(); -data.system.location.key= this.item.system.location.key -this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "hard"}}); -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("stunned") -} \ No newline at end of file diff --git a/scripts/K54XxyNJa5PIWDEH.js b/scripts/K54XxyNJa5PIWDEH.js new file mode 100644 index 0000000..2c45bf5 --- /dev/null +++ b/scripts/K54XxyNJa5PIWDEH.js @@ -0,0 +1,2 @@ +args.modifiers.other.push({label : this.effect.name, details : "Blessures Doublées + 4", value : args.totalWoundLoss + 4 }); +args.totalWoundLoss = args.totalWoundLoss * 2 +4; \ No newline at end of file diff --git a/scripts/KD4nCSdSXJVJmk0R.js b/scripts/KD4nCSdSXJVJmk0R.js index 7499473..f9c3641 100644 --- a/scripts/KD4nCSdSXJVJmk0R.js +++ b/scripts/KD4nCSdSXJVJmk0R.js @@ -1,2 +1,2 @@ -this.script.scriptMessage(await this.actor.applyBasicDamage(this.effect.sourceTest.result.damage, {suppressMsg : true})) +this.script.message(await this.actor.applyBasicDamage(this.effect.sourceTest.result.damage, {suppressMsg : true})) await this.actor.addCondition("ablaze") \ No newline at end of file diff --git a/scripts/KGK9vL1Yl0qmCeCN.js b/scripts/KGK9vL1Yl0qmCeCN.js index d6ac347..0edca31 100644 --- a/scripts/KGK9vL1Yl0qmCeCN.js +++ b/scripts/KGK9vL1Yl0qmCeCN.js @@ -1,21 +1,21 @@ let specification = this.item.system.specification.value; let choice = []; -if (!specification || specification == "Compétences entraînées") +if (!specification || specification == "Compétences Entraînées") { choice = await ItemDialog.create(ItemDialog.objectToArray({ - broken: "Dompté", - drive: "Trait", - entertain: "Divertir", - fetch: "Rapporter", - guard: "Garder", - home: "Revenir à la maison", - magic: "Magie", - mount: "Monture", - war: "Guerre" - }, this.effect.img), "unlimited", "Choisissez un Dressage"); + broken: "Broken", + drive: "Conduite d'attelage", + entertain: "Divertissement", + fetch: "Fetch", + guard: "Garde", + home: "Home", + magic: "Magic", + mount: "Mount", + war: "War" + }, this.effect.img), "unlimited", "Choisir un Entraînement"); } -else +else { choice = specification.split(", ").map(i => { return { @@ -27,14 +27,14 @@ else if (choice.length) { - let changes = foundry.utils.deepClone(this.effect.changes); + let changes = foundry.utils.deepClone(this.effet.changes); for(let training of choice) { switch(training.id) { - case "broken" : - let roll = await new Roll("2d10").roll(); + case "broken" : + let roll = await new Roll("2d10").roll({allowInteractive : false}); roll.toMessage(this.script.getChatData()); changes.push({value : roll.total, mode : 2, key : "system.characteristics.fel.modifier"}) @@ -48,41 +48,41 @@ if (choice.length) } break; - case "drive" : + case "drive" : break; - case "entertain" : + case "entertain" : break; - case "fetch" : + case "fetch" : break; - case "guard" : + case "guard" : let territorial = await fromUuid("Compendium.wfrp4e-core.items.Item.JIAe7i7dqTQBu4do"); - await this.actor.createEmbeddedDocuments("Item", [territorial], {fromEffect: this.effect.id}) - setProperty(args, "options.keepId", true); + await this.actor.createEmbeddedDocuments("Item", [territorial], {fromEffect: this.effet.id}) + foundry.utils.setProperty(args, "options.keepId", true); break; - case "home" : + case "home" : break; - case "magic" : + case "magic" : break; - case "mount" : + case "mount" : break; - case "war" : + case "war" : changes.push({value : 10, mode : 2, key : "system.characteristics.ws.modifier"}) break; } } - this.effect.updateSource({name : `${this.effect.name} (${choice.map(i => i.name).join(", ")})`, changes, "flags.wfrp4e.trained" : choice.map(i => i.id)}) + this.effet.updateSource({name : `${this.effet.name} (${choice.map(i => i.name).join(", ")})`, changes, "flags.wfrp4e.trained" : choice.map(i => i.id)}) this.item.updateSource({"system.specification.value" : `${choice.map(i => i.name).join(", ")}`}) } \ No newline at end of file diff --git a/scripts/KICZPwLvbUSxbDrE.js b/scripts/KICZPwLvbUSxbDrE.js index e693a87..e750b00 100644 --- a/scripts/KICZPwLvbUSxbDrE.js +++ b/scripts/KICZPwLvbUSxbDrE.js @@ -9,10 +9,10 @@ let item = await fromUuid(uuid); if (item) { - this.script.scriptNotification(`${item.name} added`) + this.script.notification(`${item.name} added`) this.actor.createEmbeddedDocuments("Item", [item]) } -else +else { - ui.notifications.error("Impossible de trouver l'item: " + uuid) + ui.notifications.error("Impossible de trouver l'objet : " + uuid) } \ No newline at end of file diff --git a/scripts/KPQfupKuaf4LCv4R.js b/scripts/KPQfupKuaf4LCv4R.js deleted file mode 100644 index 611bcef..0000000 --- a/scripts/KPQfupKuaf4LCv4R.js +++ /dev/null @@ -1,2 +0,0 @@ -const talents = await Promise.all(["Intrigant", "Seconde Vue"].map(game.wfrp4e.utility.findTalent)) -this.actor.createEmbeddedDocuments("Item", talents, {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/KQzbrpb0T5a7it4k.js b/scripts/KQzbrpb0T5a7it4k.js index d07b192..1620dd8 100644 --- a/scripts/KQzbrpb0T5a7it4k.js +++ b/scripts/KQzbrpb0T5a7it4k.js @@ -1,4 +1,4 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.Item.vMYEkrWj0ip6ZOdv"); let data = item.toObject(); -data.name += ` (Maladie)`; +data.name += ` (Disease)`; this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) \ No newline at end of file diff --git a/scripts/KSGIwJxR0qn10RLX.js b/scripts/KSGIwJxR0qn10RLX.js new file mode 100644 index 0000000..df44289 --- /dev/null +++ b/scripts/KSGIwJxR0qn10RLX.js @@ -0,0 +1 @@ +this.actor.itemTags.template.find(t => t.name === "Hungry Troll").delete(); \ No newline at end of file diff --git a/scripts/KSjsDlsx3DD6cT16.js b/scripts/KSjsDlsx3DD6cT16.js deleted file mode 100644 index f00b8b8..0000000 --- a/scripts/KSjsDlsx3DD6cT16.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Bribery"); \ No newline at end of file diff --git a/scripts/KUx0deSF3xNzMucL.js b/scripts/KUx0deSF3xNzMucL.js deleted file mode 100644 index 208679d..0000000 --- a/scripts/KUx0deSF3xNzMucL.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Art")); \ No newline at end of file diff --git a/scripts/KVpDUEjHhd3nLa0f.js b/scripts/KVpDUEjHhd3nLa0f.js index a301dfb..81d3f97 100644 --- a/scripts/KVpDUEjHhd3nLa0f.js +++ b/scripts/KVpDUEjHhd3nLa0f.js @@ -1,6 +1,6 @@ -let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) +let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : ` - ${this.effet.name}`}) +await Test.roll(); +if (Test.Échoué) { - this.script.scriptMessage(await game.wfrp4e.tables.formatChatRoll("enrage-beast")) + this.script.message(await game.wfrp4e.tables.formatChatRoll("enrage-beast")) } \ No newline at end of file diff --git a/scripts/KkE8DtsTDYDyk1gN.js b/scripts/KkE8DtsTDYDyk1gN.js new file mode 100644 index 0000000..98d3d7a --- /dev/null +++ b/scripts/KkE8DtsTDYDyk1gN.js @@ -0,0 +1 @@ +args.data.reversal = {allowed : true, if: "better"}; \ No newline at end of file diff --git a/scripts/KkjkYAGI9Em1NgiQ.js b/scripts/KkjkYAGI9Em1NgiQ.js deleted file mode 100644 index 8ae39d2..0000000 --- a/scripts/KkjkYAGI9Em1NgiQ.js +++ /dev/null @@ -1,19 +0,0 @@ -if (this.item.system.quantity.value) -{ - this.item.system.reduceQuantity(); - let test = await this.actor.setupSkill(game.i18n.localize("NAME.Heal"), { appendTitle: ` - ${this.effect.name}`, skipTargets: true }) - await test.roll(); - if (test.succeeded) - { - let actor = Array.from(game.user.targets)[0]?.actor || this.actor; - actor.applyEffect({ effectData: [this.item.effects.contents[0].convertToApplied()] }) - } - else - { - this.script.scriptNotification("Test de Guérison échoué!", "error") - } -} -else -{ - this.script.scriptNotification("Quantité insuffisante!", "error") -} \ No newline at end of file diff --git a/scripts/KmngDrPD72xn22kZ.js b/scripts/KmngDrPD72xn22kZ.js index 2365538..2418a1a 100644 --- a/scripts/KmngDrPD72xn22kZ.js +++ b/scripts/KmngDrPD72xn22kZ.js @@ -1,11 +1,11 @@ if (this.actor.Species.toLowerCase() != "skaven") { - this.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - Utilise ${this.effect.name}`, fields: { difficulty: "difficult" } }).then(async test => { - await test.roll() - if (test.failed) + this.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - Utilise ${this.effet.name}`, fields: { difficulty: "difficult" } }).then(async Test => { + await Test.roll() + if (Test.Échoué) { let toughnessLost = Math.ceil(CONFIG.Dice.randomUniform() * 10) this.actor.update({ "system.characteristics.t.initial": this.actor.characteristics.t.initial - toughnessLost }) - this.script.scriptMessage(`${this.actor.prototypeToken.name} perd ${toughnessLost} points d'Endurance`) + this.script.message(`${this.actor.prototypeToken.name} Perte de ${toughnessLost} Endurance`) } }) } \ No newline at end of file diff --git a/scripts/KxIRA51YA0rktcSP.js b/scripts/KxIRA51YA0rktcSP.js new file mode 100644 index 0000000..dcddc99 --- /dev/null +++ b/scripts/KxIRA51YA0rktcSP.js @@ -0,0 +1 @@ +return args.characteristic === "fel" \ No newline at end of file diff --git a/scripts/KyUPYV1RXJxPOfyA.js b/scripts/KyUPYV1RXJxPOfyA.js deleted file mode 100644 index 5e60157..0000000 --- a/scripts/KyUPYV1RXJxPOfyA.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "veasy"}}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("fatigued"); -} \ No newline at end of file diff --git a/scripts/L41ao2Mw1miE0yri.js b/scripts/L41ao2Mw1miE0yri.js new file mode 100644 index 0000000..49e2ef2 --- /dev/null +++ b/scripts/L41ao2Mw1miE0yri.js @@ -0,0 +1,2 @@ +let roll = await new Roll("15").roll(); +roll.toMessage(this.script.getChatData()); \ No newline at end of file diff --git a/scripts/L9eAtDyaoHvqryk4.js b/scripts/L9eAtDyaoHvqryk4.js deleted file mode 100644 index c5efbe5..0000000 --- a/scripts/L9eAtDyaoHvqryk4.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Intimidate"); \ No newline at end of file diff --git a/scripts/L9pUSX8Z4y2zIAn7.js b/scripts/L9pUSX8Z4y2zIAn7.js new file mode 100644 index 0000000..287d6f8 --- /dev/null +++ b/scripts/L9pUSX8Z4y2zIAn7.js @@ -0,0 +1 @@ +this.actor.system.characteristics.int.value = 50 \ No newline at end of file diff --git a/scripts/LLqAT9wEUGMLfDhU.js b/scripts/LLqAT9wEUGMLfDhU.js index 4102c46..8cbf753 100644 --- a/scripts/LLqAT9wEUGMLfDhU.js +++ b/scripts/LLqAT9wEUGMLfDhU.js @@ -1 +1 @@ -return !args.item?.system.isRanged \ No newline at end of file +return !args.item?.system.isProjectiles \ No newline at end of file diff --git a/scripts/LNxKkPI37im0bSjy.js b/scripts/LNxKkPI37im0bSjy.js new file mode 100644 index 0000000..c26f839 --- /dev/null +++ b/scripts/LNxKkPI37im0bSjy.js @@ -0,0 +1,5 @@ +const ablaze = Number(args.opposedTest.result.differenceSL) + 1 +args.actor.addCondition("ablaze", ablaze) +args.extraMessages.push( + "" + this.effect.name + ": " + + ablaze + " @Condition[Ablaze] Conditions") \ No newline at end of file diff --git a/scripts/LQEWSN5KnHHATPsf.js b/scripts/LQEWSN5KnHHATPsf.js index c6e73b1..3b87552 100644 --- a/scripts/LQEWSN5KnHHATPsf.js +++ b/scripts/LQEWSN5KnHHATPsf.js @@ -1,4 +1,4 @@ if (args.totalWoundLoss > 0) { - this.script.scriptMessage(`${args.actor.name} doit réussir un Test Facile (+40) d'Endurance ou subir une @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Blessure Purulente}`, {whisper: ChatMessage.getWhisperRecipients("GM")}) + this.script.message(`${args.actor.name} must pass an Easy (+40) Résistance Test or gain a @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Festering Wound}`, {whisper: ChatMessage.getWhisperRecipients("GM")}) } \ No newline at end of file diff --git a/scripts/LXEUhHuXe8keEPI9.js b/scripts/LXEUhHuXe8keEPI9.js index 0683f16..22920c2 100644 --- a/scripts/LXEUhHuXe8keEPI9.js +++ b/scripts/LXEUhHuXe8keEPI9.js @@ -1,7 +1,7 @@ -let test = await this.actor.setupCharacteristic("wp", {fields: {difficulty : "average"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) +let test = await this.actor.setupCharacteristic("wp", {fields: {difficulty : "average"}, skipTargets: true, appendTitle : ` - ${this.effet.name}`}) +await Test.roll(); +if (Test.Échoué) { - let stuns = Math.max(1, Math.abs(test.result.SL)) + let stuns = Math.max(1, Math.abs(Test.result.SL)) this.actor.addCondition("stunned", stuns) } \ No newline at end of file diff --git a/scripts/LeKLtvEDrWh4yHsx.js b/scripts/LeKLtvEDrWh4yHsx.js deleted file mode 100644 index bfe04ec..0000000 --- a/scripts/LeKLtvEDrWh4yHsx.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.CharmAnimal") || args.skill?.name.includes(game.i18n.localize("NAME.AnimalTraining")); \ No newline at end of file diff --git a/scripts/Lg1oRg4oNRvucsvi.js b/scripts/Lg1oRg4oNRvucsvi.js deleted file mode 100644 index 42395c3..0000000 --- a/scripts/Lg1oRg4oNRvucsvi.js +++ /dev/null @@ -1 +0,0 @@ -return !(args.skill?.name == game.i18n.localize("NAME.Climb") || args.skill?.name == game.i18n.localize("NAME.Athletics")) \ No newline at end of file diff --git a/scripts/Lh3Ccqx3utIu6w0d.js b/scripts/Lh3Ccqx3utIu6w0d.js new file mode 100644 index 0000000..652b637 --- /dev/null +++ b/scripts/Lh3Ccqx3utIu6w0d.js @@ -0,0 +1,5 @@ +if (!args.ablazeApplied) +{ + args.ablazeApplied = true; + await args.actor.addCondition("ablaze"); +} \ No newline at end of file diff --git a/scripts/LjfScVGBf0Egr70E.js b/scripts/LjfScVGBf0Egr70E.js deleted file mode 100644 index 07e1a29..0000000 --- a/scripts/LjfScVGBf0Egr70E.js +++ /dev/null @@ -1,9 +0,0 @@ -let animalCare = this.actor.itemTypes.skill.find(s => s.name === game.i18n.localize("NAME.AnimalCare")); -let animalTrainings = this.actor.itemTypes.skill.filter(s => s.name.includes(game.i18n.localize("NAME.AnimalTraining"))); - -if (animalCare) - animalCare.system.modifier.value += 20; - -for (let training of animalTrainings) { - training.system.modifier.value += 30; -} \ No newline at end of file diff --git a/scripts/Lp261O9fgEXmgPf3.js b/scripts/Lp261O9fgEXmgPf3.js index 65d054e..729b047 100644 --- a/scripts/Lp261O9fgEXmgPf3.js +++ b/scripts/Lp261O9fgEXmgPf3.js @@ -1,5 +1,5 @@ // If this actor wins a defending test, swap the test if (!args.opposedTest.result.swapped && args.opposedTest.result.winner == "defender" && args.opposedTest.attackerTest.result.damage) { - args.opposedTest.swap(this.effect.label); + await args.opposedTest.swap(this.effect.name); } \ No newline at end of file diff --git a/scripts/Lpv2N9LK9loeumiW.js b/scripts/Lpv2N9LK9loeumiW.js deleted file mode 100644 index ad3c30e..0000000 --- a/scripts/Lpv2N9LK9loeumiW.js +++ /dev/null @@ -1,6 +0,0 @@ -if (this.actor.uuid != this.effect.sourceActor.uuid) -{ - this.actor.setupSkill(game.i18n.localize("NAME.Athletics"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty: "hard"}, context : {failure : `${this.effect.name}: cannot move or take actions`}}).then(test => { - test.roll(); - }) -} \ No newline at end of file diff --git a/scripts/Lrb1S2aK7SFVD0C7.js b/scripts/Lrb1S2aK7SFVD0C7.js deleted file mode 100644 index 2f40127..0000000 --- a/scripts/Lrb1S2aK7SFVD0C7.js +++ /dev/null @@ -1,9 +0,0 @@ -if (args.totalWoundLoss > 0) -{ - let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) - await test.roll(); - if (test.failed) - { - await args.actor.addCondition("fatigued"); - } -} \ No newline at end of file diff --git a/scripts/Lu27iXtJVkrJ8bOx.js b/scripts/Lu27iXtJVkrJ8bOx.js deleted file mode 100644 index 73cb61d..0000000 --- a/scripts/Lu27iXtJVkrJ8bOx.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name?.includes(game.i18n.localize("NAME.Stealth")) \ No newline at end of file diff --git a/scripts/LyAK0dVDS5L09yq2.js b/scripts/LyAK0dVDS5L09yq2.js index 7f19beb..911f850 100644 --- a/scripts/LyAK0dVDS5L09yq2.js +++ b/scripts/LyAK0dVDS5L09yq2.js @@ -5,5 +5,5 @@ if (caster) let bonus = caster.system.characteristics.wp.bonus this.actor.modifyWounds(bonus) - this.script.scriptMessage(`${this.actor.prototypeToken.name} récupère ${bonus} Blessures`) + this.script.message(`${this.actor.prototypeToken.name} regains ${bonus} Wounds`) } \ No newline at end of file diff --git a/scripts/M0XhKnWjG14pk3iH.js b/scripts/M0XhKnWjG14pk3iH.js deleted file mode 100644 index 202036f..0000000 --- a/scripts/M0XhKnWjG14pk3iH.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes("Focalisation") && args.type != "channelling" && args.skill?.name != game.i18n.localize("NAME.Charm") && !args.skill?.name.includes("Langue (Magick)") && args.type != "cast" \ No newline at end of file diff --git a/scripts/M2FshTX4PjKFVU8y.js b/scripts/M2FshTX4PjKFVU8y.js deleted file mode 100644 index 6aa49fc..0000000 --- a/scripts/M2FshTX4PjKFVU8y.js +++ /dev/null @@ -1,9 +0,0 @@ -args.flags.earCount = Number.isNumeric(args.flags.earCount) ? args.flags.earCount+1 : 1; -if (args.characteristic == "fel") -{ - args.fields.modifier -= 5; -} -if (args.flags.earCount == 2 && args.skill?.name == game.i18n.localize("NAME.Perception")) -{ - args.fields.modifier -= 20; -} diff --git a/scripts/M5bh0heeafA2fQQ8.js b/scripts/M5bh0heeafA2fQQ8.js index bcd4d8e..ed508cd 100644 --- a/scripts/M5bh0heeafA2fQQ8.js +++ b/scripts/M5bh0heeafA2fQQ8.js @@ -2,7 +2,7 @@ if (args.test.spell?.getFlag("wfrp4e", "boonOfTzeentch")) { if (args.test.result.minormis || args.test.result.majormis || args.test.result.catastrophicmis) { - this.script.scriptMessage(`${this.effect.name} s'efface de votre esprit et s'efface de votre grimoire !`) + this.script.message(`${this.effect.name} quits your mind in disgust and erases itself from your grimoire!`) this.effect.sourceItem.delete(); } } \ No newline at end of file diff --git a/scripts/M6sb1yAdEAMlIvac.js b/scripts/M6sb1yAdEAMlIvac.js new file mode 100644 index 0000000..735c90c --- /dev/null +++ b/scripts/M6sb1yAdEAMlIvac.js @@ -0,0 +1 @@ +return args.item?.system?.attackType == "ranged" && this.item.equipped.value \ No newline at end of file diff --git a/scripts/M9VgeYGiUO97ZUW4.js b/scripts/M9VgeYGiUO97ZUW4.js deleted file mode 100644 index 4cb39af..0000000 --- a/scripts/M9VgeYGiUO97ZUW4.js +++ /dev/null @@ -1,12 +0,0 @@ -let item = await fromUuid("Compendium.wfrp4e-core.items.hCadFsTRvLN9faaY") -let data = item.toObject(); -data.system.location.value = "Jaw" -this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (!test.succeeded) -{ - args.actor.addCondition("unconscious") -} - diff --git a/scripts/MB058H6OslhfBmxR.js b/scripts/MB058H6OslhfBmxR.js new file mode 100644 index 0000000..6294b55 --- /dev/null +++ b/scripts/MB058H6OslhfBmxR.js @@ -0,0 +1,2 @@ +console.log(args) +return args.item?.system?.attackType == "melee" \ No newline at end of file diff --git a/scripts/MDLttXplnNthncGr.js b/scripts/MDLttXplnNthncGr.js index 950f0b7..b7a08ee 100644 --- a/scripts/MDLttXplnNthncGr.js +++ b/scripts/MDLttXplnNthncGr.js @@ -1 +1 @@ -return args.type == "cast" && ["mort", "nécromancie", "vie", "lumière", "cieux"].includes(args.spell?.system.lore.value) \ No newline at end of file +return args.type == "cast" && ["death", "necromancy", "life", "light", "heavens"].includes(args.spell?.system.lore.value) \ No newline at end of file diff --git a/scripts/MFKhU9vp8bQpHP3I.js b/scripts/MFKhU9vp8bQpHP3I.js index 126a0b5..255dffc 100644 --- a/scripts/MFKhU9vp8bQpHP3I.js +++ b/scripts/MFKhU9vp8bQpHP3I.js @@ -6,7 +6,7 @@ if (game.user.isGM && game.user.targets.size) game.user.targets.forEach(t => { t.actor.applyTerror(value, name) }) - game.user.updateTokenTargets([]); + game.canvas.tokens.setTargets([]) } else { diff --git a/scripts/MJB6WbZSF6Briz30.js b/scripts/MJB6WbZSF6Briz30.js deleted file mode 100644 index 13bb16c..0000000 --- a/scripts/MJB6WbZSF6Briz30.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name == game.i18n.localize("NAME.Leadership") \ No newline at end of file diff --git a/scripts/MKxYbHOrv0UuA7JB.js b/scripts/MKxYbHOrv0UuA7JB.js new file mode 100644 index 0000000..8371d4f --- /dev/null +++ b/scripts/MKxYbHOrv0UuA7JB.js @@ -0,0 +1,9 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {fields: {difficulty : "average"}, appendTitle : " - Blessé"}) + await test.roll(); + if (test.failed) + { + fromUuid("Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb").then(disease => { + this.actor.createEmbeddedDocuments("Item", [disease.toObject()]) + this.script.scriptNotification("Contraction de " + disease.name) + }) + } \ No newline at end of file diff --git a/scripts/MMv2B8TH7jxNCtdl.js b/scripts/MMv2B8TH7jxNCtdl.js deleted file mode 100644 index 1bdc6d1..0000000 --- a/scripts/MMv2B8TH7jxNCtdl.js +++ /dev/null @@ -1,44 +0,0 @@ -let actor = this.actor; -let effect = this.effect; -let bleedingAmt; -let bleedingRoll; -let msg = "" - -let damage = effect.conditionValue; -let scriptArgs = { msg, damage }; -await Promise.all(actor.runScripts("preApplyCondition", { effect, data: scriptArgs })) -msg = scriptArgs.msg; -damage = scriptArgs.damage; -msg += await actor.applyBasicDamage(damage, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, minimumOne: false, suppressMsg: true }) - -if (actor.status.wounds.value == 0 && !actor.hasCondition("unconscious")) { - await actor.addCondition("unconscious") - msg += "
    " + game.i18n.format("BleedUnc", { name: actor.prototypeToken.name }) -} - -if (actor.hasCondition("unconscious")) { - bleedingAmt = effect.conditionValue; - bleedingRoll = (await new Roll("1d100").roll()).total; - if (bleedingRoll <= bleedingAmt * 10) { - msg += "
    " + game.i18n.format("BleedFail", { name: actor.prototypeToken.name }) + " (" + game.i18n.localize("Rolled") + " " + bleedingRoll + ")"; - await actor.addCondition("dead") - } - else if (bleedingRoll % 11 == 0) { - msg += "
    " + game.i18n.format("BleedCrit", { name: actor.prototypeToken.name }) + " (" + game.i18n.localize("Rolled") + bleedingRoll + ")" - await actor.removeCondition("bleeding") - } - else { - msg += "
    " + game.i18n.localize("BleedRoll") + ": " + bleedingRoll; - } -} - -await Promise.all(actor.runScripts("applyCondition", { effect, data: { bleedingRoll } })) -if (args.suppressMessage) { - let messageData = game.wfrp4e.utility.chatDataSetup(msg); - messageData.speaker = { alias: this.effect.name } - messageData.flavor = this.effect.name; - return messageData -} -else { - return this.script.scriptMessage(msg) -} diff --git a/scripts/MMx8f5uJ15XOgJGg.js b/scripts/MMx8f5uJ15XOgJGg.js deleted file mode 100644 index 8146820..0000000 --- a/scripts/MMx8f5uJ15XOgJGg.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Row") && args.skill?.name !== game.i18n.localize("NAME.Swim") && !args.skill?.name.includes(game.i18n.localize("NAME.Sail")); \ No newline at end of file diff --git a/scripts/MPK7U4HLmIAsjdqs.js b/scripts/MPK7U4HLmIAsjdqs.js new file mode 100644 index 0000000..f04f21d --- /dev/null +++ b/scripts/MPK7U4HLmIAsjdqs.js @@ -0,0 +1,5 @@ +if (args.applyAP) +{ + args.modifiers.ap.ignored += 2 + args.modifiers.ap.details.push("" + this.effect.name + ": Ignore 2 PA"); +} \ No newline at end of file diff --git a/scripts/MSJWJEUrX7ZmMvAD.js b/scripts/MSJWJEUrX7ZmMvAD.js deleted file mode 100644 index ad91ce3..0000000 --- a/scripts/MSJWJEUrX7ZmMvAD.js +++ /dev/null @@ -1 +0,0 @@ -return !(args.skill?.name.includes(game.i18n.localize("NAME.Ranged")) || args.item?.isRanged || args.item?.name == game.i18n.localize("NAME.Charm")) \ No newline at end of file diff --git a/scripts/Me1wS5XdqUEy7OGt.js b/scripts/Me1wS5XdqUEy7OGt.js index ff366cb..0f251a6 100644 --- a/scripts/Me1wS5XdqUEy7OGt.js +++ b/scripts/Me1wS5XdqUEy7OGt.js @@ -1,5 +1,5 @@ let loc = (await game.wfrp4e.tables.rollTable("hitloc")).result; -let critTable = `crit${this.generalizeTable(loc)`; +let critTable = `crit${this.generalizeTable(loc)}`; let crit = (await game.wfrp4e.tables.rollTable(critTable)).result; -this.script.scriptMessage(`{this.actor.name} subit un ${crit} (localisation : ${loc}). Ne pas appliquer d'Hemmoragie ou de Blessures additionnelles.`); \ No newline at end of file +this.script.message(`{this.actor.name} suffers a ${crit} (location : ${loc}). Do not apply bleeding or any additonnal wounds.`); \ No newline at end of file diff --git a/scripts/MfxWXZwaZUjGSBqw.js b/scripts/MfxWXZwaZUjGSBqw.js index c4ce0c6..479ba99 100644 --- a/scripts/MfxWXZwaZUjGSBqw.js +++ b/scripts/MfxWXZwaZUjGSBqw.js @@ -1,5 +1,5 @@ if (this.actor.hasCondition("ablaze")) { - this.script.scriptNotification("Immunisé à En Flammes") + this.script.notification("Immunisé à l'état En Flames") await this.actor.hasCondition("ablaze")?.delete() } \ No newline at end of file diff --git a/scripts/MfxzwJz2o9ho2hOM.js b/scripts/MfxzwJz2o9ho2hOM.js index 48b706b..664e6ec 100644 --- a/scripts/MfxzwJz2o9ho2hOM.js +++ b/scripts/MfxzwJz2o9ho2hOM.js @@ -1 +1 @@ -return args.skill?.name == "Savoir (Apothicaire)" \ No newline at end of file +return args.skill?.name == "Lore (Apothecary)" \ No newline at end of file diff --git a/scripts/MgMMoC4Umpg7fmNI.js b/scripts/MgMMoC4Umpg7fmNI.js index f431174..475ee48 100644 --- a/scripts/MgMMoC4Umpg7fmNI.js +++ b/scripts/MgMMoC4Umpg7fmNI.js @@ -1,24 +1,21 @@ // Apply changes when the mask is worn -if (args.equipped) { - this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) - this.script.scriptMessage(`${this.actor.name} porte ${this.item.name}.
    - Il ne peut plus lancer de Sorts ni effectuer de Prières ni Miracles.
    - S'il porte le masque pendant plus d'1 heure ou bénéficie de l'un de ses effets, il est exposé à un @Corruption[moderate]{Corruption Modérée}. +if (args.equipped) { + this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) + this.script.message(`${this.actor.name} porte le ${this.item.name}.
    + Ils ne peuvent pas lancer de sorts ni prier pour des Bénédictions et des Miracles.
    + S'ils portent le masque pendant plus d'une heure ou bénéficient de l'un de ses effets, ils sont exposés à @Corruption[modérée]{Corruption modérée}. `, - {whisper: ChatMessage.getWhisperRecipients("GM")}) + {whisper: ChatMessage.getWhisperRecipients("GM")}) } -// Notify of lingering effects when mask is removed +// Notify of lingering effects when mask is Retiré else if (!args.equipped) { await this.item.effects.contents[0].delete(); - await this.item.update({name : this.item.name += " (Used)"}) - this.script.scriptMessage(`${this.item.name} sur ${this.actor.name} a été enlevé et à perdu ses propriétés. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils devront être supprimés manuellement.`, + await this.item.update({name : this.item.name += " (Usagé)"}) + this.script.message(`${this.item.name} sur ${this.actor.name} a été retiré et perd ses propriétés. Cependant, les effets durent [[1d10+4]] jours, après quoi ils doivent être manuellement retirés.`, {whisper: ChatMessage.getWhisperRecipients("GM")} ) - + } - - - diff --git a/scripts/Mhb67xufvA9uWO21.js b/scripts/Mhb67xufvA9uWO21.js index 9f01412..2e31ab5 100644 --- a/scripts/Mhb67xufvA9uWO21.js +++ b/scripts/Mhb67xufvA9uWO21.js @@ -1,8 +1,8 @@ -let actorSize = game.wfrp4e.config.actorSizeNums[args.actor.details.size.value] -let attackerSize = game.wfrp4e.config.actorSizeNums[args.attacker.details.size.value] +let actorTaille = game.wfrp4e.config.actorTailleNums[args.actor.details.size.value] +let attackerTaille = game.wfrp4e.config.actorTailleNums[args.attacker.details.size.value] -if (attackerSize > actorSize) +if (attackerTaille > actorTaille) { args.actor.addCondition("prone") - this.script.scriptMessage(`Attaque Caudale: ${args.actor.prototypeToken.name} est désormais A Terre`) + this.script.message(`Tail Attack: ${args.actor.prototypeToken.name} is now Prone`) } \ No newline at end of file diff --git a/scripts/Mir4FMHQRdVqazAF.js b/scripts/Mir4FMHQRdVqazAF.js index 8be83d5..c6dc9c2 100644 --- a/scripts/Mir4FMHQRdVqazAF.js +++ b/scripts/Mir4FMHQRdVqazAF.js @@ -1,13 +1,13 @@ -let actorSize = game.wfrp4e.config.actorSizeNums[args.actor.details.size.value] -let attackerSize = game.wfrp4e.config.actorSizeNums[args.attacker.details.size.value] +let actorTaille = game.wfrp4e.config.actorTailleNums[args.actor.details.size.value] +let attackerTaille = game.wfrp4e.config.actorTailleNums[args.attacker.details.size.value] -if (attackerSize > actorSize) +if (attackerTaille > actorTaille) { - let msg = `Attaque de Langue préhensile: ${args.actor.prototypeToken.name} est désormais @Condition[Empêtré]`; + let msg = `Attaque de Langue: ${args.actor.prototypeToken.name} est maintenant @Condition[Entangled]`; await args.actor.addCondition("entangled"); - if (actorSize <= 2) + if (actorTaille <= 2) { - msg += `et @Condition[Engagé]` + msg += `et @Condition[Engaged]` } - this.script.scriptMessage(msg, {speaker : {alias: args.attacker.prototypeToken.name}}) + this.script.message(msg, {speaker : {alias: args.attacker.prototypeToken.name}}) } \ No newline at end of file diff --git a/scripts/MnqQkXVp20Lw84I1.js b/scripts/MnqQkXVp20Lw84I1.js index 93be773..774f012 100644 --- a/scripts/MnqQkXVp20Lw84I1.js +++ b/scripts/MnqQkXVp20Lw84I1.js @@ -1,6 +1,6 @@ -let test = await this.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "difficult"}}) +let test = await this.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, fields : {difficulty : "difficult"}}) await test.roll(); if (test.failed) { - this.script.scriptMessage(await this.actor.applyBasicDamage(3, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})) + this.script.message(await this.actor.applyBasicDamage(3, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})) } \ No newline at end of file diff --git a/scripts/Mp8UjuCLa9jdzhBS.js b/scripts/Mp8UjuCLa9jdzhBS.js deleted file mode 100644 index 0e448e2..0000000 --- a/scripts/Mp8UjuCLa9jdzhBS.js +++ /dev/null @@ -1,20 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); - -if (test.failed) -{ - if (!this.actor.hasCondition("fatigued")) - { - await this.actor.addCondition("fatigued"); - } - else - { - await this.actor.addCondition("blinded"); - await this.actor.addCondition("deafened"); - } - - if (((this.actor.hasCondition("blinded").conditionValue || 0) + (this.actor.hasCondition("deafened").conditionValue || 0)) > this.actor.system.characteristics.i.bonus) - { - await this.actor.addCondition("unconscious"); - } -} \ No newline at end of file diff --git a/scripts/Mqbjr3t7IXwFnfCv.js b/scripts/Mqbjr3t7IXwFnfCv.js new file mode 100644 index 0000000..ce75ac5 --- /dev/null +++ b/scripts/Mqbjr3t7IXwFnfCv.js @@ -0,0 +1,19 @@ +if (this.item.flags.runeOfIron) return + + +const runesOfIron = this.item.effects.contents.filter(e => e.name == this.effect.name) +const ironWounds = parseInt(runesOfIron.length * 2) +const currentWounds = this.actor.system.status.wounds.value + +if (args.equipped) { + this.item.flags.runeOfIron = true + this.actor.modifyWounds(ironWounds) +} +else +{ + this.item.flags.runeOfIron = true + this.actor.modifyWounds(-ironWounds) + if (ironWounds > currentWounds) { + this.script.message(`You have removed ${ironWounds} Wounds by unequipping Runic Armoour, but you only had ${currentWounds} Wounds remaining. This may trigger a critical injury.`) + } +} \ No newline at end of file diff --git a/scripts/Msygc7oQQPB5fw0b.js b/scripts/Msygc7oQQPB5fw0b.js index fe0d31b..159a300 100644 --- a/scripts/Msygc7oQQPB5fw0b.js +++ b/scripts/Msygc7oQQPB5fw0b.js @@ -1,14 +1,14 @@ let test = this.effect.sourceTest; if (test.failed && (test.result.roll % 11 == 0 || test.result.roll == 100)) { - let points = await new Roll("1d10").roll(); + let points = await new Roll("1d10").roll({allowInteractive : false}); game.dice3d?.showForRoll(points) this.actor.update({"system.status.corruption.value" : this.actor.system.status.corruption.value + points.total}) - this.script.scriptMessage(`Reçoit ${points.total} Point de Corruption`) + this.script.message(`Gain de ${points.total} Corruption`) } -else +else { - let points = this.effect.sourceTest.result.overcast.usage.other.current; + let points = this.effet.sourceTest.result.overcast.usage.other.current; this.actor.update({"system.status.corruption.value" : this.actor.system.status.corruption.value - points}) - this.script.scriptMessage(`Perd ${points} Point de Corruption`) + this.script.message(`Perd de ${points} de Corruption`) } \ No newline at end of file diff --git a/scripts/MwUzyAgd0yPnmZCH.js b/scripts/MwUzyAgd0yPnmZCH.js index 81a644d..aef44fc 100644 --- a/scripts/MwUzyAgd0yPnmZCH.js +++ b/scripts/MwUzyAgd0yPnmZCH.js @@ -1,4 +1,4 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.klCJX0mNpXYH5AIx") let data = item.toObject(); -data.name = data.name.replace("Cible", "Strangers"); +data.name = data.name.replace("Target", "Strangers"); this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}); \ No newline at end of file diff --git a/scripts/N6E9Jsd8n2ubCfz8.js b/scripts/N6E9Jsd8n2ubCfz8.js new file mode 100644 index 0000000..08ad367 --- /dev/null +++ b/scripts/N6E9Jsd8n2ubCfz8.js @@ -0,0 +1,4 @@ +for(let key in this.item.system.AP) +{ + this.item.system.AP[key]++; +} \ No newline at end of file diff --git a/scripts/N7nGncsPrTz2ZbDA.js b/scripts/N7nGncsPrTz2ZbDA.js index dc64a26..af896fc 100644 --- a/scripts/N7nGncsPrTz2ZbDA.js +++ b/scripts/N7nGncsPrTz2ZbDA.js @@ -1 +1 @@ -return !args.options.dodge || !this.actor.isMounted \ No newline at end of file +return !args.context.dodge || !this.actor.isMounted \ No newline at end of file diff --git a/scripts/N8hA6ysHCTlLd8Kj.js b/scripts/N8hA6ysHCTlLd8Kj.js index 00f7284..34b9945 100644 --- a/scripts/N8hA6ysHCTlLd8Kj.js +++ b/scripts/N8hA6ysHCTlLd8Kj.js @@ -30,7 +30,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,14 +63,14 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { items.push({name : trapping, type : "trapping", "system.trappingType.value" : "clothingAccessories"}) - //ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + //ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); diff --git a/scripts/N9kA46ZQ9LiRjy6T.js b/scripts/N9kA46ZQ9LiRjy6T.js deleted file mode 100644 index a19284c..0000000 --- a/scripts/N9kA46ZQ9LiRjy6T.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Haggle") || args.skill?.name == game.i18n.localize("NAME.Gossip"); \ No newline at end of file diff --git a/scripts/NDvNGATDM2xPFJK0.js b/scripts/NDvNGATDM2xPFJK0.js deleted file mode 100644 index a24d236..0000000 --- a/scripts/NDvNGATDM2xPFJK0.js +++ /dev/null @@ -1,21 +0,0 @@ -brokenbone = await fromUuid("Compendium.wfrp4e-core.items.hCadFsTRvLN9faaY") -teeth = await fromUuid("Compendium.wfrp4e-core.items.fBcZhOBn8IpoVqQ1") -tongue = await fromUuid("Compendium.wfrp4e-core.items.rkJA1DlK51QuRlJy") -brokenbone = brokenbone.toObject(); -teeth = teeth.toObject(); -tongue = tongue.toObject(); - - -let roll = await new Roll("1d10").roll(); -roll.toMessage(this.script.getChatData({flavor : "Dents perdues"})) - -teeth.system.location.value = `${roll.total} ${teeth.system.location.value}` -brokenbone.system.location.value = "Jaw" -this.actor.createEmbeddedDocuments("Item", [brokenbone, teeth, tongue]) - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty : "vhard"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("unconscious") -} \ No newline at end of file diff --git a/scripts/NEKLTgJJsayC7tpF.js b/scripts/NEKLTgJJsayC7tpF.js new file mode 100644 index 0000000..dcd572b --- /dev/null +++ b/scripts/NEKLTgJJsayC7tpF.js @@ -0,0 +1 @@ +return ["ws", "ag"].includes(args.characteristic); \ No newline at end of file diff --git a/scripts/NI3ZzIAlpQfVSjvf.js b/scripts/NI3ZzIAlpQfVSjvf.js index 5348fc0..090554b 100644 --- a/scripts/NI3ZzIAlpQfVSjvf.js +++ b/scripts/NI3ZzIAlpQfVSjvf.js @@ -1,6 +1,6 @@ if (isNaN(parseInt(this.item.system.specification.value))) { - let value = await ValueDialog.create({text : "Enter Fear value", title : this.effect.name}); + let value = await ValueDialog.create({text : "Entrez la valeur de Peur", title : this.effect.name}); if (value) { this.item.updateSource({"system.specification.value" : value}); diff --git a/scripts/NMZ3Fb164tUfwChF.js b/scripts/NMZ3Fb164tUfwChF.js new file mode 100644 index 0000000..20bc0b2 --- /dev/null +++ b/scripts/NMZ3Fb164tUfwChF.js @@ -0,0 +1 @@ +return !args.data.targets[0]?.actor?.hasCondition("entangled") \ No newline at end of file diff --git a/scripts/NQSvFWhmBQAyx5Zz.js b/scripts/NQSvFWhmBQAyx5Zz.js index 6f94648..679b0b7 100644 --- a/scripts/NQSvFWhmBQAyx5Zz.js +++ b/scripts/NQSvFWhmBQAyx5Zz.js @@ -1 +1 @@ -return args.item?.isRanged \ No newline at end of file +return args.item?.isProjectiles \ No newline at end of file diff --git a/scripts/NTFpkiGyBpOtrV0s.js b/scripts/NTFpkiGyBpOtrV0s.js new file mode 100644 index 0000000..00d6e40 --- /dev/null +++ b/scripts/NTFpkiGyBpOtrV0s.js @@ -0,0 +1,18 @@ +if (this.actor.uuid == this.effect.sourceActor.uuid) +{ + return; +} + +if (this.actor.has("À Sang Froid") && !this.actor.hasSystemEffect("nausea")) { + let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {appendTitle : `- ${this.effect.name}`}) +await Test.roll(); +if (Test.Échoué) +{ + + let myRoll = await new Roll("1d10").roll({allowInteractive : false}); + let duration = myRoll.total + this.actor.addSystemEffect("nausea"); + this.script.scriptMessage(`Symptome Nausée ajouté, durée : ${duration} heures`); +} +} +return false; \ No newline at end of file diff --git a/scripts/NX9fApO15NQuTipW.js b/scripts/NX9fApO15NQuTipW.js new file mode 100644 index 0000000..084471d --- /dev/null +++ b/scripts/NX9fApO15NQuTipW.js @@ -0,0 +1 @@ +return ["ws", "bs"].includes(args.characteristic) \ No newline at end of file diff --git a/scripts/Na7Nanl9YmxZlTo7.js b/scripts/Na7Nanl9YmxZlTo7.js index e4f212b..ed60b79 100644 --- a/scripts/Na7Nanl9YmxZlTo7.js +++ b/scripts/Na7Nanl9YmxZlTo7.js @@ -1 +1 @@ -return args.type != "cast" && args.type != "channelling") \ No newline at end of file +return args.type != "cast" && args.type != "channelling" \ No newline at end of file diff --git a/scripts/NdquQqyuOkGCj8Uo.js b/scripts/NdquQqyuOkGCj8Uo.js index 795693e..3e25112 100644 --- a/scripts/NdquQqyuOkGCj8Uo.js +++ b/scripts/NdquQqyuOkGCj8Uo.js @@ -4,5 +4,5 @@ let acutesense = await fromUuid("Compendium.wfrp4e-core.items.Item.9h82z72XGo9tf fear = fear.toObject(); fear.system.specification.value = 1; acutesense = acutesense.toObject(); -acutesense.name += " (Odorat)"; +acutesense.name += " (Smell)"; this.actor.createEmbeddedDocuments("Item", [darkvision, fear, acutesense], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/NkqtQaLEGYst0PUO.js b/scripts/NkqtQaLEGYst0PUO.js deleted file mode 100644 index 3bda5c8..0000000 --- a/scripts/NkqtQaLEGYst0PUO.js +++ /dev/null @@ -1,5 +0,0 @@ -if (this.actor.has("Résistance à la Magie", "talent")) - return - -let item = await fromUuid("Compendium.wfrp4e-core.items.Item.eowbsW6oHGSNJmxV") -this.actor.createEmbeddedDocuments("Item", [item], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/NnA4zpuO6iUXKhH7.js b/scripts/NnA4zpuO6iUXKhH7.js deleted file mode 100644 index c49dff4..0000000 --- a/scripts/NnA4zpuO6iUXKhH7.js +++ /dev/null @@ -1,7 +0,0 @@ -if ((args.opposedTest.attackerTest.item && args.opposedTest.attackerTest.item.isMelee) || (args.opposedTest.attackerTest.item && !args.opposedTest.attackerTest.item.name.includes("Ranged"))) -{ - let AP = parseInt(this.effect.sourceTest.result.SL) - args.modifiers.ap.value += AP; - args.modifiers.ap.magical += AP; - args.modifiers.ap.details.push(`${this.effect.name} (${AP})`) -} \ No newline at end of file diff --git a/scripts/NnDq4miIPNEtZUWb.js b/scripts/NnDq4miIPNEtZUWb.js deleted file mode 100644 index 14c9bf3..0000000 --- a/scripts/NnDq4miIPNEtZUWb.js +++ /dev/null @@ -1,7 +0,0 @@ -args.test.result.critModifier = args.test.result.critModifier || 0; -args.test.result.critModifier += 20; - -if (args.test.result.critical) -{ - args.test.result.critical = `${game.i18n.localize("Critical")} (+${args.test.result.critModifier})` -} \ No newline at end of file diff --git a/scripts/Np25JqEiaoqerEk8.js b/scripts/Np25JqEiaoqerEk8.js new file mode 100644 index 0000000..cd1689a --- /dev/null +++ b/scripts/Np25JqEiaoqerEk8.js @@ -0,0 +1,3 @@ +if (test.result.tables.miscast) { + test.result.other.push(`${this.effect.name}: You may reroll any result from the @Table[waaagh-miscast]{Waaagh! Miscast Table}.`); +} \ No newline at end of file diff --git a/scripts/Np8P8IPT2GYlrh6G.js b/scripts/Np8P8IPT2GYlrh6G.js deleted file mode 100644 index 64528cd..0000000 --- a/scripts/Np8P8IPT2GYlrh6G.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== `${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})` && args.type !== "channelling"; \ No newline at end of file diff --git a/scripts/NqFvdCKDLqIXaE9m.js b/scripts/NqFvdCKDLqIXaE9m.js new file mode 100644 index 0000000..20d187e --- /dev/null +++ b/scripts/NqFvdCKDLqIXaE9m.js @@ -0,0 +1 @@ +return args.weapon?.system.isMelee; \ No newline at end of file diff --git a/scripts/NrVFrIXM8GnIbojv.js b/scripts/NrVFrIXM8GnIbojv.js index c13398d..5888e50 100644 --- a/scripts/NrVFrIXM8GnIbojv.js +++ b/scripts/NrVFrIXM8GnIbojv.js @@ -1 +1 @@ -args.item.system.damage.value = `SB + ${this.actor.system.characteristics.fel.bonus}`; \ No newline at end of file +args.item.system.damage.value += `+ ${this.actor.system.characteristics.fel.bonus}`; \ No newline at end of file diff --git a/scripts/Nuth9S5UHIhpEuIC.js b/scripts/Nuth9S5UHIhpEuIC.js new file mode 100644 index 0000000..9338454 --- /dev/null +++ b/scripts/Nuth9S5UHIhpEuIC.js @@ -0,0 +1 @@ +args.fields.modifier -= 20 \ No newline at end of file diff --git a/scripts/NvaPNfZt5d9RqKSE.js b/scripts/NvaPNfZt5d9RqKSE.js new file mode 100644 index 0000000..4716615 --- /dev/null +++ b/scripts/NvaPNfZt5d9RqKSE.js @@ -0,0 +1,6 @@ +if (args.test.isCritical) { + args.test.result.tables.critical.modifier + = (typeof args.test.result.tables.critical.modifier ==='undefined') + ? 20 + : args.test.result.tables.critical.modifier + 20 +} \ No newline at end of file diff --git a/scripts/O45vpR4jDbQQnmvJ.js b/scripts/O45vpR4jDbQQnmvJ.js index 9d1a9c1..a81d495 100644 --- a/scripts/O45vpR4jDbQQnmvJ.js +++ b/scripts/O45vpR4jDbQQnmvJ.js @@ -6,7 +6,7 @@ etiquette.name += " (Suivants de Khorne)"; items.push(etiquette); let animosity = (await fromUuid("Compendium.wfrp4e-core.items.Item.Q2MCUrG2HppMcvN0")).toObject(); -animosity.name = animosity.name.replace("(Cible)", "(Suivants de Slaanesh)"); +animosity.name = animosity.name.replace("(Target)", "(Suivants de Slaanesh)"); items.push(animosity); diff --git a/scripts/O7lXFZLrLdFaShGR.js b/scripts/O7lXFZLrLdFaShGR.js index e5cf296..1380d6c 100644 --- a/scripts/O7lXFZLrLdFaShGR.js +++ b/scripts/O7lXFZLrLdFaShGR.js @@ -1 +1 @@ -args.options.catfall = true; \ No newline at end of file +args.context.catfall = true; \ No newline at end of file diff --git a/scripts/OBF6r2CsMOEokAsS.js b/scripts/OBF6r2CsMOEokAsS.js new file mode 100644 index 0000000..b3e56e5 --- /dev/null +++ b/scripts/OBF6r2CsMOEokAsS.js @@ -0,0 +1,2 @@ +args.weaponProperties.damaging = true; +args.weaponProperties.impale = true; \ No newline at end of file diff --git a/scripts/OEy2lxvic37dRBEt.js b/scripts/OEy2lxvic37dRBEt.js index 4a5d5ce..ca1d7cd 100644 --- a/scripts/OEy2lxvic37dRBEt.js +++ b/scripts/OEy2lxvic37dRBEt.js @@ -9,7 +9,7 @@ let filters = [ } ] -let petty = await ItemDialog.createFromFilters(filters, 3, "Choisissez 3 Sorts de Magie Mineure") +let petty = await ItemDialog.createFromFilters(filters, 3, {text : "Choisissez 3 Sorts Mineurs"}) filters = [ @@ -23,7 +23,7 @@ filters = [ } ] -let arcane = await ItemDialog.createFromFilters(filters, 3, "Choisissez 3 Sorts de Magie d'Arcane") +let arcane = await ItemDialog.createFromFilters(filters, 3, {text : "Choisissez 3 Sorts d'Arcane"}) let items = petty.concat(arcane).map(i => i.toObject()) diff --git a/scripts/OF4sSVOvHoKuPk7L.js b/scripts/OF4sSVOvHoKuPk7L.js new file mode 100644 index 0000000..c1da624 --- /dev/null +++ b/scripts/OF4sSVOvHoKuPk7L.js @@ -0,0 +1,8 @@ +if (this.item.flags.burning) return +const runesOfBurning = this.item.effects.contents.filter(e => e.name == this.effect.name) +const ablaze = runesOfBurning.length +args.actor.addCondition("ablaze", ablaze) +args.extraMessages.push( + "" + this.effect.name + ": " + + ablaze + " @Condition[Ablaze] Conditions") +this.item.flags.burning = true \ No newline at end of file diff --git a/scripts/OFViRemr1cpnO3af.js b/scripts/OFViRemr1cpnO3af.js new file mode 100644 index 0000000..557e478 --- /dev/null +++ b/scripts/OFViRemr1cpnO3af.js @@ -0,0 +1,6 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`}) +await test.roll(); +if (!test.succeeded) +{ + await this.actor.addCondition("bleeding"); +} \ No newline at end of file diff --git a/scripts/OGX4BneaYAnV25TO.js b/scripts/OGX4BneaYAnV25TO.js index a2c6e62..0d03c90 100644 --- a/scripts/OGX4BneaYAnV25TO.js +++ b/scripts/OGX4BneaYAnV25TO.js @@ -2,39 +2,39 @@ let chatData = { whisper: ChatMessage.getWhisperRecipients("GM") } let message = "" let wounds = foundry.utils.duplicate(this.actor.status.wounds) -let regenRoll = await new Roll("1d10").roll(); +let regenRoll = await new Roll("1d10").roll({allowInteractive : false}); let regen = regenRoll.total; -if (wounds.value >= wounds.max) +if (Blessures.value >= Blessures.max) return -if (wounds.value > 0) +if (Blessures.value > 0) { - wounds.value += regen - if (wounds.value > wounds.max) + Blessures.value += regen + if (Blessures.value > Blessures.max) { - wounds.value = wounds.max + Blessures.value = Blessures.max } - message += `${this.actor.name} regagne ${regen} Blessures.` + message += `${this.actor.name} regagne ${regen} Point de Blessures.` if (regen == 10) { - message += `
    Et guéri une Blessure Critique.` + message += `
    De plus, il guérit d'une Blessure Critique.` } } -else if (regen >= 8) +else if (regen >= 8) { - message += `${this.actor.name} a obtenu ${regen} et récupère 1 Blessure.` - wounds.value += 1 + message += `${this.actor.name} a fait un ${regen} et regagne 1 Point de Blessures.` + Blessures.value += 1 if (regen == 10) { - message += `
    Et guéri une Blessure Critique.` + message += `
    De plus, il guérit d'une Blessure Critique.` } } -else +else { - message += `${this.actor.name} Résultat de régénération de ${regen} - Aucun effet.` + message += `${this.actor.name} a fait un ${regen} et ne régénère pas de Point de Blessures.` } -await this.actor.update({ "system.status.wounds": wounds }) -this.script.scriptMessage(message, { whisper: ChatMessage.getWhisperRecipients("GM") }) \ No newline at end of file +await this.actor.update({ "system.status.wounds": Blessures }) +this.script.message(message, { whisper: ChatMessage.getWhisperRecipients("GM") }) \ No newline at end of file diff --git a/scripts/OYLqLl6vikJD8flg.js b/scripts/OYLqLl6vikJD8flg.js new file mode 100644 index 0000000..d2dbaf1 --- /dev/null +++ b/scripts/OYLqLl6vikJD8flg.js @@ -0,0 +1,4 @@ +const crowd = this.effect.getFlag("wfrp4e", "crowd") ?? 0; +const bonus = 2 + Math.floor(crowd * 0.1); + +args.fields.slBonus += bonus ; \ No newline at end of file diff --git a/scripts/OYRUSP7Q0Je0jdCY.js b/scripts/OYRUSP7Q0Je0jdCY.js new file mode 100644 index 0000000..774eb07 --- /dev/null +++ b/scripts/OYRUSP7Q0Je0jdCY.js @@ -0,0 +1,3 @@ +let species = await ValueDialog.create({text : "Entrez l'Espèce Cible", title : this.effect.name}) + +this.effect.updateSource({name : this.effect.setSpecifier(species)}); \ No newline at end of file diff --git a/scripts/OeCgX3hIsfLfmGvC.js b/scripts/OeCgX3hIsfLfmGvC.js deleted file mode 100644 index 6777873..0000000 --- a/scripts/OeCgX3hIsfLfmGvC.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Perception")) -await test.roll(); -if (test.succeeded) -{ - this.actor.removeCondition("surprised"); -} \ No newline at end of file diff --git a/scripts/OeKeQAAcJhdI4Qky.js b/scripts/OeKeQAAcJhdI4Qky.js index 92f01ea..3499978 100644 --- a/scripts/OeKeQAAcJhdI4Qky.js +++ b/scripts/OeKeQAAcJhdI4Qky.js @@ -1,5 +1,5 @@ if (this.actor.hasCondition("stunned") || this.actor.hasCondition("unconscious")) { - this.script.scriptNotification("Désactivé!"); + this.script.notification("Disabled!"); await this.effect.update({"disabled" : true}) } \ No newline at end of file diff --git a/scripts/OgSI0Z6SHjYuqKIz.js b/scripts/OgSI0Z6SHjYuqKIz.js deleted file mode 100644 index b1cf84f..0000000 --- a/scripts/OgSI0Z6SHjYuqKIz.js +++ /dev/null @@ -1,16 +0,0 @@ -let blows = this.item.getFlag("wfrp4e", "blows") || 0 -let difficulties = Object.keys(game.wfrp4e.config.difficultyLabels) - -blows = Math.clamped(blows, 0, difficulties.length - 1) -if (this.item.system.protects[args.opposedTest.result.hitloc.value]) -{ - let difficulty = difficulties[blows]; - this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields: {difficulty}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => { - await test.roll(); - if (test.failed) - { - this.script.scriptMessage(`${this.actor.name} doit cesser le combat et fuir à moins de réussir un jet Intermédiaire (+0) de Force Mentale`); - this.item.setFlag("wfrp4e", "failedCool", true); - } - }) -} \ No newline at end of file diff --git a/scripts/OicQSEVZBbqLtrcf.js b/scripts/OicQSEVZBbqLtrcf.js index 7d35048..9c203c7 100644 --- a/scripts/OicQSEVZBbqLtrcf.js +++ b/scripts/OicQSEVZBbqLtrcf.js @@ -1,4 +1,4 @@ -let choice = await ItemDialog.create(this.actor.itemTypes.critical, (this.effect.sourceTest.result.overcast.usage.other.current || 1), "Choisissez la Blessure Critique à soigner (ne peut guérir les membres perdus)") +let choice = await ItemDialog.create(this.actor.itemTypes.critical, (this.effect.sourceTest.result.overcast.usage.other.current || 1), "Choisir the Critique Blessures to heal (Impossible de reattach body parts)") -this.script.scriptMessage(`Guéri de ${choice.map(i => i.name).join(`, `)}`); +this.script.message(`Soin de ${choice.map(i => i.name).join(`, `)}`); this.actor.deleteEmbeddedDocuments("Item", choice.map(i => i.id)) \ No newline at end of file diff --git a/scripts/On1itZhp0AOzNyyc.js b/scripts/On1itZhp0AOzNyyc.js new file mode 100644 index 0000000..90fd9da --- /dev/null +++ b/scripts/On1itZhp0AOzNyyc.js @@ -0,0 +1,3 @@ +let test = await this.actor.setupSkill("Runesmithing", {appendTitle: ` - ${this.effect.name}`}); +await test.roll(); +this.effect.update({"disabled" : true}); \ No newline at end of file diff --git a/scripts/Op88kMtimSEWlY2h.js b/scripts/Op88kMtimSEWlY2h.js index 9f485ca..20383f5 100644 --- a/scripts/Op88kMtimSEWlY2h.js +++ b/scripts/Op88kMtimSEWlY2h.js @@ -6,5 +6,5 @@ if (this.item.system.quantity.value) } else { - this.script.scriptNotification("Aucun disponible!", "error") + this.script.notification("Plus rien !", "error") } \ No newline at end of file diff --git a/scripts/OqLKL0PiCvYH2QxW.js b/scripts/OqLKL0PiCvYH2QxW.js deleted file mode 100644 index a7317d8..0000000 --- a/scripts/OqLKL0PiCvYH2QxW.js +++ /dev/null @@ -1,13 +0,0 @@ -if (args.test.options.wallcrawler) -{ - if (parseInt(args.test.result.SL) < 0 || args.test.failed) - { - if (parseInt(args.test.result.SL) < 0) - { - args.test.result.SL = "+0"; - args.test.result.description = game.i18n.localize("ROLL.MarginalSuccess"); - } - args.test.result.outcome = "success" - args.test.result.other.push(`${this.effect.name}: Minimum +0 DR`) - } -} \ No newline at end of file diff --git a/scripts/OsLXutfXyQCAkhAf.js b/scripts/OsLXutfXyQCAkhAf.js index 3160e93..413860c 100644 --- a/scripts/OsLXutfXyQCAkhAf.js +++ b/scripts/OsLXutfXyQCAkhAf.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Voile'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Voile'; const difficulty = 'average'; const target = 30; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/OxsBnnVI3Smpknpb.js b/scripts/OxsBnnVI3Smpknpb.js index dabe09c..905c2a9 100644 --- a/scripts/OxsBnnVI3Smpknpb.js +++ b/scripts/OxsBnnVI3Smpknpb.js @@ -1,5 +1,5 @@ if (this.actor.status.advantage.value && !this.actor.sameSideAs(this.effect.sourceActor)) { this.actor.modifyAdvantage(-1); - this.script.scriptNotification(`${this.actor.name} perd 1 Avantage`); + this.script.notification(`${this.actor.name} loses 1 Advantage`); } \ No newline at end of file diff --git a/scripts/Oz7pWF9mEc1pQypj.js b/scripts/Oz7pWF9mEc1pQypj.js index c206691..a2bef0f 100644 --- a/scripts/Oz7pWF9mEc1pQypj.js +++ b/scripts/Oz7pWF9mEc1pQypj.js @@ -1,3 +1,3 @@ -let roll = await new Roll("1d10").roll(); +let roll = await new Roll("1d10").roll({allowInteractive : false}); roll.toMessage({flavor : this.effect.name, speaker : {alias : this.actor.prototypeToken.name}}) this.actor.addCondition("stunned", roll.total) \ No newline at end of file diff --git a/scripts/P29tT1eMMdAw3CPF.js b/scripts/P29tT1eMMdAw3CPF.js deleted file mode 100644 index 28be2ef..0000000 --- a/scripts/P29tT1eMMdAw3CPF.js +++ /dev/null @@ -1,12 +0,0 @@ -let item = await fromUuid("Compendium.wfrp4e-core.items.3S4OYOZLauXctmev") -let data = item.toObject(); -data.system.location.key = this.item.system.location.key -this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) - - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty: "hard"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("unconscious") -} \ No newline at end of file diff --git a/scripts/PBW6IZtwawNHxB6y.js b/scripts/PBW6IZtwawNHxB6y.js index f0a42aa..ec54017 100644 --- a/scripts/PBW6IZtwawNHxB6y.js +++ b/scripts/PBW6IZtwawNHxB6y.js @@ -1 +1 @@ -return args.options.dodge && this.actor.isMounted \ No newline at end of file +return args.context.dodge && this.actor.isMounted \ No newline at end of file diff --git a/scripts/PGHvFHBIygB5pnWT.js b/scripts/PGHvFHBIygB5pnWT.js new file mode 100644 index 0000000..c5783cf --- /dev/null +++ b/scripts/PGHvFHBIygB5pnWT.js @@ -0,0 +1,3 @@ +args.actor.addCondition("ablaze", 1) +args.extraMessages.push( + "" + this.effect.name + ": Ajout d'1 état @Condition[Ablaze]") \ No newline at end of file diff --git a/scripts/PI1QNaKFeqood6d7.js b/scripts/PI1QNaKFeqood6d7.js index dcae646..81bbe4b 100644 --- a/scripts/PI1QNaKFeqood6d7.js +++ b/scripts/PI1QNaKFeqood6d7.js @@ -7,8 +7,8 @@ if (args.attackerTest.weapon && args.defenderTest.weapon) if (attackerReach == defenderReach) attackerReach = attackerReach < 7 ? attackerReach + 1 : attackerReach - attackerReach = game.wfrp4e.utility.findKey(attackerReach, game.wfrp4e.config.reachNum) - defenderReach = game.wfrp4e.utility.findKey(defenderReach, game.wfrp4e.config.reachNum) + attackerReach = warhammer.utility.findKey(attackerReach, game.wfrp4e.config.reachNum) + defenderReach = warhammer.utility.findKey(defenderReach, game.wfrp4e.config.reachNum) args.attackerTest.weapon.reach.value = attackerReach args.defenderTest.weapon.reach.value = defenderReach diff --git a/scripts/PMISUsaEDBA7D3od.js b/scripts/PMISUsaEDBA7D3od.js deleted file mode 100644 index f8ce04c..0000000 --- a/scripts/PMISUsaEDBA7D3od.js +++ /dev/null @@ -1,33 +0,0 @@ -// After consumption, the user gains the Magic Resistance 3 Creature Trait, -// reducing the SL of any spell affecting it by 3. -// This effect lasts for one hour. -const hasMagicResistance = this.actor.has("Résistance à la Magie") - -if (hasMagicResistance === undefined) { - fromUuid("Compendium.wfrp4e-core.items.yrkI7ATjqLPDTFmZ").then(trait => { - let traitItem = trait.toObject() - traitItem.system.specification.value = 2 - this.actor.createEmbeddedDocuments("Item", [traitItem], {fromEffect: this.effect.id}) - }) - this.script.scriptMessage(`

    ${this.actor.prototypeToken.name} bénéficie du Trait Résistance à la Magie. Cet effet dure 1 heure.

    `, {whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) -} - -if (hasMagicResistance) { - // Multiple doses may be consumed at once, with each one adding an additional 1 to the Magic Resistance rating and increasing the duration by one hour. - let msg = `

    ${this.actor.prototypeToken.name} a amélioré sa Résistance à la Magie de 1 pour atteindre ${parseInt(hasMagicResistance.system.specification.value)}. Cette effte dure 1 heure.

    ` - - // Resist toxic effect - this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), { - fields: {difficulty: "challenging"} - }).then(async test => { - await test.roll() - - // If they fail ... - if (!test.succeeded) { - msg += `

    Cependant, il commence à suinter la bave épaisse et venimeuse qui recouvre chaque Dreadmaw. Il reçoit 1 état Empoisonné et doit continuer à recevoir 1 état @Condition[Empoisonné] andà la fin de chaque round.

    -

    Si le personnage est toujours vivant à la fin de 10 rounds, les effets cessent et tout les états Empoisonnés dues à ${this.effect.name} sont supprimés.

    ` - this.actor.addCondition("poisoned", 1) - } - this.script.scriptMessage(msg, {whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) - }) -} diff --git a/scripts/PMNjdEAusVBfam09.js b/scripts/PMNjdEAusVBfam09.js deleted file mode 100644 index 0132270..0000000 --- a/scripts/PMNjdEAusVBfam09.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name === game.i18n.localize("NAME.Charm"); \ No newline at end of file diff --git a/scripts/PVjaKAHTKDA0rA9J.js b/scripts/PVjaKAHTKDA0rA9J.js deleted file mode 100644 index 3406d92..0000000 --- a/scripts/PVjaKAHTKDA0rA9J.js +++ /dev/null @@ -1,2 +0,0 @@ -let test = await this.actor.setupSkill("Esquive", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}); -await test.roll(); \ No newline at end of file diff --git a/scripts/PdClojv7yNgQpOUc.js b/scripts/PdClojv7yNgQpOUc.js deleted file mode 100644 index 071f833..0000000 --- a/scripts/PdClojv7yNgQpOUc.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Endurance"); \ No newline at end of file diff --git a/scripts/PeZYj8b0vedyJj00.js b/scripts/PeZYj8b0vedyJj00.js index 1cb5a36..10c3a49 100644 --- a/scripts/PeZYj8b0vedyJj00.js +++ b/scripts/PeZYj8b0vedyJj00.js @@ -1,12 +1,12 @@ // This script needs to be separate because equipTransfer is off on the other effect, and thus won't execute when added to an actor let mainEffect = this.item.effects.contents[0]; -if (mainEffect.name.includes("(Lore)")) +if (mainEffect.name.includes("(Savoir)")) { - let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.magicLores, this.item.img), 1, "Choisissez le Savoir"); + let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.magicLores, this.item.img), 1, "Choisir Lore"); if (choice.length) { - mainEffect.update({name : mainEffect.name.replace("Lore", choice[0].name)}) + mainEffect.update({name : mainEffect.name.replace("Savoir", choice[0].name)}) this.item.update({name : this.item.name += ` (${choice[0].name})`}) } } diff --git a/scripts/Ph3TdQw1lGiFr049.js b/scripts/Ph3TdQw1lGiFr049.js index a75ea45..c370175 100644 --- a/scripts/Ph3TdQw1lGiFr049.js +++ b/scripts/Ph3TdQw1lGiFr049.js @@ -5,9 +5,9 @@ ["Langue (Magick)", "Esquive"].includes(args.test.item?.name)) { args.test.context.phantasmal = true; // Flag so items aren't readded if test is edited - let text = `${this.effect.name}: Ajout de Instable et Protection` + let text = `${this.effect.name}: Adding Unstable and Ward` args.test.result.other.push(text) - this.script.scriptNotification(text); + this.script.notification(text); let ward = await fromUuid("Compendium.wfrp4e-core.items.Bvd2aZ0gQUXHfCTh") let wardData = ward.toObject(); diff --git a/scripts/PjOi61gB2nSYooLs.js b/scripts/PjOi61gB2nSYooLs.js new file mode 100644 index 0000000..27d6865 --- /dev/null +++ b/scripts/PjOi61gB2nSYooLs.js @@ -0,0 +1 @@ +return this.sourceActor.uuid === this.actor.uuid || !args.item?.system?.isProjectiles; \ No newline at end of file diff --git a/scripts/PmELrzD3RmF9qKkO.js b/scripts/PmELrzD3RmF9qKkO.js index d102bed..32d02d0 100644 --- a/scripts/PmELrzD3RmF9qKkO.js +++ b/scripts/PmELrzD3RmF9qKkO.js @@ -1,9 +1,14 @@ -if (this.item.system.specification.value == "Size") +if (this.item.system.specification.value == "Taille") { - let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.actorSizes, this.item.img), 1, "Choisissez Size"); - if (choice[0]) + let size = this.item.specifier; + if (!size) { - this.item.updateSource({"system.specification.value" : choice[0].name}) - this.effect.updateSource({name : this.effect.name + ` (${choice[0].name})`}) + let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.actorTailles, this.item.img), 1, "Choisir Taille"); + if (choice[0]) + { + size = choice[0]?.name; + } } + this.item.updateSource({"system.specification.value" : size, name : this.item.baseName}) + this.effect.updateSource({name : this.effect.name + ` (${size})`}) } \ No newline at end of file diff --git a/scripts/Pn5fekTbkwlr61XU.js b/scripts/Pn5fekTbkwlr61XU.js index c28f434..eeaf8b9 100644 --- a/scripts/Pn5fekTbkwlr61XU.js +++ b/scripts/Pn5fekTbkwlr61XU.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Engineer)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Métier (Ingénieur)'; const difficulty = 'easy'; const target = 10; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/PoNnT5EqvLj2r5yf.js b/scripts/PoNnT5EqvLj2r5yf.js deleted file mode 100644 index af693bc..0000000 --- a/scripts/PoNnT5EqvLj2r5yf.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.OutdoorSurvival") && args.skill?.name != game.i18n.localize("NAME.Track"); \ No newline at end of file diff --git a/scripts/PsO7aTdELJt35eHP.js b/scripts/PsO7aTdELJt35eHP.js index 08dcbea..42aff4d 100644 --- a/scripts/PsO7aTdELJt35eHP.js +++ b/scripts/PsO7aTdELJt35eHP.js @@ -1,5 +1,5 @@ -let morale = await new Roll("-1d10").roll(); -let mood = await new Roll("-2d10").roll(); +let morale = await new Roll("-1d10").roll({allowInteractive : false}); +let mood = await new Roll("-2d10").roll({allowInteractive : false}); morale.toMessage(this.script.getChatData({flavor : "Morale"})); mood.toMessage(this.script.getChatData({flavor : "Manann's Mood"})); diff --git a/scripts/Puv2wLrSVe6b1jLf.js b/scripts/Puv2wLrSVe6b1jLf.js new file mode 100644 index 0000000..8c79985 --- /dev/null +++ b/scripts/Puv2wLrSVe6b1jLf.js @@ -0,0 +1,4 @@ +if (args.sizeDiff < 0 ) { + args.damage += 3 + args.breakdown.other.push({label : this.effect.name, value : 3}); +} \ No newline at end of file diff --git a/scripts/PwqTmw7rsG8hzqCS.js b/scripts/PwqTmw7rsG8hzqCS.js index a4d2b43..5550255 100644 --- a/scripts/PwqTmw7rsG8hzqCS.js +++ b/scripts/PwqTmw7rsG8hzqCS.js @@ -3,7 +3,7 @@ if (args.test.result.critical && args.test.result.roll % 10 == 0) game.wfrp4e.tables.findTable("knuckleduster-diseases").roll().then(roll => { let results = roll.results[0] - this.script.scriptMessage(`${this.actor.name} subit @UUID[Compendium.${results.documentCollection}.${results.documentId}]{${results.text}}`, {blind : true, whisper: ChatMessage.getWhisperRecipients("GM") }) + this.script.message(`${this.actor.name} contracts @UUID[Compendium.${results.documentCollection}.${results.documentId}]{${results.text}}`, {blind : true, whisper: ChatMessage.getWhisperRecipients("GM") }) }) } diff --git a/scripts/Q1trEhtqjIiDvFPF.js b/scripts/Q1trEhtqjIiDvFPF.js index edff223..b774017 100644 --- a/scripts/Q1trEhtqjIiDvFPF.js +++ b/scripts/Q1trEhtqjIiDvFPF.js @@ -1 +1 @@ -args.prefillModifiers.modifier -= 10 * getProperty(this.effect, 'flags.wfrp4e.value') \ No newline at end of file +args.prefillModifiers.modifier -= 10 * this.effect.system.condition.value \ No newline at end of file diff --git a/scripts/Q4EQgP4gZR8TTm7S.js b/scripts/Q4EQgP4gZR8TTm7S.js deleted file mode 100644 index b38c7fa..0000000 --- a/scripts/Q4EQgP4gZR8TTm7S.js +++ /dev/null @@ -1,9 +0,0 @@ -let penalty = 0 -if (args.item?.system.attackType) -{ - penalty -= 30 -} -if (args.actor.has("Seconde Vue", "talent")) - penalty += 10 - -args.prefillModifiers.modifier += penalty \ No newline at end of file diff --git a/scripts/Q5gh5Y9dCdclcwsD.js b/scripts/Q5gh5Y9dCdclcwsD.js deleted file mode 100644 index 50f5352..0000000 --- a/scripts/Q5gh5Y9dCdclcwsD.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) && args.skill?.name != `${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})` \ No newline at end of file diff --git a/scripts/Q68WiUWY7GxiXBbT.js b/scripts/Q68WiUWY7GxiXBbT.js index 9883f8c..7eb5c8a 100644 --- a/scripts/Q68WiUWY7GxiXBbT.js +++ b/scripts/Q68WiUWY7GxiXBbT.js @@ -1,5 +1,5 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.9GNpAqgsKzxZKJpp") let data = item.toObject(); -data.system.specification.value = "Lorsque seul"; +data.system.specification.value = "Lorsque Seul"; data.effects[0].disabled = true; this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/Q7eULXQ9AfDRmUGO.js b/scripts/Q7eULXQ9AfDRmUGO.js index cc6f75f..1c48862 100644 --- a/scripts/Q7eULXQ9AfDRmUGO.js +++ b/scripts/Q7eULXQ9AfDRmUGO.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpenter)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Métier (Charpentier)'; const difficulty = 'difficult'; const target = 40; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/Q9EmlWmuDac83cJw.js b/scripts/Q9EmlWmuDac83cJw.js deleted file mode 100644 index 65e9e2e..0000000 --- a/scripts/Q9EmlWmuDac83cJw.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Climb") || args.skill?.name?.includes(game.i18n.localize("NAME.Stealth")); \ No newline at end of file diff --git a/scripts/QBBrzcSAe8QqE4WP.js b/scripts/QBBrzcSAe8QqE4WP.js new file mode 100644 index 0000000..fccec42 --- /dev/null +++ b/scripts/QBBrzcSAe8QqE4WP.js @@ -0,0 +1,18 @@ +const SL = this.effect.sourceTest.result.SL; +const damage = 8 + SL; + +await this.actor.applyBasicDamage(damage, {loc: "roll"}); + +const test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), { + skipTargets: true, + appendTitle: ` - ${this.effect.name}`, + fields: {difficulty: "challenging"}, + context: { + failure: `Reçoit 1 état @Condition[Ablaze].` + } +}) + +await test.roll(); +if (test.failed) { + await this.actor.addCondition("ablaze"); +} \ No newline at end of file diff --git a/scripts/QKt9ZYpVpznncfJ1.js b/scripts/QKt9ZYpVpznncfJ1.js new file mode 100644 index 0000000..de3700d --- /dev/null +++ b/scripts/QKt9ZYpVpznncfJ1.js @@ -0,0 +1,7 @@ +for(let key in this.item.system.AP) +{ + if (this.item.system.AP[key]) + { + this.item.system.AP[key]++; + } +} \ No newline at end of file diff --git a/scripts/QLBxcP85duX1Z7LX.js b/scripts/QLBxcP85duX1Z7LX.js new file mode 100644 index 0000000..a733ac6 --- /dev/null +++ b/scripts/QLBxcP85duX1Z7LX.js @@ -0,0 +1,3 @@ +if (!args.item.actor?.has("Béni (Taal)", "talent")) return; + +args.item.system.AP.head = 3; \ No newline at end of file diff --git a/scripts/QLUaOkwuSPvBp7jU.js b/scripts/QLUaOkwuSPvBp7jU.js new file mode 100644 index 0000000..56fe989 --- /dev/null +++ b/scripts/QLUaOkwuSPvBp7jU.js @@ -0,0 +1,2 @@ +this.script.scriptNotification("Impossible d'attaquer des cibles qui ne sont pas Empêtrée") +args.abort = true; \ No newline at end of file diff --git a/scripts/QNxmImpLTou6WdMQ.js b/scripts/QNxmImpLTou6WdMQ.js index ee0cb1b..05d0e54 100644 --- a/scripts/QNxmImpLTou6WdMQ.js +++ b/scripts/QNxmImpLTou6WdMQ.js @@ -1,3 +1,3 @@ let test = args.test if (test.result.minormis || test.result.majormis || test.result.catastrophicmis) - test.result.other.push("Peut faire un Test de Force Mentale Difficile (-10) pour éviter l'Incantation Imparfaite") \ No newline at end of file + test.result.other.push("Possibilité de faire un test de FM Difficile (-10) pour prévenir la Maladresse") \ No newline at end of file diff --git a/scripts/QPVVDPcJ4Xi5FmQl.js b/scripts/QPVVDPcJ4Xi5FmQl.js deleted file mode 100644 index 340975c..0000000 --- a/scripts/QPVVDPcJ4Xi5FmQl.js +++ /dev/null @@ -1,9 +0,0 @@ -if(this.actor.hasCondition("fatigued") && args.opposedTest.result.hitloc.value == "head" && (args.opposedTest.attackerTest.result.critical || args.actor.status.wounds.value - args.totalWoundLoss < 0)) -{ - let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), { fields: { difficulty: "average" }, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) - await test.roll(); - if (test.failed) - { - this.actor.addCondition("unconscious") - } -} \ No newline at end of file diff --git a/scripts/QQ2gHThZHdO4yLLX.js b/scripts/QQ2gHThZHdO4yLLX.js deleted file mode 100644 index abb25c3..0000000 --- a/scripts/QQ2gHThZHdO4yLLX.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Swim"); \ No newline at end of file diff --git a/scripts/QRSACifDrvojIXHB.js b/scripts/QRSACifDrvojIXHB.js index e475e62..88476df 100644 --- a/scripts/QRSACifDrvojIXHB.js +++ b/scripts/QRSACifDrvojIXHB.js @@ -1,9 +1,9 @@ if (!this.actor.effects.find(e => e.isCondition)) { - return this.script.scriptNotification("Aucun état sur cet Acteur") + return this.script.notification("Aucun état sur cet acteur") } -let choice = await ItemDialog.create(this.actor.effects.filter(i => i.isCondition), 1, "Choisissez un état") +let choice = await ItemDialog.create(this.actor.effects.filter(i => i.isCondition), 1, "Choisir un état") if (choice[0]) { diff --git a/scripts/QfTBRGXVfwQSghmd.js b/scripts/QfTBRGXVfwQSghmd.js deleted file mode 100644 index 733f235..0000000 --- a/scripts/QfTBRGXVfwQSghmd.js +++ /dev/null @@ -1,18 +0,0 @@ -fromUuid(this.effect.origin).then(caster => { - if (caster) { - if (actor.items.find(it => it.name == game.i18n.localize("Bestial"))) { - let healed = caster.characteristics.wp.bonus - let wounds = foundry.utils.duplicate(args.actor.status.wounds) - wounds.value += healed - - if (wounds.value > wounds.max) - wounds.value = wounds.max - - args.actor.update({ "system.status.wounds": wounds }) - ChatMessage.create({ content: `${this.actor.prototypeToken.name} regagne ${healed} Blessures`, speaker: { alias: this.effect.name } }) - } else { - ui.notifications.warn("L'Acteur ciblé n'a pas le Trait Bestial") - } - } -}) - diff --git a/scripts/Qgn92fZyc3Psn8QJ.js b/scripts/Qgn92fZyc3Psn8QJ.js index 315a269..83938de 100644 --- a/scripts/Qgn92fZyc3Psn8QJ.js +++ b/scripts/Qgn92fZyc3Psn8QJ.js @@ -1,11 +1,14 @@ -if (args.test.options.useOnesAttractive && (args.test.result.roll <= game.settings.get("wfrp4e", "automaticSuccess") || args.test.result.roll <= args.test.target)) -{ +if (args.test.options.useOnesAttractive && (args.test.result.roll <= game.settings.get("wfrp4e", "automaticSuccess") || args.test.result.roll <= args.test.target)) { -let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll / 10) -let ones = Number(args.test.result.roll.toString().split("").pop()) + let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll / 10) + let ones = Number(args.test.result.roll.toString().split("").pop()) -if (ones > SL) { - args.test.data.result.SL = "+" + (ones + args.test.successBonus + args.test.slBonus) - args.test.result.other.push(`${this.effect.name}: Utilise le dé d'unité comme DR`) - } + if (ones == 0) { + ones = 10; + } + + if (ones > SL) { + args.test.result.SL = "+" + (ones + args.test.successBonus + args.test.slBonus) + args.test.result.other.push(`${this.effect.name}: Unité du dé utilisée comme DR`) + } } \ No newline at end of file diff --git a/scripts/Qk7t2l5ep9RDVpgE.js b/scripts/Qk7t2l5ep9RDVpgE.js index 80de579..c97c82d 100644 --- a/scripts/Qk7t2l5ep9RDVpgE.js +++ b/scripts/Qk7t2l5ep9RDVpgE.js @@ -1 +1 @@ -args.options.diceman= true; \ No newline at end of file +args.context.diceman= true; \ No newline at end of file diff --git a/scripts/QoEOxRruQXYrZrv3.js b/scripts/QoEOxRruQXYrZrv3.js index 1d570a2..9dacf2e 100644 --- a/scripts/QoEOxRruQXYrZrv3.js +++ b/scripts/QoEOxRruQXYrZrv3.js @@ -10,7 +10,7 @@ let filters = [ } ] -let items = await ItemDialog.createFromFilters(filters, 2, "Choisissez 2 Skills to add +20") +let items = await ItemDialog.createFromFilters(filters, 2, {text: "Choisissez 2 Compétences pour ajouter +20"}) items = items.map(i => i.toObject()) items.forEach(i => i.system.advances.value = 20) diff --git a/scripts/QqybHxNCzPEzG1Qh.js b/scripts/QqybHxNCzPEzG1Qh.js index 05952e9..e895caa 100644 --- a/scripts/QqybHxNCzPEzG1Qh.js +++ b/scripts/QqybHxNCzPEzG1Qh.js @@ -1 +1 @@ -return args.fields.dualWielding || args.options.dualWieldOffhand \ No newline at end of file +return args.context.dualWieldOffhand \ No newline at end of file diff --git a/scripts/QwHoqu2oO8QO8Mad.js b/scripts/QwHoqu2oO8QO8Mad.js index 084a8f6..58f453c 100644 --- a/scripts/QwHoqu2oO8QO8Mad.js +++ b/scripts/QwHoqu2oO8QO8Mad.js @@ -1,3 +1,3 @@ -let content = `${this.effect.name}: Toute les cibles au contact abec ${this.actor.prototypeToken.name} subissent [[/r 1d10]] dégats, modifiés par le BE et les PA.` +let content = `${this.effect.name}: All targets engaged with ${this.actor.prototypeToken.name} take [[/r 1d10]] Damage, modified by TB and AP.` -this.script.scriptMessage(content) \ No newline at end of file +this.script.message(content) \ No newline at end of file diff --git a/scripts/R32U01LBjBrK1pns.js b/scripts/R32U01LBjBrK1pns.js index dfbffe7..9877ef5 100644 --- a/scripts/R32U01LBjBrK1pns.js +++ b/scripts/R32U01LBjBrK1pns.js @@ -1,11 +1,11 @@ const templateMap = { 'P2e7Yx98bK3u110a' : "", - 'iuMp3KLaMT2WCmie' : "Xp4r2KUhqfjak8zq", - 'RBuYcT5tppwcmnC5' : "wYN19h3WVF1yOVq2", - 'vcGpNwNbhvfzVveQ' : "ac5ClOuaYtzOYyWp", - 'jmhKZy0w9TzkEK9c' : "IS3LTdTuay6uRHUq", - '9Byj6k7SmdTYis2V' : "LjMlx99gBGeRJUQu", - 'laJwc2l9tzJPgaaJ' : "x5wpMprsObuqMCYg", + 'iuMp3KLaMT2WCmie' : "4s01nHFKVKTEZd3B", + 'RBuYcT5tppwcmnC5' : "h3yuJDWnixliXeBG", + 'vcGpNwNbhvfzVveQ' : "7QrsbofccMOE1YsF", + 'jmhKZy0w9TzkEK9c' : "scVTPVyDDbli4WZL", + '9Byj6k7SmdTYis2V' : "4Cd7Dknee2WjReOo", + 'laJwc2l9tzJPgaaJ' : "2hJ2a5YjbwZWWYrd", } let template = (await game.wfrp4e.tables.rollTable("hireling-templates", {hideDSN: true})).object; let physicalQuirk = (await game.wfrp4e.tables.rollTable("physical-quirks", {hideDSN: true})).text; @@ -15,14 +15,14 @@ let templateItem = await warhammer.utility.findItemId(templateMap[template._id]); - let bio = + let bio = `

    Template: ${template.text}

    -

    Trait physique: ${physicalQuirk}

    -

    Ethique: ${workEthic}

    -

    Trait de personnalité: ${personalityQuirk}

    +

    Particularité physique: ${physicalQuirk}

    +

    Éthique de travail: ${workEthic}

    +

    Particularité de personnalité: ${personalityQuirk}

    ` - + this.script.message(bio, {whisper : ChatMessage.getWhisperRecipients("GM")}) await this.actor.update({"system.details.gmnotes.value" : bio}) diff --git a/scripts/R3OfRdi6xv0e9mzB.js b/scripts/R3OfRdi6xv0e9mzB.js new file mode 100644 index 0000000..e1f7a88 --- /dev/null +++ b/scripts/R3OfRdi6xv0e9mzB.js @@ -0,0 +1 @@ +return args.item.name.includes("Arme") \ No newline at end of file diff --git a/scripts/R6SnyF3y4Vsq6oga.js b/scripts/R6SnyF3y4Vsq6oga.js index e978a64..9cb3f07 100644 --- a/scripts/R6SnyF3y4Vsq6oga.js +++ b/scripts/R6SnyF3y4Vsq6oga.js @@ -1,9 +1,8 @@ let lore = this.effect.name.split("(")[1].split(")")[0].toLowerCase(); -let spellLore = game.wfrp4e.config.magicLores[args.spell.system.lore.value].toLowerCase(); // If channelling corresponding lore -if (args.type == "channelling" && spellLore == lore) +if (args.type == "channelling" && args.spell.system.lore.value == lore) args.prefillModifiers.slBonus += 1 // If channelling or casting different lore -else if (spellLore != lore && args.spell.system.lore.value != "petty") +else if (args.spell.system.lore.value != lore && args.spell.system.lore.value != "petty") args.prefillModifiers.slBonus -= 1 \ No newline at end of file diff --git a/scripts/R8FBHZaaARA3z9pB.js b/scripts/R8FBHZaaARA3z9pB.js index 4e91175..ff7ba87 100644 --- a/scripts/R8FBHZaaARA3z9pB.js +++ b/scripts/R8FBHZaaARA3z9pB.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpenter)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Métier (Charpentier)'; const difficulty = 'hard'; const target = 40; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/R8ecKGRzOr4ThvVa.js b/scripts/R8ecKGRzOr4ThvVa.js index 4c9fff3..e9dd98e 100644 --- a/scripts/R8ecKGRzOr4ThvVa.js +++ b/scripts/R8ecKGRzOr4ThvVa.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Maintenance Crew Test'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Maintenance Crew Test'; const difficulty = 'hard'; const target = 80; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/RDtJXji3hgcKnEBk.js b/scripts/RDtJXji3hgcKnEBk.js deleted file mode 100644 index e557c94..0000000 --- a/scripts/RDtJXji3hgcKnEBk.js +++ /dev/null @@ -1,33 +0,0 @@ -let as = (await fromUuid("Compendium.wfrp4e-core.items.Item.9h82z72XGo9tfgQS")).toObject(); -let hv = (await fromUuid("Compendium.wfrp4e-core.items.Item.Nj3tC8A5fZ3zEdMR")).toObject(); -let ms = (await fromUuid("Compendium.wfrp4e-core.items.Item.6w30u0VPsAicrqb5")).toObject(); -let ss = (await fromUuid("Compendium.wfrp4e-core.items.Item.OEjUvJKi0xmBwbS2")).toObject(); - -as.name += " (Vue)"; - -let roll = (await new Roll("1d10").roll()); -roll.toMessage(this.script.getChatData()) -let items = [] - -if (roll.total <= 2) -{ - items = items.concat([as]); -} -else if (roll.total <= 4) -{ - items = items.concat([hv]); -} -else if (roll.total <= 6) -{ - items = items.concat([ms]); -} -else if (roll.total <= 8) -{ - items = items.concat([ss]); -} -else if (roll.total <= 10) -{ - items = items.concat([as, hv, ms, ss]); -} - -this.actor.createEmbeddedDocuments("Item", items, {fromEffect: this.effect.id}) \ No newline at end of file diff --git a/scripts/RHyBLYT5oHf7EPnG.js b/scripts/RHyBLYT5oHf7EPnG.js deleted file mode 100644 index 99ec6ac..0000000 --- a/scripts/RHyBLYT5oHf7EPnG.js +++ /dev/null @@ -1,21 +0,0 @@ -let skills = this.actor.itemTypes.skill.filter(i => i.name.includes(game.i18n.localize("NAME.Melee"))) - -let skill = await ItemDialog.create(skills, 1, "Sélectionnez la compétence à utiliser avec l'arme") -let group = game.wfrp4e.utility.extractParenthesesText(skill[0]?.name) -let groupKey = game.wfrp4e.utility.findKey(group, game.wfrp4e.config.weaponGroups) - -let weapon = { - name : this.effect.name, - type : "weapon", - img : this.effect.img, - system : { - "damage.value" : this.actor.system.characteristics.wp.bonus, - "weaponGroup.value" : groupKey || "basic", - "twohanded.value" : ["polearm", "twohanded"].includes(groupKey), - "reach.value" : "average", - "qualities.value" : [{name : "magical"}] - }, -} - -Item.implementation.create(foundry.utils.expandObject(weapon), {parent : this.actor, fromEffect : this.effect.id}) -this.script.scriptNotification("Item créé. Les modifications supplémentaires doivent être réalisées manuellement sur la fiche de l'objet."); \ No newline at end of file diff --git a/scripts/RKIFGN583PQnqHGk.js b/scripts/RKIFGN583PQnqHGk.js index 223f490..865cf57 100644 --- a/scripts/RKIFGN583PQnqHGk.js +++ b/scripts/RKIFGN583PQnqHGk.js @@ -1,5 +1,5 @@ if (args.opposedTest.result.hitloc.value == "body" && args.totalWoundLoss > 0) { args.actor.addCondition("bleeding", 2) - this.script.scriptMessage("Ajout de 2 état Hémorragiques") + this.script.message("Gain de 2 états Hémorragique") } \ No newline at end of file diff --git a/scripts/RNr9CwyvLhlnwD2h.js b/scripts/RNr9CwyvLhlnwD2h.js deleted file mode 100644 index 2dbcde4..0000000 --- a/scripts/RNr9CwyvLhlnwD2h.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Sail")); \ No newline at end of file diff --git a/scripts/ROXCqAFSTLouJniL.js b/scripts/ROXCqAFSTLouJniL.js index 979b433..3ffc34d 100644 --- a/scripts/ROXCqAFSTLouJniL.js +++ b/scripts/ROXCqAFSTLouJniL.js @@ -2,6 +2,6 @@ if (args.test.spell.name == "Warp Lightning") { if (args.test.result.minormis || args.test.result.majormis || args.test.result.catastrophicmis) { - this.script.scriptMessage(`${this.item.name} Surcharge!`) + this.script.message(`${this.item.name} Overloads!`) } } \ No newline at end of file diff --git a/scripts/RPqgRUkiLY5thVbC.js b/scripts/RPqgRUkiLY5thVbC.js index f120b28..41a24f9 100644 --- a/scripts/RPqgRUkiLY5thVbC.js +++ b/scripts/RPqgRUkiLY5thVbC.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Strength'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Strength'; const difficulty = 'average'; const target = 10; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/RRK91ySi5SzYCRvy.js b/scripts/RRK91ySi5SzYCRvy.js new file mode 100644 index 0000000..bafc503 --- /dev/null +++ b/scripts/RRK91ySi5SzYCRvy.js @@ -0,0 +1 @@ +return args.weapon?.system.isProjectiles \ No newline at end of file diff --git a/scripts/RSsGiDFibuqg3sHr.js b/scripts/RSsGiDFibuqg3sHr.js index af0157e..4a0a1cd 100644 --- a/scripts/RSsGiDFibuqg3sHr.js +++ b/scripts/RSsGiDFibuqg3sHr.js @@ -7,7 +7,7 @@ let diseaseIndex = game.packs return i }) -let choice = await ItemDialog.create(diseaseIndex , 1, "Choisissez une maladie") +let choice = await ItemDialog.create(diseaseIndex , 1, "Choisir une maladie") if (choice[0]) { diff --git a/scripts/RUpVgB0czqg95K1Q.js b/scripts/RUpVgB0czqg95K1Q.js new file mode 100644 index 0000000..cb6a162 --- /dev/null +++ b/scripts/RUpVgB0czqg95K1Q.js @@ -0,0 +1,4 @@ +if (this.item.system.protects[args.opposedTest.result.hitloc.value]) +{ + args.weaponProperties.qualities.penetrating = false; +} \ No newline at end of file diff --git a/scripts/ReJpL0IVesKUbXgj.js b/scripts/ReJpL0IVesKUbXgj.js new file mode 100644 index 0000000..08a7399 --- /dev/null +++ b/scripts/ReJpL0IVesKUbXgj.js @@ -0,0 +1 @@ +args.fields.slBonus -= 8; \ No newline at end of file diff --git a/scripts/RgNdS87nO7RVawuw.js b/scripts/RgNdS87nO7RVawuw.js new file mode 100644 index 0000000..e016b9f --- /dev/null +++ b/scripts/RgNdS87nO7RVawuw.js @@ -0,0 +1 @@ +this.actor.removeCondition("fatigued", 1); \ No newline at end of file diff --git a/scripts/RlVvlmhOfscaJqCd.js b/scripts/RlVvlmhOfscaJqCd.js new file mode 100644 index 0000000..785440d --- /dev/null +++ b/scripts/RlVvlmhOfscaJqCd.js @@ -0,0 +1,9 @@ +const deletes = this.actor.itemTags.armour.map(a => { + return {_id: a._id} +}); +const armourTrait = this.actor.itemTags.trait.find(t => t.name === game.i18n.localize("NAME.TraitArmour")); + +if (armourTrait) + deletes.push({_id: armourTrait._id}); + +this.actor.deleteEmbeddedDocuments("Item", deletes); \ No newline at end of file diff --git a/scripts/RlhOAKfN0ghrrooR.js b/scripts/RlhOAKfN0ghrrooR.js index b0e5aae..2d9374e 100644 --- a/scripts/RlhOAKfN0ghrrooR.js +++ b/scripts/RlhOAKfN0ghrrooR.js @@ -4,4 +4,4 @@ for (let effect of holed) { await effect.update({name: effect.name.replace(/\d+/, rating => parseInt(rating) * 2)}); } -this.script.scriptNotification(`Holed Ratings of ${this.actor.name} have been doubled.`); \ No newline at end of file +this.script.notification(`Holed Ratings of ${this.actor.name} have been doubled.`); \ No newline at end of file diff --git a/scripts/Rnpw6UQdJifLeuna.js b/scripts/Rnpw6UQdJifLeuna.js index b9fc369..df9201b 100644 --- a/scripts/Rnpw6UQdJifLeuna.js +++ b/scripts/Rnpw6UQdJifLeuna.js @@ -1 +1 @@ -this.effect.updateSource({"flags.wfrp4e.applicationData.type" : "crew"}) \ No newline at end of file +this.effect.updateSource({"system.transferData.type" : "crew"}) \ No newline at end of file diff --git a/scripts/RprZWlnopSqZt7KZ.js b/scripts/RprZWlnopSqZt7KZ.js deleted file mode 100644 index 523491c..0000000 --- a/scripts/RprZWlnopSqZt7KZ.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Stealth")); \ No newline at end of file diff --git a/scripts/RrchOMpEdIvceJxl.js b/scripts/RrchOMpEdIvceJxl.js deleted file mode 100644 index b1d1cc8..0000000 --- a/scripts/RrchOMpEdIvceJxl.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == "Discrétion (Rurale)" \ No newline at end of file diff --git a/scripts/RvipIYj9H7n4UDMe.js b/scripts/RvipIYj9H7n4UDMe.js index 068db78..a3292cc 100644 --- a/scripts/RvipIYj9H7n4UDMe.js +++ b/scripts/RvipIYj9H7n4UDMe.js @@ -25,14 +25,14 @@ for (let ch in characteristics) for (let index = 0; index < skills.length; index++) { - let skill = skills[index] + let Compétence = skills[index] let skillItem; - skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") + skillItem = updateObj.items.find(i => i.name == Compétence && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { - skillItem = await game.wfrp4e.utility.findSkill(skill) + skillItem = await game.wfrp4e.utility.findSkill(Compétence) skillItem = skillItem.toObject(); skillItem.system.advances.value = skillAdvancements[index]; items.push(skillItem); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,7 +63,7 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } diff --git a/scripts/RwMw848y13Jq2L4f.js b/scripts/RwMw848y13Jq2L4f.js index 6ca32d3..e6bdeed 100644 --- a/scripts/RwMw848y13Jq2L4f.js +++ b/scripts/RwMw848y13Jq2L4f.js @@ -1,12 +1,12 @@ let test = await this.actor.setupSkill("Résistance", {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`}); -await test.roll(); -if (test.failed) +await Test.roll(); +if (Test.Échoué) { await this.actor.addCondition("blinded"); } let msg = `` -let armour = args.actor.itemTypes.armour.filter(i => i.system.isMetal && i.system.isEquipped); +let armour = args.actor.itemTags.armour.filter(i => i.system.isMetal && i.system.isEquipped); for(let item of armour) { for(let key in item.system.AP) @@ -15,9 +15,9 @@ for(let item of armour) let damage = Math.floor(AP / 2); await item.system.damageItem(damage, [key]); } - msg += `

    ${item.name} PA divisé par 2

    ` + msg += `

    ${item.name} PA divisé par deux

    ` } if (msg) { - this.script.scriptMessage(msg, {speaker : {alias : args.actor.name}}); + this.script.message(msg, {speaker : {alias : args.actor.name}}); } \ No newline at end of file diff --git a/scripts/RyQtuiRykUCQ6Xag.js b/scripts/RyQtuiRykUCQ6Xag.js new file mode 100644 index 0000000..1d6af42 --- /dev/null +++ b/scripts/RyQtuiRykUCQ6Xag.js @@ -0,0 +1,3 @@ +if (!this.item.actor.name.includes("Brunner")) return; + +args.actor.addCondition("ablaze"); \ No newline at end of file diff --git a/scripts/S1QihXuvdEVzeRtB.js b/scripts/S1QihXuvdEVzeRtB.js index 37f949e..42da3f3 100644 --- a/scripts/S1QihXuvdEVzeRtB.js +++ b/scripts/S1QihXuvdEVzeRtB.js @@ -27,7 +27,7 @@ else if (roll = 10) modifier = -5 } -message = `Résultat de ${roll}, gagnez ${item.name}, ${modifier} en Force` +message = `${roll} Rolled, gain ${item.name}, ${modifier} Strength` dice.toMessage(this.script.getChatData()) let changes = foundry.utils.duplicate(this.effect.changes) @@ -37,4 +37,4 @@ this.effect.updateSource({changes}) await this.actor.createEmbeddedDocuments("Item", [item.toObject()], {fromEffect : this.effect.id}) -this.script.scriptNotification(message) \ No newline at end of file +this.script.notification(message) \ No newline at end of file diff --git a/scripts/S1SQe0Do7ZcuNV5j.js b/scripts/S1SQe0Do7ZcuNV5j.js new file mode 100644 index 0000000..e1e780d --- /dev/null +++ b/scripts/S1SQe0Do7ZcuNV5j.js @@ -0,0 +1,4 @@ +if (!["roll", "none"].includes(args.fields.hitLocation)) +{ + args.fields.modifier += 20; +} \ No newline at end of file diff --git a/scripts/S3Dev4hleOYqDNe9.js b/scripts/S3Dev4hleOYqDNe9.js index c014e56..3849dd9 100644 --- a/scripts/S3Dev4hleOYqDNe9.js +++ b/scripts/S3Dev4hleOYqDNe9.js @@ -1,5 +1,5 @@ if (args.test.options.healWounds) { - if (args.test.succeeded) + if (args.test.succeeded) { let wounds = this.actor.characteristics.int.bonus + Number(args.test.result.SL) if (args.test.options.fieldDressing && args.test.result.reversed) @@ -7,10 +7,10 @@ if (args.test.options.healWounds) { wounds = this.actor.characteristics.int.bonus + Math.min(1, Number(args.test.result.SL)) } args.test.result.woundsHealed = wounds - args.test.result.other.push(`${this.actor.name} guérit ${wounds} Points de Blessures du patient.`) + args.test.result.other.push(`${this.actor.name} guéri ${wounds} Blessures du patient.`) } else if (this.actor.characteristics.int.bonus + Number(args.test.result.SL) < 0) { - args.test.result.other.push(`Le patient subit une @UUID[Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg]{Infection Mineure}.`) + args.test.result.other.push(`Le patient contracte une @UUID[Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg]{Infection Mineure}.`) } } \ No newline at end of file diff --git a/scripts/S4793DLFhjMxpM8x.js b/scripts/S4793DLFhjMxpM8x.js index 4f2f739..e04c764 100644 --- a/scripts/S4793DLFhjMxpM8x.js +++ b/scripts/S4793DLFhjMxpM8x.js @@ -1 +1 @@ -return !["ws", "bs"].includes(args.characteristic) && !args.item?.system.attackType && !args.options.dodge \ No newline at end of file +return !["ws", "bs"].includes(args.characteristic) && !args.item?.system.attackType && !args.context.dodge \ No newline at end of file diff --git a/scripts/SGr50Hq1AHIEzIFN.js b/scripts/SGr50Hq1AHIEzIFN.js index 0b6d374..cbce324 100644 --- a/scripts/SGr50Hq1AHIEzIFN.js +++ b/scripts/SGr50Hq1AHIEzIFN.js @@ -1,6 +1,6 @@ let choice = await ItemDialog.create(ItemDialog.objectToArray({ int : game.wfrp4e.config.characteristics.int, fel : game.wfrp4e.config.characteristics.fel -}, this.effect.img), 1, "Choisissez une caractéristique"); +}, this.effect.img), 1, "Choisir une caractéristique"); this.effect.updateSource({"flags.wfrp4e.characteristic" : choice[0].id}) \ No newline at end of file diff --git a/scripts/SK8paBvnvc5YLFI1.js b/scripts/SK8paBvnvc5YLFI1.js new file mode 100644 index 0000000..d2b232f --- /dev/null +++ b/scripts/SK8paBvnvc5YLFI1.js @@ -0,0 +1,12 @@ +if (args.test.options.doombolt && !args.test.options.doomboltRolled) +{ + args.test.options.doomboltRolled = true; + + let test = await this.actor.setupSkill(`${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})`, {fields : {difficulty : "hard"}, context : {failure : "@Table[majormis]{Major Miscast}"}}); + await test.roll(); + + if (test.succeeded) + { + args.test.preData.additionalDamage = 4; + } +} \ No newline at end of file diff --git a/scripts/SKn61f2ykhzuwMdw.js b/scripts/SKn61f2ykhzuwMdw.js new file mode 100644 index 0000000..00a318d --- /dev/null +++ b/scripts/SKn61f2ykhzuwMdw.js @@ -0,0 +1,10 @@ +if ((args.test.result.roll % 11 == 0 || args.test.result.roll == 100) && args.test.failed) +{ + delete args.test.result.misfire; + args.test.result.tables.misfire = { + label : "Raté", + class : "fumble-roll", + modifier : 0, + key : "artillery-misfires" + } +} \ No newline at end of file diff --git a/scripts/SLy1Fs3oXcHgFgjK.js b/scripts/SLy1Fs3oXcHgFgjK.js index 4add629..6c9fd84 100644 --- a/scripts/SLy1Fs3oXcHgFgjK.js +++ b/scripts/SLy1Fs3oXcHgFgjK.js @@ -1,5 +1,5 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.Item.pTorrE0l3VybAbtn") let data = item.toObject(); -let value = getProperty(this.effect.sourceTest, "result.overcast.usage.other.current") || 1 +let value = foundry.utils.getProperty(this.effect.sourceTest, "result.overcast.usage.other.current") || 1 data.system.specification.value = value this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/SNjG7IvgQzvCGczR.js b/scripts/SNjG7IvgQzvCGczR.js deleted file mode 100644 index 4627a9f..0000000 --- a/scripts/SNjG7IvgQzvCGczR.js +++ /dev/null @@ -1,12 +0,0 @@ -if (this.actor.system.details.experience.current < 100) { - return this.script.notification(game.i18n.localize("SCRIPT.NotEnoughXP")) -} - -let item = await game.wfrp4e.utility.findItem("Messenger", "trait") -this.actor.createEmbeddedDocuments("Item", [item]); -let expLog = foundry.utils.duplicate(this.actor.details.experience.log || []); -expLog.push({amount : 100, reason: item.name, spent: this.actor.details.experience.spent + 100, total: this.actor.details.experience.total, type: "spent"}); -this.actor.update({ - "system.details.experience.spent": this.actor.details.experience.spent + 100, - "system.details.experience.log": expLog - }); \ No newline at end of file diff --git a/scripts/SThruXFhxUdNKCG4.js b/scripts/SThruXFhxUdNKCG4.js index 0a3895e..2e17c58 100644 --- a/scripts/SThruXFhxUdNKCG4.js +++ b/scripts/SThruXFhxUdNKCG4.js @@ -1,8 +1,8 @@ const test = await this.actor.setupCharacteristic("int", {fields: {difficulty: "easy"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}); -await test.roll(); +await Test.roll(); -if (test.failed) { +if (Test.Échoué) { this.actor.addCondition('stunned'); } -this.script.scriptNotification(`${this.actor.name} failed the Intelligence Test and gained Stunned Condition!`); \ No newline at end of file +this.script.scriptNotification(`${this.actor.name} échou au test d'INT et reçoit un état Sonné!`); \ No newline at end of file diff --git a/scripts/SWIJjM2RCmzfr64u.js b/scripts/SWIJjM2RCmzfr64u.js index 0db546e..4f762e1 100644 --- a/scripts/SWIJjM2RCmzfr64u.js +++ b/scripts/SWIJjM2RCmzfr64u.js @@ -1,4 +1,6 @@ -if (args.test.result.hitloc.result == "head" && args.test.result.critical){ - args.test.result.critModifier = args.test.result.critModifier ? args.test.result.critModifier + 40 : 40 +if (args.test.result.hitloc.result == "head" && args.test.result.critical) +{ + args.test.result.critModifier = args.test.result.critModifier ? args.test.result.critModifier + 40 : 40 + args.test.result.critical += ` (+${args.test.result.critModifier})` } diff --git a/scripts/SjDNjLBGsd9fYObo.js b/scripts/SjDNjLBGsd9fYObo.js new file mode 100644 index 0000000..81a6df2 --- /dev/null +++ b/scripts/SjDNjLBGsd9fYObo.js @@ -0,0 +1 @@ +args.applyAP = false; \ No newline at end of file diff --git a/scripts/SlrslcNdnYONcSH3.js b/scripts/SlrslcNdnYONcSH3.js new file mode 100644 index 0000000..785a67e --- /dev/null +++ b/scripts/SlrslcNdnYONcSH3.js @@ -0,0 +1,16 @@ +let weapon = this.actor.itemTags["weapon"].find(i => i.system.isEquipped); +if (!weapon) +{ + this.script.notification("Aucune arme équipée!", "error"); + return; +} + +if (await this.actor.spend("system.status.fortune.value", 1)) +{ + let test = await this.actor.setupWeapon(weapon, {appendTitle : ` - ${this.effect.name}`, whirlwind: true}); + test.roll(); +} +else +{ + this.script.notification("Pas assez de Chance!", "error"); +} \ No newline at end of file diff --git a/scripts/SlzPn7ONIKab9URj.js b/scripts/SlzPn7ONIKab9URj.js new file mode 100644 index 0000000..4bc3c31 --- /dev/null +++ b/scripts/SlzPn7ONIKab9URj.js @@ -0,0 +1,5 @@ +if (game.combat.combatant?.actor?.uuid == this.actor.uuid) +{ + +this.script.message(await this.actor.applyBasicDamage(2, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})) +} \ No newline at end of file diff --git a/scripts/SrCHfOJFZwDickqa.js b/scripts/SrCHfOJFZwDickqa.js deleted file mode 100644 index 28558bc..0000000 --- a/scripts/SrCHfOJFZwDickqa.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "average"}}); -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone") -} \ No newline at end of file diff --git a/scripts/SreM9Jyj2XZjoezH.js b/scripts/SreM9Jyj2XZjoezH.js new file mode 100644 index 0000000..06cf0e5 --- /dev/null +++ b/scripts/SreM9Jyj2XZjoezH.js @@ -0,0 +1 @@ +return args.item?.system?.attackType == "ranged" \ No newline at end of file diff --git a/scripts/StAderQaQQsxb6Rv.js b/scripts/StAderQaQQsxb6Rv.js index d361e9a..e6ffbf7 100644 --- a/scripts/StAderQaQQsxb6Rv.js +++ b/scripts/StAderQaQQsxb6Rv.js @@ -1,7 +1,7 @@ let target = await game.wfrp4e.tables.rollTable("fixations") if (target) { - this.script.scriptNotification(target.result); + this.script.notification(target.result); let hatred = this.actor.items.find(i => i.getFlag("wfrp4e", "fromEffect") == this.effect.id) if (hatred) { diff --git a/scripts/SwliIjjjFtZMnJH3.js b/scripts/SwliIjjjFtZMnJH3.js new file mode 100644 index 0000000..b736977 --- /dev/null +++ b/scripts/SwliIjjjFtZMnJH3.js @@ -0,0 +1 @@ +return !args.weapon?.system.properties.qualities.hack || args.weapon?.system?.isProjectiles \ No newline at end of file diff --git a/scripts/T0KBl8iEkcPq08RI.js b/scripts/T0KBl8iEkcPq08RI.js new file mode 100644 index 0000000..e0fdcb3 --- /dev/null +++ b/scripts/T0KBl8iEkcPq08RI.js @@ -0,0 +1,5 @@ +if (args.applyAP && args.modifiers.ap.magical) +{ + args.modifiers.ap.ignored += args.modifiers.ap.magical + args.modifiers.ap.details.push("" + this.effect.name + ": Ignore les PA magiques (" + args.modifiers.ap.magical + ")"); +} \ No newline at end of file diff --git a/scripts/T3RfSt3VMEat3iDD.js b/scripts/T3RfSt3VMEat3iDD.js deleted file mode 100644 index 747d789..0000000 --- a/scripts/T3RfSt3VMEat3iDD.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Perception"); \ No newline at end of file diff --git a/scripts/T4JEEDYCEIUbVHv4.js b/scripts/T4JEEDYCEIUbVHv4.js new file mode 100644 index 0000000..630505c --- /dev/null +++ b/scripts/T4JEEDYCEIUbVHv4.js @@ -0,0 +1,6 @@ +let fatigued = this.actor.hasCondition("fatigued") + if (!fatigued) + { + this.actor.addCondition("fatigued") + ui.notifications.notify("Etat Extenué ajouté à " + this.actor.name + " qui est impossible à retirer tant que le symptôme de Malaise est présent.") + } \ No newline at end of file diff --git a/scripts/T5fiTzhXEQAv9Drf.js b/scripts/T5fiTzhXEQAv9Drf.js index b4d5c21..4694b6d 100644 --- a/scripts/T5fiTzhXEQAv9Drf.js +++ b/scripts/T5fiTzhXEQAv9Drf.js @@ -11,7 +11,7 @@ if (location) if (dropped.length) { - this.script.scriptNotification(`Laché ${dropped.map(i => i.name).join(", ")}!`) + this.script.notification(`Dropped ${dropped.map(i => i.name).join(", ")}!`) for(let weapon of dropped) { await weapon.system.toggleEquip(); diff --git a/scripts/TAw9vXnfyIAl5DGs.js b/scripts/TAw9vXnfyIAl5DGs.js index 587a05a..696cce4 100644 --- a/scripts/TAw9vXnfyIAl5DGs.js +++ b/scripts/TAw9vXnfyIAl5DGs.js @@ -1,11 +1,11 @@ if (this.item.system.quantity.value) { - game.wfrp4e.utility.postCorruptionTest("minor", this.script.getChatData()); + CorruptionMessageModel.createCorruptionMessage("minor", this.script.getChatData()); this.item.system.reduceQuantity(); let actor = Array.from(game.user.targets)[0]?.actor || this.actor; actor.applyEffect({effectData : [this.item.effects.contents[1].convertToApplied()]}) } else { - this.script.scriptNotification("Quantité insuffisante!", "error") + this.script.notification("Plus rien !", "error") } \ No newline at end of file diff --git a/scripts/TBpNFRL5uehs0fze.js b/scripts/TBpNFRL5uehs0fze.js index 974d619..2097b48 100644 --- a/scripts/TBpNFRL5uehs0fze.js +++ b/scripts/TBpNFRL5uehs0fze.js @@ -6,5 +6,5 @@ if (this.item.system.quantity.value) } else { - this.script.scriptNotification("Quantité insuffisante!", "error") + this.script.notification("Plus rien !", "error") } \ No newline at end of file diff --git a/scripts/TCgEBuMPPd5SLAsc.js b/scripts/TCgEBuMPPd5SLAsc.js new file mode 100644 index 0000000..7417910 --- /dev/null +++ b/scripts/TCgEBuMPPd5SLAsc.js @@ -0,0 +1 @@ +args.fields.modifier -= 15 \ No newline at end of file diff --git a/scripts/TCtXPvDpbfz1yrVZ.js b/scripts/TCtXPvDpbfz1yrVZ.js index f980ba6..d247b77 100644 --- a/scripts/TCtXPvDpbfz1yrVZ.js +++ b/scripts/TCtXPvDpbfz1yrVZ.js @@ -1,7 +1,7 @@ let choice1 = [ { type : "skill", - name : "Melee (Basic)", + name : "Corps à corps (Base)", diff : { system : { advances : { @@ -14,7 +14,7 @@ let choice1 = [ let choice2 = [ { type : "skill", - name : "Melee (Two-Handed)", + name : "Corps à corps (A deux mains)", diff : { system : { advances : { @@ -25,40 +25,40 @@ let choice2 = [ } ] -let choice = await new Promise((resolve, reject) => { - new Dialog({ - title : "Choice", - content : + let choice = await foundry.applications.api.DialogV2.wait({ + window : {title : "Choix"}, + content : `

    - Select your choice + Sélectionnez votre choix

      -
    1. Melee (Basic)
    2. -
    3. Melee (Two-Handed)
    4. -
    +
  • Corps à corps (Base)
  • +
  • Corps à corps (A deux mains)
  • + `, - buttons : { - 1 : { - label : "Basic", + buttons : [ + { + action : "basic", + label : "Base", callback : () => { - resolve(choice1) + return choice1 } }, - 2 : { - label : "Two-Handed", + { + action : "twoHanded", + label : "A deux mains", callback : () => { - resolve(choice2) + return choice2 } } - } - }).render(true) -}) + ] + }) let updateObj = this.actor.toObject(); let items = [] for (let c of choice) { - let existing + let existing if (c.type == "skill") { existing = updateObj.items.find(i => i.name == c.name && i.type == c.type) @@ -77,7 +77,7 @@ for (let c of choice) items.push(foundry.utils.mergeObject(item, (c.diff || {}))) } else - ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) + ui.notifications.warn(`Impossible de trouver ${c.name}`, {permanent : true}) } } diff --git a/scripts/TGN070HeJLl3gSMY.js b/scripts/TGN070HeJLl3gSMY.js index 0959de2..833b521 100644 --- a/scripts/TGN070HeJLl3gSMY.js +++ b/scripts/TGN070HeJLl3gSMY.js @@ -1,6 +1,6 @@ -let test = await this.actor.setupCharacteristic("ag", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, context: { failure: "A Terre" }}) -await test.roll(); -if (test.failed) +let test = await this.actor.setupCharacteristic("ag", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, context: { failure: "Goes Prone" }}) +await Test.roll(); +if (Test.Échoué) { this.actor.addCondition("prone"); } \ No newline at end of file diff --git a/scripts/TIoUbjOtj7PTK2t8.js b/scripts/TIoUbjOtj7PTK2t8.js new file mode 100644 index 0000000..bc75ade --- /dev/null +++ b/scripts/TIoUbjOtj7PTK2t8.js @@ -0,0 +1,15 @@ +const test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), { + skipTargets: true, + appendTitle: ` — ${this.effect.name}`, + fields: {difficulty: "challenging"}, + context: { + failure: `Butcher perd des dents.` + } +}); + +await Test.roll(); + +if (Test.Échoué) { + const SL = Number(Test.result.SL); + this.script.message(`Butcher perd ${SL} dents.`); +} \ No newline at end of file diff --git a/scripts/TKjBb75exjae87fa.js b/scripts/TKjBb75exjae87fa.js new file mode 100644 index 0000000..79edfb3 --- /dev/null +++ b/scripts/TKjBb75exjae87fa.js @@ -0,0 +1 @@ +args.modifiers.other.push({label : this.effect.name, details : "Augmentation des Dégâts", value : 2}) \ No newline at end of file diff --git a/scripts/TOyQLrugFGzwc5nY.js b/scripts/TOyQLrugFGzwc5nY.js deleted file mode 100644 index 1e8b373..0000000 --- a/scripts/TOyQLrugFGzwc5nY.js +++ /dev/null @@ -1 +0,0 @@ -return !(args.skill?.name.includes(game.i18n.localize("NAME.Melee")) || args.item?.isMelee || args.options.corruption); \ No newline at end of file diff --git a/scripts/TSsHcn4EDulD03RU.js b/scripts/TSsHcn4EDulD03RU.js new file mode 100644 index 0000000..d6548e6 --- /dev/null +++ b/scripts/TSsHcn4EDulD03RU.js @@ -0,0 +1 @@ +return !this.actor.hasCondition("fatigued") \ No newline at end of file diff --git a/scripts/TU2xjbJ0zFtytF3J.js b/scripts/TU2xjbJ0zFtytF3J.js deleted file mode 100644 index 9325462..0000000 --- a/scripts/TU2xjbJ0zFtytF3J.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.CharmAnimal"); \ No newline at end of file diff --git a/scripts/TXce477AiXHKbepk.js b/scripts/TXce477AiXHKbepk.js new file mode 100644 index 0000000..0c0e5a5 --- /dev/null +++ b/scripts/TXce477AiXHKbepk.js @@ -0,0 +1 @@ +return args.type !== "pray" || args.item?.system?.type?.value !== "miracle" || args.item?.system?.god?.value?.toLowerCase() !== "taal"; \ No newline at end of file diff --git a/scripts/Td8M5K1P92GbM2IA.js b/scripts/Td8M5K1P92GbM2IA.js new file mode 100644 index 0000000..d444908 --- /dev/null +++ b/scripts/Td8M5K1P92GbM2IA.js @@ -0,0 +1,6 @@ +if (!args.messageSent) +{ + args.messageSent = true; + let runes = this.actor.effects.contents.filter(i => i.name == this.effect.name); + this.script.message(`${args.attacker.speaker.alias} reduce Run speed by ${runes.length * 4} yds.`) +} \ No newline at end of file diff --git a/scripts/TdjlJro0RRVSh8g8.js b/scripts/TdjlJro0RRVSh8g8.js deleted file mode 100644 index a893cc5..0000000 --- a/scripts/TdjlJro0RRVSh8g8.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Gamble") && args.skill?.name != game.i18n.localize("NAME.SleightOfHand"); \ No newline at end of file diff --git a/scripts/ToKlHDAjJOsC51ag.js b/scripts/ToKlHDAjJOsC51ag.js deleted file mode 100644 index 2ee3319..0000000 --- a/scripts/ToKlHDAjJOsC51ag.js +++ /dev/null @@ -1,11 +0,0 @@ -let item = await fromUuid("Compendium.wfrp4e-core.items.GlShFJF2TpsNh1FX") -let data = item.toObject(); -data.system.location.key = this.item.system.location.key -this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "hard"}}); -await test.roll(); -if (test.failed) -{ - args.actor.addCondition("unconscious") -} \ No newline at end of file diff --git a/scripts/TpZItJ5Ugbazaobd.js b/scripts/TpZItJ5Ugbazaobd.js index 414537b..8cd7d1c 100644 --- a/scripts/TpZItJ5Ugbazaobd.js +++ b/scripts/TpZItJ5Ugbazaobd.js @@ -12,4 +12,4 @@ while (locations.length < 2) locationText = locations.map(i => game.wfrp4e.config.locations[i]).join(", ") this.item.updateSource({name : this.item.name += ` (${locationText})`, "flags.wfrp4e.locations" : locations}) -this.effect.updateSource({"flags.wfrp4e.locations" : locations}) \ No newline at end of file +this.effet.updateSource({"flags.wfrp4e.locations" : locations}) \ No newline at end of file diff --git a/scripts/TpgK2aAe93ui3Rbs.js b/scripts/TpgK2aAe93ui3Rbs.js new file mode 100644 index 0000000..420d262 --- /dev/null +++ b/scripts/TpgK2aAe93ui3Rbs.js @@ -0,0 +1,8 @@ +if (args.test.isFumble && args.test.options.supercharge) { + args.test.result.tables.misfire = { + label : "Raté (Surchargé)", + class : "fumble-roll", + modifier : 0, + key : "artillery-misfires" + } +} \ No newline at end of file diff --git a/scripts/Tq45Nd8J3eTvHT41.js b/scripts/Tq45Nd8J3eTvHT41.js deleted file mode 100644 index 88ba249..0000000 --- a/scripts/Tq45Nd8J3eTvHT41.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Perception") && args.skill?.name != game.i18n.localize("NAME.SetTrap"); \ No newline at end of file diff --git a/scripts/TrIYdcG3jDER4WgY.js b/scripts/TrIYdcG3jDER4WgY.js deleted file mode 100644 index 5965a8c..0000000 --- a/scripts/TrIYdcG3jDER4WgY.js +++ /dev/null @@ -1,4 +0,0 @@ -let item = await fromUuid("Compendium.wfrp4e-core.items.xsGbDFqK2qh7lsIj") -let data = item.toObject(); -data.system.specification.value = "Minor" -this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/TwgdEucxcHloc4cX.js b/scripts/TwgdEucxcHloc4cX.js index f3c0de8..ee6fd01 100644 --- a/scripts/TwgdEucxcHloc4cX.js +++ b/scripts/TwgdEucxcHloc4cX.js @@ -1,103 +1,104 @@ let choice1 = [ { type : "armour", - name : "Mail Chausses" + name : "Chausses de Mailles" }, { type : "armour", - name : "Mail Coat" + name : "Cotte de Mailles" }, { type : "armour", - name : "Mail Coif" + name : "Coiffe de Mailles" }, ] let choice2 = [ { type : "armour", - name : "Mail Chausses" + name : "Chausses de Mailles" }, { type : "armour", - name : "Mail Coat" + name : "Cotte de Mailles" }, { type : "armour", - name : "Mail Coif" + name : "Coiffe de Mailles" }, { type : "armour", - name : "Leather Leggings" + name : "Jambières de cuir" }, { type : "armour", - name : "Leather Skullcap" + name : "Calotte de cuir" }, { type : "armour", - name : "Leather Jack" + name : "Veste de cuir" }, ] let choice3 = [ { type : "armour", - name : "Plate Breastplate" + name : "Plastron d'acier" }, { type : "armour", - name : "Plate Bracers" + name : "Brassards" }, { type : "armour", - name : "Plate Helm" + name : "Heaume" }, { type : "armour", - name : "Plate Leggings" + name : "Jambières d'acier" }, ] -let choice = await new Promise((resolve, reject) => { - new Dialog({ - title : "Choice", - content : - `

    - Select your choice -

    -
      -
    1. Mail
    2. -
    3. Mail & Leather
    4. -
    5. Plate
    6. -
    - `, - buttons : { - 1 : { - label : "Mail", - callback : () => { - resolve(choice1) - } - }, - 2 : { - label : "Mail & Leather", - callback : () => { - resolve(choice2) - } - }, - 3 : { - label : "Plate", - callback : () => { - resolve(choice3) - } + +let choice = await foundry.applications.api.DialogV2.wait({ + window : {title : "Choix"}, + content : + `

    + Sélectionnez votre choix +

    +
      +
    1. Mailles
    2. +
    3. Mailles et Cuir
    4. +
    5. Plaques
    6. +
    + `, + buttons : [ + { + action : 1, + label : "Mailles", + callback : () => { + return choice1 + } + }, + { + action : 2, + label : "Mailles et Cuir", + callback : () => { + return choice2 + } + }, + { + action : 3, + label : "Plaques", + callback : () => { + return choice3 } } - }).render(true) -}) - + ] +}) let updateObj = this.actor.toObject(); let items = [] for (let c of choice) { - let existing + let existing if (c.type == "skill") { existing = updateObj.items.find(i => i.name == c.name && i.type == c.type) diff --git a/scripts/TwwKxFjK6TNGKbRB.js b/scripts/TwwKxFjK6TNGKbRB.js deleted file mode 100644 index ca92445..0000000 --- a/scripts/TwwKxFjK6TNGKbRB.js +++ /dev/null @@ -1,8 +0,0 @@ -this.script.scriptMessage(await this.actor.applyBasicDamage(12, {damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true})) -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty: "hard"}}) -await test.roll(); -if (test.failed) -{ - this.actor.addSystemEffect("cold1") -} - diff --git a/scripts/TxfmxDGBj04AQQpt.js b/scripts/TxfmxDGBj04AQQpt.js index 8f6c8d2..59c3714 100644 --- a/scripts/TxfmxDGBj04AQQpt.js +++ b/scripts/TxfmxDGBj04AQQpt.js @@ -7,5 +7,5 @@ if ( weapon?.system.properties.qualities.fast ) { - args.opposedTest.swap(this.effect.label); + await args.opposedTest.swap(this.effect.name); } \ No newline at end of file diff --git a/scripts/U1RUcgP8LD2qeGTm.js b/scripts/U1RUcgP8LD2qeGTm.js index 7c629a2..eba2055 100644 --- a/scripts/U1RUcgP8LD2qeGTm.js +++ b/scripts/U1RUcgP8LD2qeGTm.js @@ -1 +1 @@ -return !args.options.reload \ No newline at end of file +return !args.context.reload \ No newline at end of file diff --git a/scripts/U1UpSRJOSjPpO4HS.js b/scripts/U1UpSRJOSjPpO4HS.js index 4dca212..a7d3833 100644 --- a/scripts/U1UpSRJOSjPpO4HS.js +++ b/scripts/U1UpSRJOSjPpO4HS.js @@ -1,4 +1,6 @@ -let mutations = await warhammer.utility.findAllItems("mutation", "Chargement des mutations") +let mutations = await warhammer.utility.findAllItems("mutation", "Loading Mutations", true) + let roll = Math.floor(CONFIG.Dice.randomUniform() * mutations.length); -this.actor.createEmbeddedDocuments("Item", [mutations[roll]]); -this.script.scriptNotification(`Ajout ${mutations[roll].name}`) \ No newline at end of file + +this.actor.createEmbeddedDocuments("Item", [(await fromUuid(mutations[roll].uuid)).toObject()]); +this.script.notification(`Added ${mutations[roll].name}`) \ No newline at end of file diff --git a/scripts/U26XMie3Kjoddisj.js b/scripts/U26XMie3Kjoddisj.js index 35d406e..ee0e372 100644 --- a/scripts/U26XMie3Kjoddisj.js +++ b/scripts/U26XMie3Kjoddisj.js @@ -1,10 +1,10 @@ let stunned = this.actor.hasCondition("stunned") if (stunned) { - this.script.scriptNotification(`Suppression de 1 état Assomé`) + this.script.notification(`Suppression d'1 état 1 Sonné`) this.actor.removeCondition("stunned"); } -else +else { - this.script.scriptNotification(`Aucun état Assomé`) + this.script.notification(`Aucune état Sonné à supprimer`) } \ No newline at end of file diff --git a/scripts/U4A8FDNmwBGTuQZO.js b/scripts/U4A8FDNmwBGTuQZO.js deleted file mode 100644 index 7fbb187..0000000 --- a/scripts/U4A8FDNmwBGTuQZO.js +++ /dev/null @@ -1,5 +0,0 @@ -if (args.attacker.has("Mort-vivant") && !args.attacker.has("Ethéré")) -{ - args.totalWoundLoss = Math.floor(args.totalWoundLoss / 2) - args.modifiers.other.push({label : this.effect.name, details : "Divisé par deux", value : "× 0.5"}) -} \ No newline at end of file diff --git a/scripts/U78c4oUjKwyUu6jT.js b/scripts/U78c4oUjKwyUu6jT.js deleted file mode 100644 index cd17a48..0000000 --- a/scripts/U78c4oUjKwyUu6jT.js +++ /dev/null @@ -1 +0,0 @@ -return (args.skill?.name != game.i18n.localize("NAME.Perception") && args.characteristic != "fel") \ No newline at end of file diff --git a/scripts/U7lRf56BFaTfsC6B.js b/scripts/U7lRf56BFaTfsC6B.js deleted file mode 100644 index 1caa93b..0000000 --- a/scripts/U7lRf56BFaTfsC6B.js +++ /dev/null @@ -1,10 +0,0 @@ -const type = await ValueDialog.create({ - title: game.i18n.localize("SCRIPT.FellstaveDialogTitle"), - text: game.i18n.localize("SCRIPT.FellstaveDialogText") -}, ""); - -await this.effect.item.update({name: `${this.effect.item.name} (${type})`}); -const updates = this.effect.item.effects.map(e => { - return {_id: e.id, name: e.name + ` (${type})`} -}); -this.effect.item.updateEmbeddedDocuments("ActiveEffect", updates); \ No newline at end of file diff --git a/scripts/UC6G3pFQwzUhrw6F.js b/scripts/UC6G3pFQwzUhrw6F.js deleted file mode 100644 index 5ca75a2..0000000 --- a/scripts/UC6G3pFQwzUhrw6F.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.CharmAnimal"); \ No newline at end of file diff --git a/scripts/UDPsaymtZf39UsMk.js b/scripts/UDPsaymtZf39UsMk.js index f8fd2d9..1622ea7 100644 --- a/scripts/UDPsaymtZf39UsMk.js +++ b/scripts/UDPsaymtZf39UsMk.js @@ -1,6 +1,7 @@ -let fatigued = this.actor.hasCondition("fatigued") -if (!fatigued) { - this.actor.addCondition("fatigued") - ui.notifications.notify("Fatigue ajouté à " + this.actor.name + " qui ne peut être supprimé tant que le symptôme Malaise est présent.") -} \ No newline at end of file + let fatigued = this.actor.hasCondition("fatigued") + if (!fatigued) + { + this.actor.addCondition("fatigued") + ui.notifications.notify("Etat Extenué ajouté à " + this.actor.name + " ce qui est impossible à retirer tant que le symptôme de Malaise est présent.") + } \ No newline at end of file diff --git a/scripts/UH5MIzqi2MvEqTwj.js b/scripts/UH5MIzqi2MvEqTwj.js index 0b5562d..c45423e 100644 --- a/scripts/UH5MIzqi2MvEqTwj.js +++ b/scripts/UH5MIzqi2MvEqTwj.js @@ -1,6 +1,6 @@ if (args.totalWoundLoss > 0) { - let roll = await new Roll("1d10").roll(); + let roll = await new Roll("1d10").roll({allowInteractive : false}); roll.toMessage(this.script.getChatData()); args.totalWoundLoss += roll.total; args.modifiers.other.push({label : this.effect.name, value : roll.total}) diff --git a/scripts/ULmZMLezDamerN04.js b/scripts/ULmZMLezDamerN04.js index c4507e9..43f9a02 100644 --- a/scripts/ULmZMLezDamerN04.js +++ b/scripts/ULmZMLezDamerN04.js @@ -1,16 +1,16 @@ -let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts") +let spells = await warhammer.utility.findAllItems("spell", "Loading Spells", true, ["system.lore.value"]) let lore = (await game.wfrp4e.tables.rollTable("random-caster", {hideDSN: true})).text -this.script.scriptNotification(lore) -if (lore == "Au choix") { +this.script.notification(lore) +if (lore == "GM's Choice") { return } -else if (lore == "Magie des Arcanes") { +else if (lore == "Magie des Arcanes (Domaine)") { lore = "Arcane" } -else if (lore == "Magie Mineure ") { +else if (lore == "Magie Mineure") { lore = "petty" } diff --git a/scripts/UQtXuQmUlTyDKqhe.js b/scripts/UQtXuQmUlTyDKqhe.js index 8e3c5cd..6ddeab2 100644 --- a/scripts/UQtXuQmUlTyDKqhe.js +++ b/scripts/UQtXuQmUlTyDKqhe.js @@ -10,15 +10,15 @@ let characteristics = { "wp" : 45, "fel" : 10 } -let skills = ["Focalisation", "Calme", "Intimidate", "Langue (Magick)", "Langue (Nehekharan)", "Savoir (Magie)" , "Perception"] +let skills = ["Focalisation", "Calme", "Intimidation", "Langue (Magick)", "Language (Nehekharan)", "Savoir (Magie)", "Perception"] let skillAdvancements = [10, 20, 15, 15, 10, 10, 10] -let talents = ["Magie des Arcanes", "Hardy", "Menaçant", "Magie Mineure", "Read/Write", "Seconde Vue"] +let talents = ["Magie des Arcanes (Domaine)", "Dur à cuire", "Menaçant", "Magie Mineure", "Lire/Écrire", "Seconde Vue"] let trappings = ["Arme simple"] let specialItems = [ {name: "Mouldering Robes", type: "trapping", trappingType: "clothingAccessories" }, {name: "Pouches containing ritual components", type: "trapping", trappingType: "clothingAccessories" }, {name: "Staff", type: "weapon", damage: "SB+2"}, - {name: "Dark Magic (Necromancy)", type: "talent"}, + {name: "Magie Noire (Nécromancie)", type: "talent"}, ] let items = []; @@ -66,7 +66,7 @@ for (let talent of talents) } else { - ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) + ui.notifications.warn(`Could not find ${talent}`, {permanent : true}) } } @@ -83,7 +83,7 @@ for (let trapping of trappings) } else { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } @@ -98,7 +98,7 @@ let filters = [ } ] -let petty = (await ItemDialog.createFromFilters(filters, 3, "Choisissez 3 Sorts de Magie Mineure")).map(i => i.toObject()); +let petty = (await ItemDialog.createFromFilters(filters, 3, {text: "Choisissez 3 Sorts Mineurs"})).map(i => i.toObject()); filters = [ @@ -112,7 +112,7 @@ filters = [ } ] -let arcane = (await ItemDialog.createFromFilters(filters, 2, "Choisissez 2 Sorts de Magie d'Arcane")).map(i => i.toObject()); +let arcane = (await ItemDialog.createFromFilters(filters, 2, {text : "Choisissez 2 Sorts d'Arcane"})).map(i => i.toObject()); filters = [ { @@ -121,7 +121,7 @@ filters = [ }, { property : "name", - value: /^((?!\().)*$/gm, // Remove all spells with parentheses (all arcane spells spells) + value: /^((?!\().)*$/gm, // Remove tout spells with parentheses (tout arcane spells spells) regex: true }, { @@ -130,7 +130,7 @@ filters = [ } ] -let necromancy = (await ItemDialog.createFromFilters(filters, 1, "Choisissez 1 Necromancy Spell")).map(i => i.toObject()); +let necromancy = (await ItemDialog.createFromFilters(filters, 1, {text : "Choisissez 1 Sort de Nécromancie"})).map(i => i.toObject()); arcane.forEach(i => { i.img = "modules/wfrp4e-core/icons/spells/necromancy.png"; @@ -138,6 +138,6 @@ arcane.forEach(i => { }) let spells = [...petty, ...necromancy, ...arcane]; -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items.concat(spells)); diff --git a/scripts/UTlgF4azrGQZsoDv.js b/scripts/UTlgF4azrGQZsoDv.js deleted file mode 100644 index bd64ba5..0000000 --- a/scripts/UTlgF4azrGQZsoDv.js +++ /dev/null @@ -1,2 +0,0 @@ -const talents = await Promise.all(["Ambidextre", "Distraire"].map(game.wfrp4e.utility.findTalent)) -this.actor.createEmbeddedDocuments("Item", talents, {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/UUHQRPRrrRSr9MIA.js b/scripts/UUHQRPRrrRSr9MIA.js new file mode 100644 index 0000000..a134b69 --- /dev/null +++ b/scripts/UUHQRPRrrRSr9MIA.js @@ -0,0 +1,5 @@ +const venomFlag = this.effect.getFlag("wfrp4e-tribes", "venom"); + +if (venomFlag) { + this.actor.updateEmbeddedDocuments("Item", [venomFlag]); +} \ No newline at end of file diff --git a/scripts/UaImulhbPURkLJg2.js b/scripts/UaImulhbPURkLJg2.js deleted file mode 100644 index d045f97..0000000 --- a/scripts/UaImulhbPURkLJg2.js +++ /dev/null @@ -1 +0,0 @@ -return this.actor.attacker && (args.skill?.name.includes("Corps à corps (Bas)") || (args.type == "weapon" && args.item?.system.weaponGroup.value == "basic")) \ No newline at end of file diff --git a/scripts/UfkysrAftCs09Fct.js b/scripts/UfkysrAftCs09Fct.js new file mode 100644 index 0000000..b04e6b2 --- /dev/null +++ b/scripts/UfkysrAftCs09Fct.js @@ -0,0 +1 @@ +return args.skill.name !== game.i18n.localize("NAME.Gamble") \ No newline at end of file diff --git a/scripts/UgQW0UMPOZ0jwfVJ.js b/scripts/UgQW0UMPOZ0jwfVJ.js index 8cce56a..f7cefed 100644 --- a/scripts/UgQW0UMPOZ0jwfVJ.js +++ b/scripts/UgQW0UMPOZ0jwfVJ.js @@ -2,4 +2,4 @@ let current = this.actor.status.fortune.value this.actor.update({"system.status.fortune.value" : 1 + current}) -this.script.scriptMessage(`${this.actor.prototypeToken.name} voit ses Points de Chance augmenter de ${current} à ${1 + current}`) \ No newline at end of file +this.script.message(`${this.actor.prototypeToken.name} fortune points increased from ${current} to ${1 + current}`) \ No newline at end of file diff --git a/scripts/UlRSaZG4ZUU6fMND.js b/scripts/UlRSaZG4ZUU6fMND.js index aeb75ab..e092ef0 100644 --- a/scripts/UlRSaZG4ZUU6fMND.js +++ b/scripts/UlRSaZG4ZUU6fMND.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpenter)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Métier (Charpentier)'; const difficulty = 'challenging'; const target = 10; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/UlygtNPSDlWPIFCI.js b/scripts/UlygtNPSDlWPIFCI.js new file mode 100644 index 0000000..778c544 --- /dev/null +++ b/scripts/UlygtNPSDlWPIFCI.js @@ -0,0 +1 @@ +,args.fields.slBonus++;,args.fields.slBonus++;,args.fields.slBonus++; \ No newline at end of file diff --git a/scripts/UnqnWi0dZYLf5fTT.js b/scripts/UnqnWi0dZYLf5fTT.js index 9d03e2a..8c15c72 100644 --- a/scripts/UnqnWi0dZYLf5fTT.js +++ b/scripts/UnqnWi0dZYLf5fTT.js @@ -1,101 +1,104 @@ let choice1 = [ { type : "armour", - name : "Mail Chausses" + name : "Chausses de Mailles" }, { type : "armour", - name : "Mail Coat" + name : "Cotte de Mailles" }, { type : "armour", - name : "Mail Coif" + name : "Coiffe de Mailles" }, ] let choice2 = [ { type : "armour", - name : "Mail Chausses" + name : "Chausses de Mailles" }, { type : "armour", - name : "Mail Coat" + name : "Cotte de Mailles" }, { type : "armour", - name : "Mail Coif" + name : "Coiffe de Mailles" }, { type : "armour", - name : "Leather Leggings" + name : "Jambières de cuir" }, { type : "armour", - name : "Leather Skullcap" + name : "Calotte de cuir" }, { type : "armour", - name : "Leather Jack" + name : "Veste de cuir" }, ] let choice3 = [ { type : "armour", - name : "Plate Breastplate" + name : "Plastron d'acier" }, { type : "armour", - name : "Plate Bracers" + name : "Brassards" }, { type : "armour", - name : "Plate Helm" + name : "Heaume" }, { type : "armour", - name : "Plate Leggings" + name : "Jambières d'acier" }, ] -let choice = await Dialog.wait({ - title : "Choice", - content : +let choice = await foundry.applications.api.DialogV2.wait({ + window : {title : "Choix"}, + content : `

    - Select your choice + Sélectionnez votre choix

      -
    1. Mail
    2. -
    3. Mail & Leather
    4. -
    5. Plate
    6. -
    +
  • Mailles
  • +
  • Mailles et Cuir
  • +
  • Plaques
  • + `, - buttons : { - 1 : { - label : "Mail", + buttons : [ + { + action : 1, + label : "Mailles", callback : () => { return choice1 } }, - 2 : { - label : "Mail & Leather", + { + action : 2, + label : "Mailles et Cuir", callback : () => { return choice2 } }, - 3 : { - label : "Plate", + { + action : 3, + label : "Plaques", callback : () => { return choice3 } } - } + ] }) let updateObj = this.actor.toObject(); let items = [] for (let c of choice) { - let existing + let existing if (c.type == "skill") { existing = updateObj.items.find(i => i.name == c.name && i.type == c.type) diff --git a/scripts/UsAHQecRlWL5PhP6.js b/scripts/UsAHQecRlWL5PhP6.js deleted file mode 100644 index 44806e5..0000000 --- a/scripts/UsAHQecRlWL5PhP6.js +++ /dev/null @@ -1,8 +0,0 @@ -this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty : "average"}}).then(async test => -{ - await test.roll() - if (test.failed) - { - this.actor.corruptionDialog("moderate") - } -}) \ No newline at end of file diff --git a/scripts/UsuwsmU1TUQLQVM2.js b/scripts/UsuwsmU1TUQLQVM2.js index 07c7870..47d19c6 100644 --- a/scripts/UsuwsmU1TUQLQVM2.js +++ b/scripts/UsuwsmU1TUQLQVM2.js @@ -1,3 +1,2 @@ let lore = this.effect.name.split("(")[1].split(")")[0].toLowerCase(); -let spellLore = game.wfrp4e.config.magicLores[args.spell.system.lore.value].toLowerCase(); -return !args.spell || (args.type == "cast" && [game.wfrp4e.config.magicLores["petty"].toLowerCase(), lore].includes(spellLore)); \ No newline at end of file +return !args.spell || (args.type == "cast" && ["petty", lore].includes(args.spell.system.lore.value)); \ No newline at end of file diff --git a/scripts/UvycHOjSPm5Zv9KJ.js b/scripts/UvycHOjSPm5Zv9KJ.js deleted file mode 100644 index 59b3eea..0000000 --- a/scripts/UvycHOjSPm5Zv9KJ.js +++ /dev/null @@ -1,10 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Dodge"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -let baseDamage = "4"; -if (test.succeeded) - baseDamage = "0"; - -let damage = this.effect.sourceItem.system.computeSpellDamage(baseDamage, true) + parseInt(this.effect.sourceTest.result.SL); - -this.script.scriptMessage(await this.actor.applyBasicDamage(damage, {suppressMsg : true})) -this.actor.addCondition("ablaze") \ No newline at end of file diff --git a/scripts/UxVfVoH7cbC9ESDr.js b/scripts/UxVfVoH7cbC9ESDr.js new file mode 100644 index 0000000..908c4f4 --- /dev/null +++ b/scripts/UxVfVoH7cbC9ESDr.js @@ -0,0 +1,13 @@ +const test = await args.actor.setupSkill(game.i18n.localize("NAME.Cool"), { + skipTargets: true, + appendTitle: ` — ${this.effect.name}`, + fields: {difficulty: "challenging"}, + context: { + failure: `Gain d'1 état @Condition[Stunned].` + } +}); + +await test.roll(); + +if (test.failed) + args.actor.addCondition("stunned"); \ No newline at end of file diff --git a/scripts/V0b4yLTawjCnm9ke.js b/scripts/V0b4yLTawjCnm9ke.js new file mode 100644 index 0000000..9c5644d --- /dev/null +++ b/scripts/V0b4yLTawjCnm9ke.js @@ -0,0 +1,5 @@ +if (args.opposedTest.attackerTest.result.critical + || (args.totalWoundLoss > 0 && args.totalWoundLoss > args.actor.system.status.wounds.value)) +{ + await args.actor.corruptionDialog("minor") +} \ No newline at end of file diff --git a/scripts/V1D2Uo3WDKYQePU3.js b/scripts/V1D2Uo3WDKYQePU3.js index ad0163b..eee527e 100644 --- a/scripts/V1D2Uo3WDKYQePU3.js +++ b/scripts/V1D2Uo3WDKYQePU3.js @@ -10,5 +10,5 @@ let APused = Math.max(0, APatLoc.value - metalAP); // remove metal AP at locatio damage -= (APused + this.actor.system.characteristics.t.bonus) let msg = await this.actor.applyBasicDamage(damage, {suppressMsg : true, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL}); -msg += ` (ignore ${metalAP} PA métalliques sur ${game.wfrp4e.config.locations[loc]})` -this.script.scriptMessage(msg) +msg += ` (Ignore ${metalAP} PA de métal sur ${game.wfrp4e.config.locations[loc]})` +this.script.message(msg) diff --git a/scripts/V4PcjtHde941wv6J.js b/scripts/V4PcjtHde941wv6J.js new file mode 100644 index 0000000..9a26b26 --- /dev/null +++ b/scripts/V4PcjtHde941wv6J.js @@ -0,0 +1,17 @@ +await this.actor.addCondition("prone"); +const SL = this.effect.sourceTest.result.slOver; +const stunned = 1 + SL; +await this.actor.addCondition("stunned", stunned); + +if (stunned > this.actor.system.characteristics.t.bonus) { + const crit = ` Critique`; + + const Test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), { + skipTargets: true, + appendTitle: ` - ${this.effet.name}`, + fields: {difficulty: "average"}, + context: {failure: `Encaisse ${crit} à la tête.`} + }) + + await test.roll(); +} \ No newline at end of file diff --git a/scripts/V9wD9FWHWxZUOGSI.js b/scripts/V9wD9FWHWxZUOGSI.js index 382037e..6a6c916 100644 --- a/scripts/V9wD9FWHWxZUOGSI.js +++ b/scripts/V9wD9FWHWxZUOGSI.js @@ -4,12 +4,12 @@ roll.toMessage(this.script.getChatData()); if (fatigued > this.actor.characteristics.wp.bonus) { this.actor.addCondition("unconscious") - this.script.scriptNotification(`Tombe Incoscient`) + this.script.notification(`Tombe inconscient" `) } -else +else { fatigued = Math.max(0, fatigued) if (fatigued) this.actor.addCondition("fatigued", fatigued) - this.script.scriptNotification(`Subit ${fatigued} état Fatigué`) + this.script.notification(`Reçoit ${fatigued} états Extenué`) } \ No newline at end of file diff --git a/scripts/V9xm4X1x3lPYTQaI.js b/scripts/V9xm4X1x3lPYTQaI.js index 549adb9..1f3e976 100644 --- a/scripts/V9xm4X1x3lPYTQaI.js +++ b/scripts/V9xm4X1x3lPYTQaI.js @@ -1,6 +1,6 @@ if (args.extendedTest?.getFlag("wfrp4e", "fear")) { - this.script.scriptNotification("Immunisé à la Peur"); + this.script.notification("Immunisté à la Peur"); args.extendedTest.delete(); args.abort = true; } \ No newline at end of file diff --git a/scripts/V9zm2hKUVLVZtAcN.js b/scripts/V9zm2hKUVLVZtAcN.js index 3ce6873..d987925 100644 --- a/scripts/V9zm2hKUVLVZtAcN.js +++ b/scripts/V9zm2hKUVLVZtAcN.js @@ -10,13 +10,13 @@ let characteristics = { "wp" : 10, "fel" : 10 } -let skills = ["Charm", "Focalisation", "Entertain (Prophecy)", "Intuition"] +let skills = ["Charme", "Focalisation", "Entertain (Prophecy)", "Intuition"] let skillAdvancements = [0, 0, 20, 10] -let talents = ["Detect Artefact", "Menaçant", "Sixième Sens"] -let traits = ["Dooming", "Spellcaster (Lore of Life)", "Ward"] +let talents = ["Détection d’artefact", "Menaçant", "Sixième Sens"] +let traits = ["Condamné", "Spellcaster (Lore of Life)", "Protection"] let trappings = [] let items = []; -let spells = ["Forest of Thorns"]; +let spells = ["Forêt d'épines"]; let updateObj = this.actor.toObject(); @@ -27,14 +27,14 @@ for (let ch in characteristics) for (let index = 0; index < skills.length; index++) { - let skill = skills[index] + let Compétence = skills[index] let skillItem; - skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") + skillItem = updateObj.items.find(i => i.name == Compétence && i.type == "Compétence") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] else { - skillItem = await game.wfrp4e.utility.findSkill(skill) + skillItem = await game.wfrp4e.utility.findSkill(Compétence) skillItem = skillItem.toObject(); skillItem.system.advances.value = skillAdvancements[index]; items.push(skillItem); @@ -50,7 +50,7 @@ for (let talent of talents) } else { - ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) + ui.notifications.warn(`Could not find ${talent}`, {permanent : true}) } } @@ -59,32 +59,16 @@ for (let trait of traits) { let traitMatches = trait.matchAll(traitRegex).next().value let traitName = traitMatches[1] - let traitVal = traitMatches[2] || traitMatches[4] // could be match 2 or 4 depending on if there's a specialization - let traitSpec = traitMatches[3] - - let traitItem; - try { - traitItem = await WFRP_Utility.findItem(traitName, "trait") + let traitVal = traitMatches[2] || traitMatches[4] // could be match 2 or 4 depending on if there'}`).trim() } - catch { } - if (!traitItem) { - ui.notifications.warn(`Impossible de trouver ${trait}`, {permanent : true}) - } - traitItem = traitItem.toObject() - - if (Number.isNumeric(traitVal)) - { - traitItem.system.specification.value = traitName.includes('Weapon','Horns','Tail','Tentacles','Bite') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal; - traitItem.name = (traitItem.name + ` ${traitSpec ? "("+ traitSpec + ")" : ""}`).trim() - } - else + else traitItem.system.specification.value = traitSpec items.push(traitItem) } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -95,13 +79,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } -for (let spell of spells) +for (let spell of spells) { let spellItem = await game.wfrp4e.utility.findItem(spell) if (spellItem) @@ -110,13 +94,55 @@ for (let spell of spells) items.push(spellItem); } - else + else { - ui.notifications.warn(`Impossible de trouver ${spell}`, {permanent : true}) + ui.notifications.warn(`Could not find ${spell}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name +='Arme','Cornes','Tail','Tentacules','Morsure') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal; + traitItem.name = (traitItem.name + ` ${traitSpec ? "("+ traitSpec + ")" : ""}`).trim() + } + else + traitItem.system.specification.value = traitSpec + + items.push(traitItem) + +} + +for (let trapping of trappings) +{ + let trappingItem = await game.wfrp4e.utility.findItem(trapping) + if (trappingItem) + { + trappingItem = trappingItem.toObject() + + trappingItem.system.equipped.value = true; + + items.push(trappingItem); + } + else + { + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) + } +} + +for (let spell of spells) +{ + let spellItem = await game.wfrp4e.utility.findItem(spell) + if (spellItem) + { + spellItem = spellItem.toObject() + + items.push(spellItem); + } + else + { + ui.notifications.warn(`Could not find ${spell}`, {permanent : true}) + } +} + +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); \ No newline at end of file diff --git a/scripts/VAPsww9x3HAw1sKP.js b/scripts/VAPsww9x3HAw1sKP.js index 29c3c6e..e9dd915 100644 --- a/scripts/VAPsww9x3HAw1sKP.js +++ b/scripts/VAPsww9x3HAw1sKP.js @@ -1 +1 @@ -return !args.options.dodge \ No newline at end of file +return !args.context.dodge \ No newline at end of file diff --git a/scripts/VAs1nXvicdQK18Do.js b/scripts/VAs1nXvicdQK18Do.js deleted file mode 100644 index 88f8ad9..0000000 --- a/scripts/VAs1nXvicdQK18Do.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Language")); \ No newline at end of file diff --git a/scripts/VCnNWmRBH28Rx0JH.js b/scripts/VCnNWmRBH28Rx0JH.js deleted file mode 100644 index e3ce78a..0000000 --- a/scripts/VCnNWmRBH28Rx0JH.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Stealth")) \ No newline at end of file diff --git a/scripts/VGuZMIR1lE8I1F1y.js b/scripts/VGuZMIR1lE8I1F1y.js new file mode 100644 index 0000000..77d51a6 --- /dev/null +++ b/scripts/VGuZMIR1lE8I1F1y.js @@ -0,0 +1,5 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`}) +await test.roll(); +if (test.failed) { + this.actor.addCondition("stunned"); +} \ No newline at end of file diff --git a/scripts/VINX6TBAJQznhVcN.js b/scripts/VINX6TBAJQznhVcN.js index 6e90485..d1c71fa 100644 --- a/scripts/VINX6TBAJQznhVcN.js +++ b/scripts/VINX6TBAJQznhVcN.js @@ -1,6 +1,6 @@ -const repaired_message = `

    Finished replacing ${this.item.name} with a makeshift one.

    `; -const test = 'Maintenance Crew Test'; -const difficulty = 'hard'; +const repaired_message = `

    Le remplacement de ${this.item.name} par un équipement de fortune est terminé.

    `; +const Test = 'Test de l\'équipe de maintenance'; +const difficulty = 'difficile'; const target = 80; const extendedTestData = { @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { @@ -45,7 +45,7 @@ const extendedTestData = { ] } } - + ] }; diff --git a/scripts/VLdF2HPnCrNIgp7a.js b/scripts/VLdF2HPnCrNIgp7a.js index 387201b..a04183d 100644 --- a/scripts/VLdF2HPnCrNIgp7a.js +++ b/scripts/VLdF2HPnCrNIgp7a.js @@ -1,12 +1,12 @@ let items = []; let etiquette = (await fromUuid("Compendium.wfrp4e-core.items.Item.sYbgpSnRqSZWgwFP")).toObject(); -etiquette.name += " (Suivants de Khorne)"; +etiquette.name += " (Followers of Khorne)"; items.push(etiquette); let animosity = (await fromUuid("Compendium.wfrp4e-core.items.Item.0VpT5yubw4UL7j6f")).toObject(); - animosity.system.specification.value = "Suivants de Slaanesh"; + animosity.system.specification.value = "Followers of Slaanesh"; items.push(animosity); diff --git a/scripts/VNOKTzCrFbZ6PJUj.js b/scripts/VNOKTzCrFbZ6PJUj.js deleted file mode 100644 index 0674596..0000000 --- a/scripts/VNOKTzCrFbZ6PJUj.js +++ /dev/null @@ -1 +0,0 @@ -return !["Emprise sur les animaux", "Résistance", "Survie en extérieur"].includes(args.skill?.name) \ No newline at end of file diff --git a/scripts/VOc9sKag2Vy4vGGZ.js b/scripts/VOc9sKag2Vy4vGGZ.js new file mode 100644 index 0000000..ef07da2 --- /dev/null +++ b/scripts/VOc9sKag2Vy4vGGZ.js @@ -0,0 +1,59 @@ +let specifier = this.item.specifier; +let rune; +let categories = []; +if (specifier && specifier.toLowerCase() != "toutes formes") +{ + if (specifier.includes("Talisman")) + { + categories.push("talisman"); + } + if (specifier.includes("Protection")) + { + categories.push("protection"); + } + if (specifier.includes("Arme")) + { + categories.push("weapon"); + } + if (specifier.includes("Armure")) + { + categories.push("armour"); + } + if (specifier.includes("Engineering")) + { + categories.push("engineering"); + } + + if (categories.length) + { + let runes = await warhammer.utility.findAllItems("wfrp4e-dwarfs.rune", null, true, ["system.category", "system.master"]); + let choices = runes.filter(i => categories.includes(i.system.category) && i.system.master); + + if (choices.length) + { + rune = (await ItemDialog.create(choices, 1, {title : this.effect.name, text : specifier, indexed: true}))[0] + } + else + { + rune = await DragDialog.create({text : `Provide Master Rune to learn (${specifier})`, title : this.effect.name, filter: (item) => item.type == "wfrp4e-dwarfs.rune" && item.system.master, onError: "Doit fournir une Rune Maîtresse"}); + } + } + else + { + rune = await DragDialog.create({text : `Provide Master Rune to learn (${specifier})`, title : this.effect.name, filter: (item) => item.type == "wfrp4e-dwarfs.rune" && item.system.master, onError: "Doit fournir une Rune Maîtresse"}); + } +} +else +{ + rune = await DragDialog.create({text : `Provide Master Rune to learn`, title : this.effect.name, filter: (item) => item.type == "wfrp4e-dwarfs.rune" && item.system.master, onError: "Doit fournir une Rune Maîtresse"}); +} + +this.actor.addEffectItems(rune.uuid, this.effect) + +let talents = this.actor.itemTags.talent.filter(i => i.baseName == this.item.baseName); +let xpCost = talents.length * 100 + +if (this.actor.type == "character" && (await foundry.applications.api.DialogV2.confirm({window: {title: this.effect.name}, content: `

    Spend ${xpCost} XP for learning ${this.item.name}?

    `}))) +{ + this.actor.update({"system.details.experience.log" : this.actor.system.addToExpLog(xpCost, this.item.name, this.actor.system.details.experience.spent + xpCost)}) +} \ No newline at end of file diff --git a/scripts/VQaC6ynouW5EQCbC.js b/scripts/VQaC6ynouW5EQCbC.js deleted file mode 100644 index 011cb84..0000000 --- a/scripts/VQaC6ynouW5EQCbC.js +++ /dev/null @@ -1,13 +0,0 @@ -let roll = await new Roll("1d10").roll(); - -await roll.toMessage(this.script.getChatData()); - -this.script.scriptMessage(await this.actor.applyBasicDamage(roll.total, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})); - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : " - " + this.effect.name}); -await test.roll(); - -if (test.succeeded) -{ - return false; -} \ No newline at end of file diff --git a/scripts/VRDS4lkwSAzbtvm4.js b/scripts/VRDS4lkwSAzbtvm4.js new file mode 100644 index 0000000..610b03e --- /dev/null +++ b/scripts/VRDS4lkwSAzbtvm4.js @@ -0,0 +1,4 @@ +if (args.totalWoundLoss > this.actor.system.status.wounds.value || args.opposedTest?.attackerTest.result.critical) +{ + args.extraMessages.push(`${this.effect.name}: Can reverse Critical Wound roll`) +} \ No newline at end of file diff --git a/scripts/VTzpExK3QSCaFQPf.js b/scripts/VTzpExK3QSCaFQPf.js new file mode 100644 index 0000000..fe646a4 --- /dev/null +++ b/scripts/VTzpExK3QSCaFQPf.js @@ -0,0 +1,13 @@ +if (args.equipped) +{ + let item = await fromUuid("Compendium.wfrp4e-core.items.Item.SfUUdOGjdYpr3KSR") + let regen = item.toObject(); + item = await fromUuid("Compendium.wfrp4e-core.items.Item.kJNAY1YRaCy9IgmT"); + let terror = item.toObject(); + terror.system.specification.value = 2; + this.actor.createEmbeddedDocuments("Item", [regen, terror], {fromEffect : this.effect.id}); +} +else +{ + this.effect.deleteCreatedItems(); +} \ No newline at end of file diff --git a/scripts/VXERNoc5IazQGuGO.js b/scripts/VXERNoc5IazQGuGO.js index 5ac49c4..583740c 100644 --- a/scripts/VXERNoc5IazQGuGO.js +++ b/scripts/VXERNoc5IazQGuGO.js @@ -1,7 +1,7 @@ if (args.applyAP && args.modifiers.ap.metal) { args.modifiers.ap.ignored += args.modifiers.ap.metal - args.modifiers.other.push({value : args.modifiers.ap.metal, label : this.effect.name, details : "Add Metal AP to Damage" }) - args.modifiers.ap.details.push("" + this.effect.name + ": Ignore Metal (" + args.modifiers.ap.metal + ")"); + args.modifiers.other.push({value : args.modifiers.ap.metal, label : this.effect.name, details : "Ajouter PA de métal aux Dégâts" }) + args.modifiers.ap.details.push("" + this.effect.name + ": Ignorer Métal (" + args.modifiers.ap.metal + ")"); args.modifiers.ap.metal = 0 } \ No newline at end of file diff --git a/scripts/VbI0Al6rJfypV3qY.js b/scripts/VbI0Al6rJfypV3qY.js new file mode 100644 index 0000000..8530f8d --- /dev/null +++ b/scripts/VbI0Al6rJfypV3qY.js @@ -0,0 +1,4 @@ +const failure = game.i18n.localize("ROLL.ImpressiveFailure"); +const success = game.i18n.localize("ROLL.AstoundingSuccess"); + +args.test.result.description = args.test.succeeded ? success : failure; \ No newline at end of file diff --git a/scripts/VbL0TgaBAmYjrezZ.js b/scripts/VbL0TgaBAmYjrezZ.js deleted file mode 100644 index 2f61494..0000000 --- a/scripts/VbL0TgaBAmYjrezZ.js +++ /dev/null @@ -1,2 +0,0 @@ -const talents = await Promise.all(["Dur à cuire"].map(game.wfrp4e.utility.findTalent)) -this.actor.createEmbeddedDocuments("Item", talents, {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/VcE8Hie2jbpuyuM3.js b/scripts/VcE8Hie2jbpuyuM3.js new file mode 100644 index 0000000..f7f86a5 --- /dev/null +++ b/scripts/VcE8Hie2jbpuyuM3.js @@ -0,0 +1,34 @@ +const vomit = this.actor.itemTags.trait.find(t => t.name === "Vomissement"); +const name = "Bileful rollTest"; + +if (!vomit) return; + +const effect = vomit.effects.find(e => e.name === "Vomissement"); +const scriptData = effect.system.scriptData; + +// REMINDER + +scriptData.push({ + label: 'Rappel des règles du sort', + trigger: 'rollTest', + script: ` + args.test.result.other.push("This rollTest attack follows the rules for the Lore of Nurgle spell @UUID[Compendium.wfrp4e-core.items.Item.XhyZ140R1iA1J7wZ]."); + ` +}); + +// /REMINDER + +// update Effect's name +await effet.update({ + name, + "system.scriptData": scriptData +}); + + +// update Trait's name +await vomit.update({name}); + +// copy effect from Stream of Corruption spell +const effectData = (await fromUuid("Compendium.wfrp4e-core.items.Item.XhyZ140R1iA1J7wZ.ActiveEffect.KAXAHr5NdusLTz6k")).toObject(); + +await vomit.createEmbeddedDocuments("ActiveEffect", [effectData]); \ No newline at end of file diff --git a/scripts/VlFUDaKUYoBYKYn0.js b/scripts/VlFUDaKUYoBYKYn0.js deleted file mode 100644 index b75c5c1..0000000 --- a/scripts/VlFUDaKUYoBYKYn0.js +++ /dev/null @@ -1,7 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, context : {failure: "1 Corruption Point Gained"}}) -await test.roll(); -if (test.failed && this.actor.type == "character") -{ - this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + 1}) - this.script.scriptMessage("Gain d'1 Point de Corruption", {whisper : ChatMessage.getWhisperRecipients("GM")}) -} \ No newline at end of file diff --git a/scripts/VlHuDIAvPr8JM1P5.js b/scripts/VlHuDIAvPr8JM1P5.js deleted file mode 100644 index 3f2a904..0000000 --- a/scripts/VlHuDIAvPr8JM1P5.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Row"); \ No newline at end of file diff --git a/scripts/Vns6WrafVq8NjX7t.js b/scripts/Vns6WrafVq8NjX7t.js deleted file mode 100644 index 3b16346..0000000 --- a/scripts/Vns6WrafVq8NjX7t.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Heal") \ No newline at end of file diff --git a/scripts/VqTrKPtxv9hpn0Hr.js b/scripts/VqTrKPtxv9hpn0Hr.js deleted file mode 100644 index c785745..0000000 --- a/scripts/VqTrKPtxv9hpn0Hr.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != "Langue (Magick)" \ No newline at end of file diff --git a/scripts/VurA2XNqC0d9U49C.js b/scripts/VurA2XNqC0d9U49C.js deleted file mode 100644 index 9853d7f..0000000 --- a/scripts/VurA2XNqC0d9U49C.js +++ /dev/null @@ -1,8 +0,0 @@ -this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => -{ - await test.roll() - if (test.failed) - { - this.actor.addCondition("fatigued") - } -}) \ No newline at end of file diff --git a/scripts/VzO0ZDcTWvaBn4vm.js b/scripts/VzO0ZDcTWvaBn4vm.js deleted file mode 100644 index 22bb444..0000000 --- a/scripts/VzO0ZDcTWvaBn4vm.js +++ /dev/null @@ -1,13 +0,0 @@ -if (args.test.preData.skillName?.includes(game.i18n.localize("NAME.Language")) || args.test instanceof CastTest) -{ - if (parseInt(args.test.result.SL) > 0 || args.test.succeeded) - { - if (parseInt(args.test.result.SL) > 0) - { - args.test.result.SL = "-0"; - args.test.result.description = game.i18n.localize("ROLL.MarginalFailure"); - } - args.test.result.outcome = "failure" - args.test.result.other.push(`${this.effect.name}: Maximum -0 DR`) - } -} \ No newline at end of file diff --git a/scripts/VzgTGb5QXKoyPNh3.js b/scripts/VzgTGb5QXKoyPNh3.js index 0d934ee..14b45eb 100644 --- a/scripts/VzgTGb5QXKoyPNh3.js +++ b/scripts/VzgTGb5QXKoyPNh3.js @@ -6,8 +6,8 @@ if (args.attackerTest.weapon && args.defenderTest.weapon) if (attackerReach == defenderReach) defenderReach = defenderReach < 7 ? defenderReach + 1 : defenderReach - attackerReach = game.wfrp4e.utility.findKey(attackerReach, game.wfrp4e.config.reachNum) - defenderReach = game.wfrp4e.utility.findKey(defenderReach, game.wfrp4e.config.reachNum) + attackerReach = warhammer.utility.findKey(attackerReach, game.wfrp4e.config.reachNum) + defenderReach = warhammer.utility.findKey(defenderReach, game.wfrp4e.config.reachNum) args.attackerTest.weapon.reach.value = attackerReach args.defenderTest.weapon.reach.value = defenderReach diff --git a/scripts/W2rdTwflbUVxFyfd.js b/scripts/W2rdTwflbUVxFyfd.js new file mode 100644 index 0000000..0114a36 --- /dev/null +++ b/scripts/W2rdTwflbUVxFyfd.js @@ -0,0 +1,14 @@ +let difficulty = "" + if (this.effect.name.includes("Moderate")) + difficulty = "easy" + else if (this.effect.name.includes("Severe")) + difficulty = "average" + else + difficulty = "veasy" + + let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {context : {failure : this.actor.name + " meurt de la Pourriture"}, fields: {difficulty}, appendTitle : " - Pourriture"}) + await Test.roll(); + if (Test.Échoué) + { + this.actor.addCondition("dead"); + } \ No newline at end of file diff --git a/scripts/W5qtA7Ul5cOj18Nd.js b/scripts/W5qtA7Ul5cOj18Nd.js new file mode 100644 index 0000000..b5dfbf5 --- /dev/null +++ b/scripts/W5qtA7Ul5cOj18Nd.js @@ -0,0 +1 @@ +this.item.update({"system.AP" : {lArm : 3, rArm : 3, lLeg : 3, rLeg: 3}}); \ No newline at end of file diff --git a/scripts/W9nyUNQStMr1pUHJ.js b/scripts/W9nyUNQStMr1pUHJ.js index 9e2119c..fd0843c 100644 --- a/scripts/W9nyUNQStMr1pUHJ.js +++ b/scripts/W9nyUNQStMr1pUHJ.js @@ -1,5 +1,5 @@ if (args.opposedTest.result.hitloc.value == this.item.system.location.key) { args.actor.addCondition("bleeding", 1); - this.script.scriptNotification("Ajout de Hémorragique"); -} + this.script.notification("Etat Hémorragique ajouté") +} \ No newline at end of file diff --git a/scripts/WB6sIpLEPC8YPX67.js b/scripts/WB6sIpLEPC8YPX67.js index 2c65a63..e7427be 100644 --- a/scripts/WB6sIpLEPC8YPX67.js +++ b/scripts/WB6sIpLEPC8YPX67.js @@ -1,6 +1,6 @@ -if (args.options.dodge) +if (args.context.dodge) { args.abort = true; - this.script.scriptNotification("Ne peut pas esquiver!") + this.script.notification("Impossible d'Esquiver!") } return ["t", "int", "wp", "fel"].includes(args.characteristic) \ No newline at end of file diff --git a/scripts/WO5n7Vbx8AgoVrwC.js b/scripts/WO5n7Vbx8AgoVrwC.js index eb2b2f4..b8362dc 100644 --- a/scripts/WO5n7Vbx8AgoVrwC.js +++ b/scripts/WO5n7Vbx8AgoVrwC.js @@ -10,10 +10,10 @@ let characteristics = { "wp" : 5, "fel" : 5 } -let skills = ["Intuition", "Lore (Local)", "Perception"] +let skills = ["Intuition", "Savoir (Local)", "Perception"] let skillAdvancements = [10, 10, 10] let talents = [] -let trappings = ["Mail Coat", "Mail Chausses", "Mail Coif", "Arme simple"] +let trappings = ["Cotte de Mailles", "Chausses de Mailles", "Coiffe de Mailles", "Arme simple"] let items = [] let updateObj = this.actor.toObject(); @@ -30,7 +30,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,7 +63,7 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } diff --git a/scripts/WOpRJluHKER1MdgI.js b/scripts/WOpRJluHKER1MdgI.js new file mode 100644 index 0000000..0114a36 --- /dev/null +++ b/scripts/WOpRJluHKER1MdgI.js @@ -0,0 +1,14 @@ +let difficulty = "" + if (this.effect.name.includes("Moderate")) + difficulty = "easy" + else if (this.effect.name.includes("Severe")) + difficulty = "average" + else + difficulty = "veasy" + + let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {context : {failure : this.actor.name + " meurt de la Pourriture"}, fields: {difficulty}, appendTitle : " - Pourriture"}) + await Test.roll(); + if (Test.Échoué) + { + this.actor.addCondition("dead"); + } \ No newline at end of file diff --git a/scripts/WR0Kqn8CF5iwToak.js b/scripts/WR0Kqn8CF5iwToak.js index 0a34397..e66d456 100644 --- a/scripts/WR0Kqn8CF5iwToak.js +++ b/scripts/WR0Kqn8CF5iwToak.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Tailor)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Trade (Tailor)'; const difficulty = 'difficult'; const target = 40; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/WTRYAEzwxRuGENyI.js b/scripts/WTRYAEzwxRuGENyI.js deleted file mode 100644 index 6614176..0000000 --- a/scripts/WTRYAEzwxRuGENyI.js +++ /dev/null @@ -1,18 +0,0 @@ - // Every living creature within 10 yards, other than the wielder of the hammer, - // must make a Challenging (+0) Endurance Test - - let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), { - skipTargets: true, appendTitle : " - " + this.effect.name, - fields: {difficulty: "challenging"} - }) - - await test.roll(); - if (test.failed) - { - // or gain a Deafened Condition - this.actor.addCondition("deafened"); - // and suffer 1d10 Wounds which bypass armour but not Toughness Bonus. - let damage = (await new Roll("1d10").roll()); - await damage.toMessage(this.script.getChatData()); - this.script.scriptMessage(await this.actor.applyBasicDamage(damage.total, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true})) - } \ No newline at end of file diff --git a/scripts/WaeL2I8VVJmBBKHk.js b/scripts/WaeL2I8VVJmBBKHk.js new file mode 100644 index 0000000..4794f63 --- /dev/null +++ b/scripts/WaeL2I8VVJmBBKHk.js @@ -0,0 +1,19 @@ +const vomit = this.actor.itemTags.trait.find(t => t.name === "Vomissement"); +const name = "Test de Corruption"; + +if (!vomit) return; + +const effect = vomit.effects.find(e => e.name === "Vomissement"); +const scriptData = effect.system.scriptData; + +scriptData[0].script = ` +args.actor.addCondition("stunned"); +args.actor.corruptionDialog("moderate"); +` + +await effect.update({ + name, + "system.scriptData": scriptData +}); + +await vomit.update({name}); \ No newline at end of file diff --git a/scripts/Wh1VV3javfzcV3bP.js b/scripts/Wh1VV3javfzcV3bP.js new file mode 100644 index 0000000..8e3240a --- /dev/null +++ b/scripts/Wh1VV3javfzcV3bP.js @@ -0,0 +1,7 @@ +let spells = await warhammer.utility.findAllItems("spell", "Loading Spells", true, ["system.lore.value"]); + +spells = spells.filter(i => ["dark", "light", "fire", "life", "beasts", "shadows", "death", "heavens", "metal"].includes(i.system.lore.value)).sort((a, b) => a.name > b.name ? 1 : -1); + +let choices = await ItemDialog.create(spells, 7, {text : "Choisissez 7 Sorts parmi toute combinaison de Magie de Couleur, Sorcellerie ou Magie Noire", title : this.effect.name}) + +this.actor.addEffectItems(choices.map(i => i.uuid), this.effect) \ No newline at end of file diff --git a/scripts/WiYtNU2Y5BJfIpeM.js b/scripts/WiYtNU2Y5BJfIpeM.js index 3af96fd..1a16004 100644 --- a/scripts/WiYtNU2Y5BJfIpeM.js +++ b/scripts/WiYtNU2Y5BJfIpeM.js @@ -6,7 +6,7 @@ if (location) if (dropped.length) { - this.script.scriptNotification(`Lache ${dropped.map(i => i.name).join(", ")}!`) + this.script.notification(`Dropped ${dropped.map(i => i.name).join(", ")}!`) for(let weapon of dropped) { await weapon.system.toggleEquip(); diff --git a/scripts/Wo4wQKUxSItAhRzZ.js b/scripts/Wo4wQKUxSItAhRzZ.js index d3828b8..0923471 100644 --- a/scripts/Wo4wQKUxSItAhRzZ.js +++ b/scripts/Wo4wQKUxSItAhRzZ.js @@ -1,9 +1,8 @@ let lore = this.effect.name.split("(")[1].split(")")[0].toLowerCase(); -let spellLore = game.wfrp4e.config.magicLores[args.spell.system.lore.value].toLowerCase(); // If channelling corresponding lore -if (args.type == "channelling" && spellLore == lore) +if (args.type == "channelling" && args.spell.system.lore.value == lore) args.prefillModifiers.slBonus += 3 // If channelling or casting different lore -else if (spellLore != lore && args.spell.system.lore.value != "petty") +else if (args.spell.system.lore.value != lore && args.spell.system.lore.value != "petty") args.prefillModifiers.slBonus -= 1 \ No newline at end of file diff --git a/scripts/Wqff6ICWYzvLDYC8.js b/scripts/Wqff6ICWYzvLDYC8.js deleted file mode 100644 index cbd8baf..0000000 --- a/scripts/Wqff6ICWYzvLDYC8.js +++ /dev/null @@ -1,12 +0,0 @@ -if (this.actor.system.details.experience.current < 100) { - return this.script.notification(game.i18n.localize("SCRIPT.NotEnoughXP")) -} - -let item = await game.wfrp4e.utility.findItem("Sensory Sharing", "trait") -this.actor.createEmbeddedDocuments("Item", [item]); -let expLog = foundry.utils.duplicate(this.actor.details.experience.log || []); -expLog.push({amount : 100, reason: item.name, spent: this.actor.details.experience.spent + 100, total: this.actor.details.experience.total, type: "spent"}); -this.actor.update({ - "system.details.experience.spent": this.actor.details.experience.spent + 100, - "system.details.experience.log": expLog - }); \ No newline at end of file diff --git a/scripts/WsN2R1qOzuLa2qyB.js b/scripts/WsN2R1qOzuLa2qyB.js new file mode 100644 index 0000000..22022dd --- /dev/null +++ b/scripts/WsN2R1qOzuLa2qyB.js @@ -0,0 +1,59 @@ +let specifier = this.item.specifier; +let rune; +let categories = []; +if (specifier && specifier.toLowerCase() != "toutes formes") +{ + if (specifier.includes("Talisman")) + { + categories.push("talisman"); + } + if (specifier.includes("Protection")) + { + categories.push("protection"); + } + if (specifier.includes("Arme")) + { + categories.push("weapon"); + } + if (specifier.includes("Armure")) + { + categories.push("armour"); + } + if (specifier.includes("Engineering")) + { + categories.push("engineering"); + } + + if (categories.length) + { + let runes = await warhammer.utility.findAllItems("wfrp4e-dwarfs.rune", null, true, ["system.category", "system.master"]); + let choices = runes.filter(i => categories.includes(i.system.category) && !i.system.master); + + if (choices.length) + { + rune = (await ItemDialog.create(choices, 1, {title : this.effect.name, text : specifier, indexed: true}))[0] + } + else + { + rune = await DragDialog.create({text : `Provide Rune to learn (${specifier})`, title : this.effect.name, filter: (item) => item.type == "wfrp4e-dwarfs.rune" && !item.system.master, onError: "Doit fournir une Rune (non-Maîtresse)"}); + } + } + else + { + rune = await DragDialog.create({text : `Provide Rune to learn (${specifier})`, title : this.effect.name, filter: (item) => item.type == "wfrp4e-dwarfs.rune" && !item.system.master, onError: "Doit fournir une Rune (non-Maîtresse)"}); + } +} +else +{ + rune = await DragDialog.create({text : `Provide Rune to learn`, title : this.effect.name, filter: (item) => item.type == "wfrp4e-dwarfs.rune" && !item.system.master, onError: "Doit fournir une Rune (non-Maîtresse)"}); +} + +this.actor.addEffectItems(rune.uuid, this.effect) + +let talents = this.actor.itemTags.talent.filter(i => i.baseName == this.item.baseName); +let xpCost = talents.length * 100 + +if (this.actor.type == "character" && (await foundry.applications.api.DialogV2.confirm({window: {title: this.effect.name}, content: `

    Spend ${xpCost} XP for learning ${this.item.name}?

    `}))) +{ + this.actor.update({"system.details.experience.log" : this.actor.system.addToExpLog(xpCost, this.item.name, this.actor.system.details.experience.spent + xpCost)}) +} \ No newline at end of file diff --git a/scripts/WtbSIghR0q4euE7J.js b/scripts/WtbSIghR0q4euE7J.js new file mode 100644 index 0000000..dd611b4 --- /dev/null +++ b/scripts/WtbSIghR0q4euE7J.js @@ -0,0 +1,4 @@ +if (args.effect.conditionId == "ablaze") +{ + args.data.formula = `(${args.data.formula}) * 2`; +} \ No newline at end of file diff --git a/scripts/X3vpmNUj9SL2CDnF.js b/scripts/X3vpmNUj9SL2CDnF.js index 2be4884..329c5ee 100644 --- a/scripts/X3vpmNUj9SL2CDnF.js +++ b/scripts/X3vpmNUj9SL2CDnF.js @@ -1,2 +1,2 @@ let item = args.actor.items.find(i => i.name.includes("Flying Jib")); -item.name += ` (Désactivé par ${this.item.name})`; \ No newline at end of file +item.name += ` (Disabled by ${this.item.name})`; \ No newline at end of file diff --git a/scripts/XClTZOjuhcxWLF51.js b/scripts/XClTZOjuhcxWLF51.js deleted file mode 100644 index 9765515..0000000 --- a/scripts/XClTZOjuhcxWLF51.js +++ /dev/null @@ -1,13 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty: "difficult"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); - -if (test.failed) -{ - this.actor.addCondition("stunned") -} - - -let item = await fromUuid("Compendium.wfrp4e-core.items.4lj1ik958mbgAlaF") -let data = item.toObject(); -data.system.location.key = this.item.system.location.key -this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) diff --git a/scripts/XO9m2AvFRAAeEuty.js b/scripts/XO9m2AvFRAAeEuty.js index 1f60a0f..67412d0 100644 --- a/scripts/XO9m2AvFRAAeEuty.js +++ b/scripts/XO9m2AvFRAAeEuty.js @@ -1,5 +1,5 @@ if (args.test.options.fieldDressing && args.test.result.reversed) { args.test.data.result.SL = "+" + Math.min(1, Number(args.test.data.result.SL)) - args.test.result.other.push(`${this.effect.name}: DR limité à 1`) + args.test.result.other.push(`${this.effect.name}: SL limited to 1`) } \ No newline at end of file diff --git a/scripts/XPpHYTTT0hqYuSfa.js b/scripts/XPpHYTTT0hqYuSfa.js new file mode 100644 index 0000000..89a6b30 --- /dev/null +++ b/scripts/XPpHYTTT0hqYuSfa.js @@ -0,0 +1,4 @@ +fromUuid("Compendium.wfrp4e-core.items.IAWyzDfC286a9MPz").then(item => { + item = item.toObject() + this.actor.createEmbeddedDocuments("Item", [item], {fromEffect : this.effect.id}) +}) \ No newline at end of file diff --git a/scripts/XSbQKrrbjsN15Zp9.js b/scripts/XSbQKrrbjsN15Zp9.js new file mode 100644 index 0000000..ba6aead --- /dev/null +++ b/scripts/XSbQKrrbjsN15Zp9.js @@ -0,0 +1,7 @@ +if (!args.messageSent) +{ + args.messageSent = true; + let advantage = this.item.effects.filter(i => i.name == this.effect.name).length; + this.actor.setAdvantage(advantage) + this.script.message(`Allies within 12 yards gain ${advantage} Advantage`) +} \ No newline at end of file diff --git a/scripts/XcvDYNZgJ2rpAdDV.js b/scripts/XcvDYNZgJ2rpAdDV.js index 407b12a..8287614 100644 --- a/scripts/XcvDYNZgJ2rpAdDV.js +++ b/scripts/XcvDYNZgJ2rpAdDV.js @@ -1,6 +1,7 @@ -let fatigued = this.actor.hasCondition("fatigued") -if (!fatigued) { - this.actor.addCondition("fatigued") - ui.notifications.notify("Etat Fatigué ajouté à " + this.actor.name + " qui ne peut être enlevé tant que le symptôme de Malaise est présent.") -} \ No newline at end of file + let fatigued = this.actor.hasCondition("fatigued") + if (!fatigued) + { + this.actor.addCondition("fatigued") + ui.notifications.notify("Etat Extenué ajouté à " + this.actor.name + " qui est impossible à retirer tant que le symptôme de malaise est présent.") + } \ No newline at end of file diff --git a/scripts/Xe8ijqWU3bbtq7ZY.js b/scripts/Xe8ijqWU3bbtq7ZY.js index 86ba86b..f232698 100644 --- a/scripts/Xe8ijqWU3bbtq7ZY.js +++ b/scripts/Xe8ijqWU3bbtq7ZY.js @@ -1,5 +1,5 @@ if (args.opposedTest.defenderTest.actor.Species.toLowerCase().includes("skaven")) { args.addImpact = true; - args.opposedTest.result.other.push("Impact contre les Skavens") + args.opposedTest.result.other.push("Impact against Skaven") } \ No newline at end of file diff --git a/scripts/Xf4FcZ4ZLdWmOXBa.js b/scripts/Xf4FcZ4ZLdWmOXBa.js deleted file mode 100644 index 9aec486..0000000 --- a/scripts/Xf4FcZ4ZLdWmOXBa.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Perception") && !args.skill?.name.includes(game.i18n.localize("NAME.Stealth")); \ No newline at end of file diff --git a/scripts/XfSxXatjEYlPEbaK.js b/scripts/XfSxXatjEYlPEbaK.js new file mode 100644 index 0000000..187999c --- /dev/null +++ b/scripts/XfSxXatjEYlPEbaK.js @@ -0,0 +1,3 @@ +const broken = this.actor.hasCondition("broken"); + +//broken?.delete(); \ No newline at end of file diff --git a/scripts/XjUXxUA0hbwjUatW.js b/scripts/XjUXxUA0hbwjUatW.js new file mode 100644 index 0000000..133121b --- /dev/null +++ b/scripts/XjUXxUA0hbwjUatW.js @@ -0,0 +1,12 @@ +if (this.actor.hasCondition("engaged") && this.effect.disabled) +{ + this.effect.update({"disabled" : false}) + this.item.effects.contents[1].update({"disabled" : false}); + this.script.notification("Enabled") +} +else if (this.effect.active && !this.actor.hasCondition("engaged")) +{ + this.effect.update({"disabled" : true}) + this.item.effects.contents[1].update({"disabled" : true}); + +} \ No newline at end of file diff --git a/scripts/Xk9XPklxxTvFlwpI.js b/scripts/Xk9XPklxxTvFlwpI.js index 2c3a1c6..db63fef 100644 --- a/scripts/Xk9XPklxxTvFlwpI.js +++ b/scripts/Xk9XPklxxTvFlwpI.js @@ -1 +1 @@ -args.options.useOnesArgumentative = true; \ No newline at end of file +args.context.useOnesArgumentative = true; \ No newline at end of file diff --git a/scripts/XuFxKPYheYF4WMmQ.js b/scripts/XuFxKPYheYF4WMmQ.js deleted file mode 100644 index ed63e68..0000000 --- a/scripts/XuFxKPYheYF4WMmQ.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Cool"); \ No newline at end of file diff --git a/scripts/XzJotwVUIuQu6b0G.js b/scripts/XzJotwVUIuQu6b0G.js new file mode 100644 index 0000000..06b3f7d --- /dev/null +++ b/scripts/XzJotwVUIuQu6b0G.js @@ -0,0 +1 @@ +return !args.context.whirlwind || !args.weapon || !this.actor.has(game.i18n.localize("NAME.DualWielder"), "talent") || this.actor.noOffhand \ No newline at end of file diff --git a/scripts/Y27MmN5KFw45d5vQ.js b/scripts/Y27MmN5KFw45d5vQ.js new file mode 100644 index 0000000..04b8b8c --- /dev/null +++ b/scripts/Y27MmN5KFw45d5vQ.js @@ -0,0 +1,10 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {difficulty: "challenging"}) +await test.roll(); +if (!test.succeeded) +{ + let rollResult = await (await fromUuid("RollTable.GL7rKOEThauPUK0E")).roll({allowInteractive : false}); + let diseaseId = rollResult.results[0].documentId; + let disease = await fromUuid("Item."+diseaseId); + obj = disease.toObject(); + this.actor.createEmbeddedDocuments("Item", [obj]); +} \ No newline at end of file diff --git a/scripts/Y43z8YCohJMA8Ia7.js b/scripts/Y43z8YCohJMA8Ia7.js new file mode 100644 index 0000000..9d33b8d --- /dev/null +++ b/scripts/Y43z8YCohJMA8Ia7.js @@ -0,0 +1,3 @@ +if (!args.test.preData.options?.giantbane) return +if (!this.item.equipped.value || !args.test.item) return; +args.test.preData.canReverse = true \ No newline at end of file diff --git a/scripts/Y7McxsHFeGhwQx0J.js b/scripts/Y7McxsHFeGhwQx0J.js index f2deebb..0063633 100644 --- a/scripts/Y7McxsHFeGhwQx0J.js +++ b/scripts/Y7McxsHFeGhwQx0J.js @@ -1,4 +1,4 @@ -this.actor.createEmbeddedDocuments("Item", [expandObject({ +this.actor.createEmbeddedDocuments("Item", [foundry.utils.expandObject({ name : "Ghostly Flame", type : "weapon", img : this.effect.img, diff --git a/scripts/Y8J66v8VTKUASGuK.js b/scripts/Y8J66v8VTKUASGuK.js index db00064..6d25f4d 100644 --- a/scripts/Y8J66v8VTKUASGuK.js +++ b/scripts/Y8J66v8VTKUASGuK.js @@ -1,9 +1,9 @@ if (!this.actor.effects.find(e => e.isCondition)) { - return this.script.scriptNotification("Aucun état sur cet acteur") + return this.script.notification("Aucun état sur cet acteur") } -let choice = await ItemDialog.create(this.actor.effects.filter(i => i.isCondition), 1, "Choisissez un état") +let choice = await ItemDialog.create(this.actor.effects.filter(i => i.isCondition), 1, "Choisir un état") if (choice[0]) { diff --git a/scripts/YDANERWYHyJ2ACeo.js b/scripts/YDANERWYHyJ2ACeo.js new file mode 100644 index 0000000..fce5808 --- /dev/null +++ b/scripts/YDANERWYHyJ2ACeo.js @@ -0,0 +1 @@ +args.fields.modifier -= 25 \ No newline at end of file diff --git a/scripts/YDqpKJVy8ijEKdLX.js b/scripts/YDqpKJVy8ijEKdLX.js deleted file mode 100644 index 8038377..0000000 --- a/scripts/YDqpKJVy8ijEKdLX.js +++ /dev/null @@ -1 +0,0 @@ -return !(this.actor.attacker && (args.skill?.name.includes("Corps à corps (Base)") || (args.type == "weapon" && args.item?.system.weaponGroup.value == "basic"))) \ No newline at end of file diff --git a/scripts/YEBw2CzHYxsTpTy5.js b/scripts/YEBw2CzHYxsTpTy5.js deleted file mode 100644 index 8b438ad..0000000 --- a/scripts/YEBw2CzHYxsTpTy5.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Haggle"); \ No newline at end of file diff --git a/scripts/YFSgWRXel0bWE3EE.js b/scripts/YFSgWRXel0bWE3EE.js deleted file mode 100644 index 459f8b2..0000000 --- a/scripts/YFSgWRXel0bWE3EE.js +++ /dev/null @@ -1 +0,0 @@ -return ["ag", "ws", "bs"].includes(args.characteristic) || args.skill?.name == game.i18n.localize("NAME.Climb"); \ No newline at end of file diff --git a/scripts/YHEIkBKWXKNPqglh.js b/scripts/YHEIkBKWXKNPqglh.js index ee2ebfb..952eb9b 100644 --- a/scripts/YHEIkBKWXKNPqglh.js +++ b/scripts/YHEIkBKWXKNPqglh.js @@ -1,4 +1,4 @@ if (args.test.result.castOutcome == "success") { - game.wfrp4e.utility.postCorruptionTest("moderate", this.script.getChatData()) + CorruptionMessageModel.createCorruptionMessage("moderate", this.script.getChatData()) } diff --git a/scripts/YJX7WnxzXXIVdH6P.js b/scripts/YJX7WnxzXXIVdH6P.js index cc0a9a0..4eeef7e 100644 --- a/scripts/YJX7WnxzXXIVdH6P.js +++ b/scripts/YJX7WnxzXXIVdH6P.js @@ -1,4 +1,4 @@ -let lore = await ValueDialog.create({text : "Choisissez un Domaine", title: "Savoir"}, "", {"fire" : "Feu", "death" : "Mort", "metal" : "Métal", "shadow" : "Ombres"}); +let lore = await ValueDialog.create({text : "Choisissez un Savoir", title: "Savoir"}, "", {"fire" : "Fire", "death" : "Death", "metal" : "Metal", "shadow" : "Discret"}); let filters = [ { @@ -11,7 +11,7 @@ let filters = [ } ] -let petty = await ItemDialog.createFromFilters(filters, 6, "Choisissez 3 Sorts de Magie Mineure") +let petty = await ItemDialog.createFromFilters(filters, 6, {title : this.effect.name, text : "Choisissez 6 Sorts Mineurs"}) filters = [ @@ -25,7 +25,7 @@ filters = [ } ] -let arcane = await ItemDialog.createFromFilters(filters, 12, "Choisissez 12 Sorts de Magie d'Arcane") +let arcane = await ItemDialog.createFromFilters(filters, 12, {title : this.effet.name, text : "Choisissez 12 Sorts d'Arcane"}) let items = petty.map(i => i.toObject()).concat(arcane.map(i => { let spell = i.toObject(); diff --git a/scripts/YMaxpXnml01bLGpO.js b/scripts/YMaxpXnml01bLGpO.js deleted file mode 100644 index e1e5841..0000000 --- a/scripts/YMaxpXnml01bLGpO.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name.includes(game.i18n.localize("NAME.Stealth")) \ No newline at end of file diff --git a/scripts/YN8719gme9AxYtyY.js b/scripts/YN8719gme9AxYtyY.js index 7d33c2c..d082f85 100644 --- a/scripts/YN8719gme9AxYtyY.js +++ b/scripts/YN8719gme9AxYtyY.js @@ -10,13 +10,13 @@ let characteristics = { "wp" : 30, "fel" : 10 } -let skills = ["Focalisation", "Calme", "Esquive", "Divertissement (Narration)", "Intuition", "Langue (Magick)", "Commandement" , "Savoir (Magie)" , "Savoir (Théologie)", "Perception"] +let skills = ["Focalisation", "Calme", "Esquive", "Divertissement (Narration)", "Intuition", "Langue (Magick)", "Commandement", "Savoir (Magie)", "Savoir (Théologie)", "Perception"] let skillAdvancements = [20, 25, 20, 25, 30, 25, 15, 20, 10, 30] -let talents = ["Harmonisation Aethyrique", "Diction Instinctive", "Diction Instinctive", "Chance", "Sens de la Magie", "Menaçant", "Magie des Arcanes", "Magie Mineure", "Seconde Vue", "Sixième Sens"] +let talents = ["Harmonisation Aethyrique", "Diction Instinctive", "Diction Instinctive", "Chanceux", "Perception de la magie", "Menaçant", "Magie des Arcanes (Domaine)", "Magie Mineure", "Seconde Vue", "Sixième Sens"] let trappings = ["Arme simple", "Robes", "(2M) Bâton de combat"] let specialItems = [ - {name: "Objet magique", type: "trapping", trappingType: "misc" }, + {name: "Magic Item", type: "trapping", trappingType: "misc" }, ] let items = []; @@ -30,9 +30,9 @@ for (let ch in characteristics) for (let item of specialItems) { let newItem if (item.type == "weapon") { - newItem = new ItemWfrp4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) + newItem = new ItemWFRP4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) } else if (item.type == "trapping") { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) } else { newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) } @@ -64,7 +64,7 @@ for (let talent of talents) } else { - ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) + ui.notifications.warn(`Could not find ${talent}`, {permanent : true}) } } @@ -81,22 +81,22 @@ for (let trapping of trappings) } else { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } -let ride = await Dialog.confirm({title : "Skill", content : "Add Chaos Steed and +20 Ride (Horse)?"}) +let ride = await foundry.applications.api.DialogV2.confirm({window : {title : "Compétence"}, content : "Add Chaos Steed and +20 Ride (Horse)?"}) if (ride) { - let skill = await game.wfrp4e.utility.findSkill("Ride (Horse)") + let skill = await game.wfrp4e.utility.findSkill("Chevaucher (Cheval)") skill = skill.toObject(); skill.system.advances.value = 20; items = items.concat({name : "Chaos Steed", type: "trapping", "system.trappingType.value" : "misc"}, skill) } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); diff --git a/scripts/YQ2LnLxp0xgy3meI.js b/scripts/YQ2LnLxp0xgy3meI.js index 64fbd33..0da9eb6 100644 --- a/scripts/YQ2LnLxp0xgy3meI.js +++ b/scripts/YQ2LnLxp0xgy3meI.js @@ -1,3 +1,3 @@ if (args.test.preData.options?.corruption && args.test.failed) { - args.test?.result?.other.push("Reçoit 1 Point de Corruption de " + this.effect.name) + args.test?.result?.other.push("Gain de +1 Corruption supplémentaire de " + this.effect.name) } \ No newline at end of file diff --git a/scripts/YRUTliBzAQvncGNX.js b/scripts/YRUTliBzAQvncGNX.js index 3018f09..25731b3 100644 --- a/scripts/YRUTliBzAQvncGNX.js +++ b/scripts/YRUTliBzAQvncGNX.js @@ -1,2 +1,2 @@ this.actor.addCondition("fatigued"); -this.script.scriptNotification("Ajout de Fatigué") \ No newline at end of file +this.script.notification("Etat Exténué ajouté") \ No newline at end of file diff --git a/scripts/YaKnYEbmmZZtByJc.js b/scripts/YaKnYEbmmZZtByJc.js index fd78e57..65dd7e3 100644 --- a/scripts/YaKnYEbmmZZtByJc.js +++ b/scripts/YaKnYEbmmZZtByJc.js @@ -1,5 +1,5 @@ if (args.opposedTest.attackerTest.options.ballockKnife) { args.weaponProperties.impale = true; - args.extraMessages.push(`${this.item.name}: Ajout de Empalement`) + args.extraMessages.push(`${this.item.name}: Impale Added`) } \ No newline at end of file diff --git a/scripts/YdiQFkm8j48Xs7gI.js b/scripts/YdiQFkm8j48Xs7gI.js new file mode 100644 index 0000000..d94a809 --- /dev/null +++ b/scripts/YdiQFkm8j48Xs7gI.js @@ -0,0 +1,5 @@ +if (args.totalWoundLoss > 0 && args.opposedTest.attackerTest.result.critical && args.opposedTest.result.hitloc.value == "head") { + let brainRot = await fromUuid("Compendium.wfrp4e-lustria.items.Item.IsNQH867Y58pZgq6"); + args.test.targets[0].createEmbeddedDocuments("Item", [brainRot], {fromEffect : this.effect.id}); + this.script.scriptMessage(`${args.test.targets[0].name} has been infected by Brain Rot`); +} \ No newline at end of file diff --git a/scripts/YfRPSgJjvHvl50HW.js b/scripts/YfRPSgJjvHvl50HW.js new file mode 100644 index 0000000..b80321b --- /dev/null +++ b/scripts/YfRPSgJjvHvl50HW.js @@ -0,0 +1 @@ +return args.skill?.name != "Runesmithing" \ No newline at end of file diff --git a/scripts/YhhiWEQbox3WZA3Q.js b/scripts/YhhiWEQbox3WZA3Q.js deleted file mode 100644 index 4b25255..0000000 --- a/scripts/YhhiWEQbox3WZA3Q.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Heal") && game.combat?.active \ No newline at end of file diff --git a/scripts/YjJcRdytVRm88qLn.js b/scripts/YjJcRdytVRm88qLn.js index e34b448..689e108 100644 --- a/scripts/YjJcRdytVRm88qLn.js +++ b/scripts/YjJcRdytVRm88qLn.js @@ -1 +1 @@ -args.options.additionalDamage = 1 \ No newline at end of file +args.context.additionalDamage = 1 \ No newline at end of file diff --git a/scripts/YrXhk2YJaWSChMhp.js b/scripts/YrXhk2YJaWSChMhp.js new file mode 100644 index 0000000..7e6b20c --- /dev/null +++ b/scripts/YrXhk2YJaWSChMhp.js @@ -0,0 +1,24 @@ +// Brawling management +let base = this.actor.characteristics.ws.value; +let melee = this.actor.has("Corps à corps (Bagarre)", "skill"); +if (!melee) { + melee = await fromUuid("Compendium.wfrp4e-core.items.Item.jLyoyqwmBVPjRjhM"); + melee = melee.toObject(); + melee.system.modifier.value = 55 - base; + await this.actor.createEmbeddedDocuments("Item", [melee], {fromEffect : this.effect.id}); +} else { + //this.actor.updateEmbeddedDocuments("Item", { _id: melee.id, 'system.modifier.value': 55-base}); + await this.effect.update({"flags.wfrp4e.fistsOfGork" : 55 - base}) +} + +// Weapon management +base = this.actor.characteristics.s.bonus; +weapon = await fromUuid("Compendium.wfrp4e-core.items.Item.AtpAudHA4ybXVlWM"); +weapon = weapon.toObject(); +weapon.name = "Fists of Gork"; +weapon.img = this.effect.img; +weapon.system.rollable.skill = "Corps à corps (Bagarre)"; +weapon.system.specification.value = 9 - base; +await this.actor.createEmbeddedDocuments("Item", [weapon], {fromEffect : this.effect.id}); + +//this.script.scriptMessage(`${this.actor.name} now has Melee (Brawling) 55 and Weapon (Fists) +9`); \ No newline at end of file diff --git a/scripts/YsUdMhQ2AArcJIqy.js b/scripts/YsUdMhQ2AArcJIqy.js new file mode 100644 index 0000000..2ff83c5 --- /dev/null +++ b/scripts/YsUdMhQ2AArcJIqy.js @@ -0,0 +1,57 @@ +let choice1 = [ + { + type: "trait", + name: "Corruption (Mineure)", + diff : { + system : { + specification : { + value : "Minor" + } + } + } + }, + { + type: "trait", + name: "Infecté", + }, + { + type: "trait", + name: "Territorial", + } +] + +let updateObj; +let actor; + +async function addTrait(c) { + let items = []; + let existing; + if (c.type == "trait") { + existing = updateObj.items.find(i => i.name == c.name && i.type == c.type); + } + if (!existing) { + let item = await game.wfrp4e.utility.find(c.name, c.type); + if (item) { + item = item.toObject(); + foundry.utils.mergeObject(item, c.diff); + items.push(item); + } + else + ui.notifications.warn(`Impossible de trouver ${c}`, { permanent: true }); + } + actor.createEmbeddedDocuments("Item", items); +} + +async function dialogChoice() { + for (let c of choice1) + { + if (await foundry.applications.api.DialogV2.confirm({window : {title: "Option"}, content:`

    Add Option?

    1. ${c.name}
    `})) + { + addTrait(c) + c.valid = true; + } + } +} +updateObj = this.actor.toObject(); +actor = this.actor +await dialogChoice(); diff --git a/scripts/YwLEw4BiKq4EMy57.js b/scripts/YwLEw4BiKq4EMy57.js index b354f07..e52e2de 100644 --- a/scripts/YwLEw4BiKq4EMy57.js +++ b/scripts/YwLEw4BiKq4EMy57.js @@ -5,10 +5,10 @@ if (args.actor.characteristics.fel.value <= 0) fel_gain += (await new Roll("2d10").roll()).total } -let msg = `${this.actor.prototypeToken.name} gagne ${i_gain} en Intelligence` +let msg = `${this.actor.prototypeToken.name} gains ${i_gain} Intelligence` if (fel_gain) - msg += ` et ${fel_gain} en Sociabilité` + msg += ` and ${fel_gain} Fellowship` let newInt = i_gain + args.actor.characteristics.int.modifier @@ -16,4 +16,4 @@ let newFel = fel_gain + args.actor.characteristics.fel.modifier args.actor.update({"system.characteristics.int.modifier" : newInt, "system.characteristics.fel.modifier" : newFel}) -this.script.scriptMessage(msg) \ No newline at end of file +this.script.message(msg) \ No newline at end of file diff --git a/scripts/YySjPfSAPdMAfjsh.js b/scripts/YySjPfSAPdMAfjsh.js index d23d05f..1876340 100644 --- a/scripts/YySjPfSAPdMAfjsh.js +++ b/scripts/YySjPfSAPdMAfjsh.js @@ -1,4 +1,4 @@ -let talents = ["Charge Berserk", "Vigilance", "Combat Instinctif", "Assaut féroce", "Endurci", "Résistance à la Magie", "Résistant (Magie)", "Déterminé", "Coup puissant", "Guerrier né"]; +let talents = ["Charge Berserk", "Vigilance", "Combat Instinctif", "Assaut féroce", "Endurci", "Résistance à la Magie", "Resistance (Magic)", "Déterminé", "Coup puissant", "Guerrier né"]; let currentCareer = this.actor.system.currentCareer; if (!currentCareer) return; diff --git a/scripts/Z52yZDm6lP6fOP3O.js b/scripts/Z52yZDm6lP6fOP3O.js index ecede41..173f999 100644 --- a/scripts/Z52yZDm6lP6fOP3O.js +++ b/scripts/Z52yZDm6lP6fOP3O.js @@ -1,6 +1,6 @@ let ablaze = this.actor.hasCondition("ablaze") if (ablaze) { - this.script.scriptNotification("Immunisé à En Flammes"); + this.script.notification("Immunisé au feu"); ablaze.delete() } \ No newline at end of file diff --git a/scripts/Z6OmmC0irJzxSnMH.js b/scripts/Z6OmmC0irJzxSnMH.js deleted file mode 100644 index a2c9377..0000000 --- a/scripts/Z6OmmC0irJzxSnMH.js +++ /dev/null @@ -1,59 +0,0 @@ -let chatData = { whisper: ChatMessage.getWhisperRecipients("GM") } -let message = "" - -let wounds = foundry.utils.duplicate(this.actor.status.wounds) -let regenRoll = await new Roll("1d10").roll(); -let regen = regenRoll.total; - -if (wounds.value >= wounds.max) - return - -if (wounds.value > 0) -{ - wounds.value += regen - if (wounds.value > wounds.max) - { - wounds.value = wounds.max - } - message += `${this.actor.name} guérit de ${regen} Points de Blessure.` - - if (regen == 10) - { - message += `
    De plus, il guérit d'une Blessure Critique.` - } -} -else if (regen >= 8) -{ - message += `${this.actor.name} a obtenu un ${regen} et guérit 1 Point de Blessure.` - wounds.value += 1 - if (regen == 10) - { - message += `
    De plus, il guérit d'une Blessure Critique.` - } -} -else -{ - message += `${this.actor.name} Regenerate roll of ${regen} - No effect.` -} - -await this.actor.update({ "system.status.wounds": wounds }) -this.script.scriptMessage(message, { whisper: ChatMessage.getWhisperRecipients("GM") }) - -if (this.actor.Species?.toLowerCase() != "ogre") -{ - this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : " - " + this.effect.name, fields : {difficulty : "average"}}).then(test => { - test.roll() - }) -} - - - - - - - - - - - - diff --git a/scripts/Z6jNlyZMECkW4Hon.js b/scripts/Z6jNlyZMECkW4Hon.js index f219d42..44fbd62 100644 --- a/scripts/Z6jNlyZMECkW4Hon.js +++ b/scripts/Z6jNlyZMECkW4Hon.js @@ -1,12 +1,12 @@ -let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts", true); +let spells = await warhammer.utility.findAllItems("spell", "Loading Spells", true); let choice = await ItemDialog.create(spells, 1); if (choice[0]) { - this.script.scriptMessage(`Choisir @UUID[${choice[0].uuid}]{${choice[0].name}}`) + this.script.message(`Chose @UUID[${choice[0].uuid}]{${choice[0].name}}`) let spell = (await fromUuid(choice[0].uuid)).toObject(); // Might be an index so retrieve item object for sure - setProperty(spell, "flags.wfrp4e.boonOfTzeentch", true); + foundry.utils.setProperty(spell, "flags.wfrp4e.boonOfTzeentch", true); spell.system.wind.value = "Focalisation (Dhar)"; spell.system.memorized.value = true; this.actor.createEmbeddedDocuments("Item", [spell], {fromEffect: this.effect.id}) diff --git a/scripts/ZCBcwbVFHFTFRntb.js b/scripts/ZCBcwbVFHFTFRntb.js index 6ca9c96..f0f1923 100644 --- a/scripts/ZCBcwbVFHFTFRntb.js +++ b/scripts/ZCBcwbVFHFTFRntb.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpentry)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Trade (Carpentry)'; const difficulty = 'easy'; const target = 10; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/ZCkYe5XMVY1RWMXG.js b/scripts/ZCkYe5XMVY1RWMXG.js index 34cd3e9..8cf2ccb 100644 --- a/scripts/ZCkYe5XMVY1RWMXG.js +++ b/scripts/ZCkYe5XMVY1RWMXG.js @@ -1 +1 @@ -args.options.wallcrawler = true; \ No newline at end of file +args.context.wallcrawler = true; \ No newline at end of file diff --git a/scripts/ZCrfdLPOxiNDCDSg.js b/scripts/ZCrfdLPOxiNDCDSg.js index dfcbf82..962ecfb 100644 --- a/scripts/ZCrfdLPOxiNDCDSg.js +++ b/scripts/ZCrfdLPOxiNDCDSg.js @@ -1 +1 @@ -this.actor.effects.get(this.effect.id).delete(); // can't use this.effect because it thinks it's parent is the item, but it actually is the actor \ No newline at end of file +this.actor.effects.get(this.effect.id).delete(); // can't use this.effet because it thinks it's parent is the item, but it actually is the actor \ No newline at end of file diff --git a/scripts/ZCuOjLAeENKN1Q4L.js b/scripts/ZCuOjLAeENKN1Q4L.js index 315c53d..4667394 100644 --- a/scripts/ZCuOjLAeENKN1Q4L.js +++ b/scripts/ZCuOjLAeENKN1Q4L.js @@ -1,7 +1,7 @@ let halve; if (args.opposedTest.attackerTest.item?.type != "spell") { - halve = await Dialog.confirm({title : this.effect.name, content : "Diviser les Dégâts? (Divise les dégats de Feu)"}) + halve = await foundry.applications.api.DialogV2.confirm({window : {title : this.effect.name}, content : "Divisé les dégats par deux? (Divise les dégats de tout feu par deux)"}) } else { @@ -11,5 +11,5 @@ else if (halve) { args.totalWoundLoss /= 2; - args.modifiers.other.push({label : this.effect.name, details : "Divisé", value : "× 0.5"}) + args.modifiers.other.push({label : this.effect.name, details : "Divisé par deux", value : "× 0.5"}) } \ No newline at end of file diff --git a/scripts/ZEXhYJqqxF6QAixX.js b/scripts/ZEXhYJqqxF6QAixX.js index 9070cbc..c02d17a 100644 --- a/scripts/ZEXhYJqqxF6QAixX.js +++ b/scripts/ZEXhYJqqxF6QAixX.js @@ -1 +1 @@ -return args.options.terror || args.extendedTest?.getFlag("wfrp4e", "fear"); \ No newline at end of file +return args.context.terror || args.extendedTest?.getFlag("wfrp4e", "fear"); \ No newline at end of file diff --git a/scripts/ZLspFT2I3ZdWWr2H.js b/scripts/ZLspFT2I3ZdWWr2H.js deleted file mode 100644 index a3fa949..0000000 --- a/scripts/ZLspFT2I3ZdWWr2H.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Leadership"); \ No newline at end of file diff --git a/scripts/ZNW3ubbKIYXAyE48.js b/scripts/ZNW3ubbKIYXAyE48.js deleted file mode 100644 index 7ed4b06..0000000 --- a/scripts/ZNW3ubbKIYXAyE48.js +++ /dev/null @@ -1,29 +0,0 @@ -let wounds = this.actor.itemTypes.disease.filter(i => i.name == "Blessure Purulente" && i.system.duration.active); -let selected; -if (wounds.length == 0) -{ - return this.script.scriptNotification("Aucune Blessure Purulente!"); -} -else if (wounds.length == 1) -{ - selected = wounds[0]; -} -else if (wounds.length >= 2) -{ - selected = (await ItemDialog.create(wounds, 1))[0]; -} - -if (selected) -{ - let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty : "average"}}) - await test.roll(); - if (test.succeeded) - { - let SL = parseInt(test.result.SL); - if (SL >= 0) - { - selected.update({"system.duration.value" : selected.system.duration.value - SL}) - this.script.scriptMessage(`${selected.name} durée réduite de ${SL}!`) - } - } -} \ No newline at end of file diff --git a/scripts/ZNu4B0OdjkM9lmtu.js b/scripts/ZNu4B0OdjkM9lmtu.js index 45b796e..2177c29 100644 --- a/scripts/ZNu4B0OdjkM9lmtu.js +++ b/scripts/ZNu4B0OdjkM9lmtu.js @@ -1,4 +1,4 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.9h82z72XGo9tfgQS") let data = item.toObject(); -data.name = data.name += " (Vue)" +data.name = data.name += " (Vision)" this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/ZRoG7GiMDQWso6gN.js b/scripts/ZRoG7GiMDQWso6gN.js index 6059262..7f971fa 100644 --- a/scripts/ZRoG7GiMDQWso6gN.js +++ b/scripts/ZRoG7GiMDQWso6gN.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpentry)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Trade (Carpentry)'; const difficulty = 'difficult'; const target = 30; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/ZTE8LdRblyG4yYoE.js b/scripts/ZTE8LdRblyG4yYoE.js index 16fcab5..824baa4 100644 --- a/scripts/ZTE8LdRblyG4yYoE.js +++ b/scripts/ZTE8LdRblyG4yYoE.js @@ -1,7 +1,7 @@ if (args.test.result.castOutcome == "success") { // Wait till after chat card is posted - game.wfrp4e.utility.sleep(500).then(() => { + warhammer.utility.sleep(500).then(() => { game.wfrp4e.utility.postTerror(1, this.effect.name) game.wfrp4e.utility.postTerror(2, this.effect.name) }) diff --git a/scripts/ZURBQYTYcP5jci5k.js b/scripts/ZURBQYTYcP5jci5k.js new file mode 100644 index 0000000..d64e7ef --- /dev/null +++ b/scripts/ZURBQYTYcP5jci5k.js @@ -0,0 +1,3 @@ +const broken = this.actor.hasCondition("broken"); + +broken?.delete(); \ No newline at end of file diff --git a/scripts/ZYsMgB4BwXBJcpYf.js b/scripts/ZYsMgB4BwXBJcpYf.js index e935d19..12a4f32 100644 --- a/scripts/ZYsMgB4BwXBJcpYf.js +++ b/scripts/ZYsMgB4BwXBJcpYf.js @@ -1,3 +1,3 @@ -// The wearer of the cloak causes Fear 2 +// The wearer of the cloak causes Peur 2 // in Wolves, Lions, Goats, and Chimeras. -game.wfrp4e.utility.postFear(2, this.effect.name) +game.wfrp4e.utility.postPeur(2, this.effect.name) diff --git a/scripts/ZdHvGvSJBsIuPphF.js b/scripts/ZdHvGvSJBsIuPphF.js index b20bae0..405beda 100644 --- a/scripts/ZdHvGvSJBsIuPphF.js +++ b/scripts/ZdHvGvSJBsIuPphF.js @@ -1 +1 @@ -return !args.fields.dualWielding && !args.options.dualWieldOffhand \ No newline at end of file +return !args.data.dualWieldingOption && !args.context.dualWieldOffhand \ No newline at end of file diff --git a/scripts/Ze9E2zR1GFGWGMVH.js b/scripts/Ze9E2zR1GFGWGMVH.js deleted file mode 100644 index 1550f81..0000000 --- a/scripts/Ze9E2zR1GFGWGMVH.js +++ /dev/null @@ -1 +0,0 @@ -return ["Crochetage", "Escamotage", "Focalisation (Ulgu)"].includes(args.skill?.name) \ No newline at end of file diff --git a/scripts/ZfgPAtNKA5KrETer.js b/scripts/ZfgPAtNKA5KrETer.js new file mode 100644 index 0000000..57c45c9 --- /dev/null +++ b/scripts/ZfgPAtNKA5KrETer.js @@ -0,0 +1 @@ +return args.type == "cast"; \ No newline at end of file diff --git a/scripts/ZgF1sYdbAKaOuHmK.js b/scripts/ZgF1sYdbAKaOuHmK.js deleted file mode 100644 index 7e12f9d..0000000 --- a/scripts/ZgF1sYdbAKaOuHmK.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Charm"); \ No newline at end of file diff --git a/scripts/ZingXNvYyZ2BEvfY.js b/scripts/ZingXNvYyZ2BEvfY.js deleted file mode 100644 index d6255b9..0000000 --- a/scripts/ZingXNvYyZ2BEvfY.js +++ /dev/null @@ -1,85 +0,0 @@ -let characteristics = { - "ws" : 10, - "bs" : 0, - "s" : 5, - "t" : 5, - "i" : 10, - "ag" : 0, - "dex" : 0, - "int" : 0, - "wp" : 0, - "fel" : 0 -} -let skills = ["Calme", "Equive", "Langue (Bataile)"] -let skillAdvancements = [10, 10, 10] - -let talents = ["Combat Instinctif", "Déterminé"] -let trappings = ["Plastron d'acier", "Brassards", "Heaume", "Jambières d'acier"] - -let items = []; - -let updateObj = this.actor.toObject(); - -for (let ch in characteristics) -{ - updateObj.system.characteristics[ch].modifier += characteristics[ch]; -} - -for (let index = 0; index < skills.length; index++) -{ - let skill = skills[index] - let skillItem; - skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") - if (skillItem) - skillItem.system.advances.value += skillAdvancements[index] - else - { - skillItem = await game.wfrp4e.utility.findSkill(skill) - skillItem = skillItem.toObject(); - skillItem.system.advances.value = skillAdvancements[index]; - items.push(skillItem); - } -} - -for (let talent of talents) -{ - let talentItem = await game.wfrp4e.utility.findTalent(talent) - if (talentItem) - { - items.push(talentItem.toObject()); - } - else - { - ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) - } -} - -for (let trapping of trappings) -{ - let trappingItem = await game.wfrp4e.utility.findItem(trapping) - if (trappingItem) - { - trappingItem = trappingItem.toObject() - - trappingItem.system.equipped.value = true; - - items.push(trappingItem); - } - else - { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) - } -} - -let weapons = await warhammer.utility.findAllItems("weapon", "Chargement des armes"); - -items = items.concat((await game.wfrp4e.apps.ItemDialog.create([await fromUuid("Compendium.wfrp4e-core.items.Item.1zaqojk0Oq1m8vYv"), await fromUuid("Compendium.wfrp4e-core.items.Item.bBX8MP6QfcyU6Fy3")], 1, "Choisissez a Weapon")) || []) - -let choices = weapons.filter(i => i.system.properties.qualities.shield || i.system.weaponGroup.value == "polearm" || i.system.weaponGroup.value == "twohanded"); - -items = items.concat(await game.wfrp4e.apps.ItemDialog.create(choices, 1, "Choisissez un bouclier ou une Arme d'Hast ou une Arme à deux-mains")); - -updateObj.name = updateObj.name += " " + this.effect.name - -await this.actor.update(updateObj) -this.actor.createEmbeddedDocuments("Item", items); diff --git a/scripts/Znz4g56UH23SSCg7.js b/scripts/Znz4g56UH23SSCg7.js new file mode 100644 index 0000000..6d35ba2 --- /dev/null +++ b/scripts/Znz4g56UH23SSCg7.js @@ -0,0 +1,7 @@ +if (!args.messageSent) +{ + args.messageSent = true; + let advantage = this.item.effects.filter(i => i.name == this.effect.name).length; + this.actor.setAdvantage(advantage) + this.script.message(`Allies within 6 yards gain ${advantage} Advantage`) +} \ No newline at end of file diff --git a/scripts/ZqTW093qENOwGONP.js b/scripts/ZqTW093qENOwGONP.js index 9757bed..3a9575e 100644 --- a/scripts/ZqTW093qENOwGONP.js +++ b/scripts/ZqTW093qENOwGONP.js @@ -7,4 +7,4 @@ for(let i = 0; i < SL; i++) msg += `

    ${await this.actor.applyBasicDamage(3, {suppressMsg : true, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP})}

    ` } -this.script.scriptMessage(msg); \ No newline at end of file +this.script.message(msg); \ No newline at end of file diff --git a/scripts/ZvbBM4gTJHPdU8jU.js b/scripts/ZvbBM4gTJHPdU8jU.js deleted file mode 100644 index b8ce00a..0000000 --- a/scripts/ZvbBM4gTJHPdU8jU.js +++ /dev/null @@ -1,3 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "hard"}}) -await test.roll(); -return test.failed \ No newline at end of file diff --git a/scripts/a02tlRCXpaoaDjSN.js b/scripts/a02tlRCXpaoaDjSN.js index 07a1b7d..61815b5 100644 --- a/scripts/a02tlRCXpaoaDjSN.js +++ b/scripts/a02tlRCXpaoaDjSN.js @@ -1,16 +1,16 @@ -let careers = await warhammer.utility.findAllItems("career", "", true); +let careers = await warhammer.utility.findAllItems("career", "Loading Careers", true); careers.forEach(c => { if (!c.id) { c.id = c._id; } }); -let choice = await ItemDialog.create(careers, 1, "Choisissez la carrière de votre double identité"); +let choice = await ItemDialog.create(careers, 1, {text : "Choisissez une Carrière de Double Vie", title : this.effect.name, indexed : true}); if (choice[0]) { - let career = await fromUuid(choice[0].uuid); + let career = choice[0]; let data = career.toObject(); - setProperty(data, "flags.wfrp4e.doubleLife", true); + foundry.utils.setProperty(data, "flags.wfrp4e.doubleLife", true); this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) - this.effect.updateSource({name : this.effect.name + ` (${data.name})`}) + this.effect.updateSource({name : this.effect.setSpecifier(data.name)}) } diff --git a/scripts/a0YU3whUm16wGBNu.js b/scripts/a0YU3whUm16wGBNu.js deleted file mode 100644 index ed24c51..0000000 --- a/scripts/a0YU3whUm16wGBNu.js +++ /dev/null @@ -1,7 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "average"}}) -await test.roll(); - -if (test.failed) -{ - this.actor.addCondition("fatigued"); -} \ No newline at end of file diff --git a/scripts/a4Aza4a9v8JMU8dC.js b/scripts/a4Aza4a9v8JMU8dC.js deleted file mode 100644 index 845cf2e..0000000 --- a/scripts/a4Aza4a9v8JMU8dC.js +++ /dev/null @@ -1,2 +0,0 @@ -const talents = await Promise.all(["Frénésie", "Résistance à la Magie"].map(game.wfrp4e.utility.findTalent)) -this.actor.createEmbeddedDocuments("Item", talents, {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/a6gacHsvgwtsIFSQ.js b/scripts/a6gacHsvgwtsIFSQ.js deleted file mode 100644 index 735565f..0000000 --- a/scripts/a6gacHsvgwtsIFSQ.js +++ /dev/null @@ -1,2 +0,0 @@ -if (args.test.item && args.test.item.name == game.i18n.localize("NAME.Research")) - args.test.preData.canReverse = true \ No newline at end of file diff --git a/scripts/a7pEvCycVnFBXGAQ.js b/scripts/a7pEvCycVnFBXGAQ.js index 4249b18..41350b7 100644 --- a/scripts/a7pEvCycVnFBXGAQ.js +++ b/scripts/a7pEvCycVnFBXGAQ.js @@ -1,7 +1,7 @@ -let test = await this.actor.setupCharacteristic("i", {skipTargets: true, appendTitle : " - Assomé", fields : {difficulty : "easy"}}) -await test.roll(); +let test = await this.actor.setupCharacteristic("i", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, fields : {difficulty : "easy"}}) +await Test.roll(); -if (!test.succeeded) +if (!Test.succeeded) { this.actor.addCondition("stunned"); } \ No newline at end of file diff --git a/scripts/a81IMxqmMtHgYnIF.js b/scripts/a81IMxqmMtHgYnIF.js new file mode 100644 index 0000000..ba29b23 --- /dev/null +++ b/scripts/a81IMxqmMtHgYnIF.js @@ -0,0 +1 @@ +return !args.weapon?.system.isMelee; \ No newline at end of file diff --git a/scripts/a8i0sA1RBnD8nHZt.js b/scripts/a8i0sA1RBnD8nHZt.js index d8ce792..cd5e4de 100644 --- a/scripts/a8i0sA1RBnD8nHZt.js +++ b/scripts/a8i0sA1RBnD8nHZt.js @@ -1,35 +1,42 @@ let caster = this.effect.sourceActor -let targetedItem = this.actor.items.get(this.effect.flags.wfrp4e.itemTargets[0]) +let targetedItem = this.effect.system.itemTargets[0]; let qualities = foundry.utils.deepClone(game.wfrp4e.config.itemQualities); let flaws = foundry.utils.deepClone(game.wfrp4e.config.itemFlaws); -if (targetedItem.type == "weapon") { - foundry.utils.mergeObject(qualities, game.wfrp4e.config.weaponQualities) - foundry.utils.mergeObject(flaws, game.wfrp4e.config.weaponFlaws) +if (targetedItem.type == "weapon") +{ + foundry.utils.mergeObject(qualities, game.wfrp4e.config.weaponQualities) + foundry.utils.mergeObject(flaws, game.wfrp4e.config.weaponFlaws) } -else if (targetedItem.type == "armour") { - foundry.utils.mergeObject(qualities, game.wfrp4e.config.armorQualities) - foundry.utils.mergeObject(flaws, game.wfrp4e.config.armorFlaws) +else if (targetedItem.type == "armour") +{ + foundry.utils.mergeObject(qualities, game.wfrp4e.config.armorQualities) + foundry.utils.mergeObject(flaws, game.wfrp4e.config.armorFlaws) } -for (let q in qualities) { - // If the weapon already has a flaw, don't put it in the dialog - if (targetedItem.system.properties.qualities[q]) { - delete qualities[q] - } +for(let q in qualities) +{ + // If the weapon already has a flaw, don't put it in the dialog + if (targetedItem.system.properties.qualities[q]) + { + delete qualities[q] + } } -for (let f in flaws) { - // If a weapon doesn't have a flaw, don't put it in the dialog - if (!targetedItem.system.properties.flaws[f]) { - delete flaws[f] - } +for(let f in flaws) +{ + // If a weapon doesn't have a flaw, don't put it in the dialog + if (!targetedItem.system.properties.flaws[f]) + { + delete flaws[f] + } } -let added = await ItemDialog.create(ItemDialog.objectToArray(qualities), "unlimited", "Choisissez la Qualité à ajouter"); +let added = await ItemDialog.create(ItemDialog.objectToArray(qualities), "unlimited", "Choisir les Qualités à ajouter"); let removed = [] -if (!foundry.utils.isEmpty(flaws)) { - removed = await ItemDialog.create(ItemDialog.objectToArray(flaws), "unlimited", "Choisissez le Défaut à enlever"); +if (!foundry.utils.isEmpty(flaws)) +{ + removed = await ItemDialog.create(ItemDialog.objectToArray(flaws), "unlimited", "Choisir les Défauts à retirer"); } -this.effect.updateSource({ "flags.wfrp4e.propertiesChanged": { added: added.map(i => i.id), removed: removed.map(i => i.id) } }) +this.effect.updateSource({"flags.wfrp4e.propertiesChanged" : {added : added.map(i => i.id), removed : removed.map(i => i.id)}}) diff --git a/scripts/aAvJrAKLzXhS9qN6.js b/scripts/aAvJrAKLzXhS9qN6.js deleted file mode 100644 index 645c806..0000000 --- a/scripts/aAvJrAKLzXhS9qN6.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name == game.i18n.localize("NAME.Climb") \ No newline at end of file diff --git a/scripts/aCVtaW8ag1WibcAr.js b/scripts/aCVtaW8ag1WibcAr.js index 909f231..fddad7f 100644 --- a/scripts/aCVtaW8ag1WibcAr.js +++ b/scripts/aCVtaW8ag1WibcAr.js @@ -1,2 +1,2 @@ args.attacker.modifyWounds(1) -this.script.scriptMessage(`${args.attacker.prototypeToken.name} récupère 1 Blessure.`) \ No newline at end of file +this.script.message(`${args.attacker.prototypeToken.name} recovers 1 Wound.`) \ No newline at end of file diff --git a/scripts/aFwNs7TMVF90i9JF.js b/scripts/aFwNs7TMVF90i9JF.js new file mode 100644 index 0000000..7ab3cd6 --- /dev/null +++ b/scripts/aFwNs7TMVF90i9JF.js @@ -0,0 +1,6 @@ +let tireless = this.item.Advances + 1 +let fatigued = this.actor.hasCondition("fatigued").conditionValue +if (args.flags?.tireless == undefined) { + args.fields.modifier += 10 * (Math.min(tireless, fatigued)); + args.flags.tireless = true +} \ No newline at end of file diff --git a/scripts/aIYUsBIDKWJ3CEtj.js b/scripts/aIYUsBIDKWJ3CEtj.js index 9779863..e94669e 100644 --- a/scripts/aIYUsBIDKWJ3CEtj.js +++ b/scripts/aIYUsBIDKWJ3CEtj.js @@ -1 +1 @@ -this.script.scriptMessage(await this.actor.applyBasicDamage(20, {suppressMsg: true})); \ No newline at end of file +this.script.message(await this.actor.applyBasicDamage(20, {suppressMsg: true})); \ No newline at end of file diff --git a/scripts/aPZiVhgwR0Xql6AM.js b/scripts/aPZiVhgwR0Xql6AM.js new file mode 100644 index 0000000..2932749 --- /dev/null +++ b/scripts/aPZiVhgwR0Xql6AM.js @@ -0,0 +1,7 @@ +let effectsToEnable = this.actor.items.filter(i => i.type == "disease").reduce((effects, item) => effects.concat(item.effects.contents), []).concat(this.actor.effects.contents.filter(i => i.isCondition)).filter(i => i.disabled); + +if (effectsToEnable.length) +{ + this.script.notification(`Re-enabling ${effectsToEnable.map(i => i.name).join(", ")}.`); + effectsToEnable.forEach(i => i.update({disabled : false})) +} \ No newline at end of file diff --git a/scripts/aRvJUcgYqhRmmWYC.js b/scripts/aRvJUcgYqhRmmWYC.js new file mode 100644 index 0000000..261e4ab --- /dev/null +++ b/scripts/aRvJUcgYqhRmmWYC.js @@ -0,0 +1 @@ +this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.e3McIND4Rrsn5cE6", this.effect, {"system.advances.value" : 1}, {skipExperienceChecks : true}) \ No newline at end of file diff --git a/scripts/abLWYtNTu1UVDQAs.js b/scripts/abLWYtNTu1UVDQAs.js index 68c5009..551994a 100644 --- a/scripts/abLWYtNTu1UVDQAs.js +++ b/scripts/abLWYtNTu1UVDQAs.js @@ -1,5 +1,5 @@ if (args.opposedTest.result.hitloc.value == this.effect.flags.wfrp4e.location) // e.g. 'head', rLeg, 'lArm' { - this.scriptMessage(`Reçoit l'état @Condition[Aveuglé] comme ${this.item.name} a été touché`); + this.message(`Gains a @Condition[Blinded] condition as their ${this.item.name} was hit`); this.actor.addCondition("blinded"); } \ No newline at end of file diff --git a/scripts/aeBetniKqq5SD9Ou.js b/scripts/aeBetniKqq5SD9Ou.js index 5a42f23..cda2bf2 100644 --- a/scripts/aeBetniKqq5SD9Ou.js +++ b/scripts/aeBetniKqq5SD9Ou.js @@ -10,12 +10,12 @@ let characteristics = { "wp" : 40, "fel" : 30 } -let skills = ["Intimidate", "Langue (Classical)", "Commandement" , "Lore (Warfare)", "Lore (History)", "Perception"] +let skills = ["Intimidation", "Langue (Classique)", "Commandement", "Savoir (Guerre)", "Savoir (Histoire)", "Perception"] let skillAdvancements = [20, 30, 20, 30, 20, 20] -let talents = ["Combat Aware", "Combat Reflexes", "Drilled", "Menaçant", "Robust", "Strike Mighty Blow", "Strike Mighty Blow", "War Leader"] -let trappings = ["Arme simple", "Plate Breastplate", "Plate Helm", "Plate Leggings"] -let specialItems = [ -] +let talents = ["Vigilance", "Combat Instinctif", "Coude-à-coude", "Menaçant", "Robuste", "Coup puissant", "Coup puissant", "Seigneur de guerre"] +let trappings = ["Arme simple", "Plastron d'acier", "Heaume", "Jambières d'acier"] +let specialItems = [ +] let items = []; let updateObj = this.actor.toObject(); @@ -28,11 +28,11 @@ for (let ch in characteristics) for (let item of specialItems) { let newItem if (item.type == "weapon") { - newItem = new ItemWfrp4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) + newItem = new ItemWFRP4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) } else if (item.type == "trapping") { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) } else { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) } items.push(newItem.toObject()) } @@ -44,7 +44,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -60,13 +60,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { - ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) + ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -77,13 +77,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) console.log(">>>>>>><", items) diff --git a/scripts/aedzdFyjI80Ah3qC.js b/scripts/aedzdFyjI80Ah3qC.js new file mode 100644 index 0000000..f3c731b --- /dev/null +++ b/scripts/aedzdFyjI80Ah3qC.js @@ -0,0 +1,3 @@ +return !this.item.equipped.value + || !args?.weapon + || !(["giant"].includes(args.target.Species.toLowerCase())) \ No newline at end of file diff --git a/scripts/afdmOvPGMpEdZvCb.js b/scripts/afdmOvPGMpEdZvCb.js deleted file mode 100644 index 20d9df6..0000000 --- a/scripts/afdmOvPGMpEdZvCb.js +++ /dev/null @@ -1 +0,0 @@ -return (args.skill?.name == game.i18n.localize("NAME.Perception") || args.characteristic == "fel") \ No newline at end of file diff --git a/scripts/b2Kb4IuD22RhKhR0.js b/scripts/b2Kb4IuD22RhKhR0.js index cd7e0ff..45a66d2 100644 --- a/scripts/b2Kb4IuD22RhKhR0.js +++ b/scripts/b2Kb4IuD22RhKhR0.js @@ -6,5 +6,5 @@ if (actor) } else { - this.script.scriptNotification("Aucune cible!", "error") + this.script.notification("Aucune cible!", "error") } \ No newline at end of file diff --git a/scripts/b2WaqRna5CFXmbDG.js b/scripts/b2WaqRna5CFXmbDG.js index 8f874fd..68f399a 100644 --- a/scripts/b2WaqRna5CFXmbDG.js +++ b/scripts/b2WaqRna5CFXmbDG.js @@ -1 +1 @@ -args.options.stag = true; \ No newline at end of file +args.context.stag = true; \ No newline at end of file diff --git a/scripts/b4CIeJF2L4E1qikC.js b/scripts/b4CIeJF2L4E1qikC.js new file mode 100644 index 0000000..5a16aaf --- /dev/null +++ b/scripts/b4CIeJF2L4E1qikC.js @@ -0,0 +1 @@ +return !args.skill \ No newline at end of file diff --git a/scripts/b5DfAWtpV1x2R8If.js b/scripts/b5DfAWtpV1x2R8If.js index c9f120e..2a4f9a5 100644 --- a/scripts/b5DfAWtpV1x2R8If.js +++ b/scripts/b5DfAWtpV1x2R8If.js @@ -1 +1 @@ -this.script.scriptMessage(await this.actor.applyBasicDamage(this.effect.sourceTest.result.damage, {suppressMsg: true})) \ No newline at end of file +this.script.message(await this.actor.applyBasicDamage(this.effect.sourceTest.result.damage, {suppressMsg: true})) \ No newline at end of file diff --git a/scripts/b5prg1FLjCAvBjLy.js b/scripts/b5prg1FLjCAvBjLy.js deleted file mode 100644 index 705112f..0000000 --- a/scripts/b5prg1FLjCAvBjLy.js +++ /dev/null @@ -1,13 +0,0 @@ -let item = await fromUuid("Compendium.wfrp4e-core.items.zyocWSzEZEC826NS") -let data = item.toObject(); -data.system.location.key = this.item.system.location.key -this.actor.createEmbeddedDocuments("Item", [data]) - - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty: "hard"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - await this.actor.addCondition("prone") - await this.actor.addCondition("stunned") -} \ No newline at end of file diff --git a/scripts/b787rIfyHF5LnALd.js b/scripts/b787rIfyHF5LnALd.js new file mode 100644 index 0000000..1bd597a --- /dev/null +++ b/scripts/b787rIfyHF5LnALd.js @@ -0,0 +1,7 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.HbrwGhUl0ZXz4kLA") +let hardy = item.toObject(); + +item = await fromUuid("Compendium.wfrp4e-core.items.Item.VUJUZVN3VYhOaPjj") +let armour = item.toObject(); +armour.system.specification.value = 1; +this.actor.createEmbeddedDocuments("Item", [armour, hardy], {fromEffect : this.effect.id}); \ No newline at end of file diff --git a/scripts/b8XFmEUu1d2YNQ7F.js b/scripts/b8XFmEUu1d2YNQ7F.js new file mode 100644 index 0000000..4240d27 --- /dev/null +++ b/scripts/b8XFmEUu1d2YNQ7F.js @@ -0,0 +1,17 @@ +const {targetUuid, characteristicsToSwap} = this.effect.flags.wfrp4e; + +if (!characteristicsToSwap) return; + +const target = fromUuidSync(targetUuid); + +if (!target) return; + +for (const char of characteristicsToSwap) { + args.actor.system.characteristics[char].advances = target.system.characteristics[char].advances; + args.actor.system.characteristics[char].bonus = target.system.characteristics[char].bonus; + args.actor.system.characteristics[char].bonusMod = target.system.characteristics[char].bonusMod; + args.actor.system.characteristics[char].calculationBonusModifier = target.system.characteristics[char].calculationBonusModifier; + args.actor.system.characteristics[char].initial = target.system.characteristics[char].initial; + args.actor.system.characteristics[char].modifier = target.system.characteristics[char].modifier; + args.actor.system.characteristics[char].value = target.system.characteristics[char].value; +} \ No newline at end of file diff --git a/scripts/bBdXzBmxgFFBwMMS.js b/scripts/bBdXzBmxgFFBwMMS.js index b0eea24..0ff3acd 100644 --- a/scripts/bBdXzBmxgFFBwMMS.js +++ b/scripts/bBdXzBmxgFFBwMMS.js @@ -1,4 +1,4 @@ -if(args.opposedTest.attackerTest.item?.isRanged && args.applyAP && !args.sureShot) +if(args.opposedTest.attackerTest.item?.isProjectiles && args.applyAP && !args.sureShot) { if (args.modifiers.ap.value) { diff --git a/scripts/bDS62ctjfnTU4xIu.js b/scripts/bDS62ctjfnTU4xIu.js new file mode 100644 index 0000000..adf3ff4 --- /dev/null +++ b/scripts/bDS62ctjfnTU4xIu.js @@ -0,0 +1 @@ +return args.skill.name !== game.i18n.localize("NAME.Leadership") \ No newline at end of file diff --git a/scripts/bEVlJOOA1kLlzpWx.js b/scripts/bEVlJOOA1kLlzpWx.js index 3cd6250..b72f0df 100644 --- a/scripts/bEVlJOOA1kLlzpWx.js +++ b/scripts/bEVlJOOA1kLlzpWx.js @@ -30,7 +30,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,14 +63,14 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { items.push({name : trapping, type : "trapping", "system.trappingType.value" : "clothingAccessories"}) - //ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + //ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); diff --git a/scripts/bLkt8VpTTPoTxW0W.js b/scripts/bLkt8VpTTPoTxW0W.js index 97a1d9c..b2cfafb 100644 --- a/scripts/bLkt8VpTTPoTxW0W.js +++ b/scripts/bLkt8VpTTPoTxW0W.js @@ -1,5 +1,5 @@ if (args.opposedTest.result.hitloc.value == "body" && args.totalWoundLoss > 0) { args.actor.addCondition("bleeding", 1); - this.script.scriptNotification("Ajout d'Hémorragie") + this.script.notification("Etat Hémorragique ajouté") } diff --git a/scripts/bMEFHPCei2evnZZw.js b/scripts/bMEFHPCei2evnZZw.js index c362d32..66ab618 100644 --- a/scripts/bMEFHPCei2evnZZw.js +++ b/scripts/bMEFHPCei2evnZZw.js @@ -1,14 +1,14 @@ // Victims that take at least 1 Wound from a Fell Dagger // immediately take a Poisoned Condition -// resisted with a Difficult (-10) Endurance Test. +// resisted with a Difficult (-10) Résistance Test. -// TODO: Add Venom strength to message +// TODO: Add Venin strength to message if (args.totalWoundLoss > 0) { args.actor.addCondition("poisoned") - this.script.scriptMessage(` + this.script.message(` ${this.effect.name}:
    - ${args.actor.name} reçoit un état @Condition[Empoisonné], qui peut être résisté avec un Test de Résistance Difficile (-10).`, + ${args.actor.name} has been given a @Condition[Poisoned] Condition, which can be resisted with a Difficult (-10) Résistance Test.`, {whisper: ChatMessage.getWhisperRecipients("GM")}) } diff --git a/scripts/bNhpJPWwoHLq68zD.js b/scripts/bNhpJPWwoHLq68zD.js new file mode 100644 index 0000000..741d046 --- /dev/null +++ b/scripts/bNhpJPWwoHLq68zD.js @@ -0,0 +1,67 @@ +let actor = await DragDialog.create({title : this.effect.name, text : "Fournissez un Acteur tatoueur (fermer pour ignorer les Tests)"}) + +if (!actor) +{ + this.script.notification("Tests ignorés pour appliquer les tatouages"); + if (await foundry.applications.api.Dialog.confirm({ + window: {title: this.effect.name}, + content : "

    Apply Ward of Grimnir effet?

    " + })) + { + return; + } + else + { + return false; + } +} + + +let failed = false; +if (this.actor.itemTags.skill.find(i => i.name == "Savoir (Théologie)")) +{ + let test = await this.actor.setupSkill("Savoir (Théologie)", {appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "vhard"}}) + await test.roll(); + if (test.failed) + { + failed = true; + } +} +else +{ + this.script.notification("Compétence Savoir (Théologie) introuvable, impossible de continuer.") + failed = true; +} + +if (this.actor.itemTags.skill.find(i => i.name == "Lore (Runes)")) + { + let test = await this.actor.setupSkill("Lore (Runes)", {appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "hard"}}) + await test.roll(); + if (test.failed) + { + failed = true; + } + } + else + { + this.script.notification("Compétence Savoir (Runes) introuvable, impossible de continuer.") + failed = true; + } + + + let test = await this.actor.setupSkill("Art (Tattooing)", {appendTitle : ` - ${this.effect.name}`}) + await test.roll(); + if (test.failed) + { + failed = true; + } + + if (failed) + { + this.script.message("Un ou plusieurs Tests pour appliquer les tatouages ont échoué.") + return false; + } + else + { + return true; + } \ No newline at end of file diff --git a/scripts/bQyVajMN1ETwlzvM.js b/scripts/bQyVajMN1ETwlzvM.js index 757c282..f6c9604 100644 --- a/scripts/bQyVajMN1ETwlzvM.js +++ b/scripts/bQyVajMN1ETwlzvM.js @@ -4,6 +4,6 @@ let target = await game.wfrp4e.tables.rollTable("fixations") if (target) { data.system.specification.value = target.result - this.script.scriptNotification(target.result); + this.script.notification(target.result); } this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/bRiFHPC1StKxqNIC.js b/scripts/bRiFHPC1StKxqNIC.js index fd2797b..172def3 100644 --- a/scripts/bRiFHPC1StKxqNIC.js +++ b/scripts/bRiFHPC1StKxqNIC.js @@ -1,5 +1,5 @@ if (isNaN(parseInt(this.item.system.specification.value))) { - let value = await ValueDialog.create({title : "Sturdy Value", text : "Enter the Sturdy value"}); + let value = await ValueDialog.create({title : "Valeur de Robustesse", text : "Entrez la valeur de Robustesse"}); if (value) { this.item.updateSource({"system.specification.value" : value}); } diff --git a/scripts/bT4gLrE3W36DIP4k.js b/scripts/bT4gLrE3W36DIP4k.js new file mode 100644 index 0000000..f3e714f --- /dev/null +++ b/scripts/bT4gLrE3W36DIP4k.js @@ -0,0 +1,6 @@ +if (args.applyAP && args.modifiers.ap.metal && args.alreadyPenetrating) + { + args.modifiers.ap.ignored += 1 + args.modifiers.ap.details.push("" + this.effect.name + ": Ignore +1 PA d'armure en métal"); + args.modifiers.ap.metal--; + } \ No newline at end of file diff --git a/scripts/bgLeMqihLya2iobP.js b/scripts/bgLeMqihLya2iobP.js new file mode 100644 index 0000000..4616523 --- /dev/null +++ b/scripts/bgLeMqihLya2iobP.js @@ -0,0 +1,6 @@ +const river = this.actor.itemTags.template.find(t => t.name === "River Troll"); + +if (!river) { + args.options.abortItemCreation = true; + this.script.notification("Peut seulement être appliqué à un Troll des Rivières.", 'warning'); +} \ No newline at end of file diff --git a/scripts/bh2qDCKiAIWM0UPi.js b/scripts/bh2qDCKiAIWM0UPi.js deleted file mode 100644 index 593bedb..0000000 --- a/scripts/bh2qDCKiAIWM0UPi.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Stealth")) \ No newline at end of file diff --git a/scripts/bhXUW7IJtEaUGAoV.js b/scripts/bhXUW7IJtEaUGAoV.js deleted file mode 100644 index 5be3c04..0000000 --- a/scripts/bhXUW7IJtEaUGAoV.js +++ /dev/null @@ -1,7 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone"); -} - \ No newline at end of file diff --git a/scripts/bidoOQSAofp4NPf6.js b/scripts/bidoOQSAofp4NPf6.js new file mode 100644 index 0000000..8213234 --- /dev/null +++ b/scripts/bidoOQSAofp4NPf6.js @@ -0,0 +1 @@ +return args?.skill?.name !== game.i18n.localize("NAME.Cool") \ No newline at end of file diff --git a/scripts/bkbWgG9COvZWZbAX.js b/scripts/bkbWgG9COvZWZbAX.js new file mode 100644 index 0000000..9529ce8 --- /dev/null +++ b/scripts/bkbWgG9COvZWZbAX.js @@ -0,0 +1 @@ +args.context.addChargingDice = true; \ No newline at end of file diff --git a/scripts/bwtQOSWn120NICkf.js b/scripts/bwtQOSWn120NICkf.js index 5b27c29..bf9448e 100644 --- a/scripts/bwtQOSWn120NICkf.js +++ b/scripts/bwtQOSWn120NICkf.js @@ -1,7 +1,7 @@ let test = await this.actor.setupCharacteristic("ag", {fields : {difficulty : "hard"}}); -await test.roll(); +await Test.roll(); -if (test.failed) +if (Test.Échoué) { await this.actor.addCondition("bleeding") await this.actor.addCondition("entangled") diff --git a/scripts/bwx9wuEOJPF7btD1.js b/scripts/bwx9wuEOJPF7btD1.js deleted file mode 100644 index fd35010..0000000 --- a/scripts/bwx9wuEOJPF7btD1.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Navigation"); \ No newline at end of file diff --git a/scripts/c3KA1knL2NYNUEww.js b/scripts/c3KA1knL2NYNUEww.js deleted file mode 100644 index b904c0c..0000000 --- a/scripts/c3KA1knL2NYNUEww.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Evaluate"); \ No newline at end of file diff --git a/scripts/c7HTWfg3CbjN9e1M.js b/scripts/c7HTWfg3CbjN9e1M.js new file mode 100644 index 0000000..80591ae --- /dev/null +++ b/scripts/c7HTWfg3CbjN9e1M.js @@ -0,0 +1 @@ +this.actor.name = this.actor.name.replace("Common Troll", "Troll"); \ No newline at end of file diff --git a/scripts/c9xxdOCaQSwooK8n.js b/scripts/c9xxdOCaQSwooK8n.js new file mode 100644 index 0000000..97adff8 --- /dev/null +++ b/scripts/c9xxdOCaQSwooK8n.js @@ -0,0 +1 @@ +if (!this.actor.has("Bénédiction de Bataille","prayer")) this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.ElmLfnrXliStS9CP", this.effect) \ No newline at end of file diff --git a/scripts/cAKqUBuJBsU85erO.js b/scripts/cAKqUBuJBsU85erO.js deleted file mode 100644 index ba403bd..0000000 --- a/scripts/cAKqUBuJBsU85erO.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Stealth"); \ No newline at end of file diff --git a/scripts/cC7jjJDSVPi5BJUq.js b/scripts/cC7jjJDSVPi5BJUq.js new file mode 100644 index 0000000..9bef2b0 --- /dev/null +++ b/scripts/cC7jjJDSVPi5BJUq.js @@ -0,0 +1,3 @@ +if (this.item.equipped.value) { + this.actor.system.status.addArmour(1, {source: this.effect}) +} \ No newline at end of file diff --git a/scripts/cJFDnq1HI4gXWcJo.js b/scripts/cJFDnq1HI4gXWcJo.js index 0accb38..e469ebf 100644 --- a/scripts/cJFDnq1HI4gXWcJo.js +++ b/scripts/cJFDnq1HI4gXWcJo.js @@ -1,6 +1,6 @@ if (isNaN(parseInt(this.item.system.specification.value))) { - let value = await ValueDialog.create({text: "Enter Ward value", title : this.effect.name}); + let value = await ValueDialog.create({text: "Entrez la valeur de Protection", title : this.effect.name}); if (value) { this.item.updateSource({"system.specification.value" : value}); diff --git a/scripts/cK1Jysfu5IMUUH0C.js b/scripts/cK1Jysfu5IMUUH0C.js index dde1591..94752c7 100644 --- a/scripts/cK1Jysfu5IMUUH0C.js +++ b/scripts/cK1Jysfu5IMUUH0C.js @@ -4,7 +4,7 @@ if (!args.ward) if (args.wardRoll >= args.ward && args.ward > 3) { let newWard = Math.max(3, args.ward - 1) - this.script.scriptMessage("Protection améliorée de " + newWard) + this.script.message("Protection améliorée à " + newWard) this.effect.setFlag("wfrp4e", "ward", newWard) } diff --git a/scripts/cTYNaKbepMwqYsZ8.js b/scripts/cTYNaKbepMwqYsZ8.js deleted file mode 100644 index 2ad2d51..0000000 --- a/scripts/cTYNaKbepMwqYsZ8.js +++ /dev/null @@ -1,14 +0,0 @@ - -let difficulty = "" -if (this.effect.name.includes("Moderate")) - difficulty = "easy" -else if (this.effect.name.includes("Severe")) - difficulty = "average" -else - difficulty = "veasy" - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), { context: { failure: this.actor.name + " meurt du Fléau" }, fields: { difficulty }, appendTitle: " - Blight" }) -await test.roll(); -if (test.failed) { - this.actor.addCondition("dead"); -} diff --git a/scripts/cUnbADgOQ4fMKgrH.js b/scripts/cUnbADgOQ4fMKgrH.js index 93bb499..6a4b7db 100644 --- a/scripts/cUnbADgOQ4fMKgrH.js +++ b/scripts/cUnbADgOQ4fMKgrH.js @@ -7,14 +7,14 @@ if (this.item.name.includes("(")) group = this.item.parenthesesText } -else +else { - group = await ValueDialog.create({text : "Enter Hatred Group", title : "Hatred Group"}) + group = await ValueDialog.create({text : "Entrez le Groupe de Haine", title : "Groupe de Haine"}) - this.item.updateSource({name : this.item.name + ` (${group})`, "system.tests.value" : this.item.system.tests.value.replace("Group", group)}) - this.effect.updateSource({name : this.effect.name + ` (${group})`}) + this.item.updateSource({name : this.item.name + ` (${group})`, "system.tests.value" : this.item.system.Tests.value.replace("Group", group)}) + this.effet.updateSource({name : this.effet.name + ` (${group})`}) } -data.name = data.name.replace("Target", group); +data.name = data.name.replace("Cible", group); await this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}); \ No newline at end of file diff --git a/scripts/cV9JiAgUPOeUHKnS.js b/scripts/cV9JiAgUPOeUHKnS.js deleted file mode 100644 index c65bef6..0000000 --- a/scripts/cV9JiAgUPOeUHKnS.js +++ /dev/null @@ -1,5 +0,0 @@ -args.fields.successBonus++; -if (args.skill?.name != game.i18n.localize("NAME.SleightOfHand")) -{ - args.fields.modifier += 10; -} \ No newline at end of file diff --git a/scripts/cW8ZuQ9YIUG5uvhf.js b/scripts/cW8ZuQ9YIUG5uvhf.js new file mode 100644 index 0000000..f78ef15 --- /dev/null +++ b/scripts/cW8ZuQ9YIUG5uvhf.js @@ -0,0 +1 @@ +return args.characteristic != "t"; \ No newline at end of file diff --git a/scripts/cZVrzR4fxV86lxNW.js b/scripts/cZVrzR4fxV86lxNW.js new file mode 100644 index 0000000..5909e04 --- /dev/null +++ b/scripts/cZVrzR4fxV86lxNW.js @@ -0,0 +1,7 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.yrkI7ATjqLPDTFmZ") +let res = item.toObject(); +res.system.specification.value = 1; + +item = await fromUuid("Compendium.wfrp4e-core.items.Item.mNoCuaVbFBflfO6X") +let ss = item.toObject(); +await this.actor.createEmbeddedDocuments("Item", [res, ss], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/chUpiI3el8IO8MSs.js b/scripts/chUpiI3el8IO8MSs.js index 94a9fa2..755d158 100644 --- a/scripts/chUpiI3el8IO8MSs.js +++ b/scripts/chUpiI3el8IO8MSs.js @@ -1,6 +1,6 @@ if (args.opposedTest.attackerTest.item?.name.includes("Morsure")) { let woundsGained = args.totalWoundLoss; - this.script.scriptMessage(`Récupère ${woundsGained} Blessures`, { whisper: ChatMessage.getWhisperRecipients("GM") }) + this.script.message(`Gains ${woundsGained} Wounds`, { whisper: ChatMessage.getWhisperRecipients("GM") }) this.actor.modifyWounds(woundsGained) } \ No newline at end of file diff --git a/scripts/cipTp0OS2bfKLjZS.js b/scripts/cipTp0OS2bfKLjZS.js new file mode 100644 index 0000000..f963abb --- /dev/null +++ b/scripts/cipTp0OS2bfKLjZS.js @@ -0,0 +1,4 @@ +if (args.totalWoundLoss > 0) { + await args.actor.addCondition("bleeding") + await args.actor.addCondition("poisoned") +} \ No newline at end of file diff --git a/scripts/clO7l82UYMJ4XVks.js b/scripts/clO7l82UYMJ4XVks.js new file mode 100644 index 0000000..e0465c5 --- /dev/null +++ b/scripts/clO7l82UYMJ4XVks.js @@ -0,0 +1 @@ +args.context.giantbane = true \ No newline at end of file diff --git a/scripts/cqYgZQk1C3kMARy5.js b/scripts/cqYgZQk1C3kMARy5.js deleted file mode 100644 index 9cd6778..0000000 --- a/scripts/cqYgZQk1C3kMARy5.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Haggle"); \ No newline at end of file diff --git a/scripts/cxgGYbuiXM3NxIOI.js b/scripts/cxgGYbuiXM3NxIOI.js new file mode 100644 index 0000000..a341062 --- /dev/null +++ b/scripts/cxgGYbuiXM3NxIOI.js @@ -0,0 +1,4 @@ +if (args.test.options.flags.skewering) +{ + args.test.preData.roll = 1; +} \ No newline at end of file diff --git a/scripts/czZI8S09By0Mqlsr.js b/scripts/czZI8S09By0Mqlsr.js new file mode 100644 index 0000000..255bbc5 --- /dev/null +++ b/scripts/czZI8S09By0Mqlsr.js @@ -0,0 +1 @@ +return (args.skill?.name == undefined || args.item?.skillToUse?.name != args.skill?.name) \ No newline at end of file diff --git a/scripts/dAMtbn3uQwF8KpKU.js b/scripts/dAMtbn3uQwF8KpKU.js deleted file mode 100644 index 75eba38..0000000 --- a/scripts/dAMtbn3uQwF8KpKU.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Charm") && args.skill?.name != game.i18n.localize("NAME.Gossip"); \ No newline at end of file diff --git a/scripts/dEx8xfG7VLbN69Ha.js b/scripts/dEx8xfG7VLbN69Ha.js new file mode 100644 index 0000000..336d304 --- /dev/null +++ b/scripts/dEx8xfG7VLbN69Ha.js @@ -0,0 +1,14 @@ +if (!this.item.system.properties.flaws.reload) return; + +const minReload = this.item.system.properties.qualities?.salvo ? 1 : 0; +const originalReload = this.item.system.properties.flaws.reload.value; +const runesOfReloading = Number(this.item.effects.contents.filter(e => e.name == this.effect.name).length); +const newReload = Math.max(originalReload - (2 * runesOfReloading), minReload); + +if (newReload) { + this.item.system.properties.flaws.reload.value = newReload; + this.item.system.properties.flaws.reload.display = `${game.i18n.localize("PROPERTY.Reload")} ${newReload}`; +} +else { + delete this.item.system.properties.flaws.reload +} \ No newline at end of file diff --git a/scripts/dIxYt421K010eogY.js b/scripts/dIxYt421K010eogY.js index df350bf..b628745 100644 --- a/scripts/dIxYt421K010eogY.js +++ b/scripts/dIxYt421K010eogY.js @@ -1,6 +1,6 @@ let modifier = 0 - if (this.effect.name.includes("Modéré")) + if (this.effect.name.includes("Moderate")) modifier = -20 else modifier = -10 diff --git a/scripts/dM449AU0FQRnOc3l.js b/scripts/dM449AU0FQRnOc3l.js index 6fd5fd9..992c1e4 100644 --- a/scripts/dM449AU0FQRnOc3l.js +++ b/scripts/dM449AU0FQRnOc3l.js @@ -1,4 +1,4 @@ if (args.opposedTest.result.hitloc.value == "head") { - args.abort = "Raté - Sans tête" + args.abort = "Missed - Headless" } \ No newline at end of file diff --git a/scripts/dMeSZGdvw7zlnUKh.js b/scripts/dMeSZGdvw7zlnUKh.js new file mode 100644 index 0000000..02c9862 --- /dev/null +++ b/scripts/dMeSZGdvw7zlnUKh.js @@ -0,0 +1 @@ +return args.characteristic != "wp" && !args.context.terror && !args.extendedTest?.flags.wfrp4e?.fear \ No newline at end of file diff --git a/scripts/dSmRhZ6o1bUcOSF9.js b/scripts/dSmRhZ6o1bUcOSF9.js deleted file mode 100644 index bc3b6fd..0000000 --- a/scripts/dSmRhZ6o1bUcOSF9.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Leadership"); \ No newline at end of file diff --git a/scripts/dVF5ywnzeiZQx9ke.js b/scripts/dVF5ywnzeiZQx9ke.js new file mode 100644 index 0000000..b31aabb --- /dev/null +++ b/scripts/dVF5ywnzeiZQx9ke.js @@ -0,0 +1,6 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {fields : {difficulty : "hard"}, appendTitle : ` - ${this.effect.name}`}) +await test.roll(); +if (test.failed) +{ + this.script.scriptMessage(await this.actor.applyBasicDamage(15, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true})) +} \ No newline at end of file diff --git a/scripts/dWr3tkFoIzsAgelu.js b/scripts/dWr3tkFoIzsAgelu.js index b153ae5..7f38fd3 100644 --- a/scripts/dWr3tkFoIzsAgelu.js +++ b/scripts/dWr3tkFoIzsAgelu.js @@ -1,13 +1,11 @@ let injury = this.effect.itemTargets[0] if (injury && this.effect.sourceTest.result.outcome == "success") { - let roll1 = new Roll(injury.system.duration.value) - await roll1.roll() - let days = roll1.total - let num = 1 + Number(this.effect.sourceTest.result.SL); - let roll = await new Roll(num + 'd10').roll() - await roll.toMessage(this.script.getChatData()) - let newDays = Math.max(days - roll.total, 1) - this.actor.updateEmbeddedDocuments("Item", [{ _id: injury.id, 'system.duration.value': newDays }]) - let message = "Blessures réduites à " + newDays + " (-" + roll.total + ") au lieu de " + days - this.script.scriptMessage(message) + let days = new Roll(injury.system.duration.value).evaluateSync().total + let num = 1 + Number(this.effect.sourceTest.result.SL); + let roll = await new Roll(num+'d10').roll() + await roll.toMessage(this.script.getChatData()) + let newDays = Math.max(days - roll.total, 1) + this.actor.updateEmbeddedDocuments("Item", [{_id: injury.id, 'system.duration.value': newDays} ]) + let message = "Blessure réduite à "+newDays+" (-" + roll.total + ") au lieu de "+days + this.script.message(message) } diff --git a/scripts/dXGosSxdoYbET2O8.js b/scripts/dXGosSxdoYbET2O8.js deleted file mode 100644 index 2554389..0000000 --- a/scripts/dXGosSxdoYbET2O8.js +++ /dev/null @@ -1,11 +0,0 @@ -await this.actor.addCondition("fatigued"); - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool")) - -await test.roll(); - -if (!test.succeeded) -{ - await this.actor.addCondition("fatigued"); - await this.actor.addCondition("broken"); -} \ No newline at end of file diff --git a/scripts/dZ4c5pKDqQV02aIK.js b/scripts/dZ4c5pKDqQV02aIK.js index 3a5ebde..360a8a3 100644 --- a/scripts/dZ4c5pKDqQV02aIK.js +++ b/scripts/dZ4c5pKDqQV02aIK.js @@ -1,4 +1,4 @@ if (args.effect.conditionId == "ablaze") { - args.data.formula += ` + parseInt(this.effect.sourceTest.result.SL)` + args.data.formula += ` + parseInt(this.effet.sourceTest.result.SL)` } \ No newline at end of file diff --git a/scripts/dbOSvpgcPjsc2uvq.js b/scripts/dbOSvpgcPjsc2uvq.js index b591df7..38e71e9 100644 --- a/scripts/dbOSvpgcPjsc2uvq.js +++ b/scripts/dbOSvpgcPjsc2uvq.js @@ -1,7 +1,7 @@ let menacing = (await fromUuid("Compendium.wfrp4e-core.items.Item.0hn6UaKq8CoZP2zD")).toObject(); let sense = (await fromUuid("Compendium.wfrp4e-core.items.Item.9h82z72XGo9tfgQS")).toObject(); -sense.name += " (Vue)"; -sense.system.tests.value = sense.system.tests.value.replace("Sens", "Vue") +sense.name += " (Sight)"; +sense.system.tests.value = sense.system.tests.value.replace("Sense", "Sight") this.actor.createEmbeddedDocuments("Item", [menacing, sense], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/dcwY8dCd3PNCEzk6.js b/scripts/dcwY8dCd3PNCEzk6.js index 4b0b023..ff07982 100644 --- a/scripts/dcwY8dCd3PNCEzk6.js +++ b/scripts/dcwY8dCd3PNCEzk6.js @@ -2,4 +2,4 @@ let current = this.actor.status.fate.value this.actor.update({"system.status.fate.value" : current + 1}) -this.script.scriptMessage(`${this.actor.prototypeToken.name} voit ses Points de Destin augmentés de ${current} à ${current + 1}`) \ No newline at end of file +this.script.message(`${this.actor.prototypeToken.name} fate points increased from ${current} to ${current + 1}`) \ No newline at end of file diff --git a/scripts/dfEgat3jz4EtWszH.js b/scripts/dfEgat3jz4EtWszH.js deleted file mode 100644 index 9e6bec5..0000000 --- a/scripts/dfEgat3jz4EtWszH.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == "Discrétion (Urbaine)" \ No newline at end of file diff --git a/scripts/dfnCK8jCPXNLM7Gh.js b/scripts/dfnCK8jCPXNLM7Gh.js deleted file mode 100644 index 334949b..0000000 --- a/scripts/dfnCK8jCPXNLM7Gh.js +++ /dev/null @@ -1,12 +0,0 @@ -let aoeDamage = this.effect.sourceTest.result.damage - 5 // Easily handle magic missile damage by just subtracting 5 from the item's (which has +10 base) - -this.script.scriptMessage(await this.actor.applyBasicDamage(aoeDamage, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true})) - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Dodge"), {skipTargets: true, appendTitle : ` - En Flammes`}) - -await test.roll(); - -if (!test.succeeded) -{ - this.actor.addCondition("ablaze"); -} \ No newline at end of file diff --git a/scripts/dkiNmwFXztIVbuxg.js b/scripts/dkiNmwFXztIVbuxg.js deleted file mode 100644 index cfeb34b..0000000 --- a/scripts/dkiNmwFXztIVbuxg.js +++ /dev/null @@ -1,8 +0,0 @@ -let currentCareer = this.actor.system.currentCareer; - -if (!currentCareer || currentCareer.system.talents.includes(game.i18n.localize("NAME.Frenzy"))) -{ - return -} - -currentCareer.system.talents.push(game.i18n.localize("NAME.Frenzy")); \ No newline at end of file diff --git a/scripts/dr9VJKGY3TeGuzXj.js b/scripts/dr9VJKGY3TeGuzXj.js new file mode 100644 index 0000000..7998b5a --- /dev/null +++ b/scripts/dr9VJKGY3TeGuzXj.js @@ -0,0 +1 @@ +this.script.message(`Allies of ${this.actor.name} gain +20 Initiative for the first round.`) \ No newline at end of file diff --git a/scripts/dsXGavzXLerXR8Xg.js b/scripts/dsXGavzXLerXR8Xg.js deleted file mode 100644 index fb7fc0e..0000000 --- a/scripts/dsXGavzXLerXR8Xg.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Sail")) && !args.skill?.name.includes(game.i18n.localize("NAME.Row")) \ No newline at end of file diff --git a/scripts/dtFvpY96RPzNnphq.js b/scripts/dtFvpY96RPzNnphq.js deleted file mode 100644 index 3a5cf96..0000000 --- a/scripts/dtFvpY96RPzNnphq.js +++ /dev/null @@ -1 +0,0 @@ -return !(args.skill?.name.includes("Corps à corps (Base)") || (args.type == "weapon" && args.item?.system.weaponGroup.value == "basic")) \ No newline at end of file diff --git a/scripts/dwSgcFxKN3S0hLJL.js b/scripts/dwSgcFxKN3S0hLJL.js deleted file mode 100644 index b575b9b..0000000 --- a/scripts/dwSgcFxKN3S0hLJL.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != "Corps à corps (Bagarre)" && args.item?.weaponGroup?.value != "brawling" \ No newline at end of file diff --git a/scripts/dxt3p07po06J9fO1.js b/scripts/dxt3p07po06J9fO1.js new file mode 100644 index 0000000..0c78cb5 --- /dev/null +++ b/scripts/dxt3p07po06J9fO1.js @@ -0,0 +1,14 @@ +const metal = () => { + for (const [key, loc] of Object.entries(this.actor.armour)) { + if (!loc.layers) continue; + + for (const layer of loc.layers) { + if (layer.metal) + return true; + } + } + + return false; +}; + +args.fields.slBonus -= metal() ? 2 : 1; \ No newline at end of file diff --git a/scripts/e0eKVlOSk3Vw1HiD.js b/scripts/e0eKVlOSk3Vw1HiD.js new file mode 100644 index 0000000..f0816df --- /dev/null +++ b/scripts/e0eKVlOSk3Vw1HiD.js @@ -0,0 +1 @@ +return args.characteristic != "wp" || args.type != "characteristic" \ No newline at end of file diff --git a/scripts/e2JlsKoW8oaFjn6Y.js b/scripts/e2JlsKoW8oaFjn6Y.js new file mode 100644 index 0000000..3505946 --- /dev/null +++ b/scripts/e2JlsKoW8oaFjn6Y.js @@ -0,0 +1,8 @@ +const roll = new Roll("1d10"); + +await roll.evaluate(); +roll.toMessage(); + +const slBonus = Number(this.effect.sourceTest.result.SL) + roll.total; + +this.effect.setFlag("wfrp4e", "slBonus", slBonus); \ No newline at end of file diff --git a/scripts/e34s1XxHckAWfwHt.js b/scripts/e34s1XxHckAWfwHt.js index 76f2e83..bfcbd7c 100644 --- a/scripts/e34s1XxHckAWfwHt.js +++ b/scripts/e34s1XxHckAWfwHt.js @@ -1,4 +1,4 @@ if (args.test.options.beatBlade && (args.test.result.roll <= game.settings.get("wfrp4e", "automaticSuccess") || args.test.result.roll <= args.test.target)) { - args.test.result.other.push(`${this.effect.name}: L'opposant perd ${Number(args.test.result.SL) + 1} Avantage`) + args.test.result.other.push(`${this.effect.name}: Opponent loses ${Number(args.test.result.SL) + 1} Advantage`) } \ No newline at end of file diff --git a/scripts/e3dBud1keWyhw6nw.js b/scripts/e3dBud1keWyhw6nw.js new file mode 100644 index 0000000..bd498d9 --- /dev/null +++ b/scripts/e3dBud1keWyhw6nw.js @@ -0,0 +1,10 @@ +const stupid = this.actor.items.find(i => i.name === "Stupidee"); + +if (!stupid) return; + + +if (this.item.system.disabled) { + await stupid.update({"system.disabled": false}); +} else { + await stupid.update({"system.disabled": true}); +} \ No newline at end of file diff --git a/scripts/e7IxnxePdXSy6L4E.js b/scripts/e7IxnxePdXSy6L4E.js index 5026e54..6b19fc6 100644 --- a/scripts/e7IxnxePdXSy6L4E.js +++ b/scripts/e7IxnxePdXSy6L4E.js @@ -1,4 +1,4 @@ if (args.opposedTest.result.hitloc.value == "head") { - this.script.scriptMessage(`${this.actor.prototypeToken.name} subit une @Table[crithead]{Blessure Critique} si il n'y en avait pas d'autres.`) + this.script.message(`${this.actor.prototypeToken.name} receives a @Table[crithead]{Critical Wound} if one was not caused already.`) } \ No newline at end of file diff --git a/scripts/eC61buStv62b3sN9.js b/scripts/eC61buStv62b3sN9.js new file mode 100644 index 0000000..67e127d --- /dev/null +++ b/scripts/eC61buStv62b3sN9.js @@ -0,0 +1 @@ +args.fields.slBonus += 8; \ No newline at end of file diff --git a/scripts/eGQAyzCFZAEQhyJl.js b/scripts/eGQAyzCFZAEQhyJl.js deleted file mode 100644 index cd7e408..0000000 --- a/scripts/eGQAyzCFZAEQhyJl.js +++ /dev/null @@ -1,5 +0,0 @@ -const roll = new Roll("2d10"); -await roll.evaluate(); -const money = game.wfrp4e.market.addMoneyTo(this.actor, `${roll.total}b`); -await this.actor.updateEmbeddedDocuments("Item", money); -this.script.message(game.i18n.format("SCRIPT.Silvertide", {name: this.actor.name, pennies: roll.total})); \ No newline at end of file diff --git a/scripts/eIiiDhJohYez26qY.js b/scripts/eIiiDhJohYez26qY.js new file mode 100644 index 0000000..08e3862 --- /dev/null +++ b/scripts/eIiiDhJohYez26qY.js @@ -0,0 +1,12 @@ +const {targetUuid} = this.effect.flags.wfrp4e; + +if (args.actor.uuid !== targetUuid) return; + +const recordedWounds = this.effect.getFlag("wfrp4e", "damageToReturn"); + +if (!recordedWounds) return; + +args.modifiers.other.push({label: this.effect.name, value: recordedWounds}); +args.totalWoundLoss += recordedWounds + +this.effect.unsetFlag("wfrp4e", "damageToReturn"); \ No newline at end of file diff --git a/scripts/eLxdRg8LX3AdYSEq.js b/scripts/eLxdRg8LX3AdYSEq.js new file mode 100644 index 0000000..ab8430f --- /dev/null +++ b/scripts/eLxdRg8LX3AdYSEq.js @@ -0,0 +1,9 @@ +let sumArmour = 0; +for (let key in this.actor.system.status.armour) { + let armour = this.actor.system.status.armour[key]; + sumArmour += Number(armour?.value || 0); +} +let damage = Math.floor(Number(sumArmour)/2); +if (damage > 0 ) { + this.script.scriptMessage(await this.actor.applyBasicDamage(damage, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true})) +} \ No newline at end of file diff --git a/scripts/ePPgxQOqL1Uhz2k9.js b/scripts/ePPgxQOqL1Uhz2k9.js index 24a92c5..9e735e2 100644 --- a/scripts/ePPgxQOqL1Uhz2k9.js +++ b/scripts/ePPgxQOqL1Uhz2k9.js @@ -1,58 +1,48 @@ -let choice1 = [ - { - type : "skill", - name : "Projectiles (Arc)", - diff : { - system : { - advances : { - value : 10 - } - } - } - }, - { - type : "weapon", - name : "Bow", - }, - { - type : "ammunition", - name : "Arrow", - } -] -let choice2 = [ -] +let addOption = await foundry.applications.api.DialogV2.confirm({ + window : {title : "Option"}, + content : + ` + Ajouter une option? +

    + Projectile (Arc) +10 et un Arc long avec 12 flèches +

    + `, +}) -let choice = await Dialog.wait({ - title : "Option", - content : - `

    - Ajouter une option? -

    -
      -
    1. Ranged (Bow) +10 and a Bow with 12 Arrows
    2. -
    - `, - buttons : { - 1 : { - label : "Yes", - callback : () => { - return choice1 - } - }, - 2 : { - label : "No", - callback : () => { - choice2 +let choice = [] + +if (addOption) +{ + choice = [ + { + type : "skill", + name : "Projectile (Arc)", + diff : { + system : { + advances : { + value : 10 + } } } + }, + { + type : "weapon", + name : "Arc long", + }, + { + type : "ammunition", + name : "Flèche", } - }) + ]; +} + + let updateObj = this.actor.toObject(); let items = [] for (let c of choice) { - let existing + let existing if (c.type == "skill") { existing = updateObj.items.find(i => i.name == c.name && i.type == c.type) diff --git a/scripts/ePv2YYcr4lz3AkGu.js b/scripts/ePv2YYcr4lz3AkGu.js new file mode 100644 index 0000000..b86ae10 --- /dev/null +++ b/scripts/ePv2YYcr4lz3AkGu.js @@ -0,0 +1,2 @@ +args.item.range.bands[game.i18n.localize("Long Range")].modifier = 0 +args.item.range.bands[game.i18n.localize("Extreme")].modifier = 0 \ No newline at end of file diff --git a/scripts/eRVVn8YtU8nnOW2q.js b/scripts/eRVVn8YtU8nnOW2q.js new file mode 100644 index 0000000..6f82afb --- /dev/null +++ b/scripts/eRVVn8YtU8nnOW2q.js @@ -0,0 +1,16 @@ +await this.actor.addCondition("prone"); + +const test = await this.actor.setupSkill(game.i18n.localize("NAME.Dodge"), { + skipTargets: true, + appendTitle: ` - ${this.effect.name}`, + fields: {difficulty: "difficult"}, + context: { + failure: `Encaisse 8 dégâts.`, + success: `Encaisse 4 dégâts.` + } +}) + +await test.roll(); +const damage = test.failed ? 8 : 4; + +await this.actor.applyBasicDamage(damage, {damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, loc: "roll"}); \ No newline at end of file diff --git a/scripts/eTHJSRutCEpuyPkR.js b/scripts/eTHJSRutCEpuyPkR.js new file mode 100644 index 0000000..0834627 --- /dev/null +++ b/scripts/eTHJSRutCEpuyPkR.js @@ -0,0 +1 @@ +return args.weapon?.system?.attackType !== "melee" || game.settings.get("wfrp4e", "useGroupAdvantage") \ No newline at end of file diff --git a/scripts/eViKAYOtuaOqo6c7.js b/scripts/eViKAYOtuaOqo6c7.js new file mode 100644 index 0000000..3f7cf24 --- /dev/null +++ b/scripts/eViKAYOtuaOqo6c7.js @@ -0,0 +1 @@ +return !args.skill?.name.includes(game.i18n.localize("NAME.ConsumeAlcohol")) \ No newline at end of file diff --git a/scripts/eWvHTkxsjKuH2IKm.js b/scripts/eWvHTkxsjKuH2IKm.js new file mode 100644 index 0000000..1378f6a --- /dev/null +++ b/scripts/eWvHTkxsjKuH2IKm.js @@ -0,0 +1,8 @@ +const luck = Number(this.item.qualities.value.filter(v => v.key == "luck")[0].description) + +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.u0CFf3xwiyidD9T5") + +for (let i = 0; i < luck; i++) { + let data = item.toObject(); + this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) +} \ No newline at end of file diff --git a/scripts/ebDQH0MdGAG02CHl.js b/scripts/ebDQH0MdGAG02CHl.js index 49e36d3..94a3b0e 100644 --- a/scripts/ebDQH0MdGAG02CHl.js +++ b/scripts/ebDQH0MdGAG02CHl.js @@ -3,12 +3,12 @@ let data = item.toObject(); data.system.location.key = this.item.system.location.key if (this.item.system.location.key == "rArm") { - data.system.location.value = "Main Droite" + data.system.location.value = "Right Hand" data.system.location.key = "rHand" } else if (this.item.system.location.key == "lArm") { - data.system.location.value = "Main Gauche" + data.system.location.value = "Left Hand" data.system.location.key = "lHand" } this.actor.createEmbeddedDocuments("Item", [data]) \ No newline at end of file diff --git a/scripts/ed7Sud9HM3uB2j6b.js b/scripts/ed7Sud9HM3uB2j6b.js index 092513b..e3eb7b9 100644 --- a/scripts/ed7Sud9HM3uB2j6b.js +++ b/scripts/ed7Sud9HM3uB2j6b.js @@ -1,7 +1,7 @@ -ChatMessage.create({content : "Céder ou Mourir!", speaker : ChatMessage.getSpeaker({token: this.actor.getActiveTokens()[0]?.document, actor: this.actor})}, {chatBubble : true}) +ChatMessage.create({content : "Yield or die!", speaker : ChatMessage.getSpeaker({token: this.actor.getActiveTokens()[0]?.document, actor: this.actor})}, {chatBubble : true}) let item = await fromUuid("Compendium.wfrp4e-core.items.pTorrE0l3VybAbtn") let data = item.toObject(); data.system.specification.value = 2; -this.script.scriptNotification("Ajout de " + data.name); +this.script.notification("Ajout de " + data.name); await this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}); -game.wfrp4e.utility.postFear(2, this.actor.prototypeToken.name) \ No newline at end of file +game.wfrp4e.utility.postPeur(2, this.actor.prototypeToken.name) \ No newline at end of file diff --git a/scripts/egc02UIueJgEQMqx.js b/scripts/egc02UIueJgEQMqx.js new file mode 100644 index 0000000..41330aa --- /dev/null +++ b/scripts/egc02UIueJgEQMqx.js @@ -0,0 +1 @@ +args.context.kingship = true \ No newline at end of file diff --git a/scripts/eieFcF4BxIvDTN3C.js b/scripts/eieFcF4BxIvDTN3C.js new file mode 100644 index 0000000..1c80a0d --- /dev/null +++ b/scripts/eieFcF4BxIvDTN3C.js @@ -0,0 +1 @@ +args.abort = `Cannot perform Projectiles Attacks within ${this.effect.name}`; \ No newline at end of file diff --git a/scripts/ekjJQHyMbZT2vqdc.js b/scripts/ekjJQHyMbZT2vqdc.js index 5295446..44bf61c 100644 --- a/scripts/ekjJQHyMbZT2vqdc.js +++ b/scripts/ekjJQHyMbZT2vqdc.js @@ -1,9 +1,9 @@ let uses = this.item.getFlag("wfrp4e", "uses") || 0; uses++; -this.script.scriptNotification(`Utilisé ${uses} fois`) +this.script.notification(`Utilisé ${uses} fois`) this.item.setFlag("wfrp4e", "uses", uses); if (uses >= 3) { - this.effect.update({"flags.wfrp4e.applicationData.type" : "other"}) - this.script.scriptNotification(`Utilisé`); + this.effet.update({"system.transferData.type" : "other"}) + this.script.notification(`Utilisé`); } diff --git a/scripts/eq32dKXeTAbKhhLf.js b/scripts/eq32dKXeTAbKhhLf.js new file mode 100644 index 0000000..160dd1e --- /dev/null +++ b/scripts/eq32dKXeTAbKhhLf.js @@ -0,0 +1,4 @@ +if (args.totalWoundLoss > 0) +{ + args.actor.addCondition("ablaze", Math.max(1, parseInt(args.opposedTest.attackerTest.result.SL) + 1)) +} \ No newline at end of file diff --git a/scripts/eqxE7nBO13yJS7hc.js b/scripts/eqxE7nBO13yJS7hc.js index 39c1e60..e9375de 100644 --- a/scripts/eqxE7nBO13yJS7hc.js +++ b/scripts/eqxE7nBO13yJS7hc.js @@ -1,5 +1,5 @@ let roll = (await new Roll("1d10").roll()) -roll.toMessage({flavor: " Blessures soignées", speaker : {alias : this.actor.name}}) +roll.toMessage({flavor: "Blessures soignées", speaker : {alias : this.actor.name}}) this.actor.modifyWounds(roll.total) diff --git a/scripts/eu4mHsdZukvUEAGJ.js b/scripts/eu4mHsdZukvUEAGJ.js new file mode 100644 index 0000000..567f661 --- /dev/null +++ b/scripts/eu4mHsdZukvUEAGJ.js @@ -0,0 +1,31 @@ +let token = this.actor.getActiveTokens()[0]?.document; +if (!token) { + token = this.actor.prototypeToken +} +if (args.equipped) { + this.effect.setFlag("wfrp4e", "lightData", token.light); + token.update({ + light: { + "alpha": 0.8, + "angle": 360, + "bright": 5, + "color": "#a33c0f", + "coloration": 1, + "dim": 20, + "attenuation": 0.5, + "luminosity": 0.5, + "saturation": 0, + "contrast": 0, + "shadows": 0, + "animation": { + "type": "torch", + "speed": 8, + "intensity": 4, + "reverse": false + } + } + }) +} +else { + token.update({light: this.effect.getFlag("wfrp4e", "lightData")}); +} \ No newline at end of file diff --git a/scripts/eyrUJQAuHvdllCwi.js b/scripts/eyrUJQAuHvdllCwi.js new file mode 100644 index 0000000..54855f2 --- /dev/null +++ b/scripts/eyrUJQAuHvdllCwi.js @@ -0,0 +1,2 @@ +args.context.flags.skewering = true; +this.effect.update({disabled: true}); \ No newline at end of file diff --git a/scripts/ezGqDoC9hNRBnFTB.js b/scripts/ezGqDoC9hNRBnFTB.js index 465c6c9..8cdf711 100644 --- a/scripts/ezGqDoC9hNRBnFTB.js +++ b/scripts/ezGqDoC9hNRBnFTB.js @@ -1,5 +1,5 @@ let choices = await Promise.all([warhammer.utility.findItemId("1zaqojk0Oq1m8vYv"), warhammer.utility.findItemId("zIuarD5mB0EF0ji0")]) -let items = await game.wfrp4e.apps.ItemDialog.create(choices, 1, "Choisissez a Weapon") +let items = await game.wfrp4e.apps.ItemDialog.create(choices, 1, "Choisir une arme") items = items.map(i => i.toObject()) items.forEach(i => i.system.equipped.value = true); diff --git a/scripts/f062aa2BNClx08D6.js b/scripts/f062aa2BNClx08D6.js deleted file mode 100644 index 892908e..0000000 --- a/scripts/f062aa2BNClx08D6.js +++ /dev/null @@ -1,16 +0,0 @@ -let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) - await test.roll(); - if (test.failed) - { - let toughnessLost = parseInt(this.effect.sourceTest.result.SL) - - let currentModifier = this.actor.characteristics.t.modifier - - await this.actor.update({ "system.characteristics.t.modifier": currentModifier - toughnessLost }) - this.script.scriptMessage(`${this.actor.prototypeToken.name} perd ${toughnessLost} points d'Endurance`) - if (this.actor.system.characteristics.t.value <= 0) - { - this.actor.addCondition("dead"); - } - - } \ No newline at end of file diff --git a/scripts/f29Pv6TQtgILxt1h.js b/scripts/f29Pv6TQtgILxt1h.js index 036a985..14305db 100644 --- a/scripts/f29Pv6TQtgILxt1h.js +++ b/scripts/f29Pv6TQtgILxt1h.js @@ -4,8 +4,8 @@ if (args.test.options.healWounds) { if (args.test.options.fieldDressing && args.test.result.reversed) wounds = this.actor.characteristics.int.bonus + Math.min(1, Number(args.test.result.SL)) args.test.result.woundsHealed = wounds - args.test.result.other.push(`${this.actor.name} soigne ${wounds} Blessures du patient.`) + args.test.result.other.push(`${this.actor.name} guéri ${wounds} Blessures du patient.`) } else if (this.actor.characteristics.int.bonus + args.test.result.SL < 0) - args.test.result.other.push(`Le patient contracte un @UUID[Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg]{Infection Mineure}.`) + args.test.result.other.push(`The patient contracts a @UUID[Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg]{Minor Infection}.`) } \ No newline at end of file diff --git a/scripts/f3rXusHh6VIpVPUl.js b/scripts/f3rXusHh6VIpVPUl.js deleted file mode 100644 index db182da..0000000 --- a/scripts/f3rXusHh6VIpVPUl.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name?.includes(game.i18n.localize("NAME.Language")) && args.type != "cast" \ No newline at end of file diff --git a/scripts/f4vvAGQ8OGoEbrgy.js b/scripts/f4vvAGQ8OGoEbrgy.js index c81bb32..41058d6 100644 --- a/scripts/f4vvAGQ8OGoEbrgy.js +++ b/scripts/f4vvAGQ8OGoEbrgy.js @@ -6,11 +6,11 @@ if (SL >= 2) difficulty = "hard" if (SL >= 3) difficulty = "vhard" - -let test = await args.actor.setupCharacteristic("wp", {fields: {difficulty}, skipTargets: true, appendTitle : " - " + this.effect.name, context : {failure: "Gain a Stunned Condition"}}) -await test.roll(); -if (test.failed) + +let test = await args.actor.setupCharacteristic("wp", {fields: {difficulty}, skipTargets: true, appendTitle : " - " + this.effet.name, context : {failure: "Reçoit un état Sonné"}}) +await Test.roll(); +if (Test.Échoué) { args.actor.addCondition("stunned"); } \ No newline at end of file diff --git a/scripts/f5Mp3kXwCFdPkW6N.js b/scripts/f5Mp3kXwCFdPkW6N.js deleted file mode 100644 index b50b369..0000000 --- a/scripts/f5Mp3kXwCFdPkW6N.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != "Divertissement (Chant)" && args.skill?.name != "Divertissement (Chanter)" && !args.skill?.name.includes("Langue"); \ No newline at end of file diff --git a/scripts/fA1dIV1ANo4RVEqy.js b/scripts/fA1dIV1ANo4RVEqy.js new file mode 100644 index 0000000..7fc7b9a --- /dev/null +++ b/scripts/fA1dIV1ANo4RVEqy.js @@ -0,0 +1,10 @@ +if (args.equipped) +{ + let item = await fromUuid("Compendium.wfrp4e-core.items.Item.4mF5Sp3t09kZhBYc"); + let champion = item.toObject(); + this.actor.createEmbeddedDocuments("Item", [champion], {fromEffect : this.effect.id}) +} +else +{ + this.effect.deleteCreatedItems(); +} \ No newline at end of file diff --git a/scripts/fC4KcY9S6V30IJyX.js b/scripts/fC4KcY9S6V30IJyX.js new file mode 100644 index 0000000..998151b --- /dev/null +++ b/scripts/fC4KcY9S6V30IJyX.js @@ -0,0 +1 @@ +args.context.supercharge = true; \ No newline at end of file diff --git a/scripts/fEFfHFeJxkR0aIJK.js b/scripts/fEFfHFeJxkR0aIJK.js index cb4c4d7..e942e45 100644 --- a/scripts/fEFfHFeJxkR0aIJK.js +++ b/scripts/fEFfHFeJxkR0aIJK.js @@ -1,5 +1,4 @@ if (args.opposedTest.result.differenceSL >= 0 && args.opposedTest.result.differenceSL <= 3 && args.opposedTest.result.winner == "attacker") -{ - this.script.scriptMessage(`Tous ceux dans un rayon de 7 mètres perde 1 Point de Blessure et doivent faire un Test de Résistance Difficile (-10) ou recevoir l'état gains @Condition[Assourdi]`, {blind : true, whisper : ChatMessage.getWhisperRecipients("GM")}) +{ + this.script.message(`Quiconque dans un rayon de 6 mètres per 1 Blessure and doit effectuer un test Difficile (-10) de Résistance ou recevoir un état @Condition[Deafened]`, {blind : true, whisper : ChatMessage.getWhisperRecipients("GM")}) } - \ No newline at end of file diff --git a/scripts/fFGuTi0HLjwneMcJ.js b/scripts/fFGuTi0HLjwneMcJ.js index 33216f3..0f643a3 100644 --- a/scripts/fFGuTi0HLjwneMcJ.js +++ b/scripts/fFGuTi0HLjwneMcJ.js @@ -1 +1 @@ -return args.item?.system.isRanged \ No newline at end of file +return args.item?.system.isProjectiles \ No newline at end of file diff --git a/scripts/fKzlu6fFE2th9uIJ.js b/scripts/fKzlu6fFE2th9uIJ.js deleted file mode 100644 index 20bdbe3..0000000 --- a/scripts/fKzlu6fFE2th9uIJ.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name == game.i18n.localize("NAME.ConsumeAlcohol") \ No newline at end of file diff --git a/scripts/fLg90csmdOOKmEE6.js b/scripts/fLg90csmdOOKmEE6.js new file mode 100644 index 0000000..4e473c8 --- /dev/null +++ b/scripts/fLg90csmdOOKmEE6.js @@ -0,0 +1,9 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.EO05HX7jql0g605A") +let data = item.toObject(); +data.system.specification.value = 16 +this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) + +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.Bvd2aZ0gQUXHfCTh") +let data = item.toObject(); +data.system.specification.value = 8 +this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/fP2edYbj6QjPPAjL.js b/scripts/fP2edYbj6QjPPAjL.js deleted file mode 100644 index 7578147..0000000 --- a/scripts/fP2edYbj6QjPPAjL.js +++ /dev/null @@ -1 +0,0 @@ -return ["Emprise sur les animaux", "Résistance", "Survie en extérieur"].includes(args.skill?.name) \ No newline at end of file diff --git a/scripts/fPKYkBllp7Et62lX.js b/scripts/fPKYkBllp7Et62lX.js index f1cdfaa..1c8312e 100644 --- a/scripts/fPKYkBllp7Et62lX.js +++ b/scripts/fPKYkBllp7Et62lX.js @@ -1,4 +1,4 @@ if (args.test.spell.name == "Warp Lightning") { - args.test.preData.canReverse = true; + args.test.preData.reversal = {allowed : true, if: "better"}; } \ No newline at end of file diff --git a/scripts/fSDFCHAo97RLpwGU.js b/scripts/fSDFCHAo97RLpwGU.js new file mode 100644 index 0000000..eea226d --- /dev/null +++ b/scripts/fSDFCHAo97RLpwGU.js @@ -0,0 +1,9 @@ +const hitLocation = args.test.hitloc.result +const hitLocationArmour = args.test.targets[0].armour[hitLocation] + +if (hitLocationArmour.layers.length > 0) { + hitLocationArmour.layers.forEach(layer => { + layer.source.system.qualities.value = []; + layer.impenetrable = false; + }); +} \ No newline at end of file diff --git a/scripts/fUD4gMdKe6P3sFdJ.js b/scripts/fUD4gMdKe6P3sFdJ.js new file mode 100644 index 0000000..1ec4e5e --- /dev/null +++ b/scripts/fUD4gMdKe6P3sFdJ.js @@ -0,0 +1 @@ +this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.Zh68gzYMLW8vZgVo", this.effect) \ No newline at end of file diff --git a/scripts/fYLSe6CrYciap5y8.js b/scripts/fYLSe6CrYciap5y8.js deleted file mode 100644 index 0f9ec4b..0000000 --- a/scripts/fYLSe6CrYciap5y8.js +++ /dev/null @@ -1,74 +0,0 @@ -let characteristics = { - "ws" : 0, - "bs" : 0, - "s" : 10, - "t" : 10, - "i" : 0, - "ag" : 10, - "dex" : 0, - "int" : 0, - "wp" : 0, - "fel" : 0 -} -let skills = [game.i18n.localize("NAME.ConsumeAlcohol"), game.i18n.localize("NAME.Row"), game.i18n.localize("NAME.Sail"), game.i18n.localize("NAME.Swim")] -let skillAdvancements = [10, 10, 10, 10] -let talents = [] -let trappings = [] -let items = [] - -let updateObj = this.actor.toObject(); - -for (let ch in characteristics) -{ - updateObj.system.characteristics[ch].modifier += characteristics[ch]; -} - -for (let index = 0; index < skills.length; index++) -{ - let skill = skills[index] - let skillItem; - skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") - if (skillItem) - skillItem.system.advances.value += skillAdvancements[index] - else - { - skillItem = await game.wfrp4e.utility.findSkill(skill) - skillItem = skillItem.toObject(); - skillItem.system.advances.value = skillAdvancements[index]; - items.push(skillItem); - } -} - -for (let talent of talents) -{ - let talentItem = await game.wfrp4e.utility.findTalent(talent) - if (talentItem) - { - items.push(talentItem.toObject()); - } - else - { - ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) - } -} - -for (let trapping of trappings) -{ - let trappingItem = await game.wfrp4e.utility.findItem(trapping) - if (trappingItem) - { - trappingItem = trappingItem.toObject() - - trappingItem.system.equipped.value = true; - - items.push(trappingItem); - } - else - { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) - } -} - - -await this.actor.update(updateObj) -this.actor.createEmbeddedDocuments("Item", items); \ No newline at end of file diff --git a/scripts/fcY3pa72dELnOFXV.js b/scripts/fcY3pa72dELnOFXV.js index 1cd4cc1..7cdc318 100644 --- a/scripts/fcY3pa72dELnOFXV.js +++ b/scripts/fcY3pa72dELnOFXV.js @@ -1 +1 @@ -return !args.options.reload +return !args.context.reload diff --git a/scripts/feMPZhhFeXRtKdKY.js b/scripts/feMPZhhFeXRtKdKY.js index 38fff1f..a46fb88 100644 --- a/scripts/feMPZhhFeXRtKdKY.js +++ b/scripts/feMPZhhFeXRtKdKY.js @@ -6,5 +6,5 @@ if (this.item.system.quantity.value) } else { - this.script.scriptNotification("Aucun restant!", "error") + this.script.notification("Plus rien !", "error") } \ No newline at end of file diff --git a/scripts/fiF9sM5UpcHMYa33.js b/scripts/fiF9sM5UpcHMYa33.js index fbbe0fa..554998a 100644 --- a/scripts/fiF9sM5UpcHMYa33.js +++ b/scripts/fiF9sM5UpcHMYa33.js @@ -1,4 +1,4 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.vMYEkrWj0ip6ZOdv"); let data = item.toObject(); -data.name += " (Poison, Maladie, Chaos)" +data.name += " (Poison, Disease, Chaos)" this.actor.createEmbeddedDocuments("Item", Array(this.effect.sourceTest.result.overcast.usage.other.current).fill(data), {fromEffect: this.effect.id}) \ No newline at end of file diff --git a/scripts/fq2fqlWlrVfitkcB.js b/scripts/fq2fqlWlrVfitkcB.js new file mode 100644 index 0000000..b4dc06c --- /dev/null +++ b/scripts/fq2fqlWlrVfitkcB.js @@ -0,0 +1,48 @@ +let characteristics = { + "ws" : 0, + "bs" : -200, + "s" : 20, + "t" : 20, + "i" : 0, + "ag" : -5, + "dex" : -5, + "int" : 0, + "wp" : 0, + "fel" : 0 +} +let traits = [ {name:"Corruption"}, {name:"Insensible à la douleur"}, {name:"Stupidee"}, {name:"Nuée"}, {name:"Bestial", disabled : true}, {name:"Régénération", disabled : true}, {name:"Taille", value: "Large", disabled : true}, {name:"Territorial", disabled: true} ]; +let items = []; + +let updateObj = this.actor.toObject(); +for (let ch in characteristics) +{ + updateObj.system.characteristics[ch].modifier += characteristics[ch]; +} + +for (let trait of traits) +{ + let traitItem = await game.wfrp4e.utility.find(trait.name, "trait") + if (traitItem) + { + let t = traitItem.toObject(); + t.system.specification.value = trait.value; + if (trait.disabled) + { + t.system.disabled = true; + } + items.push(t); + } + else + { + ui.notifications.warn(`: -200 +} +let traits = [ {name:`, {permanent : true}) + } +} + + +updateObj.name = updateObj.name += " " + this.effet.name + +await this.actor.update(updateObj) +this.actor.createEmbeddedDocuments("Item", items); + diff --git a/scripts/ft0LaRWZT5WtnptP.js b/scripts/ft0LaRWZT5WtnptP.js index 4549c61..3bcd673 100644 --- a/scripts/ft0LaRWZT5WtnptP.js +++ b/scripts/ft0LaRWZT5WtnptP.js @@ -2,11 +2,11 @@ let advantage = this.actor.system.status.advantage.value; if (advantage > 0) { await this.actor.setAdvantage(0); - this.script.scriptNotification("Avantage soustrait") + this.script.notification("Avantage retiré") } else { - return this.script.scriptNotification("Pas assez d'Avantages!", "error") + return this.script.notification("Avantage retiré", "error") } let test = await this.actor.setupTrait(this.item, {fields : {slBonus : advantage}}) diff --git a/scripts/fwiBeetIsvpXKtUc.js b/scripts/fwiBeetIsvpXKtUc.js new file mode 100644 index 0000000..2a35c5c --- /dev/null +++ b/scripts/fwiBeetIsvpXKtUc.js @@ -0,0 +1,10 @@ +scatter = await game.wfrp4e.tables.rollTable("scatter"); + +if (scatter.roll == 9 || scatter.roll == 10) +{ + this.script.message(`${scatter.roll}: Failed to Scatter`); +} +else +{ + this.script.message(scatter.result); +} \ No newline at end of file diff --git a/scripts/fyjYWg7ekj8JJcmq.js b/scripts/fyjYWg7ekj8JJcmq.js new file mode 100644 index 0000000..e1b5a10 --- /dev/null +++ b/scripts/fyjYWg7ekj8JJcmq.js @@ -0,0 +1,4 @@ +if (args.test.result.misfire || args.test.result.fumble) +{ + args.test.result.other.push(`${this.effect.name}: can be used to Negate Fumble / Raté Effects`) +} \ No newline at end of file diff --git a/scripts/fzTB7t3x4bLmAXji.js b/scripts/fzTB7t3x4bLmAXji.js index d46ba03..809d423 100644 --- a/scripts/fzTB7t3x4bLmAXji.js +++ b/scripts/fzTB7t3x4bLmAXji.js @@ -1,5 +1,5 @@ let roll = await new Roll("1d10 + 1").roll() await roll.toMessage(this.script.getChatData()); -this.script.scriptNotification(`Soins de ${roll.total} Blessures`) +this.script.notification(`Healed ${roll.total} Wounds`) this.actor.corruptionDialog("moderate") await this.actor.modifyWounds(roll.total) \ No newline at end of file diff --git a/scripts/g07HI7vyqiFXPB0o.js b/scripts/g07HI7vyqiFXPB0o.js deleted file mode 100644 index 4bfe29a..0000000 --- a/scripts/g07HI7vyqiFXPB0o.js +++ /dev/null @@ -1,29 +0,0 @@ -// A Drinker must take a Difficult (-10) Endurance Test. -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "difficult"}}) -await test.roll() -// If they fail, they acquire 2 Poisoned Conditions. -if (test.failed) -{ - this.actor.addCondition("poisoned", 2) - this.script.scriptMessage(`

    ${this.actor.prototypeToken.name} reçoit 2 états @Condition[Empoisonné].

    -

    Toute créature avec le Trait Bestial qui le mord et provoque des dégats ne le mordra pas à nouveau durant un combat, la créature pouvant toutefois attaquer avec d'autres méthodes si disponibles..

    `, - { - whisper: ChatMessage.getWhisperRecipients("GM"), - blind: true - }) -} - // If they succeed, for a number of rounds equal to 3+ their SL, they have the Corrosive Blood Creature Trait. -else if (test.succeeded) -{ - // Don't attempt to add Corrosive Blood if actor already has it - const hasCorrosiveBlood = this.actor.has("Sang corrosif") - if (hasCorrosiveBlood !== undefined) return - - let item = await fromUuid("Compendium.wfrp4e-core.items.M5QSWOYt2Rbv2yxW") - let data = item.toObject() - this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) - - const duration = 3 + parseInt(test.result.SL) - this.script.scriptMessage(`

    ${this.actor.prototypeToken.name} gagne le Trait Sang Corrosif pour ${duration} rounds.

    `, - { whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) -} \ No newline at end of file diff --git a/scripts/g0SzfsLyW7aD2F19.js b/scripts/g0SzfsLyW7aD2F19.js index b68d019..2d23b8c 100644 --- a/scripts/g0SzfsLyW7aD2F19.js +++ b/scripts/g0SzfsLyW7aD2F19.js @@ -1,4 +1,4 @@ -if (this.item.system.tests.value.includes("(Social Group)")) +if (this.item.system.tests.value.includes("(Groupe social)")) { let tests = this.item.system.tests.value let name = this.item.name @@ -11,11 +11,11 @@ if (this.item.system.tests.value.includes("(Social Group)")) } else { - let value = await ValueDialog.create({text : "Enter Etiquette Group", title : this.effect.name}); + let value = await ValueDialog.create({text : "Entrez le Groupe d'Étiquette", title : this.effet.name}); if (value) { name = `${name.split("(")[0].trim()} (${value})` - tests = this.item.system.tests.value.replace("Social Group", value); + tests = this.item.system.tests.value.replace("Groupe social", value); } } this.item.updateSource({name, "system.tests.value" : tests}) diff --git a/scripts/g1L8OYO9nCOhdKGL.js b/scripts/g1L8OYO9nCOhdKGL.js index 94085c1..299f9d3 100644 --- a/scripts/g1L8OYO9nCOhdKGL.js +++ b/scripts/g1L8OYO9nCOhdKGL.js @@ -6,7 +6,7 @@ let damage = (await new Roll(`1d10 + ${parseInt(this.effect.sourceTest.result.SL await damage.toMessage(this.script.getChatData()) -this.script.scriptMessage(await args.actor.applyBasicDamage( +this.script.message(await args.actor.applyBasicDamage( damage.total, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true} )) diff --git a/scripts/g4t56A09yrpZaJQ2.js b/scripts/g4t56A09yrpZaJQ2.js index 747721d..3bb9308 100644 --- a/scripts/g4t56A09yrpZaJQ2.js +++ b/scripts/g4t56A09yrpZaJQ2.js @@ -1,11 +1,11 @@ let amberTalons = foundry.utils.deepClone(game.wfrp4e.config.systemItems.unarmed); - amberTalons.name = "Amber Talons"; - amberTalons.img = this.effect.img; + amberTalons.name = "Serres d'ambre"; + amberTalons.img = this.effet.img; amberTalons.system.damage.value = "SB + WPB" amberTalons.system.equipped = true; amberTalons.system.qualities.value.push({name : "magical"}) amberTalons.effects.push({ - name : "Amber Talons", + name : "Serres d'ambre", transfer: false, img : "modules/wfrp4e-core/icons/spells/amber-talons.png" , system: { diff --git a/scripts/g5y0tdoHCDs7cBy7.js b/scripts/g5y0tdoHCDs7cBy7.js new file mode 100644 index 0000000..ecf4d34 --- /dev/null +++ b/scripts/g5y0tdoHCDs7cBy7.js @@ -0,0 +1,3 @@ +return !["NAME.Résistance", "NAME.Cool"].map(i => game.i18n.localize(i)).includes(args.skill?.name) + || !this.actor.sameSideAs(this.effect.sourceActor) + || this.actor.system.details.status.tier !== "b" \ No newline at end of file diff --git a/scripts/gFUXBbTskQBKjxqm.js b/scripts/gFUXBbTskQBKjxqm.js deleted file mode 100644 index e8f675a..0000000 --- a/scripts/gFUXBbTskQBKjxqm.js +++ /dev/null @@ -1,8 +0,0 @@ -if (this.actor.hasCondition("entangled")) -{ - this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : "average"}}).then(async test => { - await test.roll(); - if (test.failed) - this.actor.addCondition("fatigued") - }) -} \ No newline at end of file diff --git a/scripts/gKIPujyuFSn0No9v.js b/scripts/gKIPujyuFSn0No9v.js index 977eee5..6c19af8 100644 --- a/scripts/gKIPujyuFSn0No9v.js +++ b/scripts/gKIPujyuFSn0No9v.js @@ -2,4 +2,4 @@ for(let e of this.item.effects.contents) { e.update({disabled: false}) } -this.script.scriptNotification("Ré-initialiser les pouvoirs") \ No newline at end of file +this.script.notification("Reset Powers") \ No newline at end of file diff --git a/scripts/gKPL3t4vlZAsvtGr.js b/scripts/gKPL3t4vlZAsvtGr.js deleted file mode 100644 index 6e060db..0000000 --- a/scripts/gKPL3t4vlZAsvtGr.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == "Discrétion (Souterrains)" \ No newline at end of file diff --git a/scripts/gMIenSmLklAkB2Zm.js b/scripts/gMIenSmLklAkB2Zm.js index b16a793..03e7403 100644 --- a/scripts/gMIenSmLklAkB2Zm.js +++ b/scripts/gMIenSmLklAkB2Zm.js @@ -1,6 +1,6 @@ if (isNaN(parseInt(this.item.system.specification.value))) { - let value = await ValueDialog.create({text : "Enter Venom Strength", title : this.effect.name}, "", Object.values(game.wfrp4e.config.difficultyNames)); + let value = await ValueDialog.create({text : "Entrez la Force du Venin", title : this.effect.name}, "", Object.values(game.wfrp4e.config.difficultyNames)); if (value) { this.item.updateSource({"system.specification.value" : value}); diff --git a/scripts/gPQrszvIgGlW9yM4.js b/scripts/gPQrszvIgGlW9yM4.js index 61a3f69..15fbd6e 100644 --- a/scripts/gPQrszvIgGlW9yM4.js +++ b/scripts/gPQrszvIgGlW9yM4.js @@ -1,2 +1,2 @@ if (args.test.characteristicKey == "wp") - args.test.preData.canReverse = true \ No newline at end of file + args.Test.preData.reversal = {allowed: true, if: "better"}; \ No newline at end of file diff --git a/scripts/gQJJaxbN83KSgi36.js b/scripts/gQJJaxbN83KSgi36.js new file mode 100644 index 0000000..c97ab60 --- /dev/null +++ b/scripts/gQJJaxbN83KSgi36.js @@ -0,0 +1,6 @@ +if (!args.totalWoundLoss) return + +const roll = await new Roll("2d10").roll(); +roll.toMessage(this.script.getChatData()); + +args.attacker.applyBasicDamage(Number(roll.total), { loc: "roll" }) \ No newline at end of file diff --git a/scripts/gSDhsSB8573joL64.js b/scripts/gSDhsSB8573joL64.js new file mode 100644 index 0000000..443500a --- /dev/null +++ b/scripts/gSDhsSB8573joL64.js @@ -0,0 +1,10 @@ +if (args.equipped) { + const spell = await game.wfrp4e.utility.findItem("Vindictive Glare", "spell"); + const skillUUID = "Compendium.wfrp4e-core.items.Item.e3McIND4Rrsn5cE6"; + + await this.actor.addEffectItems([skillUUID, spell.uuid], this.effect, [{ + "system.advances.value": 75 - this.actor.system.characteristics.int.value +}, {}]); +} else { + this.effect.deleteCreatedItems(); +} \ No newline at end of file diff --git a/scripts/ga6bQzPuoIiQQrKg.js b/scripts/ga6bQzPuoIiQQrKg.js index 2d3c447..c1ee6aa 100644 --- a/scripts/ga6bQzPuoIiQQrKg.js +++ b/scripts/ga6bQzPuoIiQQrKg.js @@ -1,7 +1,7 @@ if (args.totalWoundLoss > 0) { - let test = await args.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "hard"}}) + let test = await args.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, fields : {difficulty : "hard"}}) await test.roll() if (test.failed) { diff --git a/scripts/gnVpxOeBZpNF4HIF.js b/scripts/gnVpxOeBZpNF4HIF.js deleted file mode 100644 index ea6a793..0000000 --- a/scripts/gnVpxOeBZpNF4HIF.js +++ /dev/null @@ -1,4 +0,0 @@ -if (args.test.result.roll.toString().includes("9") || args.test.result.roll.toString().includes("8")) -{ - args.test.result.fumble = game.i18n.localize("Fumble") -} \ No newline at end of file diff --git a/scripts/goz8yTlMozlsz3uY.js b/scripts/goz8yTlMozlsz3uY.js index a10b559..fce8acc 100644 --- a/scripts/goz8yTlMozlsz3uY.js +++ b/scripts/goz8yTlMozlsz3uY.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Strength'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Strength'; const difficulty = 'easy'; const target = 10; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/gqZLfIr6svrtdwdC.js b/scripts/gqZLfIr6svrtdwdC.js deleted file mode 100644 index 191bf9e..0000000 --- a/scripts/gqZLfIr6svrtdwdC.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.SleightOfHand") && args.skill?.name != game.i18n.localize("NAME.MeleeBrawling") && args.weapon?.system?.weaponGroup?.value != "brawling" \ No newline at end of file diff --git a/scripts/groEX1wJ9l00PkDF.js b/scripts/groEX1wJ9l00PkDF.js index 1efa688..305ae18 100644 --- a/scripts/groEX1wJ9l00PkDF.js +++ b/scripts/groEX1wJ9l00PkDF.js @@ -9,25 +9,24 @@ const target = canvas.scene.tokens.get(targetId); if (turns > 0) { this.effect.setFlag("wfrp4e", "turns", turns); - return this.script.message(`

    ${speaker.alias} continue de s'enrouler autour ${target.name}. Il pourra commencer à écraser dans ${turns} tours.

    `); + return this.script.message(`

    ${speaker.alias} continue de s'enrouler autour de ${target.name}. Il pourra commencer à écraser dans ${turns} tours.

    `); } -if (this.actor.items.find(i => i.type === "extendedTest" && i.name === this.effect.name)) { - this.script.message(`

    ${speaker.alias} peut reprenre son écrasement ${target.name} avec le Test Etendu.

    `); - +if (this.actor.items.find(i => i.type === "extendedTest" && i.name === this.effet.name)) { + this.script.message(`

    ${speaker.alias} peut reprendre l'écrasement de ${target.name} avec le Test Étendu.

    `); return; } const extendedTestData = { - name: this.effect.name, + name: this.effet.name, type: "extendedTest", - img: this.effect.img, + img: this.effet.img, system: { SL: { current: 0, - target: target.actor.system.status.wounds.value + target: target.actor.system.status.Blessures.value }, - test: { + Test: { value: 'Strength' }, completion: { @@ -39,12 +38,12 @@ const extendedTestData = { } }; -const extendedTests = await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effect.id}); +const extendedTests = await this.actor.createEmbeddedDocuments("Item", [extendedTestData], {fromEffect: this.effet.id}); const extendedTest = extendedTests[0]; -this.script.message(`

    ${speaker.alias} a fini de s'enrouler autour de ${target.name}. Il peut maintenant écraser via le Test Etendu @UUID[${extendedTest.uuid}].

    `); +this.script.message(`

    ${speaker.alias} a fini de s'enrouler autour de ${target.name}. Il peut maintenant commencer à écraser via le Test Étendu @UUID[${extendedTest.uuid}].

    `); -let effect = { +let effet = { name: extendedTest.name, img: extendedTest.img, system: { @@ -61,8 +60,8 @@ let effect = { const speaker = ChatMessage.getSpeaker({actor: this.actor}); const targetId = effect.getFlag("wfrp4e", "target"); const target = canvas.scene.tokens.get(targetId); - this.script.message(\`

    ${speaker.alias} écrase ${target.name}. Le bateau et broyé, réduit à une masse de déchets flottants.

    \`); - await effect.delete(); + this.script.message(\`

    ${speaker.alias} a écrasé ${target.name}. Le bateau se brise, réduit à un amas d'épaves.

    \`); + await effet.delete(); `, trigger: "deleteEffect" } diff --git a/scripts/gu72JaTs9GrSiVTd.js b/scripts/gu72JaTs9GrSiVTd.js deleted file mode 100644 index 8d0ad0f..0000000 --- a/scripts/gu72JaTs9GrSiVTd.js +++ /dev/null @@ -1 +0,0 @@ -return !(args.skill?.name == game.i18n.localize("NAME.Haggle") || args.skill?.name == game.i18n.localize("NAME.Gossip")) \ No newline at end of file diff --git a/scripts/gull3qgCahzk2xYu.js b/scripts/gull3qgCahzk2xYu.js new file mode 100644 index 0000000..e3d3869 --- /dev/null +++ b/scripts/gull3qgCahzk2xYu.js @@ -0,0 +1,10 @@ +this.actor.addCondition("fatigued", parseInt(this.effect.sourceTest.result.SL)) + +let test = await this.actor.setupSkill("Calme", {fields : {difficulty: "challenging"}, appendTitle : ` - ${this.effect.name}`}); + +await test.roll(); + +if (test.failed) +{ + this.actor.addCondition("broken"); +} \ No newline at end of file diff --git a/scripts/h0DfPwUUOBjyAHMZ.js b/scripts/h0DfPwUUOBjyAHMZ.js deleted file mode 100644 index 124ecc4..0000000 --- a/scripts/h0DfPwUUOBjyAHMZ.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Perception"); \ No newline at end of file diff --git a/scripts/h1XKoMuVnS0bagRO.js b/scripts/h1XKoMuVnS0bagRO.js deleted file mode 100644 index 6b18992..0000000 --- a/scripts/h1XKoMuVnS0bagRO.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name != game.i18n.localize("NAME.Endurance"); \ No newline at end of file diff --git a/scripts/h4lnexDYAhyQuiR5.js b/scripts/h4lnexDYAhyQuiR5.js new file mode 100644 index 0000000..cefee48 --- /dev/null +++ b/scripts/h4lnexDYAhyQuiR5.js @@ -0,0 +1,9 @@ +if (args.test.isCritical && args.test.weapon.properties?.qualities?.impale) { + let targets = args.test.targets.filter(t => t.system.details.move.value > 1); + if (targets.length > 0) { + targets.forEach(target => { + target.applyEffect({effectData : [this.item.effects.contents[1].convertToApplied()]}) + }); + args.test.result.other.push (`${this.effect.name}: Target Move Reduced by 1`) + } +} \ No newline at end of file diff --git a/scripts/h766UvswLCsxcMow.js b/scripts/h766UvswLCsxcMow.js index 76dbbae..be93438 100644 --- a/scripts/h766UvswLCsxcMow.js +++ b/scripts/h766UvswLCsxcMow.js @@ -10,10 +10,10 @@ let characteristics = { "wp" : 10, "fel" : 10 } -let skills = ["Charm", "Intimidate", "Melee (Basic)"] +let skills = ["Charme", "Intimidation", "Mêlée (Base)"] let skillAdvancements = [7, 60, 7] -let talents = ["Menaçant", "Ombres"] -let traits = ["Distracting"] +let talents = ["Menaçant", "Discret"] +let traits = ["Perturbant"] let trappings = [] let items = []; let spells = []; @@ -32,7 +32,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -48,7 +48,7 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } @@ -74,17 +74,17 @@ for (let trait of traits) if (Number.isNumeric(traitVal)) { - traitItem.system.specification.value = traitName.includes('Weapon','Horns','Tail','Tentacles','Bite') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal; + traitItem.system.specification.value = traitName.includes('Arme','Cornes','Tail','Tentacules','Morsure') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal; traitItem.name = (traitItem.name + ` ${traitSpec ? "("+ traitSpec + ")" : ""}`).trim() } - else + else traitItem.system.specification.value = traitSpec items.push(traitItem) } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -95,13 +95,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } -for (let spell of spells) +for (let spell of spells) { let spellItem = await game.wfrp4e.utility.findItem(spell) if (spellItem) @@ -110,13 +110,13 @@ for (let spell of spells) items.push(spellItem); } - else + else { - ui.notifications.warn(`Impossible de trouver ${spell}`, {permanent : true}) + ui.notifications.warn(`Could not find ${spell}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); \ No newline at end of file diff --git a/scripts/h8JqPMh2mM2uhpxk.js b/scripts/h8JqPMh2mM2uhpxk.js new file mode 100644 index 0000000..50dd52b --- /dev/null +++ b/scripts/h8JqPMh2mM2uhpxk.js @@ -0,0 +1,11 @@ +if (args.item.system.tags.has("armour")) +{ + +for(let key in args.item.system.AP) +{ + if (args.item.system.AP[key]) + { + args.item.system.AP[key] += 2; + } + } +} \ No newline at end of file diff --git a/scripts/hA8PzeiCsHqqlUZm.js b/scripts/hA8PzeiCsHqqlUZm.js index eadf74b..45e40eb 100644 --- a/scripts/hA8PzeiCsHqqlUZm.js +++ b/scripts/hA8PzeiCsHqqlUZm.js @@ -1,2 +1,2 @@ this.actor.createEmbeddedDocuments("ActiveEffect", [game.wfrp4e.config.symptomEffects["nausea"]]) -this.script.scriptMessage(`Gaine de @Condition[Nausée] pour [[1d10]] heures`, {whisper: ChatMessage.getWhisperRecipients("GM")}) \ No newline at end of file +this.script.message(`Recoit l'état @Condition[Nausea] pour [[1d10]] heures`, {whisper: ChatMessage.getWhisperRecipients("GM")}) \ No newline at end of file diff --git a/scripts/hCzxUyO6mjLNIpaM.js b/scripts/hCzxUyO6mjLNIpaM.js index ec27fb5..3de325c 100644 --- a/scripts/hCzxUyO6mjLNIpaM.js +++ b/scripts/hCzxUyO6mjLNIpaM.js @@ -4,4 +4,4 @@ woundsGained = Math.floor(woundsGained / 2) args.attacker.update({ "system.status.wounds.value": args.attacker.status.wounds.value + woundsGained }) -this.script.scriptMessage(`Récupération de ${woundsGained} Blessures`) \ No newline at end of file +this.script.message(`Gains ${woundsGained} Wounds`) \ No newline at end of file diff --git a/scripts/hDC6lroDEPVBituR.js b/scripts/hDC6lroDEPVBituR.js deleted file mode 100644 index 712d884..0000000 --- a/scripts/hDC6lroDEPVBituR.js +++ /dev/null @@ -1,12 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); - -if (test.failed) -{ - this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + 1}) - this.script.scriptMessage("Gagne un Point de Corruption", {whisper : ChatMessage.getWhisperRecipients("GM")}) - if (test.result.roll % 11 == 0 || test.result.roll == 100) - { - this.script.scriptMessage(`Echec total: gain immédiat de 1 @Table[mutatemental]{Mutation Mentale}, et ne peut plus prendre d'Ambition à court-terme pour les [[1d10]] prochaines weeks.`, {whisper : ChatMessage.getWhisperRecipients("GM")}) - } -} \ No newline at end of file diff --git a/scripts/hEDuYAgc1O1zG3Rr.js b/scripts/hEDuYAgc1O1zG3Rr.js new file mode 100644 index 0000000..05dfc8d --- /dev/null +++ b/scripts/hEDuYAgc1O1zG3Rr.js @@ -0,0 +1 @@ +return args.targets[0].actor.appliedEffects.filter(e => e.name == game.i18n.localize("Flying")).length > 0 \ No newline at end of file diff --git a/scripts/hL3JUSY3xMA4zj2Q.js b/scripts/hL3JUSY3xMA4zj2Q.js new file mode 100644 index 0000000..0893281 --- /dev/null +++ b/scripts/hL3JUSY3xMA4zj2Q.js @@ -0,0 +1,18 @@ +if (this.sourceActor.uuid === this.actor.uuid) return; + +const test = await this.actor.setupCharacteristic("t", { + skipTargets: true, + appendTitle: ` — ${this.effet.name}`, + fields: { + difficulty: "difficult" + }, + context: { + success: "Est capable de se relever !", + failure: "Est tombé à terre !", + } +}); + +await Test.roll(); +if (Test.failure) { + await this.actor.addCondition("prone"); +} \ No newline at end of file diff --git a/scripts/hO2CFW9hygGSYuJ2.js b/scripts/hO2CFW9hygGSYuJ2.js new file mode 100644 index 0000000..4ece03c --- /dev/null +++ b/scripts/hO2CFW9hygGSYuJ2.js @@ -0,0 +1 @@ +return args.target?.Species == this.effect.specifier; \ No newline at end of file diff --git a/scripts/hR1qD2kpFHF8JT8h.js b/scripts/hR1qD2kpFHF8JT8h.js deleted file mode 100644 index 88e6c07..0000000 --- a/scripts/hR1qD2kpFHF8JT8h.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == "Langue (Magick)" \ No newline at end of file diff --git a/scripts/hSImyYjL0CENTvXf.js b/scripts/hSImyYjL0CENTvXf.js index e7f7433..d6813de 100644 --- a/scripts/hSImyYjL0CENTvXf.js +++ b/scripts/hSImyYjL0CENTvXf.js @@ -1,12 +1,12 @@ let test = await this.actor.setupSkill("Résistance", {fields : {difficulty : "difficult", appendTitle : ` - ${this.effect.name}`}}); -await test.roll(); -if (test.failed) +await Test.roll(); +if (Test.Échoué) { await this.actor.addCondition("blinded"); } let msg = `` -let armour = args.actor.itemTypes.armour.filter(i => i.system.isMetal && i.system.isEquipped); +let armour = args.actor.itemTags.armour.filter(i => i.system.isMetal && i.system.isEquipped); for(let item of armour) { for(let key in item.system.AP) @@ -15,9 +15,9 @@ for(let item of armour) let damage = Math.floor(AP / 2); await item.system.damageItem(damage, [key]); } - msg += `

    ${item.name} PA divisé par 2

    ` + msg += `

    ${item.name} PA réduit de moitié

    ` } if (msg) { - this.script.scriptMessage(msg, {speaker : {alias : args.actor.name}}); + this.script.message(msg, {speaker : {alias : args.actor.name}}); } \ No newline at end of file diff --git a/scripts/hTsnYKgw0kK10PiC.js b/scripts/hTsnYKgw0kK10PiC.js new file mode 100644 index 0000000..32b8e48 --- /dev/null +++ b/scripts/hTsnYKgw0kK10PiC.js @@ -0,0 +1 @@ +args.fields.modifier += 5 \ No newline at end of file diff --git a/scripts/hYNWp75ggWSTht55.js b/scripts/hYNWp75ggWSTht55.js index 0fc323a..ec4bf2b 100644 --- a/scripts/hYNWp75ggWSTht55.js +++ b/scripts/hYNWp75ggWSTht55.js @@ -1,7 +1,7 @@ if (args.test.result.hitloc.value != "head" && args.test.result.critical) { - game.wfrp4e.utility.sleep(200).then(() => { - this.script.scriptMessage("Peut effectuer un jet sur the @Table[crithead]{Coups Critiques à la Tête} au lieu de la localisation normale") + warhammer.utility.sleep(200).then(() => { + this.script.message("Tirage possible sur la table @Table[crithead]{Coups critiques à la tête} au lieu de de la localisation normale.") }) } \ No newline at end of file diff --git a/scripts/hadXFC43VKyrE9jC.js b/scripts/hadXFC43VKyrE9jC.js new file mode 100644 index 0000000..540f250 --- /dev/null +++ b/scripts/hadXFC43VKyrE9jC.js @@ -0,0 +1 @@ +this.actor.addEffectItems(["Compendium.wfrp4e-core.items.Item.eowbsW6oHGSNJmxV", "Compendium.wfrp4e-core.items.Item.eowbsW6oHGSNJmxV"], this.effect); \ No newline at end of file diff --git a/scripts/93K85NnVwjVNXlZq.js b/scripts/hg89FU1NAp8tIsgO.js similarity index 94% rename from scripts/93K85NnVwjVNXlZq.js rename to scripts/hg89FU1NAp8tIsgO.js index 3b0ffe3..f1e37dc 100644 --- a/scripts/93K85NnVwjVNXlZq.js +++ b/scripts/hg89FU1NAp8tIsgO.js @@ -1 +1 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Trade")); \ No newline at end of file +return !args.skill?.name.includes(game.i18n.localize("NAME.Trade")) \ No newline at end of file diff --git a/scripts/hhCs5VBKx50S5IsY.js b/scripts/hhCs5VBKx50S5IsY.js index d3aa69e..11af677 100644 --- a/scripts/hhCs5VBKx50S5IsY.js +++ b/scripts/hhCs5VBKx50S5IsY.js @@ -1 +1 @@ -return !args.options.mutate \ No newline at end of file +return !args.context.mutate \ No newline at end of file diff --git a/scripts/hhv7PrRdlf9sfC82.js b/scripts/hhv7PrRdlf9sfC82.js index 6b327bb..beea2d3 100644 --- a/scripts/hhv7PrRdlf9sfC82.js +++ b/scripts/hhv7PrRdlf9sfC82.js @@ -12,8 +12,8 @@ let characteristics = { } let skills = ["Calme", "Esquive"] let skillAdvancements = [10, 10] -let talents = ["Combat Reflexes"] -let trappings = ["Leather Jack", "Leather Skullcap", "Leather Leggings", "Shield"] +let talents = ["Réflexes de Combat"] +let trappings = ["Veste en cuir", "Casque en cuir", "Jambières en cuir", "Bouclier"] let items = [] let updateObj = this.actor.toObject(); @@ -30,7 +30,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,7 +63,7 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } diff --git a/scripts/hlHKeFWrOA8CsLr9.js b/scripts/hlHKeFWrOA8CsLr9.js index 25e12e8..764c272 100644 --- a/scripts/hlHKeFWrOA8CsLr9.js +++ b/scripts/hlHKeFWrOA8CsLr9.js @@ -1,2 +1,2 @@ -args.data.canReverse = true; -args.options.pilot = true; \ No newline at end of file +args.data.reversal = {allowed : true, if: "success"}; +args.context.pilot = true; \ No newline at end of file diff --git a/scripts/hmk8zV1LTElHUI8A.js b/scripts/hmk8zV1LTElHUI8A.js index f08d4c7..8aea6a1 100644 --- a/scripts/hmk8zV1LTElHUI8A.js +++ b/scripts/hmk8zV1LTElHUI8A.js @@ -1,8 +1,8 @@ -let msg = `${this.actor.prototypeToken.name} perd 1 Blessure.
    ` +let msg = `${this.actor.prototypeToken.name} loses 1 Wound.
    ` if (this.actor.status.wounds.value <= 1) { - msg += `${this.actor.prototypeToken.name} tombe Inconscient.
    ` + msg += `${this.actor.prototypeToken.name} goes unconscious.
    ` await this.actor.addCondition("unconscious") } - this.script.scriptMessage(msg) + this.script.message(msg) this.actor.modifyWounds(-1) \ No newline at end of file diff --git a/scripts/hnsmzvcuiUYB065I.js b/scripts/hnsmzvcuiUYB065I.js deleted file mode 100644 index 2ee0284..0000000 --- a/scripts/hnsmzvcuiUYB065I.js +++ /dev/null @@ -1 +0,0 @@ -this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {appendTitle: ` - ${this.effect.name}`, context: { failure : "Ne peut fuir les combats"}}).then(test => test.roll()) \ No newline at end of file diff --git a/scripts/hpbraeEbjkXnmD75.js b/scripts/hpbraeEbjkXnmD75.js new file mode 100644 index 0000000..244c578 --- /dev/null +++ b/scripts/hpbraeEbjkXnmD75.js @@ -0,0 +1,2 @@ +args.fields.hitLocation = "lLeg" +args.fields.modifier += 20; \ No newline at end of file diff --git a/scripts/hpwJRAhCsXTp9bd9.js b/scripts/hpwJRAhCsXTp9bd9.js index c9abff6..4be351c 100644 --- a/scripts/hpwJRAhCsXTp9bd9.js +++ b/scripts/hpwJRAhCsXTp9bd9.js @@ -1,7 +1,7 @@ let choice1 = [ { type : "skill", - name : "Melee (Basic)", + name : "Corps à corps (Base)", diff : { system : { advances : { @@ -14,7 +14,7 @@ let choice1 = [ let choice2 = [ { type : "skill", - name : "Melee (Polearm)", + name : "Corps à corps (Armes d'hast)", diff : { system : { advances : { @@ -28,7 +28,7 @@ let choice2 = [ let choice3 = [ { type : "skill", - name : "Melee (Two-Handed)", + name : "Corps à corps (A deux mains)", diff : { system : { advances : { @@ -39,45 +39,48 @@ let choice3 = [ } ] -let choice = await Dialog.wait({ - title : "Choice", - content : +let choice = await foundry.applications.api.DialogV2.wait({ + window : {title : "Choix"}, + content : `

    - Select your choice + Sélectionnez votre choix

      -
    1. Melee (Basic)
    2. -
    3. Melee (Polearm)
    4. -
    5. Melee (Two-Handed)
    6. -
    +
  • Corps à corps (Base)
  • +
  • Corps à corps (Armes d'hast)
  • +
  • Corps à corps (A deux mains)
  • + `, - buttons : { - 1 : { - label : "Basic", + buttons : [ + { + label : "Base", + action : "basic", callback : () => { return choice1 } }, - 2 : { - label : "Polearm", + { + label : "Armesd'hast", + action : "polearm", callback : () => { return choice2 } }, - 3 : { - label : "Two-Handed", + { + label : "A deux mains", + action : "two-handed", callback : () => { return choice3 } } - } + ] }) let updateObj = this.actor.toObject(); let items = [] for (let c of choice) { - let existing + let existing if (c.type == "skill") { existing = updateObj.items.find(i => i.name == c.name && i.type == c.type) diff --git a/scripts/hqMwzPozAVTzoCxa.js b/scripts/hqMwzPozAVTzoCxa.js new file mode 100644 index 0000000..791497d --- /dev/null +++ b/scripts/hqMwzPozAVTzoCxa.js @@ -0,0 +1,10 @@ +if ((args.test.result.roll % 11 == 0 || args.test.result.roll == 100) && args.test.failed) +{ + delete args.test.result.misfire; + args.test.result.tables.misfire = { + label : "Raté", + class : "fumble-roll", + modifier : 0, + key : "torpedo" + } +} \ No newline at end of file diff --git a/scripts/hwOZxgt7e65iWvYz.js b/scripts/hwOZxgt7e65iWvYz.js index b127c0e..24a892f 100644 --- a/scripts/hwOZxgt7e65iWvYz.js +++ b/scripts/hwOZxgt7e65iWvYz.js @@ -4,5 +4,5 @@ if (test.failed) { let damage = this.effect.sourceTest.result.damage - this.script.scriptMessage(await this.actor.applyBasicDamage(damage, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})) + this.script.message(await this.actor.applyBasicDamage(damage, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})) } \ No newline at end of file diff --git a/scripts/hxmwtw5zAHyS2upG.js b/scripts/hxmwtw5zAHyS2upG.js index 49a56fd..b4ac6f9 100644 --- a/scripts/hxmwtw5zAHyS2upG.js +++ b/scripts/hxmwtw5zAHyS2upG.js @@ -1 +1 @@ -this.script.scriptMessage(await game.wfrp4e.tables.formatChatRoll("giftofthebeast")) \ No newline at end of file +this.script.message(await game.wfrp4e.tables.formatChatRoll("giftofthebeast")) \ No newline at end of file diff --git a/scripts/i5AN97A7IOeygEFA.js b/scripts/i5AN97A7IOeygEFA.js index e94c9dc..2cf2340 100644 --- a/scripts/i5AN97A7IOeygEFA.js +++ b/scripts/i5AN97A7IOeygEFA.js @@ -1,7 +1,7 @@ if (args.applyAP && args.modifiers.ap.metal) { args.modifiers.ap.ignored += args.modifiers.ap.metal - args.modifiers.other.push({value : args.modifiers.ap.metal, label : this.effect.name, details : "Ajout les PA Métalliques aux Dommages" }) - args.modifiers.ap.details.push("" + this.effect.name + ": Ignore le métal (" + args.modifiers.ap.metal + ")"); + args.modifiers.other.push({value : args.modifiers.ap.metal, label : this.effect.name, details : "Ajouter PA de métal aux Dégâts" }) + args.modifiers.ap.details.push("" + this.effect.name + ": Ignorer Métal (" + args.modifiers.ap.metal + ")"); args.modifiers.ap.metal = 0 } \ No newline at end of file diff --git a/scripts/i93PGV1lDSdi3BJu.js b/scripts/i93PGV1lDSdi3BJu.js new file mode 100644 index 0000000..00e202b --- /dev/null +++ b/scripts/i93PGV1lDSdi3BJu.js @@ -0,0 +1,7 @@ +let effectsToDisable = this.actor.items.filter(i => i.type == "disease").reduce((effects, item) => effects.concat(item.effects.contents), []).concat(this.actor.effects.contents.filter(i => i.isCondition)).filter(i => i.active); + +if (effectsToDisable.length) +{ + this.script.notification(`Disabling ${effectsToDisable.map(i => i.name).join(", ")}.`); + effectsToDisable.forEach(i => i.update({disabled : true})) +} \ No newline at end of file diff --git a/scripts/iAo3wxMLA64rsKjj.js b/scripts/iAo3wxMLA64rsKjj.js index 1388122..2ad4cc1 100644 --- a/scripts/iAo3wxMLA64rsKjj.js +++ b/scripts/iAo3wxMLA64rsKjj.js @@ -1 +1 @@ -this.script.scriptMessage(await game.wfrp4e.tables.formatChatRoll("skavenbrew")) \ No newline at end of file +this.script.message(await game.wfrp4e.tables.formatChatRoll("skavenbrew")) \ No newline at end of file diff --git a/scripts/iH9o7t8vGDn6pm1d.js b/scripts/iH9o7t8vGDn6pm1d.js new file mode 100644 index 0000000..4cb3518 --- /dev/null +++ b/scripts/iH9o7t8vGDn6pm1d.js @@ -0,0 +1,13 @@ +if (args.test.result.misfire && args.test.result.roll % 2 == 1 && args.test.result.roll % 11 == 0) { + delete args.test.result.misfire +} +else if (args.test.result.misfire) +{ + delete args.test.result.misfire; + args.test.result.tables.misfire = { + label : "Raté", + class : "fumble-roll", + modifier : 0, + key : "artillery-misfires" + } +} \ No newline at end of file diff --git a/scripts/iLpq4yCFN6YACrYA.js b/scripts/iLpq4yCFN6YACrYA.js index 2410b6e..0b552f9 100644 --- a/scripts/iLpq4yCFN6YACrYA.js +++ b/scripts/iLpq4yCFN6YACrYA.js @@ -1,4 +1,4 @@ if (args.test.result.castOutcome == "success") { - this.script.scriptMessage(await game.wfrp4e.tables.formatChatRoll("demonic-mien")) + this.script.message(await game.wfrp4e.tables.formatChatRoll("demonic-mien")) } \ No newline at end of file diff --git a/scripts/iM6JLF8jDXMViReZ.js b/scripts/iM6JLF8jDXMViReZ.js deleted file mode 100644 index 5bd9ae9..0000000 --- a/scripts/iM6JLF8jDXMViReZ.js +++ /dev/null @@ -1 +0,0 @@ -return !["Crochetage", "Escamotage", "Focalisation (Ulgu)"].includes(args.skill?.name) \ No newline at end of file diff --git a/scripts/iMu8BZ7eHMAbPEO1.js b/scripts/iMu8BZ7eHMAbPEO1.js index 73904f4..64e8086 100644 --- a/scripts/iMu8BZ7eHMAbPEO1.js +++ b/scripts/iMu8BZ7eHMAbPEO1.js @@ -1,5 +1,5 @@ let healed = args.totalWoundLoss -this.script.scriptMessage(`this.actor.prototypeToken.name Guérison de ${healed} Blessures`); +this.script.message(`this.actor.prototypeToken.name healed ${healed} Wounds`); this.actor.modifyWounds(healed) \ No newline at end of file diff --git a/scripts/iNAQJa5HyaEckknX.js b/scripts/iNAQJa5HyaEckknX.js index 34aa1cd..e1c3e06 100644 --- a/scripts/iNAQJa5HyaEckknX.js +++ b/scripts/iNAQJa5HyaEckknX.js @@ -1,8 +1,8 @@ -let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); +let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : ` - ${this.effet.name}`}) +await Test.roll(); -let opposedResult = test.opposedMessages[0]?.getOppose()?.resultMessage?.getOpposedTest()?.result +let opposedResult = Test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result if (opposedResult?.winner == "attacker") { @@ -10,9 +10,7 @@ if (opposedResult?.winner == "attacker") if (spells.length) { let chosen = spells[Math.floor(CONFIG.Dice.randomUniform() * spells.length)] - this.script.scriptMessage(`Ne se rappelle plus du sort ${chosen.name}`) - chosen.update({name : chosen.name += " (LOST)"}) + this.script.message(`Perd l'accès à ${chosen.name}`) + chosen.update({name : chosen.name += " (PERDU)"}) } } - - diff --git a/scripts/iO2hCDwyQ7v4qrOI.js b/scripts/iO2hCDwyQ7v4qrOI.js index 9de633f..2adc849 100644 --- a/scripts/iO2hCDwyQ7v4qrOI.js +++ b/scripts/iO2hCDwyQ7v4qrOI.js @@ -3,7 +3,7 @@ if (args.test.options.staunchBleeding) { let staunch = ~~args.test.result.SL + 1 if (args.test.options.fieldDressing && args.test.result.reversed) staunch = Math.min(1, Number(args.test.result.SL)) + 1 - args.test.result.other.push(`${this.actor.name} supprime ${staunch} Etats Hémorragiques du patient.`) + args.test.result.other.push(`${this.actor.name} guérit ${staunch} états Hémmoragie du patient.`) } else if (this.actor.characteristics.int.bonus + args.test.result.SL < 0) args.test.result.other.push(`Le patient contracte une @UUID[Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg]{Infection Mineure}.`) diff --git a/scripts/iT0h3VZLEBQnn5Bx.js b/scripts/iT0h3VZLEBQnn5Bx.js deleted file mode 100644 index eda68c1..0000000 --- a/scripts/iT0h3VZLEBQnn5Bx.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Charm") && args.skill?.name != game.i18n.localize("NAME.Gossip") && args.skill?.name != game.i18n.localize("NAME.ConsumeAlcohol"); \ No newline at end of file diff --git a/scripts/iT3C15fMyQrj1RmG.js b/scripts/iT3C15fMyQrj1RmG.js deleted file mode 100644 index a818f06..0000000 --- a/scripts/iT3C15fMyQrj1RmG.js +++ /dev/null @@ -1,8 +0,0 @@ -if (this.actor.has("Mort-vivant") && this.actor.has("Ethereal")) -{ - this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : " - " + this.effect.name}).then(async test => { - await test.roll(); - if(test.failed) - this.actor.addCondition("stunned") - }) -} \ No newline at end of file diff --git a/scripts/iX0ctHYHg12pjaCU.js b/scripts/iX0ctHYHg12pjaCU.js index 6e71555..26da253 100644 --- a/scripts/iX0ctHYHg12pjaCU.js +++ b/scripts/iX0ctHYHg12pjaCU.js @@ -7,9 +7,9 @@ if (result.object.documentId && result.object.documentCollection) { let data = item.toObject(); // Some items need sourceTest for their effects - setProperty(data, "flags.wfrp4e.sourceTest", this.effect.sourceTest); + foundry.utils.setProperty(data, "flags.wfrp4e.sourceTest", this.effect.sourceTest); await this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}); } } -this.script.scriptMessage(game.wfrp4e.tables.formatChatRoll("gift-of-slaanesh", {lookup : result.roll, hideDSN: true})); \ No newline at end of file +this.script.message(game.wfrp4e.tables.formatChatRoll("gift-of-slaanesh", {lookup : result.roll, hideDSN: true})); \ No newline at end of file diff --git a/scripts/id9ZdkERMZnZTWXt.js b/scripts/id9ZdkERMZnZTWXt.js index 9e2f8af..226b37d 100644 --- a/scripts/id9ZdkERMZnZTWXt.js +++ b/scripts/id9ZdkERMZnZTWXt.js @@ -1,7 +1,7 @@ if (args.extendedTest?.getFlag("wfrp4e", "fear")) { - this.script.scriptNotification("Immunisé à la Peur"); + this.script.notification("Immunisté à la Peur"); args.extendedTest.delete(); args.abort = true; } -return args.options.terror || args.extendedTest?.getFlag("wfrp4e", "fear") \ No newline at end of file +return args.context.terror || args.extendedTest?.getFlag("wfrp4e", "fear") \ No newline at end of file diff --git a/scripts/ij3BLXzNk7eZ3V95.js b/scripts/ij3BLXzNk7eZ3V95.js new file mode 100644 index 0000000..d1156d4 --- /dev/null +++ b/scripts/ij3BLXzNk7eZ3V95.js @@ -0,0 +1 @@ +return !["s","t","wp","fel"].includes(args.fields.characteristic) \ No newline at end of file diff --git a/scripts/imKVsCy8rya2gkwO.js b/scripts/imKVsCy8rya2gkwO.js index 5e2f22d..519bcd5 100644 --- a/scripts/imKVsCy8rya2gkwO.js +++ b/scripts/imKVsCy8rya2gkwO.js @@ -1,18 +1,18 @@ // Any Characteristic penalties due to failed Consume Alcohol Tests -// or the state of being Stinking Drunk are eliminated. +// or the state of being Stinking Drunk are eliminated. await this.actor.removeSystemEffect("consumealcohol1") await this.actor.removeSystemEffect("consumealcohol2") await this.actor.removeSystemEffect("consumealcohol3") await this.actor.removeSystemEffect("stinkingdrunk1") -// The drinker is thereafter Fatigued -// for a number of hours equal to 10 minus their Toughness Bonus — +// The drinker is thereafter Fatigued +// for a number of hours equal to 10 minus their Toughness Bonus — // nothing but time and rest can eliminate this penalty. await this.actor.addCondition("fatigued") const duration = 10 - parseInt(this.actor.system.characteristics.t.bonus) this.effect.updateSource({"duration.rounds" : duration}); -this.script.scriptMessage(`

    ${this.actor.prototypeToken.name} ne souffre des pénalités dues à l'alcool et reçoit 1 état Fatigué pour ${duration} heures.

    `, +this.script.message(`

    ${this.actor.prototypeToken.name} n'a plus de pénalités liées à l'alcool et gagne l'état Extenué pendant ${duration} heures.

    `, { - whisper: ChatMessage.getWhisperRecipients("GM"), - blind: true -}) \ No newline at end of file + whisper: ChatMessage.getWhisperRecipients("GM"), + blind: true +}) \ No newline at end of file diff --git a/scripts/iuSoKntfJ4eAPafQ.js b/scripts/iuSoKntfJ4eAPafQ.js index 02bb0d1..e01402f 100644 --- a/scripts/iuSoKntfJ4eAPafQ.js +++ b/scripts/iuSoKntfJ4eAPafQ.js @@ -1,8 +1,8 @@ -let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts"); -spells = spells.filter(s => ["feu", "cieux", "bêtes", "ombres", "lumière", "vie", "mort", "métal"].includes(s.system.lore.value)).sort((a, b) => a.system.lore.value > b.system.lore.value ? 1 : -1) +let spells = await warhammer.utility.findAllItems("spell", "Chargement des Sorts", true, ["system.lore.value"]) +spells = spells.filter(s => ["fire", "heavens", "beasts", "shadow", "light", "life", "death", "metal"].includes(s.system.lore.value)).sort((a, b) => a.system.lore.value > b.system.lore.value ? 1 : -1) -let choice = await ItemDialog.create(spells, 1, "Choisir un sort"); +let choice = await ItemDialog.create(spells, 1, {text : "Choisissez un Sort", title : this.effect.name}); if (choice[0]) { - this.actor.createEmbeddedDocuments("Item", choice, {fromEffect: this.effect.id}) + this.actor.addEffectItems(choice.map(i => i.uuid), this.effect) } diff --git a/scripts/iuoVkjFdL1rHdbqR.js b/scripts/iuoVkjFdL1rHdbqR.js new file mode 100644 index 0000000..8e5094c --- /dev/null +++ b/scripts/iuoVkjFdL1rHdbqR.js @@ -0,0 +1 @@ +return this.item.equipped.value && ["weapon", "cast"].includes(args.type) \ No newline at end of file diff --git a/scripts/ivxpmCKu3pEMG05c.js b/scripts/ivxpmCKu3pEMG05c.js new file mode 100644 index 0000000..2ec7205 --- /dev/null +++ b/scripts/ivxpmCKu3pEMG05c.js @@ -0,0 +1,5 @@ +if (this.actor.inCombat) +{ + this.actor.characteristics.s.bonus += 2 + this.actor.characteristics.s.calculationBonusModifier -= 2 +} \ No newline at end of file diff --git a/scripts/j98hvy6r9G2Vjmid.js b/scripts/j98hvy6r9G2Vjmid.js index 458e65b..e493f06 100644 --- a/scripts/j98hvy6r9G2Vjmid.js +++ b/scripts/j98hvy6r9G2Vjmid.js @@ -1,12 +1,12 @@ if (args.totalWoundLoss > 0) { args.opposedTest.result.other.push( - `@Corruption[minor]{Exposition Mineure à la Corruption}` + `@Corruption[minor]{Minor Exposure to Corruption}` ) - this.script.scriptMessage( + this.script.message( `${this.effect.name}: - @Corruption[minor]{Exposition Mineure à la Corruption}
    - ${args.actor.prototypeToken.name} doit réaliser un Test - Accessible (+20%) de Corruption (Mineur)`, + @Corruption[minor]{Minor Exposure to Corruption}
    + ${args.actor.prototypeToken.name} must take an + Average (+20%) Corruption (Minor) Test`, {whisper: ChatMessage.getWhisperRecipients("GM")}) } \ No newline at end of file diff --git a/scripts/jFKnf2UdoxAQx76R.js b/scripts/jFKnf2UdoxAQx76R.js new file mode 100644 index 0000000..9f880cb --- /dev/null +++ b/scripts/jFKnf2UdoxAQx76R.js @@ -0,0 +1,8 @@ +if (args.equipped) +{ + this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.URwIDtInCsxOoGqM", this.effect); +} +else +{ + this.effect.deleteCreatedItems(); +} \ No newline at end of file diff --git a/scripts/jFwema0iwzBphxie.js b/scripts/jFwema0iwzBphxie.js index b145f1b..e1f0f87 100644 --- a/scripts/jFwema0iwzBphxie.js +++ b/scripts/jFwema0iwzBphxie.js @@ -6,4 +6,4 @@ args.attacker.update({"system.status.wounds.value" : args.attacker.system.status args.actor.addCondition("fatigued") args.attacker.hasCondition("fatigued")?.delete(); -this.script.scriptMessage(`${args.attacker.prototypeToken.name} guéri de ${woundsGained} Blessures`); \ No newline at end of file +this.script.message(`${args.attacker.prototypeToken.name} gains ${woundsGained} Wounds`); \ No newline at end of file diff --git a/scripts/jGDk7avWFSnyFoql.js b/scripts/jGDk7avWFSnyFoql.js index 1509a3a..32ddc0c 100644 --- a/scripts/jGDk7avWFSnyFoql.js +++ b/scripts/jGDk7avWFSnyFoql.js @@ -5,5 +5,5 @@ if (broken && !broken.getFlag("wfrp4e", "blasted-mind") && !this.actor.has(item. { await broken.delete(); this.actor.createEmbeddedDocuments("Item", [item], {fromEffect: this.effect.id}) - this.script.scriptNotification(`Suppression de ${broken.name}, ajout de ${item.name} (${Math.ceil(CONFIG.Dice.randomUniform() * 10)} Rounds)`) + this.script.notification(`Removed ${broken.name}, added ${item.name} (${Math.ceil(CONFIG.Dice.randomUniform() * 10)} Rounds)`) } \ No newline at end of file diff --git a/scripts/jHgxpe6TJDlP3oTn.js b/scripts/jHgxpe6TJDlP3oTn.js index fb88ec0..383fa93 100644 --- a/scripts/jHgxpe6TJDlP3oTn.js +++ b/scripts/jHgxpe6TJDlP3oTn.js @@ -1,9 +1,9 @@ -let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts"); +let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts", true, ["system.lore.value"]) spells = spells.filter(s => ["slaanesh"].includes(s.system.lore.value)) -let choice = await ItemDialog.create(spells, 1, "Choisir un sort"); +let choice = await ItemDialog.create(spells, 1, {text : "Choisissez un Sort", title : this.effect.name}); if (choice[0]) { this.item.updateSource({name : this.item.name + ` (${choice[0].name})`}) - this.actor.createEmbeddedDocuments("Item", choice, {fromEffect: this.effect.id}) + this.actor.addEffectItems(choice.map(i => i.uuid), this.effect) } diff --git a/scripts/jOCLEsjNzERyVLsP.js b/scripts/jOCLEsjNzERyVLsP.js new file mode 100644 index 0000000..3138bf2 --- /dev/null +++ b/scripts/jOCLEsjNzERyVLsP.js @@ -0,0 +1,5 @@ +if(args.test.result.majormis) +{ + args.test.result.nullmajormis = game.i18n.localize("ROLL.MajorMis") + args.test.minormis = game.i18n.localize("ROLL.MinorMis") +} \ No newline at end of file diff --git a/scripts/jOSCsBRUO117spv8.js b/scripts/jOSCsBRUO117spv8.js new file mode 100644 index 0000000..4ecdc9e --- /dev/null +++ b/scripts/jOSCsBRUO117spv8.js @@ -0,0 +1 @@ +args.abort = `Only gunpowder or artillery weapons can attack targets within the ${this.effect.name}`; \ No newline at end of file diff --git a/scripts/jObJanFoev4N6ZRv.js b/scripts/jObJanFoev4N6ZRv.js index 5697901..4580414 100644 --- a/scripts/jObJanFoev4N6ZRv.js +++ b/scripts/jObJanFoev4N6ZRv.js @@ -1,2 +1,2 @@ if (!args.opposedTest.attackerTest.item?.system?.isMagical) - args.abort = `${this.effect.name}: Ignoré` \ No newline at end of file + args.abort = `${this.effect.name}: Ignored` \ No newline at end of file diff --git a/scripts/jOm7RxGFm1y6mCpN.js b/scripts/jOm7RxGFm1y6mCpN.js index 4d3b7dd..522668e 100644 --- a/scripts/jOm7RxGFm1y6mCpN.js +++ b/scripts/jOm7RxGFm1y6mCpN.js @@ -1 +1 @@ -return args.options.crewTest.name.includes("Batten Down"); \ No newline at end of file +return args.context.crewTest.name.includes("Batten Down"); \ No newline at end of file diff --git a/scripts/jRSgPhpfN7MH7TTp.js b/scripts/jRSgPhpfN7MH7TTp.js deleted file mode 100644 index 8614c9c..0000000 --- a/scripts/jRSgPhpfN7MH7TTp.js +++ /dev/null @@ -1,16 +0,0 @@ -if (args.totalWoundLoss > 0) -{ - let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, context: { failure: "1 Poisoned Condition Gained", success: "Resisted Poisoned Condition" } }) - await test.roll(); - if (test.failed) - { - args.actor.addCondition("poisoned"); - if (args.actor.system.status.wounds.value - args.totalWoundLoss <= 0) - { - args.actor.addCondition("unconscious") - } - } -} - - // else - // this.actor.setupCharacteristic("t", { context: { failure: "1 @Condition[Poisoned] Condition Gained", success: "Resisted @Condition[Poisoned] Condition" } }).then(testCallback) diff --git a/scripts/jW87rmQLtROdVEhW.js b/scripts/jW87rmQLtROdVEhW.js index 18331f3..125f551 100644 --- a/scripts/jW87rmQLtROdVEhW.js +++ b/scripts/jW87rmQLtROdVEhW.js @@ -1,5 +1,5 @@ if (["orc", "ork", "goblin", "hobgoblin", "snotling", "greenskin"].includes(args.opposedTest.defender.details.species.value.toLowerCase())) { args.addImpact = true - args.opposedTest.result.other.push("Rune de Banissement de Gobelin: Ajout d'Impact") + args.opposedTest.result.other.push("Rune of Goblin Bane: Impact Ajouté") } \ No newline at end of file diff --git a/scripts/jXbrIGxznqf1SNxZ.js b/scripts/jXbrIGxznqf1SNxZ.js index 131e6cd..8083aa3 100644 --- a/scripts/jXbrIGxznqf1SNxZ.js +++ b/scripts/jXbrIGxznqf1SNxZ.js @@ -1,3 +1,3 @@ const speaker = ChatMessage.getSpeaker({actor: this.actor}); -this.script.scriptMessage(`

    ${speaker.alias} est immergé dans la Elémentair de Mer et subit la @UUID[Compendium.wfrp4e-core.journals.JournalEntry.NS3YGlJQxwTggjRX.JournalEntryPage.WCivInLZrqEtZzF4#drowning-and-suffocation]{Suffocation}

    Il peut essayer de s'échapperen s"évadant de l'Etat @Condition[Entravé} comme si il était @UUID[Compendium.wfrp4e-core.journals.JournalEntry.NS3YGlJQxwTggjRX.JournalEntryPage.wmA76Q2zJJ9HrkvA#grappling]{Grappled} par l'Elémentaire de Mer, en réalisant un Test Opposé de Force contre une Force de 59.

    `); \ No newline at end of file +this.script.message(`

    ${speaker.alias} is Immersed within a Sea Elemental and suffers from @UUID[Compendium.wfrp4e-core.journals.JournalEntry.NS3YGlJQxwTggjRX.JournalEntryPage.WCivInLZrqEtZzF4#drowning-and-suffocation]{Suffocation}

    They may attempt to escape by freeing themselves from the @Condition[Entangled} Condition as if they were @UUID[Compendium.wfrp4e-core.journals.JournalEntry.NS3YGlJQxwTggjRX.JournalEntryPage.wmA76Q2zJJ9HrkvA#grappling]{Grappled} by the Sea Elemental, making an Opposed Strength Test against its Strength of 59.

    `); \ No newline at end of file diff --git a/scripts/jb1ouw0eIBVy3Wwg.js b/scripts/jb1ouw0eIBVy3Wwg.js new file mode 100644 index 0000000..6d2e833 --- /dev/null +++ b/scripts/jb1ouw0eIBVy3Wwg.js @@ -0,0 +1,9 @@ +if ( + this.item == args.attackerTest.item + && args.attackerTest.succeeded + && args.defenderTest.item?.system?.attackType == 'melee' + && (args.defenderTest.item.properties.qualities?.magical || args.defenderTest.item.properties.unusedQualities?.magical) +) +{ + args.opposedTest.result.other.push(`${this.effect.name}: destroys magical ${args.defenderTest.item.name}.`) +} \ No newline at end of file diff --git a/scripts/jdS2u1tQPYeO55WI.js b/scripts/jdS2u1tQPYeO55WI.js index 16864c3..e2bd213 100644 --- a/scripts/jdS2u1tQPYeO55WI.js +++ b/scripts/jdS2u1tQPYeO55WI.js @@ -8,12 +8,12 @@ if (type == "cold") if (type == "corrosion") { - let damageItems = await Dialog.confirm({title : this.item.name, content : `

    Damage all Items carried?

    `}) + let damageItems = await foundry.applications.api.DialogV2.confirm({window: {title : this.item.name}, content : `

    Endommage tous les objets portés ?

    `}) if (damageItems) { let msg = `` let weapons = args.actor.itemTypes.weapon.filter(i => i.isEquipped); - let armour = args.actor.itemTypes.armour.filter(i => i.isEquipped); + let armour = args.actor.itemTags.armour.filter(i => i.isEquipped); let trappings = args.actor.itemTypes.trapping.filter(i => i.isEquipped); for(let item of weapons) { @@ -21,21 +21,21 @@ if (type == "corrosion") { await item.system.damageItem(1, "shield"); } - else + else { await item.system.damageItem(1); } - msg += `

    ${item.name} damage by 1

    ` + msg += `

    ${item.name} endommagé de 1

    ` } for(let item of armour) { await item.system.damageItem(1); - msg += `

    ${item.name} damage by 1

    ` + msg += `

    ${item.name} endommagé de 1

    ` } for(let item of trappings) { await item.system.damageItem(1); - msg += `

    ${item.name} damage by 1

    ` + msg += `

    ${item.name} endommagé de 1

    ` } if (msg) { @@ -62,5 +62,5 @@ if (type == "poison") if (type == "warpfire") { await this.actor.corruptionDialog("moderate") - this.actor.applyEffect({effectUuids : this.item.effects.getName("Warpfire").uuid}) + this.actor.applyEffect({effectUuids : this.item.effects.getName("Warpfire").uuid}) } \ No newline at end of file diff --git a/scripts/jgO1Kf60Ctt6R0qO.js b/scripts/jgO1Kf60Ctt6R0qO.js deleted file mode 100644 index 5fb4283..0000000 --- a/scripts/jgO1Kf60Ctt6R0qO.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name != game.i18n.localize("NAME.Leadership") \ No newline at end of file diff --git a/scripts/jpcU8FFWSlQ3gD0L.js b/scripts/jpcU8FFWSlQ3gD0L.js deleted file mode 100644 index dfb5b37..0000000 --- a/scripts/jpcU8FFWSlQ3gD0L.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name?.includes(game.i18n.localize("NAME.Trade")) \ No newline at end of file diff --git a/scripts/jsgLEVYvMieyYT6L.js b/scripts/jsgLEVYvMieyYT6L.js index 061e859..6cda669 100644 --- a/scripts/jsgLEVYvMieyYT6L.js +++ b/scripts/jsgLEVYvMieyYT6L.js @@ -1,18 +1,18 @@ let tokenImg = ""; // Put path to token image here, inbetween the quotation marks if (tokenImg) { - if (this.effect.getFlag("wfrp4e", "transformed")) + if (this.effet.getFlag("wfrp4e", "transformed")) { await this.effect.setFlag("wfrp4e", "transformed", false); - this.actor.getActiveTokens().forEach(t => t.document.update({texture : {src: this.actor.prototypeToken.texture.src}})); + this.actor.getActiveTokens().forEach(t => t.document.update({texture : {src: this.actor.prototypeToken.texture.src}})); } - else + else { await this.effect.setFlag("wfrp4e", "transformed", true); this.actor.getActiveTokens().forEach(t => t.document.update({texture : {src: tokenImg}})); } } -else +else { - this.script.scriptNotification("Aucune image de Token configurée. Le chemin du token doit être configuré dans la première ligne de ce script.", "error"); + this.script.notification("Aucun chemin d'image de token configuré. Le chemin de l'image doit être défini dans la première ligne de ce script.", "error"); } \ No newline at end of file diff --git a/scripts/U9xh2wriSqCosugW.js b/scripts/jvNuIbOtB46p0esq.js similarity index 55% rename from scripts/U9xh2wriSqCosugW.js rename to scripts/jvNuIbOtB46p0esq.js index b76aedc..ce08c05 100644 --- a/scripts/U9xh2wriSqCosugW.js +++ b/scripts/jvNuIbOtB46p0esq.js @@ -1,13 +1,13 @@ -if (args.test.options.stag) +if (args.test.item?.system?.attackType == "melee") { if (parseInt(args.test.result.SL) < 0 || args.test.failed) { if (parseInt(args.test.result.SL) < 0) { args.test.result.SL = "+0"; - args.test.result.description = game.i18n.localize("ROLL.MarginalSuccess"); + args.Test.result.description = "Succès marginal"; } - args.test.result.outcome = "success" - args.test.result.other.push(`${this.effect.name}: Minimum +0 DR`) + args.Test.result.outcome = "success" + args.test.result.other.push(`${this.effect.name}: Minimum +0 SL`) } } \ No newline at end of file diff --git a/scripts/k0AkkBLtE8oZhBwn.js b/scripts/k0AkkBLtE8oZhBwn.js index 3fcc840..e37678e 100644 --- a/scripts/k0AkkBLtE8oZhBwn.js +++ b/scripts/k0AkkBLtE8oZhBwn.js @@ -1,5 +1,5 @@ if (isNaN(parseInt(this.item.system.specification.value))) { - let value = await ValueDialog.create({title : "Armoured Value", text : "Enter the Armoured value"}); + let value = await ValueDialog.create({title : "Valeur d'Armure", text : "Entrez la valeur d'Armure"}); if (value) { this.item.updateSource({"system.specification.value" : value}); } diff --git a/scripts/k1Wdehpgdc0hP63E.js b/scripts/k1Wdehpgdc0hP63E.js new file mode 100644 index 0000000..ca96a42 --- /dev/null +++ b/scripts/k1Wdehpgdc0hP63E.js @@ -0,0 +1,11 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.aE3pyW20Orvdjzj0") +let hatred = item.toObject(); +hatred.system.specification.value = "Skaven" + +item = await fromUuid("Compendium.wfrp4e-core.items.Item.3wCtgMDNnu8MFmyk") +let immunity = item.toObject(); +immunity.system.specification.value = "Poison" + +item = await fromUuid("Compendium.wfrp4e-core.items.Item.oRx92ByVNEBN6YkK") +let berserk = item.toObject(); +await this.actor.createEmbeddedDocuments("Item", [hatred, immunity, berserk], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/k3FqFgsF6a3TkxAD.js b/scripts/k3FqFgsF6a3TkxAD.js deleted file mode 100644 index b78e571..0000000 --- a/scripts/k3FqFgsF6a3TkxAD.js +++ /dev/null @@ -1,3 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -test.roll(); -return true; \ No newline at end of file diff --git a/scripts/k465TgRelwcSUdS2.js b/scripts/k465TgRelwcSUdS2.js new file mode 100644 index 0000000..b65ee97 --- /dev/null +++ b/scripts/k465TgRelwcSUdS2.js @@ -0,0 +1,19 @@ +if (this.actor.has("Métier (Ingénieur)", "skill")) +{ + let aim = await this.actor.setupSkill("Métier (Ingénieur)", {appendTitle : ` - Aim ${this.item.name}`}); + await aim.roll(); + let SL = Number(aim.result.SL); + let context = {} + if (SL < 0) + { + context.fields = {modifier : 10 * SL}; + context.initialTooltip = "Échoué Métier (Ingénieur)"; + } + + let fire = await this.actor.setupWeapon(this.item, context) + fire.roll(); +} +else +{ + this.script.notification("Cet acteur n'a pas le Métier (Ingénieur)!", "error"); +} \ No newline at end of file diff --git a/scripts/k5792iKWEqKmVZMk.js b/scripts/k5792iKWEqKmVZMk.js new file mode 100644 index 0000000..549c438 --- /dev/null +++ b/scripts/k5792iKWEqKmVZMk.js @@ -0,0 +1 @@ +return args.weapon || args.skill?.name === "Esquive"; \ No newline at end of file diff --git a/scripts/k8TC0yzp4xfOXD2n.js b/scripts/k8TC0yzp4xfOXD2n.js deleted file mode 100644 index 26e00ae..0000000 --- a/scripts/k8TC0yzp4xfOXD2n.js +++ /dev/null @@ -1,10 +0,0 @@ -if (args.totalWoundLoss > 0) -{ - let test = await args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}); - await test.roll(); - if (test.failed) - { - args.actor.addCondition("stunned"); - } - args.actor.hasCondition("bleeding")?.delete() -} \ No newline at end of file diff --git a/scripts/kEaBLoIHt1FpQVKq.js b/scripts/kEaBLoIHt1FpQVKq.js deleted file mode 100644 index c1e2422..0000000 --- a/scripts/kEaBLoIHt1FpQVKq.js +++ /dev/null @@ -1,12 +0,0 @@ -if (this.actor.system.details.experience.current < 100) { - return this.script.notification(game.i18n.localize("SCRIPT.NotEnoughXP")) -} - -let item = await game.wfrp4e.utility.findItem("Invisibility", "trait") -this.actor.createEmbeddedDocuments("Item", [item]); -let expLog = foundry.utils.duplicate(this.actor.details.experience.log || []); -expLog.push({amount : 100, reason: item.name, spent: this.actor.details.experience.spent + 100, total: this.actor.details.experience.total, type: "spent"}); -this.actor.update({ - "system.details.experience.spent": this.actor.details.experience.spent + 100, - "system.details.experience.log": expLog - }); \ No newline at end of file diff --git a/scripts/kMSdRskYDI2J1gnp.js b/scripts/kMSdRskYDI2J1gnp.js deleted file mode 100644 index c06e3bc..0000000 --- a/scripts/kMSdRskYDI2J1gnp.js +++ /dev/null @@ -1,7 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone"); -} - \ No newline at end of file diff --git a/scripts/kWynO1lQzjiSs8RK.js b/scripts/kWynO1lQzjiSs8RK.js deleted file mode 100644 index 0b3b7e8..0000000 --- a/scripts/kWynO1lQzjiSs8RK.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Haggle"); \ No newline at end of file diff --git a/scripts/kY50G53IXdNXX9Sc.js b/scripts/kY50G53IXdNXX9Sc.js new file mode 100644 index 0000000..255a979 --- /dev/null +++ b/scripts/kY50G53IXdNXX9Sc.js @@ -0,0 +1,7 @@ +for(let e of this.item.effects) +{ + if (e.name.toLowerCase().includes("rune") && e.system.transferData.type == "aura" && e.system.transferData.area.radius == "6") + { + e.system.transferData.area.radius = "12" + } +} \ No newline at end of file diff --git a/scripts/kYTEqcs8JpO2OmB9.js b/scripts/kYTEqcs8JpO2OmB9.js new file mode 100644 index 0000000..a89bcd1 --- /dev/null +++ b/scripts/kYTEqcs8JpO2OmB9.js @@ -0,0 +1,4 @@ +if (args.equipped) + await this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.Bvd2aZ0gQUXHfCTh", this.effect, {"system.specification.value": "10"}); +else + await this.effect.deleteCreatedItems() \ No newline at end of file diff --git a/scripts/kYiDBPRKIokFkr4Z.js b/scripts/kYiDBPRKIokFkr4Z.js deleted file mode 100644 index 58d9e24..0000000 --- a/scripts/kYiDBPRKIokFkr4Z.js +++ /dev/null @@ -1,4 +0,0 @@ -if (args.item.type == "skill" && args.item.name == "Projectiles (Arc)") -{ - args.item.system.modifier.value += 20; -} \ No newline at end of file diff --git a/scripts/kYmscP2HuXjDovBD.js b/scripts/kYmscP2HuXjDovBD.js deleted file mode 100644 index 2e53be1..0000000 --- a/scripts/kYmscP2HuXjDovBD.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Stealth")) diff --git a/scripts/kiJ6AiaYVUjt6aV6.js b/scripts/kiJ6AiaYVUjt6aV6.js index 138718e..3d396a4 100644 --- a/scripts/kiJ6AiaYVUjt6aV6.js +++ b/scripts/kiJ6AiaYVUjt6aV6.js @@ -1,7 +1,7 @@ teeth = await fromUuid("Compendium.wfrp4e-core.items.fBcZhOBn8IpoVqQ1") teeth = teeth.toObject(); -let roll = await new Roll("1d10").roll(); +let roll = await new Roll("1d10").roll({allowInteractive : false}); roll.toMessage(this.script.getChatData({flavor : "Dents perdues"})) teeth.system.location.value = `${roll.total} ${teeth.system.location.value}` this.actor.createEmbeddedDocuments("Item", [teeth]) \ No newline at end of file diff --git a/scripts/kiolpXGbkmxfPiuI.js b/scripts/kiolpXGbkmxfPiuI.js new file mode 100644 index 0000000..15ac235 --- /dev/null +++ b/scripts/kiolpXGbkmxfPiuI.js @@ -0,0 +1,5 @@ +let test = this.actor.attacker?.test +if (test && this.item.system.protects[test.result.hitloc.result] && test.result.critical) +{ + this.script.message(`${this.item.name}: Blocked Critical Hit`) +} \ No newline at end of file diff --git a/scripts/kkC5EhqA05U6U0gU.js b/scripts/kkC5EhqA05U6U0gU.js deleted file mode 100644 index 4116109..0000000 --- a/scripts/kkC5EhqA05U6U0gU.js +++ /dev/null @@ -1,17 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); - -// Kind of insane but whatever -let opposedResult = test.opposedMessages[0]?.getOppose()?.resultMessage?.getOpposedTest()?.result - -if (opposedResult?.winner == "attacker") -{ - if (opposedResult.differenceSL < 6) - { - this.actor.addCondition("fatigued", Math.floor(opposedResult.differenceSL / 2)) - } - else if (opposedResult.differenceSL >= 6) - { - this.actor.addCondition("broken"); - } -} \ No newline at end of file diff --git a/scripts/kmsGLWGxCY8Z8jVG.js b/scripts/kmsGLWGxCY8Z8jVG.js deleted file mode 100644 index 3077f61..0000000 --- a/scripts/kmsGLWGxCY8Z8jVG.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Intuition"); \ No newline at end of file diff --git a/scripts/knq8lNYLw0v757dQ.js b/scripts/knq8lNYLw0v757dQ.js new file mode 100644 index 0000000..2e83623 --- /dev/null +++ b/scripts/knq8lNYLw0v757dQ.js @@ -0,0 +1,3 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.9fq6p9Q6H02LjaSi") +let data = item.toObject(); +await this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}); \ No newline at end of file diff --git a/scripts/kvaN100w0nBUlLbj.js b/scripts/kvaN100w0nBUlLbj.js index 127678c..ed019fa 100644 --- a/scripts/kvaN100w0nBUlLbj.js +++ b/scripts/kvaN100w0nBUlLbj.js @@ -1,6 +1,6 @@ let poisoned = this.actor.hasCondition("poisoned") if (poisoned) { - this.script.scriptMessage("Immunisé aux Poisons") + this.script.message("Immunisé à l'empoisonnement") poisoned.delete() } \ No newline at end of file diff --git a/scripts/kvqJbHBvFr6iGLcI.js b/scripts/kvqJbHBvFr6iGLcI.js new file mode 100644 index 0000000..c63e9c1 --- /dev/null +++ b/scripts/kvqJbHBvFr6iGLcI.js @@ -0,0 +1 @@ +this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.3wCtgMDNnu8MFmyk",null,[{"system.specification.value":"Poison"}]) \ No newline at end of file diff --git a/scripts/l1ntrpa8RE3Lg5xE.js b/scripts/l1ntrpa8RE3Lg5xE.js deleted file mode 100644 index 158cc86..0000000 --- a/scripts/l1ntrpa8RE3Lg5xE.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name === game.i18n.localize("NAME.Perception"); \ No newline at end of file diff --git a/scripts/l8qFKSnMpy4P7XQR.js b/scripts/l8qFKSnMpy4P7XQR.js deleted file mode 100644 index 523491c..0000000 --- a/scripts/l8qFKSnMpy4P7XQR.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Stealth")); \ No newline at end of file diff --git a/scripts/lDIWlQvD6MGyP3QP.js b/scripts/lDIWlQvD6MGyP3QP.js new file mode 100644 index 0000000..a1f3819 --- /dev/null +++ b/scripts/lDIWlQvD6MGyP3QP.js @@ -0,0 +1 @@ +return this.effect.sourceActor.effects.filter(i => i.isCondition).length > 0 \ No newline at end of file diff --git a/scripts/lG5lfAzNuM4t0rpM.js b/scripts/lG5lfAzNuM4t0rpM.js new file mode 100644 index 0000000..0b1e748 --- /dev/null +++ b/scripts/lG5lfAzNuM4t0rpM.js @@ -0,0 +1 @@ +return args.skill?.name === "Esquive"; \ No newline at end of file diff --git a/scripts/lII4KMRblqwFBlsV.js b/scripts/lII4KMRblqwFBlsV.js index cbf4a2e..b45b101 100644 --- a/scripts/lII4KMRblqwFBlsV.js +++ b/scripts/lII4KMRblqwFBlsV.js @@ -10,13 +10,13 @@ let characteristics = { "wp" : 10, "fel" : 15 } -let skills = ["Focalisation", "Charm", "Perform (Dancing)"] +let skills = ["Focalisation", "Charme", "Représentation (Danse)"] let skillAdvancements = [0, 6, 3] -let talents = ["Attractive", "Distract", "Mimic"] -let traits = ["Distracting", "Flight (6)", "Spellcaster (Petty)"] +let talents = ["Attirant", "Distraire", "Imitation"] +let traits = ["Perturbant", "Flight (6)", "Spellcaster (Petty)"] let trappings = [] let items = []; -let spells = ["Marsh Lights", "Sleep"]; +let spells = ["Feux follets", "Sommeil"]; let updateObj = this.actor.toObject(); @@ -32,7 +32,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -48,7 +48,7 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } @@ -74,17 +74,17 @@ for (let trait of traits) if (Number.isNumeric(traitVal)) { - traitItem.system.specification.value = traitName.includes('Weapon','Horns','Tail','Tentacles','Bite') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal; + traitItem.system.specification.value = traitName.includes('Arme','Cornes','Tail','Tentacules','Morsure') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal; traitItem.name = (traitItem.name + ` ${traitSpec ? "("+ traitSpec + ")" : ""}`).trim() } - else + else traitItem.system.specification.value = traitSpec items.push(traitItem) } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -95,13 +95,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } -for (let spell of spells) +for (let spell of spells) { let spellItem = await game.wfrp4e.utility.findItem(spell) if (spellItem) @@ -110,13 +110,13 @@ for (let spell of spells) items.push(spellItem); } - else + else { - ui.notifications.warn(`Impossible de trouver ${spell}`, {permanent : true}) + ui.notifications.warn(`Could not find ${spell}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); \ No newline at end of file diff --git a/scripts/lMRsQRgjMexY9dxE.js b/scripts/lMRsQRgjMexY9dxE.js new file mode 100644 index 0000000..4e7e560 --- /dev/null +++ b/scripts/lMRsQRgjMexY9dxE.js @@ -0,0 +1 @@ +return ["NAME.Résistance", "NAME.Cool"].map(i => game.i18n.localize(i)).includes(args.skill?.name) \ No newline at end of file diff --git a/scripts/lOIHiAIDtj91kllN.js b/scripts/lOIHiAIDtj91kllN.js index 4442cf2..841c726 100644 --- a/scripts/lOIHiAIDtj91kllN.js +++ b/scripts/lOIHiAIDtj91kllN.js @@ -1,6 +1,6 @@ -const chanties = await WFRP_Utility.findAll('wfrp4e-soc.chanty'); -let choice = await ItemDialog.create(chanties, 1, "Choisissez Chanty"); -if (choice.length) { - console.log(choice); - this.actor.createEmbeddedDocuments("Item", choice, {fromEffect: this.effect.id}); +const chanties = await warhammer.utility.findAllItems('wfrp4e-soc.chanty', "Loading Chanties", true); +let choice = await ItemDialog.create(chanties, 1, {text : "Choisissez un Chant", title : this.effect.name}); +if (choice.length) +{ + this.actor.addEffectItems(choice.map(i => i.uuid), this.effect) } \ No newline at end of file diff --git a/scripts/lOzkngzye4RmvALp.js b/scripts/lOzkngzye4RmvALp.js index 49921a6..236bcf0 100644 --- a/scripts/lOzkngzye4RmvALp.js +++ b/scripts/lOzkngzye4RmvALp.js @@ -1,3 +1,3 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.DrNUTPeodEgpWTnT") this.actor.createEmbeddedDocuments("Item", [item], {fromEffect : this.effect.id}); -this.script.scriptNotification("Ajout de " + item.name) \ No newline at end of file +this.script.notification("Added " + item.name) \ No newline at end of file diff --git a/scripts/lPudo1grrVp05i7a.js b/scripts/lPudo1grrVp05i7a.js deleted file mode 100644 index b96114f..0000000 --- a/scripts/lPudo1grrVp05i7a.js +++ /dev/null @@ -1,11 +0,0 @@ -let loc = Math.floor(CONFIG.Dice.randomUniform() * 2) == 0 ? "head" : "body" -let damage = this.actor.system.characteristics.s.bonus + 6 - - this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : " - " + this.effect.name}).then(async test => { - await test.roll(); - if(test.failed) - { - await this.actor.addCondition("stunned") - this.script.scriptMessage(await this.actor.applyBasicDamage(damage, {loc, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true})) - } - }) \ No newline at end of file diff --git a/scripts/lQJ68n3y1xDyNicE.js b/scripts/lQJ68n3y1xDyNicE.js index 0d61d6e..4f4ac9f 100644 --- a/scripts/lQJ68n3y1xDyNicE.js +++ b/scripts/lQJ68n3y1xDyNicE.js @@ -1 +1 @@ -return !args.options.sizeModifier && args.item?.system?.attackType != "ranged" \ No newline at end of file +return !args.context.sizeModifier && args.item?.system?.attackType != "ranged" \ No newline at end of file diff --git a/scripts/lU4s3UTtBkU38djI.js b/scripts/lU4s3UTtBkU38djI.js index a489fb0..778adf3 100644 --- a/scripts/lU4s3UTtBkU38djI.js +++ b/scripts/lU4s3UTtBkU38djI.js @@ -1,4 +1,4 @@ this.actor.addCondition("entangled") -let msg = `${this.actor.prototypeToken.name} perd 1 Blessure et reçoit l'état Empêtré.` -this.script.scriptMessage(msg) +let msg = `${this.actor.prototypeToken.name} loses 1 Wound and gains 1 Entangled Condition.` +this.script.message(msg) this.actor.modifyWounds(-1) \ No newline at end of file diff --git a/scripts/lYYkGzqNshiYc7WI.js b/scripts/lYYkGzqNshiYc7WI.js deleted file mode 100644 index d17b4c6..0000000 --- a/scripts/lYYkGzqNshiYc7WI.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("poisoned") -} \ No newline at end of file diff --git a/scripts/laWHBP2jLrVxcgp9.js b/scripts/laWHBP2jLrVxcgp9.js new file mode 100644 index 0000000..11159cb --- /dev/null +++ b/scripts/laWHBP2jLrVxcgp9.js @@ -0,0 +1 @@ +this.script.message(await this.actor.applyBasicDamage(2, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true})) \ No newline at end of file diff --git a/scripts/laptAldsT0Fm1rDt.js b/scripts/laptAldsT0Fm1rDt.js index 0bce9f6..8cd0a72 100644 --- a/scripts/laptAldsT0Fm1rDt.js +++ b/scripts/laptAldsT0Fm1rDt.js @@ -1,6 +1,6 @@ -let blunt = await Dialog.confirm({label : "test", content :`

    Appliquer la réduction des Dégats contondants? (-3)

    `}) +let blunt = await foundry.applications.api.DialogV2.confirm({window: {title : this.effect.name}, content :`

    Appliquer la réduction des dégâts contondants ? (-3)

    `}) if (blunt) { - args.modifiers.other.push({label : this.effect.name, details : "Réduction des dégats contondants", value : -3}) + args.modifiers.other.push({label : this.effect.name, details : "Réduction des Dégâts Contondants", value : -3}) } \ No newline at end of file diff --git a/scripts/lhemR8EP5tGNKout.js b/scripts/lhemR8EP5tGNKout.js deleted file mode 100644 index cb1f420..0000000 --- a/scripts/lhemR8EP5tGNKout.js +++ /dev/null @@ -1,14 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields: {difficulty : "average"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`, context : {failure : "Souffre d'Irrationnalité Effrayante"}}) -await test.roll(); -if (test.failed) -{ - msg = `

    @UUID[${this.effect.sourceItem.uuid}]{Irrationnalité Effrayante} Lancez: ${Math.ceil(CONFIG.Dice.randomUniform() * 10)}

    ` - if (test.result.roll % 11 == 0 || test.result.roll == 100) - { - msg += `

    ${this.actor.prototypeToken.name} reçoit également 1 Point de Corruption. Si il subit une mutation, il doit la déterminer sur la table des @Table[mutatemental]{Mutations Mentales}.

    ` - let newCorruption = Number(this.actor.status.corruption.value) + 1 - this.actor.update({"system.status.corruption.value" : newCorruption}) - } - - this.script.scriptMessage(msg); -} diff --git a/scripts/lmBAZCtofsC8hHHG.js b/scripts/lmBAZCtofsC8hHHG.js new file mode 100644 index 0000000..8309bc0 --- /dev/null +++ b/scripts/lmBAZCtofsC8hHHG.js @@ -0,0 +1,31 @@ +let SL = 1; + +do { + const signedSL = SL >= 0 ? `+${SL}` : "SL"; + const content = ` +
    +

    Vous avez augmenté ${signedSL} ${SL > 1 ? "DRs" : "SL"}. Voulez-vous lancer un d10 ?

    +

    1–6: ajoutez +1 DR

    +

    7–10: perdez tous les DR accumulés et effectuez le test suivant à –1 DR

    +
    +`; + const choice = await foundry.applications.api.DialogV2.confirm({ + yes: {label: "Lancer", icon: "fas fa-dice"}, + no: {label: `Keep ${signedSL} DR`, icon: "fas fa-check"}, + content, + }); + + if (!choice) break; + + const roll = new Roll("1d10"); + await roll.toMessage({flavor: this.effet.name}); + + if (roll.total >= 7) { + SL = -1; + break; + } + + SL++; +} while (true); + +this.effet.setFlag("wfrp4e", "SL", SL); \ No newline at end of file diff --git a/scripts/luEuwzYCUrch58Bp.js b/scripts/luEuwzYCUrch58Bp.js new file mode 100644 index 0000000..4b2dd12 --- /dev/null +++ b/scripts/luEuwzYCUrch58Bp.js @@ -0,0 +1,3 @@ +if (args.opposedTest.attackerTest.options?.grudge) { + args.modifiers.other.push({label : this.effect.name, details : "Augmentation des Dégâts", value : 1}) +} \ No newline at end of file diff --git a/scripts/lvjcddwRiN9iGruy.js b/scripts/lvjcddwRiN9iGruy.js index 5aea090..7497bbd 100644 --- a/scripts/lvjcddwRiN9iGruy.js +++ b/scripts/lvjcddwRiN9iGruy.js @@ -1,7 +1,7 @@ -let test = await this.actor.setupCharacteristic("t", { appendTitle: ` - ${this.effect.name}`, fields: { difficulty: "challenging" } }) -await test.roll(); +let test = await this.actor.setupCharacteristic("t", { appendTitle: ` - ${this.effet.name}`, fields: { difficulty: "challenging" } }) +await Test.roll(); -if (test.failed) +if (Test.Échoué) { let ageAdded = Math.ceil(CONFIG.Dice.randomUniform() * 10) + Math.ceil(CONFIG.Dice.randomUniform() * 10) let ws = Math.ceil(CONFIG.Dice.randomUniform() * 10) @@ -15,15 +15,15 @@ if (test.failed) let inline = `@ROLL` let msg = - `

    ${this.actor.prototypeToken.name} vieilli de ${inline.replace("@ROLL", ageAdded).replace("@TT", "2d10")} et perd

    -

    ${inline.replace("@ROLL", ws).replace("@TT", "1d10")} Capacité de Combat

    -

    ${inline.replace("@ROLL", bs).replace("@TT", "1d10")} Capacité de Tir

    + `

    ${this.actor.prototypeToken.name} ages by ${inline.replace("@ROLL", ageAdded).replace("@TT", "2d10")} and loses

    +

    ${inline.replace("@ROLL", ws).replace("@TT", "1d10")} Compétence de Combat

    +

    ${inline.replace("@ROLL", bs).replace("@TT", "1d10")} Compétence de Tir

    ${inline.replace("@ROLL", s).replace("@TT", "1d10")} Force

    ${inline.replace("@ROLL", t).replace("@TT", "1d10")} Endurance

    ${inline.replace("@ROLL", ag).replace("@TT", "1d10")} Agilité

    -

    ${inline.replace("@ROLL", dex).replace("@TT", "1d10")} Dexterité

    +

    ${inline.replace("@ROLL", dex).replace("@TT", "1d10")} Dextérité

    ` - this.script.scriptMessage(msg); + this.script.message(msg); let characteristics = foundry.utils.duplicate(this.actor.system.characteristics) diff --git a/scripts/m4eagTrVOXtotonR.js b/scripts/m4eagTrVOXtotonR.js new file mode 100644 index 0000000..906409a --- /dev/null +++ b/scripts/m4eagTrVOXtotonR.js @@ -0,0 +1,11 @@ +// Get the size +let size = this.actor.sizeNum +let diff = "difficult"; +if (size < 5) { // 5 = Monstrous + diff = "hard"; +} +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : diff}, appendTitle : ` - ${this.effect.name}`}) +await test.roll(); +if (test.failed) { + this.actor.addSystemEffect("fear") +} \ No newline at end of file diff --git a/scripts/m8qBlbH7ROoqa22o.js b/scripts/m8qBlbH7ROoqa22o.js index 17577b3..0447be5 100644 --- a/scripts/m8qBlbH7ROoqa22o.js +++ b/scripts/m8qBlbH7ROoqa22o.js @@ -1 +1 @@ -return args.options.reload \ No newline at end of file +return args.context.reload \ No newline at end of file diff --git a/scripts/mPxmCsXYirAIT913.js b/scripts/mPxmCsXYirAIT913.js index 4b0ee86..2fc1e00 100644 --- a/scripts/mPxmCsXYirAIT913.js +++ b/scripts/mPxmCsXYirAIT913.js @@ -1,3 +1,3 @@ -let key = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.characteristics, this.effect.img), 1, "Choisissez Characteristic"); +let key = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.characteristics, this.effect.img), 1, "Choisir la Caractéristique"); this.effect.updateSource({changes : [{key : `system.characteristics.${key[0].id}.modifier`, mode : 2, value : 10}]}) \ No newline at end of file diff --git a/scripts/mRvLsSVxNyt8LVZb.js b/scripts/mRvLsSVxNyt8LVZb.js index 130b10c..1d9805b 100644 --- a/scripts/mRvLsSVxNyt8LVZb.js +++ b/scripts/mRvLsSVxNyt8LVZb.js @@ -1,4 +1,4 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.GRRN3XAKIpEVCY7z") let data = item.toObject(); -data.name += " (A déterminer)" +data.name += " (Au choix)" this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/mTnmPcjWmvScIBWY.js b/scripts/mTnmPcjWmvScIBWY.js deleted file mode 100644 index 79cf5c7..0000000 --- a/scripts/mTnmPcjWmvScIBWY.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes("Focalisation") || args.type == "channelling" \ No newline at end of file diff --git a/scripts/mYL4i1vNlMl4vFYy.js b/scripts/mYL4i1vNlMl4vFYy.js deleted file mode 100644 index a5211a8..0000000 --- a/scripts/mYL4i1vNlMl4vFYy.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Perception") && args.skill?.name != game.i18n.localize("NAME.Track"); \ No newline at end of file diff --git a/scripts/mlulnXQo8XU8vKLD.js b/scripts/mlulnXQo8XU8vKLD.js index 80cf7e7..d908215 100644 --- a/scripts/mlulnXQo8XU8vKLD.js +++ b/scripts/mlulnXQo8XU8vKLD.js @@ -1,6 +1,6 @@ if (isNaN(parseInt(this.item.system.specification.value))) { - let value = await ValueDialog.create({tetx : "Enter Grim value", title : this.effect.name}); + let value = await ValueDialog.create({text : "Entrer la valeur", title : this.effect.name}); if (value) { this.item.updateSource({"system.specification.value" : value}); diff --git a/scripts/mnvczEiu7gUSWvuV.js b/scripts/mnvczEiu7gUSWvuV.js new file mode 100644 index 0000000..c6043ff --- /dev/null +++ b/scripts/mnvczEiu7gUSWvuV.js @@ -0,0 +1,10 @@ +if (args.test.options.flags.skewering) +{ + args.test.result.tables.critical = { + label : "Critique (si attaque réussie)", + class : "critical-roll", + modifier : args.test.result.critModifier || 0, + key: `crit${args.test.result.hitloc.result}` + + } +} \ No newline at end of file diff --git a/scripts/mr8qm5Bg6k1idZ6Q.js b/scripts/mr8qm5Bg6k1idZ6Q.js deleted file mode 100644 index aedbb90..0000000 --- a/scripts/mr8qm5Bg6k1idZ6Q.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name == "Musicien (Luth)" \ No newline at end of file diff --git a/scripts/mziJBUYcsrhkdcCJ.js b/scripts/mziJBUYcsrhkdcCJ.js deleted file mode 100644 index 0308dbf..0000000 --- a/scripts/mziJBUYcsrhkdcCJ.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone") -} \ No newline at end of file diff --git a/scripts/n5RJqJL9fdRIxkuN.js b/scripts/n5RJqJL9fdRIxkuN.js index 8d0d11c..8cfb4e3 100644 --- a/scripts/n5RJqJL9fdRIxkuN.js +++ b/scripts/n5RJqJL9fdRIxkuN.js @@ -1,11 +1,11 @@ if (this.actor.system.status.advantage.value > 0) { await this.actor.modifyAdvantage(-1); - this.script.scriptNotification("Avantage soustrait") + this.script.notification("Avantage retiré") } else { - return this.script.scriptNotification("Pas assez d'Avantages!", "error") + return this.script.notification("Avantage retiré", "error") } let test = await this.actor.setupTrait(this.item) diff --git a/scripts/n5wowuDE8Dz1uBZn.js b/scripts/n5wowuDE8Dz1uBZn.js new file mode 100644 index 0000000..aa6e010 --- /dev/null +++ b/scripts/n5wowuDE8Dz1uBZn.js @@ -0,0 +1,11 @@ +let damage = this.effect.sourceActor.characteristics.int.bonus + 6; +if (this.actor.has(game.i18n.localize("NAME.Mort-vivant")) || this.actor.has(game.i18n.localize("NAME.Démoniaque"))) { + damage += 6 +} +this.script.scriptMessage(await this.actor.applyBasicDamage(damage, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg: true})); + +let test = await this.actor.setupCharacteristic("int", {fields : {difficulty : "average"}, appendTitle : ` - ${this.effect.name}`}) +await test.roll(); +if (test.failed) { + this.actor.addCondition("stunned"); +} \ No newline at end of file diff --git a/scripts/n8X4Vgmrs4M5pyHK.js b/scripts/n8X4Vgmrs4M5pyHK.js new file mode 100644 index 0000000..ecd9108 --- /dev/null +++ b/scripts/n8X4Vgmrs4M5pyHK.js @@ -0,0 +1 @@ +return !this.actor.isOpposing || this.actor.attacker.test.item.attackType != "melee" || !this.item.equipped.value \ No newline at end of file diff --git a/scripts/n99CqhPx3uABCU15.js b/scripts/n99CqhPx3uABCU15.js new file mode 100644 index 0000000..761dd37 --- /dev/null +++ b/scripts/n99CqhPx3uABCU15.js @@ -0,0 +1,4 @@ +if (args.test.result.critical && args.test.preData.reversal.allowed) +{ + args.test.result.other.push(`${this.effect.name}: can reverse Critical Hit roll`) +} \ No newline at end of file diff --git a/scripts/nD2QVg3DrPK3foMf.js b/scripts/nD2QVg3DrPK3foMf.js deleted file mode 100644 index 7c32726..0000000 --- a/scripts/nD2QVg3DrPK3foMf.js +++ /dev/null @@ -1,7 +0,0 @@ -args.actor.setupSkill("Esquive", { fields: { difficulty: "average" } }).then(async test => { - await test.roll(); - if (test.failed) { - await args.actor.addCondition("bleeding") - await args.actor.addCondition("entangled") - } - }) \ No newline at end of file diff --git a/scripts/nEaF3jbCiVYD8jia.js b/scripts/nEaF3jbCiVYD8jia.js deleted file mode 100644 index c39fb2f..0000000 --- a/scripts/nEaF3jbCiVYD8jia.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Charm") && !args.skill?.name.includes(game.i18n.localize("NAME.Lore")); \ No newline at end of file diff --git a/scripts/nGTxNWBUBgTr87wU.js b/scripts/nGTxNWBUBgTr87wU.js index 9c8d755..72f4810 100644 --- a/scripts/nGTxNWBUBgTr87wU.js +++ b/scripts/nGTxNWBUBgTr87wU.js @@ -1,5 +1,5 @@ if (args.opposedTest.result.differenceSL >= 0 && args.opposedTest.result.differenceSL <= 2 && args.opposedTest.result.winner == "attacker") { - this.script.scriptMessage(`Becomes lodged in the armour or flesh of the opponent. See @UUID[${this.item.uuid}]{${this.item.name}}.`, {alias : this.item.name}, {blind: true, whisper : ChatMessage.getWhisperRecipients("GM")}) + this.script.message(`Becomes lodged in the armour or flesh of the opponent. See @UUID[${this.item.uuid}]{${this.item.name}}.`, speaker : {alias : this.item.name}, {blind: true, whisper : ChatMessage.getWhisperRecipients("GM")}) } \ No newline at end of file diff --git a/scripts/nIOeK0BrtdZeZW8X.js b/scripts/nIOeK0BrtdZeZW8X.js deleted file mode 100644 index 8e85711..0000000 --- a/scripts/nIOeK0BrtdZeZW8X.js +++ /dev/null @@ -1,17 +0,0 @@ -console.log("SKILL", this) - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {fields : {difficulty : "challenging"}, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); - -let rollD10 = await new Roll("1d10").roll() -rollD10.toMessage(this.script.getChatData()) - - -if (test.succeeded) -{ - //... -} -else if (test.failed) -{ - //... -} diff --git a/scripts/nNwAFEURKlFhPcvA.js b/scripts/nNwAFEURKlFhPcvA.js new file mode 100644 index 0000000..d8d22c2 --- /dev/null +++ b/scripts/nNwAFEURKlFhPcvA.js @@ -0,0 +1 @@ +CorruptionMessageModel.createCorruptionMessage("minor", this.script.getChatData()); \ No newline at end of file diff --git a/scripts/nSXzktHyNjGUXjaw.js b/scripts/nSXzktHyNjGUXjaw.js index 33216f3..0f643a3 100644 --- a/scripts/nSXzktHyNjGUXjaw.js +++ b/scripts/nSXzktHyNjGUXjaw.js @@ -1 +1 @@ -return args.item?.system.isRanged \ No newline at end of file +return args.item?.system.isProjectiles \ No newline at end of file diff --git a/scripts/nZtN0zM49xTuG86V.js b/scripts/nZtN0zM49xTuG86V.js new file mode 100644 index 0000000..4961297 --- /dev/null +++ b/scripts/nZtN0zM49xTuG86V.js @@ -0,0 +1,12 @@ +if (this.actor.system.status.advantage.value >= 2) +{ + await this.actor.modifyAdvantage(-2); + this.script.notification("Avantage retiré") +} +else +{ + return this.script.notification("Avantage retiré", "error") +} + +let test = await this.actor.setupTrait(this.item) +await test.roll(); \ No newline at end of file diff --git a/scripts/naF5EWr1CBkYRZTK.js b/scripts/naF5EWr1CBkYRZTK.js index 7ea6e02..066302b 100644 --- a/scripts/naF5EWr1CBkYRZTK.js +++ b/scripts/naF5EWr1CBkYRZTK.js @@ -1,26 +1,9 @@ -if (args.opposedTest?.attackerTest?.item?.system?.isRanged) +if (args.opposedTest?.attackerTest?.item?.system?.isProjectiles) { - let choice = await Dialog.wait({ - title: this.effect.name, - content: `

    Eviter les dégâts avec ${this.effect.name}?`, - buttons: { - yes: { - label: "Oui", - callback: () => { - return true; - } - }, - no: { - label: "Non", - callback: () => { - return false; - } - } - } - }) + let choice = await foundry.applications.api.DialogV2.confirm({window: {title : this.item.name}, content : `

    Annuler les dégâts avec ${this.effect.name}?

    `}) if (choice) { - args.abort = `${this.effect.name}: Dégâts annulés` + args.abort = `${this.effect.name}: Dégats annulés.`; } } \ No newline at end of file diff --git a/scripts/ncIjDE6TFx88IQA1.js b/scripts/ncIjDE6TFx88IQA1.js deleted file mode 100644 index 223a1a3..0000000 --- a/scripts/ncIjDE6TFx88IQA1.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Climb") || args.skill?.name == game.i18n.localize("NAME.Athletics"); \ No newline at end of file diff --git a/scripts/ngMm7SgtVqVovFJG.js b/scripts/ngMm7SgtVqVovFJG.js index 8d5af65..2025f1f 100644 --- a/scripts/ngMm7SgtVqVovFJG.js +++ b/scripts/ngMm7SgtVqVovFJG.js @@ -1,4 +1,4 @@ if (args.test.result.critical && args.test.result.critical != "Total Power") { - args.test.result.other.push(` Bonecrusher Critical (+20) (only if Critical Cast selected)`) + args.test.result.other.push(` Bonecrusher Critical (+20) (only if Critical Cast selected)`) } \ No newline at end of file diff --git a/scripts/njPP9wDAsdh4WHIj.js b/scripts/njPP9wDAsdh4WHIj.js index 6fb1cd6..dc8afe2 100644 --- a/scripts/njPP9wDAsdh4WHIj.js +++ b/scripts/njPP9wDAsdh4WHIj.js @@ -1,4 +1,4 @@ if (args.totalWoundLoss > 0 && ["trait", "weapon"].includes(args.opposedTest.attackerTest.item?.type)) { - this.script.scriptMessage(`Infctée: ${args.actor.name} doit réussir un Test Facile (+40) de Résistance ou subir une @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Blessure Purulente}`, {whisper: ChatMessage.getWhisperRecipients("GM")}) + this.script.message(`Infected: ${args.actor.name} must pass an Easy (+40) Résistance Test or gain a @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Festering Wound}`, {whisper: ChatMessage.getWhisperRecipients("GM")}) } \ No newline at end of file diff --git a/scripts/nkSmu7v9WiAaK4vq.js b/scripts/nkSmu7v9WiAaK4vq.js index 307f862..c084d9a 100644 --- a/scripts/nkSmu7v9WiAaK4vq.js +++ b/scripts/nkSmu7v9WiAaK4vq.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Tailor)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Trade (Tailor)'; const difficulty = 'easy'; const target = 20; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/nkbTnaeBpthyhw4J.js b/scripts/nkbTnaeBpthyhw4J.js index cf0a3c9..107d645 100644 --- a/scripts/nkbTnaeBpthyhw4J.js +++ b/scripts/nkbTnaeBpthyhw4J.js @@ -3,4 +3,4 @@ let current = this.actor.status.fortune.value this.actor.update({"system.status.fortune.value" : fortunePoints + current}) -this.script.scriptMessage(`${this.actor.prototypeToken.name} voit ses Points de Chance augmenter de ${current} à ${fortunePoints + current}`) \ No newline at end of file +this.script.message(`${this.actor.prototypeToken.name} fortune points increased from ${current} to ${fortunePoints + current}`) \ No newline at end of file diff --git a/scripts/nkdKBJ8ItqWiRAWL.js b/scripts/nkdKBJ8ItqWiRAWL.js index 379d7c2..21e06c2 100644 --- a/scripts/nkdKBJ8ItqWiRAWL.js +++ b/scripts/nkdKBJ8ItqWiRAWL.js @@ -1,19 +1,21 @@ // Apply changes when the mask is worn -if (args.equipped) { - this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) - this.script.scriptMessage(`${this.actor.name} porte ${this.item.name}.
    - Il bénéficie de +50 aux Tests de Natation et peut respirer sous l'eau.
    Si il porte le masque pendant plus d'une heure ou bénéficie de l'un de ses effets, il est exposé à une @Corruption[moderate]{Corruption Modérée}.`, - {whisper: ChatMessage.getWhisperRecipients("GM")}) +if (args.equipped) { + this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) + this.script.message(`${this.actor.name} porte le ${this.item.name}.
    + Ils gagnent +50 aux tests de natation et peuvent respirer sous l'eau.
    + S'ils portent le masque pendant plus d'une heure ou bénéficient de l'un de ses effets, ils sont exposés à @Corruption[moderate]{Corruption modérée}. + `, + {whisper: ChatMessage.getWhisperRecipients("GM")}) } -// Notify of lingering effects when mask is removed +// Notify of lingering effects when mask is Retiré else if (!args.equipped) { await this.item.effects.contents[0].delete(); - await this.item.update({name : this.item.name += " (Used)"}) - this.script.scriptMessage(`${this.item.name} porté par ${this.actor.name} a été enlevé et a perdu ses propriétés. Cependant, ses effets perdurent pendant [[1d10+4]] jours, après quoi il faudra les supprimer manuellement.`, + await this.item.update({name : this.item.name += " (Usagé)"}) + this.script.message(`${this.item.name} sur ${this.actor.name} a été retiré et perd ses propriétés. Cependant, les effets durent [[1d10+4]] jours, après quoi ils doivent être manuellement retirés.`, {whisper: ChatMessage.getWhisperRecipients("GM")} ) - + } diff --git a/scripts/nqWu0ZplxzRiUEAg.js b/scripts/nqWu0ZplxzRiUEAg.js index b7abc0c..596f0c4 100644 --- a/scripts/nqWu0ZplxzRiUEAg.js +++ b/scripts/nqWu0ZplxzRiUEAg.js @@ -1,7 +1,7 @@ -let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); +let test = await this.actor.setupCharacteristic("wp", {skipTargets: true, appendTitle : ` - ${this.effet.name}`}) +await Test.roll(); // Kind of insane but whatever -let opposedResult = test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result +let opposedResult = Test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result return opposedResult?.winner == "attacker"; \ No newline at end of file diff --git a/scripts/nvrFhHHVq3KzirlR.js b/scripts/nvrFhHHVq3KzirlR.js deleted file mode 100644 index ba0fdde..0000000 --- a/scripts/nvrFhHHVq3KzirlR.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Stealth")) diff --git a/scripts/o2QhtiLAmUEpDgBX.js b/scripts/o2QhtiLAmUEpDgBX.js new file mode 100644 index 0000000..5087466 --- /dev/null +++ b/scripts/o2QhtiLAmUEpDgBX.js @@ -0,0 +1 @@ +return args.skill?.name != "Voile (Aéronavale)" \ No newline at end of file diff --git a/scripts/o3JUBKLvE6bBxK2n.js b/scripts/o3JUBKLvE6bBxK2n.js deleted file mode 100644 index 9ccae0a..0000000 --- a/scripts/o3JUBKLvE6bBxK2n.js +++ /dev/null @@ -1,20 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), { fields: { difficulty: "average" } }) -await test.roll(); -if (test.failed) -{ - await this.actor.addCondition("prone") - let injury = await fromUuid("Compendium.wfrp4e-core.items.ZhMADOqoo0y8Q9bx"); - injury = injury.toObject() - let toes = Math.clamped(Math.abs(test.result.SL) + 1, 1, 5) - injury.system.location.key = this.item.system.location.key[0] + injury.system.location.value - if (injury.system.location.key[0] == "r") - { - injury.system.location.value = `${toes} Right ${injury.system.location.value}s` - } - else if (injury.system.location.key[0] == "l") - { - injury.system.location.value = `${toes} Left ${injury.system.location.value}s` - } - setProperty(injury, "system.wfrp4e.count", toes) - this.actor.createEmbeddedDocuments("Item", [injury]) -} \ No newline at end of file diff --git a/scripts/o88xuUConwt0vFLw.js b/scripts/o88xuUConwt0vFLw.js index 0eb9a59..8b66c49 100644 --- a/scripts/o88xuUConwt0vFLw.js +++ b/scripts/o88xuUConwt0vFLw.js @@ -2,4 +2,4 @@ let points = this.effect.sourceTest.result.overcast.usage.other.current; this.actor.update({"system.status.fortune.value" : this.actor.system.status.fortune.value + points}); -this.script.scriptMessage(`Gagne ${points} Points de Chance`) \ No newline at end of file +this.script.message(`Gained ${points} Fortune Points`) \ No newline at end of file diff --git a/scripts/oA197GIqHpU5WR9V.js b/scripts/oA197GIqHpU5WR9V.js new file mode 100644 index 0000000..cb50e21 --- /dev/null +++ b/scripts/oA197GIqHpU5WR9V.js @@ -0,0 +1,4 @@ +if (args.test.options.corruption || args.test.options.mutation) +{ + args.test.preData.canReverse = true; +} \ No newline at end of file diff --git a/scripts/oDNfCNyt5KaUYmg2.js b/scripts/oDNfCNyt5KaUYmg2.js index a622328..4800cca 100644 --- a/scripts/oDNfCNyt5KaUYmg2.js +++ b/scripts/oDNfCNyt5KaUYmg2.js @@ -1,10 +1,10 @@ if(args.opposedTest.result.winner == "defender") { let roll = Math.ceil(CONFIG.Dice.randomUniform() * 10) - let msg = `Résultat ${roll}.` + let msg = `Rolled ${roll}.` if (roll >= 7) { - msg = `L'attaque touche avec un DR de ${roll - 6}.` + msg = `Attack hits with an SL of ${roll - 6}.` } - this.script.scriptMessage(msg, {blind: true, whisper : ChatMessage.getWhisperRecipients("GM")}) + this.script.message(msg, {blind: true, whisper : ChatMessage.getWhisperRecipients("GM")}) } \ No newline at end of file diff --git a/scripts/oEsUsI74yGTZ9CwU.js b/scripts/oEsUsI74yGTZ9CwU.js deleted file mode 100644 index c57ed37..0000000 --- a/scripts/oEsUsI74yGTZ9CwU.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name == game.i18n.localize("NAME.CharmAnimal") \ No newline at end of file diff --git a/scripts/oGdsGPgJWcyWkiWl.js b/scripts/oGdsGPgJWcyWkiWl.js deleted file mode 100644 index b6511a1..0000000 --- a/scripts/oGdsGPgJWcyWkiWl.js +++ /dev/null @@ -1,6 +0,0 @@ -this.actor.addCondition("broken") - -if (this.actor.has(game.i18n.localize("NAME.Undead"))) -{ - this.script.scriptMessage(await this.actor.applyBasicDamage(this.effect.sourceTest.result.damage, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg: true})) -} \ No newline at end of file diff --git a/scripts/oHmtdXWVwm7y7BtO.js b/scripts/oHmtdXWVwm7y7BtO.js new file mode 100644 index 0000000..0122ad8 --- /dev/null +++ b/scripts/oHmtdXWVwm7y7BtO.js @@ -0,0 +1 @@ +args.fields.difficulty = "hard"; \ No newline at end of file diff --git a/scripts/oPg4se8iQRD14kmB.js b/scripts/oPg4se8iQRD14kmB.js index aff79ad..c4c7070 100644 --- a/scripts/oPg4se8iQRD14kmB.js +++ b/scripts/oPg4se8iQRD14kmB.js @@ -9,7 +9,7 @@ let filters = [ } ] -let items = await ItemDialog.createFromFilters(filters, 1, "Choisissez an appropriate Polearm or Two-Handed Weapon") +let items = await ItemDialog.createFromFilters(filters, 1, {text : "Choisissez une arme d'hast ou une arme à deux mains appropriée"}) items = items.map(i => i.toObject()) items.forEach(i => i.system.equipped.value = true); diff --git a/scripts/oQI06eh8mJ9UqETO.js b/scripts/oQI06eh8mJ9UqETO.js new file mode 100644 index 0000000..abfd600 --- /dev/null +++ b/scripts/oQI06eh8mJ9UqETO.js @@ -0,0 +1,5 @@ +if (this.item.system.disabled) { + await this.effect.deleteCreatedItems(); +} else if (!this.actor.items.find(i => i.name === "Furtif")) { + await this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.OzwDT6kzoLYeeR2d", this.effect); +} \ No newline at end of file diff --git a/scripts/oTXPA6rbPnYOKNmo.js b/scripts/oTXPA6rbPnYOKNmo.js index b3c9bbd..c682d55 100644 --- a/scripts/oTXPA6rbPnYOKNmo.js +++ b/scripts/oTXPA6rbPnYOKNmo.js @@ -10,14 +10,14 @@ let characteristics = { "wp" : 35, "fel" : 15 } -let skills = ["Calme", "Esquive", "Intimidate", "Intuition", "Langue (Battle)", "Commandement" , "Lore (Warfare)", "Perception"] +let skills = ["Calme", "Esquive", "Intimidation", "Intuition", "Langue (Battle)", "Commandement" , "Savoir (Guerre)", "Perception"] let skillAdvancements = [25, 15, 25, 25, 15, 30, 20, 20] -let talents = ["Combat Aware", "Combat Master", "Combat Reflexes", "Inspiring", "Chance", "Resolute", "Unshakable", "War Leader"] -let trappings = ["Arme simple", "Shield", "Plate Breastplate", "Plate Bracers", "Plate Helm", "Plate Leggings"] -let specialItems = [ - {name: "Two Handed Weapon", type: "trapping", trappingType: "clothingAccessories" }, -] +let talents = ["Vigilance", "Maîtrise du combat", "Combat Instinctif", "Inspiring", "Chance", "Déterminé", "Inébranlable", "Seigneur de guerre"] +let trappings = ["Arme simple", "Bouclier", "Plastron d'acier", "Brassards", "Heaume", "Jambières d'acier"] +let specialItems = [ + {name: "Two Handed Weapon", type: "trapping", trappingType: "clothingAccessories" }, +] let items = []; let updateObj = this.actor.toObject(); @@ -30,11 +30,11 @@ for (let ch in characteristics) for (let item of specialItems) { let newItem if (item.type == "weapon") { - newItem = new ItemWfrp4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) + newItem = new ItemWFRP4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) } else if (item.type == "trapping") { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) } else { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) } items.push(newItem.toObject()) } @@ -46,7 +46,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -62,13 +62,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -79,7 +79,7 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } @@ -96,19 +96,19 @@ let filters = [ } ] -items = items.concat(await ItemDialog.createFromFilters(filters, 1, "Choisissez an appropriate Polearm or Two-Handed Weapon")) +items = items.concat(await ItemDialog.createFromFilters(filters, 1, {text: "Choisissez une arme d'hast ou une arme à deux mains appropriée"})) -let ride = await Dialog.confirm({title : "Skill", content : "Add Chaos Steed and +20 Ride (Horse)?"}) +let ride = await foundry.applications.api.DialogV2.confirm({window : {title : "Compétence"}, content : "Ajouter Chaos Steed et +20 Conduite (Cheval) ?"}) if (ride) { - let skill = await game.wfrp4e.utility.findSkill("Ride (Horse)") + let skill = await game.wfrp4e.utility.findSkill("Chevaucher (Cheval)") skill = skill.toObject(); skill.system.advances.value = 20; items = items.concat({name : "Chaos Steed", type: "trapping", "system.trappingType.value" : "misc"}, skill) } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) console.log(">>>>>>><", items) diff --git a/scripts/oV81zgbZsuTFG6L2.js b/scripts/oV81zgbZsuTFG6L2.js index 368a83a..3c555d3 100644 --- a/scripts/oV81zgbZsuTFG6L2.js +++ b/scripts/oV81zgbZsuTFG6L2.js @@ -2,4 +2,4 @@ let caster = this.effect.sourceActor; this.actor.modifyWounds(caster.system.characteristics.fel.bonus); -this.script.scriptMessage(`Guérison de ${caster.system.characteristics.fel.bonus} Blessures`); \ No newline at end of file +this.script.message(`Healed ${caster.system.characteristics.fel.bonus} Wounds`); \ No newline at end of file diff --git a/scripts/oWM43EdUiyHgUlfW.js b/scripts/oWM43EdUiyHgUlfW.js deleted file mode 100644 index 2c1af1d..0000000 --- a/scripts/oWM43EdUiyHgUlfW.js +++ /dev/null @@ -1,2 +0,0 @@ -if (args.test.item && args.test.item.name == game.i18n.localize("NAME.ConsumeAlcohol")) - args.test.preData.canReverse = true \ No newline at end of file diff --git a/scripts/oWa7RkScnl6lR5vd.js b/scripts/oWa7RkScnl6lR5vd.js index 4440e93..d19357a 100644 --- a/scripts/oWa7RkScnl6lR5vd.js +++ b/scripts/oWa7RkScnl6lR5vd.js @@ -1,11 +1,11 @@ -if (args.test.characteristicKey == "wp") +if (args.test.characteristicKey == "wp") { - if (args.test.failed) + if (args.Test.Échoué) { let item = await fromUuid("Compendium.wfrp4e-core.items.AGcJl5rHjkyIQBPP") let data = item.toObject(); this.actor.createEmbeddedDocuments("Item", [data]) - - this.script.scriptMessage(`Test de Force Mentale échoué, ${this.actor.prototypeToken.name} @UUID[Compendium.wfrp4e-core.items.AGcJl5rHjkyIQBPP] pour [[1d10]] heures`) + + this.script.message(`Test de FM échoué, ${this.actor.prototypeToken.name} gain de @UUID[Compendium.wfrp4e-core.items.AGcJl5rHjkyIQBPP] pour [[1d10]] heures`) } } \ No newline at end of file diff --git a/scripts/obIXhQXKFyyQoNNV.js b/scripts/obIXhQXKFyyQoNNV.js deleted file mode 100644 index a580ad1..0000000 --- a/scripts/obIXhQXKFyyQoNNV.js +++ /dev/null @@ -1,7 +0,0 @@ -this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {appendTitle: ` - ${this.effect.name}`, fields: { difficulty: "average" } }).then(async test => { - await test.roll() - if (test.failed) { - this.actor.modifyWounds(-1); - this.script.scriptMessage("Subit 1 Dégat") - } -}) \ No newline at end of file diff --git a/scripts/okW06V9UiPC4Vcrn.js b/scripts/okW06V9UiPC4Vcrn.js index 4145903..d00f57e 100644 --- a/scripts/okW06V9UiPC4Vcrn.js +++ b/scripts/okW06V9UiPC4Vcrn.js @@ -12,8 +12,8 @@ let characteristics = { } let skills = ["Calme", "Esquive"] let skillAdvancements = [10, 10] -let talents = ["Combat Reflexes", "Resolute"] -let trappings = ["Leather Jack", "Leather Leggings", "Leather Skullcap", "Arme simple", "Spear", "Shield"] +let talents = ["Combat Instinctif", "Déterminé"] +let trappings = ["Veste de cuir", "Jambières de cuir", "Calotte de cuir", "Arme simple", "Lance", "Bouclier"] let items = []; let updateObj = this.actor.toObject(); @@ -30,7 +30,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,14 +63,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); - diff --git a/scripts/p222EiR8RRtlPm31.js b/scripts/p222EiR8RRtlPm31.js deleted file mode 100644 index f757919..0000000 --- a/scripts/p222EiR8RRtlPm31.js +++ /dev/null @@ -1,3 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "hard"}}) -await test.roll(); -return test.failed; \ No newline at end of file diff --git a/scripts/p7NJB1PsY6X5q8OO.js b/scripts/p7NJB1PsY6X5q8OO.js deleted file mode 100644 index 7d4d43d..0000000 --- a/scripts/p7NJB1PsY6X5q8OO.js +++ /dev/null @@ -1,15 +0,0 @@ -if (this.actor.system.details.experience.current < 100) { - return this.script.notification(game.i18n.localize("SCRIPT.NotEnoughXP")) -} - -let traits = await warhammer.utility.findAllItems("trait"); -traits = traits.filter(t => t.name.includes("Companion Trait")); - -let items = await ItemDialog.create(traits); -this.actor.createEmbeddedDocuments("Item", items); -let expLog = foundry.utils.duplicate(this.actor.details.experience.log || []); -expLog.push({amount : 100, reason: items[0].name, spent: this.actor.details.experience.spent + 100, total: this.actor.details.experience.total, type: "spent"}); -this.actor.update({ - "system.details.experience.spent": this.actor.details.experience.spent + 100, - "system.details.experience.log": expLog - }); \ No newline at end of file diff --git a/scripts/pAgiAGyaLJY10894.js b/scripts/pAgiAGyaLJY10894.js deleted file mode 100644 index 13da9da..0000000 --- a/scripts/pAgiAGyaLJY10894.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Charm"); \ No newline at end of file diff --git a/scripts/pHyXdPnWwoFrUA5n.js b/scripts/pHyXdPnWwoFrUA5n.js deleted file mode 100644 index 954e03e..0000000 --- a/scripts/pHyXdPnWwoFrUA5n.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Entertain")); \ No newline at end of file diff --git a/scripts/pNPjXEoQGHLKzq0r.js b/scripts/pNPjXEoQGHLKzq0r.js deleted file mode 100644 index f8f8a86..0000000 --- a/scripts/pNPjXEoQGHLKzq0r.js +++ /dev/null @@ -1,12 +0,0 @@ -let talent = this.actor.has("Magie des Arcanes (Lumière)", "talent") -let demon = this.actor.has(game.i18n.localize("NAME.Daemonic")) - -if (!talent) -{ - await this.actor.addCondition("blinded") -} - -if (demon) -{ - await this.actor.addCondition("stunned") -} \ No newline at end of file diff --git a/scripts/pR4Q2OnPxXtwRVli.js b/scripts/pR4Q2OnPxXtwRVli.js index 492f95a..7d8788a 100644 --- a/scripts/pR4Q2OnPxXtwRVli.js +++ b/scripts/pR4Q2OnPxXtwRVli.js @@ -2,11 +2,11 @@ let criticals = this.actor.itemTypes.critical; if (criticals.length) { - this.script.scriptNotification("Ne peut subir de Blessures Critiques"); + this.script.notification("Impossible de recevoir une Blessure Critique "); this.actor.deleteEmbeddedDocuments("Item", criticals.map(i => i.id)) } -if (getProperty(args.data, "system.status.wounds.value") == 0) +if (foundry.utils.getProperty(args.data, "system.status.wounds.value") == 0) { - this.script.scriptNotification(`Endormi pour ${Math.ceil(CONFIG.Dice.randomUniform() * 10)} Rounds`) + this.script.notification(`Endormi pendant ${Math.ceil(CONFIG.Dice.randomUniform() * 10)} tours`) } \ No newline at end of file diff --git a/scripts/pRp6hoBJ0JQa4NNG.js b/scripts/pRp6hoBJ0JQa4NNG.js new file mode 100644 index 0000000..840bc34 --- /dev/null +++ b/scripts/pRp6hoBJ0JQa4NNG.js @@ -0,0 +1 @@ +return args.item?.system?.attackType != "ranged" || this.actor.system.canFly.effects.filter(e => e.name != "Flying")[0].disabled \ No newline at end of file diff --git a/scripts/pdvCwjxHI56EmxuU.js b/scripts/pdvCwjxHI56EmxuU.js new file mode 100644 index 0000000..c5a9017 --- /dev/null +++ b/scripts/pdvCwjxHI56EmxuU.js @@ -0,0 +1,7 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.sJ3yX1kvzu2hgNq5") +let amphibious = item.toObject(); + +item = await fromUuid("Compendium.wfrp4e-core.items.Item.9h82z72XGo9tfgQS") +let as = item.toObject(); +as.name += " (Sight)"; +await this.actor.createEmbeddedDocuments("Item", [amphibious, as], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/pj7gjxHrnrZonC6U.js b/scripts/pj7gjxHrnrZonC6U.js new file mode 100644 index 0000000..04c2ee7 --- /dev/null +++ b/scripts/pj7gjxHrnrZonC6U.js @@ -0,0 +1,4 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.8pVzgPkgWpTJvfhG") +let data = item.toObject(); +data.name = `${data.name} (Mort-vivant, Warm-bloods)`; +await this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/pkKpxVqRHIzywerL.js b/scripts/pkKpxVqRHIzywerL.js index 208a37c..066161e 100644 --- a/scripts/pkKpxVqRHIzywerL.js +++ b/scripts/pkKpxVqRHIzywerL.js @@ -2,5 +2,5 @@ const ablaze = this.actor.hasCondition("ablaze"); if (ablaze) { ablaze.delete(); - this.script.scriptNotification("Résiste à En Flammes"); + this.script.notification("Résistance à l'état En Flammes"); } \ No newline at end of file diff --git a/scripts/ppc8L3WtIx6JzlAd.js b/scripts/ppc8L3WtIx6JzlAd.js new file mode 100644 index 0000000..881a7c3 --- /dev/null +++ b/scripts/ppc8L3WtIx6JzlAd.js @@ -0,0 +1,5 @@ +if (args.equipped) { + await this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.mDgEMOoJpi8DkRYb", this.effect); +} else { + this.effect.deleteCreatedItems() +} \ No newline at end of file diff --git a/scripts/pq1YQffxtOcqCRTn.js b/scripts/pq1YQffxtOcqCRTn.js deleted file mode 100644 index b6f09a8..0000000 --- a/scripts/pq1YQffxtOcqCRTn.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {appendTitle: ` - ${this.effect.name}`}) -await test.roll(); -if (!test.succeeded) -{ - this.actor.addCondition("prone") -} \ No newline at end of file diff --git a/scripts/pqQkeUVpuZ0jOKnZ.js b/scripts/pqQkeUVpuZ0jOKnZ.js new file mode 100644 index 0000000..77175d9 --- /dev/null +++ b/scripts/pqQkeUVpuZ0jOKnZ.js @@ -0,0 +1,25 @@ +const tables = [ + game.wfrp4e.tables.findTable("mutatephys"), + game.wfrp4e.tables.findTable("mutatephys", "Khorne"), +]; + +if (!tables.length) { + return ui.notifications.error("Table de Mutation introuvable, veuillez vous assurer qu'une table avec la clé `mutatephys` est importée dans le monde."); +} + +const values = {} + +let i = 0; +for (const table of tables) { + values[i] = table.name; + i++; +} + +const key = await ValueDialog.create({}, null, values); +const table = tables[key]; + +const results = (await table.drawMany(2)).results; +const uuids = results.map(result => `Compendium.${result.documentCollection}.${result.documentId}`); + +await this.actor.addEffectItems(uuids, this.effect); +this.script.notification("TTirage de mutation effectué et appliqué"); \ No newline at end of file diff --git a/scripts/pvTcazVvW4v04otW.js b/scripts/pvTcazVvW4v04otW.js new file mode 100644 index 0000000..0416ce4 --- /dev/null +++ b/scripts/pvTcazVvW4v04otW.js @@ -0,0 +1,3 @@ +if (args.totalWoundLoss > 0) { + await 0rgs.actor.addCondition("poisoned", 2) +} \ No newline at end of file diff --git a/scripts/pzknBcJtZWeliE27.js b/scripts/pzknBcJtZWeliE27.js deleted file mode 100644 index 1fcf80e..0000000 --- a/scripts/pzknBcJtZWeliE27.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name == game.i18n.localize("NAME.Leadership") || args.item?.name == game.i18n.localize("NAME.Cool") \ No newline at end of file diff --git a/scripts/q0LvphC8RDSyR0oY.js b/scripts/q0LvphC8RDSyR0oY.js index 5141713..1d83b0b 100644 --- a/scripts/q0LvphC8RDSyR0oY.js +++ b/scripts/q0LvphC8RDSyR0oY.js @@ -3,6 +3,6 @@ let choice = await ItemDialog.create(ItemDialog.objectToArray({ t : game.wfrp4e.config.characteristics.t, ag : game.wfrp4e.config.characteristics.ag, wp : game.wfrp4e.config.characteristics.wp -}, this.effect.img), 1, "Choisir une caractéristique"); +}, this.effect.img), 1, "Choisir la caractéristique"); this.effect.updateSource({"flags.wfrp4e.characteristic" : choice[0].id}) \ No newline at end of file diff --git a/scripts/q5RgoYr12kBF6FA5.js b/scripts/q5RgoYr12kBF6FA5.js new file mode 100644 index 0000000..70008c6 --- /dev/null +++ b/scripts/q5RgoYr12kBF6FA5.js @@ -0,0 +1 @@ +return args.item?.system?.attackType == "ranged" && this.item == args.item && !this.actor.isOpposing \ No newline at end of file diff --git a/scripts/q8lOAWr2970sZeTw.js b/scripts/q8lOAWr2970sZeTw.js index 087f192..8ce63ac 100644 --- a/scripts/q8lOAWr2970sZeTw.js +++ b/scripts/q8lOAWr2970sZeTw.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpentry)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Trade (Carpentry)'; const difficulty = 'challenging'; const target = 20; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/qAEZgtu5CrfUkxhx.js b/scripts/qAEZgtu5CrfUkxhx.js index 2e1e4ea..007d2e9 100644 --- a/scripts/qAEZgtu5CrfUkxhx.js +++ b/scripts/qAEZgtu5CrfUkxhx.js @@ -1,16 +1,16 @@ -if (args.test.options.staunchBleeding) +if (args.test.options.staunchBleeding) { - if (args.test.succeeded) + if (args.test.succeeded) { let staunch = Number(args.test.result.SL) + 1 if (args.test.options.fieldDressing && args.test.result.reversed) { staunch = Math.min(1, Number(args.test.result.SL)) + 1 } - args.test.result.other.push(`${this.actor.name} guérit ${staunch} états Hémorragiques du patient.`) + args.test.result.other.push(`${this.actor.name} enlève ${staunch} Etats Hémmoragie du patient.`) } - else if (this.actor.characteristics.int.bonus + Number(args.test.result.SL) < 0) + else if (this.actor.characteristics.int.bonus + Number(args.Test.result.SL) < 0) { - args.test.result.other.push(`Le patient est victime d'une @UUID[Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg]{Infection Mineure}.`) + args.Test.result.other.push(`Le patient contracte une @UUID[Compendium.wfrp4e-core.items.Item.1hQuVFZt9QnnbWzg]{Infection Mineure}.`) } } \ No newline at end of file diff --git a/scripts/qDYJnO2JosPJrjpz.js b/scripts/qDYJnO2JosPJrjpz.js new file mode 100644 index 0000000..9c756be --- /dev/null +++ b/scripts/qDYJnO2JosPJrjpz.js @@ -0,0 +1,20 @@ +if (args.totalWoundLoss <= 0) return; + +// Poisoned handled by Venin trait + +const test = await args.actor.setupSkill(game.i18n.localize("NAME.Cool"), { + skipTargets: true, + appendTitle: ` — ${this.effect.name}`, + fields: {difficulty: "average"}, + context: { + failure: `Gain de 1 Point de Corruption.` + } +}); + +await test.roll(); + +if (test.failed && args.actor.type === "character") + args.actor.update({"system.status.corruption.value": args.actor.system.status.corruption.value + 1}); + + +await args.actor.applyEffect({effects : this.item.effects.getName("Morsure du Crâne Pourpre")}) \ No newline at end of file diff --git a/scripts/qITSQMvvkgj81fW1.js b/scripts/qITSQMvvkgj81fW1.js new file mode 100644 index 0000000..228105d --- /dev/null +++ b/scripts/qITSQMvvkgj81fW1.js @@ -0,0 +1 @@ +return !["t", "s"].includes(args.characteristic) \ No newline at end of file diff --git a/scripts/qSwCYMMiIHmSV1X5.js b/scripts/qSwCYMMiIHmSV1X5.js index 1379278..8479cd4 100644 --- a/scripts/qSwCYMMiIHmSV1X5.js +++ b/scripts/qSwCYMMiIHmSV1X5.js @@ -3,11 +3,11 @@ if (this.item.system.quantity.value) this.item.system.reduceQuantity(); let actor = Array.from(game.user.targets)[0]?.actor || this.actor; let effectData = this.item.effects.contents[0].convertToApplied(); - effectData.flags.wfrp4e.sourceItem = this.item.uuid + effectData.system.sourceData.item = this.item.uuid effectData.duration.seconds = 10800 actor.applyEffect({effectData : [effectData]}) } else { - this.script.scriptNotification("None left!", "error") + this.script.notification("Plus rien !", "error") } \ No newline at end of file diff --git a/scripts/qTk96NKh14YOIShf.js b/scripts/qTk96NKh14YOIShf.js deleted file mode 100644 index 29dea3c..0000000 --- a/scripts/qTk96NKh14YOIShf.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name === game.i18n.localize("NAME.Haggle"); \ No newline at end of file diff --git a/scripts/qZ8TBagp2d4dJAqI.js b/scripts/qZ8TBagp2d4dJAqI.js new file mode 100644 index 0000000..b2075c9 --- /dev/null +++ b/scripts/qZ8TBagp2d4dJAqI.js @@ -0,0 +1 @@ +return !args.weapon || args.weapon?.system.isMelee \ No newline at end of file diff --git a/scripts/qaVde0sTuMBRi2nl.js b/scripts/qaVde0sTuMBRi2nl.js deleted file mode 100644 index 2bd32fd..0000000 --- a/scripts/qaVde0sTuMBRi2nl.js +++ /dev/null @@ -1 +0,0 @@ -return ["NAME.Evaluate", "NAME.Gamble"].map(i => game.i18n.localize(i)).includes(args.skill?.name) \ No newline at end of file diff --git a/scripts/qhjU1QdsfqA8h5iI.js b/scripts/qhjU1QdsfqA8h5iI.js new file mode 100644 index 0000000..24fd01a --- /dev/null +++ b/scripts/qhjU1QdsfqA8h5iI.js @@ -0,0 +1 @@ +return args.item?.system?.attackType != "ranged" || !this.item.equipped.value \ No newline at end of file diff --git a/scripts/qijgjcOBCDmhglRX.js b/scripts/qijgjcOBCDmhglRX.js deleted file mode 100644 index 49dfaeb..0000000 --- a/scripts/qijgjcOBCDmhglRX.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.SleightOfHand"); \ No newline at end of file diff --git a/scripts/qmGwT929EiZ3lW2x.js b/scripts/qmGwT929EiZ3lW2x.js new file mode 100644 index 0000000..8b23efb --- /dev/null +++ b/scripts/qmGwT929EiZ3lW2x.js @@ -0,0 +1,8 @@ +if (args.weaponProperties.qualities.penetrating) +{ + args.alreadyPenetrating = true; +} +else +{ + args.weaponProperties.qualities.penetrating = true; +} \ No newline at end of file diff --git a/scripts/qmH61HmrEJcmQTiu.js b/scripts/qmH61HmrEJcmQTiu.js new file mode 100644 index 0000000..9cbc1b6 --- /dev/null +++ b/scripts/qmH61HmrEJcmQTiu.js @@ -0,0 +1,3 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.tNWrJUOArwfWXsPw"); +item = item.toObject(); +this.actor.createEmbeddedDocuments("Item", [item], {fromEffect : this.effect.id}); \ No newline at end of file diff --git a/scripts/qmOt7h17hGAKqQe0.js b/scripts/qmOt7h17hGAKqQe0.js index 9c3eef5..aa58aa4 100644 --- a/scripts/qmOt7h17hGAKqQe0.js +++ b/scripts/qmOt7h17hGAKqQe0.js @@ -1,24 +1,11 @@ -let choice = await Dialog.wait({ - title: this.effect.name, - content: `

    ${this.effect.name}: Est-ce que l'attaque magique ou à distance provient de l'extérieur du Dome?

    `, - buttons: { - yes: { - label: "Oui", - callback: () => { - return true; - } - }, - no: { - label: "Non", - callback: () => { - return false; - } - } - } -}) -if (choice) +if (!args.opposedTest.attackerTest.item?.system?.isMelee) { - args.ward = 6; -} \ No newline at end of file + let choice = await foundry.applications.api.DialogV2.confirm({ window: { title: this.effect.name }, content: `

    ${this.effect.name}: Is this a ranged or magical attack that orignates outside the Dome?

    ` }) + + if (choice) + { + args.ward = 6; + } +} diff --git a/scripts/qu194dVXm9Vx1TGk.js b/scripts/qu194dVXm9Vx1TGk.js index 756fd99..2f4e988 100644 --- a/scripts/qu194dVXm9Vx1TGk.js +++ b/scripts/qu194dVXm9Vx1TGk.js @@ -1,10 +1,10 @@ if (args.test.options.useOnesSupportive && (args.test.result.roll <= game.settings.get("wfrp4e", "automaticSuccess") || args.test.result.roll <= args.test.target)) { - let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll / 10) - let ones = Number(args.test.result.roll.toString().split("").pop()) + let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll / 10) + let ones = Number(args.test.result.roll.toString().split("").pop()) - if (ones > SL) { - args.test.data.result.SL = "+" + (ones + args.test.successBonus + args.test.slBonus) - args.test.result.other.push(`${this.effect.name}: Utilise le dé d'unité comme DR`) - } + if (ones > SL) { + args.Test.data.result.SL = "+" + (ones + args.test.successBonus + args.test.slBonus) + args.test.result.other.push(`${this.effect.name}: Valeur d'unité utilisée comme DR`) + } } \ No newline at end of file diff --git a/scripts/quPcuKsq2fcild4a.js b/scripts/quPcuKsq2fcild4a.js deleted file mode 100644 index 3ebda0b..0000000 --- a/scripts/quPcuKsq2fcild4a.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "easy"}, context: {failure : `${this.effect.name}: Vomit!`} }) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone") -} \ No newline at end of file diff --git a/scripts/qxzhPtysAjPWspKf.js b/scripts/qxzhPtysAjPWspKf.js index 90bcbd0..0d3caea 100644 --- a/scripts/qxzhPtysAjPWspKf.js +++ b/scripts/qxzhPtysAjPWspKf.js @@ -1,4 +1,4 @@ if (this.actor.has("Mort-vivant") || this.actor.has("Démoniaque")) { - this.script.scriptNotification(`Ne peut entrer ${this.effect.name}!`); + this.script.notification(`Impossible d'entrer dans ${this.effect.name} !`); } \ No newline at end of file diff --git a/scripts/qyBmkCJo5606o4J9.js b/scripts/qyBmkCJo5606o4J9.js new file mode 100644 index 0000000..0780ef6 --- /dev/null +++ b/scripts/qyBmkCJo5606o4J9.js @@ -0,0 +1 @@ +this.item.system.flaws.value = this.item.system.flaws.value.filter(i => i.name != "weakpoints") \ No newline at end of file diff --git a/scripts/qzGPJflVW7c2Ciim.js b/scripts/qzGPJflVW7c2Ciim.js deleted file mode 100644 index cb29090..0000000 --- a/scripts/qzGPJflVW7c2Ciim.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Cool"); \ No newline at end of file diff --git a/scripts/rBAoyhzeU3Q8MVSk.js b/scripts/rBAoyhzeU3Q8MVSk.js index fe9ccf9..89361d0 100644 --- a/scripts/rBAoyhzeU3Q8MVSk.js +++ b/scripts/rBAoyhzeU3Q8MVSk.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpenter)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Métier (Charpentier)'; const difficulty = 'difficult'; const target = 50; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/rCh3ltUrUMovd2Kc.js b/scripts/rCh3ltUrUMovd2Kc.js index 5145c61..44ada18 100644 --- a/scripts/rCh3ltUrUMovd2Kc.js +++ b/scripts/rCh3ltUrUMovd2Kc.js @@ -1,5 +1,5 @@ if (this.actor.hasCondition("surprised")) { - this.script.scriptNotification("Ne peut être surpris"); + this.script.notification("Impossible d'être surpris"); this.actor.removeCondition("surprised"); } \ No newline at end of file diff --git a/scripts/rF0Z3hTUUnSxL3Mq.js b/scripts/rF0Z3hTUUnSxL3Mq.js index 38216c0..c8e59ac 100644 --- a/scripts/rF0Z3hTUUnSxL3Mq.js +++ b/scripts/rF0Z3hTUUnSxL3Mq.js @@ -5,7 +5,7 @@ let nightVision = (await fromUuid("Compendium.wfrp4e-core.items.FmHDbCOy3pH8yKhm let tracker = (await fromUuid("Compendium.wfrp4e-core.items.ClOlztW6hH8rslbp")).toObject() let weapon = (await fromUuid("Compendium.wfrp4e-core.items.AtpAudHA4ybXVlWM")).toObject() -armour.name = "Armure (Caché)" +armour.name = "Armour (Hide)" armour.system.specification.value = 2 bite.system.specification.value = 3 fear.system.specification.value = 2 @@ -21,17 +21,17 @@ let champion = (await fromUuid("Compendium.wfrp4e-core.items.4mF5Sp3t09kZhBYc")) let die = (await fromUuid("Compendium.wfrp4e-core.items.UsJ2uIOOtHA7JqD5")).toObject()//{Die Hard} let fast = (await fromUuid("Compendium.wfrp4e-core.items.9MjH4xyVrd3Inzak")).toObject()//{Fast} let frenzy = (await fromUuid("Compendium.wfrp4e-core.items.yRhhOlt18COq4e1q")).toObject()//{Frenzy} -let immunity = (await fromUuid("Compendium.wfrp4e-core.items.IAWyzDfC286a9MPz")).toObject()//{Immunity to Psychology} -let regenerate = (await fromUuid("Compendium.wfrp4e-core.items.SfUUdOGjdYpr3KSR")).toObject()//{Regenerate} -let size = (await fromUuid("Compendium.wfrp4e-core.items.8slW8CJ2oVTxeQ6q")).toObject()//{Size (Large)} +let immunity = (await fromUuid("Compendium.wfrp4e-core.items.IAWyzDfC286a9MPz")).toObject()//{Immunité Psychologique} +let regenerate = (await fromUuid("Compendium.wfrp4e-core.items.SfUUdOGjdYpr3KSR")).toObject()//{Régénération} +let size = (await fromUuid("Compendium.wfrp4e-core.items.8slW8CJ2oVTxeQ6q")).toObject()//{Taille (Large)} blessed.system.specification.value = "Ulric" -size.system.specification.value = "Grande" +size.system.specification.value = "Large" let optional = [belligerent, bestial, big, blessed, champion, die, fast, frenzy, immunity, regenerate, size]; -let chosen = await ItemDialog.create(optional, "unlimited", "Choisissez un Trai optionnel"); +let chosen = await ItemDialog.create(optional, "unlimited", "Choisir des Traits Optionnels"); items = items.concat(chosen || []) -this.script.scriptNotification(`Ajout de ${items.map(i => i.name).join(", ")}`); +this.script.notification(`Adding ${items.map(i => i.name).join(", ")}`); this.actor.createEmbeddedDocuments("Item", items, {fromEffect : this.effect.id}) diff --git a/scripts/rJ8pspSekyDLkiqG.js b/scripts/rJ8pspSekyDLkiqG.js new file mode 100644 index 0000000..574e5cb --- /dev/null +++ b/scripts/rJ8pspSekyDLkiqG.js @@ -0,0 +1 @@ +return args.skill.name === game.i18n.localize("NAME.Cool") \ No newline at end of file diff --git a/scripts/rX8FTinyTMj9WJri.js b/scripts/rX8FTinyTMj9WJri.js index d0c393f..e655346 100644 --- a/scripts/rX8FTinyTMj9WJri.js +++ b/scripts/rX8FTinyTMj9WJri.js @@ -5,12 +5,12 @@ if (this.actor.hasCondition("dead")) return; const currentHoled = this.actor.flags.holed.holed || 0; const openGunPorts = this.actor.itemTypes.vehicleMod.reduce((acc, m) => { - if (!m.name.toLowerCase().includes("gun port")) + if (!m.name.toLowerCase().includes("gun port")) return acc; - + let closed = m.getFlag("wfrp4e-soc", "gunport"); if (!closed) acc++; - + return acc; }, 0); @@ -20,11 +20,11 @@ this.actor.flags.holed.total = totalHoled; if (totalHoled >= toughness) { const speaker = ChatMessage.getSpeaker({actor: this.actor}); - this.script.scriptMessage(` -

    ${speaker.alias} sank due to having Holed (${totalHoled}) rating equal to, or exceeding its Toughness (${toughness })

    + this.script.message(` +

    ${speaker.alias} coule en raison d'un score Percé (${totalHoled}) égal ou supérieur à sa Robustesse (${toughness })

    - Holed due to Critical Damage: ${currentHoled}
    - Holed due to opened Gun Ports: ${openGunPorts} + Percé en raison de dégâts critiques : ${currentHoled}
    + Percé en raison de sabords ouverts : ${openGunPorts}

    `, { flavor: this.effect.name.split("(")[0]}); this.actor.addCondition("dead"); diff --git a/scripts/rXMylpnEtZpwou6x.js b/scripts/rXMylpnEtZpwou6x.js deleted file mode 100644 index d0c2d7f..0000000 --- a/scripts/rXMylpnEtZpwou6x.js +++ /dev/null @@ -1,8 +0,0 @@ -this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty : "average"}}).then(async test => -{ - await test.roll() - if (test.failed) - { - this.actor.addCondition("fatigued") - } -}) \ No newline at end of file diff --git a/scripts/ramav4ymrDDkPKK4.js b/scripts/ramav4ymrDDkPKK4.js index f15a01f..b809b07 100644 --- a/scripts/ramav4ymrDDkPKK4.js +++ b/scripts/ramav4ymrDDkPKK4.js @@ -1,9 +1,9 @@ if (this.actor.hasCondition("bleeding")) { this.actor.removeCondition("bleeding"); - this.script.scriptNotification("Suppression d'1 état Hémmoragique") + this.script.notification("Retiré 1 Etat Hémmoragie") } -else +else { - this.script.scriptNotification("Aucun état Hémorragique"); + this.script.notification("Aucun Etat Hémmoragie"); } \ No newline at end of file diff --git a/scripts/ratP9ByLjQPiLlFK.js b/scripts/ratP9ByLjQPiLlFK.js index 5e33cd1..2f2917a 100644 --- a/scripts/ratP9ByLjQPiLlFK.js +++ b/scripts/ratP9ByLjQPiLlFK.js @@ -1 +1 @@ -args.data.canReverse = true \ No newline at end of file +args.data.reversal = {allowed : true, if: "success"}; \ No newline at end of file diff --git a/scripts/rdaMhMyHrJjQ6vVC.js b/scripts/rdaMhMyHrJjQ6vVC.js index f5d1678..ee4cdaf 100644 --- a/scripts/rdaMhMyHrJjQ6vVC.js +++ b/scripts/rdaMhMyHrJjQ6vVC.js @@ -1 +1 @@ -game.wfrp4e.utility.postFear(this.item.Advances, this.actor.name) \ No newline at end of file +game.wfrp4e.utility.postPeur(this.item.Advances, this.actor.name) \ No newline at end of file diff --git a/scripts/re1UFtxvRRjpPB7Z.js b/scripts/re1UFtxvRRjpPB7Z.js index 332391e..8cefa2e 100644 --- a/scripts/re1UFtxvRRjpPB7Z.js +++ b/scripts/re1UFtxvRRjpPB7Z.js @@ -3,11 +3,11 @@ let data = item.toObject(); data.system.location.key = this.item.system.location.key if (data.system.location.key[0] == "r") { - data.system.location.value = "Right Ankle" + data.system.location.value = "Cheville droite" } else if (data.system.location.key[0] == "l") { - data.system.location.value = "Left Ankle" + data.system.location.value = "Cheville gauche" } this.actor.createEmbeddedDocuments("Item", [data], {skipLocationValue : true, fromEffect: this.effect.id}) diff --git a/scripts/red2bt4PGgIWAdTR.js b/scripts/red2bt4PGgIWAdTR.js deleted file mode 100644 index 3abf986..0000000 --- a/scripts/red2bt4PGgIWAdTR.js +++ /dev/null @@ -1,14 +0,0 @@ -if (this.item.system.quantity.value) -{ - this.item.system.reduceQuantity(); - let actor = Array.from(game.user.targets)[0]?.actor || this.actor; - let effectData = this.item.effects.contents[0].convertToApplied(); - let minutes = Math.ceil(CONFIG.Dice.randomUniform() * 10) * 10; - effectData.duration.seconds = 60 * minutes - this.script.scriptMessage(`Durée: ${minutes} minutes`, {whisper : ChatMessage.getWhisperRecipients("GM")}) - actor.applyEffect({effectData : [effectData]}) -} -else -{ - this.script.scriptNotification("Aucun disponible!", "error") -} \ No newline at end of file diff --git a/scripts/rgnGu3IQrS8Vj9Op.js b/scripts/rgnGu3IQrS8Vj9Op.js new file mode 100644 index 0000000..c9365dc --- /dev/null +++ b/scripts/rgnGu3IQrS8Vj9Op.js @@ -0,0 +1,3 @@ +const bonus = game.settings.get("wfrp4e", "homebrew").advantageBonus; + +args.fields.modifier += bonus; \ No newline at end of file diff --git a/scripts/rlTvhnDpj4lzfusf.js b/scripts/rlTvhnDpj4lzfusf.js deleted file mode 100644 index 2a8b74f..0000000 --- a/scripts/rlTvhnDpj4lzfusf.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Sail")) && args.skill?.name !== game.i18n.localize("NAME.Climb"); \ No newline at end of file diff --git a/scripts/rly9iBUy8EX7NhQT.js b/scripts/rly9iBUy8EX7NhQT.js index c6e64e8..4197399 100644 --- a/scripts/rly9iBUy8EX7NhQT.js +++ b/scripts/rly9iBUy8EX7NhQT.js @@ -1,14 +1,14 @@ if (game.user.targets.size !== 1) - return ui.notifications.warn("You must target exactly one Boat."); + return ui.notifications.warn("Vous devez cibler exactement un seul Bateau."); const target = game.user.targets.first(); const vehicle = target.actor; -if (!(vehicle.system instanceof VehicleModel)) - return ui.notifications.warn("You can only Constrict a Boat"); +if (!(vehicle.system instanceof VehicleModel)) + return ui.notifications.warn("Vous ne pouvez Constrict qu'un Bateau"); if (vehicle.size > 3) - return ui.notifications.warn("You can only Constrict vessels of Size Large or smaller"); + return ui.notifications.warn("Vous ne pouvez Constrict que des navires de Taille Large ou plus petits"); const turns = Math.ceil(vehicle.system.details.length.value / 10); @@ -24,4 +24,4 @@ await this.actor.applyEffect({effectData: [effectData]}); const speaker = ChatMessage.getSpeaker({actor: this.actor}); -this.script.scriptMessage(`${speaker.alias} started wrapping itself around the ${target.name} and will be able to start crushing it after ${turns} turns.`); \ No newline at end of file +this.script.message(`${speaker.alias} a commencé à s'enrouler autour du ${target.name} et pourra commencer à l'écraser après ${turns} tours.`); \ No newline at end of file diff --git a/scripts/rnioLwiJP7ps5Jwy.js b/scripts/rnioLwiJP7ps5Jwy.js deleted file mode 100644 index 2a24ede..0000000 --- a/scripts/rnioLwiJP7ps5Jwy.js +++ /dev/null @@ -1,4 +0,0 @@ -if (args.item.type == "skill" && args.item.name == "Corps à corps (Base)") -{ - args.item.system.modifier.value += 30; -} \ No newline at end of file diff --git a/scripts/roKvPHDSpX4IV11C.js b/scripts/roKvPHDSpX4IV11C.js deleted file mode 100644 index 2210782..0000000 --- a/scripts/roKvPHDSpX4IV11C.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Perform")) && args.characteristic != "ag" \ No newline at end of file diff --git a/scripts/roYVcP5Zqcsa8jVw.js b/scripts/roYVcP5Zqcsa8jVw.js new file mode 100644 index 0000000..523e0eb --- /dev/null +++ b/scripts/roYVcP5Zqcsa8jVw.js @@ -0,0 +1 @@ +args.actor.system.details.move.value -= 1; \ No newline at end of file diff --git a/scripts/rpxQU26BU7nwjtqY.js b/scripts/rpxQU26BU7nwjtqY.js index 3ed305a..84cd61a 100644 --- a/scripts/rpxQU26BU7nwjtqY.js +++ b/scripts/rpxQU26BU7nwjtqY.js @@ -1,15 +1,15 @@ let location = this.item.system.location.key -let test = await this.actor.setupCharacteristic("dex", {context : {failure : `${this.effect.name}: Lâche l'objet!`}, skipTargets: true, appendTitle : " - " + this.effect.name, fields : {difficulty : "average"}}) -await test.roll(); +let test = await this.actor.setupCharacteristic("dex", {context : {failure : `${this.effect.name}: Lâchez l'objet!`}, skipTargets: true, appendTitle : " - " + this.effet.name, fields : {difficulty : "average"}}) +await Test.roll(); -if (location && test.failed) +if (location && Test.Échoué) { let dropped = this.item.system.weaponsAtLocation; if (dropped.length) { - this.script.scriptNotification(`Laché ${dropped.map(i => i.name).join(", ")}!`) + this.script.notification(`Vous lâchez ${dropped.map(i => i.name).join(", ")}!`) for(let weapon of dropped) { await weapon.system.toggleEquip(); diff --git a/scripts/rr4htuVq45onXdRG.js b/scripts/rr4htuVq45onXdRG.js deleted file mode 100644 index e494852..0000000 --- a/scripts/rr4htuVq45onXdRG.js +++ /dev/null @@ -1,2 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {appendTitle: ` - ${this.effect.name}`, fields : {difficulty : "average"}}) -test.roll(); \ No newline at end of file diff --git a/scripts/rxB1AqfVMDqTRieE.js b/scripts/rxB1AqfVMDqTRieE.js deleted file mode 100644 index 132e672..0000000 --- a/scripts/rxB1AqfVMDqTRieE.js +++ /dev/null @@ -1 +0,0 @@ -return !["ws", "bs", "ag"].includes(args.characteristic) && args.skill?.name != game.i18n.localize("NAME.Perception") \ No newline at end of file diff --git a/scripts/s6eZXfZkC1My6EXl.js b/scripts/s6eZXfZkC1My6EXl.js index 529b249..4b46aa6 100644 --- a/scripts/s6eZXfZkC1My6EXl.js +++ b/scripts/s6eZXfZkC1My6EXl.js @@ -1,5 +1,5 @@ let lore = this.effect.name.split(" ")[2].toLowerCase(); -if (args.item.type == "spell" && game.wfrp4e.config.magicLores[args.item.system.lore.value].toLowerCase() == lore) +if (args.item.type == "spell" && args.item.system.lore.value == lore) { - args.item.system.cn.value -= 1 -} \ No newline at end of file + args.item.system.cn.value = Math.max(0, args.item.system.cn.value - 1); +} diff --git a/scripts/s7gJQdzuM3fz2zQK.js b/scripts/s7gJQdzuM3fz2zQK.js deleted file mode 100644 index 86e431a..0000000 --- a/scripts/s7gJQdzuM3fz2zQK.js +++ /dev/null @@ -1,11 +0,0 @@ -let item = await fromUuid("Compendium.wfrp4e-core.items.QluSTTTq3viHJJUh") -let data = item.toObject(); -data.system.location.value = "Hip" -this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone") -} \ No newline at end of file diff --git a/scripts/s7kW3lm2eU5IPrLP.js b/scripts/s7kW3lm2eU5IPrLP.js new file mode 100644 index 0000000..1e8ca58 --- /dev/null +++ b/scripts/s7kW3lm2eU5IPrLP.js @@ -0,0 +1,9 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.JQa5DLnTs2SEzRrc") +let dv = item.toObject(); + +item = await fromUuid("Compendium.wfrp4e-core.items.Item.OzwDT6kzoLYeeR2d") +let stealthy = item.toObject(); + +item = await fromUuid("Compendium.wfrp4e-core.items.Item.XSb3QVB9ipPBFt56") +let shadow = item.toObject(); +this.actor.createEmbeddedDocuments("Item", [dv, stealthy, shadow], {fromEffect : this.effect.id}); \ No newline at end of file diff --git a/scripts/s9J1TUkpGdvSWvPO.js b/scripts/s9J1TUkpGdvSWvPO.js new file mode 100644 index 0000000..de9a331 --- /dev/null +++ b/scripts/s9J1TUkpGdvSWvPO.js @@ -0,0 +1 @@ +this.actor.addCondition("blinded"); \ No newline at end of file diff --git a/scripts/s9KcytRE7i0cU06n.js b/scripts/s9KcytRE7i0cU06n.js new file mode 100644 index 0000000..60edf56 --- /dev/null +++ b/scripts/s9KcytRE7i0cU06n.js @@ -0,0 +1,5 @@ +if (["dragon"].includes(args.opposedTest.defender.details.species.value.toLowerCase())) + { + args.modifiers.other.push({label : this.effect.name, details : "Blessures Doublées vs Dragons", value : args.totalWoundLoss}); + args.totalWoundLoss *=2; + } \ No newline at end of file diff --git a/scripts/sB4KB9bT3nQhAoqG.js b/scripts/sB4KB9bT3nQhAoqG.js index 9e83a15..317229b 100644 --- a/scripts/sB4KB9bT3nQhAoqG.js +++ b/scripts/sB4KB9bT3nQhAoqG.js @@ -1,12 +1,12 @@ // This script needs to be separate because equipTransfer is off on the other effect, and thus won't execute when added to an actor let mainEffect = this.item.effects.contents[0]; -if (mainEffect.name.includes("")) +if (mainEffect.name.includes("")) { - let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.magicLores, this.item.img), 1, "Choisissez le Savoir"); + let choice = await ItemDialog.create(ItemDialog.objectToArray(game.wfrp4e.config.magicLores, this.item.img), 1, "Choisir le Savoir"); if (choice.length) { - mainEffect.update({name : mainEffect.name.replace("", choice[0].name)}) + mainEffect.update({name : mainEffect.name.replace("", choice[0].name)}) this.item.update({name : this.item.name += ` (${choice[0].name})`}) } } diff --git a/scripts/sKO8TcLIkCTnFvXu.js b/scripts/sKO8TcLIkCTnFvXu.js index 3040b9c..421ffc8 100644 --- a/scripts/sKO8TcLIkCTnFvXu.js +++ b/scripts/sKO8TcLIkCTnFvXu.js @@ -1,2 +1,2 @@ args.abort = true; -this.script.scriptNotification(`Ne peut utiliser ${this.item.system.location.value}!`, "error") \ No newline at end of file +this.script.notification(`Cannot use ${this.item.system.location.value}!`, "error") \ No newline at end of file diff --git a/scripts/sNSfDBIA2k17hPYI.js b/scripts/sNSfDBIA2k17hPYI.js index 61f51c7..1620d60 100644 --- a/scripts/sNSfDBIA2k17hPYI.js +++ b/scripts/sNSfDBIA2k17hPYI.js @@ -2,5 +2,5 @@ let ablaze = this.actor.hasCondition("ablaze"); if (ablaze) { ablaze?.delete(); - this.script.scriptNotification("Ignore En Flammes"); + this.script.notification("État En Flammes ignoré"); } diff --git a/scripts/sPvfYQEnyAYNpIhF.js b/scripts/sPvfYQEnyAYNpIhF.js index f1369d8..0e39680 100644 --- a/scripts/sPvfYQEnyAYNpIhF.js +++ b/scripts/sPvfYQEnyAYNpIhF.js @@ -1,6 +1,6 @@ -let shouldDamage = await Dialog.confirm({ - title: this.effect.name + " - " + args.actor.name - content: "Are you humanoid creature who have not made a sacrifice to Rhya (or another diety of nature or powerful nature spirit to whom the cult of Rhya are well disposed, such as Isha or Taal) since the last spring equinox?" +let shouldDamage = await foundry.applications.api.DialogV2.confirm({ + window : {title: this.effect.name + " - " + args.actor.name}, + content: "Êtes-vous une créature humanoïde qui n'a pas fait de sacrifice à Rhya (ou à une autre divinité de la nature ou esprit puissant de la nature auquel le culte de Rhya est bien disposé, comme Isha ou Taal) depuis le dernier équinoxe de printemps ?" }); if (shouldDamage) { diff --git a/scripts/sSMg43ZjnNmpytfj.js b/scripts/sSMg43ZjnNmpytfj.js deleted file mode 100644 index a18fd9b..0000000 --- a/scripts/sSMg43ZjnNmpytfj.js +++ /dev/null @@ -1,2 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : " - " + this.effect.name}); -await test.roll(); diff --git a/scripts/sUHuj00IpoZ7Gd03.js b/scripts/sUHuj00IpoZ7Gd03.js deleted file mode 100644 index f8f4072..0000000 --- a/scripts/sUHuj00IpoZ7Gd03.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Swim"); \ No newline at end of file diff --git a/scripts/sWyO1DNaqb2EdHoW.js b/scripts/sWyO1DNaqb2EdHoW.js deleted file mode 100644 index 61e1c1b..0000000 --- a/scripts/sWyO1DNaqb2EdHoW.js +++ /dev/null @@ -1,11 +0,0 @@ -if (!this.actor.items.getName(game.i18n.localize("NAME.Frenzy"))) // Either frenzy trait or psychology -{ - // Add Frenzy psychology - let item = await fromUuid("Compendium.wfrp4e-core.items.DrNUTPeodEgpWTnT") - let data = item.toObject(); - data.effects[0].disabled = false; - this.actor.createEmbeddedDocuments("Item", [data], {fromEffect: this.effect.id}) -} - -this.script.scriptMessage(`

    En buvant cette potion, ${this.actor.prototypeToken.name} est devenu sujet à la Frénesie. Cette Frénésie dure [[1d10]] Rounds, et ne peut pas se terminer avant.

    `, - {whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) \ No newline at end of file diff --git a/scripts/sZwLitzwKBTaFca3.js b/scripts/sZwLitzwKBTaFca3.js index 34341d3..ff9ec80 100644 --- a/scripts/sZwLitzwKBTaFca3.js +++ b/scripts/sZwLitzwKBTaFca3.js @@ -1,4 +1,4 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.Item.5hH73j2NgPdsLCZN") let data = item.toObject(); -data.name = data.name.replace("Cible", "Peaux vertes, Mort-vivant, Chaos") +data.name = data.name.replace("Target", "Greenskins, Mort-vivant, Chaos") this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/sagKJM6oDFlw4ED2.js b/scripts/sagKJM6oDFlw4ED2.js deleted file mode 100644 index 4392e3b..0000000 --- a/scripts/sagKJM6oDFlw4ED2.js +++ /dev/null @@ -1,3 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}); -await test.roll(); -return test.failed; \ No newline at end of file diff --git a/scripts/sbK1a7txpSoXFzyB.js b/scripts/sbK1a7txpSoXFzyB.js index 2396c93..1bacd08 100644 --- a/scripts/sbK1a7txpSoXFzyB.js +++ b/scripts/sbK1a7txpSoXFzyB.js @@ -1,10 +1,15 @@ if (args.test.options.useOnesArgumentative && (args.test.result.roll <= game.settings.get("wfrp4e", "automaticSuccess") || args.test.result.roll <= args.test.target)) { - let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll / 10) - let ones = Number(args.test.result.roll.toString().split("").pop()) + let SL = Math.floor(args.test.target / 10) - Math.floor(args.test.result.roll / 10) + let ones = Number(args.test.result.roll.toString().split("").pop()) - if (ones > SL) { - args.test.data.result.SL = "+" + (ones + args.test.successBonus + args.test.slBonus) - args.test.result.other.push(`${this.effect.name}: Utilise le dé d'unité comme DR`) - } + if (ones == 0) { + ones = 10; + } + + + if (ones > SL) { + args.Test.data.result.SL = "+" + (ones + args.test.successBonus + args.test.slBonus) + args.test.result.other.push(`${this.effect.name}: Utilisation de l'unité des dés comme DR`) + } } \ No newline at end of file diff --git a/scripts/sgS9rblPkQB36C8S.js b/scripts/sgS9rblPkQB36C8S.js deleted file mode 100644 index 249616f..0000000 --- a/scripts/sgS9rblPkQB36C8S.js +++ /dev/null @@ -1,29 +0,0 @@ -if (this.item.name.includes("(")) -{ - let trade = this.item.parenthesesText; - if (trade?.toLowerCase() != "any") - return this.item.updateSource({"system.tests.value" : this.item.system.tests.value.replace("any one", trade)}) -} - -let index = game.packs -.filter(i => i.metadata.type == "Item") -.reduce((acc, pack) => acc.concat(pack.index.contents), []) -.filter(i => i.type == "skill" && i.name.includes(game.i18n.localize("NAME.Trade"))) -.map(i => { - i.id = i._id - return i -}) - -let choice = await ItemDialog.create(index, 1, "Choisissez a Trade Skill") -let text; -if (!choice[0]) -{ - let custom = await ValueDialog.create({text : "Enter Custom Trade Skill", title : "Custom Trade"}); - text = custom || "" -} -else -{ - text = game.wfrp4e.utility.extractParenthesesText(choice[0].name) -} - -await this.item.updateSource({name : this.item.name.replace("(Any)", "").replace("(any)", "").trim() + ` (${text})`, "system.tests.value" : this.item.system.tests.value.replace("any one", text)}); \ No newline at end of file diff --git a/scripts/shkBUtUuMPDKvFm7.js b/scripts/shkBUtUuMPDKvFm7.js index 601e774..0bfeafb 100644 --- a/scripts/shkBUtUuMPDKvFm7.js +++ b/scripts/shkBUtUuMPDKvFm7.js @@ -6,5 +6,5 @@ await test.roll(); if (test.failed) { this.actor.addCondition("prone") - this.script.scriptMessage(`${this.actor.prototypeToken.name} tombe de ${fallen} mètres`) + this.script.message(`${this.actor.prototypeToken.name} falls ${fallen} yards`) } \ No newline at end of file diff --git a/scripts/sjnoYbWpAugyDilW.js b/scripts/sjnoYbWpAugyDilW.js index 298d039..8db279b 100644 --- a/scripts/sjnoYbWpAugyDilW.js +++ b/scripts/sjnoYbWpAugyDilW.js @@ -1,10 +1,10 @@ -let test = await args.actor.setupSkill("Charm", { +let test = await args.actor.setupSkill("Charme", { appendTitle: ` – ${this.effect.name}`, skipTargets: true, fields: {difficulty: 'average'}, characteristic: 'fel', context: { - success: "Animal becomes docile towards Humans, Elves who honour Isha, and similar allies." + success: "L'animal devient docile envers les Humains, les Elfes qui honorent Isha, et des alliés similaires." } }); await test.roll(); \ No newline at end of file diff --git a/scripts/sm9d5lk6cM0OuUkf.js b/scripts/sm9d5lk6cM0OuUkf.js index 97c8f33..ac25ac3 100644 --- a/scripts/sm9d5lk6cM0OuUkf.js +++ b/scripts/sm9d5lk6cM0OuUkf.js @@ -1 +1 @@ -this.actor.applyFear(Math.min(4, this.effect.sourceTest.result.overcast.usage.other.current)) \ No newline at end of file +this.actor.applyPeur(Math.min(4, this.effect.sourceTest.result.overcast.usage.other.current)) \ No newline at end of file diff --git a/scripts/svCqdytEOtqFXCcs.js b/scripts/svCqdytEOtqFXCcs.js index 44b595a..e9f9a88 100644 --- a/scripts/svCqdytEOtqFXCcs.js +++ b/scripts/svCqdytEOtqFXCcs.js @@ -15,9 +15,9 @@ let skillAdvancements = [5, 15, 10, 10, 15, 10, 10, 20] let talents = ["Magie des Arcanes", "Magie Mineure", "Seconde Vue"] let trappings = ["Arme simple", "Robes", "(2M) Bâton de combat"] -let specialItems = [ - {name: "Objet magique", type: "trapping", trappingType: "misc" }, -] +let specialItems = [ + {name: "Objet magique", type: "trapping", trappingType: "misc" }, +] let items = []; let updateObj = this.actor.toObject(); @@ -46,7 +46,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -62,13 +62,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { - ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) + ui.notifications.warn(`Could not find ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -79,24 +79,24 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } -let ride = await Dialog.confirm({title : "Skill", content : "Add Chaos Steed and +20 Ride (Horse)?"}) +let ride = await foundry.applications.api.DialogV2.confirm({window : {title : "Compétence"}, content : "Add Chaos Steed and +20 Ride (Horse)?"}) if (ride) { - let skill = await game.wfrp4e.utility.findSkill("Ride (Horse)") + let skill = await game.wfrp4e.utility.findSkill("Chevaucher (Cheval)") skill = skill.toObject(); skill.system.advances.value = 20; items = items.concat({name : "Chaos Steed", type: "trapping", "system.trappingType.value" : "misc"}, skill) } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); diff --git a/scripts/sx7Ikn8WW00gBFb4.js b/scripts/sx7Ikn8WW00gBFb4.js index 72ec0cd..8b867e0 100644 --- a/scripts/sx7Ikn8WW00gBFb4.js +++ b/scripts/sx7Ikn8WW00gBFb4.js @@ -2,14 +2,14 @@ let location = (Math.ceil(CONFIG.Dice.randomUniform() * 2) == 2 ? "r" : "l") + " if (location == "lArm") { - this.script.scriptNotification("Résultat : gauche") + this.script.notification("Bras Gauche") } else if (location == "rArm") { - this.script.scriptNotification("Résultat : Droite") + this.script.notification("Bras Droit") } -this.effect.updateSource({"flags.wfrp4e.location" : location}); +this.effet.updateSource({"flags.wfrp4e.location" : location}); if (location) { @@ -17,7 +17,7 @@ if (location) if (dropped.length) { - this.script.scriptNotification(`Laché ${dropped.map(i => i.name).join(", ")}!`) + this.script.notification(`Lâche ${dropped.map(i => i.name).join(", ")}!`) for(let weapon of dropped) { await weapon.system.toggleEquip(); @@ -27,6 +27,6 @@ if (location) let roll = await new Roll("1d10").roll() -roll.toMessage(this.script.getChatData({flavor : `${this.effect.name} (Durée)`})); +roll.toMessage(this.script.getChatData({flavor : `Lâche ${dropped.map(i => i.name).join(", ")}!`})); -this.effect.updateSource({"duration.rounds" : roll.total}) \ No newline at end of file +this.effet.updateSource({"duration.rounds" : roll.total}) \ No newline at end of file diff --git a/scripts/syBgPp7rOymCZejX.js b/scripts/syBgPp7rOymCZejX.js deleted file mode 100644 index 3007947..0000000 --- a/scripts/syBgPp7rOymCZejX.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("stunned") -} \ No newline at end of file diff --git a/scripts/syRJs8P4aBFB5USD.js b/scripts/syRJs8P4aBFB5USD.js new file mode 100644 index 0000000..63594a2 --- /dev/null +++ b/scripts/syRJs8P4aBFB5USD.js @@ -0,0 +1,7 @@ +if (this.actor?.system?.details?.god?.value !== "Sigmar") return +if (this.actor?.currentCareer?.careergroup?.value !== "Prêtre" + && this.actor?.currentCareer?.careergroup?.value !== "Prêtre Guerrier" ) return + +let currentSin = this.actor.system.status.sin.value +let updatedSin = currentSin + 2 +await this.actor.update({"system.status.sin.value": updatedSin}) \ No newline at end of file diff --git a/scripts/syqqBkyP5tGqZ78t.js b/scripts/syqqBkyP5tGqZ78t.js index 1aa106f..cbfbf50 100644 --- a/scripts/syqqBkyP5tGqZ78t.js +++ b/scripts/syqqBkyP5tGqZ78t.js @@ -1,8 +1,8 @@ this.actor.has("Immunité Psychologique")?.delete(); -let roll = await new Roll("1d10").roll(); +let roll = await new Roll("1d10").roll({allowInteractive : false}); roll.toMessage(this.script.getChatData()); -this.script.scriptNotification(`Immunité Psychologique a été supprimé de l'acteur, ajout de ${roll.total} états Brisé`) +this.script.notification(`Removed Immunité Psychologique, Adding ${roll.total} Broken Conditions`) this.actor.addCondition("broken", roll.total, {"flags.wfrp4e.blasted-mind" : true}) \ No newline at end of file diff --git a/scripts/sz0PqS1kroMOzUZk.js b/scripts/sz0PqS1kroMOzUZk.js index b01c63a..ce6b9fe 100644 --- a/scripts/sz0PqS1kroMOzUZk.js +++ b/scripts/sz0PqS1kroMOzUZk.js @@ -10,12 +10,12 @@ let characteristics = { "wp" : 15, "fel" : -20 } -let skills = ["Melee (Brawling)"] +let skills = ["Corps à corps (Bagarre)"] let skillAdvancements = [10] -let talents = ["Fearless (Everything)", "Frenzy", "Implacable"] -let trappings = ["Plate Breastplate", "Plate Bracers", "Plate Helm", "Plate Leggings"] -let specialItems = [] +let talents = ["Peurless (Everything)", "Frénésie", "Endurci"] +let trappings = ["Plastron d'acier", "Brassards", "Heaume", "Jambières d'acier"] +let specialItems = [] let items = []; let updateObj = this.actor.toObject(); @@ -44,7 +44,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -60,13 +60,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -77,13 +77,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) console.log(">>>>>>><", items) diff --git a/scripts/t48hkacYdOpzWvK9.js b/scripts/t48hkacYdOpzWvK9.js index 6e8c53a..21b79df 100644 --- a/scripts/t48hkacYdOpzWvK9.js +++ b/scripts/t48hkacYdOpzWvK9.js @@ -1 +1 @@ -args.options.beatBlade = true; \ No newline at end of file +args.context.beatBlade = true; \ No newline at end of file diff --git a/scripts/t56mnblo1kv3gM1M.js b/scripts/t56mnblo1kv3gM1M.js deleted file mode 100644 index 906ab3a..0000000 --- a/scripts/t56mnblo1kv3gM1M.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes("Corps à corps (Base)") || (args.type == "weapon" && args.item?.system.weaponGroup.value == "basic"); \ No newline at end of file diff --git a/scripts/tCIT1a12Gt6k2ohA.js b/scripts/tCIT1a12Gt6k2ohA.js index 3948c43..8b2d5ed 100644 --- a/scripts/tCIT1a12Gt6k2ohA.js +++ b/scripts/tCIT1a12Gt6k2ohA.js @@ -5,17 +5,17 @@ if (this.item.name.includes("(") && !this.item.name.toLowerCase().includes("(any } else { - resistance = await ValueDialog.create({text : "Enter Resistance", title : "Resistance"}) + resistance = await ValueDialog.create({text : "Entrez la Résistance", title : "Résistance"}) if (resistance) { this.item.updateSource({name : `${this.item.name.split("(")[0].trim()} (${resistance})`}) - this.effect.updateSource({name : this.effect.name + ` (${resistance})`}) + this.effet.updateSource({name : this.effet.name + ` (${resistance})`}) } } -this.item.updateSource({"system.tests.value" : this.item.system.tests.value.replace("the associated Threat", resistance)}) +this.item.updateSource({"system.tests.value" : this.item.system.Tests.value.replace("the associated Threat", resistance)}) -if (resistance && !this.effect.name.includes("(")) +if (resistance && !this.effet.name.includes("(")) { this.effect.updateSource({name : this.effect.name += ` (${resistance})`}) } \ No newline at end of file diff --git a/scripts/tDrs0aNIYmZPsOoS.js b/scripts/tDrs0aNIYmZPsOoS.js deleted file mode 100644 index 51bdf06..0000000 --- a/scripts/tDrs0aNIYmZPsOoS.js +++ /dev/null @@ -1,6 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}); -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("prone") -} diff --git a/scripts/tG1qGqzBLmAR3WHm.js b/scripts/tG1qGqzBLmAR3WHm.js deleted file mode 100644 index 64fa199..0000000 --- a/scripts/tG1qGqzBLmAR3WHm.js +++ /dev/null @@ -1,15 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); -if (test.failed) -{ - let add = 0 - - if (test.result.roll % 11 == 0 || test.result.roll == 100) - { - add = 1 // can't use isFumble if no hit location - } - - await this.actor.addCondition("stunned", Math.max(1, Math.abs(test.result.SL)) + add) - await this.actor.addCondition("blinded", Math.max(1, Math.abs(test.result.SL))) - -} \ No newline at end of file diff --git a/scripts/tGVEV6TLl310mFLP.js b/scripts/tGVEV6TLl310mFLP.js index 8ca630f..7e023f5 100644 --- a/scripts/tGVEV6TLl310mFLP.js +++ b/scripts/tGVEV6TLl310mFLP.js @@ -1,5 +1,5 @@ let nonmagical = args.modifiers.ap.value - args.modifiers.ap.magical -if (args.applyAP && nonmagical) +if (args.applyAP && nonmagical) { let nonmagical = args.modifiers.ap.value - args.modifiers.ap.magical args.modifiers.ap.ignored += nonmagical diff --git a/scripts/tHBlC7SpYiQ7SUGo.js b/scripts/tHBlC7SpYiQ7SUGo.js new file mode 100644 index 0000000..8684f63 --- /dev/null +++ b/scripts/tHBlC7SpYiQ7SUGo.js @@ -0,0 +1 @@ +return args.characteristic !== "t"; \ No newline at end of file diff --git a/scripts/tNTO1LVN7JqHf4YN.js b/scripts/tNTO1LVN7JqHf4YN.js index b3c20cc..6ef02e0 100644 --- a/scripts/tNTO1LVN7JqHf4YN.js +++ b/scripts/tNTO1LVN7JqHf4YN.js @@ -1,8 +1,8 @@ -if (args.test.characteristicKey == "wp") +if (args.test.characteristicKey == "wp") { - if (args.test.failed) + if (args.Test.Échoué) { this.actor.createEmbeddedDocuments("ActiveEffect", [game.wfrp4e.config.symptomEffects["malaise"]]) - this.script.scriptMessage(`Test de Force Mentale échoué, ${this.actor.prototypeToken.name} subit @Condition[Malaise] pour [[1d10]] heures`, {whisper: ChatMessage.getWhisperRecipients("GM")}) + this.script.message(`Test de FM échoué, ${this.actor.prototypeToken.name} gains @Condition[Malaise] for [[1d10]] hours`, {whisper: ChatMessage.getWhisperRecipients("GM")}) } } \ No newline at end of file diff --git a/scripts/tUwP7TjrOOOnaCYJ.js b/scripts/tUwP7TjrOOOnaCYJ.js index 847aba0..3653502 100644 --- a/scripts/tUwP7TjrOOOnaCYJ.js +++ b/scripts/tUwP7TjrOOOnaCYJ.js @@ -1,10 +1,10 @@ let fatigued = this.actor.hasCondition("fatigued") if (fatigued) { - this.script.scriptNotification(`Suppression de ${fatigued.conditionValue} états Fatigué`) - fatigued.delete(); + this.script.notification(`Suppression de ${fatigued.conditionValue} états Extenué`) + fatigued.delete(); } -else +else { - this.script.scriptNotification(`Aucun état Fatigué`) + this.script.notification(`Aucun état Extenué`) } \ No newline at end of file diff --git a/scripts/tcZug8ehU6lyYBd9.js b/scripts/tcZug8ehU6lyYBd9.js deleted file mode 100644 index 1b51877..0000000 --- a/scripts/tcZug8ehU6lyYBd9.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != "Projectiles (Poudre noire)" \ No newline at end of file diff --git a/scripts/tfdKU6nmvUtEjXE2.js b/scripts/tfdKU6nmvUtEjXE2.js deleted file mode 100644 index ba0a3cb..0000000 --- a/scripts/tfdKU6nmvUtEjXE2.js +++ /dev/null @@ -1,38 +0,0 @@ -let choice = await Dialog.wait({ - title : "Choice", - content : - `

    - Select your choice -

    - `, - buttons : { - 1 : { - label : "Shield", - callback : () => { - return "shield" - } - }, - 2 : { - label : "Two-Handed Weapon", - callback : () => { - return "twohanded" - } - }, - } -}) - -let weapons = await warhammer.utility.findAllItems("weapon", "Loading Weapons"); -let items -if (choice == "shield") -{ - items = await game.wfrp4e.apps.ItemDialog.create(weapons.filter(i => i.system.properties.qualities.shield), 1, "Choisissez a Shield"); -} -else if (choice == "twohanded") -{ - items = await game.wfrp4e.apps.ItemDialog.create(weapons.filter(i => i.system.weaponGroup.value == "twohanded"), 1, "Choisissez a Two-Handed Weapon"); -} -items = items.map(i => i.toObject()) - -items.forEach(i => i.system.equipped.value) - -this.actor.createEmbeddedDocuments("Item", items); diff --git a/scripts/tg9N6aUo8WRPKj3H.js b/scripts/tg9N6aUo8WRPKj3H.js new file mode 100644 index 0000000..5d74f84 --- /dev/null +++ b/scripts/tg9N6aUo8WRPKj3H.js @@ -0,0 +1,11 @@ +// If the creature currently has a Surprised, Unconscious, or Entangled Condition, it does not gain this Advantage. +const surprised = this.actor.hasCondition("surprised") +const unconscious = this.actor.hasCondition("unconscious") +const entangled = this.actor.hasCondition("entangled") +if (entangled || unconscious || surprised) return + +// If, at the beginning of its turn, this creature does not have at least Rating Advantage points, its Advantage pool immediately increases to Rating. +const grimRating = parseInt(this.item.specification.value) || 1 +if (grimRating > this.actor.status.advantage.value) { + this.actor.setAdvantage(grimRating) +} \ No newline at end of file diff --git a/scripts/tkZ8Ybqu518LQYEn.js b/scripts/tkZ8Ybqu518LQYEn.js new file mode 100644 index 0000000..b6f16a4 --- /dev/null +++ b/scripts/tkZ8Ybqu518LQYEn.js @@ -0,0 +1,2 @@ +await args.actor.addCondition("ablaze"); + args.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.4CMKeDTDrRQZbPIJ", this.effect, [{"system.specification.value": "Krezok Soulflayer"}]) \ No newline at end of file diff --git a/scripts/tn6SwmjAuNzqE6dx.js b/scripts/tn6SwmjAuNzqE6dx.js deleted file mode 100644 index e3cc68b..0000000 --- a/scripts/tn6SwmjAuNzqE6dx.js +++ /dev/null @@ -1,14 +0,0 @@ -let damage = 0 -let test = await this.actor.setupSkill("Esquive", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}); -await test.roll(); - -if (test.succeeded) -{ - damage = 10; -} -else if (test.failed) -{ - damage = 20; -} - -this.script.scriptMessage(await this.actor.applyBasicDamage(damage, {loc : "roll", hideDSN: true, suppressMsg : true})) \ No newline at end of file diff --git a/scripts/tnE8LF6E3svIlLca.js b/scripts/tnE8LF6E3svIlLca.js deleted file mode 100644 index 4058efe..0000000 --- a/scripts/tnE8LF6E3svIlLca.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.Research"); \ No newline at end of file diff --git a/scripts/tnilBagajWM8UGQt.js b/scripts/tnilBagajWM8UGQt.js deleted file mode 100644 index 1b8e882..0000000 --- a/scripts/tnilBagajWM8UGQt.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name != game.i18n.localize("NAME.ConsumeAlcohol") \ No newline at end of file diff --git a/scripts/toSrgcvWq9b5eN0K.js b/scripts/toSrgcvWq9b5eN0K.js index 01c486e..249ea79 100644 --- a/scripts/toSrgcvWq9b5eN0K.js +++ b/scripts/toSrgcvWq9b5eN0K.js @@ -1,4 +1,4 @@ let location = await game.wfrp4e.tables.rollTable("hitloc", {hideDSN: true}) this.item.updateSource({name : `${this.item.name} (${location.description})`}) -this.script.scriptMessage(`Localisation: ${location.description}`, { whisper: ChatMessage.getWhisperRecipients("GM") }) \ No newline at end of file +this.script.message(`Localisation: ${location.description}`, { whisper: ChatMessage.getWhisperRecipients("GM") }) \ No newline at end of file diff --git a/scripts/tolkNN5P7oOC8GKZ.js b/scripts/tolkNN5P7oOC8GKZ.js deleted file mode 100644 index e030d9d..0000000 --- a/scripts/tolkNN5P7oOC8GKZ.js +++ /dev/null @@ -1,11 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "difficult"}}) -await test.roll(); - -if (test.failed) -{ - let sourceActor = this.effect.sourceActor; - if (sourceActor) - { - this.script.scriptMessage(await this.actor.applyBasicDamage(sourceActor.system.characteristics.wp.bonus, {suppressMsg : true, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL})) - } -} \ No newline at end of file diff --git a/scripts/tpz88eQFTjWHdFL5.js b/scripts/tpz88eQFTjWHdFL5.js new file mode 100644 index 0000000..b66be3e --- /dev/null +++ b/scripts/tpz88eQFTjWHdFL5.js @@ -0,0 +1 @@ +return args.item?.system?.attackType != "ranged" || this.item != args.item || this.actor.isOpposing \ No newline at end of file diff --git a/scripts/tuIsytv3jl2yAIb2.js b/scripts/tuIsytv3jl2yAIb2.js deleted file mode 100644 index cf810e0..0000000 --- a/scripts/tuIsytv3jl2yAIb2.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name !== game.i18n.localize("NAME.Charm") && args.skill?.name !== game.i18n.localize("NAME.Intimidate") && args.skill?.name !== game.i18n.localize("NAME.Leadership") \ No newline at end of file diff --git a/scripts/tyQLkRLk1AXB4g2u.js b/scripts/tyQLkRLk1AXB4g2u.js new file mode 100644 index 0000000..4cdc5c6 --- /dev/null +++ b/scripts/tyQLkRLk1AXB4g2u.js @@ -0,0 +1,13 @@ +if (args.test.succeeded) { + args.test.result.critical = "Critical" + + args.test.result.tables.critical = { + label : args.test.result.critical, + class : "Critique-roll", + modifier : args.test.result.critModifier, + key: `crit${args.test.result.hitloc.result}` + } + + args.Test.result.other.push (`${this.effect.name}: Tout les succès sont des Critiques.`) + +} \ No newline at end of file diff --git a/scripts/u3olS2p7Ls1JXfAH.js b/scripts/u3olS2p7Ls1JXfAH.js index 5ee90b2..65de5e0 100644 --- a/scripts/u3olS2p7Ls1JXfAH.js +++ b/scripts/u3olS2p7Ls1JXfAH.js @@ -1 +1 @@ -this.script.scriptMessage(await game.wfrp4e.tables.formatChatRoll("mutatephys", {}, "Tzeentch")); \ No newline at end of file +this.script.message(await game.wfrp4e.tables.formatChatRoll("mutatephys", {}, "Tzeentch")); \ No newline at end of file diff --git a/scripts/u46KnlxCjP42F6QY.js b/scripts/u46KnlxCjP42F6QY.js new file mode 100644 index 0000000..3af88f1 --- /dev/null +++ b/scripts/u46KnlxCjP42F6QY.js @@ -0,0 +1,10 @@ +let table = await fromUuid("RollTable.uATmVS40DQLC1woJ"); + +if (table) +{ + table.roll(); +} +else +{ + this.script.notification("Table des Traits de personnalité introuvable", "error"); +} \ No newline at end of file diff --git a/scripts/u4fKgGFEnOCnvvsv.js b/scripts/u4fKgGFEnOCnvvsv.js new file mode 100644 index 0000000..19822ee --- /dev/null +++ b/scripts/u4fKgGFEnOCnvvsv.js @@ -0,0 +1 @@ +return args.item?.system?.isProjectiles; \ No newline at end of file diff --git a/scripts/uA5qaat5EXzkzltq.js b/scripts/uA5qaat5EXzkzltq.js new file mode 100644 index 0000000..1b5f535 --- /dev/null +++ b/scripts/uA5qaat5EXzkzltq.js @@ -0,0 +1,10 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {fields : {difficulty : "difficult"}, appendTitle : ` - ${this.effect.name}`}) +await test.roll(); +if (!test.succeeded) +{ + let plague = await fromUuid("Compendium.wfrp4e-core.items.Item.aKiuGzlVO51JvsjV") + let obj = plague.toObject(); + await this.actor.createEmbeddedDocuments("Item", [obj]); +} + +this.effect.delete(); \ No newline at end of file diff --git a/scripts/uACa6u4JLNMRgFlr.js b/scripts/uACa6u4JLNMRgFlr.js deleted file mode 100644 index 187f0c5..0000000 --- a/scripts/uACa6u4JLNMRgFlr.js +++ /dev/null @@ -1,2 +0,0 @@ -const talents = await Promise.all(["Assaut féroce", "Pied marin"].map(game.wfrp4e.utility.findTalent)) -this.actor.createEmbeddedDocuments("Item", talents, {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/uCJk19rijMPRU8jg.js b/scripts/uCJk19rijMPRU8jg.js new file mode 100644 index 0000000..3d0afbd --- /dev/null +++ b/scripts/uCJk19rijMPRU8jg.js @@ -0,0 +1,3 @@ +return this.item.equipped.value + && args?.weapon + && (["giant"].includes(args.target.Species.toLowerCase())) \ No newline at end of file diff --git a/scripts/uEVSUTTam4Z96JJ2.js b/scripts/uEVSUTTam4Z96JJ2.js new file mode 100644 index 0000000..b91829b --- /dev/null +++ b/scripts/uEVSUTTam4Z96JJ2.js @@ -0,0 +1,7 @@ +if (this.item.equipped.value + && args.opposedTest.attackerTest.item + && (args.opposedTest.attackerTest.item.isProjectiles || args.opposedTest.attackerTest?.spell) + ) +{ + args.modifiers.other.push({label : this.effect.name, details : "Réduction des Dégâts", value : -2}) +} \ No newline at end of file diff --git a/scripts/uLBDnWC3S0lRitbj.js b/scripts/uLBDnWC3S0lRitbj.js index 7bf367c..4186cc2 100644 --- a/scripts/uLBDnWC3S0lRitbj.js +++ b/scripts/uLBDnWC3S0lRitbj.js @@ -1,7 +1,7 @@ let test = await this.actor.setupCharacteristic("int", {skipTargets: true, appendTitle : ` - ${this.effect.name}`}) await test.roll(); -let opposedResult = test.opposedMessages[0]?.getOppose()?.resultMessage?.getOpposedTest()?.result +let opposedResult = test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result if (opposedResult?.winner == "attacker") { @@ -9,14 +9,14 @@ if (opposedResult?.winner == "attacker") { this.actor.addCondition("unconscious") await this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + 1}) - this.script.scriptMessage("Reçoit un Point de Corruption", {whisper : ChatMessage.getWhisperRecipients("GM")}) + this.script.message("Gain de 1 Point de Corruption", {whisper : ChatMessage.getWhisperRecipients("GM")}) } - else + else { await this.actor.addCondition("stunned", 1 + opposedResult.differenceSL); } } -else +else { return false; } \ No newline at end of file diff --git a/scripts/uMvD2HWFNGqCmrBM.js b/scripts/uMvD2HWFNGqCmrBM.js new file mode 100644 index 0000000..fd5055b --- /dev/null +++ b/scripts/uMvD2HWFNGqCmrBM.js @@ -0,0 +1,5 @@ +if (args.test.options.addChargingDice) +{ + args.test.result.diceDamage = {formula: "1d10", value : Math.ceil(CONFIG.Dice.randomUniform() * 10) } + args.test.result.additionalDamage += args.test.result.diceDamage.value; +} \ No newline at end of file diff --git a/scripts/uRiAvo9fb3U7FIIy.js b/scripts/uRiAvo9fb3U7FIIy.js new file mode 100644 index 0000000..dd2b981 --- /dev/null +++ b/scripts/uRiAvo9fb3U7FIIy.js @@ -0,0 +1 @@ +if (!this.actor.has("Bénédiction de Puissance","prayer")) this.actor.addEffectItems("Compendium.wfrp4e-core.items.Item.KSDrXcieyRc37YI7", this.effect) \ No newline at end of file diff --git a/scripts/uSwkYENTOcnfRrqA.js b/scripts/uSwkYENTOcnfRrqA.js deleted file mode 100644 index 05d9ada..0000000 --- a/scripts/uSwkYENTOcnfRrqA.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Melee")) && args.weapon?.system?.attackType != "melee" \ No newline at end of file diff --git a/scripts/uZeNKQ24fToJ7qtY.js b/scripts/uZeNKQ24fToJ7qtY.js new file mode 100644 index 0000000..6f0706a --- /dev/null +++ b/scripts/uZeNKQ24fToJ7qtY.js @@ -0,0 +1,15 @@ +let addWounds = 0 +switch (args.actor.system.details.size.value) { + case "lrg": + addWounds = 5 + break + case "enor": + addWounds = 10 + break + case "mnst": + addWounds = 15 + break +} +if (addWounds > 0) { + args.modifiers.other.push({label : this.effect.name, details : "Augmentation des Dégâts", value : addWounds}) +} \ No newline at end of file diff --git a/scripts/ucF4aiJ1gpDB333G.js b/scripts/ucF4aiJ1gpDB333G.js index 6c8bb05..7d00add 100644 --- a/scripts/ucF4aiJ1gpDB333G.js +++ b/scripts/ucF4aiJ1gpDB333G.js @@ -1,5 +1,5 @@ if (args.test.options.catfall && (args.test.result.roll <= game.settings.get("wfrp4e", "automaticSuccess") || args.test.result.roll <= args.test.target) && !args.test.result.catfall) { - args.test.result.other.push(`${this.effect.name}: Dommages de chutes réduit de ${Number(args.test.result.SL) + 1} mètres`) + args.test.result.other.push(`${this.effect.name}: Fall distance damage reduced by ${Number(args.test.result.SL) + 1} yards`) args.test.result.catfall = true; // Prevent duplicate messages } \ No newline at end of file diff --git a/scripts/ugL5IBB6R2yWyMWd.js b/scripts/ugL5IBB6R2yWyMWd.js index 97340d8..7c49ab4 100644 --- a/scripts/ugL5IBB6R2yWyMWd.js +++ b/scripts/ugL5IBB6R2yWyMWd.js @@ -1,23 +1,23 @@ if (args.totalWoundLoss > 0) { - let apply = await Dialog.confirm({title : this.effect.name, content : `

    Appliquer les dégats de ${this.effect.name}? L'attaquant doit avoir utilisé ses mains nues ou une arme de mêlée faite de métal.`}) + let apply = await foundry.applications.api.DialogV2.confirm({window : {title : this.effect.name}, content : `

    Appliquer les dégats de ${this.effect.name} ? L'attaquant doit avoir utilisé ses mains nues ou une arme de mêlée en métal.`}) if (apply) { - + let damage = 5 + this.actor.characteristics.wp.bonus; - + let loc = args.opposedTest.attackerTest.weapon?.system.usesHands[0] || "rArm"; - + let APatLoc = args.opposedTest.attacker.system.status.armour[loc]; - + let metalAP = APatLoc.layers.reduce((metal, layer) => metal += (layer.metal ? layer.value : 0), 0) - + let APused = Math.max(0, APatLoc.value - metalAP); // remove metal AP at location; - + damage -= (APused + args.opposedTest.attacker.system.characteristics.t.bonus) - + let msg = await args.opposedTest.attacker.applyBasicDamage(damage, {suppressMsg : true, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL}); - msg += ` (${metalAP} PA métalliques ignorés sur ${game.wfrp4e.config.locations[loc]})` - this.script.scriptMessage(msg) + msg += ` (Ignore ${metalAP} PA de métal sur ${game.wfrp4e.config.locations[loc]})` + this.script.message(msg) } } \ No newline at end of file diff --git a/scripts/uhCq5NwjQ2a2idPn.js b/scripts/uhCq5NwjQ2a2idPn.js index 632deef..03db384 100644 --- a/scripts/uhCq5NwjQ2a2idPn.js +++ b/scripts/uhCq5NwjQ2a2idPn.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Tailor)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Trade (Tailor)'; const difficulty = 'easy'; const target = 30; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/ulXfbycWUu36vdmS.js b/scripts/ulXfbycWUu36vdmS.js new file mode 100644 index 0000000..48dac2d --- /dev/null +++ b/scripts/ulXfbycWUu36vdmS.js @@ -0,0 +1,7 @@ +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "difficult", slBonus : -1 * this.effet.sourceTest.result.SL}}) +await Test.roll(); +if (Test.succeeded) +{ + this.script.notification(`Résistance à ${this.effect.name}`); +} +return test.failed; \ No newline at end of file diff --git a/scripts/upfK6GM33qZCZjll.js b/scripts/upfK6GM33qZCZjll.js deleted file mode 100644 index f2e0c11..0000000 --- a/scripts/upfK6GM33qZCZjll.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name != "Musicien (Luth)" \ No newline at end of file diff --git a/scripts/uwdQvZtzy2HVeEzx.js b/scripts/uwdQvZtzy2HVeEzx.js deleted file mode 100644 index f181413..0000000 --- a/scripts/uwdQvZtzy2HVeEzx.js +++ /dev/null @@ -1,14 +0,0 @@ -if (args.totalWoundLoss > 0) -{ - let roll = await new Roll("1d10").roll(); - roll.toMessage(this.script.getChatData()); - args.modifiers.other.push({label : this.effect.name, value : roll.total}) - - args.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "hard"}, skipTargets: true, appendTitle : " - " + this.effect.name}).then(async test => { - await test.roll(); - if (test.failed) - { - this.script.scriptMessage("" + args.actor.name + " subit un @Table[critbody]{Blessure Critique} au torse", {whisper: ChatMessage.getWhisperRecipients("GM")}) - } - }) -} diff --git a/scripts/ux3jaLpAUhZ5YqA6.js b/scripts/ux3jaLpAUhZ5YqA6.js deleted file mode 100644 index 66cae1b..0000000 --- a/scripts/ux3jaLpAUhZ5YqA6.js +++ /dev/null @@ -1 +0,0 @@ -return args.item?.name != game.i18n.localize("NAME.Leadership") && args.item?.name != game.i18n.localize("NAME.Cool") \ No newline at end of file diff --git a/scripts/v00nVCRKqqRvY28t.js b/scripts/v00nVCRKqqRvY28t.js index 7d632a2..b2f1300 100644 --- a/scripts/v00nVCRKqqRvY28t.js +++ b/scripts/v00nVCRKqqRvY28t.js @@ -1,4 +1,4 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "hard"}}); +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: {difficulty: "hard"}}); await test.roll(); if (test.failed) { diff --git a/scripts/v18mmwUmuKiVfwzQ.js b/scripts/v18mmwUmuKiVfwzQ.js index 518055f..7109477 100644 --- a/scripts/v18mmwUmuKiVfwzQ.js +++ b/scripts/v18mmwUmuKiVfwzQ.js @@ -1,4 +1,4 @@ -let test = await this.actor.setupTest(game.i18n.localize("NAME.Endurance"), {appendTitle : ` - ${this.effect.name}`, skipTargets: true}); +let test = await this.actor.setupTest(game.i18n.localize("NAME.Résistance"), {appendTitle : ` - ${this.effect.name}`, skipTargets: true}); await test.roll(); if (test.failed) { diff --git a/scripts/v4CCxVaVGf9i8U7X.js b/scripts/v4CCxVaVGf9i8U7X.js index cd216b9..12c380e 100644 --- a/scripts/v4CCxVaVGf9i8U7X.js +++ b/scripts/v4CCxVaVGf9i8U7X.js @@ -1,24 +1,10 @@ -let cured = await Dialog.wait({ - title : this.effect.name, - content : "

    Entrez le nombre de Poisons/Maladies soignés

    ", - buttons : { - confirm : { - label : "Confirmer", - callback : (dlg) => { - let input = dlg.find("input"); - value = parseInt(input[0].value); - return value; - } - } - } -}) - +let cured = await ValueDialog.create({text : "Entrez le nombre de maladies/poisons soignés", title : this.effect.name}) let damage = 0; let rolls = new Array(cured).fill("").map(i => `max(0, 1d10 - ${this.actor.system.characteristics.fel.bonus})`) -let test = new Roll(`${rolls.join(" + ")}`); +let Test = new Roll(`${rolls.join(" + ")}`); await test.roll(); test.toMessage({speaker : {alias : this.actor.name}, flavor : this.effect.name}); -this.script.scriptMessage(await this.actor.applyBasicDamage(test.total, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true })) \ No newline at end of file +this.script.message(await this.actor.applyBasicDamage(test.total, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true })) \ No newline at end of file diff --git a/scripts/v5xrDWcrTNFJkyQB.js b/scripts/v5xrDWcrTNFJkyQB.js index aaf860a..a3cefda 100644 --- a/scripts/v5xrDWcrTNFJkyQB.js +++ b/scripts/v5xrDWcrTNFJkyQB.js @@ -1,58 +1,50 @@ -let choice1 = [ - { - type : "skill", - name : "Projectiles (Arc)", - diff : { - system : { - advances : { - value : 10 +let addOption = await foundry.applications.api.DialogV2.confirm({ + window : {title : "Option"}, + content : + ` + Ajouter une option? +

    + Projectiles (Arc) +10 et un Arc long avec 12 flèches +

    + `, +}) + +let choice = [] + +if (addOption) +{ + choice = [ + { + type : "skill", + name : "Projectiles (Arc)", + diff : { + system : { + advances : { + value : 10 + } } } - } - }, - { - type : "weapon", - name : "Longbow", - }, - { - type : "ammunition", - name : "Arrow", - } -] -let choice2 = [ -] - -let choice = await Dialog.wait({ - title : "Option", - content : - `

    - Ajouter une option? -

    -
      -
    1. Projectiles (Arc) +10 et un Arc Long avec 12 flèches
    2. -
    - `, - buttons : { - 1 : { - label : "Yes", - callback : () => { - return choice1; - } }, - 2 : { - label : "No", - callback : () => { - return choice2; - } + { + type : "weapon", + name : "(2M) Arc long", + }, + { + type : "ammunition", + name : "Flèche (12)", } - } -}) + ]; +} + + + + let updateObj = this.actor.toObject(); let items = [] for (let c of choice) { - let existing + let existing if (c.type == "skill") { existing = updateObj.items.find(i => i.name == c.name && i.type == c.type) diff --git a/scripts/v6LIG7EwWYALxCpP.js b/scripts/v6LIG7EwWYALxCpP.js deleted file mode 100644 index 9bdb16a..0000000 --- a/scripts/v6LIG7EwWYALxCpP.js +++ /dev/null @@ -1 +0,0 @@ -return !this.effect.getFlag("wfrp4e", "trained")?.includes("entertain") || (!args.skill?.name.includes(game.i18n.localize("NAME.Entertain")) && !args.skill?.name.includes(game.i18n.localize("NAME.Perform")) && !args.skill?.name.includes(game.i18n.localize("NAME.Play"))) \ No newline at end of file diff --git a/scripts/vBqrydNzHmEHClqZ.js b/scripts/vBqrydNzHmEHClqZ.js new file mode 100644 index 0000000..48766c0 --- /dev/null +++ b/scripts/vBqrydNzHmEHClqZ.js @@ -0,0 +1,2 @@ +let maxWounds = this.actor.system.status.wounds.max +this.actor.update({"system.status.wounds.value": maxWounds}) \ No newline at end of file diff --git a/scripts/vFUVWZ1l8wpTjLcx.js b/scripts/vFUVWZ1l8wpTjLcx.js index bf87dfe..3796024 100644 --- a/scripts/vFUVWZ1l8wpTjLcx.js +++ b/scripts/vFUVWZ1l8wpTjLcx.js @@ -1,13 +1,13 @@ -if (!this.actor.has(game.i18n.localize("NAME.Daemonic"))) +if (!this.actor.has(game.i18n.localize("NAME.Démoniaque"))) return let caster = this.effect.sourceActor; -if (caster) +if (caster) { let wp = caster.system.characteristics.wp if (this.actor.system.characteristics.wp.value >= wp.value) { - this.script.scriptNotification("La cible a une Force Mentale supérieure, aucun effet") + this.script.notification("La cible a une FM supérieure, pas d'effet") return } this.actor.applyBasicDamage(wp.bonus, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL }) diff --git a/scripts/vJQRBxDfPwHens0a.js b/scripts/vJQRBxDfPwHens0a.js index ace2cb2..3403742 100644 --- a/scripts/vJQRBxDfPwHens0a.js +++ b/scripts/vJQRBxDfPwHens0a.js @@ -1,11 +1,11 @@ if (args.totalWoundLoss > 0) { - args.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: { difficulty: "difficult" } }).then(async test => { - await test.roll(); - if (test.failed) + args.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, fields: { difficulty: "difficult" } }).then(async Test => { + await Test.roll(); + if (Test.Échoué) { await args.actor.addCondition("poisoned") - this.script.scriptMessage(await args.actor.applyBasicDamage(3, {suppressMsg : true, damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL })) + this.script.message(await args.actor.applyBasicDamage(3, {suppressMsg : true, damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL })) } }) } \ No newline at end of file diff --git a/scripts/vNUGuypkhx2P5YIA.js b/scripts/vNUGuypkhx2P5YIA.js new file mode 100644 index 0000000..f941022 --- /dev/null +++ b/scripts/vNUGuypkhx2P5YIA.js @@ -0,0 +1 @@ +return args.characteristic !== "fel" \ No newline at end of file diff --git a/scripts/vS2D9QUslR7ZtXXm.js b/scripts/vS2D9QUslR7ZtXXm.js index 49c45c1..af1ce05 100644 --- a/scripts/vS2D9QUslR7ZtXXm.js +++ b/scripts/vS2D9QUslR7ZtXXm.js @@ -1,9 +1,9 @@ -let test = await this.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "hard"}}) -await test.roll(); -if (test.failed) +let test = await this.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, fields : {difficulty : "hard"}}) +await Test.roll(); +if (Test.Échoué) { - let roll = await new Roll("1d10").roll(); + let roll = await new Roll("1d10").roll({allowInteractive : false}); roll.toMessage(this.script.getChatData()) - this.script.scriptMessage(await this.actor.applyBasicDamage(roll.total, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true})) + this.script.message(await this.actor.applyBasicDamage(roll.total, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true})) } \ No newline at end of file diff --git a/scripts/vSDMygIT9nNvEGWG.js b/scripts/vSDMygIT9nNvEGWG.js index df2b0c4..88b2106 100644 --- a/scripts/vSDMygIT9nNvEGWG.js +++ b/scripts/vSDMygIT9nNvEGWG.js @@ -6,7 +6,7 @@ if (Math.ceil(CONFIG.Dice.randomUniform() * 10) == 1) { this.item.setFlag("wfrp4e", "brittle", true) ChatMessage.create({ content: ` - ${this.item.name} n'a plus de Poison. Il se brisera à sa prochaine utilisation.`, + ${this.item.name} has run out of poison. It will shatter the next time it is used.`, whisper: ChatMessage.getWhisperRecipients("GM"), blind: true }) diff --git a/scripts/vc4bELo0cWYoILfB.js b/scripts/vc4bELo0cWYoILfB.js index 0fbbbd9..18963be 100644 --- a/scripts/vc4bELo0cWYoILfB.js +++ b/scripts/vc4bELo0cWYoILfB.js @@ -1,4 +1,4 @@ -let choice = await ItemDialog.create(this.actor.itemTypes.disease, 1, "Choisissez une Maladie à soigner (doit avoir été contracté naturellement)") +let choice = await ItemDialog.create(this.actor.itemTypes.disease, 1, "Choisir une maladie à guérir (contractée naturellement)") -this.script.scriptMessage(`Guérison de ${choice[0]?.name}`); +this.script.message(`Guéri ${choice[0]?.name}`); choice[0].delete() \ No newline at end of file diff --git a/scripts/KIoVBinAZK8sMOqD.js b/scripts/ve3RcfTi49rdYZU0.js similarity index 64% rename from scripts/KIoVBinAZK8sMOqD.js rename to scripts/ve3RcfTi49rdYZU0.js index 7c082bd..4e9aa3e 100644 --- a/scripts/KIoVBinAZK8sMOqD.js +++ b/scripts/ve3RcfTi49rdYZU0.js @@ -1,5 +1,4 @@ - - let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty : "average"}, skipTargets: true, appendTitle : " - Wounded"}) +let test = await this.actor.setupSkill(game.i18n.localize("NAME.Résistance"), {fields: {difficulty : "average"}, appendTitle : " - Wounded"}) await test.roll(); if (test.failed) { @@ -7,5 +6,4 @@ this.actor.createEmbeddedDocuments("Item", [disease.toObject()]) this.script.scriptNotification("Gain de " + disease.name) }) - } - \ No newline at end of file + } \ No newline at end of file diff --git a/scripts/vejhfB9aI58iF1vr.js b/scripts/vejhfB9aI58iF1vr.js new file mode 100644 index 0000000..44c0266 --- /dev/null +++ b/scripts/vejhfB9aI58iF1vr.js @@ -0,0 +1,61 @@ +let choice1 = [ + { + type: "trait", + name: "Maladie", + }, + { + type: "trait", + name: "Infecté", + }, + { + type: "trait", + name: "Perturbant", + }, + { + type: "trait", + name: "Parasité", + }, + { + type: "trait", + name: "Territorial", + } +] + +let updateObj; +let actor; + +async function addTrait(c) { + let items = []; + console.log("TEST1", c); + let existing; + if (c.type == "trait") { + existing = updateObj.items.find(i => i.name == c.name && i.type == c.type); + } + console.log("TEST", existing); + if (!existing) { + let item = await game.wfrp4e.utility.find(c.name, c.type); + if (item) { + item = item.toObject(); + items.push(item); + } + else + ui.notifications.warn(`Impossible de trouver ${c}`, { permanent: true }); + } + console.log("WISH LIST2", choice1, items); + actor.createEmbeddedDocuments("Item", items); +} + +async function dialogChoice() { + for (let c of choice1) + { + if (await foundry.applications.api.DialogV2.confirm({window : {title: "Option"}, content:`

    Add Option?

    1. ${c.name}
    `})) + { + addTrait(c) + c.valid = true; + } + } +} + +updateObj = this.actor.toObject(); +actor = this.actor +await dialogChoice(); diff --git a/scripts/vj3zArmX27vCxYJW.js b/scripts/vj3zArmX27vCxYJW.js deleted file mode 100644 index d95ee60..0000000 --- a/scripts/vj3zArmX27vCxYJW.js +++ /dev/null @@ -1 +0,0 @@ -return !["NAME.Perception", "NAME.Navigation"].map(i => game.i18n.localize(i)).includes(args.skill?.name) \ No newline at end of file diff --git a/scripts/vn13U388mwquGN9y.js b/scripts/vn13U388mwquGN9y.js new file mode 100644 index 0000000..10b4107 --- /dev/null +++ b/scripts/vn13U388mwquGN9y.js @@ -0,0 +1,6 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.wGTD2LezlI6Atyy0"); +let leader = item.toObject(); + +item = await fromUuid("Compendium.wfrp4e-core.items.Item.u0CFf3xwiyidD9T5"); +let luck = item.toObject(); +await this.actor.createEmbeddedDocuments("Item", [leader, luck], {fromEffect : this.effect.id}); \ No newline at end of file diff --git a/scripts/vphNSTVxfZjApblV.js b/scripts/vphNSTVxfZjApblV.js new file mode 100644 index 0000000..c24308a --- /dev/null +++ b/scripts/vphNSTVxfZjApblV.js @@ -0,0 +1,3 @@ +const bonus = this.effect.getFlag("wfrp4e-tribes", "bonus"); + +args.fields.modifier += bonus; \ No newline at end of file diff --git a/scripts/vtXJI2VGlU9vODXz.js b/scripts/vtXJI2VGlU9vODXz.js new file mode 100644 index 0000000..b5434ba --- /dev/null +++ b/scripts/vtXJI2VGlU9vODXz.js @@ -0,0 +1 @@ +args.initiative += "+10"; \ No newline at end of file diff --git a/scripts/vuzRRj5d9XdNYx3o.js b/scripts/vuzRRj5d9XdNYx3o.js index 34bcd89..6b60e78 100644 --- a/scripts/vuzRRj5d9XdNYx3o.js +++ b/scripts/vuzRRj5d9XdNYx3o.js @@ -2,5 +2,5 @@ let broken = this.actor.hasCondition("broken") if (broken) { broken.delete(); - this.script.scriptNotification("Etat Brisé supprimé") + this.script.notification("Etat Brisé supprimée") } \ No newline at end of file diff --git a/scripts/vvdo1NxjmGVkmFCT.js b/scripts/vvdo1NxjmGVkmFCT.js deleted file mode 100644 index 3ef6cb4..0000000 --- a/scripts/vvdo1NxjmGVkmFCT.js +++ /dev/null @@ -1,24 +0,0 @@ -await this.actor.addCondition("stunned"); -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields: {difficulty : "hard"}, skipTargets: true, appendTitle : " - " + this.effect.name}) -await test.roll(); -if (test.failed) -{ - await this.actor.addCondition("prone") - await this.actor.addCondition("stunned") -} - -let location = this.item.system.location.key; - -if (location) -{ - let dropped = this.item.system.weaponsAtLocation; - - if (dropped.length) - { - this.script.scriptNotification(`Lache ${dropped.map(i => i.name).join(", ")}!`) - for(let weapon of dropped) - { - await weapon.system.toggleEquip(); - } - } -} \ No newline at end of file diff --git a/scripts/vzMxIDjRlQSxXtCW.js b/scripts/vzMxIDjRlQSxXtCW.js deleted file mode 100644 index 49cc4fd..0000000 --- a/scripts/vzMxIDjRlQSxXtCW.js +++ /dev/null @@ -1,11 +0,0 @@ -// Remove the miscast if doubles rolled and succeeded -if(args.test.succeeded && args.test.result.minormis && args.test.result.roll % 11 == 0) -{ - delete args.test.result.minormis -} -// Decrement the major miscast to minor miscast -else if(args.test.succeeded && args.test.result.majormis && args.test.result.roll % 11 == 0) -{ - delete args.test.result.majormis - args.test.result.minormis = game.i18n.localize("ROLL.MinorMis") -} \ No newline at end of file diff --git a/scripts/vzSj3vvPryp02EVC.js b/scripts/vzSj3vvPryp02EVC.js new file mode 100644 index 0000000..3adc036 --- /dev/null +++ b/scripts/vzSj3vvPryp02EVC.js @@ -0,0 +1,8 @@ +if (args.test.failed) + { + let applicableCharacteristics = ["ws", "bs", "s", "fel", "ag", "t", "dex"]; + if (applicableCharacteristics.includes(args.test.characteristicKey)) + { + this.actor.addCondition("stunned"); + } + } \ No newline at end of file diff --git a/scripts/w4JKuTECFmu3YmTR.js b/scripts/w4JKuTECFmu3YmTR.js deleted file mode 100644 index deb575d..0000000 --- a/scripts/w4JKuTECFmu3YmTR.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name?.includes(game.i18n.localize("NAME.Ride")) \ No newline at end of file diff --git a/scripts/w4RuGIfseGoxXA3k.js b/scripts/w4RuGIfseGoxXA3k.js index 54e601f..b64ee0d 100644 --- a/scripts/w4RuGIfseGoxXA3k.js +++ b/scripts/w4RuGIfseGoxXA3k.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpenter)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Métier (Charpentier)'; const difficulty = 'challenging'; const target = 20; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/w4zubIHP0XgMXsFe.js b/scripts/w4zubIHP0XgMXsFe.js index 5a69e19..4018137 100644 --- a/scripts/w4zubIHP0XgMXsFe.js +++ b/scripts/w4zubIHP0XgMXsFe.js @@ -1 +1 @@ -return !args.options.terror && !args.extendedTest?.getFlag("wfrp4e", "fear"); \ No newline at end of file +return !args.context.terror && !args.extendedTest?.getFlag("wfrp4e", "fear"); \ No newline at end of file diff --git a/scripts/w8s2RUzA1jmyu7vy.js b/scripts/w8s2RUzA1jmyu7vy.js new file mode 100644 index 0000000..cd89655 --- /dev/null +++ b/scripts/w8s2RUzA1jmyu7vy.js @@ -0,0 +1,6 @@ +if (args.test.isCritical && args.test.weapon.weaponGroup.value == "crossbow") { + args.test.result.tables.critical.modifier + = (typeof args.test.result.tables.critical.modifier ==='undefined') + ? 10 + : args.test.result.tables.critical.modifier + 10 +} \ No newline at end of file diff --git a/scripts/wAntJhgb8Og5vJXh.js b/scripts/wAntJhgb8Og5vJXh.js index c788e80..ad8268d 100644 --- a/scripts/wAntJhgb8Og5vJXh.js +++ b/scripts/wAntJhgb8Og5vJXh.js @@ -1 +1 @@ -args.options.staunchBleeding = true; \ No newline at end of file +args.context.staunchBleeding = true; \ No newline at end of file diff --git a/scripts/wBc8XvkAnv3j93vR.js b/scripts/wBc8XvkAnv3j93vR.js new file mode 100644 index 0000000..48258e9 --- /dev/null +++ b/scripts/wBc8XvkAnv3j93vR.js @@ -0,0 +1,11 @@ +if (Number(args.actor.system.status.fate.value) > 0) { + args.actor.update({"system.status.fate.value": Math.max(args.actor.system.status.fate.value - 1, 0)}); + args.actor.update({"system.status.fortune.value": Math.max(args.actor.system.status.fortune.value - 1, 0)}); + this.script.message(`Réduction du Destin et de la Chance de 1`); +} +else if (Number(args.actor.system.status.resilience.value) > 0) +{ + args.actor.update({"system.status.resilience.value": Math.max(args.actor.system.status.resilience.value - 1, 0)}); + args.actor.update({"system.status.resolve.value": Math.max(args.actor.system.status.resolve.value - 1, 0)}); + this.script.message(`Réduction de la Résilience et de la Détermination de 1`); +} \ No newline at end of file diff --git a/scripts/wFHjQyCR6Wzn6TeQ.js b/scripts/wFHjQyCR6Wzn6TeQ.js new file mode 100644 index 0000000..eef3c02 --- /dev/null +++ b/scripts/wFHjQyCR6Wzn6TeQ.js @@ -0,0 +1 @@ +this.actor.system.status.addArmour(1, {source: this.effect, magical: true}); \ No newline at end of file diff --git a/scripts/wLg8LbPAPbQgUg0Z.js b/scripts/wLg8LbPAPbQgUg0Z.js new file mode 100644 index 0000000..e83b492 --- /dev/null +++ b/scripts/wLg8LbPAPbQgUg0Z.js @@ -0,0 +1,3 @@ +return (args.item?.system?.attackType != "melee" + || this.actor.attacker != undefined + || args.target?.hasCondition("surprised") == undefined) \ No newline at end of file diff --git a/scripts/wS6OIR3QN4mOUHn0.js b/scripts/wS6OIR3QN4mOUHn0.js deleted file mode 100644 index 4b370e5..0000000 --- a/scripts/wS6OIR3QN4mOUHn0.js +++ /dev/null @@ -1,12 +0,0 @@ -if (args.totalWoundLoss > args.actor.characteristics.t.bonus) -{ - args.actor.setupSkill(game.i18n.localize("NAME.Endurance")).then(async test => { - await test.roll() - if (test.failed) { - let disease = await fromUuid("Compendium.wfrp4e-core.items.M8XyRs9DN12XsFTQ") - disease = disease.toObject() - disease.system.duration.active = true - args.actor.createEmbeddedDocuments("Item", [disease]) - } - }) -} \ No newline at end of file diff --git a/scripts/wb1DpSdIhSqYG5cp.js b/scripts/wb1DpSdIhSqYG5cp.js new file mode 100644 index 0000000..517b6e7 --- /dev/null +++ b/scripts/wb1DpSdIhSqYG5cp.js @@ -0,0 +1 @@ +args.fields.slBonus = -1 * parseInt(this.effect.sourceTest.result.SL) \ No newline at end of file diff --git a/scripts/wbM7tpw4TxvadcWm.js b/scripts/wbM7tpw4TxvadcWm.js index 5358e6e..c828ab8 100644 --- a/scripts/wbM7tpw4TxvadcWm.js +++ b/scripts/wbM7tpw4TxvadcWm.js @@ -5,15 +5,15 @@ for(let item of items) if (item.system.properties.qualities.durable) { await item.update({"system.qualities.value" : []}); - msg += `

    ${item.name} per toutes ses Qualités

    ` + msg += `

    ${item.name} perd toutes ses Qualités

    ` } - else + else { - msg += `

    ${item.name} tombe en poussière!

    ` - await item.update({name : item.name + " (Poussières)"}) + msg += `

    ${item.name} se désintègre en poussière !

    ` + await item.update({name : item.name + " (Poussière)"}) } } if(msg) { - this.script.scriptMessage(msg); + this.script.message(msg); } \ No newline at end of file diff --git a/scripts/C4LZnaX0MYgwrszj.js b/scripts/we6JUzDvybekAbtn.js similarity index 69% rename from scripts/C4LZnaX0MYgwrszj.js rename to scripts/we6JUzDvybekAbtn.js index ad72da6..c791025 100644 --- a/scripts/C4LZnaX0MYgwrszj.js +++ b/scripts/we6JUzDvybekAbtn.js @@ -1 +1 @@ -return args.type !== "channelling" && !args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) && args.skill?.name !== `${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})` && args.skill?.name !== game.i18n.localize("NAME.OutdoorSurvival"); \ No newline at end of file +return args.type !== "channelling" && !args.skill?.name.includes(game.i18n.localize("NAME.Channelling")) && args.skill?.name !== `${game.i18n.localize("NAME.Language")} (${game.i18n.localize("SPEC.Magick")})` \ No newline at end of file diff --git a/scripts/weDTna1dLMwHsNlJ.js b/scripts/weDTna1dLMwHsNlJ.js new file mode 100644 index 0000000..75bf915 --- /dev/null +++ b/scripts/weDTna1dLMwHsNlJ.js @@ -0,0 +1 @@ +args.modifiers.other.push({label : this.effect.name, details : "Réduction des Dégâts", value : -4}) \ No newline at end of file diff --git a/scripts/whUSkaR1yem21bXp.js b/scripts/whUSkaR1yem21bXp.js index 284bd24..f27ec9a 100644 --- a/scripts/whUSkaR1yem21bXp.js +++ b/scripts/whUSkaR1yem21bXp.js @@ -10,10 +10,10 @@ let characteristics = { "wp" : 0, "fel" : 10 } -let skills = ["Melee (Basic)", "Track"] +let skills = ["Corps à corps (Base)", "Pistage"] let skillAdvancements = [8, 7] -let talents = ["Berserk Charge", "Careful Strike", "Strike to Injure"] -let traits = ["Flight (8)", "Fury", "Swarm", "Tracker"] +let talents = ["Charge Berserk", "Frappe précise", "Frappe blessante"] +let traits = ["Flight (8)", "Rage", "Nuée", "Pisteur"] let trappings = [] let items = []; let spells = []; @@ -50,7 +50,7 @@ for (let talent of talents) } else { - ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) + ui.notifications.warn(`Could not find ${talent}`, {permanent : true}) } } @@ -59,32 +59,16 @@ for (let trait of traits) { let traitMatches = trait.matchAll(traitRegex).next().value let traitName = traitMatches[1] - let traitVal = traitMatches[2] || traitMatches[4] // could be match 2 or 4 depending on if there's a specialization - let traitSpec = traitMatches[3] - - let traitItem; - try { - traitItem = await WFRP_Utility.findItem(traitName, "trait") + let traitVal = traitMatches[2] || traitMatches[4] // could be match 2 or 4 depending on if there'}`).trim() } - catch { } - if (!traitItem) { - ui.notifications.warn(`Impossible de trouver ${trait}`, {permanent : true}) - } - traitItem = traitItem.toObject() - - if (Number.isNumeric(traitVal)) - { - traitItem.system.specification.value = traitName.includes('Weapon','Horns','Tail','Tentacles','Bite') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal; - traitItem.name = (traitItem.name + ` ${traitSpec ? "("+ traitSpec + ")" : ""}`).trim() - } - else + else traitItem.system.specification.value = traitSpec items.push(traitItem) } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -95,13 +79,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } -for (let spell of spells) +for (let spell of spells) { let spellItem = await game.wfrp4e.utility.findItem(spell) if (spellItem) @@ -110,13 +94,55 @@ for (let spell of spells) items.push(spellItem); } - else + else { - ui.notifications.warn(`Impossible de trouver ${spell}`, {permanent : true}) + ui.notifications.warn(`Could not find ${spell}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name +='Arme','Cornes','Tail','Tentacules','Morsure') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal; + traitItem.name = (traitItem.name + ` ${traitSpec ? "("+ traitSpec + ")" : ""}`).trim() + } + else + traitItem.system.specification.value = traitSpec + + items.push(traitItem) + +} + +for (let trapping of trappings) +{ + let trappingItem = await game.wfrp4e.utility.findItem(trapping) + if (trappingItem) + { + trappingItem = trappingItem.toObject() + + trappingItem.system.equipped.value = true; + + items.push(trappingItem); + } + else + { + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) + } +} + +for (let spell of spells) +{ + let spellItem = await game.wfrp4e.utility.findItem(spell) + if (spellItem) + { + spellItem = spellItem.toObject() + + items.push(spellItem); + } + else + { + ui.notifications.warn(`Could not find ${spell}`, {permanent : true}) + } +} + +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) this.actor.createEmbeddedDocuments("Item", items); \ No newline at end of file diff --git a/scripts/wsqNM4NHnwaAAQym.js b/scripts/wsqNM4NHnwaAAQym.js deleted file mode 100644 index a58738b..0000000 --- a/scripts/wsqNM4NHnwaAAQym.js +++ /dev/null @@ -1,11 +0,0 @@ - args.applyAP = false; - - this.script.scriptNotification("Ce test ne s'applique seulement qu'aux criminels. Fermez cette fenêtre si ce n'est pas le cas."); - this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "average"}, skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => - { - await test.roll(); - if (test.failed) - { - args.actor.addCondition("unconscious"); - } - }); \ No newline at end of file diff --git a/scripts/wyTCozh9qGTx6yK0.js b/scripts/wyTCozh9qGTx6yK0.js index 2bf2400..0b087b8 100644 --- a/scripts/wyTCozh9qGTx6yK0.js +++ b/scripts/wyTCozh9qGTx6yK0.js @@ -1,5 +1,5 @@ -if (args.options.terror || args.extendedTest?.getFlag("wfrp4e", "fear")) +if (args.context.terror || args.extendedTest?.getFlag("wfrp4e", "fear")) { args.abort = true; - this.script.scriptNotification("N'a pas besoin de faire de test de Peur ou de Terreur"); + this.script.notification("N'a pas besoin de faire de tests de Peur ou de Terreur"); } \ No newline at end of file diff --git a/scripts/wzkxiKjxVEeNS1di.js b/scripts/wzkxiKjxVEeNS1di.js deleted file mode 100644 index 7625d68..0000000 --- a/scripts/wzkxiKjxVEeNS1di.js +++ /dev/null @@ -1,11 +0,0 @@ -let roll = await new Roll("1d10").roll(); -this.script.scriptMessage(await this.actor.applyBasicDamage(roll.total, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg: true})) - -await this.actor.addCondition("deafened", 3) - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty: "average" }, skipTargets: true, appendTitle : ` - ${this.effect.name}`, context : {failure: "Gain a Broken Condition", success : "Avoided Broken Condition"}}) -await test.roll(); -if (test.failed) -{ - this.actor.addCondition("broken") -} \ No newline at end of file diff --git a/scripts/x1Ecj6MXY94kpcQq.js b/scripts/x1Ecj6MXY94kpcQq.js new file mode 100644 index 0000000..d1db43a --- /dev/null +++ b/scripts/x1Ecj6MXY94kpcQq.js @@ -0,0 +1,9 @@ +if (!this.item.equipped.value) { + return this.script.notification(`Vous devez équiper le ${this.item.name} pour récupérer des points de blessures.`,"info") +} + +const runesOfRestoration = this.item.effects.contents.filter(e => e.name == this.effet.name) +const restorationWounds = parseInt(runesOfRestoration.length * this.actor.system.characteristics.t.bonus) + +this.actor.modifyWounds(restorationWounds) +this.script.message(`Vous avez récupéré ${restorationWounds} blessures avec ${this.script.label}.`) \ No newline at end of file diff --git a/scripts/x2RLUUNB7BiIDYCP.js b/scripts/x2RLUUNB7BiIDYCP.js deleted file mode 100644 index 1f2d040..0000000 --- a/scripts/x2RLUUNB7BiIDYCP.js +++ /dev/null @@ -1,16 +0,0 @@ - - let difficulty = "" - if (this.effect.name.includes("Modéré")) - difficulty = "easy" - else if (this.effect.name.includes("Sévère")) - difficulty = "average" - else - difficulty = "veasy" - - let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {context : {failure : this.actor.name + " dies from Blight"}, fields: {difficulty}, skipTargets: true, appendTitle : " - Blight"}) - await test.roll(); - if (test.failed) - { - this.actor.addCondition("dead"); - } - \ No newline at end of file diff --git a/scripts/x76tKw4L8dX00ikE.js b/scripts/x76tKw4L8dX00ikE.js index c98eddb..38885c9 100644 --- a/scripts/x76tKw4L8dX00ikE.js +++ b/scripts/x76tKw4L8dX00ikE.js @@ -1,5 +1,5 @@ let item = await fromUuid("Compendium.wfrp4e-core.items.uqGxFOEqeurwkAO3") let data = item.toObject(); -setProperty(data, "flags.wfrp4e.breath", "fire") +foundry.utils.setProperty(data, "flags.wfrp4e.breath", "fire") data.system.specification.value = 5 this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/x8XK2fzzXCnSwfjt.js b/scripts/x8XK2fzzXCnSwfjt.js deleted file mode 100644 index d42e514..0000000 --- a/scripts/x8XK2fzzXCnSwfjt.js +++ /dev/null @@ -1,7 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Athletics")) -await test.roll(); - -if (test.succeeded) -{ - this.actor.removeCondition("prone"); -} \ No newline at end of file diff --git a/scripts/x9iKFYYc4Ocy8PTS.js b/scripts/x9iKFYYc4Ocy8PTS.js index 88ca8b1..d5daf12 100644 --- a/scripts/x9iKFYYc4Ocy8PTS.js +++ b/scripts/x9iKFYYc4Ocy8PTS.js @@ -1,11 +1,11 @@ let item = this.effect.getCreatedItems()?.[0]; -ChatMessage.create({content : "La grâce est au delà du style", speaker : ChatMessage.getSpeaker({token: this.actor.getActiveTokens()[0]?.document, actor: this.actor})}, {chatBubble : true}) +ChatMessage.create({content : "La grâce dépasse le style", speaker : ChatMessage.getSpeaker({token: this.actor.getActiveTokens()[0]?.document, actor: this.actor})}, {chatBubble : true}) let choice = await ItemDialog.create(ItemDialog.objectToArray({ "nobles" : "Nobles", - "guilders" : "Maitres de Guildes", + "guilders" : "Membres de Guilde", "servants" : "Serviteurs" -}), 1, "Choisissez un groupes") +}), 1, "Choisir Group") let name = choice[0]?.name @@ -17,11 +17,11 @@ if (!name) if (item) { item.update({ - name : item.name.split("(")[0] + ` (${name})`, + name : item.name.split("(")[0] + ` (${name})`, "system.tests.value" : item.system.tests.value.split("(")[0] + ` (${name}` }) } -else +else { item = await fromUuid("Compendium.wfrp4e-core.items.Item.sYbgpSnRqSZWgwFP"); let data = item.toObject(); diff --git a/scripts/xBpLQa7yBPczDMY8.js b/scripts/xBpLQa7yBPczDMY8.js index dd7547f..6977873 100644 --- a/scripts/xBpLQa7yBPczDMY8.js +++ b/scripts/xBpLQa7yBPczDMY8.js @@ -1,7 +1,7 @@ let scythe = (await fromUuid("Compendium.wfrp4e-core.items.CXg7XOFJwu4LZ9LM")).toObject(); - scythe.name = "Scythe of Shyish"; + scythe.name = "La Faux de Shyish"; scythe.system.damage.value = "WPB + 3" scythe.system.equipped = true; - scythe.img = this.effect.icon; + scythe.img = this.effect.img; scythe.system.qualities.value.push({name : "magical"}) this.actor.createEmbeddedDocuments("Item", [scythe], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/xEE0ymsaH2tn2M99.js b/scripts/xEE0ymsaH2tn2M99.js new file mode 100644 index 0000000..3761cf0 --- /dev/null +++ b/scripts/xEE0ymsaH2tn2M99.js @@ -0,0 +1 @@ +return args.type != "cast"; \ No newline at end of file diff --git a/scripts/xJZKVGE04o84Gibo.js b/scripts/xJZKVGE04o84Gibo.js new file mode 100644 index 0000000..7ebacd7 --- /dev/null +++ b/scripts/xJZKVGE04o84Gibo.js @@ -0,0 +1,3 @@ +if (!this.item.actor.name.includes("Brunner")) return; + +args.item.system.damage.value += "+1"; \ No newline at end of file diff --git a/scripts/xRd6oA1QWLVpfoBm.js b/scripts/xRd6oA1QWLVpfoBm.js deleted file mode 100644 index 9b5f8dd..0000000 --- a/scripts/xRd6oA1QWLVpfoBm.js +++ /dev/null @@ -1,6 +0,0 @@ -if (!this.actor.has("Vision Nocturne")) -{ - let item = await fromUuid("Compendium.wfrp4e-core.items.FmHDbCOy3pH8yKhm"); - let data = item.toObject(); - this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) -} \ No newline at end of file diff --git a/scripts/xS2su09zcza9du09.js b/scripts/xS2su09zcza9du09.js deleted file mode 100644 index 8986241..0000000 --- a/scripts/xS2su09zcza9du09.js +++ /dev/null @@ -1,8 +0,0 @@ -if ([game.i18n.localize("CORRUPTION.Minor"), game.i18n.localize("CORRUPTION.Moderate"), game.i18n.localize("CORRUPTION.Major")].includes(this.item.system.specification.value)) -{ - return -} - -let choice = await ItemDialog.create(ItemDialog.objectToArray({minor : game.i18n.localize("CORRUPTION.Minor"), moderate : game.i18n.localize("CORRUPTION.Moderate"), major : game.i18n.localize("CORRUPTION.Major")}, this.item.img), 1, "Choisissez Corruption Severity"); - -this.item.updateSource({"system.specification.value" : choice[0]?.name || ""}) \ No newline at end of file diff --git a/scripts/xUpKYT7BZCSmAfUy.js b/scripts/xUpKYT7BZCSmAfUy.js index 02c1ec7..8ee7b5f 100644 --- a/scripts/xUpKYT7BZCSmAfUy.js +++ b/scripts/xUpKYT7BZCSmAfUy.js @@ -6,5 +6,5 @@ if (this.item.system.quantity.value) } else { - this.script.scriptNotification("Quantité insuffisante!", "error") + this.script.notification("Plus rien !", "error") } \ No newline at end of file diff --git a/scripts/xVYVegD692CCv8Yl.js b/scripts/xVYVegD692CCv8Yl.js deleted file mode 100644 index 54e7927..0000000 --- a/scripts/xVYVegD692CCv8Yl.js +++ /dev/null @@ -1,12 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "hard"}, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); - -let newFortune = Math.max(0, this.actor.status.fortune.value - 1) -this.actor.update({ "system.status.fortune.value": newFortune }); - -if (test.failed) -{ - let char = this.effect.sourceActor.characteristics; - let duration = Math.floor((char.wp.initial + char.wp.advances)/10) ; - this.script.scriptMessage("Voleur du Destin a été appliqué à " + duration + " days"); -} \ No newline at end of file diff --git a/scripts/xWPgIZOQLba5nZ23.js b/scripts/xWPgIZOQLba5nZ23.js deleted file mode 100644 index 0e0672c..0000000 --- a/scripts/xWPgIZOQLba5nZ23.js +++ /dev/null @@ -1,14 +0,0 @@ -let nbFatigue = 1 + Number(this.effect.sourceTest.result.SL); -this.actor.addCondition("fatigued", nbFatigue); - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Endurance"), {fields : {difficulty : "hard"}, appendTitle : ` - ${this.effect.name}`}) -await test.roll(); - -if (test.succeeded) -{ - this.script.scriptNotification(this.actor.name + "a résisté !") -} -else if (test.failed) -{ - this.actor.addCondition("unconscious", 1); -} \ No newline at end of file diff --git a/scripts/xcny1zYAphdfrKv9.js b/scripts/xcny1zYAphdfrKv9.js new file mode 100644 index 0000000..74be082 --- /dev/null +++ b/scripts/xcny1zYAphdfrKv9.js @@ -0,0 +1 @@ +args.fields.modifier -=20; \ No newline at end of file diff --git a/scripts/xgplXZMs459X7XXM.js b/scripts/xgplXZMs459X7XXM.js index 92309e0..7dd311d 100644 --- a/scripts/xgplXZMs459X7XXM.js +++ b/scripts/xgplXZMs459X7XXM.js @@ -1,20 +1,21 @@ // Apply changes when the mask is worn -if (args.equipped) { - this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) - this.script.scriptMessage(`${this.actor.name} porte ${this.item.name}.
    - Il subit -20 à tout ses tests pour résister aux maladies.
    - Si il porte le masque pendant plus d'une heure ou bénéficie de l'un de ses effets, il est exposé à une @Corruption[moderate]{Corruption Modérée}.`, - {whisper: ChatMessage.getWhisperRecipients("GM")}) +if (args.equipped) { + this.actor.createEmbeddedDocuments("ActiveEffect", [this.item.effects.contents[1]?.convertToApplied()]) + this.script.message(`${this.actor.name} porte le ${this.item.name}.
    + Ils subissent –20 à toutes les tentatives de résistance aux maladies.
    + S'ils portent le masque pendant plus d'une heure ou bénéficient de l'un de ses effets, ils sont exposés à @Corruption[moderate]{Corruption modérée}. + `, + {whisper: ChatMessage.getWhisperRecipients("GM")}) } -// Notify of lingering effects when mask is removed +// Notify of lingering effects when mask is Retiré else if (!args.equipped) { await this.item.effects.contents[0].delete(); - await this.item.update({name : this.item.name += " (Used)"}) - this.script.scriptMessage(`${this.item.name} porté par ${this.actor.name} a été enlevé et a perdu ses propriétés. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils devront être supprimés manuellement.`, + await this.item.update({name : this.item.name += " (Usagé)"}) + this.script.message(`${this.item.name} sur ${this.actor.name} a été retiré et perd ses propriétés. Cependant, les effets durent [[1d10+4]] jours, après quoi ils doivent être manuellement retirés.`, {whisper: ChatMessage.getWhisperRecipients("GM")} ) - + } diff --git a/scripts/xihniGjgqOhuaKWc.js b/scripts/xihniGjgqOhuaKWc.js index 823e685..b2990e6 100644 --- a/scripts/xihniGjgqOhuaKWc.js +++ b/scripts/xihniGjgqOhuaKWc.js @@ -1,7 +1,9 @@ - -if (args.test.failed) { - let applicableCharacteristics = ["ws", "bs", "s", "fel", "ag", "t", "dex"]; - if (applicableCharacteristics.includes(args.test.characteristicKey)) { - this.actor.addCondition("stunned"); - } -} \ No newline at end of file + + if (args.test.failed) + { + let applicableCharacteristics = ["ws", "bs", "s", "fel", "ag", "t", "dex"]; + if (applicableCharacteristics.includes(args.test.characteristicKey)) + { + this.actor.addCondition("stunned"); + } + } \ No newline at end of file diff --git a/scripts/xiyQSXozoLxt0MZs.js b/scripts/xiyQSXozoLxt0MZs.js index a1f1435..df8e424 100644 --- a/scripts/xiyQSXozoLxt0MZs.js +++ b/scripts/xiyQSXozoLxt0MZs.js @@ -1,6 +1,6 @@ const uuids = [ - "Compendium.wfrp4e-core.items.Item.wMwSRDmgiF2IdCJr", // Painless - "Compendium.wfrp4e-core.items.Item.IAWyzDfC286a9MPz", // Immunity to Psychology + "Compendium.wfrp4e-core.items.Item.wMwSRDmgiF2IdCJr", // utilisateur d + "Compendium.wfrp4e-core.items.Item.IAWyzDfC286a9MPz", // Immunité Psychologique ]; const items = await Promise.all(uuids.map(uuid => fromUuid(uuid))); diff --git a/scripts/xkdQhZ9KKqmocNLO.js b/scripts/xkdQhZ9KKqmocNLO.js new file mode 100644 index 0000000..f11bbeb --- /dev/null +++ b/scripts/xkdQhZ9KKqmocNLO.js @@ -0,0 +1,3 @@ +let item = await fromUuid("Compendium.wfrp4e-core.items.Item.tXKX29QZBdHmyMc7") +let data = item.toObject(); +await this.actor.createEmbeddedDocuments("Item", [data], {fromEffect : this.effect.id}) \ No newline at end of file diff --git a/scripts/xklncIMwQIespDxS.js b/scripts/xklncIMwQIespDxS.js index 3839739..0e95720 100644 --- a/scripts/xklncIMwQIespDxS.js +++ b/scripts/xklncIMwQIespDxS.js @@ -1,8 +1,8 @@ -let test = await this.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "vhard"}}); -await test.roll(); -game.wfrp4e.utility.postCorruptionTest("minor", this.script.getChatData()) +let test = await this.actor.setupCharacteristic("t", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, fields : {difficulty : "vhard"}}); +await Test.roll(); +CorruptionMessageModel.createCorruptionMessage("minor", this.script.getChatData()) -if (test.failed) +if (Test.Échoué) { this.actor.addCondition("unconscious"); } \ No newline at end of file diff --git a/scripts/xobGBJbgFjQCrwvq.js b/scripts/xobGBJbgFjQCrwvq.js deleted file mode 100644 index c1163a2..0000000 --- a/scripts/xobGBJbgFjQCrwvq.js +++ /dev/null @@ -1,17 +0,0 @@ -let roll; -if (this.actor.has(game.i18n.localize("NAME.Daemonic")) || this.actor.has(game.i18n.localize("NAME.Undead")) || ["Gobelin", "Orc", "Mort-vivant"].includes(this.actor.system.details.species.value)) -{ - roll = await new Roll(`1d10 + ${this.effect.sourceTest.result.overcast.usage.other.current}`).roll() -} -else -{ - roll = await new Roll(`1d10`).roll() -} - -roll.toMessage(this.script.getChatData()) -await this.actor.applyBasicDamage(roll.total, {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg : true}) - -if (this.actor.has("Mort-vivant") || args.actor.has("Démoniaque")) -{ - this.actor.addCondition("ablaze") -} \ No newline at end of file diff --git a/scripts/xqWxV9w5ezBQdJkZ.js b/scripts/xqWxV9w5ezBQdJkZ.js index 452ff57..e58b029 100644 --- a/scripts/xqWxV9w5ezBQdJkZ.js +++ b/scripts/xqWxV9w5ezBQdJkZ.js @@ -1 +1 @@ -return args.options.corruption; \ No newline at end of file +return args.context.corruption; \ No newline at end of file diff --git a/scripts/xvH4PKJasHcehOZz.js b/scripts/xvH4PKJasHcehOZz.js deleted file mode 100644 index 3149d05..0000000 --- a/scripts/xvH4PKJasHcehOZz.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == `${game.i18n.localize("NAME.Lore")} (${this.item.parenthesesText})` \ No newline at end of file diff --git a/scripts/y3F1K1sYBymPZCjz.js b/scripts/y3F1K1sYBymPZCjz.js index d0beff7..a942a8f 100644 --- a/scripts/y3F1K1sYBymPZCjz.js +++ b/scripts/y3F1K1sYBymPZCjz.js @@ -10,14 +10,14 @@ let characteristics = { "wp" : 0, "fel" : 0 } -let skills = ["Athletics", "Animal Care", "Langue (Battle)", "Melee (Basic)", "Melee (Cavalry)", "Ride"] +let skills = ["Athlétisme", "Soin aux animaux", "Langue (Bataille)", "Corps à corps (Base)", "Corps à corps (Cavalerie)", "Chevaucher"] let skillAdvancements = [10,10, 10, 10, 10, 20] -let talents = ["Roughrider", "Strike Mighty Blow"] -let trappings = ["Arme simple", "Shield", "Lance", "Plate Breastplate", "Plate Bracers", "Plate Helm", "Plate Leggings"] -let specialItems = [ - {name: "Chaos Steed", type: "trapping", trappingType: "misc" }, -] +let talents = ["Cavalier émérite", "Coup puissant"] +let trappings = ["Arme simple", "Bouclier", "Lance de cavalerie", "Plastron d'acier", "Brassards", "Heaume", "Jambières d'acier"] +let specialItems = [ + {name: "Chaos Steed", type: "trapping", trappingType: "misc" }, +] let items = []; let updateObj = this.actor.toObject(); @@ -30,11 +30,11 @@ for (let ch in characteristics) for (let item of specialItems) { let newItem if (item.type == "weapon") { - newItem = new ItemWfrp4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) + newItem = new ItemWFRP4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) } else if (item.type == "trapping") { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) } else { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) } items.push(newItem.toObject()) } @@ -46,7 +46,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -62,13 +62,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -79,13 +79,13 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) console.log(">>>>>>><", items) diff --git a/scripts/y7hk7prQ0lLTyv1Y.js b/scripts/y7hk7prQ0lLTyv1Y.js new file mode 100644 index 0000000..baff11d --- /dev/null +++ b/scripts/y7hk7prQ0lLTyv1Y.js @@ -0,0 +1 @@ +return args.item?.system?.isProjectiles && (args.item.system.weaponGroup.value !== "blackpowder" || args.item.system.weaponGroup.value !== "engineering") \ No newline at end of file diff --git a/scripts/y9fwuiqn44t13WAq.js b/scripts/y9fwuiqn44t13WAq.js new file mode 100644 index 0000000..16bfc6f --- /dev/null +++ b/scripts/y9fwuiqn44t13WAq.js @@ -0,0 +1,3 @@ +return this.item.equipped.value + && args?.weapon + && (["goblin"].includes(args.target.Species.toLowerCase())) \ No newline at end of file diff --git a/scripts/yAL0YwZWVm8o1nxa.js b/scripts/yAL0YwZWVm8o1nxa.js index 98e23e4..3e33f58 100644 --- a/scripts/yAL0YwZWVm8o1nxa.js +++ b/scripts/yAL0YwZWVm8o1nxa.js @@ -1,6 +1,6 @@ if (this.actor.hasCondition("dead") && !this.actor.gardenOfCorpses) { - this.script.scriptMessage("[[3d10]] @UUID[Compendium.wfrp4e-core.actors.T79RqnDOAQLn3I1s]{zombies} sortent des décombres.", {whisper : ChatMessage.getWhisperRecipients("GM")}) + this.script.message("[[3d10]] @UUID[Compendium.wfrp4e-core.actors.T79RqnDOAQLn3I1s]{zombies} spring forth from the remains.", {whisper : ChatMessage.getWhisperRecipients("GM")}) this.actor.gardenOfCorpses = true; // local storage is sufficient to prevent multiple messages } \ No newline at end of file diff --git a/scripts/yCgH3N9AurIiAv0i.js b/scripts/yCgH3N9AurIiAv0i.js index 89c5096..7c6635d 100644 --- a/scripts/yCgH3N9AurIiAv0i.js +++ b/scripts/yCgH3N9AurIiAv0i.js @@ -1,10 +1,10 @@ -if (!this.item.name.includes("(") || this.item.system.tests.value.includes("(Sens)")) +if (!this.item.name.includes("(") || this.item.system.Tests.value.includes("(Sense)") || this.item.system.Tests.value.toLowerCase().includes("(any)")) { - let tests = this.item.system.tests.value + let Tests = this.item.system.Tests.value let name = this.item.name - // If name already specifies, make sure tests value reflects that - if (name.includes("(")) + // If name already specifies, make sure Tests value reflects that + if (name.includes("(") && !name.toLowerCase().includes("(any)")) { let sense = name.split("(")[1].split(")")[0] tests = `${tests.split("(")[0].trim()} (${sense})`; @@ -15,9 +15,9 @@ if (!this.item.name.includes("(") || this.item.system.tests.value.includes("(Sen taste : "Goût", sight : "Vue", smell : "Odorat", - hearing : "Ouie", + hearing : "Ouïe", touch : "Toucher" - }, this.item.img), 1, "Choisir un sens"); + }, this.item.img), 1, {title : this.item.name, text : "Choisissez un Sens"}); if (choice[0]) { name = `${name.split("(")[0].trim()} (${choice[0].name})` diff --git a/scripts/yDvxF9llUYwJg0sE.js b/scripts/yDvxF9llUYwJg0sE.js index 54cd21a..38d1371 100644 --- a/scripts/yDvxF9llUYwJg0sE.js +++ b/scripts/yDvxF9llUYwJg0sE.js @@ -11,11 +11,11 @@ if (getProperty(args.data, "system.loaded.value") == true) { qualities.push({name : "repeater", value : repeaterValue}) } - setProperty(args.data, "system.loaded.amt", repeaterValue) + foundry.utils.setProperty(args.data, "system.loaded.amt", repeaterValue) this.item.update({"system.qualities.value" : qualities}); - this.script.scriptNotification("Repeater " + repeaterValue); + this.script.notification("Repeater " + repeaterValue); } -else if (getProperty(args.data, "system.loaded.value") == false) +else if (foundry.utils.getProperty(args.data, "system.loaded.value") == false) { let qualities = foundry.utils.deepClone(this.item.system.qualities.value).filter(i => i.name != "repeater"); this.item.update({"system.qualities.value" : qualities}); diff --git a/scripts/yFMvxecXAZ6T2O0S.js b/scripts/yFMvxecXAZ6T2O0S.js index 2a597dd..4b276d2 100644 --- a/scripts/yFMvxecXAZ6T2O0S.js +++ b/scripts/yFMvxecXAZ6T2O0S.js @@ -1,9 +1,9 @@ if (args.totalWoundLoss >= 1) { - let roll = await new Roll("1d10").roll(); + let roll = await new Roll("1d10").roll({allowInteractive : false}); await roll.toMessage(this.script.getChatData()); if (roll.total == 9) { - this.script.scriptMessage(`Deux @UUID[Compendium.wfrp4e-eis.actors.cLOGeMqUty61nYB9]{Horreurs bleus de Tzeentch} sortent du corps de ${this.actor.name}, le tuant au passage.`, {whisper : ChatMessage.getWhisperRecipients("GM")}) + this.script.message(`Two @UUID[Compendium.wfrp4e-eis.actors.cLOGeMqUty61nYB9]{Blue Horror of Tzeentch} claw their way out of ${this.actor.name}'s screaming flesh, killing them in the process.`, {whisper : ChatMessage.getWhisperRecipients("GM")}) } } \ No newline at end of file diff --git a/scripts/yIGItnshXI4W46cp.js b/scripts/yIGItnshXI4W46cp.js deleted file mode 100644 index b47bdc0..0000000 --- a/scripts/yIGItnshXI4W46cp.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Charm"); \ No newline at end of file diff --git a/scripts/yMMzZ7daCqRlGT3N.js b/scripts/yMMzZ7daCqRlGT3N.js index 98b1232..1c2ba5b 100644 --- a/scripts/yMMzZ7daCqRlGT3N.js +++ b/scripts/yMMzZ7daCqRlGT3N.js @@ -1,5 +1,5 @@ let item = args.opposedTest.attackerTest.item; if (!item.isMagical && (item.type == "weapon" || item.type == "trait")) { - args.modifiers.other.push({label : this.effect.name, details : "Suppression de la valeur de dommages", value : -1 * (args.totalWoundLoss - args.opposedTest.result.differenceSL)}) + args.modifiers.other.push({label : this.effect.name, details : "Retirer l'Indice de Dégâts", value : -1 * (args.totalWoundLoss - args.opposedTest.result.differenceSL)}) } diff --git a/scripts/yQziCK8G8I1RYkTj.js b/scripts/yQziCK8G8I1RYkTj.js index d29d9f1..f4b25f3 100644 --- a/scripts/yQziCK8G8I1RYkTj.js +++ b/scripts/yQziCK8G8I1RYkTj.js @@ -1,6 +1,6 @@ let add; -if (args.opposedTest?.attackerTest?.weapon?.isRanged && args.opposedTest?.result.hitloc?.value === "head") { - add = await Dialog.confirm({title : this.effect.name, content : "Add 1 AP? Bascinet provides 4 AP instead of 3 against missile attacks from the front"}) +if (args.opposedTest?.attackerTest?.weapon?.isProjectiles && args.opposedTest?.result.hitloc?.value === "head") { + add = await foundry.applications.api.DialogV2.confirm({window : {title : this.effect.name}, content : "Add 1 AP? Bascinet provides 4 AP instead of 3 against missile attacks from the front"}) } if (add) { @@ -8,5 +8,5 @@ if (add) { args.modifiers.ap.metal++; args.modifiers.ap.used++; args.modifiers.ap.value++; - args.modifiers.ap.details.push("+1 AP against missile attacks to the front"); + args.modifiers.ap.details.push("+1 PA contre les attaques à distance de face"); } \ No newline at end of file diff --git a/scripts/yRRzSKlcN3L7rEEe.js b/scripts/yRRzSKlcN3L7rEEe.js deleted file mode 100644 index d94075f..0000000 --- a/scripts/yRRzSKlcN3L7rEEe.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name.includes(game.i18n.localize("NAME.Entertain")) || args.skill?.name.includes(game.i18n.localize("NAME.Perform")) || args.skill?.name.includes(game.i18n.localize("NAME.Play")); \ No newline at end of file diff --git a/scripts/yTmRoUstxHMso91c.js b/scripts/yTmRoUstxHMso91c.js index b7f2f03..f5f65f3 100644 --- a/scripts/yTmRoUstxHMso91c.js +++ b/scripts/yTmRoUstxHMso91c.js @@ -1,4 +1,4 @@ -if (args.item.name == "Résistance à la Magie" && args.item.type == "trait") +if (args.item.name == game.i18n.localize("NAME.MagicResistanceTrait") && args.item.type == "trait") { args.item.system.specification.value = Number(args.item.system.specification.value) + 1 } \ No newline at end of file diff --git a/scripts/yXUPiWuQ5o0JBY4i.js b/scripts/yXUPiWuQ5o0JBY4i.js deleted file mode 100644 index ea57de2..0000000 --- a/scripts/yXUPiWuQ5o0JBY4i.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("Endurance") || args.characteristic == "int" \ No newline at end of file diff --git a/scripts/yYNBZjmBnytXpRn3.js b/scripts/yYNBZjmBnytXpRn3.js new file mode 100644 index 0000000..29239f4 --- /dev/null +++ b/scripts/yYNBZjmBnytXpRn3.js @@ -0,0 +1 @@ +this.actor.reset(); \ No newline at end of file diff --git a/scripts/yatUu0cd7iKs50rq.js b/scripts/yatUu0cd7iKs50rq.js deleted file mode 100644 index 0230e54..0000000 --- a/scripts/yatUu0cd7iKs50rq.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.Track"); \ No newline at end of file diff --git a/scripts/ybxDG2ezvRx02LYx.js b/scripts/ybxDG2ezvRx02LYx.js index e78b8b3..cad5f58 100644 --- a/scripts/ybxDG2ezvRx02LYx.js +++ b/scripts/ybxDG2ezvRx02LYx.js @@ -1 +1 @@ -return !args.options.corruption \ No newline at end of file +return !args.context.corruption \ No newline at end of file diff --git a/scripts/ynV7tz0OdCwlsQp6.js b/scripts/ynV7tz0OdCwlsQp6.js index bceeeae..062d314 100644 --- a/scripts/ynV7tz0OdCwlsQp6.js +++ b/scripts/ynV7tz0OdCwlsQp6.js @@ -3,4 +3,4 @@ msg += `

    ${await this.actor.applyBasicDamage(8, {loc : "roll", suppressMsg: tr msg += `

    ${await this.actor.applyBasicDamage(8, {loc : "roll", suppressMsg: true, hideDSN: true})}

    ` msg += `

    ${await this.actor.applyBasicDamage(8, {loc : "roll", suppressMsg: true, hideDSN: true})}

    ` -this.script.scriptMessage(msg); \ No newline at end of file +this.script.message(msg); \ No newline at end of file diff --git a/scripts/ynoHNXXCGRS6fTqF.js b/scripts/ynoHNXXCGRS6fTqF.js index 901593f..1a156fe 100644 --- a/scripts/ynoHNXXCGRS6fTqF.js +++ b/scripts/ynoHNXXCGRS6fTqF.js @@ -7,7 +7,7 @@ if (args.actor.characteristics.i.value <= 0) i_gain += (await new Roll("2d10").roll()).total } -msg = `${this.actor.prototypeToken.name} gagne ${i_gain} en Initiative` +msg = `${this.actor.prototypeToken.name} gagne ${i_gain} Initiative` let newValue = i_gain + args.actor.characteristics.i.modifier @@ -19,8 +19,8 @@ let hitloc = await game.wfrp4e.tables.rollTable("hitloc") let value = hitloc.result let desc = hitloc.description -this.effect.updateSource({"flags.wfrp4e.location" : value}) +this.effet.updateSource({"flags.wfrp4e.location" : value}) -msg += ` as eyes push out of their ${desc}` +msg += ` alors que des yeux sortent de leur ${desc}` -this.script.scriptMessage(msg) \ No newline at end of file +this.script.message(msg) \ No newline at end of file diff --git a/scripts/yvtF2t9aibxibAIM.js b/scripts/yvtF2t9aibxibAIM.js new file mode 100644 index 0000000..fb61990 --- /dev/null +++ b/scripts/yvtF2t9aibxibAIM.js @@ -0,0 +1,14 @@ +const test = await this.actor.setupSkill(game.i18n.localize("NAME.Perception"), { + skipTargets: true, + appendTitle: ` — ${this.effect.name}`, + fields: {difficulty: "challenging"}, + context: { + failure: `Gain de l'état @Condition[Prone].`, + success: `Capable de bouger.` + } +}); + +await test.roll(); + +if (test.failed) + this.actor.addCondition("prone"); \ No newline at end of file diff --git a/scripts/yzN7ZNlgCiSVJqsU.js b/scripts/yzN7ZNlgCiSVJqsU.js index 1e442ba..c9e28c0 100644 --- a/scripts/yzN7ZNlgCiSVJqsU.js +++ b/scripts/yzN7ZNlgCiSVJqsU.js @@ -3,5 +3,5 @@ let sourceItem = this.effect.sourceItem; if (sourceItem) { this.actor.applyEffect({effectUuids : [sourceItem.effects.contents[1].uuid]}) - this.script.scriptNotification("Appliqué après les effets"); + this.script.notification("Effets secondaires appliqués"); } \ No newline at end of file diff --git a/scripts/z5HfNUrHy5MS3K7a.js b/scripts/z5HfNUrHy5MS3K7a.js deleted file mode 100644 index 6abff4e..0000000 --- a/scripts/z5HfNUrHy5MS3K7a.js +++ /dev/null @@ -1,7 +0,0 @@ -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, context : {failure: "1 Corruption Point Gained"}}) -await test.roll(); -if (test.failed && this.actor.type == "character") -{ - this.actor.update({"system.status.corruption.value" : parseInt(this.actor.status.corruption.value) + 1}) - this.script.scriptMessage("Reçoit un Point de Corruption", {whisper : ChatMessage.getWhisperRecipients("GM")}) -} \ No newline at end of file diff --git a/scripts/z8W5PAwBR0PXY6ty.js b/scripts/z8W5PAwBR0PXY6ty.js new file mode 100644 index 0000000..33a910d --- /dev/null +++ b/scripts/z8W5PAwBR0PXY6ty.js @@ -0,0 +1,3 @@ + await args.actor.addCondition("ablaze"); + await args.actor.addCondition("blinded"); + await args.actor.addCondition("poisoned", 2); \ No newline at end of file diff --git a/scripts/z8mwLihZQu0JtUHY.js b/scripts/z8mwLihZQu0JtUHY.js index 3d27465..9118076 100644 --- a/scripts/z8mwLihZQu0JtUHY.js +++ b/scripts/z8mwLihZQu0JtUHY.js @@ -11,15 +11,15 @@ let characteristics = { "wp" : 70, "fel" : 20 } -let skills = ["Focalisation", "Calme", "Intimidation", "Langue (Magick)", "Langue (Nehekharan)", "Commandement", "Savoir (Magie)", "Perception"] +let skills = ["Focalisation", "Calme", "Intimidation", "Langue (Magick)", "Language (Nehekharan)", "Commandement", "Savoir (Magie)", "Perception"] let skillAdvancements = [20, 30, 25, 30, 20, 20, 30, 20] -let talents = ["Harmonisation Aethyrique", "Magie des Arcanes", "Dur à cuire", "Diction Instinctive", "Sens de la Magie", "Menaçant", "Menaçant", "Magie Mineure", "Lire/Ecrire", "Seconde Vue", "Mage de Guerre"] -let trappings = ["Arme Simple"] +let talents = ["Harmonisation Aethyrique", "Magie des Arcanes (Domaine)", "Dur à cuire", "Diction Instinctive", "Perception de la magie", "Menaçant", "Menaçant", "Magie Mineure", "Lire/Écrire", "Seconde Vue", "Mage de guerre"] +let trappings = ["Arme simple"] let specialItems = [ - {name: "Robes", type: "trapping", trappingType: "clothingAccessories" }, - {name: "Bourse contenant des composants de Rituels", type: "trapping", trappingType: "clothingAccessories" }, - {name: "Bâton", type: "weapon", damage: "SB+2"}, - {name: "Magie sombre (Necromancie)", type: "talent"}, + {name: "Mouldering Robes", type: "trapping", trappingType: "clothingAccessories" }, + {name: "Pouches containing ritual components", type: "trapping", trappingType: "clothingAccessories" }, + {name: "Staff", type: "weapon", damage: "SB+2"}, + {name: "Magie Noire (Nécromancie)", type: "talent"}, ] let items = []; @@ -33,11 +33,11 @@ for (let ch in characteristics) for (let item of specialItems) { let newItem if (item.type == "weapon") { - newItem = new ItemWfrp4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) + newItem = new ItemWFRP4e({ name: item.name, type: item.type, system: { equipped: true, damage: {value: item.damage}} }) } else if (item.type == "trapping") { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type, system: { worn: true, trappingType: { value: item.trappingType} } } ) } else { - newItem = new ItemWfrp4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) + newItem = new ItemWFRP4e({ img: "systems/wfrp4e/icons/blank.png", name: item.name, type: item.type }) } items.push(newItem.toObject()) } @@ -67,7 +67,7 @@ for (let talent of talents) } else { - ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) + ui.notifications.warn(`Could not find ${talent}`, {permanent : true}) } } @@ -84,11 +84,11 @@ for (let trapping of trappings) } else { - ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) + ui.notifications.warn(`Could not find ${trapping}`, {permanent : true}) } } -updateObj.name = updateObj.name += " " + this.effect.name +updateObj.name = updateObj.name += " " + this.effet.name await this.actor.update(updateObj) console.log(">>>>>>><", items) diff --git a/scripts/zA6TDttpwMSMl7D8.js b/scripts/zA6TDttpwMSMl7D8.js deleted file mode 100644 index ab9ff3b..0000000 --- a/scripts/zA6TDttpwMSMl7D8.js +++ /dev/null @@ -1,14 +0,0 @@ -// An imbiber must take a Consume Alcohol Test. -this.actor.setupSkill(game.i18n.localize("NAME.ConsumeAlcohol"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`}).then(async test => { - await test.roll() - // If they succeed, - // as a result of whatever potential futures they glimpse, - // they can spend a Fortune Point within the next hour to reverse the dice of any failed Test. - if (test.succeeded) { - this.script.scriptMessage(`En raison des futurs potentiels entrevus, ${this.actor.prototypeToken.name} peut dépenser un Point de Chance durant la prochaine heure pour inverser le résultat d'un test échoué.`, - { - whisper: ChatMessage.getWhisperRecipients("GM"), - blind: true - }) - } -}) \ No newline at end of file diff --git a/scripts/zF1IKmobCB8ea58M.js b/scripts/zF1IKmobCB8ea58M.js new file mode 100644 index 0000000..dc8663b --- /dev/null +++ b/scripts/zF1IKmobCB8ea58M.js @@ -0,0 +1 @@ +return this.sourceActor.uuid === this.actor.uuid || !["ws", "ag"].includes(args.characteristic); \ No newline at end of file diff --git a/scripts/zFYCaGR0wbFWjl4T.js b/scripts/zFYCaGR0wbFWjl4T.js deleted file mode 100644 index fbb0202..0000000 --- a/scripts/zFYCaGR0wbFWjl4T.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name != game.i18n.localize("NAME.OutdoorSurvival"); \ No newline at end of file diff --git a/scripts/zGwtyjTUBeSQ110p.js b/scripts/zGwtyjTUBeSQ110p.js new file mode 100644 index 0000000..31d379b --- /dev/null +++ b/scripts/zGwtyjTUBeSQ110p.js @@ -0,0 +1,17 @@ +if (args.opposedTest.attackerTest.preData.charging) +{ + let mostProtectedLoc; + let mostProtectedValue = 0; + for (let loc in this.actor.status.armour) + { + if (this.actor.status.armour[loc].value != undefined && this.actor.status.armour[loc].value > mostProtectedValue) + { + mostProtectedLoc = loc; + mostProtectedValue = this.actor.status.armour[loc].value; + } + } + if (mostProtectedValue) + { + args.modifiers.other.push({label: this.effect.name, value : mostProtectedValue}); + } +} \ No newline at end of file diff --git a/scripts/zI5hXv2NLGWqnmDD.js b/scripts/zI5hXv2NLGWqnmDD.js new file mode 100644 index 0000000..dace8a6 --- /dev/null +++ b/scripts/zI5hXv2NLGWqnmDD.js @@ -0,0 +1,4 @@ +if (args.totalWoundLoss > 0) +{ + args.actor.applyEffect({effectUuids : this.item.effects.contents[0].uuid}) +} \ No newline at end of file diff --git a/scripts/zIErcRiBmIZRbary.js b/scripts/zIErcRiBmIZRbary.js new file mode 100644 index 0000000..3adc036 --- /dev/null +++ b/scripts/zIErcRiBmIZRbary.js @@ -0,0 +1,8 @@ +if (args.test.failed) + { + let applicableCharacteristics = ["ws", "bs", "s", "fel", "ag", "t", "dex"]; + if (applicableCharacteristics.includes(args.test.characteristicKey)) + { + this.actor.addCondition("stunned"); + } + } \ No newline at end of file diff --git a/scripts/zIpl3SkWv8zzlr2D.js b/scripts/zIpl3SkWv8zzlr2D.js index 1eca94a..0a406db 100644 --- a/scripts/zIpl3SkWv8zzlr2D.js +++ b/scripts/zIpl3SkWv8zzlr2D.js @@ -9,7 +9,7 @@ let filters = [ } ] -let petty = (await ItemDialog.createFromFilters(filters, 4, "Choisissez 4 sorts de Magie Mineure")).map(i => i.toObject()); +let petty = (await ItemDialog.createFromFilters(filters, 4, {text : "Choisissez 4 Sorts Mineurs"})).map(i => i.toObject()); filters = [ @@ -23,7 +23,7 @@ filters = [ } ] -let arcane = (await ItemDialog.createFromFilters(filters, 8, "Choisissez 8 Sorts d'Arcane & du Domaine de la Mort")).map(i => i.toObject()); +let arcane = (await ItemDialog.createFromFilters(filters, 8, {text : "Choisissez 8 Sorts d'Arcane et Savoir de la Mort"})).map(i => i.toObject()); filters = [ { @@ -41,7 +41,7 @@ filters = [ } ] -let necromancy = (await ItemDialog.createFromFilters(filters, 3, "Choisissez 3 sorts du Domaine de la Nécromancie")).map(i => i.toObject()); +let necromancy = (await ItemDialog.createFromFilters(filters, 3, {text : "Choisissez 3 dans le Savoir de Nécromancie"})).map(i => i.toObject()); let items = [...necromancy, ...petty, ...arcane] diff --git a/scripts/zK38Rl5t9zbFi4Se.js b/scripts/zK38Rl5t9zbFi4Se.js index 8638ea5..132048b 100644 --- a/scripts/zK38Rl5t9zbFi4Se.js +++ b/scripts/zK38Rl5t9zbFi4Se.js @@ -1,5 +1,5 @@ if (args.opposedTest.result.hitloc.value == this.item.system.location.key && args.totalWoundLoss > 0) { args.actor.addCondition("bleeding", 1); - this.script.scriptNotification("Ajout d'Hemorragique") + this.script.notification("Hémorragique ajouté") } \ No newline at end of file diff --git a/scripts/zL7ECmBBMAqf5Esn.js b/scripts/zL7ECmBBMAqf5Esn.js index b205bb2..df08d1e 100644 --- a/scripts/zL7ECmBBMAqf5Esn.js +++ b/scripts/zL7ECmBBMAqf5Esn.js @@ -1,4 +1,4 @@ -let hasMagazine = await Dialog.confirm({content: "

    Does the vessel have a magazine or any other kind of store for blackpowder?

    "}); +let hasMagazine = await foundry.applications.api.DialogV2.confirm({window : {title : this.effect.name}, content: "

    Le navire a-t-il un magasin ou tout autre type de réserve pour la poudre noire ?

    "}); if (!hasMagazine) return; @@ -27,4 +27,4 @@ for (let i = 0; i < roll.total; i++) { const items = await this.actor.createEmbeddedDocuments("Item", crits); const speaker = ChatMessage.getSpeaker({actor: this.actor}); const uuids = items.map(i => `@UUID[${i.uuid}]`); -this.script.scriptMessage(`

    ${this.item.name} caused an additional ${anchor.outerHTML} Critical Hits to the Hull!

    • ${uuids.join('
    • ')}
    `) \ No newline at end of file +this.script.message(`

    ${this.item.name} provoque un nombre supplémentaire de ${anchor.outerHTML} Coups Critiques à la Coque!

    • ${uuids.join('
    • ')}
    `) \ No newline at end of file diff --git a/scripts/zLBLEDl3aGcAxai2.js b/scripts/zLBLEDl3aGcAxai2.js deleted file mode 100644 index 2926bef..0000000 --- a/scripts/zLBLEDl3aGcAxai2.js +++ /dev/null @@ -1,16 +0,0 @@ -const hasTraits = args.actor.has("Démoniaque") || args.actor.has("Mort-vivant") || args.actor.has("Lanceur de Sorts"); -const hasSinOrCorruption = args.actor.status.sin.value > 0 || args.actor.status.corruption.value > 0; -const isSpellcaster = args.actor.itemTags.talent.some(i => - i.name.includes(game.i18n.localize("NAME.ArcaneMagic")) || - i.name.includes(game.i18n.localize("NAME.ChaosMagic")) || - i.name.includes(game.i18n.localize("NAME.PettyMagic")) - ); -const shouldDamage = hasTraits || hasSinOrCorruption || isSpellcaster; - -if (shouldDamage) { - const roll = new Roll("1d10"); - await roll.evaluate(); - let damage = roll.total; - await roll.toMessage(); - await this.script.message(await this.actor.applyBasicDamage(damage, {damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, suppressMsg: true})); -} \ No newline at end of file diff --git a/scripts/zR4WAjzXHTZuiu5G.js b/scripts/zR4WAjzXHTZuiu5G.js deleted file mode 100644 index 1bdc6d1..0000000 --- a/scripts/zR4WAjzXHTZuiu5G.js +++ /dev/null @@ -1,44 +0,0 @@ -let actor = this.actor; -let effect = this.effect; -let bleedingAmt; -let bleedingRoll; -let msg = "" - -let damage = effect.conditionValue; -let scriptArgs = { msg, damage }; -await Promise.all(actor.runScripts("preApplyCondition", { effect, data: scriptArgs })) -msg = scriptArgs.msg; -damage = scriptArgs.damage; -msg += await actor.applyBasicDamage(damage, { damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL, minimumOne: false, suppressMsg: true }) - -if (actor.status.wounds.value == 0 && !actor.hasCondition("unconscious")) { - await actor.addCondition("unconscious") - msg += "
    " + game.i18n.format("BleedUnc", { name: actor.prototypeToken.name }) -} - -if (actor.hasCondition("unconscious")) { - bleedingAmt = effect.conditionValue; - bleedingRoll = (await new Roll("1d100").roll()).total; - if (bleedingRoll <= bleedingAmt * 10) { - msg += "
    " + game.i18n.format("BleedFail", { name: actor.prototypeToken.name }) + " (" + game.i18n.localize("Rolled") + " " + bleedingRoll + ")"; - await actor.addCondition("dead") - } - else if (bleedingRoll % 11 == 0) { - msg += "
    " + game.i18n.format("BleedCrit", { name: actor.prototypeToken.name }) + " (" + game.i18n.localize("Rolled") + bleedingRoll + ")" - await actor.removeCondition("bleeding") - } - else { - msg += "
    " + game.i18n.localize("BleedRoll") + ": " + bleedingRoll; - } -} - -await Promise.all(actor.runScripts("applyCondition", { effect, data: { bleedingRoll } })) -if (args.suppressMessage) { - let messageData = game.wfrp4e.utility.chatDataSetup(msg); - messageData.speaker = { alias: this.effect.name } - messageData.flavor = this.effect.name; - return messageData -} -else { - return this.script.scriptMessage(msg) -} diff --git a/scripts/zWZG8OmxqTpzHjFV.js b/scripts/zWZG8OmxqTpzHjFV.js new file mode 100644 index 0000000..8a9112e --- /dev/null +++ b/scripts/zWZG8OmxqTpzHjFV.js @@ -0,0 +1,8 @@ +args.actor.characteristics.ag.modifier -= 10; + + if (args.actor.details.move.value > 3) + { + args.actor.details.move.value -= 1; + if (args.actor.details.move.value < 3) + args.actor.details.move.value = 3 + } \ No newline at end of file diff --git a/scripts/zXh8rgMxWoCLTxVd.js b/scripts/zXh8rgMxWoCLTxVd.js index 8878ffc..984188a 100644 --- a/scripts/zXh8rgMxWoCLTxVd.js +++ b/scripts/zXh8rgMxWoCLTxVd.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Voile'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Voile'; const difficulty = 'challenging'; const target = 40; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/zY4ZjY7uyKIKMYmX.js b/scripts/zY4ZjY7uyKIKMYmX.js deleted file mode 100644 index 10f3700..0000000 --- a/scripts/zY4ZjY7uyKIKMYmX.js +++ /dev/null @@ -1,8 +0,0 @@ -this.script.scriptMessage(await game.wfrp4e.tables.formatChatRoll("fleshy-curse")) - -let test = await this.actor.setupSkill(game.i18n.localize("NAME.Cool"), {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty : "hard"}}) -await test.roll(); -if (test.succeeded) -{ - this.effect.delete() -} \ No newline at end of file diff --git a/scripts/zadppy7FEbXvgUON.js b/scripts/zadppy7FEbXvgUON.js index a19fe6f..b16b2e4 100644 --- a/scripts/zadppy7FEbXvgUON.js +++ b/scripts/zadppy7FEbXvgUON.js @@ -12,8 +12,8 @@ } let skills = ["Perception", "Escamotage", "Discrétion (Urbaine)"] let skillAdvancements = [10, 10, 10] -let talents = ["Criminel", "Etiquette (Criminels)"] -let trappings = ["Corde, 10 mètres", "Outils de crochetage", "Masque"] +let talents = ["Criminel", "Etiquette (Criminals)"] +let trappings = ["Corde, 10 mètres", "Lockpick", "Masque"] let items = [] let updateObj = this.actor.toObject(); @@ -30,7 +30,7 @@ for (let index = 0; index < skills.length; index++) skillItem = updateObj.items.find(i => i.name == skill && i.type == "skill") if (skillItem) skillItem.system.advances.value += skillAdvancements[index] - else + else { skillItem = await game.wfrp4e.utility.findSkill(skill) skillItem = skillItem.toObject(); @@ -46,13 +46,13 @@ for (let talent of talents) { items.push(talentItem.toObject()); } - else + else { ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true}) } } -for (let trapping of trappings) +for (let trapping of trappings) { let trappingItem = await game.wfrp4e.utility.findItem(trapping) if (trappingItem) @@ -63,7 +63,7 @@ for (let trapping of trappings) items.push(trappingItem); } - else + else { ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true}) } diff --git a/scripts/zasFOZohkrdFIBwr.js b/scripts/zasFOZohkrdFIBwr.js new file mode 100644 index 0000000..1a7830b --- /dev/null +++ b/scripts/zasFOZohkrdFIBwr.js @@ -0,0 +1,6 @@ +let modifier = 0 + if (this.effect.name.includes("Moderate")) + modifier = -20 + else + modifier = -10 + args.fields.modifier += modifier \ No newline at end of file diff --git a/scripts/zdGAvfL7zJ7wpYxG.js b/scripts/zdGAvfL7zJ7wpYxG.js index 26d2e20..4bd596d 100644 --- a/scripts/zdGAvfL7zJ7wpYxG.js +++ b/scripts/zdGAvfL7zJ7wpYxG.js @@ -1,5 +1,5 @@ -const repaired_message = `

    Réparation finie ${this.item.name}.

    `; -const test = 'Trade (Carpenter)'; +const repaired_message = `

    Réparation terminée ${this.item.name}.

    `; +const Test = 'Métier (Charpentier)'; const difficulty = 'easy'; const target = 40; @@ -12,8 +12,8 @@ const extendedTestData = { current: 0, target: target }, - test: { - value: test + Test: { + value: Test }, completion: { value: "remove" @@ -24,7 +24,7 @@ const extendedTestData = { }, effects: [ { - name: `Réparer ${this.item.name}`, + name: `Réparation de ${this.item.name}`, img: this.item.img, system: { transferData : { diff --git a/scripts/zi8Z3NlwVj3IfgAW.js b/scripts/zi8Z3NlwVj3IfgAW.js index cfd8a70..e4803bc 100644 --- a/scripts/zi8Z3NlwVj3IfgAW.js +++ b/scripts/zi8Z3NlwVj3IfgAW.js @@ -6,5 +6,5 @@ if (this.item.system.quantity.value) } else { - this.script.scriptNotification("Quantité insuffisante!", "error") + this.script.notification("Plus rien !", "error") } \ No newline at end of file diff --git a/scripts/ziG9H5Kdb7xC3dFE.js b/scripts/ziG9H5Kdb7xC3dFE.js deleted file mode 100644 index 3d360af..0000000 --- a/scripts/ziG9H5Kdb7xC3dFE.js +++ /dev/null @@ -1 +0,0 @@ -return !args.skill?.name.includes(game.i18n.localize("NAME.Art")); \ No newline at end of file diff --git a/scripts/zjTEhJuLcFVkzory.js b/scripts/zjTEhJuLcFVkzory.js new file mode 100644 index 0000000..c1056fc --- /dev/null +++ b/scripts/zjTEhJuLcFVkzory.js @@ -0,0 +1,9 @@ +if (!args.test.preData.options?.kingship) return + +if (!this.item.equipped.value || !args.test.item) return; +if ([game.i18n.localize("NAME.Charm"), + game.i18n.localize("NAME.Intimidate"), + game.i18n.localize("NAME.Leadership")].includes(args.test.item.name)) +{ + args.test.preData.canReverse = true +} \ No newline at end of file diff --git a/scripts/zsiV6XEHlCNGLLPl.js b/scripts/zsiV6XEHlCNGLLPl.js deleted file mode 100644 index 8911fdc..0000000 --- a/scripts/zsiV6XEHlCNGLLPl.js +++ /dev/null @@ -1 +0,0 @@ -return args.skill?.name == game.i18n.localize("NAME.SetTrap"); \ No newline at end of file diff --git a/scripts/zsoTVkHe4nHY1M52.js b/scripts/zsoTVkHe4nHY1M52.js index c227411..76736b7 100644 --- a/scripts/zsoTVkHe4nHY1M52.js +++ b/scripts/zsoTVkHe4nHY1M52.js @@ -1 +1 @@ -this.script.scriptMessage(await this.actor.applyBasicDamage(10 + parseInt(this.effect.sourceTest.result.SL), {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP})) \ No newline at end of file +this.script.message(await this.actor.applyBasicDamage(10 + parseInt(this.effect.sourceTest.result.SL), {damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP})) \ No newline at end of file diff --git a/scripts/zxG5KbliWE9xWNQD.js b/scripts/zxG5KbliWE9xWNQD.js index 2fb7824..72b5356 100644 --- a/scripts/zxG5KbliWE9xWNQD.js +++ b/scripts/zxG5KbliWE9xWNQD.js @@ -1,2 +1,2 @@ -this.script.message("Passe automatiquement n'importe quel " + this.script.label); +this.script.message("Réussit automatiquement tout " + this.script.label); args.abort = true; \ No newline at end of file diff --git a/scripts/zzk2uRSFjFHB5kjw.js b/scripts/zzk2uRSFjFHB5kjw.js deleted file mode 100644 index b9b36c2..0000000 --- a/scripts/zzk2uRSFjFHB5kjw.js +++ /dev/null @@ -1,8 +0,0 @@ - -let roll = Math.ceil(CONFIG.Dice.randomUniform() * 10) -if (args.test.isFumble && roll == 1 && !args.test.result.misfire) { - args.test.result.misfire = game.i18n.localize("Misfire") + " (Résultat 1)" - args.test.result.misfireDamage = eval(parseInt(args.test.result.roll.toString().split('').pop()) + args.test.item.Damage) -} -else if (args.test.isFumble && roll != 1) - args.test.result.other.push("Misfire Roll: " + roll) \ No newline at end of file diff --git a/tools/GPUCache/data_0 b/tools/GPUCache/data_0 deleted file mode 100644 index d76fb77e93ac8a536b5dbade616d63abd00626c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeIuK?wjL5Jka{7-jo+5O1auw}mk8@B+*}b0s6M>Kg$91PBlyK!5-N0t5&UAV7cs W0RjXF5FkK+009C72oNCfo4^Gh&;oe? diff --git a/tools/GPUCache/data_1 b/tools/GPUCache/data_1 deleted file mode 100644 index d124210ecb0d6845e0d570d3bcbda51c1173015c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270336 zcmeI%!3hE}5CFi92LA{4pg$|L6Pr2w99D59Tn8G11tgG%9Fxax7BeIP?!jojP}z9{03Nx6W7E2@oJafB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ afB*pk1PBlyK!5-N0t5&UAV7e?J_SBK{|C$f diff --git a/tools/GPUCache/data_2 b/tools/GPUCache/data_2 deleted file mode 100644 index c7e2eb9adcfb2d3313ec85f5c28cedda950a3f9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeIu!3h8`2n0b1_TQ7_m#U&=2(t%Qz}%M=ae7_Oi2wlt1PBlyK!5-N0t5&UAV7cs V0RjXF5FkK+009C72oTsN@Bv`}0$Tt8 diff --git a/tools/GPUCache/data_3 b/tools/GPUCache/data_3 deleted file mode 100644 index 5eec97358cf550862fd343fc9a73c159d4c0ab10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeIuK@9*P5CpLeAOQbv2)|PW$RO!FMnHFsm9+HS=9>r*AV7cs0RjXF5FkK+009C7 W2oNAZfB*pk1PBlyK!5;&-vkZ-dID$w diff --git a/tools/GPUCache/index b/tools/GPUCache/index deleted file mode 100644 index 8331922927e0af838c1bc47f2af74ca49476c321..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 262512 zcmeIuF%5t)00h7%K!iX diff --git a/tools/analyze-english-terms.js b/tools/analyze-english-terms.js new file mode 100644 index 0000000..4278e5f --- /dev/null +++ b/tools/analyze-english-terms.js @@ -0,0 +1,100 @@ +import fs from 'fs'; + +// Lire le fichier JSON +const jsonData = JSON.parse(fs.readFileSync('./compendium/wfrp4e-core.items.json', 'utf8')); +const frJson = JSON.parse(fs.readFileSync('./fr.json', 'utf8')); + +// Chercher les termes en anglais (labels et titres courts) +const englishTerms = new Set(); +const termOccurrences = {}; + +// Parcourir les entrées +jsonData.entries.forEach(entry => { + // Vérifier le champ 'name' pour des patterns entre parenthèses + if (entry.name && entry.name.includes('(') && entry.name.includes(')')) { + const matches = entry.name.matchAll(/\(([^)]+)\)/g); + + for (const match of matches) { + const parenthesisContent = match[1]; + + // Liste de termes français connus à exclure + const frenchTerms = [ + 'Mineure', 'Majeure', 'Accessible', 'Complexe', 'Difficile', + 'Facile', 'Intermédiaire', 'Type', 'Domaine', 'Arme de jet', + 'Arme de mêlée', 'Compétence avancée', 'Compétence de base' + ]; + + // Détecter si c'est potentiellement de l'anglais + // - Contient des mots anglais courants (et, the, or, of) + // - Ne contient pas de caractères français (é, è, à, ô, etc.) + const hasEnglishWords = /\b(and|the|or|of|to|in|a|is)\b/i.test(parenthesisContent); + const hasNoFrenchChars = !/[àâäéèêëïîôùûüÿæœç]/i.test(parenthesisContent); + const notInFrenchList = !frenchTerms.some(term => + parenthesisContent.toLowerCase().includes(term.toLowerCase()) + ); + + if ((hasEnglishWords || (hasNoFrenchChars && notInFrenchList)) && + parenthesisContent.length > 2) { + englishTerms.add(parenthesisContent); + + if (!termOccurrences[parenthesisContent]) { + termOccurrences[parenthesisContent] = []; + } + + termOccurrences[parenthesisContent].push({ + id: entry.id, + name: entry.name + }); + } + } + } +}); + +// Afficher les résultats +console.log('Termes anglais détectés dans les noms (entre parenthèses):'); +console.log('==========================================================\n'); + +const sortedTerms = Array.from(englishTerms).sort(); +sortedTerms.forEach(term => { + console.log(`${term} (${termOccurrences[term].length} occurrence(s)):`); + termOccurrences[term].slice(0, 3).forEach(occ => { + console.log(` - ${occ.id}: ${occ.name}`); + }); + if (termOccurrences[term].length > 3) { + console.log(` ... et ${termOccurrences[term].length - 3} autres`); + } + console.log(''); +}); + +console.log(`\nTotal: ${englishTerms.size} termes anglais différents détectés`); + +// Chercher aussi dans d'autres champs +console.log('\n\nAnalyse des autres champs potentiels...'); +console.log('========================================\n'); + +// Chercher des labels courts en anglais dans tous les champs +const fieldsToCheck = ['type', 'special', 'description']; +const englishInFields = {}; + +jsonData.entries.slice(0, 20).forEach(entry => { + Object.keys(entry).forEach(key => { + if (typeof entry[key] === 'string' && entry[key].length < 50) { + const value = entry[key]; + // Détecter des mots anglais courants + if (/\b(Rating|Target|Group|Feature|Type|Level|Rank)\b/.test(value)) { + if (!englishInFields[key]) { + englishInFields[key] = new Set(); + } + englishInFields[key].add(value); + } + } + }); +}); + +Object.keys(englishInFields).forEach(field => { + console.log(`Champ '${field}':`); + englishInFields[field].forEach(value => { + console.log(` - "${value}"`); + }); + console.log(''); +}); diff --git a/tools/apply-sync.js b/tools/apply-sync.js new file mode 100644 index 0000000..de0432f --- /dev/null +++ b/tools/apply-sync.js @@ -0,0 +1,157 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const WFRP4E_SCRIPTS = '/home/morr/work/foundryvtt/WFRP4e-FoundryVTT/scripts'; +const FR_SCRIPTS = '/home/morr/work/foundryvtt/foundryvtt-wh4-lang-fr-fr/scripts'; +const DATA_FILE = path.join(__dirname, 'script-comparison-data.json'); +const LOG_FILE = path.join(__dirname, 'sync-scripts-log.txt'); + +// Charger les résultats de l'analyse +const data = JSON.parse(fs.readFileSync(DATA_FILE, 'utf-8')); + +const log = []; + +function writeLog(message) { + console.log(message); + log.push(message); +} + +function deleteObsoleteScripts() { + writeLog('\n=== SUPPRESSION DES SCRIPTS OBSOLÈTES ===\n'); + + let deleted = 0; + data.usesLocalize.forEach(({file}) => { + const filePath = path.join(FR_SCRIPTS, file); + if (fs.existsSync(filePath)) { + fs.unlinkSync(filePath); + deleted++; + writeLog(`✓ Supprimé: ${file}`); + } + }); + + writeLog(`\nTotal supprimés: ${deleted}/${data.usesLocalize.length}`); + return deleted; +} + +function copyNewScripts() { + writeLog('\n=== COPIE DES NOUVEAUX SCRIPTS ===\n'); + + let copied = 0; + data.onlyInWFRP4E.forEach(file => { + const sourcePath = path.join(WFRP4E_SCRIPTS, file); + const destPath = path.join(FR_SCRIPTS, file); + + if (fs.existsSync(sourcePath)) { + fs.copyFileSync(sourcePath, destPath); + copied++; + writeLog(`✓ Copié: ${file}`); + } else { + writeLog(`✗ Source non trouvée: ${file}`); + } + }); + + writeLog(`\nTotal copiés: ${copied}/${data.onlyInWFRP4E.length}`); + return copied; +} + +function deleteRemovedScripts() { + writeLog('\n=== SUPPRESSION DES SCRIPTS RETIRÉS ===\n'); + + let deleted = 0; + data.onlyInFR.forEach(file => { + const filePath = path.join(FR_SCRIPTS, file); + if (fs.existsSync(filePath)) { + fs.unlinkSync(filePath); + deleted++; + writeLog(`✓ Supprimé (n'existe plus dans WFRP4E): ${file}`); + } + }); + + writeLog(`\nTotal supprimés: ${deleted}/${data.onlyInFR.length}`); + return deleted; +} + +function updateScripts() { + writeLog('\n=== MISE À JOUR DES SCRIPTS ===\n'); + writeLog('Ces scripts ont été modifiés dans WFRP4E mais contiennent peut-être des traductions FR.'); + writeLog('Ils nécessitent une révision manuelle.\n'); + + let updated = 0; + let needsReview = []; + + data.needsUpdate.forEach(item => { + const wfrp4ePath = path.join(WFRP4E_SCRIPTS, item.file); + const frPath = path.join(FR_SCRIPTS, item.file); + + const wfrp4eContent = fs.readFileSync(wfrp4ePath, 'utf-8'); + const frContent = fs.readFileSync(frPath, 'utf-8'); + + // Vérifier si le script FR contient des textes en français + const hasFrenchText = /["'`](Chargement|Impossible|Voulez-vous|Êtes-vous|créé|modifié|supprimé)/i.test(frContent); + + if (hasFrenchText) { + // Script avec traductions, nécessite révision manuelle + needsReview.push({ + file: item.file, + reason: 'Contient des textes traduits en français' + }); + writeLog(`⚠ RÉVISION NÉCESSAIRE: ${item.file} (contient des traductions)`); + } else { + // Pas de traductions détectées, on peut mettre à jour automatiquement + fs.copyFileSync(wfrp4ePath, frPath); + updated++; + writeLog(`✓ Mis à jour: ${item.file}`); + } + }); + + writeLog(`\nTotal mis à jour automatiquement: ${updated}`); + writeLog(`Total nécessitant révision: ${needsReview.length}`); + + // Créer un fichier avec la liste des scripts à réviser + if (needsReview.length > 0) { + const reviewFile = path.join(__dirname, 'scripts-to-review.json'); + fs.writeFileSync(reviewFile, JSON.stringify(needsReview, null, 2), 'utf-8'); + writeLog(`\nListe des scripts à réviser sauvegardée dans: ${reviewFile}`); + } + + return {updated, needsReview: needsReview.length}; +} + +// Programme principal +writeLog('='.repeat(60)); +writeLog('SYNCHRONISATION DES SCRIPTS WFRP4E'); +writeLog('='.repeat(60)); +writeLog(`Date: ${new Date().toISOString()}\n`); + +writeLog('Statistiques:'); +writeLog(` - Scripts identiques: ${data.identical.length}`); +writeLog(` - Scripts obsolètes (localize): ${data.usesLocalize.length}`); +writeLog(` - Scripts à mettre à jour: ${data.needsUpdate.length}`); +writeLog(` - Nouveaux scripts (WFRP4E): ${data.onlyInWFRP4E.length}`); +writeLog(` - Scripts à supprimer (FR): ${data.onlyInFR.length}`); + +// Demander confirmation +console.log('\nVoulez-vous continuer ? (appuyez sur Entrée pour continuer, Ctrl+C pour annuler)'); +// Pour l'automatisation, on continue directement +// En production, on utiliserait readline pour une confirmation interactive + +const obsoleteDeleted = deleteObsoleteScripts(); +const removedDeleted = deleteRemovedScripts(); +const newCopied = copyNewScripts(); +const {updated, needsReview} = updateScripts(); + +writeLog('\n' + '='.repeat(60)); +writeLog('RÉSUMÉ DES OPÉRATIONS'); +writeLog('='.repeat(60)); +writeLog(`Scripts obsolètes supprimés: ${obsoleteDeleted}`); +writeLog(`Scripts retirés supprimés: ${removedDeleted}`); +writeLog(`Nouveaux scripts copiés: ${newCopied}`); +writeLog(`Scripts mis à jour automatiquement: ${updated}`); +writeLog(`Scripts nécessitant révision manuelle: ${needsReview}`); +writeLog('='.repeat(60)); + +// Sauvegarder le log +fs.writeFileSync(LOG_FILE, log.join('\n'), 'utf-8'); +writeLog(`\nLog sauvegardé dans: ${LOG_FILE}`); diff --git a/tools/apply-translations.js b/tools/apply-translations.js new file mode 100644 index 0000000..23d5256 --- /dev/null +++ b/tools/apply-translations.js @@ -0,0 +1,78 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const FR_DIR = path.join(__dirname, 'scripts'); +const OPPORTUNITIES_FILE = path.join(__dirname, 'translation-opportunities.json'); + +// Charger les opportunités de traduction +const data = JSON.parse(fs.readFileSync(OPPORTUNITIES_FILE, 'utf8')); +const { reliableTranslations, opportunities } = data; + +// Fonction pour échapper les caractères spéciaux pour regex +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +// Statistiques +let stats = { + filesProcessed: 0, + filesModified: 0, + replacementsMade: 0, + errors: 0 +}; + +console.log('Application automatique des traductions...\n'); +console.log('='.repeat(60)); + +// Traiter chaque fichier avec des opportunités +opportunities.forEach(({ file, translations }) => { + const filePath = path.join(FR_DIR, file); + stats.filesProcessed++; + + try { + let content = fs.readFileSync(filePath, 'utf8'); + let modified = false; + let replacementsInFile = 0; + + // Appliquer chaque traduction + translations.forEach(({ en, fr }) => { + // Vérifier que la chaîne anglaise existe toujours dans le fichier + if (content.includes(en)) { + // Remplacement simple (pas de regex pour éviter les problèmes avec les caractères spéciaux) + const newContent = content.split(en).join(fr); + + if (newContent !== content) { + const count = (content.split(en).length - 1); + content = newContent; + modified = true; + replacementsInFile += count; + stats.replacementsMade += count; + } + } + }); + + // Sauvegarder si modifié + if (modified) { + fs.writeFileSync(filePath, content, 'utf8'); + stats.filesModified++; + console.log(`✓ ${file} : ${replacementsInFile} remplacement(s)`); + } + + } catch (error) { + stats.errors++; + console.error(`✗ ${file} : ${error.message}`); + } +}); + +console.log('\n' + '='.repeat(60)); +console.log('Application terminée !'); +console.log('='.repeat(60)); +console.log(`Fichiers traités : ${stats.filesProcessed}`); +console.log(`Fichiers modifiés : ${stats.filesModified}`); +console.log(`Remplacements effectués : ${stats.replacementsMade}`); +console.log(`Erreurs : ${stats.errors}`); +console.log('='.repeat(60)); diff --git a/tools/auto-merge-translations.js b/tools/auto-merge-translations.js new file mode 100644 index 0000000..2c29052 --- /dev/null +++ b/tools/auto-merge-translations.js @@ -0,0 +1,116 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const WFRP4E_SCRIPTS = '/home/morr/work/foundryvtt/WFRP4e-FoundryVTT/scripts'; +const FR_SCRIPTS = '/home/morr/work/foundryvtt/foundryvtt-wh4-lang-fr-fr/scripts'; +const REVIEW_FILE = path.join(__dirname, 'scripts-to-review.json'); + +const scriptsToReview = JSON.parse(fs.readFileSync(REVIEW_FILE, 'utf-8')); + +// Dictionnaire de traductions courantes +const translations = { + 'Loading Spells': 'Chargement des sorts', + 'Loading': 'Chargement', + 'Could not find': 'Impossible de trouver', + 'Try Again': 'Essayez à nouveau', + 'Error': 'Erreur', + 'Success': 'Succès', + 'Warning': 'Avertissement', + 'Created': 'Créé', + 'Modified': 'Modifié', + 'Deleted': 'Supprimé', + 'Are you sure': 'Êtes-vous sûr', + 'Do you want': 'Voulez-vous', + 'Cancel': 'Annuler', + 'Confirm': 'Confirmer', + 'Yes': 'Oui', + 'No': 'Non' +}; + +function translateText(text) { + // Remplacer les traductions connues + let translated = text; + for (const [en, fr] of Object.entries(translations)) { + translated = translated.replace(new RegExp(en, 'g'), fr); + } + return translated; +} + +function mergeScript(wfrp4eContent, frContent) { + // Commence avec la version WFRP4E (à jour) + let merged = wfrp4eContent; + + // Extraire les textes traduits du script FR + const frTexts = new Map(); + const textPattern = /["'`]([^"'`]+)["'`]/g; + + let match; + while ((match = textPattern.exec(frContent)) !== null) { + const text = match[1]; + // Si le texte contient des mots français caractéristiques + if (/Chargement|Impossible|Êtes-vous|Voulez-vous|créé|modifié|supprimé|Erreur/i.test(text)) { + // Chercher le texte anglais correspondant dans WFRP4E + const enMatch = wfrp4eContent.match(new RegExp(`["'\`]([^"'\`]*${text.split(' ')[0]}[^"'\`]*)["'\`]`)); + if (enMatch) { + frTexts.set(enMatch[1], text); + } + } + } + + // Appliquer les traductions connues + for (const [en, fr] of frTexts.entries()) { + merged = merged.replace(new RegExp(`["'\`]${en.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}["'\`]`, 'g'), `"${fr}"`); + } + + // Appliquer le dictionnaire de traductions + for (const [en, fr] of Object.entries(translations)) { + merged = merged.replace(new RegExp(`["'\`]${en}["'\`]`, 'g'), `"${fr}"`); + } + + // Cas spéciaux pour les template literals + merged = merged.replace(/`Could not find \$\{([^}]+)\} spell\. Try Again`/g, '`Impossible de trouver le sort ${$1}. Essayez à nouveau`'); + + return merged; +} + +console.log('Révision semi-automatique des scripts...\n'); + +let updated = 0; +let skipped = 0; + +scriptsToReview.forEach(({file}) => { + const wfrp4ePath = path.join(WFRP4E_SCRIPTS, file); + const frPath = path.join(FR_SCRIPTS, file); + const backupPath = frPath + '.backup'; + + const wfrp4eContent = fs.readFileSync(wfrp4ePath, 'utf-8'); + const frContent = fs.readFileSync(frPath, 'utf-8'); + + // Sauvegarder l'original + fs.copyFileSync(frPath, backupPath); + + // Tenter la fusion + const merged = mergeScript(wfrp4eContent, frContent); + + // Vérifier si des traductions ont été préservées + const hasTranslations = /Chargement|Impossible|Êtes-vous|Voulez-vous|créé|modifié|supprimé|Erreur/i.test(merged); + + if (hasTranslations) { + fs.writeFileSync(frPath, merged, 'utf-8'); + updated++; + console.log(`✓ Mis à jour avec traductions: ${file}`); + } else { + // Restaurer l'original si aucune traduction n'a été préservée + fs.copyFileSync(backupPath, frPath); + skipped++; + console.log(`⚠ Révision manuelle requise: ${file}`); + } +}); + +console.log(`\n=== Résumé ===`); +console.log(`Scripts mis à jour automatiquement: ${updated}`); +console.log(`Scripts nécessitant révision manuelle: ${skipped}`); +console.log(`\nNOTE: Les fichiers .backup contiennent les versions originales.`); +console.log(`Vérifiez les fichiers mis à jour avant de supprimer les backups.`); diff --git a/tools/auto-translate-english.js b/tools/auto-translate-english.js new file mode 100644 index 0000000..9432c36 --- /dev/null +++ b/tools/auto-translate-english.js @@ -0,0 +1,219 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const FR_DIR = path.join(__dirname, 'scripts'); +const ENGLISH_TEXTS_FILE = path.join(__dirname, 'english-texts-found.json'); +const FR_JSON_FILE = path.join(__dirname, 'fr.json'); + +// Charger les données +const englishTexts = JSON.parse(fs.readFileSync(ENGLISH_TEXTS_FILE, 'utf8')); +const frJson = JSON.parse(fs.readFileSync(FR_JSON_FILE, 'utf8')); + +// Créer un mapping de traductions basé sur fr.json et les patterns connus +const translations = { + // Patterns déjà traduits dans le système + "Choose Training": "Choisir un Entraînement", + "Lore (Magic)": "Savoir (Magie)", + "Dark Magic (Necromancy)": "Magie Noire (Nécromancie)", + "Lore (Theology)": "Savoir (Théologie)", + "Lore (Runes)": "Savoir (Runes)", + "Sail (Skycraft)": "Voile (Aéronavale)", + "all forms": "toutes formes", + + // Messages utilisateur + "Skipping Tests to apply the tattoos": "Tests ignorés pour appliquer les tatouages", + "Apply Ward of Grimnir effect?": "Appliquer l'effet Rune de Grimnir ?", + "No Lore (Theology) skill found, cannot pass.": "Compétence Savoir (Théologie) introuvable, impossible de continuer.", + "No Lore (Runes) skill found, cannot pass.": "Compétence Savoir (Runes) introuvable, impossible de continuer.", + "One or more Tests to apply the tattoos failed.": "Un ou plusieurs Tests pour appliquer les tatouages ont échoué.", + "Must provide a Master Rune": "Doit fournir une Rune Maîtresse", + "Must provide a Rune (non-Master)": "Doit fournir une Rune (non-Maîtresse)", + + // Effets et conditions + "Removed Broken": "Condition Brisé supprimée", + "Added Bleeding": "Saignement ajouté", + "Applied after effects": "Effets secondaires appliqués", + "Does not need to make Peur or Terror tests": "N'a pas besoin de faire de tests de Peur ou de Terreur", + "Automatically passes any": "Réussit automatiquement tout", + + // Fragments de code courants (contextuels) + "action-link critical": "action-link critical", // Classe CSS, ne pas traduire + "> Critical": "> Critique", + + // Patterns génériques + "|| this.item.getFlag(": "|| this.item.getFlag(", // Code JS, ne pas traduire + ',"info")': ',"info")', // Code JS, ne pas traduire +}; + +// Fonction pour obtenir la fréquence de chaque texte anglais +function getTextFrequencies() { + const frequencies = new Map(); + + englishTexts.forEach(({ strings }) => { + strings.forEach(str => { + frequencies.set(str, (frequencies.get(str) || 0) + 1); + }); + }); + + return frequencies; +} + +// Fonction pour proposer des traductions automatiques +function proposeTranslations(text) { + // Si déjà dans le mapping, retourner + if (translations[text]) { + return translations[text]; + } + + // Patterns de remplacement simples basés sur fr.json + let translated = text; + + // Mots courants du vocabulaire WFRP + const vocabulary = { + "Choose": "Choisir", + "Select": "Sélectionner", + "Enter": "Entrer", + "Critical": "Critique", + "Wounds": "Blessures", + "Bleeding": "Saignement", + "Broken": "Brisé", + "Removed": "Retiré", + "Added": "Ajouté", + "Applied": "Appliqué", + "Failed": "Échoué", + "Passed": "Réussi", + "Cannot": "Impossible de", + "Must": "Doit", + "Need": "Besoin", + "Automatically": "Automatiquement", + "any": "tout", + "all": "tout", + "Test": "Test", + "Tests": "Tests", + "Skill": "Compétence", + "effect": "effet", + "after effects": "effets secondaires", + }; + + // Appliquer les remplacements de vocabulaire + for (const [en, fr] of Object.entries(vocabulary)) { + const regex = new RegExp(`\\b${en}\\b`, 'gi'); + translated = translated.replace(regex, (match) => { + // Conserver la casse + if (match[0] === match[0].toUpperCase()) { + return fr.charAt(0).toUpperCase() + fr.slice(1); + } + return fr; + }); + } + + // Si rien n'a changé, ne pas proposer de traduction + if (translated === text) { + return null; + } + + return translated; +} + +// Analyser et créer le mapping complet +console.log('Création du mapping de traductions...\n'); + +const frequencies = getTextFrequencies(); +const autoTranslations = new Map(); + +// Trier par fréquence décroissante +const sortedTexts = Array.from(frequencies.entries()) + .sort((a, b) => b[1] - a[1]); + +let proposedCount = 0; +let existingCount = 0; + +sortedTexts.forEach(([text, freq]) => { + if (translations[text]) { + autoTranslations.set(text, translations[text]); + existingCount++; + } else { + const proposed = proposeTranslations(text); + if (proposed && proposed !== text) { + autoTranslations.set(text, proposed); + proposedCount++; + if (proposedCount <= 10) { + console.log(`"${text}" → "${proposed}" (${freq}x)`); + } + } + } +}); + +console.log(`\n${existingCount} traductions existantes`); +console.log(`${proposedCount} traductions proposées automatiquement`); +console.log(`${sortedTexts.length - existingCount - proposedCount} textes ignorés (code/technique)`); + +// Appliquer les traductions +console.log('\n' + '='.repeat(60)); +console.log('Application des traductions...\n'); + +let stats = { + filesProcessed: 0, + filesModified: 0, + replacementsMade: 0, + errors: 0 +}; + +englishTexts.forEach(({ file, strings }) => { + const filePath = path.join(FR_DIR, file); + stats.filesProcessed++; + + try { + let content = fs.readFileSync(filePath, 'utf8'); + let modified = false; + let replacementsInFile = 0; + + strings.forEach(text => { + const translation = autoTranslations.get(text); + if (translation && content.includes(text)) { + // Remplacement simple + const newContent = content.split(text).join(translation); + + if (newContent !== content) { + const count = content.split(text).length - 1; + content = newContent; + modified = true; + replacementsInFile += count; + stats.replacementsMade += count; + } + } + }); + + if (modified) { + fs.writeFileSync(filePath, content, 'utf8'); + stats.filesModified++; + console.log(`✓ ${file} : ${replacementsInFile} remplacement(s)`); + } + + } catch (error) { + stats.errors++; + console.error(`✗ ${file} : ${error.message}`); + } +}); + +console.log('\n' + '='.repeat(60)); +console.log('Traduction automatique terminée !'); +console.log('='.repeat(60)); +console.log(`Fichiers traités : ${stats.filesProcessed}`); +console.log(`Fichiers modifiés : ${stats.filesModified}`); +console.log(`Remplacements effectués : ${stats.replacementsMade}`); +console.log(`Erreurs : ${stats.errors}`); +console.log('='.repeat(60)); + +// Sauvegarder le mapping de traductions +const mappingFile = path.join(__dirname, 'auto-translations-applied.json'); +fs.writeFileSync( + mappingFile, + JSON.stringify(Object.fromEntries(autoTranslations), null, 2), + 'utf8' +); +console.log(`\nMapping de traductions sauvegardé dans : auto-translations-applied.json`); diff --git a/tools/auto-translations-applied.json b/tools/auto-translations-applied.json new file mode 100644 index 0000000..bfe5ddd --- /dev/null +++ b/tools/auto-translations-applied.json @@ -0,0 +1,251 @@ +{ + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(": "+ this.effet.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nconsole.log(": "+ this.effet.name\n\nawait this.actor.update(updateObj)\nconsole.log(", + "Added Bleeding": "Saignement ajouté", + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty :": ", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, fields : {difficulty :", + "Fatigued added to": "Fatigued Ajouté to", + "which cannot be removed until the Malaise symptom is gone.": "which Impossible de be Retiré until the Malaise symptom is gone.", + ")}!`}));\n\nthis.effect.updateSource({": ")}!`}));\n\nthis.effet.updateSource({", + "Lore (Magic)": "Savoir (Magie)", + ")}) \n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name +=": ")}) \n}\n\n// Notify of lingering effects when mask is Retiré\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name +=", + "})\n this.script.message(`${this.item.name} on ${this.actor.name} has been taken off and loses its properties. However, the effects last for [[1d10+4]] days, after which they should be manually removed.`, \n {whisper: ChatMessage.getWhisperRecipients(": "})\n this.script.message(`${this.item.name} on ${this.actor.name} has been taken off and loses its properties. However, the effects last for [[1d10+4]] days, after which they should be manually Retiré.`, \n {whisper: ChatMessage.getWhisperRecipients(", + ",\n {whisper: ChatMessage.getWhisperRecipients(\"GM\")}) \n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name += \" (Used)\"})\n this.script.message(": ",\n {whisper: ChatMessage.getWhisperRecipients(\"GM\")}) \n}\n\n// Notify of lingering effects when mask is Retiré\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name += \" (Used)\"})\n this.script.message(", + "+ this.effect.name, context : {failure:": "+ this.effet.name, context : {failure:", + "Choose Characteristic": "Choisir Characteristic", + ": this.item.system.tests.value.replace(": ": this.item.system.Tests.value.replace(", + ") || this.item.system.tests.value.includes(": ") || this.item.system.Tests.value.includes(", + ") || this.item.system.tests.value.toLowerCase().includes(": ") || this.item.system.Tests.value.toLowerCase().includes(", + "))\n{\n let tests = this.item.system.tests.value\n let name = this.item.name\n\n // If name already specifies, make sure tests value reflects that\n if (name.includes(": "))\n{\n let Tests = this.item.system.Tests.value\n let name = this.item.name\n\n // If name already specifies, make sure Tests value reflects that\n if (name.includes(", + ",\n skipTargets: true,\n fields: {difficulty: 'easy'},\n characteristic: 'wp',\n});\nawait test.roll();\n\nif (!test.succeeded) {\n test.result.other.push(": ",\n skipTargets: true,\n fields: {difficulty: 'easy'},\n characteristic: 'wp',\n});\nawait Test.roll();\n\nif (!Test.succeeded) {\n Test.result.other.push(", + "Dark Magic (Necromancy)": "Magie Noire (Nécromancie)", + "action-link critical": "action-link critical", + "all forms": "toutes formes", + ")})\n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name +=": ")})\n}\n\n// Notify of lingering effects when mask is Retiré\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name +=", + ";\nconst test = 'Maintenance Crew Test';\nconst difficulty = 'hard';\nconst target = 80;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Maintenance Crew Test';\nconst difficulty = 'hard';\nconst target = 80;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + "}})\nawait test.roll();\nif (test.failed)\n{\n args.actor.addCondition(": "}})\nawait Test.roll();\nif (Test.Échoué)\n{\n args.actor.addCondition(", + "}})\nawait test.roll();\nif (test.failed)\n{\n this.actor.addCondition(": "}})\nawait Test.roll();\nif (Test.Échoué)\n{\n this.actor.addCondition(", + "Choose a Condition": "Choisir a Condition", + "

    \n Select your choice\n

    \n
      \n
    1. Mail
    2. \n
    3. Mail & Leather
    4. \n
    5. Plate
    6. \n
    ": "

    \n Sélectionner your choice\n

    \n
      \n
    1. Mail
    2. \n
    3. Mail & Leather
    4. \n
    5. Plate
    6. \n
    ", + "})\n await test.roll();\n if (test.failed)\n {\n this.actor.addCondition(": "})\n await Test.roll();\n if (Test.Échoué)\n {\n this.actor.addCondition(", + "critical-roll": "Critique-roll", + ").pop())\n\nif (ones > SL)\n args.test.result.other.push(` SL)\n args.Test.result.other.push(` {\n return {\n id : i.toLowerCase(),\n name : i\n }\n });\n}\n\nif (choice.length)\n{\n let changes = foundry.utils.deepClone(this.effect.changes);\n\n for(let training of choice)\n {\n switch(training.id)\n {\n case": ").map(i => {\n return {\n id : i.toLowerCase(),\n name : i\n }\n });\n}\n\nif (choice.length)\n{\n let changes = foundry.utils.deepClone(this.effet.changes);\n\n for(let training of choice)\n {\n switch(training.id)\n {\n case", + ", [territorial], {fromEffect: this.effect.id})\n foundry.utils.setProperty(args,": ", [territorial], {fromEffect: this.effet.id})\n foundry.utils.setProperty(args,", + "})\n break;\n }\n }\n this.effect.updateSource({name : `${this.effect.name} (${choice.map(i => i.name).join(": "})\n break;\n }\n }\n this.effet.updateSource({name : `${this.effet.name} (${choice.map(i => i.name).join(", + ";\n\n let wounds = foundry.utils.duplicate(this.actor.status.wounds);\n let regenRoll = await new Roll(": ";\n\n let Blessures = foundry.utils.duplicate(this.actor.status.Blessures);\n let regenRoll = await new Roll(", + ").roll({allowInteractive : false});\n let regen = regenRoll.total;\n\n if (wounds.value >= wounds.max)\n return;\n\n if (wounds.value > 0) {\n wounds.value += Math.floor(regen / 2);\n if (wounds.value > wounds.max) {\n wounds.value = wounds.max;\n }\n message += \\`\\${this.actor.name} regagne \\${regen} Blessures.\\`;\n\n if (regen === 10) {\n message +=": ").roll({allowInteractive : false});\n let regen = regenRoll.total;\n\n if (Blessures.value >= Blessures.max)\n return;\n\n if (Blessures.value > 0) {\n Blessures.value += Math.floor(regen / 2);\n if (Blessures.value > Blessures.max) {\n Blessures.value = Blessures.max;\n }\n message += \\`\\${this.actor.name} regagne \\${regen} Blessures.\\`;\n\n if (regen === 10) {\n message +=", + ";\n }\n } else if (regen >= 8) {\n message += \\`\\${this.actor.name} a obtenu un \\${regen} et regagne 1 Blessure.\\`;\n wounds.value += 1;\n if (regen === 10) {\n message +=": ";\n }\n } else if (regen >= 8) {\n message += \\`\\${this.actor.name} a obtenu un \\${regen} et regagne 1 Blessure.\\`;\n Blessures.value += 1;\n if (regen === 10) {\n message +=", + ": wounds});\n this.script.message(message, {whisper: ChatMessage.getWhisperRecipients(": ": Blessures});\n this.script.message(message, {whisper: ChatMessage.getWhisperRecipients(", + ")});\n`\n\nawait effect.update({\n name,": ")});\n`\n\nawait effet.update({\n name,", + ";\n wounds.value += 1;\n if (regen === 10) {\n message += \"
    De plus, il régénère une Blessure Critique.\";\n }\n } else {\n message += \\": ";\n Blessures.value += 1;\n if (regen === 10) {\n message += \"
    De plus, il régénère une Blessure Critique.\";\n }\n } else {\n message += \\", + ";\n }\n\n await this.actor.update({\"system.status.wounds\": wounds});\n this.script.message(message, {whisper: ChatMessage.getWhisperRecipients(\"GM\")});": ";\n }\n\n await this.actor.update({\"system.status.Blessures\": Blessures});\n this.script.message(message, {whisper: ChatMessage.getWhisperRecipients(\"GM\")});", + ")\n}\n\nthis.effect.updateSource({": ")\n}\n\nthis.effet.updateSource({", + ")[0].trim()} (${resistance})`})\n this.effect.updateSource({name : this.effect.name + ` (${resistance})`})\n }\n} \nthis.item.updateSource({": ")[0].trim()} (${resistance})`})\n this.effet.updateSource({name : this.effet.name + ` (${resistance})`})\n }\n} \nthis.item.updateSource({", + ", resistance)})\n\nif (resistance && !this.effect.name.includes(": ", resistance)})\n\nif (resistance && !this.effet.name.includes(", + "})\n this.effect.updateSource({name : this.effect.name +": "})\n this.effet.updateSource({name : this.effet.name +", + "})\n }\n} \nthis.item.updateSource({\"system.tests.value\" : this.item.system.tests.value.replace(\"the associated Threat\", resistance)})\n\nif (resistance && !this.effect.name.includes(\"(\"))\n{\n this.effect.updateSource({name : this.effect.name +=": "})\n }\n} \nthis.item.updateSource({\"system.Tests.value\" : this.item.system.Tests.value.replace(\"the associated Threat\", resistance)})\n\nif (resistance && !this.effet.name.includes(\"(\"))\n{\n this.effet.updateSource({name : this.effet.name +=", + ")\n }\n }\n\n this.effect.updateSource({name})\n this.item.updateSource({name,": ")\n }\n }\n\n this.effet.updateSource({name})\n this.item.updateSource({name,", + "épines\"];\n\nlet updateObj = this.actor.toObject();\n\nfor (let ch in characteristics)\n{\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n}\n\nfor (let index = 0; index < skills.length; index++)\n{\n let skill = skills[index]\n let skillItem;\n skillItem = updateObj.items.find(i => i.name == skill && i.type == \"skill\")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else \n {\n skillItem = await game.wfrp4e.utility.findSkill(skill)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else \n {\n ui.notifications.warn(`Could not find ${talent}`, {permanent : true})\n }\n}\n\nconst traitRegex = /(?:,?(.+?)(\\+?\\d{1,2}\\+?)?\\s*?(?:\\((.+?)\\)\\s*(\\+?\\d{1,2})?|,|$))/gm\nfor (let trait of traits)\n{\n let traitMatches = trait.matchAll(traitRegex).next().value\n let traitName = traitMatches[1]\n let traitVal = traitMatches[2] || traitMatches[4] // could be match 2 or 4 depending on if there": "épines\"];\n\nlet updateObj = this.actor.toObject();\n\nfor (let ch in characteristics)\n{\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n}\n\nfor (let index = 0; index < skills.length; index++)\n{\n let Compétence = skills[index]\n let skillItem;\n skillItem = updateObj.items.find(i => i.name == Compétence && i.type == \"Compétence\")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else \n {\n skillItem = await game.wfrp4e.utility.findSkill(Compétence)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else \n {\n ui.notifications.warn(`Could not find ${talent}`, {permanent : true})\n }\n}\n\nconst traitRegex = /(?:,?(.+?)(\\+?\\d{1,2}\\+?)?\\s*?(?:\\((.+?)\\)\\s*(\\+?\\d{1,2})?|,|$))/gm\nfor (let trait of traits)\n{\n let traitMatches = trait.matchAll(traitRegex).next().value\n let traitName = traitMatches[1]\n let traitVal = traitMatches[2] || traitMatches[4] // could be match 2 or 4 depending on if there", + "Skipping Tests to apply the tattoos": "Tests ignorés pour appliquer les tatouages", + "

    Apply Ward of Grimnir effect?

    ": "

    Apply Ward of Grimnir effet?

    ", + "No Lore (Theology) skill found, cannot pass.": "Compétence Savoir (Théologie) introuvable, impossible de continuer.", + "No Lore (Runes) skill found, cannot pass.": "Compétence Savoir (Runes) introuvable, impossible de continuer.", + "One or more Tests to apply the tattoos failed.": "Un ou plusieurs Tests pour appliquer les tatouages ont échoué.", + ", fields : {difficulty : \"vhard\"}})\n await test.roll();\n if (test.failed)\n {\n failed = true;\n }\n}\nelse \n{\n this.script.notification(\"No Lore (Theology) skill found, cannot pass.\")\n failed = true;\n}\n\nif (this.actor.itemTags.skill.find(i => i.name == \"Lore (Runes)\"))\n {\n let test = await this.actor.setupSkill(\"Lore (Runes)\", {appendTitle :": ", fields : {difficulty : \"vhard\"}})\n await Test.roll();\n if (Test.Échoué)\n {\n Échoué = true;\n }\n}\nelse \n{\n this.script.notification(\"No Lore (Theology) Compétence found, Impossible de pass.\")\n Échoué = true;\n}\n\nif (this.actor.itemTags.Compétence.find(i => i.name == \"Lore (Runes)\"))\n {\n let Test = await this.actor.setupSkill(\"Lore (Runes)\", {appendTitle :", + ", fields : {difficulty : \"hard\"}})\n await test.roll();\n if (test.failed)\n {\n failed = true;\n }\n }\n else \n {\n this.script.notification(\"No Lore (Runes) skill found, cannot pass.\")\n failed = true;\n }\n\n\n let test = await this.actor.setupSkill(\"Art (Tattooing)\", {appendTitle :": ", fields : {difficulty : \"hard\"}})\n await Test.roll();\n if (Test.Échoué)\n {\n Échoué = true;\n }\n }\n else \n {\n this.script.notification(\"No Lore (Runes) Compétence found, Impossible de pass.\")\n Échoué = true;\n }\n\n\n let Test = await this.actor.setupSkill(\"Art (Tattooing)\", {appendTitle :", + ")\n let configBlessings = await Promise.all((game.wfrp4e.config.godBlessings[god.toLowerCase()] || []).map(fromUuid));\n if (god ==": ")\n let configBlessings = await Promise.tout((game.wfrp4e.config.godBlessings[god.toLowerCase()] || []).map(fromUuid));\n if (god ==", + "))\n await this.actor.addEffectItems(blessings.map(i => i.uuid), this.effect)\n }\n else\n {\n this.script.scriptNotification(`Impossible de trouver des Bénédictions associées à ${god}.`)\n }\n if (this.item.name.includes(": "))\n await this.actor.addEffectItems(blessings.map(i => i.uuid), this.effet)\n }\n else\n {\n this.script.scriptNotification(`Impossible de trouver des Bénédictions associées à ${god}.`)\n }\n if (this.item.name.includes(", + ", group)})\n\tthis.effect.updateSource({name : this.effect.name + ` (${group})`})\n}\n\n\ndata.name = data.name.replace(": ", group)})\n\tthis.effet.updateSource({name : this.effet.name + ` (${group})`})\n}\n\n\ndata.name = data.name.replace(", + ", \"system.tests.value\" : this.item.system.tests.value.replace(\"Group\", group)})\n\tthis.effect.updateSource({name : this.effect.name +": ", \"system.Tests.value\" : this.item.system.Tests.value.replace(\"Group\", group)})\n\tthis.effet.updateSource({name : this.effet.name +", + "attrait du Léviathan.`);\n loreTest.renderRollCard();\n return;\n }\n}\n\nlet test = await actor.setupSkill(": "attrait du Léviathan.`);\n loreTest.renderRollCard();\n return;\n }\n}\n\nlet Test = await actor.setupSkill(", + ", {\n appendTitle: ` – ${this.effect.name}`,\n skipTargets: true,\n fields: {difficulty:": ", {\n appendTitle: ` – ${this.effet.name}`,\n skipTargets: true,\n fields: {difficulty:", + ");\n loreTest.renderRollCard();\n return;\n }\n}\n\nlet test = await actor.setupSkill('Calme', {\n appendTitle:": ");\n loreTest.renderRollCard();\n return;\n }\n}\n\nlet Test = await actor.setupSkill('Calme', {\n appendTitle:", + ", this.effect.name)\n\nif (characteristics.has(": ", this.effet.name)\n\nif (characteristics.has(", + ", availableChoices);\n\n if (!result) return;\n\n characteristics.add(result);\n}\n\nthis.effect.setFlag(": ", availableChoices);\n\n if (!result) return;\n\n characteristics.add(result);\n}\n\nthis.effet.setFlag(", + ").roll({allowInteractive : false});\nlet regen = regenRoll.total;\n\nif (wounds.value >= wounds.max)\n return\n\nif (wounds.value > 0) \n{\n wounds.value += regen\n if (wounds.value > wounds.max)\n {\n wounds.value = wounds.max\n }\n message += `${this.actor.name} regains ${regen} Wounds.`\n\n if (regen == 10)\n {\n message += `
    Additionally, they regenerate a Critical Wound.`\n }\n}\nelse if (regen >= 8) \n{\n message += `${this.actor.name} rolled a ${regen} and regains 1 Wound.`\n wounds.value += 1\n if (regen == 10)\n {\n message += `
    Additionally, they regenerate a Critical Wound.`\n }\n}\nelse \n{\n message += `${this.actor.name} Régénération roll of ${regen} - No effect.`\n}\n\nawait this.actor.update({": ").roll({allowInteractive : false});\nlet regen = regenRoll.total;\n\nif (Blessures.value >= Blessures.max)\n return\n\nif (Blessures.value > 0) \n{\n Blessures.value += regen\n if (Blessures.value > Blessures.max)\n {\n Blessures.value = Blessures.max\n }\n message += `${this.actor.name} regains ${regen} Blessures.`\n\n if (regen == 10)\n {\n message += `
    Additionally, they regenerate a Critique Wound.`\n }\n}\nelse if (regen >= 8) \n{\n message += `${this.actor.name} rolled a ${regen} and regains 1 Wound.`\n Blessures.value += 1\n if (regen == 10)\n {\n message += `
    Additionally, they regenerate a Critique Wound.`\n }\n}\nelse \n{\n message += `${this.actor.name} Régénération roll of ${regen} - No effet.`\n}\n\nawait this.actor.update({", + ": wounds })\nthis.script.message(message, { whisper: ChatMessage.getWhisperRecipients(": ": Blessures })\nthis.script.message(message, { whisper: ChatMessage.getWhisperRecipients(", + "wounds.value += 1\n if (regen == 10)\n {\n message +=": "Blessures.value += 1\n if (regen == 10)\n {\n message +=", + ",\n value: /^((?!\\().)*$/gm, // Remove all spells with parentheses (all arcane spells spells)\n regex: true\n },\n {\n property :": ",\n value: /^((?!\\().)*$/gm, // Remove tout spells with parentheses (tout arcane spells spells)\n regex: true\n },\n {\n property :", + "+ this.effect.name\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(": "+ this.effet.name\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + "> Critical`;\n \n const test = await this.actor.setupSkill(game.i18n.localize(": "> Critique`;\n \n const Test = await this.actor.setupSkill(game.i18n.localize(", + "), {\n skipTargets: true,\n appendTitle: ` - ${this.effect.name}`,\n fields: {difficulty:": "), {\n skipTargets: true,\n appendTitle: ` - ${this.effet.name}`,\n fields: {difficulty:", + " Critical": " Critique", + "Must provide a Master Rune": "Doit fournir une Rune Maîtresse", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && item.system.master, onError: \"Must provide a Master Rune\"});\n }\n }\n else \n {\n rune = await DragDialog.create({text :": ", title : this.effet.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && item.system.master, onError: \"Doit provide a Master Rune\"});\n }\n }\n else \n {\n rune = await DragDialog.create({text :", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && item.system.master, onError: \"Must provide a Master Rune\"});\n }\n}\nelse \n{\n rune = await DragDialog.create({text :": ", title : this.effet.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && item.system.master, onError: \"Doit provide a Master Rune\"});\n }\n}\nelse \n{\n rune = await DragDialog.create({text :", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && item.system.master, onError: \"Must provide a Master Rune\"});\n}\n\nthis.actor.addEffectItems(rune.uuid, this.effect)\n\nlet talents = this.actor.itemTags.talent.filter(i => i.baseName == this.item.baseName);\nlet xpCost = talents.length * 100\n\nif (this.actor.type == \"character\" && (await foundry.applications.api.DialogV2.confirm({window: {title: this.effect.name}, content:": ", title : this.effet.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && item.system.master, onError: \"Doit provide a Master Rune\"});\n}\n\nthis.actor.addEffectItems(rune.uuid, this.effet)\n\nlet talents = this.actor.itemTags.talent.filter(i => i.baseName == this.item.baseName);\nlet xpCost = talents.length * 100\n\nif (this.actor.type == \"character\" && (await foundry.applications.api.DialogV2.confirm({window: {title: this.effet.name}, content:", + "Must provide a Rune (non-Master)": "Doit fournir une Rune (non-Maîtresse)", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && !item.system.master, onError: \"Must provide a Rune (non-Master)\"});\n }\n }\n else \n {\n rune = await DragDialog.create({text :": ", title : this.effet.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && !item.system.master, onError: \"Doit provide a Rune (non-Master)\"});\n }\n }\n else \n {\n rune = await DragDialog.create({text :", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && !item.system.master, onError: \"Must provide a Rune (non-Master)\"});\n }\n}\nelse \n{\n rune = await DragDialog.create({text :": ", title : this.effet.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && !item.system.master, onError: \"Doit provide a Rune (non-Master)\"});\n }\n}\nelse \n{\n rune = await DragDialog.create({text :", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && !item.system.master, onError: \"Must provide a Rune (non-Master)\"});\n}\n\nthis.actor.addEffectItems(rune.uuid, this.effect)\n\nlet talents = this.actor.itemTags.talent.filter(i => i.baseName == this.item.baseName);\nlet xpCost = talents.length * 100\n\nif (this.actor.type == \"character\" && (await foundry.applications.api.DialogV2.confirm({window: {title: this.effect.name}, content:": ", title : this.effet.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && !item.system.master, onError: \"Doit provide a Rune (non-Master)\"});\n}\n\nthis.actor.addEffectItems(rune.uuid, this.effet)\n\nlet talents = this.actor.itemTags.talent.filter(i => i.baseName == this.item.baseName);\nlet xpCost = talents.length * 100\n\nif (this.actor.type == \"character\" && (await foundry.applications.api.DialogV2.confirm({window: {title: this.effet.name}, content:", + ", title : this.effect.name});\n if (value)\n {\n name = `${name.split(": ", title : this.effet.name});\n if (value)\n {\n name = `${name.split(", + ")[0].trim()} (${value})`\n tests = this.item.system.tests.value.replace(": ")[0].trim()} (${value})`\n Tests = this.item.system.Tests.value.replace(", + "}\n else\n {\n let value = await ValueDialog.create({text : \"Entrez le Groupe d'Étiquette\", title : this.effect.name});\n if (value)\n {\n name =": "}\n else\n {\n let value = await ValueDialog.create({text : \"Entrez le Groupe d'Étiquette\", title : this.effet.name});\n if (value)\n {\n name =", + ");\n}\n\nif (this.actor.items.find(i => i.type === \"extendedTest\" && i.name === this.effect.name)) {\n this.script.message(": ");\n}\n\nif (this.actor.items.find(i => i.type === \"extendedTest\" && i.name === this.effet.name)) {\n this.script.message(", + ");\n\n return;\n}\n\nconst extendedTestData = {\n name: this.effect.name,\n type: \"extendedTest\",\n img: this.effect.img,\n system: {\n SL: {\n current: 0,\n target: target.actor.system.status.wounds.value\n },\n test: {\n value: 'Strength'\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: \"challenging\"\n }\n }\n};\n\nconst extendedTests = await this.actor.createEmbeddedDocuments(\"Item\", [extendedTestData], {fromEffect: this.effect.id});\nconst extendedTest = extendedTests[0];\n\nthis.script.message(": ");\n\n return;\n}\n\nconst extendedTestData = {\n name: this.effet.name,\n type: \"extendedTest\",\n img: this.effet.img,\n system: {\n SL: {\n current: 0,\n target: target.actor.system.status.Blessures.value\n },\n Test: {\n value: 'Strength'\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: \"challenging\"\n }\n }\n};\n\nconst extendedTests = await this.actor.createEmbeddedDocuments(\"Item\", [extendedTestData], {fromEffect: this.effet.id});\nconst extendedTest = extendedTests[0];\n\nthis.script.message(", + ");\n\nlet effect = {\n name: extendedTest.name,\n img: extendedTest.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: extendedTest.name,\n script:": ");\n\nlet effet = {\n name: extendedTest.name,\n img: extendedTest.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: extendedTest.name,\n script:", + ");\n await effect.delete();": ");\n await effet.delete();", + ", {\n skipTargets: true, \n appendTitle: ` — ${this.effect.name}`, \n fields: {\n difficulty:": ", {\n skipTargets: true, \n appendTitle: ` — ${this.effet.name}`, \n fields: {\n difficulty:", + ",\n }\n});\n\nawait test.roll();\nif (test.failure) {\n await this.actor.addCondition(": ",\n }\n});\n\nawait Test.roll();\nif (Test.failure) {\n await this.actor.addCondition(", + "}. Do you want to roll d10?

    \n

    1–6: add +1 SL

    \n

    7–10: lose all accrued SLs and perform next Test at –1 SL

    \n
    \n`;\n const choice = await foundry.applications.api.DialogV2.confirm({\n yes: {label:": "}. Do you want to roll d10?

    \n

    1–6: add +1 SL

    \n

    7–10: lose tout accrued SLs and perform next Test at –1 SL

    \n
    \n`;\n const choice = await foundry.applications.api.DialogV2.confirm({\n yes: {label:", + ");\n await roll.toMessage({flavor: this.effect.name});\n\n if (roll.total >= 7) {\n SL = -1;\n break;\n }\n\n SL++;\n} while (true);\n\nthis.effect.setFlag(": ");\n await roll.toMessage({flavor: this.effet.name});\n\n if (roll.total >= 7) {\n SL = -1;\n break;\n }\n\n SL++;\n} while (true);\n\nthis.effet.setFlag(", + ", { appendTitle: ` - ${this.effect.name}`, fields: { difficulty:": ", { appendTitle: ` - ${this.effet.name}`, fields: { difficulty:", + "} })\nawait test.roll();\n\nif (test.failed) \n{\n let ageAdded = Math.ceil(CONFIG.Dice.randomUniform() * 10) + Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let ws = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let bs = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let s = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let t = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let ag = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let dex = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n\n let currentAge = parseInt(this.actor.system.details.age.value)\n\n let inline = ` parseInt(rating) - SL);\n await this.effect.update({name});\n}\n\nlet rating = parseInt(this.effect.name.match(/\\d+/)?.[0]);\nif (rating <= 1) {\n const scriptData = this.effect.system.scriptData\n scriptData[2].trigger = '';\n await this.effect.update({disabled: true,": "}\n});\n\nawait Test.roll();\nif (Test.succeeded) {\n let SL = parseInt(Test.result.SL);\n let name = this.effet.name.replace(/\\d+/, rating => parseInt(rating) - SL);\n await this.effet.update({name});\n}\n\nlet rating = parseInt(this.effet.name.match(/\\d+/)?.[0]);\nif (rating <= 1) {\n const scriptData = this.effet.system.scriptData\n scriptData[2].trigger = '';\n await this.effet.update({disabled: true,", + ", {appendTitle : ` - ${this.effect.name}`, fields : {difficulty :": ", {appendTitle : ` - ${this.effet.name}`, fields : {difficulty :", + "}});\n\nawait test.roll();\n\nif (test.failed)\n{\n\n if (test.isCriticalFumble ==": "}});\n\nawait Test.roll();\n\nif (Test.Échoué)\n{\n\n if (Test.isCriticalFumble ==", + ", fields : {difficulty : \"difficult\"}});\n\nawait test.roll();\n\nif (test.failed)\n{\n\n if (test.isCriticalFumble == \"fumble\")\n {\n\t return this.script.message(": ", fields : {difficulty : \"difficult\"}});\n\nawait Test.roll();\n\nif (Test.Échoué)\n{\n\n if (Test.isCriticalFumble == \"fumble\")\n {\n\t return this.script.message(", + ");\n loreTest.renderRollCard();\n return;\n } \n}\n\nlet test = await actor.setupSkill('Calme', {\n appendTitle:": ");\n loreTest.renderRollCard();\n return;\n } \n}\n\nlet Test = await actor.setupSkill('Calme', {\n appendTitle:", + ", {skipTargets: true, appendTitle : ` - Used ${this.effect.name}`, fields: { difficulty:": ", {skipTargets: true, appendTitle : ` - Used ${this.effet.name}`, fields: { difficulty:", + "} }).then(async test => {\n await test.roll()\n if (test.failed) \n {\n let toughnessLost = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n this.actor.update({": "} }).then(async Test => {\n await Test.roll()\n if (Test.Échoué) \n {\n let toughnessLost = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n this.actor.update({", + ", fields: { difficulty: \"difficult\" } }).then(async test => {\n await test.roll()\n if (test.failed) \n {\n let toughnessLost = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n this.actor.update({ \"system.characteristics.t.initial\": this.actor.characteristics.t.initial - toughnessLost })\n this.script.message(": ", fields: { difficulty: \"difficult\" } }).then(async Test => {\n await Test.roll()\n if (Test.Échoué) \n {\n let toughnessLost = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n this.actor.update({ \"system.characteristics.t.initial\": this.actor.characteristics.t.initial - toughnessLost })\n this.script.message(", + ": 0\n}\nlet skills = []\nlet skillAdvancements = []\nlet talents = []\nlet trappings = []\nlet items = []\n\nlet updateObj = this.actor.toObject();\n\nfor (let ch in characteristics)\n{\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n}\n\nfor (let index = 0; index < skills.length; index++)\n{\n let skill = skills[index]\n let skillItem;\n skillItem = updateObj.items.find(i => i.name == skill && i.type ==": ": 0\n}\nlet skills = []\nlet skillAdvancements = []\nlet talents = []\nlet trappings = []\nlet items = []\n\nlet updateObj = this.actor.toObject();\n\nfor (let ch in characteristics)\n{\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n}\n\nfor (let index = 0; index < skills.length; index++)\n{\n let Compétence = skills[index]\n let skillItem;\n skillItem = updateObj.items.find(i => i.name == Compétence && i.type ==", + ")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else\n {\n skillItem = await game.wfrp4e.utility.findSkill(skill)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true})\n }\n}\n\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(": ")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else\n {\n skillItem = await game.wfrp4e.utility.findSkill(Compétence)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true})\n }\n}\n\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + "

    \n Select your choice\n

    \n
      \n
    1. Melee (Basic)
    2. \n
    3. Melee (Two-Handed)
    4. \n
    ": "

    \n Sélectionner your choice\n

    \n
      \n
    1. Melee (Basic)
    2. \n
    3. Melee (Two-Handed)
    4. \n
    ", + "Choose Qualities to add": "Choisir Qualities to add", + "Choose Flaws to remove": "Choisir Flaws to remove", + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`})\nawait test.roll();\n\n\nlet opposedResult = test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result\n\nif (opposedResult?.winner ==": ", {skipTargets: true, appendTitle : ` - ${this.effet.name}`})\nawait Test.roll();\n\n\nlet opposedResult = Test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result\n\nif (opposedResult?.winner ==", + "})\nawait test.roll();\n\n\nlet opposedResult = test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result\n\nif (opposedResult?.winner == \"attacker\")\n{\n let spells = this.actor.itemTypes.spell;\n if (spells.length)\n {\n let chosen = spells[Math.floor(CONFIG.Dice.randomUniform() * spells.length)]\n this.script.message(": "})\nawait Test.roll();\n\n\nlet opposedResult = Test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result\n\nif (opposedResult?.winner == \"attacker\")\n{\n let spells = this.actor.itemTypes.spell;\n if (spells.length)\n {\n let chosen = spells[Math.floor(CONFIG.Dice.randomUniform() * spells.length)]\n this.script.message(", + "

    Damage all Items carried?

    ": "

    Damage tout Items carried?

    ", + "Choose Optional Traits": "Choisir Optional Traits", + "You must target exactly one Boat.": "You Doit target exactly one Boat.", + ": []});\n msg += `

    ${item.name} loses all Qualities

    `\n }\n else \n {\n msg += `

    ${item.name} crumbles into dust!

    ` \n await item.update({name : item.name +": ": []});\n msg += `

    ${item.name} loses tout Qualities

    `\n }\n else \n {\n msg += `

    ${item.name} crumbles into dust!

    ` \n await item.update({name : item.name +", + "}});\nawait test.roll();\nCorruptionMessageModel.createCorruptionMessage(": "}});\nawait Test.roll();\nCorruptionMessageModel.createCorruptionMessage(", + ", this.script.getChatData())\n\nif (test.failed)\n{\n this.actor.addCondition(": ", this.script.getChatData())\n\nif (Test.Échoué)\n{\n this.actor.addCondition(", + ")\n\nlet value = hitloc.result\nlet desc = hitloc.description\n\nthis.effect.updateSource({": ")\n\nlet value = hitloc.result\nlet desc = hitloc.description\n\nthis.effet.updateSource({", + "EFFECT.CreatureBackInWater": "Effet.CreatureBackInWater", + "EFFECT.CreatureOutOfWater": "Effet.CreatureOutOfWater", + ": 5\n }\n let items = []\n\n let updateObj = this.actor.toObject();\n\n let talents = (await Promise.all([game.wfrp4e.tables.rollTable(": ": 5\n }\n let items = []\n\n let updateObj = this.actor.toObject();\n\n let talents = (await Promise.tout([game.wfrp4e.tables.rollTable(", + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'challenging';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Métier (Charpentier)';\nconst difficulty = 'challenging';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + "}\n});\n\nawait test.roll();\n\nif (test.failed) {\n args.actor.addCondition(\"poisoned\");\n const speaker = ChatMessage.getSpeaker({actor: args.actor});\n this.script.message(": "}\n});\n\nawait Test.roll();\n\nif (Test.Échoué) {\n args.actor.addCondition(\"poisoned\");\n const speaker = ChatMessage.getSpeaker({actor: args.actor});\n this.script.message(", + ")})\n if (args.test.failed && this.actor.type ==": ")})\n if (args.Test.Échoué && this.actor.type ==", + "Set Liquid Fortification effect duration to 1 hour.": "Set Liquid Fortification effet duration to 1 hour.", + "Reset Liquid Fortification effect duration to 1 hour.": "Reset Liquid Fortification effet duration to 1 hour.", + "Choose Symptoms": "Choisir Symptoms", + "&& args.test.failed && args.test.result.SL <= -3)\n{\n this.script.notification(": "&& args.Test.Échoué && args.Test.result.SL <= -3)\n{\n this.script.notification(", + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`})\nawait test.roll();\nif (test.succeeded)\n{\n this.script.message(": ", {skipTargets: true, appendTitle : ` - ${this.effet.name}`})\nawait Test.roll();\nif (Test.succeeded)\n{\n this.script.message(", + "This Actor does not know any runes.": "This Actor does not know tout runes.", + ") return;\n\nconst SL = args.opposedTest.data.opposeResult.differenceSL;\n\nconst targetId = this.effect.getFlag(": ") return;\n\nconst SL = args.opposedTest.data.opposeResult.differenceSL;\n\nconst targetId = this.effet.getFlag(", + ");\n return await this.effect.delete();\n}\n\nif (SL > 0) {\n args.opposedTest.data.opposeResult.other.push(": ");\n return await this.effet.delete();\n}\n\nif (SL > 0) {\n args.opposedTest.data.opposeResult.other.push(", + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'difficult';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Métier (Charpentier)';\nconst difficulty = 'difficult';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + "All Effects have been used. Reset to select them again": "Tout Effects have been used. Reset to Sélectionner them again", + "Choose Power to Gain": "Choisir Power to Gain", + ";\nconst test = 'Trade (Carpentry)';\nconst difficulty = 'easy';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Trade (Carpentry)';\nconst difficulty = 'easy';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ";\nconst test = 'Voile';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Voile';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ";\nconst test = 'Trade (Carpentry)';\nconst difficulty = 'hard';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Trade (Carpentry)';\nconst difficulty = 'hard';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ";\nconst test = 'Voile';\nconst difficulty = 'average';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Voile';\nconst difficulty = 'average';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ";\nconst test = 'Métier (Ingénieur)';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Métier (Ingénieur)';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'difficult';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Métier (Charpentier)';\nconst difficulty = 'difficult';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'hard';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Métier (Charpentier)';\nconst difficulty = 'hard';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ";\nconst test = 'Strength';\nconst difficulty = 'average';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Strength';\nconst difficulty = 'average';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, context: { failure:": ", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, context: { failure:", + "}\n});\n\nawait test.roll();\n\nif (test.failed) {\n const SL = Number(test.result.SL);\n this.script.message(": "}\n});\n\nawait Test.roll();\n\nif (Test.Échoué) {\n const SL = Number(Test.result.SL);\n this.script.message(", + ": locations})\nthis.effect.updateSource({": ": locations})\nthis.effet.updateSource({", + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'challenging';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Métier (Charpentier)';\nconst difficulty = 'challenging';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + "s name\nawait effect.update({\n name,\n \"system.scriptData\": scriptData\n});\n\n\n// update Trait": "s name\nawait effet.update({\n name,\n \"system.scriptData\": scriptData\n});\n\n\n// update Trait", + ";\nconst test = 'Trade (Tailor)';\nconst difficulty = 'difficult';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Trade (Tailor)';\nconst difficulty = 'difficult';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + "]\n }\n]\n\nlet arcane = await ItemDialog.createFromFilters(filters, 12, {title : this.effect.name, text :": "]\n }\n]\n\nlet arcane = await ItemDialog.createFromFilters(filters, 12, {title : this.effet.name, text :", + ";\nconst test = 'Trade (Carpentry)';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Trade (Carpentry)';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ";\nconst test = 'Trade (Carpentry)';\nconst difficulty = 'difficult';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Trade (Carpentry)';\nconst difficulty = 'difficult';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + "}})\nawait test.roll();\n\nif (!test.succeeded)\n{\n\tthis.actor.addCondition(": "}})\nawait Test.roll();\n\nif (!Test.succeeded)\n{\n\tthis.actor.addCondition(", + "}});\nawait test.roll();\n\nif (test.failed)\n{\n await this.actor.addCondition(": "}});\nawait Test.roll();\n\nif (Test.Échoué)\n{\n await this.actor.addCondition(", + ";\nconst test = 'Strength';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Strength';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + "; // Put path to token image here, inbetween the quotation marks\nif (tokenImg)\n{\n if (this.effect.getFlag(": "; // Put path to token image here, inbetween the quotation marks\nif (tokenImg)\n{\n if (this.effet.getFlag(", + ";\n\t\t\targs.test.result.description =": ";\n\t\t\targs.Test.result.description =", + "}\n\t\targs.test.result.outcome =": "}\n\t\targs.Test.result.outcome =", + "Failed Trade (Engineering)": "Échoué Trade (Engineering)", + ";\nconst test = 'Trade (Tailor)';\nconst difficulty = 'easy';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Trade (Tailor)';\nconst difficulty = 'easy';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ") \n{\n if (args.test.failed)\n {\n let item = await fromUuid(": ") \n{\n if (args.Test.Échoué)\n {\n let item = await fromUuid(", + ";\nconst test = 'Trade (Carpentry)';\nconst difficulty = 'challenging';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Trade (Carpentry)';\nconst difficulty = 'challenging';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'difficult';\nconst target = 50;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Métier (Charpentier)';\nconst difficulty = 'difficult';\nconst target = 50;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ") \n{\n if (args.test.failed)\n {\n this.actor.createEmbeddedDocuments(": ") \n{\n if (args.Test.Échoué)\n {\n this.actor.createEmbeddedDocuments(", + "]])\n this.script.message(`Willpower Test failed, ${this.actor.prototypeToken.name} gains @Condition[Malaise] for [[1d10]] hours`, {whisper: ChatMessage.getWhisperRecipients(": "]])\n this.script.message(`Willpower Test Échoué, ${this.actor.prototypeToken.name} gains @Condition[Malaise] for [[1d10]] hours`, {whisper: ChatMessage.getWhisperRecipients(", + "}\n \n args.test.result.other.push (": "}\n \n args.Test.result.other.push (", + ";\nconst test = 'Trade (Tailor)';\nconst difficulty = 'easy';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Trade (Tailor)';\nconst difficulty = 'easy';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ").map(i => `max(0, 1d10 - ${this.actor.system.characteristics.fel.bonus})`)\n\nlet test = new Roll(`${rolls.join(": ").map(i => `max(0, 1d10 - ${this.actor.system.characteristics.fel.bonus})`)\n\nlet Test = new Roll(`${rolls.join(", + ")\n\nlet test = new Roll(": ")\n\nlet Test = new Roll(", + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: { difficulty:": ", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, fields: { difficulty:", + "} }).then(async test => {\n await test.roll();\n if (test.failed) \n {\n await args.actor.addCondition(": "} }).then(async Test => {\n await Test.roll();\n if (Test.Échoué) \n {\n await args.actor.addCondition(", + "}})\nawait test.roll();\nif (test.failed)\n{\n let roll = await new Roll(": "}})\nawait Test.roll();\nif (Test.Échoué)\n{\n let roll = await new Roll(", + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'challenging';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Métier (Charpentier)';\nconst difficulty = 'challenging';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + "

    Does the vessel have a magazine or any other kind of store for blackpowder?

    ": "

    Does the vessel have a magazine or tout other kind of store for blackpowder?

    ", + ";\nconst test = 'Voile';\nconst difficulty = 'challenging';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Voile';\nconst difficulty = 'challenging';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'easy';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:": ";\nconst Test = 'Métier (Charpentier)';\nconst difficulty = 'easy';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n Test: {\n value: Test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + "this.script.message(msg)\n\nlet test = await this.actor.setupSkill(\"Résistance\", {fields : {difficulty : \"difficult\"}, appendTitle :": "this.script.message(msg)\n\nlet Test = await this.actor.setupSkill(\"Résistance\", {fields : {difficulty : \"difficult\"}, appendTitle :", + "Choose Location": "Choisir Location", + "Hatred (All enemies)": "Hatred (Tout enemies)", + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`});\nawait test.roll();\nif (test.failed)\n{\n this.actor.addCondition(": ", {skipTargets: true, appendTitle : ` - ${this.effet.name}`});\nawait Test.roll();\nif (Test.Échoué)\n{\n this.actor.addCondition(", + ")\n this.actor.modifyWounds(-1 * value)\n await this.item.system.toggleEquip();\n args.test.addSL(value);\n args.test.preData.other.push(": ")\n this.actor.modifyWounds(-1 * value)\n await this.item.system.toggleEquip();\n args.Test.addSL(value);\n args.Test.preData.other.push(", + "

    This Talent also extends to any metal object because of Metallic Affinity

    ": "

    This Talent also extends to tout metal object because of Metallic Affinity

    ", + "Halve Damage? (Halves all damage other than fire, cold, and magic)": "Halve Damage? (Halves tout damage other than fire, cold, and magic)", + "Choose Limb": "Choisir Limb", + "Effect Used": "Effet Used", + "must make a Willpower Test or fall @Condition[Prone].": "Doit make a Willpower Test or fall @Condition[Prone].", + "Cannot remove Blinded condition.": "Impossible de remove Blinded condition.", + "Removed Fatigued": "Retiré Fatigued", + "})\nawait test.roll();\n\nif (test.failed) {\n \tthis.script.scriptMessage(await this.actor.applyBasicDamage(20, {suppressMsg: true}));\n this.script.scriptMessage(": "})\nawait Test.roll();\n\nif (Test.Échoué) {\n \tthis.script.scriptMessage(await this.actor.applyBasicDamage(20, {suppressMsg: true}));\n this.script.scriptMessage(", + "Cannot move or act this Turn": "Impossible de move or act this Turn", + "Select Wind": "Sélectionner Wind", + ")\n bleeding.delete(); \n}\nelse \n{\n this.script.notification(": ")\n Saignement.delete(); \n}\nelse \n{\n this.script.notification(", + "Choose a Skill": "Choisir a Compétence", + ") \n{\n if (args.test.failed)\n {\n this.actor.addSystemEffect(": ") \n{\n if (args.Test.Échoué)\n {\n this.actor.addSystemEffect(", + ",\n}\n\nlet test = await args.actor.setupSkill(": ",\n}\n\nlet Test = await args.actor.setupSkill(", + "Cannot be Surprised": "Impossible de be Surprised", + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`})\nawait test.roll();\nif (test.failed)\n{\n this.script.message(await game.wfrp4e.tables.formatChatRoll(": ", {skipTargets: true, appendTitle : ` - ${this.effet.name}`})\nawait Test.roll();\nif (Test.Échoué)\n{\n this.script.message(await game.wfrp4e.tables.formatChatRoll(", + "}, skipTargets: true, appendTitle : ` - ${this.effect.name}`})\nawait test.roll();\nif (test.failed)\n{\n\tlet stuns = Math.max(1, Math.abs(test.result.SL))\n\tthis.actor.addCondition(": "}, skipTargets: true, appendTitle : ` - ${this.effet.name}`})\nawait Test.roll();\nif (Test.Échoué)\n{\n\tlet stuns = Math.max(1, Math.abs(Test.result.SL))\n\tthis.actor.addCondition(", + ")\n}\nelse \n{\n\tlet points = this.effect.sourceTest.result.overcast.usage.other.current;\n\tthis.actor.update({\"system.status.corruption.value\" : this.actor.system.status.corruption.value - points})\n\tthis.script.message(": ")\n}\nelse \n{\n\tlet points = this.effet.sourceTest.result.overcast.usage.other.current;\n\tthis.actor.update({\"system.status.corruption.value\" : this.actor.system.status.corruption.value - points})\n\tthis.script.message(", + "})\nawait test.roll();\nif (test.failed)\n{\n\n let myRoll = await new Roll(\"1d10\").roll({allowInteractive : false});\n let duration = myRoll.total\n this.actor.addSystemEffect(\"nausea\");\n this.script.scriptMessage(": "})\nawait Test.roll();\nif (Test.Échoué)\n{\n\n let myRoll = await new Roll(\"1d10\").roll({allowInteractive : false});\n let duration = myRoll.total\n this.actor.addSystemEffect(\"nausea\");\n this.script.scriptMessage(", + "Choose the Critical Wounds to heal (cannot reattach body parts)": "Choisir the Critique Blessures to heal (Impossible de reattach body parts)", + "Choose Taille": "Choisir Taille", + "Cannot attack targets that are not Entangled": "Impossible de attack targets that are not Entangled", + ").pop())\n\n if (ones == 0) {\n ones = 10;\n }\n\n if (ones > SL) {\n args.test.data.result.SL =": ").pop())\n\n if (ones == 0) {\n ones = 10;\n }\n\n if (ones > SL) {\n args.Test.data.result.SL =", + "Gained 2 Bleeding Conditions": "Gained 2 Saignement Conditions", + "Choose a Disease": "Choisir a Disease", + "});\nawait test.roll();\nif (test.failed)\n{\n\tawait this.actor.addCondition(\"blinded\");\n}\n\nlet msg =": "});\nawait Test.roll();\nif (Test.Échoué)\n{\n\tawait this.actor.addCondition(\"blinded\");\n}\n\nlet msg =", + ")\n }\n else if (this.actor.characteristics.int.bonus + Number(args.test.result.SL) < 0)\n {\n args.test.result.other.push(": ")\n }\n else if (this.actor.characteristics.int.bonus + Number(args.Test.result.SL) < 0)\n {\n args.Test.result.other.push(", + "});\nawait test.roll();\n\nif (test.failed) {\n this.actor.addCondition('stunned');\n}\n\nthis.script.scriptNotification(": "});\nawait Test.roll();\n\nif (Test.Échoué) {\n this.actor.addCondition('stunned');\n}\n\nthis.script.scriptNotification(", + "Added Fatigued": "Ajouté Fatigued", + "t use this.effect because it thinks it": "t use this.effet because it thinks it", + "Halve Damage? (Halves Damage from all fire)": "Halve Damage? (Halves Damage from tout fire)", + "Can only be applied to River Troll.": "Can only be Appliqué to River Troll.", + "+ parseInt(this.effect.sourceTest.result.SL)": "+ parseInt(this.effet.sourceTest.result.SL)", + ")\nthis.item.setFlag(\"wfrp4e\", \"uses\", uses);\nif (uses >= 3)\n{\n\tthis.effect.update({\"system.transferData.type\" : \"other\"})\n\tthis.script.notification(": ")\nthis.item.setFlag(\"wfrp4e\", \"uses\", uses);\nif (uses >= 3)\n{\n\tthis.effet.update({\"system.transferData.type\" : \"other\"})\n\tthis.script.notification(", + "Wounds Healed": "Blessures Healed", + "Choose a Weapon": "Choisir a Weapon", + "ambre\";\n amberTalons.img = this.effect.img;\n amberTalons.system.damage.value = \"SB + WPB\"\n amberTalons.system.equipped = true;\n amberTalons.system.qualities.value.push({name : \"magical\"})\n amberTalons.effects.push({\n name : \"Serres d": "ambre\";\n amberTalons.img = this.effet.img;\n amberTalons.system.damage.value = \"SB + WPB\"\n amberTalons.system.equipped = true;\n amberTalons.system.qualities.value.push({name : \"magical\"})\n amberTalons.effects.push({\n name : \"Serres d", + ")\n args.test.preData.reversal = {allowed: true, if:": ")\n args.Test.preData.reversal = {allowed: true, if:", + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty :": ", {skipTargets: true, appendTitle : ` - ${this.effet.name}`, fields : {difficulty :", + "}});\nawait test.roll();\nif (test.failed)\n{\n\tawait this.actor.addCondition(\"blinded\");\n}\n\nlet msg =": "}});\nawait Test.roll();\nif (Test.Échoué)\n{\n\tawait this.actor.addCondition(\"blinded\");\n}\n\nlet msg =", + "Can roll on the @Table[crithead]{Head Critical Hits} instead of the normal hit location": "Can roll on the @Table[crithead]{Head Critique Hits} instead of the normal hit location", + "hast)\",\n diff : {\n system : {\n advances : {\n value : 20\n }\n }\n }\n }\n]\n\nlet choice3 = [\n {\n type : \"skill\",\n name : \"Mêlée (Deux mains)\",\n diff : {\n system : {\n advances : {\n value : 20\n }\n }\n }\n }\n]\n\nlet choice = await foundry.applications.api.DialogV2.wait({\n window : {title : \"Choix\"},\n content :\n `

    \n Sélectionnez votre choix\n

    \n
      \n
    1. Mêlée (Base)
    2. \n
    3. Mêlée (Arme d": "hast)\",\n diff : {\n system : {\n advances : {\n value : 20\n }\n }\n }\n }\n]\n\nlet choice3 = [\n {\n type : \"Compétence\",\n name : \"Mêlée (Deux mains)\",\n diff : {\n system : {\n advances : {\n value : 20\n }\n }\n }\n }\n]\n\nlet choice = await foundry.applications.api.DialogV2.wait({\n window : {title : \"Choix\"},\n content :\n `

      \n Sélectionnez votre choix\n

      \n
        \n
      1. Mêlée (Base)
      2. \n
      3. Mêlée (Arme d", + "Rune of Goblin Bane: Impact Added": "Rune of Goblin Bane: Impact Ajouté", + "Enter Grim value": "Entrer Grim value", + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`})\nawait test.roll();\n\n// Kind of insane but whatever\nlet opposedResult = test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result\n\nreturn opposedResult?.winner ==": ", {skipTargets: true, appendTitle : ` - ${this.effet.name}`})\nawait Test.roll();\n\n// Kind of insane but whatever\nlet opposedResult = Test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result\n\nreturn opposedResult?.winner ==", + "Cannot suffer Critical Wounds": "Impossible de suffer Critique Blessures", + "Rolled and applied mutations": "Rolled and Appliqué mutations", + ")\n }\n else if (this.actor.characteristics.int.bonus + Number(args.test.result.SL) < 0)\n {\n args.test.result.other.push(": ")\n }\n else if (this.actor.characteristics.int.bonus + Number(args.Test.result.SL) < 0)\n {\n args.Test.result.other.push(", + ").pop())\n\n if (ones > SL) {\n args.test.data.result.SL =": ").pop())\n\n if (ones > SL) {\n args.Test.data.result.SL =", + "Cannot be surprised": "Impossible de be surprised", + "Removed 1 Bleeding Condition": "Retiré 1 Saignement Condition", + "}, skipTargets: true, appendTitle : \" - \" + this.effect.name, fields : {difficulty : \"average\"}})\nawait test.roll();\n\n\nif (location && test.failed)\n{\n let dropped = this.item.system.weaponsAtLocation;\n\n if (dropped.length)\n {\n this.script.notification(": "}, skipTargets: true, appendTitle : \" - \" + this.effet.name, fields : {difficulty : \"average\"}})\nawait Test.roll();\n\n\nif (location && Test.Échoué)\n{\n let dropped = this.item.system.weaponsAtLocation;\n\n if (dropped.length)\n {\n this.script.notification(", + ").pop())\n\n if (ones == 0) {\n ones = 10;\n }\n\n\n if (ones > SL) {\n args.test.data.result.SL =": ").pop())\n\n if (ones == 0) {\n ones = 10;\n }\n\n\n if (ones > SL) {\n args.Test.data.result.SL =", + ", fields : {difficulty : \"difficult\", slBonus : -1 * this.effect.sourceTest.result.SL}})\nawait test.roll();\nif (test.succeeded)\n{\n\tthis.script.notification(": ", fields : {difficulty : \"difficult\", slBonus : -1 * this.effet.sourceTest.result.SL}})\nawait Test.roll();\nif (Test.succeeded)\n{\n\tthis.script.notification(", + "Target has higher Willpower, no effect": "Target has higher Willpower, no effet", + "Choose a disease to heal (must be naturally occuring)": "Choisir a disease to heal (Doit be naturally occuring)", + "|| this.item.getFlag(": "|| this.item.getFlag(", + "Removed Broken": "Condition Brisé supprimée", + "Does not need to make Peur or Terror tests": "N'a pas besoin de faire de tests de Peur ou de Terreur", + ",\"info\")\n}\n\nconst runesOfRestoration = this.item.effects.contents.filter(e => e.name == this.effect.name)\nconst restorationWounds = parseInt(runesOfRestoration.length * this.actor.system.characteristics.t.bonus)\n\nthis.actor.modifyWounds(restorationWounds)\nthis.script.message(": ",\"info\")\n}\n\nconst runesOfRestoration = this.item.effects.contents.filter(e => e.name == this.effet.name)\nconst restorationWounds = parseInt(runesOfRestoration.length * this.actor.system.characteristics.t.bonus)\n\nthis.actor.modifyWounds(restorationWounds)\nthis.script.message(", + "Automatically passes any": "Réussit automatiquement tout" +} \ No newline at end of file diff --git a/tools/english-texts-found.json b/tools/english-texts-found.json new file mode 100644 index 0000000..6ebb5b8 --- /dev/null +++ b/tools/english-texts-found.json @@ -0,0 +1,2675 @@ +[ + { + "file": "KGK9vL1Yl0qmCeCN.js", + "count": 12, + "strings": [ + "Choose Training", + ").map(i => {\n return {\n id : i.toLowerCase(),\n name : i\n }\n });\n}\n\nif (choice.length)\n{\n let changes = foundry.utils.deepClone(this.effect.changes);\n\n for(let training of choice)\n {\n switch(training.id)\n {\n case", + ": \n let roll = await new Roll(", + ").roll({allowInteractive : false}); \n roll.toMessage(this.script.getChatData());\n changes.push({value : roll.total, mode : 2, key :", + "})\n\n if (this.actor.type ==", + ")\n {\n let bestial = this.actor.itemTypes.trait.find(i => i.name ==", + ");\n if (bestial)\n {\n bestial.update({", + ");\n await this.actor.createEmbeddedDocuments(", + ", [territorial], {fromEffect: this.effect.id})\n foundry.utils.setProperty(args,", + "})\n break;\n }\n }\n this.effect.updateSource({name : `${this.effect.name} (${choice.map(i => i.name).join(", + ": choice.map(i => i.id)})\n this.item.updateSource({", + ", changes, \"flags.wfrp4e.trained\" : choice.map(i => i.id)})\n this.item.updateSource({\"system.specification.value\" :" + ] + }, + { + "file": "5XAYjiq1i4M7Ky7j.js", + "count": 9, + "strings": [ + ";\n\n let wounds = foundry.utils.duplicate(this.actor.status.wounds);\n let regenRoll = await new Roll(", + ").roll({allowInteractive : false});\n let regen = regenRoll.total;\n\n if (wounds.value >= wounds.max)\n return;\n\n if (wounds.value > 0) {\n wounds.value += Math.floor(regen / 2);\n if (wounds.value > wounds.max) {\n wounds.value = wounds.max;\n }\n message += \\`\\${this.actor.name} regagne \\${regen} Blessures.\\`;\n\n if (regen === 10) {\n message +=", + ";\n }\n } else if (regen >= 8) {\n message += \\`\\${this.actor.name} a obtenu un \\${regen} et regagne 1 Blessure.\\`;\n wounds.value += 1;\n if (regen === 10) {\n message +=", + ";\n }\n } else {\n message += \\`\\${this.actor.name} Résultat de régénération de \\${regen} - Aucun effet.\\`;\n }\n\n await this.actor.update({", + ": wounds});\n this.script.message(message, {whisper: ChatMessage.getWhisperRecipients(", + ")});\n`\n\nawait effect.update({\n name,", + ";\n\n if (regen === 10) {\n message += \"
        De plus, il régénère une Blessure Critique.\";\n }\n } else if (regen >= 8) {\n message += \\", + ";\n wounds.value += 1;\n if (regen === 10) {\n message += \"
        De plus, il régénère une Blessure Critique.\";\n }\n } else {\n message += \\", + ";\n }\n\n await this.actor.update({\"system.status.wounds\": wounds});\n this.script.message(message, {whisper: ChatMessage.getWhisperRecipients(\"GM\")});" + ] + }, + { + "file": "sx7Ikn8WW00gBFb4.js", + "count": 8, + "strings": [ + ")\n{\n\tthis.script.notification(", + ")\n}\nelse if (location ==", + ")\n}\n\nthis.effect.updateSource({", + ": location});\n\nif (location)\n{\n let dropped = this.actor.itemTypes.weapon.filter(i => i.isEquipped & i.system.usesHands.includes(location));\n\n if (dropped.length)\n {\n this.script.notification(`Dropped ${dropped.map(i => i.name).join(", + ")}!`)\n for(let weapon of dropped)\n {\n await weapon.system.toggleEquip();\n }\n }\n}\n\nlet roll = await new Roll(", + ").roll()\n\nroll.toMessage(this.script.getChatData({flavor : `Dropped ${dropped.map(i => i.name).join(", + ")}!`}));\n\nthis.effect.updateSource({", + ")\n for(let weapon of dropped)\n {\n await weapon.system.toggleEquip();\n }\n }\n}\n\nlet roll = await new Roll(\"1d10\").roll()\n\nroll.toMessage(this.script.getChatData({flavor :" + ] + }, + { + "file": "tCIT1a12Gt6k2ohA.js", + "count": 8, + "strings": [ + ") && !this.item.name.toLowerCase().includes(", + "))\n{\n\tresistance = this.item.parenthesesText\n}\nelse \n{\n resistance = await ValueDialog.create({text :", + "}) \n \n if (resistance)\n {\n this.item.updateSource({name : `${this.item.name.split(", + ")[0].trim()} (${resistance})`})\n this.effect.updateSource({name : this.effect.name + ` (${resistance})`})\n }\n} \nthis.item.updateSource({", + ": this.item.system.tests.value.replace(", + ", resistance)})\n\nif (resistance && !this.effect.name.includes(", + "})\n this.effect.updateSource({name : this.effect.name +", + "})\n }\n} \nthis.item.updateSource({\"system.tests.value\" : this.item.system.tests.value.replace(\"the associated Threat\", resistance)})\n\nif (resistance && !this.effect.name.includes(\"(\"))\n{\n this.effect.updateSource({name : this.effect.name +=" + ] + }, + { + "file": "yCgH3N9AurIiAv0i.js", + "count": 8, + "strings": [ + ") || this.item.system.tests.value.includes(", + ") || this.item.system.tests.value.toLowerCase().includes(", + "))\n{\n let tests = this.item.system.tests.value\n let name = this.item.name\n\n // If name already specifies, make sure tests value reflects that\n if (name.includes(", + ")[0].trim()} (${sense})`;\n }\n else // If no sense specified, provide dialog choice\n {\n let choice = await ItemDialog.create(ItemDialog.objectToArray({\n taste :", + "}, this.item.img), 1, {title : this.item.name, text :", + "});\n if (choice[0])\n {\n name = `${name.split(", + ")[0].trim()} (${choice[0].name})`\n }\n }\n\n this.item.updateSource({name,", + ";\n }\n else // If no sense specified, provide dialog choice\n {\n let choice = await ItemDialog.create(ItemDialog.objectToArray({\n taste : \"Taste\",\n sight : \"Sight\",\n smell : \"Smell\",\n hearing : \"Hearing\",\n touch : \"Touch\"\n }, this.item.img), 1, {title : this.item.name, text : \"Choisissez un Sens\"});\n if (choice[0])\n {\n name =" + ] + }, + { + "file": "190PHSHKGaJ74wsR.js", + "count": 7, + "strings": [ + ") || this.item.system.tests.value.includes(", + ") || this.item.system.tests.value.toLowerCase().includes(", + "))\n{\n let tests = this.item.system.tests.value\n let name = this.item.name\n\n // If name already specifies, make sure tests value reflects that\n if (name.includes(", + ", terrain)\n }\n else // If no sense specified, provide dialog choice\n {\n let choice = await ItemDialog.create(ItemDialog.objectToArray({\n coastal :", + "}, this.item.img), 1,", + ");\n if (choice[0])\n {\n name = `${name.split(", + ")\n }\n }\n\n this.effect.updateSource({name})\n this.item.updateSource({name," + ] + }, + { + "file": "H06Ysj7oPiemW7S6.js", + "count": 7, + "strings": [ + "}[currentCareer.system.level.value] // b, s, or g maps to 2d10, 1d10, or 1 respectively (takes the first letter)\n let term = {1 :", + "}[currentCareer.system.level.value] // b, s, or g maps to 2d10, 1d10, or 1 respectively (takes the first letter)\n let dieAmount = {1 :", + "}[currentCareer.system.level.value] // b, s, or g maps to 2d10, 1d10, or 1 respectively (takes the first letter)\n dieAmount = parseInt(dieAmount[0]) * this.item.system.Advances; // Multilpy that first letter by your standing (Brass 4 = 8d10 pennies)\n if (coin !=", + ") // Don't roll for gold, just use standing value\n {\n dieAmount = dieAmount +", + ";\n }\n let moneyEarned = (await new Roll(dieAmount.toString()).roll()).total;\n let moneyString = `${moneyEarned}${coin}`\n let transactionString = `${moneyEarned}${term}`\n\n this.script.message(`
        Earned an additional ${game.wfrp4e.market.amountToString(game.wfrp4e.market.parseMoneyTransactionString(transactionString))}`, {whisper : ChatMessage.getWhisperRecipients(", + "this.script.message(" + ] + }, + { + "file": "V9zm2hKUVLVZtAcN.js", + "count": 7, + "strings": [ + "Forêt d'épines", + "}`).trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + "épines\"];\n\nlet updateObj = this.actor.toObject();\n\nfor (let ch in characteristics)\n{\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n}\n\nfor (let index = 0; index < skills.length; index++)\n{\n let skill = skills[index]\n let skillItem;\n skillItem = updateObj.items.find(i => i.name == skill && i.type == \"skill\")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else \n {\n skillItem = await game.wfrp4e.utility.findSkill(skill)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else \n {\n ui.notifications.warn(`Could not find ${talent}`, {permanent : true})\n }\n}\n\nconst traitRegex = /(?:,?(.+?)(\\+?\\d{1,2}\\+?)?\\s*?(?:\\((.+?)\\)\\s*(\\+?\\d{1,2})?|,|$))/gm\nfor (let trait of traits)\n{\n let traitMatches = trait.matchAll(traitRegex).next().value\n let traitName = traitMatches[1]\n let traitVal = traitMatches[2] || traitMatches[4] // could be match 2 or 4 depending on if there", + ").trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(", + ", {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(", + ", {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +='Arme','Cornes','Tail','Tentacules','Morsure') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal;\n traitItem.name = (traitItem.name +" + ] + }, + { + "file": "bNhpJPWwoHLq68zD.js", + "count": 7, + "strings": [ + "Skipping Tests to apply the tattoos", + "

        Apply Ward of Grimnir effect?

        ", + "No Lore (Theology) skill found, cannot pass.", + "No Lore (Runes) skill found, cannot pass.", + "One or more Tests to apply the tattoos failed.", + ", fields : {difficulty : \"vhard\"}})\n await test.roll();\n if (test.failed)\n {\n failed = true;\n }\n}\nelse \n{\n this.script.notification(\"No Lore (Theology) skill found, cannot pass.\")\n failed = true;\n}\n\nif (this.actor.itemTags.skill.find(i => i.name == \"Lore (Runes)\"))\n {\n let test = await this.actor.setupSkill(\"Lore (Runes)\", {appendTitle :", + ", fields : {difficulty : \"hard\"}})\n await test.roll();\n if (test.failed)\n {\n failed = true;\n }\n }\n else \n {\n this.script.notification(\"No Lore (Runes) skill found, cannot pass.\")\n failed = true;\n }\n\n\n let test = await this.actor.setupSkill(\"Art (Tattooing)\", {appendTitle :" + ] + }, + { + "file": "IupskvzvoGyD2H5o.js", + "count": 6, + "strings": [ + ")\n let configBlessings = await Promise.all((game.wfrp4e.config.godBlessings[god.toLowerCase()] || []).map(fromUuid));\n if (god ==", + "})\n }\n if (configBlessings.length)\n {\n // Combine blessings defined by config with actual blessing items found that specify this god, avoiding duplicates\n blessings = blessings.concat(\n configBlessings.map(i => {return {uuid : i.uuid, name : i.name}})\n .filter(bls => !(blessings.find(i => i.uuid == bls.uuid)))\n );\n }\n if (blessings.length)\n {\n this.script.scriptNotification(", + "))\n await this.actor.addEffectItems(blessings.map(i => i.uuid), this.effect)\n }\n else\n {\n this.script.scriptNotification(`Impossible de trouver des Bénédictions associées à ${god}.`)\n }\n if (this.item.name.includes(", + "))\n this.item.updateSource({name: this.item.name.replace(", + ", god)});\n else\n this.item.updateSource({name: this.item.name + ` (${god})`});\n await this.actor.update({", + ")\n }\n if (this.item.name.includes(\"Au choix\"))\n this.item.updateSource({name: this.item.name.replace(\"Au choix\", god)});\n else\n this.item.updateSource({name: this.item.name +" + ] + }, + { + "file": "cUnbADgOQ4fMKgrH.js", + "count": 6, + "strings": [ + "))\n{\n\tgroup = this.item.parenthesesText\n}\n\nelse \n{\n\tgroup = await ValueDialog.create({text :", + "})\n\n\tthis.item.updateSource({name : this.item.name + ` (${group})`,", + ": this.item.system.tests.value.replace(", + ", group)})\n\tthis.effect.updateSource({name : this.effect.name + ` (${group})`})\n}\n\n\ndata.name = data.name.replace(", + ", group);\nawait this.actor.createEmbeddedDocuments(", + ", \"system.tests.value\" : this.item.system.tests.value.replace(\"Group\", group)})\n\tthis.effect.updateSource({name : this.effect.name +" + ] + }, + { + "file": "h766UvswLCsxcMow.js", + "count": 6, + "strings": [ + "}`).trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + "s a specialization\n let traitSpec = traitMatches[3]\n\n let traitItem;\n try {\n traitItem = await WFRP_Utility.findItem(traitName, \"trait\")\n }\n catch { }\n if (!traitItem) {\n ui.notifications.warn(`Impossible de trouver ${trait}`, {permanent : true})\n }\n traitItem = traitItem.toObject()\n\n if (Number.isNumeric(traitVal))\n {\n traitItem.system.specification.value = traitName.includes(", + ", {permanent : true})\n }\n traitItem = traitItem.toObject()\n\n if (Number.isNumeric(traitVal))\n {\n traitItem.system.specification.value = traitName.includes('Arme','Cornes','Tail','Tentacules','Morsure') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal;\n traitItem.name = (traitItem.name +", + ").trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(", + ", {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "lII4KMRblqwFBlsV.js", + "count": 6, + "strings": [ + "}`).trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + "s a specialization\n let traitSpec = traitMatches[3]\n\n let traitItem;\n try {\n traitItem = await WFRP_Utility.findItem(traitName, \"trait\")\n }\n catch { }\n if (!traitItem) {\n ui.notifications.warn(`Impossible de trouver ${trait}`, {permanent : true})\n }\n traitItem = traitItem.toObject()\n\n if (Number.isNumeric(traitVal))\n {\n traitItem.system.specification.value = traitName.includes(", + ", {permanent : true})\n }\n traitItem = traitItem.toObject()\n\n if (Number.isNumeric(traitVal))\n {\n traitItem.system.specification.value = traitName.includes('Arme','Cornes','Tail','Tentacules','Morsure') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal;\n traitItem.name = (traitItem.name +", + ").trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(", + ", {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "6qJP0hpShEM43ohx.js", + "count": 5, + "strings": [ + "attrait du Léviathan.`);\n loreTest.renderRollCard();\n return;\n }\n}\n\nlet test = await actor.setupSkill(", + ", {\n appendTitle: ` – ${this.effect.name}`,\n skipTargets: true,\n fields: {difficulty:", + ",\n skipTargets: true,\n fields: {difficulty: 'hard'},\n characteristic: 'int',\n });\n await loreTest.roll();\n\n if (loreTest.succeeded) {\n loreTest.result.other.push(", + ");\n loreTest.renderRollCard();\n return;\n }\n}\n\nlet test = await actor.setupSkill('Calme', {\n appendTitle:", + ",\n skipTargets: true,\n fields: {difficulty: 'easy'},\n characteristic: 'wp',\n});\nawait test.roll();\n\nif (!test.succeeded) {\n test.result.other.push(" + ] + }, + { + "file": "Fu8DTvSgLufcB5mr.js", + "count": 5, + "strings": [ + "; break;\n default: continue;\n }\n\n if (characteristics.has(characteristic)) {\n await rollTable(characteristics,", + ", name);\n } else {\n characteristics.add(characteristic);\n }\n }\n}\n\nconst characteristics = new Set();\nawait rollTable(characteristics,", + ", this.effect.name)\n\nif (characteristics.has(", + ");\n const availableChoices = foundry.utils.duplicate(game.wfrp4e.config.characteristics);\n\n for (const ch of characteristics) delete availableChoices[ch];\n\n const result = warhammer.apps.ValueDialog.create({\n text:", + ", availableChoices);\n\n if (!result) return;\n\n characteristics.add(result);\n}\n\nthis.effect.setFlag(" + ] + }, + { + "file": "OGX4BneaYAnV25TO.js", + "count": 5, + "strings": [ + ").roll({allowInteractive : false});\nlet regen = regenRoll.total;\n\nif (wounds.value >= wounds.max)\n return\n\nif (wounds.value > 0) \n{\n wounds.value += regen\n if (wounds.value > wounds.max)\n {\n wounds.value = wounds.max\n }\n message += `${this.actor.name} regains ${regen} Wounds.`\n\n if (regen == 10)\n {\n message += `
        Additionally, they regenerate a Critical Wound.`\n }\n}\nelse if (regen >= 8) \n{\n message += `${this.actor.name} rolled a ${regen} and regains 1 Wound.`\n wounds.value += 1\n if (regen == 10)\n {\n message += `
        Additionally, they regenerate a Critical Wound.`\n }\n}\nelse \n{\n message += `${this.actor.name} Régénération roll of ${regen} - No effect.`\n}\n\nawait this.actor.update({", + ": wounds })\nthis.script.message(message, { whisper: ChatMessage.getWhisperRecipients(", + "}\n}\nelse if (regen >= 8) \n{\n message +=", + "wounds.value += 1\n if (regen == 10)\n {\n message +=", + "}\n}\nelse \n{\n message +=" + ] + }, + { + "file": "UQtXuQmUlTyDKqhe.js", + "count": 5, + "strings": [ + "Lore (Magic)", + "Dark Magic (Necromancy)", + ",\n value: /^((?!\\().)*$/gm, // Remove all spells with parentheses (all arcane spells spells)\n regex: true\n },\n {\n property :", + "+ this.effect.name\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(" + ] + }, + { + "file": "V4PcjtHde941wv6J.js", + "count": 5, + "strings": [ + "action-link critical", + "> Critical`;\n \n const test = await this.actor.setupSkill(game.i18n.localize(", + "), {\n skipTargets: true,\n appendTitle: ` - ${this.effect.name}`,\n fields: {difficulty:", + " Critical", + ",\n fields: {difficulty: \"average\"},\n context: {failure:" + ] + }, + { + "file": "VOc9sKag2Vy4vGGZ.js", + "count": 5, + "strings": [ + "all forms", + "Must provide a Master Rune", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && item.system.master, onError: \"Must provide a Master Rune\"});\n }\n }\n else \n {\n rune = await DragDialog.create({text :", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && item.system.master, onError: \"Must provide a Master Rune\"});\n }\n}\nelse \n{\n rune = await DragDialog.create({text :", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && item.system.master, onError: \"Must provide a Master Rune\"});\n}\n\nthis.actor.addEffectItems(rune.uuid, this.effect)\n\nlet talents = this.actor.itemTags.talent.filter(i => i.baseName == this.item.baseName);\nlet xpCost = talents.length * 100\n\nif (this.actor.type == \"character\" && (await foundry.applications.api.DialogV2.confirm({window: {title: this.effect.name}, content:" + ] + }, + { + "file": "WsN2R1qOzuLa2qyB.js", + "count": 5, + "strings": [ + "all forms", + "Must provide a Rune (non-Master)", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && !item.system.master, onError: \"Must provide a Rune (non-Master)\"});\n }\n }\n else \n {\n rune = await DragDialog.create({text :", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && !item.system.master, onError: \"Must provide a Rune (non-Master)\"});\n }\n}\nelse \n{\n rune = await DragDialog.create({text :", + ", title : this.effect.name, filter: (item) => item.type == \"wfrp4e-dwarfs.rune\" && !item.system.master, onError: \"Must provide a Rune (non-Master)\"});\n}\n\nthis.actor.addEffectItems(rune.uuid, this.effect)\n\nlet talents = this.actor.itemTags.talent.filter(i => i.baseName == this.item.baseName);\nlet xpCost = talents.length * 100\n\nif (this.actor.type == \"character\" && (await foundry.applications.api.DialogV2.confirm({window: {title: this.effect.name}, content:" + ] + }, + { + "file": "YN8719gme9AxYtyY.js", + "count": 5, + "strings": [ + "Lore (Magic)", + "Magic Item", + "Add Chaos Steed and +20 Ride (Horse)?", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(" + ] + }, + { + "file": "g0SzfsLyW7aD2F19.js", + "count": 5, + "strings": [ + ")[0].trim()} (${group})`\n }\n else\n {\n let value = await ValueDialog.create({text :", + ", title : this.effect.name});\n if (value)\n {\n name = `${name.split(", + ")[0].trim()} (${value})`\n tests = this.item.system.tests.value.replace(", + ", value);\n }\n }\n this.item.updateSource({name,", + "}\n else\n {\n let value = await ValueDialog.create({text : \"Entrez le Groupe d'Étiquette\", title : this.effect.name});\n if (value)\n {\n name =" + ] + }, + { + "file": "whUSkaR1yem21bXp.js", + "count": 5, + "strings": [ + "}`).trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ").trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(", + ", {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(", + ", {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +='Arme','Cornes','Tail','Tentacules','Morsure') ? traitVal - parseInt(characteristicValues[3]/10) : traitVal;\n traitItem.name = (traitItem.name +" + ] + }, + { + "file": "z8mwLihZQu0JtUHY.js", + "count": 5, + "strings": [ + "Lore (Magic)", + "Dark Magic (Necromancy)", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nconsole.log(", + ", items)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(" + ] + }, + { + "file": "Jjq3oPYbI26zjxME.js", + "count": 4, + "strings": [ + ")}!`)\n for(let weapon of dropped)\n {\n await weapon.system.toggleEquip();\n }\n }\n}\n\nlet roll = await new Roll(", + ").roll()\n\nroll.toMessage(this.script.getChatData({flavor : `Dropped ${dropped.map(i => i.name).join(", + ")}!`}));\n\nthis.effect.updateSource({", + ")\n for(let weapon of dropped)\n {\n await weapon.system.toggleEquip();\n }\n }\n}\n\nlet roll = await new Roll(\"1d10\").roll()\n\nroll.toMessage(this.script.getChatData({flavor :" + ] + }, + { + "file": "groEX1wJ9l00PkDF.js", + "count": 4, + "strings": [ + ");\n}\n\nif (this.actor.items.find(i => i.type === \"extendedTest\" && i.name === this.effect.name)) {\n this.script.message(", + ");\n\n return;\n}\n\nconst extendedTestData = {\n name: this.effect.name,\n type: \"extendedTest\",\n img: this.effect.img,\n system: {\n SL: {\n current: 0,\n target: target.actor.system.status.wounds.value\n },\n test: {\n value: 'Strength'\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: \"challenging\"\n }\n }\n};\n\nconst extendedTests = await this.actor.createEmbeddedDocuments(\"Item\", [extendedTestData], {fromEffect: this.effect.id});\nconst extendedTest = extendedTests[0];\n\nthis.script.message(", + ");\n\nlet effect = {\n name: extendedTest.name,\n img: extendedTest.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: extendedTest.name,\n script:", + ");\n await effect.delete();" + ] + }, + { + "file": "hL3JUSY3xMA4zj2Q.js", + "count": 4, + "strings": [ + ", {\n skipTargets: true, \n appendTitle: ` — ${this.effect.name}`, \n fields: {\n difficulty:", + "},\n context: {\n success:", + ",\n failure:", + ",\n }\n});\n\nawait test.roll();\nif (test.failure) {\n await this.actor.addCondition(" + ] + }, + { + "file": "lmBAZCtofsC8hHHG.js", + "count": 4, + "strings": [ + ">You have accrued ${signedSL} ${SL > 1 ?", + "}. Do you want to roll d10?

        \n

        1–6: add +1 SL

        \n

        7–10: lose all accrued SLs and perform next Test at –1 SL

        \n \n`;\n const choice = await foundry.applications.api.DialogV2.confirm({\n yes: {label:", + "},\n content,\n });\n\n if (!choice) break;\n\n const roll = new Roll(", + ");\n await roll.toMessage({flavor: this.effect.name});\n\n if (roll.total >= 7) {\n SL = -1;\n break;\n }\n\n SL++;\n} while (true);\n\nthis.effect.setFlag(" + ] + }, + { + "file": "lvjcddwRiN9iGruy.js", + "count": 4, + "strings": [ + ", { appendTitle: ` - ${this.effect.name}`, fields: { difficulty:", + "} })\nawait test.roll();\n\nif (test.failed) \n{\n let ageAdded = Math.ceil(CONFIG.Dice.randomUniform() * 10) + Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let ws = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let bs = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let s = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let t = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let ag = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let dex = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n\n let currentAge = parseInt(this.actor.system.details.age.value)\n\n let inline = `@ROLL`\n let msg =\n `

        ${this.actor.prototypeToken.name} ages by ${inline.replace(", + ", fields: { difficulty: \"challenging\" } })\nawait test.roll();\n\nif (test.failed) \n{\n let ageAdded = Math.ceil(CONFIG.Dice.randomUniform() * 10) + Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let ws = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let bs = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let s = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let t = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let ag = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n let dex = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n\n let currentAge = parseInt(this.actor.system.details.age.value)\n\n let inline =" + ] + }, + { + "file": "oTXPA6rbPnYOKNmo.js", + "count": 4, + "strings": [ + "Two Handed Weapon", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nconsole.log(", + ", items)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "x9iKFYYc4Ocy8PTS.js", + "count": 4, + "strings": [ + "Grace is beyond style", + "Choose Group", + ")[0] + ` (${name}`\n })\n}\nelse \n{\n item = await fromUuid(", + ");\n let data = item.toObject();\n data.name += ` (${name})`\n this.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "0Uly7OmkH0zqYbxQ.js", + "count": 3, + "strings": [ + ")}!`)\n for(let weapon of dropped)\n {\n await weapon.system.toggleEquip();\n }\n }\n}\n\nlet roll = await new Roll(", + ", this.actor).roll()\n\nroll.toMessage(this.script.getChatData({flavor : `${this.effect.name} (Durée)`}));\n\nthis.effect.updateSource({", + ")\n for(let weapon of dropped)\n {\n await weapon.system.toggleEquip();\n }\n }\n}\n\nlet roll = await new Roll(\"max(1, 1d10 - @system.characteristics.t.bonus)\", this.actor).roll()\n\nroll.toMessage(this.script.getChatData({flavor :" + ] + }, + { + "file": "4iu3CmOI19soOYuA.js", + "count": 3, + "strings": [ + "} ];\nlet items = [];\n\nlet updateObj = this.actor.toObject();\nfor (let ch in characteristics)\n{\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n}\n\nupdateObj.system.characteristics.int.initial = 0;\nupdateObj.system.characteristics.wp.initial = 0;\nupdateObj.system.characteristics.fel.initial = 0;\n\nfor (let trait of traits)\n{\n let traitItem = await game.wfrp4e.utility.find(trait.name,", + ")\n if (traitItem)\n {\n let t = traitItem.toObject();\n t.system.specification.value = trait.value;\n if (trait.disabled)\n {\n t.system.disabled = true;\n }\n items.push(t);\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${trait.name}`, {permanent : true})\n }\n}\n\n\n\nupdateObj.name = updateObj.name +=", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "6BmvV9c03FkfisnE.js", + "count": 3, + "strings": [ + ")})\n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name +=", + "})\n this.script.message(`${this.item.name} porté par ${this.actor.name} a été retiré et perd ses propriétés. Cependant, les effets durent [[1d10+4]] jours, après quoi ils doivent être retirés manuellement.`,\n {whisper: ChatMessage.getWhisperRecipients(", + ",\n {whisper: ChatMessage.getWhisperRecipients(\"GM\")})\n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name += \" (Utilisé)\"})\n this.script.message(" + ] + }, + { + "file": "7JW9t8AYSDkkzG2V.js", + "count": 3, + "strings": [ + ")})\n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name +=", + "})\n this.script.message(`${this.item.name} sur ${this.actor.name} a été retiré et perd ses propriétés. Cependant, les effets durent [[1d10+4]] jours, après quoi ils doivent être retirés manuellement.`,\n {whisper: ChatMessage.getWhisperRecipients(", + ",\n {whisper: ChatMessage.getWhisperRecipients(\"GM\")})\n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name += \" (Used)\"})\n this.script.message(" + ] + }, + { + "file": "7T3iXgrL72fea67C.js", + "count": 3, + "strings": [ + ",\n fields: {difficulty: \"easy\"},\n context: {\n success:", + ",\n failure:", + "}\n});\n\nawait test.roll();\n\nif (test.failed) {\n await this.actor.addEffectItems(bloodyFluxUUID, this.effect);\n} else {\n const SL = test.result.SL;\n const heal = 1 + SL;\n await this.actor.modifyWounds(heal);\n this.script.message(" + ] + }, + { + "file": "8yBr6VbdKcrWUuqw.js", + "count": 3, + "strings": [ + "this.actor.characteristics.int.value=", + "this.actor.characteristics.wp.value=", + "this.actor.characteristics.fel.value =" + ] + }, + { + "file": "BVNKF9omCppWPLys.js", + "count": 3, + "strings": [ + "You must control an Actor capable of performing a Strength Test", + "},\n context: {\n success:", + "}\n});\n\nawait test.roll();\nif (test.succeeded) {\n let SL = parseInt(test.result.SL);\n let name = this.effect.name.replace(/\\d+/, rating => parseInt(rating) - SL);\n await this.effect.update({name});\n}\n\nlet rating = parseInt(this.effect.name.match(/\\d+/)?.[0]);\nif (rating <= 1) {\n const scriptData = this.effect.system.scriptData\n scriptData[2].trigger = '';\n await this.effect.update({disabled: true," + ] + }, + { + "file": "Bu0KUpGvfmFF7LJs.js", + "count": 3, + "strings": [ + ", {appendTitle : ` - ${this.effect.name}`, fields : {difficulty :", + "}});\n\nawait test.roll();\n\nif (test.failed)\n{\n\n if (test.isCriticalFumble ==", + ", fields : {difficulty : \"difficult\"}});\n\nawait test.roll();\n\nif (test.failed)\n{\n\n if (test.isCriticalFumble == \"fumble\")\n {\n\t return this.script.message(" + ] + }, + { + "file": "EC8cZmqrE095cDc2.js", + "count": 3, + "strings": [ + ",\n skipTargets: true,\n fields: {difficulty: 'hard'},\n characteristic: 'int',\n });\n await loreTest.roll();\n\n if (loreTest.succeeded) {\n loreTest.result.other.push(", + ");\n loreTest.renderRollCard();\n return;\n } \n}\n\nlet test = await actor.setupSkill('Calme', {\n appendTitle:", + ",\n skipTargets: true,\n fields: {difficulty: 'easy'},\n characteristic: 'wp',\n});\nawait test.roll();\n\nif (!test.succeeded) {\n test.result.other.push(" + ] + }, + { + "file": "ETfmit2Cx0Py77ai.js", + "count": 3, + "strings": [ + "} ];\nlet items = [];\n\nlet updateObj = this.actor.toObject();\nfor (let ch in characteristics)\n{\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n}\n\nupdateObj.system.characteristics.int.initial = 0;\nupdateObj.system.characteristics.wp.initial = 0;\nupdateObj.system.characteristics.fel.initial = 0;\n\nfor (let trait of traits)\n{\n let traitItem = await game.wfrp4e.utility.find(trait.name,", + ")\n if (traitItem)\n { \n let t = traitItem.toObject();\n t.system.specification.value = trait.value;\n items.push(t);\n }\n else \n {\n ui.notifications.warn(`: -200\n}\nlet traits = [ {name:`, {permanent : true})\n }\n}\n\n\nupdateObj.name = updateObj.name +=", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "KmngDrPD72xn22kZ.js", + "count": 3, + "strings": [ + ", {skipTargets: true, appendTitle : ` - Used ${this.effect.name}`, fields: { difficulty:", + "} }).then(async test => {\n await test.roll()\n if (test.failed) \n {\n let toughnessLost = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n this.actor.update({", + ", fields: { difficulty: \"difficult\" } }).then(async test => {\n await test.roll()\n if (test.failed) \n {\n let toughnessLost = Math.ceil(CONFIG.Dice.randomUniform() * 10)\n this.actor.update({ \"system.characteristics.t.initial\": this.actor.characteristics.t.initial - toughnessLost })\n this.script.message(" + ] + }, + { + "file": "MgMMoC4Umpg7fmNI.js", + "count": 3, + "strings": [ + ")}) \n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name +=", + "})\n this.script.message(`${this.item.name} on ${this.actor.name} has been taken off and loses its properties. However, the effects last for [[1d10+4]] days, after which they should be manually removed.`, \n {whisper: ChatMessage.getWhisperRecipients(", + ",\n {whisper: ChatMessage.getWhisperRecipients(\"GM\")}) \n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name += \" (Used)\"})\n this.script.message(" + ] + }, + { + "file": "N8hA6ysHCTlLd8Kj.js", + "count": 3, + "strings": [ + "Ritual Dress incorporating many ingredients and fetishes", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n items.push({name : trapping, type : \"trapping\", \"system.trappingType.value\" : \"clothingAccessories\"})\n //ui.notifications.warn(" + ] + }, + { + "file": "R32U01LBjBrK1pns.js", + "count": 3, + "strings": [ + ", {hideDSN: true})).text;\n\n\n let templateItem = await warhammer.utility.findItemId(templateMap[template._id]);\n\n let bio = \n `\n

        Template: ${template.text}

        \n

        Phsyical Quirk: ${physicalQuirk}

        \n

        Work Ethic: ${workEthic}

        \n

        Personality Quirk: ${personalityQuirk}

        \n `\n \n this.script.message(bio, {whisper : ChatMessage.getWhisperRecipients(", + ")})\n\n await this.actor.update({", + ": bio})\n\n if (templateItem)\n {\n this.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "R8ecKGRzOr4ThvVa.js", + "count": 3, + "strings": [ + "Maintenance Crew Test", + ";\nconst test = 'Maintenance Crew Test';\nconst difficulty = 'hard';\nconst target = 80;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "RvipIYj9H7n4UDMe.js", + "count": 3, + "strings": [ + ": 0\n}\nlet skills = []\nlet skillAdvancements = []\nlet talents = []\nlet trappings = []\nlet items = []\n\nlet updateObj = this.actor.toObject();\n\nfor (let ch in characteristics)\n{\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n}\n\nfor (let index = 0; index < skills.length; index++)\n{\n let skill = skills[index]\n let skillItem;\n skillItem = updateObj.items.find(i => i.name == skill && i.type ==", + ")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else\n {\n skillItem = await game.wfrp4e.utility.findSkill(skill)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true})\n }\n}\n\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "TCtXPvDpbfz1yrVZ.js", + "count": 3, + "strings": [ + "Corps à corps (A deux mains)", + "A deux mains", + "

        \n Select your choice\n

        \n
          \n
        1. Melee (Basic)
        2. \n
        3. Melee (Two-Handed)
        4. \n
        " + ] + }, + { + "file": "VINX6TBAJQznhVcN.js", + "count": 3, + "strings": [ + "Maintenance Crew Test", + ";\nconst test = 'Maintenance Crew Test';\nconst difficulty = 'hard';\nconst target = 80;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "a8i0sA1RBnD8nHZt.js", + "count": 3, + "strings": [ + "Choose Qualities to add", + "Choose Flaws to remove", + "t put it in the dialog\n if (targetedItem.system.properties.qualities[q])\n {\n delete qualities[q]\n }\n}\nfor(let f in flaws)\n{\n // If a weapon doesn" + ] + }, + { + "file": "aeBetniKqq5SD9Ou.js", + "count": 3, + "strings": [ + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nconsole.log(", + ", items)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "bEVlJOOA1kLlzpWx.js", + "count": 3, + "strings": [ + "Ritual Dress incorporating many ingredients and fetishes", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n items.push({name : trapping, type : \"trapping\", \"system.trappingType.value\" : \"clothingAccessories\"})\n //ui.notifications.warn(" + ] + }, + { + "file": "fq2fqlWlrVfitkcB.js", + "count": 3, + "strings": [ + ", disabled: true} ];\nlet items = [];\n\nlet updateObj = this.actor.toObject();\nfor (let ch in characteristics)\n{\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n}\n\nfor (let trait of traits)\n{\n let traitItem = await game.wfrp4e.utility.find(trait.name,", + ")\n if (traitItem)\n { \n let t = traitItem.toObject();\n t.system.specification.value = trait.value;\n if (trait.disabled)\n {\n t.system.disabled = true;\n }\n items.push(t);\n }\n else \n {\n ui.notifications.warn(`: -200\n}\nlet traits = [ {name:`, {permanent : true})\n }\n}\n\n\nupdateObj.name = updateObj.name +=", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "iNAQJa5HyaEckknX.js", + "count": 3, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`})\nawait test.roll();\n\n\nlet opposedResult = test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result\n\nif (opposedResult?.winner ==", + ")\n{\n let spells = this.actor.itemTypes.spell;\n if (spells.length)\n {\n let chosen = spells[Math.floor(CONFIG.Dice.randomUniform() * spells.length)]\n this.script.message(`Loses access to ${chosen.name}`)\n chosen.update({name : chosen.name +=", + "})\nawait test.roll();\n\n\nlet opposedResult = test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result\n\nif (opposedResult?.winner == \"attacker\")\n{\n let spells = this.actor.itemTypes.spell;\n if (spells.length)\n {\n let chosen = spells[Math.floor(CONFIG.Dice.randomUniform() * spells.length)]\n this.script.message(" + ] + }, + { + "file": "jdS2u1tQPYeO55WI.js", + "count": 3, + "strings": [ + "

        Damage all Items carried?

        ", + "}\n\t\tfor(let item of armour)\n\t\t{\n\t\t\tawait item.system.damageItem(1);\n\t\t\tmsg +=", + "}\n\t\tfor(let item of trappings)\n\t\t{\n\t\t\tawait item.system.damageItem(1);\n\t\t\tmsg +=" + ] + }, + { + "file": "nkdKBJ8ItqWiRAWL.js", + "count": 3, + "strings": [ + ")}) \n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name +=", + "})\n this.script.message(`${this.item.name} on ${this.actor.name} has been taken off and loses its properties. However, the effects last for [[1d10+4]] days, after which they should be manually removed.`, \n {whisper: ChatMessage.getWhisperRecipients(", + ",\n {whisper: ChatMessage.getWhisperRecipients(\"GM\")}) \n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name += \" (Used)\"})\n this.script.message(" + ] + }, + { + "file": "rF0Z3hTUUnSxL3Mq.js", + "count": 3, + "strings": [ + "Armour (Hide)", + "Choose Optional Traits", + ")}`);\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "rly9iBUy8EX7NhQT.js", + "count": 3, + "strings": [ + "You must target exactly one Boat.", + "You can only Constrict a Boat", + "You can only Constrict vessels of Taille Large or smaller" + ] + }, + { + "file": "svCqdytEOtqFXCcs.js", + "count": 3, + "strings": [ + "Add Chaos Steed and +20 Ride (Horse)?", + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "sz0PqS1kroMOzUZk.js", + "count": 3, + "strings": [ + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nconsole.log(", + ", items)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "wbM7tpw4TxvadcWm.js", + "count": 3, + "strings": [ + ";\nfor(let item of items)\n{\n if (item.system.properties.qualities.durable)\n {\n await item.update({", + ": []});\n msg += `

        ${item.name} loses all Qualities

        `\n }\n else \n {\n msg += `

        ${item.name} crumbles into dust!

        ` \n await item.update({name : item.name +", + "}\n else \n {\n msg +=" + ] + }, + { + "file": "xgplXZMs459X7XXM.js", + "count": 3, + "strings": [ + ")}) \n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name +=", + "})\n this.script.message(`${this.item.name} on ${this.actor.name} has been taken off and loses its properties. However, the effects last for [[1d10+4]] days, after which they should be manually removed.`, \n {whisper: ChatMessage.getWhisperRecipients(", + ",\n {whisper: ChatMessage.getWhisperRecipients(\"GM\")}) \n}\n\n// Notify of lingering effects when mask is removed\nelse if (!args.equipped)\n{\n await this.item.effects.contents[0].delete();\n await this.item.update({name : this.item.name += \" (Used)\"})\n this.script.message(" + ] + }, + { + "file": "xklncIMwQIespDxS.js", + "count": 3, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty :", + "}});\nawait test.roll();\nCorruptionMessageModel.createCorruptionMessage(", + ", this.script.getChatData())\n\nif (test.failed)\n{\n this.actor.addCondition(" + ] + }, + { + "file": "y3F1K1sYBymPZCjz.js", + "count": 3, + "strings": [ + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nconsole.log(", + ", items)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(" + ] + }, + { + "file": "ynoHNXXCGRS6fTqF.js", + "count": 3, + "strings": [ + ").roll()).total\n\nif (args.actor.characteristics.i.value <= 0)\n{\n i_gain += (await new Roll(", + ").roll()).total\n}\n\nmsg = `${this.actor.prototypeToken.name} gains ${i_gain} Initiative`\n\nlet newValue = i_gain + args.actor.characteristics.i.modifier\n\nthis.actor.update({", + ")\n\nlet value = hitloc.result\nlet desc = hitloc.description\n\nthis.effect.updateSource({" + ] + }, + { + "file": "18MeEQ0As3JvER71.js", + "count": 2, + "strings": [ + "EFFECT.CreatureBackInWater", + "EFFECT.CreatureOutOfWater" + ] + }, + { + "file": "1BT0MWM2cbhlEnrn.js", + "count": 2, + "strings": [ + ": 5\n }\n let items = []\n\n let updateObj = this.actor.toObject();\n\n let talents = (await Promise.all([game.wfrp4e.tables.rollTable(", + ")])).map(i => i.text)\n\n for (let ch in characteristics)\n {\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n }\n\n for (let talent of talents)\n {\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})\n }\n }\n\n\n await this.actor.update(updateObj)\n this.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "1CeYp5MlPcH68UIw.js", + "count": 2, + "strings": [ + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "1ZArMNUI8qqH6zkX.js", + "count": 2, + "strings": [ + "+ this.effect.name, context : {failure:", + "}})\nawait test.roll();\nif (test.failed)\n{\n args.actor.addCondition(" + ] + }, + { + "file": "3ixqbsEMfSSTzAXU.js", + "count": 2, + "strings": [ + "Subi la @Condition[Fatigued] à cause de cauchemars.", + "A souffert de cauchemars, mais a assez bien dormi." + ] + }, + { + "file": "4MQ7u4INxp51oyyR.js", + "count": 2, + "strings": [ + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "4ylzjgUdHY5D0yVh.js", + "count": 2, + "strings": [ + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "5JWC0l3JEpOsqbR9.js", + "count": 2, + "strings": [ + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "5JvKJZPcd6Hz5zvn.js", + "count": 2, + "strings": [ + "+ updateObj.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "5ScjIdRUOxblHdWS.js", + "count": 2, + "strings": [ + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'challenging';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "5dR7Erj3nwsxLAV7.js", + "count": 2, + "strings": [ + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "6elUNF58TaiYjxcx.js", + "count": 2, + "strings": [ + "+ this.effect.name, context : {failure:", + "}})\nawait test.roll();\nif (test.failed)\n{\n this.actor.addCondition(" + ] + }, + { + "file": "8GyJgdHVBaLrHCY8.js", + "count": 2, + "strings": [ + ")\n{\n this.item.updateSource({name : this.item.name += ` (${types[type]})`,", + ": this.item.system.specification.value.replace(" + ] + }, + { + "file": "8xqYrBIf1Zhlwizg.js", + "count": 2, + "strings": [ + "

        Finished raisint the anchor.

        ", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "9AMoFRATTAfdKlKN.js", + "count": 2, + "strings": [ + ",\n fields: {difficulty: \"challenging\"},\n context: {\n failure:", + "}\n});\n\nawait test.roll();\n\nif (test.failed) {\n args.actor.addCondition(\"poisoned\");\n const speaker = ChatMessage.getSpeaker({actor: args.actor});\n this.script.message(" + ] + }, + { + "file": "A0OK0qAMmnf8iNJf.js", + "count": 2, + "strings": [ + ")})\n if (args.test.failed && this.actor.type ==", + ")\n {\n this.actor.update({" + ] + }, + { + "file": "AI7iVbQMPzXMP5on.js", + "count": 2, + "strings": [ + "(bonus)", + "duration.seconds" + ] + }, + { + "file": "AvRbjpBfTX3mn3bz.js", + "count": 2, + "strings": [ + "Set Liquid Fortification effect duration to 1 hour.", + "Reset Liquid Fortification effect duration to 1 hour." + ] + }, + { + "file": "BD7bVTU2pVoRSRBe.js", + "count": 2, + "strings": [ + "Coughs and Sneezes", + "Choose Symptoms" + ] + }, + { + "file": "BEEvU2hE5ymcNOH9.js", + "count": 2, + "strings": [ + "Fatigued added to", + "which cannot be removed until the Malaise symptom is gone." + ] + }, + { + "file": "BHbFqhJPzZI2txLs.js", + "count": 2, + "strings": [ + ")[0].toLowerCase();\n\n// If channelling corresponding lore\nif (args.type ==", + "&& args.spell.system.lore.value == lore)\n args.prefillModifiers.slBonus += 2\n// If channelling or casting different lore\nelse if (args.spell.system.lore.value != lore && args.spell.system.lore.value !=" + ] + }, + { + "file": "EJObiSth3WdcJOXN.js", + "count": 2, + "strings": [ + "&& args.test.failed && args.test.result.SL <= -3)\n{\n this.script.notification(", + ");\n this.actor.addCondition(" + ] + }, + { + "file": "EdTChmSouS0MSmk5.js", + "count": 2, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`})\nawait test.roll();\nif (test.succeeded)\n{\n this.script.message(", + ")\n}\nelse \n{\n this.script.message(" + ] + }, + { + "file": "EsZx8cY34quYG4MQ.js", + "count": 2, + "strings": [ + "This Actor does not know any runes.", + "Anvil of Doom Bonus" + ] + }, + { + "file": "FPYNcxm21678boLT.js", + "count": 2, + "strings": [ + ") return;\n\nconst SL = args.opposedTest.data.opposeResult.differenceSL;\n\nconst targetId = this.effect.getFlag(", + ");\n return await this.effect.delete();\n}\n\nif (SL > 0) {\n args.opposedTest.data.opposeResult.other.push(" + ] + }, + { + "file": "FtZf56VI6Qsspu0D.js", + "count": 2, + "strings": [ + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'difficult';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "GjkxWj9wCAclM9WA.js", + "count": 2, + "strings": [ + "All Effects have been used. Reset to select them again", + "Choose Power to Gain" + ] + }, + { + "file": "GsAyB5xnK3ASeoah.js", + "count": 2, + "strings": [ + ";\nconst test = 'Trade (Carpentry)';\nconst difficulty = 'easy';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "H85k4L3yICm7cfIk.js", + "count": 2, + "strings": [ + ";\nconst test = 'Voile';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "JhbZWZhOJ23yOBmG.js", + "count": 2, + "strings": [ + ";\nconst test = 'Trade (Carpentry)';\nconst difficulty = 'hard';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "OsLXutfXyQCAkhAf.js", + "count": 2, + "strings": [ + ";\nconst test = 'Voile';\nconst difficulty = 'average';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "Pn5fekTbkwlr61XU.js", + "count": 2, + "strings": [ + ";\nconst test = 'Métier (Ingénieur)';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "Q7eULXQ9AfDRmUGO.js", + "count": 2, + "strings": [ + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'difficult';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "QRSACifDrvojIXHB.js", + "count": 2, + "strings": [ + "No Conditions on this Actor", + "Choose a Condition" + ] + }, + { + "file": "R6SnyF3y4Vsq6oga.js", + "count": 2, + "strings": [ + ")[0].toLowerCase();\n\n// If channelling corresponding lore\nif (args.type ==", + "&& args.spell.system.lore.value == lore)\n args.prefillModifiers.slBonus += 1\n// If channelling or casting different lore\nelse if (args.spell.system.lore.value != lore && args.spell.system.lore.value !=" + ] + }, + { + "file": "R8FBHZaaARA3z9pB.js", + "count": 2, + "strings": [ + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'hard';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "RPqgRUkiLY5thVbC.js", + "count": 2, + "strings": [ + ";\nconst test = 'Strength';\nconst difficulty = 'average';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "SlrslcNdnYONcSH3.js", + "count": 2, + "strings": [ + "No weapons equipped!", + "Not enough Fortune!" + ] + }, + { + "file": "T4JEEDYCEIUbVHv4.js", + "count": 2, + "strings": [ + "Fatigued added to", + "which cannot be removed until the Malaise symptom is gone." + ] + }, + { + "file": "TGN070HeJLl3gSMY.js", + "count": 2, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, context: { failure:", + "}})\nawait test.roll();\nif (test.failed)\n{\n this.actor.addCondition(" + ] + }, + { + "file": "TIoUbjOtj7PTK2t8.js", + "count": 2, + "strings": [ + ",\n fields: {difficulty: \"challenging\"},\n context: {\n failure:", + "}\n});\n\nawait test.roll();\n\nif (test.failed) {\n const SL = Number(test.result.SL);\n this.script.message(" + ] + }, + { + "file": "TpZItJ5Ugbazaobd.js", + "count": 2, + "strings": [ + ")\n\nthis.item.updateSource({name : this.item.name += ` (${locationText})`,", + ": locations})\nthis.effect.updateSource({" + ] + }, + { + "file": "TwgdEucxcHloc4cX.js", + "count": 2, + "strings": [ + "acier\"\n },\n {\n type : \"armour\",\n name : \"Brassards\"\n },\n {\n type : \"armour\",\n name : \"Heaume\"\n },\n {\n type : \"armour\",\n name : \"Jambières d", + "

        \n Select your choice\n

        \n
          \n
        1. Mail
        2. \n
        3. Mail & Leather
        4. \n
        5. Plate
        6. \n
        " + ] + }, + { + "file": "UDPsaymtZf39UsMk.js", + "count": 2, + "strings": [ + "Fatigued added to", + "which cannot be removed until the Malaise symptom is gone." + ] + }, + { + "file": "UlRSaZG4ZUU6fMND.js", + "count": 2, + "strings": [ + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'challenging';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "UnqnWi0dZYLf5fTT.js", + "count": 2, + "strings": [ + "acier\"\n },\n {\n type : \"armour\",\n name : \"Brassards\"\n },\n {\n type : \"armour\",\n name : \"Heaume\"\n },\n {\n type : \"armour\",\n name : \"Jambières d", + "

        \n Select your choice\n

        \n
          \n
        1. Mail
        2. \n
        3. Mail & Leather
        4. \n
        5. Plate
        6. \n
        " + ] + }, + { + "file": "V9wD9FWHWxZUOGSI.js", + "count": 2, + "strings": [ + ").roll())\nlet fatigued = roll.total\nroll.toMessage(this.script.getChatData());\nif (fatigued > this.actor.characteristics.wp.bonus)\n{\n this.actor.addCondition(\"unconscious\")\n this.script.notification(", + ")\n}\nelse \n{\n fatigued = Math.max(0, fatigued)\n if (fatigued)\n this.actor.addCondition(\"fatigued\", fatigued)\n this.script.notification(" + ] + }, + { + "file": "VbI0Al6rJfypV3qY.js", + "count": 2, + "strings": [ + "ROLL.ImpressiveFailure", + "ROLL.AstoundingSuccess" + ] + }, + { + "file": "VcE8Hie2jbpuyuM3.js", + "count": 2, + "strings": [ + "Spell Rules Reminder", + "s name\nawait effect.update({\n name,\n \"system.scriptData\": scriptData\n});\n\n\n// update Trait" + ] + }, + { + "file": "W2rdTwflbUVxFyfd.js", + "count": 2, + "strings": [ + "), {context : {failure : this.actor.name +", + "})\n await test.roll();\n if (test.failed)\n {\n this.actor.addCondition(" + ] + }, + { + "file": "WOpRJluHKER1MdgI.js", + "count": 2, + "strings": [ + "), {context : {failure : this.actor.name +", + "})\n await test.roll();\n if (test.failed)\n {\n this.actor.addCondition(" + ] + }, + { + "file": "WR0Kqn8CF5iwToak.js", + "count": 2, + "strings": [ + ";\nconst test = 'Trade (Tailor)';\nconst difficulty = 'difficult';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "Wo4wQKUxSItAhRzZ.js", + "count": 2, + "strings": [ + ")[0].toLowerCase();\n\n// If channelling corresponding lore\nif (args.type ==", + "&& args.spell.system.lore.value == lore)\n args.prefillModifiers.slBonus += 3\n// If channelling or casting different lore\nelse if (args.spell.system.lore.value != lore && args.spell.system.lore.value !=" + ] + }, + { + "file": "XcvDYNZgJ2rpAdDV.js", + "count": 2, + "strings": [ + "Fatigued added to", + "which cannot be removed until the Malaise symptom is gone." + ] + }, + { + "file": "Y8J66v8VTKUASGuK.js", + "count": 2, + "strings": [ + "No Conditions on this Actor", + "Choose a Condition" + ] + }, + { + "file": "YJX7WnxzXXIVdH6P.js", + "count": 2, + "strings": [ + "]\n }\n]\n\nlet arcane = await ItemDialog.createFromFilters(filters, 12, {title : this.effect.name, text :", + "})\n\nlet items = petty.map(i => i.toObject()).concat(arcane.map(i => {\n let spell = i.toObject();\n spell.img = `modules/wfrp4e-core/icons/spells/${lore}.png`\n spell.system.lore.value = lore;\n return spell;\n}));\n\n\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "ZCBcwbVFHFTFRntb.js", + "count": 2, + "strings": [ + ";\nconst test = 'Trade (Carpentry)';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "ZRoG7GiMDQWso6gN.js", + "count": 2, + "strings": [ + ";\nconst test = 'Trade (Carpentry)';\nconst difficulty = 'difficult';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "a7pEvCycVnFBXGAQ.js", + "count": 2, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty :", + "}})\nawait test.roll();\n\nif (!test.succeeded)\n{\n\tthis.actor.addCondition(" + ] + }, + { + "file": "bwtQOSWn120NICkf.js", + "count": 2, + "strings": [ + "}});\nawait test.roll();\n\nif (test.failed)\n{\n await this.actor.addCondition(", + ")\n await this.actor.addCondition(" + ] + }, + { + "file": "eRVVn8YtU8nnOW2q.js", + "count": 2, + "strings": [ + ",\n fields: {difficulty: \"difficult\"},\n context: {\n failure:", + ",\n success:" + ] + }, + { + "file": "f4vvAGQ8OGoEbrgy.js", + "count": 2, + "strings": [ + "+ this.effect.name, context : {failure:", + "}})\nawait test.roll();\nif (test.failed)\n{\n args.actor.addCondition(" + ] + }, + { + "file": "goz8yTlMozlsz3uY.js", + "count": 2, + "strings": [ + ";\nconst test = 'Strength';\nconst difficulty = 'easy';\nconst target = 10;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "jOCLEsjNzERyVLsP.js", + "count": 2, + "strings": [ + "ROLL.MajorMis", + "ROLL.MinorMis" + ] + }, + { + "file": "jsgLEVYvMieyYT6L.js", + "count": 2, + "strings": [ + "; // Put path to token image here, inbetween the quotation marks\nif (tokenImg)\n{\n if (this.effect.getFlag(", + "No Token Image path configured. The image path should be set in the first line of this script." + ] + }, + { + "file": "jvNuIbOtB46p0esq.js", + "count": 2, + "strings": [ + ";\n\t\t\targs.test.result.description =", + "}\n\t\targs.test.result.outcome =" + ] + }, + { + "file": "k465TgRelwcSUdS2.js", + "count": 2, + "strings": [ + "Failed Trade (Engineering)", + "This Actor does not have Trade (Engineering)!" + ] + }, + { + "file": "kbXDGAmWWD4CZJHB.js", + "count": 2, + "strings": [ + ");\nawait roll.evaluate();\nawait roll.toMessage({flavor:", + "});\nthis.actor.system.status.mood.addEntry(" + ] + }, + { + "file": "nkSmu7v9WiAaK4vq.js", + "count": 2, + "strings": [ + ";\nconst test = 'Trade (Tailor)';\nconst difficulty = 'easy';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "oWa7RkScnl6lR5vd.js", + "count": 2, + "strings": [ + ") \n{\n if (args.test.failed)\n {\n let item = await fromUuid(", + ")\n let data = item.toObject();\n this.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "okW06V9UiPC4Vcrn.js", + "count": 2, + "strings": [ + "+ this.effect.name\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "q8lOAWr2970sZeTw.js", + "count": 2, + "strings": [ + ";\nconst test = 'Trade (Carpentry)';\nconst difficulty = 'challenging';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "qDYJnO2JosPJrjpz.js", + "count": 2, + "strings": [ + "Bite of the Purple Skullback", + ",\n fields: {difficulty: \"average\"},\n context: {\n failure:" + ] + }, + { + "file": "rBAoyhzeU3Q8MVSk.js", + "count": 2, + "strings": [ + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'difficult';\nconst target = 50;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "re1UFtxvRRjpPB7Z.js", + "count": 2, + "strings": [ + "}\nelse if (data.system.location.key[0] ==", + "}\n\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "tNTO1LVN7JqHf4YN.js", + "count": 2, + "strings": [ + ") \n{\n if (args.test.failed)\n {\n this.actor.createEmbeddedDocuments(", + "]])\n this.script.message(`Willpower Test failed, ${this.actor.prototypeToken.name} gains @Condition[Malaise] for [[1d10]] hours`, {whisper: ChatMessage.getWhisperRecipients(" + ] + }, + { + "file": "tyQLkRLk1AXB4g2u.js", + "count": 2, + "strings": [ + "critical-roll", + "}\n \n args.test.result.other.push (" + ] + }, + { + "file": "uLBDnWC3S0lRitbj.js", + "count": 2, + "strings": [ + "Gained a Corruption point", + ")})\n }\n else \n {\n await this.actor.addCondition(" + ] + }, + { + "file": "uhCq5NwjQ2a2idPn.js", + "count": 2, + "strings": [ + ";\nconst test = 'Trade (Tailor)';\nconst difficulty = 'easy';\nconst target = 30;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "v4CCxVaVGf9i8U7X.js", + "count": 2, + "strings": [ + ").map(i => `max(0, 1d10 - ${this.actor.system.characteristics.fel.bonus})`)\n\nlet test = new Roll(`${rolls.join(", + ")\n\nlet test = new Roll(" + ] + }, + { + "file": "vJQRBxDfPwHens0a.js", + "count": 2, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields: { difficulty:", + "} }).then(async test => {\n await test.roll();\n if (test.failed) \n {\n await args.actor.addCondition(" + ] + }, + { + "file": "vS2D9QUslR7ZtXXm.js", + "count": 2, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty :", + "}})\nawait test.roll();\nif (test.failed)\n{\n let roll = await new Roll(" + ] + }, + { + "file": "w4RuGIfseGoxXA3k.js", + "count": 2, + "strings": [ + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'challenging';\nconst target = 20;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "wBc8XvkAnv3j93vR.js", + "count": 2, + "strings": [ + "Reduced Fate and Fortune by 1", + "Reduced Resilience and Resolve by 1" + ] + }, + { + "file": "yQziCK8G8I1RYkTj.js", + "count": 2, + "strings": [ + "Add 1 AP? Bascinet provides 4 AP instead of 3 against missile attacks from the front", + "+1 AP against missile attacks to the front" + ] + }, + { + "file": "ynV7tz0OdCwlsQp6.js", + "count": 2, + "strings": [ + "msg += `

        ${await this.actor.applyBasicDamage(8, {loc :", + ", suppressMsg: true, hideDSN: true})}

        `\nmsg += `

        ${await this.actor.applyBasicDamage(8, {loc :" + ] + }, + { + "file": "yvtF2t9aibxibAIM.js", + "count": 2, + "strings": [ + ",\n fields: {difficulty: \"challenging\"},\n context: {\n failure:", + ",\n success:" + ] + }, + { + "file": "zL7ECmBBMAqf5Esn.js", + "count": 2, + "strings": [ + "

        Does the vessel have a magazine or any other kind of store for blackpowder?

        ", + ");\nthis.script.message(" + ] + }, + { + "file": "zXh8rgMxWoCLTxVd.js", + "count": 2, + "strings": [ + ";\nconst test = 'Voile';\nconst difficulty = 'challenging';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "zdGAvfL7zJ7wpYxG.js", + "count": 2, + "strings": [ + ";\nconst test = 'Métier (Charpentier)';\nconst difficulty = 'easy';\nconst target = 40;\n\nconst extendedTestData = {\n name: this.item.name,\n type: \"extendedTest\",\n img: this.item.img,\n system: {\n SL: {\n current: 0,\n target: target\n },\n test: {\n value: test\n },\n completion: {\n value: \"remove\"\n },\n difficulty: {\n value: difficulty\n }\n },\n effects: [\n {\n name:", + ",\n img: this.item.img,\n system: {\n transferData : {\n type: \"document\",\n documentType: \"Item\"\n },\n scriptData: [\n {\n label: this.item.name,\n script:" + ] + }, + { + "file": "1jQq9v8fXK8zuEBU.js", + "count": 1, + "strings": [ + "this.script.message(msg)\n\nlet test = await this.actor.setupSkill(\"Résistance\", {fields : {difficulty : \"difficult\"}, appendTitle :" + ] + }, + { + "file": "1wrPvP6lJwIAfmsl.js", + "count": 1, + "strings": [ + "Choose Location" + ] + }, + { + "file": "2EAYX5G9Fh3HJwiP.js", + "count": 1, + "strings": [ + "Condition Brisé supprimée." + ] + }, + { + "file": "2yW0kuwLfgRzJR2S.js", + "count": 1, + "strings": [ + "duration.seconds" + ] + }, + { + "file": "3CeKfDcMEVgQlcXm.js", + "count": 1, + "strings": [ + "Hatred (All enemies)" + ] + }, + { + "file": "3D5ImpMgpOTPucvv.js", + "count": 1, + "strings": [ + ").pop())\n\nif (ones > SL)\n args.test.result.other.push(`Wyrmslayer
        : Ignore le BE contre les Dragons" + ] + }, + { + "file": "4rTmV3TNxctUe0ly.js", + "count": 1, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`});\nawait test.roll();\nif (test.failed)\n{\n this.actor.addCondition(" + ] + }, + { + "file": "58rFc9HiBoX66J6p.js", + "count": 1, + "strings": [ + ";\n\nlet message = await sourceActor.applyBasicDamage(damage - tb, {damageType: game.wfrp4e.config.DAMAGE_TYPE.IGNORE_AP, suppressMsg : true})\n\nthis.script.message(message.replace(" + ] + }, + { + "file": "5GP9UJMvBZv6kWtI.js", + "count": 1, + "strings": [ + "}\nfor(let item of armour)\n{\n\tawait item.system.damageItem(1);\n\tmsg +=" + ] + }, + { + "file": "5M6IgCUncCwyxHok.js", + "count": 1, + "strings": [ + ";\n item = await fromUuid(uuid);\n if (item)\n {\n msg +=" + ] + }, + { + "file": "64aJznxPMUHAuf7F.js", + "count": 1, + "strings": [ + ")\n}\nelse\n{\n this.item.flags.runeOfLuck = true\n await this.actor.update({\"system.status.fortune.value\" : Math.max(0, currentFortune - runeFortune)})\n this.script.message(" + ] + }, + { + "file": "65xE9OV5sA1ZWT7j.js", + "count": 1, + "strings": [ + ").pop())\n\nif (ones > SL)\n args.test.result.other.push(` i.toObject())\n\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "96Y1yIH1lRjTs5hL.js", + "count": 1, + "strings": [ + ")\n{\n this.actor.addCondition(" + ] + }, + { + "file": "9A7rYY3FKi5XLihG.js", + "count": 1, + "strings": [ + "

        This Talent also extends to any metal object because of Metallic Affinity

        " + ] + }, + { + "file": "9VfeubiCV83LN9iY.js", + "count": 1, + "strings": [ + "(When Charging)" + ] + }, + { + "file": "9WZa63lr0K3SsP4G.js", + "count": 1, + "strings": [ + "Applied after effects" + ] + }, + { + "file": "A6DcKPzAGntzSCil.js", + "count": 1, + "strings": [ + ")}!`}));\n\nthis.effect.updateSource({" + ] + }, + { + "file": "ACtDCTLZXmd5uXjX.js", + "count": 1, + "strings": [ + "Halve Damage? (Halves all damage other than fire, cold, and magic)" + ] + }, + { + "file": "AYEiCx2Es3QtMY28.js", + "count": 1, + "strings": [ + ", { permanent: true });\n }\n console.log(\"WISH LIST2\", choice1, items);\n actor.createEmbeddedDocuments(\"Item\", items);\n}\n\nasync function dialogChoice() {\n for (let c of choice1) \n {\n if (await foundry.applications.api.DialogV2.confirm({window : {title: \"Option\"}, content:" + ] + }, + { + "file": "CHnaBPHk6HdFS512.js", + "count": 1, + "strings": [ + "Choose Limb" + ] + }, + { + "file": "CIxZYkHggBQ6EsHP.js", + "count": 1, + "strings": [ + "Effect Used" + ] + }, + { + "file": "CS6O7UUjQcUJoOUP.js", + "count": 1, + "strings": [ + "must make a Willpower Test or fall @Condition[Prone]." + ] + }, + { + "file": "CbfUDhUr5R4UnPPq.js", + "count": 1, + "strings": [ + "Cannot remove Blinded condition." + ] + }, + { + "file": "ClkT2WG2UjVwQ97T.js", + "count": 1, + "strings": [ + "Received 1 Blinded Condition" + ] + }, + { + "file": "DWBxvzfWGcG7PVNP.js", + "count": 1, + "strings": [ + ";\n\nthis.item.updateSource({" + ] + }, + { + "file": "Dew3Ks9yC4DynSMi.js", + "count": 1, + "strings": [ + "|| args.weapon?.system?.attackType ===" + ] + }, + { + "file": "Dk4VF4UXSMK5SaVP.js", + "count": 1, + "strings": [ + "Activated to negate Fumble / Ratée" + ] + }, + { + "file": "E1vUepgop09FF5wy.js", + "count": 1, + "strings": [ + ")\n this.actor.setAdvantage(0)\n this.actor.createEmbeddedDocuments(\"Item\", [frenzy])\n}\nelse if (this.actor.system.status.advantage.value >= 1)\n{\n let data = hatred.toObject();\n data.system.specification.value = \"Close Combat opponents\"\n this.script.notification(" + ] + }, + { + "file": "E3om295BMQojnM2F.js", + "count": 1, + "strings": [ + "Removed Fatigued" + ] + }, + { + "file": "EJaBfqADqlo92Fx6.js", + "count": 1, + "strings": [ + "(To Be Determined)" + ] + }, + { + "file": "FKEH7DeqU0FH4dkk.js", + "count": 1, + "strings": [ + "})\nawait test.roll();\n\nif (test.failed) {\n \tthis.script.scriptMessage(await this.actor.applyBasicDamage(20, {suppressMsg: true}));\n this.script.scriptMessage(" + ] + }, + { + "file": "FPQp6XfbUH1BMafj.js", + "count": 1, + "strings": [ + "Cannot move or act this Turn" + ] + }, + { + "file": "FZFOC7bip0oiWEzk.js", + "count": 1, + "strings": [ + "Added Bleeding" + ] + }, + { + "file": "FiD3mvWIBHNNIuO9.js", + "count": 1, + "strings": [ + "Hit location changed to Head" + ] + }, + { + "file": "FqevMs0ukQ9WuUHl.js", + "count": 1, + "strings": [ + "})\n this.item.update({name :" + ] + }, + { + "file": "GFaTz8f6PBNWrlad.js", + "count": 1, + "strings": [ + ", context : {failure :" + ] + }, + { + "file": "GzSFlqL1YrIK1dxh.js", + "count": 1, + "strings": [ + "Select Wind" + ] + }, + { + "file": "GzsuEg7gZy1f0ljy.js", + "count": 1, + "strings": [ + ")\n bleeding.delete(); \n}\nelse \n{\n this.script.notification(" + ] + }, + { + "file": "HG2fKOfruT5QV3A4.js", + "count": 1, + "strings": [ + "})\n\nlet items = petty.map(i => i.toObject()).concat(arcane.map(i => {\n let spell = i.toObject();\n spell.img = `modules/wfrp4e-core/icons/spells/${lore}.png`\n spell.system.lore.value = lore;\n return spell;\n}));\n\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "HJ2X4ZtXei0BXbxf.js", + "count": 1, + "strings": [ + "Choose a Skill" + ] + }, + { + "file": "HmImVzvw6ecBy99l.js", + "count": 1, + "strings": [ + "Added Bleeding" + ] + }, + { + "file": "HoNTnPphrJISSQr1.js", + "count": 1, + "strings": [ + "Speak and be known to me" + ] + }, + { + "file": "IAGla7HJlYN0wa4H.js", + "count": 1, + "strings": [ + ") \n{\n if (args.test.failed)\n {\n this.actor.addSystemEffect(" + ] + }, + { + "file": "IN4ZFOPooqJtNuIQ.js", + "count": 1, + "strings": [ + "&& args.weapon?.system?.attackType !==" + ] + }, + { + "file": "J1FPDdrXGctKDTZz.js", + "count": 1, + "strings": [ + ")\n mrData = mr.toObject()\n mrData.system.specification.value = 2\n \n this.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "JXBUE0XuJOJNG7zE.js", + "count": 1, + "strings": [ + ",\n}\n\nlet test = await args.actor.setupSkill(" + ] + }, + { + "file": "JmZQRvdWjm9ykYfn.js", + "count": 1, + "strings": [ + "Cannot be Surprised" + ] + }, + { + "file": "KVpDUEjHhd3nLa0f.js", + "count": 1, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`})\nawait test.roll();\nif (test.failed)\n{\n this.script.message(await game.wfrp4e.tables.formatChatRoll(" + ] + }, + { + "file": "LOL2TGf8p8KxP14D.js", + "count": 1, + "strings": [ + ")[2]\nreturn args.type !=" + ] + }, + { + "file": "LXEUhHuXe8keEPI9.js", + "count": 1, + "strings": [ + "}, skipTargets: true, appendTitle : ` - ${this.effect.name}`})\nawait test.roll();\nif (test.failed)\n{\n\tlet stuns = Math.max(1, Math.abs(test.result.SL))\n\tthis.actor.addCondition(" + ] + }, + { + "file": "MKxYbHOrv0UuA7JB.js", + "count": 1, + "strings": [ + "- Wounded" + ] + }, + { + "file": "MOZn375tGD2060cC.js", + "count": 1, + "strings": [ + "armet-damage" + ] + }, + { + "file": "MPK7U4HLmIAsjdqs.js", + "count": 1, + "strings": [ + ": Ignore 2 APs" + ] + }, + { + "file": "Me1wS5XdqUEy7OGt.js", + "count": 1, + "strings": [ + ";\nlet crit = (await game.wfrp4e.tables.rollTable(critTable)).result;\n\nthis.script.message(" + ] + }, + { + "file": "MfxWXZwaZUjGSBqw.js", + "count": 1, + "strings": [ + "Immune to Ablaze" + ] + }, + { + "file": "Mir4FMHQRdVqazAF.js", + "count": 1, + "strings": [ + ";\n await args.actor.addCondition(\"entangled\");\n if (actorTaille <= 2)\n {\n msg +=" + ] + }, + { + "file": "MnqQkXVp20Lw84I1.js", + "count": 1, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty :" + ] + }, + { + "file": "Msygc7oQQPB5fw0b.js", + "count": 1, + "strings": [ + ")\n}\nelse \n{\n\tlet points = this.effect.sourceTest.result.overcast.usage.other.current;\n\tthis.actor.update({\"system.status.corruption.value\" : this.actor.system.status.corruption.value - points})\n\tthis.script.message(" + ] + }, + { + "file": "N2MeOlf0GjPiRcSb.js", + "count": 1, + "strings": [ + "Drops the item" + ] + }, + { + "file": "NTFpkiGyBpOtrV0s.js", + "count": 1, + "strings": [ + "})\nawait test.roll();\nif (test.failed)\n{\n\n let myRoll = await new Roll(\"1d10\").roll({allowInteractive : false});\n let duration = myRoll.total\n this.actor.addSystemEffect(\"nausea\");\n this.script.scriptMessage(" + ] + }, + { + "file": "O45vpR4jDbQQnmvJ.js", + "count": 1, + "strings": [ + "(Target)" + ] + }, + { + "file": "OEy2lxvic37dRBEt.js", + "count": 1, + "strings": [ + "})\n\nlet items = petty.concat(arcane).map(i => i.toObject())\n\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "OicQSEVZBbqLtrcf.js", + "count": 1, + "strings": [ + "Choose the Critical Wounds to heal (cannot reattach body parts)" + ] + }, + { + "file": "PGHvFHBIygB5pnWT.js", + "count": 1, + "strings": [ + ": Adds @Condition[Ablaze] Condition" + ] + }, + { + "file": "PeZYj8b0vedyJj00.js", + "count": 1, + "strings": [ + "Choose Lore" + ] + }, + { + "file": "PmELrzD3RmF9qKkO.js", + "count": 1, + "strings": [ + "Choose Taille" + ] + }, + { + "file": "Q68WiUWY7GxiXBbT.js", + "count": 1, + "strings": [ + "When Alone" + ] + }, + { + "file": "QBBrzcSAe8QqE4WP.js", + "count": 1, + "strings": [ + ",\n fields: {difficulty: \"challenging\"},\n context: {\n failure:" + ] + }, + { + "file": "QLUaOkwuSPvBp7jU.js", + "count": 1, + "strings": [ + "Cannot attack targets that are not Entangled" + ] + }, + { + "file": "QNxmImpLTou6WdMQ.js", + "count": 1, + "strings": [ + "Can make a Difficult (-10) Willpower Test to prevent the Miscast" + ] + }, + { + "file": "Qgn92fZyc3Psn8QJ.js", + "count": 1, + "strings": [ + ").pop())\n\n if (ones == 0) {\n ones = 10;\n }\n\n if (ones > SL) {\n args.test.data.result.SL =" + ] + }, + { + "file": "RKIFGN583PQnqHGk.js", + "count": 1, + "strings": [ + "Gained 2 Bleeding Conditions" + ] + }, + { + "file": "RSsGiDFibuqg3sHr.js", + "count": 1, + "strings": [ + "Choose a Disease" + ] + }, + { + "file": "RwMw848y13Jq2L4f.js", + "count": 1, + "strings": [ + "});\nawait test.roll();\nif (test.failed)\n{\n\tawait this.actor.addCondition(\"blinded\");\n}\n\nlet msg =" + ] + }, + { + "file": "S3Dev4hleOYqDNe9.js", + "count": 1, + "strings": [ + ")\n }\n else if (this.actor.characteristics.int.bonus + Number(args.test.result.SL) < 0)\n {\n args.test.result.other.push(" + ] + }, + { + "file": "SGr50Hq1AHIEzIFN.js", + "count": 1, + "strings": [ + "Choose Characteristic" + ] + }, + { + "file": "SKn61f2ykhzuwMdw.js", + "count": 1, + "strings": [ + "fumble-roll" + ] + }, + { + "file": "SLy1Fs3oXcHgFgjK.js", + "count": 1, + "strings": [ + "result.overcast.usage.other.current" + ] + }, + { + "file": "SThruXFhxUdNKCG4.js", + "count": 1, + "strings": [ + "});\nawait test.roll();\n\nif (test.failed) {\n this.actor.addCondition('stunned');\n}\n\nthis.script.scriptNotification(" + ] + }, + { + "file": "T0KBl8iEkcPq08RI.js", + "count": 1, + "strings": [ + ": Ignore Magical AP (" + ] + }, + { + "file": "TpgK2aAe93ui3Rbs.js", + "count": 1, + "strings": [ + "fumble-roll" + ] + }, + { + "file": "U26XMie3Kjoddisj.js", + "count": 1, + "strings": [ + "Cleared 1 Stunned Condition" + ] + }, + { + "file": "UsuwsmU1TUQLQVM2.js", + "count": 1, + "strings": [ + ")[0].toLowerCase();\nreturn !args.spell || (args.type ==" + ] + }, + { + "file": "UxVfVoH7cbC9ESDr.js", + "count": 1, + "strings": [ + ",\n fields: {difficulty: \"challenging\"},\n context: {\n failure:" + ] + }, + { + "file": "V9xm4X1x3lPYTQaI.js", + "count": 1, + "strings": [ + "Immune to Peur" + ] + }, + { + "file": "W9nyUNQStMr1pUHJ.js", + "count": 1, + "strings": [ + "Added Bleeding" + ] + }, + { + "file": "WO5n7Vbx8AgoVrwC.js", + "count": 1, + "strings": [ + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "WRe1eGmGVGejPcS8.js", + "count": 1, + "strings": [ + ")[2]\nreturn args.type ==" + ] + }, + { + "file": "WaeL2I8VVJmBBKHk.js", + "count": 1, + "strings": [ + "args.actor.addCondition(\"stunned\");\nargs.actor.corruptionDialog(\"moderate\");" + ] + }, + { + "file": "Y7McxsHFeGhwQx0J.js", + "count": 1, + "strings": [ + "damage.value" + ] + }, + { + "file": "YQ2LnLxp0xgy3meI.js", + "count": 1, + "strings": [ + "Gain additional +1 Corruption from" + ] + }, + { + "file": "YRUTliBzAQvncGNX.js", + "count": 1, + "strings": [ + "Added Fatigued" + ] + }, + { + "file": "YsUdMhQ2AArcJIqy.js", + "count": 1, + "strings": [ + ", { permanent: true });\n }\n actor.createEmbeddedDocuments(\"Item\", items);\n}\n\nasync function dialogChoice() {\n for (let c of choice1) \n {\n if (await foundry.applications.api.DialogV2.confirm({window : {title: \"Option\"}, content:" + ] + }, + { + "file": "YySjPfSAPdMAfjsh.js", + "count": 1, + "strings": [ + "Resistance (Magic)" + ] + }, + { + "file": "Z1zriXibT0mAmdhb.js", + "count": 1, + "strings": [ + "this.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "Z52yZDm6lP6fOP3O.js", + "count": 1, + "strings": [ + "Immune to Ablaze" + ] + }, + { + "file": "ZCrfdLPOxiNDCDSg.js", + "count": 1, + "strings": [ + "t use this.effect because it thinks it" + ] + }, + { + "file": "ZCuOjLAeENKN1Q4L.js", + "count": 1, + "strings": [ + "Halve Damage? (Halves Damage from all fire)" + ] + }, + { + "file": "b2Kb4IuD22RhKhR0.js", + "count": 1, + "strings": [ + "No target!" + ] + }, + { + "file": "bLkt8VpTTPoTxW0W.js", + "count": 1, + "strings": [ + "Added Bleeding" + ] + }, + { + "file": "bRtZH0xRh8dgqMeW.js", + "count": 1, + "strings": [ + ");\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "bT4gLrE3W36DIP4k.js", + "count": 1, + "strings": [ + ": Ignore +1 Metal Armour" + ] + }, + { + "file": "bgLeMqihLya2iobP.js", + "count": 1, + "strings": [ + "Can only be applied to River Troll." + ] + }, + { + "file": "cK1Jysfu5IMUUH0C.js", + "count": 1, + "strings": [ + "Ward improved to" + ] + }, + { + "file": "dWr3tkFoIzsAgelu.js", + "count": 1, + "strings": [ + "Injury reduces to" + ] + }, + { + "file": "dZ4c5pKDqQV02aIK.js", + "count": 1, + "strings": [ + "+ parseInt(this.effect.sourceTest.result.SL)" + ] + }, + { + "file": "ed7Sud9HM3uB2j6b.js", + "count": 1, + "strings": [ + "Yield or die!" + ] + }, + { + "file": "eh1J3s0s4A2AxoFp.js", + "count": 1, + "strings": [ + "(Enemy)" + ] + }, + { + "file": "ekjJQHyMbZT2vqdc.js", + "count": 1, + "strings": [ + ")\nthis.item.setFlag(\"wfrp4e\", \"uses\", uses);\nif (uses >= 3)\n{\n\tthis.effect.update({\"system.transferData.type\" : \"other\"})\n\tthis.script.notification(" + ] + }, + { + "file": "eqxE7nBO13yJS7hc.js", + "count": 1, + "strings": [ + "Wounds Healed" + ] + }, + { + "file": "ezGqDoC9hNRBnFTB.js", + "count": 1, + "strings": [ + "Choose a Weapon" + ] + }, + { + "file": "f29Pv6TQtgILxt1h.js", + "count": 1, + "strings": [ + ")\n }\n else if (this.actor.characteristics.int.bonus + args.test.result.SL < 0)\n args.test.result.other.push(" + ] + }, + { + "file": "fEFfHFeJxkR0aIJK.js", + "count": 1, + "strings": [ + "Everyone within 20 feet loses 1 Wound and makes a Difficult (-10) Résistance or gains @Condition[Deafened]" + ] + }, + { + "file": "g4t56A09yrpZaJQ2.js", + "count": 1, + "strings": [ + "ambre\";\n amberTalons.img = this.effect.img;\n amberTalons.system.damage.value = \"SB + WPB\"\n amberTalons.system.equipped = true;\n amberTalons.system.qualities.value.push({name : \"magical\"})\n amberTalons.effects.push({\n name : \"Serres d" + ] + }, + { + "file": "gMIenSmLklAkB2Zm.js", + "count": 1, + "strings": [ + ", Object.values(game.wfrp4e.config.difficultyNames));\n if (value)\n {\n this.item.updateSource({" + ] + }, + { + "file": "gPQrszvIgGlW9yM4.js", + "count": 1, + "strings": [ + ")\n args.test.preData.reversal = {allowed: true, if:" + ] + }, + { + "file": "ga6bQzPuoIiQQrKg.js", + "count": 1, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`, fields : {difficulty :" + ] + }, + { + "file": "hA8PzeiCsHqqlUZm.js", + "count": 1, + "strings": [ + "Gains @Condition[Nausea] for [[1d10]] hours" + ] + }, + { + "file": "hSImyYjL0CENTvXf.js", + "count": 1, + "strings": [ + "}});\nawait test.roll();\nif (test.failed)\n{\n\tawait this.actor.addCondition(\"blinded\");\n}\n\nlet msg =" + ] + }, + { + "file": "hYNWp75ggWSTht55.js", + "count": 1, + "strings": [ + "Can roll on the @Table[crithead]{Head Critical Hits} instead of the normal hit location" + ] + }, + { + "file": "hhv7PrRdlf9sfC82.js", + "count": 1, + "strings": [ + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "hpwJRAhCsXTp9bd9.js", + "count": 1, + "strings": [ + "hast)\",\n diff : {\n system : {\n advances : {\n value : 20\n }\n }\n }\n }\n]\n\nlet choice3 = [\n {\n type : \"skill\",\n name : \"Mêlée (Deux mains)\",\n diff : {\n system : {\n advances : {\n value : 20\n }\n }\n }\n }\n]\n\nlet choice = await foundry.applications.api.DialogV2.wait({\n window : {title : \"Choix\"},\n content :\n `

        \n Sélectionnez votre choix\n

        \n
          \n
        1. Mêlée (Base)
        2. \n
        3. Mêlée (Arme d" + ] + }, + { + "file": "hqMwzPozAVTzoCxa.js", + "count": 1, + "strings": [ + "fumble-roll" + ] + }, + { + "file": "iH9o7t8vGDn6pm1d.js", + "count": 1, + "strings": [ + "fumble-roll" + ] + }, + { + "file": "iO2hCDwyQ7v4qrOI.js", + "count": 1, + "strings": [ + ")\n }\n else if (this.actor.characteristics.int.bonus + args.test.result.SL < 0)\n args.test.result.other.push(" + ] + }, + { + "file": "id9ZdkERMZnZTWXt.js", + "count": 1, + "strings": [ + "Immune to Peur" + ] + }, + { + "file": "imKVsCy8rya2gkwO.js", + "count": 1, + "strings": [ + "duration.rounds" + ] + }, + { + "file": "inPxRSx0CDj1nwAm.js", + "count": 1, + "strings": [ + "Arcane Magic (Fire)" + ] + }, + { + "file": "jW87rmQLtROdVEhW.js", + "count": 1, + "strings": [ + "Rune of Goblin Bane: Impact Added" + ] + }, + { + "file": "kiJ6AiaYVUjt6aV6.js", + "count": 1, + "strings": [ + "Teeth Lost" + ] + }, + { + "file": "kvaN100w0nBUlLbj.js", + "count": 1, + "strings": [ + "Immune to Poisoned" + ] + }, + { + "file": "laptAldsT0Fm1rDt.js", + "count": 1, + "strings": [ + "

          Apply blunt damage reduction? (-3)

          " + ] + }, + { + "file": "mPxmCsXYirAIT913.js", + "count": 1, + "strings": [ + "Choose Characteristic" + ] + }, + { + "file": "mRvLsSVxNyt8LVZb.js", + "count": 1, + "strings": [ + "(To Be Determined)" + ] + }, + { + "file": "mlulnXQo8XU8vKLD.js", + "count": 1, + "strings": [ + "Enter Grim value" + ] + }, + { + "file": "mnvczEiu7gUSWvuV.js", + "count": 1, + "strings": [ + "critical-roll" + ] + }, + { + "file": "naF5EWr1CBkYRZTK.js", + "count": 1, + "strings": [ + "})\n\n if (choice)\n {\n args.abort =" + ] + }, + { + "file": "ngMm7SgtVqVovFJG.js", + "count": 1, + "strings": [ + "action-link critical" + ] + }, + { + "file": "nqWu0ZplxzRiUEAg.js", + "count": 1, + "strings": [ + ", {skipTargets: true, appendTitle : ` - ${this.effect.name}`})\nawait test.roll();\n\n// Kind of insane but whatever\nlet opposedResult = test.opposedMessages[0]?.system.opposedHandler?.resultMessage?.system.opposedTest?.result\n\nreturn opposedResult?.winner ==" + ] + }, + { + "file": "pR4Q2OnPxXtwRVli.js", + "count": 1, + "strings": [ + "Cannot suffer Critical Wounds" + ] + }, + { + "file": "pkKpxVqRHIzywerL.js", + "count": 1, + "strings": [ + "Resisted Ablaze" + ] + }, + { + "file": "pqQkeUVpuZ0jOKnZ.js", + "count": 1, + "strings": [ + "Rolled and applied mutations" + ] + }, + { + "file": "q0LvphC8RDSyR0oY.js", + "count": 1, + "strings": [ + "Choose Characteristic" + ] + }, + { + "file": "qAEZgtu5CrfUkxhx.js", + "count": 1, + "strings": [ + ")\n }\n else if (this.actor.characteristics.int.bonus + Number(args.test.result.SL) < 0)\n {\n args.test.result.other.push(" + ] + }, + { + "file": "qu194dVXm9Vx1TGk.js", + "count": 1, + "strings": [ + ").pop())\n\n if (ones > SL) {\n args.test.data.result.SL =" + ] + }, + { + "file": "rCh3ltUrUMovd2Kc.js", + "count": 1, + "strings": [ + "Cannot be surprised" + ] + }, + { + "file": "rX8FTinyTMj9WJri.js", + "count": 1, + "strings": [ + ")[0]});\n this.actor.addCondition(" + ] + }, + { + "file": "ramav4ymrDDkPKK4.js", + "count": 1, + "strings": [ + "Removed 1 Bleeding Condition" + ] + }, + { + "file": "rpxQU26BU7nwjtqY.js", + "count": 1, + "strings": [ + "}, skipTargets: true, appendTitle : \" - \" + this.effect.name, fields : {difficulty : \"average\"}})\nawait test.roll();\n\n\nif (location && test.failed)\n{\n let dropped = this.item.system.weaponsAtLocation;\n\n if (dropped.length)\n {\n this.script.notification(" + ] + }, + { + "file": "s6eZXfZkC1My6EXl.js", + "count": 1, + "strings": [ + ")[2].toLowerCase();\nif (args.item.type ==" + ] + }, + { + "file": "s8idWt9YdMTRfnjV.js", + "count": 1, + "strings": [ + ");\nthis.actor.createEmbeddedDocuments(" + ] + }, + { + "file": "sB4KB9bT3nQhAoqG.js", + "count": 1, + "strings": [ + "Choose Lore" + ] + }, + { + "file": "sNSfDBIA2k17hPYI.js", + "count": 1, + "strings": [ + "Ignore Ablaze" + ] + }, + { + "file": "sPvfYQEnyAYNpIhF.js", + "count": 1, + "strings": [ + "Are you humanoid creature who have not made a sacrifice to Rhya (or another diety of nature or powerful nature spirit to whom the cult of Rhya are well disposed, such as Isha or Taal) since the last spring equinox?" + ] + }, + { + "file": "sbK1a7txpSoXFzyB.js", + "count": 1, + "strings": [ + ").pop())\n\n if (ones == 0) {\n ones = 10;\n }\n\n\n if (ones > SL) {\n args.test.data.result.SL =" + ] + }, + { + "file": "sjnoYbWpAugyDilW.js", + "count": 1, + "strings": [ + "Animal becomes docile towards Humans, Elves who honour Isha, and similar allies." + ] + }, + { + "file": "tGVEV6TLl310mFLP.js", + "count": 1, + "strings": [ + ": Ignore Non-Magical AP (" + ] + }, + { + "file": "tUwP7TjrOOOnaCYJ.js", + "count": 1, + "strings": [ + ")\n fatigued.delete(); \n}\nelse \n{\n\tthis.script.notification(" + ] + }, + { + "file": "toSrgcvWq9b5eN0K.js", + "count": 1, + "strings": [ + "})\nthis.script.message(" + ] + }, + { + "file": "u46KnlxCjP42F6QY.js", + "count": 1, + "strings": [ + "Personality table not found" + ] + }, + { + "file": "ugL5IBB6R2yWyMWd.js", + "count": 1, + "strings": [ + "})\n if (apply)\n {\n \n let damage = 5 + this.actor.characteristics.wp.bonus;\n \n let loc = args.opposedTest.attackerTest.weapon?.system.usesHands[0] || \"rArm\";\n \n let APatLoc = args.opposedTest.attacker.system.status.armour[loc];\n \n let metalAP = APatLoc.layers.reduce((metal, layer) => metal += (layer.metal ? layer.value : 0), 0)\n \n let APused = Math.max(0, APatLoc.value - metalAP); // remove metal AP at location;\n \n damage -= (APused + args.opposedTest.attacker.system.characteristics.t.bonus)\n \n let msg = await args.opposedTest.attacker.applyBasicDamage(damage, {suppressMsg : true, damageType : game.wfrp4e.config.DAMAGE_TYPE.IGNORE_ALL});\n msg +=" + ] + }, + { + "file": "ulXfbycWUu36vdmS.js", + "count": 1, + "strings": [ + ", fields : {difficulty : \"difficult\", slBonus : -1 * this.effect.sourceTest.result.SL}})\nawait test.roll();\nif (test.succeeded)\n{\n\tthis.script.notification(" + ] + }, + { + "file": "v5xrDWcrTNFJkyQB.js", + "count": 1, + "strings": [ + "Add Option?\n

          \n Projectiles (Bow) +10 and a Longbow with 12 Arrows\n

          " + ] + }, + { + "file": "vFUVWZ1l8wpTjLcx.js", + "count": 1, + "strings": [ + "Target has higher Willpower, no effect" + ] + }, + { + "file": "vc4bELo0cWYoILfB.js", + "count": 1, + "strings": [ + "Choose a disease to heal (must be naturally occuring)" + ] + }, + { + "file": "ve3RcfTi49rdYZU0.js", + "count": 1, + "strings": [ + "- Wounded" + ] + }, + { + "file": "vejhfB9aI58iF1vr.js", + "count": 1, + "strings": [ + ", { permanent: true });\n }\n console.log(\"WISH LIST2\", choice1, items);\n actor.createEmbeddedDocuments(\"Item\", items);\n}\n\nasync function dialogChoice() {\n for (let c of choice1) \n {\n if (await foundry.applications.api.DialogV2.confirm({window : {title: \"Option\"}, content:" + ] + }, + { + "file": "vgfs0DXvF5iKrz1M.js", + "count": 1, + "strings": [ + "|| this.item.getFlag(" + ] + }, + { + "file": "vuzRRj5d9XdNYx3o.js", + "count": 1, + "strings": [ + "Removed Broken" + ] + }, + { + "file": "wyTCozh9qGTx6yK0.js", + "count": 1, + "strings": [ + "Does not need to make Peur or Terror tests" + ] + }, + { + "file": "x1Ecj6MXY94kpcQq.js", + "count": 1, + "strings": [ + ",\"info\")\n}\n\nconst runesOfRestoration = this.item.effects.contents.filter(e => e.name == this.effect.name)\nconst restorationWounds = parseInt(runesOfRestoration.length * this.actor.system.characteristics.t.bonus)\n\nthis.actor.modifyWounds(restorationWounds)\nthis.script.message(" + ] + }, + { + "file": "yzN7ZNlgCiSVJqsU.js", + "count": 1, + "strings": [ + "Applied after effects" + ] + }, + { + "file": "zK38Rl5t9zbFi4Se.js", + "count": 1, + "strings": [ + "Added Bleeding" + ] + }, + { + "file": "zadppy7FEbXvgUON.js", + "count": 1, + "strings": [ + ", {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(" + ] + }, + { + "file": "zxG5KbliWE9xWNQD.js", + "count": 1, + "strings": [ + "Automatically passes any" + ] + } +] \ No newline at end of file diff --git a/tools/extract-translations.js b/tools/extract-translations.js new file mode 100644 index 0000000..d9aefba --- /dev/null +++ b/tools/extract-translations.js @@ -0,0 +1,216 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const WFRP4E_DIR = '/home/morr/work/foundryvtt/WFRP4e-FoundryVTT/scripts'; +const FR_DIR = path.join(__dirname, 'scripts'); + +// Fonction pour extraire les chaînes de caractères d'un fichier +function extractStrings(content) { + const strings = new Set(); + + // Patterns pour capturer les chaînes entre guillemets + const patterns = [ + /"([^"]{3,})"/g, // Double quotes + /'([^']{3,})'/g, // Single quotes + /`([^`]{3,})`/g // Backticks (sans interpolation) + ]; + + patterns.forEach(pattern => { + const matches = content.matchAll(pattern); + for (const match of matches) { + const str = match[1].trim(); + // Ignorer les chaînes trop courtes, les nombres, les IDs techniques + if (str.length > 2 && + !str.match(/^[0-9a-f]{16}$/i) && + !str.match(/^[0-9]+$/) && + !str.match(/^[a-z]+$/)) { + strings.add(str); + } + } + }); + + return Array.from(strings); +} + +// Comparer deux fichiers et extraire les traductions +function compareFiles(enFile, frFile) { + const enContent = fs.readFileSync(enFile, 'utf8'); + const frContent = fs.readFileSync(frFile, 'utf8'); + + const enStrings = extractStrings(enContent); + const frStrings = extractStrings(frContent); + + const translations = []; + + // Chercher les différences qui pourraient être des traductions + enStrings.forEach(enStr => { + // Si la chaîne anglaise n'est pas dans le fichier FR + if (!frStrings.includes(enStr)) { + // Chercher une chaîne FR qui pourrait correspondre + // (même longueur approximative, même structure) + const possibleTranslations = frStrings.filter(frStr => { + // Vérifier si la structure est similaire + const lengthRatio = frStr.length / enStr.length; + return lengthRatio > 0.5 && lengthRatio < 2.0; + }); + + if (possibleTranslations.length > 0) { + // Pour l'instant, on stocke toutes les possibilités + possibleTranslations.forEach(frStr => { + translations.push({ en: enStr, fr: frStr }); + }); + } + } + }); + + return translations; +} + +// Analyser tous les fichiers +function analyzeAllScripts() { + const enFiles = fs.readdirSync(WFRP4E_DIR).filter(f => f.endsWith('.js')); + const frFiles = fs.readdirSync(FR_DIR).filter(f => f.endsWith('.js')); + + const allTranslations = new Map(); // en -> Set(fr) + let filesCompared = 0; + let filesWithTranslations = 0; + + console.log('Analyse des scripts...\n'); + + enFiles.forEach(file => { + if (frFiles.includes(file)) { + filesCompared++; + const enPath = path.join(WFRP4E_DIR, file); + const frPath = path.join(FR_DIR, file); + + const translations = compareFiles(enPath, frPath); + + if (translations.length > 0) { + filesWithTranslations++; + translations.forEach(({ en, fr }) => { + if (!allTranslations.has(en)) { + allTranslations.set(en, new Set()); + } + allTranslations.get(en).add(fr); + }); + } + } + }); + + console.log(`Fichiers comparés : ${filesCompared}`); + console.log(`Fichiers avec traductions détectées : ${filesWithTranslations}`); + console.log(`Paires de traduction uniques : ${allTranslations.size}\n`); + + return allTranslations; +} + +// Filtrer les traductions cohérentes +function filterReliableTranslations(translationsMap) { + const reliable = new Map(); + + for (const [en, frSet] of translationsMap.entries()) { + // Si une chaîne anglaise a toujours la même traduction, c'est fiable + if (frSet.size === 1) { + reliable.set(en, Array.from(frSet)[0]); + } + // Si elle a plusieurs traductions mais une dominante (>50%), on la garde + else if (frSet.size <= 3) { + const frArray = Array.from(frSet); + reliable.set(en, frArray[0]); // Pour l'instant, on prend la première + } + } + + return reliable; +} + +// Chercher les occurrences dans les scripts FR +function findUntranslatedInFR(translations) { + const frFiles = fs.readdirSync(FR_DIR).filter(f => f.endsWith('.js')); + const opportunities = []; + + console.log('Recherche des chaînes non traduites dans les scripts FR...\n'); + + frFiles.forEach(file => { + const filePath = path.join(FR_DIR, file); + const content = fs.readFileSync(filePath, 'utf8'); + + for (const [en, fr] of translations.entries()) { + if (content.includes(en)) { + opportunities.push({ + file, + en, + fr + }); + } + } + }); + + return opportunities; +} + +// Main +console.log('Extraction des traductions déjà effectuées...\n'); +console.log('='.repeat(60) + '\n'); + +const allTranslations = analyzeAllScripts(); +const reliableTranslations = filterReliableTranslations(allTranslations); + +console.log('='.repeat(60)); +console.log(`Traductions fiables identifiées : ${reliableTranslations.size}\n`); + +// Afficher un échantillon +let count = 0; +console.log('Échantillon des traductions détectées :'); +console.log('-'.repeat(60)); +for (const [en, fr] of reliableTranslations.entries()) { + if (count++ < 20) { + console.log(`"${en}" → "${fr}"`); + } +} +if (reliableTranslations.size > 20) { + console.log(`... et ${reliableTranslations.size - 20} autres\n`); +} + +// Chercher les opportunités d'application +console.log('\n' + '='.repeat(60)); +const opportunities = findUntranslatedInFR(reliableTranslations); + +console.log(`Opportunités de traduction trouvées : ${opportunities.length}\n`); + +// Regrouper par fichier +const byFile = new Map(); +opportunities.forEach(({ file, en, fr }) => { + if (!byFile.has(file)) { + byFile.set(file, []); + } + byFile.get(file).push({ en, fr }); +}); + +console.log('Fichiers avec opportunités de traduction :'); +console.log('-'.repeat(60)); +for (const [file, trans] of byFile.entries()) { + console.log(`${file} : ${trans.length} traduction(s) à appliquer`); +} + +// Sauvegarder les résultats +const results = { + reliableTranslations: Object.fromEntries(reliableTranslations), + opportunities: Array.from(byFile.entries()).map(([file, trans]) => ({ + file, + translations: trans + })) +}; + +fs.writeFileSync( + path.join(__dirname, 'translation-opportunities.json'), + JSON.stringify(results, null, 2), + 'utf8' +); + +console.log('\n' + '='.repeat(60)); +console.log('Résultats sauvegardés dans translation-opportunities.json'); +console.log('='.repeat(60)); diff --git a/tools/find-english-texts.js b/tools/find-english-texts.js new file mode 100644 index 0000000..6dcbcef --- /dev/null +++ b/tools/find-english-texts.js @@ -0,0 +1,216 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const FR_DIR = path.join(__dirname, 'scripts'); + +// Mots anglais communs pour détecter du texte en anglais +const englishWords = [ + 'the', 'and', 'or', 'to', 'from', 'with', 'without', 'has', 'have', 'had', + 'is', 'are', 'was', 'were', 'been', 'being', 'will', 'would', 'should', + 'can', 'could', 'may', 'might', 'must', 'shall', + 'this', 'that', 'these', 'those', 'what', 'which', 'who', 'when', 'where', + 'not', 'all', 'any', 'each', 'every', 'some', 'other', 'another', + 'gain', 'gained', 'lose', 'lost', 'add', 'added', 'remove', 'removed', + 'take', 'taken', 'give', 'given', 'make', 'made', 'find', 'found', + 'get', 'got', 'set', 'put', 'use', 'used', 'using', + 'apply', 'applied', 'test', 'tested', 'roll', 'rolled', + 'if', 'else', 'while', 'for', 'return', // Mots-clés JS à ignorer dans le code + 'failed', 'passed', 'success', 'failure', 'check', 'checked', + 'attack', 'damage', 'heal', 'healed', 'wound', 'wounded', + 'spell', 'cast', 'casting', 'magic', 'effect', 'affected', + 'target', 'targets', 'hit', 'miss', 'critical', + 'weapon', 'armour', 'armor', 'shield', 'equipped', + 'skill', 'talent', 'trait', 'ability', 'bonus', + 'enter', 'choose', 'select', 'click', 'press', + 'must', 'need', 'require', 'required', 'cannot', 'unable', + 'ignore', 'ignored', 'prevent', 'prevented', 'resist', 'resisted', + 'duration', 'permanent', 'temporary', 'condition', 'status', + 'character', 'actor', 'creature', 'enemy', 'ally', + 'during', 'until', 'after', 'before', 'when', 'while' +]; + +// Patterns de textes techniques à ignorer (clés, IDs, etc.) +const technicalPatterns = [ + /^[a-z]+$/, // Tout en minuscules (probablement une clé) + /^[0-9]+$/, // Que des chiffres + /^[0-9a-f]{16}$/i, // Hash/ID + /^[a-z_]+$/, // snake_case (clé technique) + /^[a-z][a-zA-Z]+$/, // camelCase (clé technique) + /^\$\{.*\}$/, // Template literal variable + /^system\./, // Chemin système + /^wfrp4e/, // Préfixe système + /^@/, // Référence (ex: @Condition) + /^[A-Z]{2,}$/, // Acronymes courts + /^[\w-]{1,10}$/, // Clés courtes +]; + +// Fonction pour extraire les chaînes d'un fichier +function extractStrings(content) { + const strings = new Set(); + + // Patterns pour capturer les chaînes entre guillemets + // On évite les template literals complexes avec interpolation + const patterns = [ + /"([^"]{3,})"/g, // Double quotes + /'([^']{3,})'/g, // Single quotes + ]; + + patterns.forEach(pattern => { + const matches = content.matchAll(pattern); + for (const match of matches) { + const str = match[1].trim(); + if (str.length > 2) { + strings.add(str); + } + } + }); + + // Pour les template literals, on cherche ceux sans interpolation ou simples + const backtickPattern = /`([^`\$]{3,})`/g; + const backtickMatches = content.matchAll(backtickPattern); + for (const match of backtickMatches) { + const str = match[1].trim(); + if (str.length > 2) { + strings.add(str); + } + } + + return Array.from(strings); +} + +// Fonction pour détecter si une chaîne est probablement du texte en anglais +function isEnglishText(str) { + // Ignorer les patterns techniques + for (const pattern of technicalPatterns) { + if (pattern.test(str)) { + return false; + } + } + + // Ignorer les chaînes trop courtes + if (str.length < 3) { + return false; + } + + // Convertir en minuscules pour la comparaison + const lowerStr = str.toLowerCase(); + + // Vérifier la présence de mots anglais + const words = lowerStr.split(/\W+/); + const englishWordCount = words.filter(word => + englishWords.includes(word) && word.length > 1 + ).length; + + // Si au moins 1 mot anglais significatif est trouvé, c'est probablement de l'anglais + if (englishWordCount > 0) { + return true; + } + + // Patterns de phrases anglaises typiques + const englishPhrases = [ + /\b(the|a|an)\s+\w+/i, + /\b(cannot|can't|won't|don't|doesn't)\b/i, + /\b(must|should|will|would)\s+\w+/i, + /\b(has|have|had)\s+(been|gained|lost|acquired)/i, + /\b(enter|choose|select)\s+\w+/i, + /\b(rolled?|passed?|failed?)\b/i, + ]; + + for (const pattern of englishPhrases) { + if (pattern.test(str)) { + return true; + } + } + + return false; +} + +// Fonction pour filtrer les faux positifs évidents +function shouldIgnore(str) { + // Ignorer les chemins et références système + if (str.includes('Compendium.') || str.includes('UUID[')) { + return true; + } + + // Ignorer les noms de propriétés système + if (str.match(/^(system|flags|data|items|effects|actor|token)\./)) { + return true; + } + + // Ignorer les expressions JavaScript + if (str.match(/^(let|const|var|function|return|if|else|for|while)\b/)) { + return true; + } + + return false; +} + +// Analyser tous les fichiers +function analyzeScripts() { + const files = fs.readdirSync(FR_DIR).filter(f => f.endsWith('.js')); + const results = []; + + console.log(`Analyse de ${files.length} fichiers...\n`); + + files.forEach(file => { + const filePath = path.join(FR_DIR, file); + const content = fs.readFileSync(filePath, 'utf8'); + const strings = extractStrings(content); + + const englishStrings = strings.filter(str => { + if (shouldIgnore(str)) return false; + return isEnglishText(str); + }); + + if (englishStrings.length > 0) { + results.push({ + file, + count: englishStrings.length, + strings: englishStrings + }); + } + }); + + return results; +} + +// Main +console.log('Recherche des textes anglais dans les scripts FR...\n'); +console.log('='.repeat(60)); + +const results = analyzeScripts(); + +console.log('\n' + '='.repeat(60)); +console.log(`Fichiers avec du texte anglais : ${results.length}\n`); + +// Trier par nombre de chaînes anglaises (décroissant) +results.sort((a, b) => b.count - a.count); + +// Afficher les résultats +let totalStrings = 0; +results.forEach(({ file, count, strings }) => { + totalStrings += count; + console.log(`\n${file} (${count} texte(s) anglais) :`); + console.log('-'.repeat(60)); + strings.forEach(str => { + // Limiter la longueur affichée + const displayStr = str.length > 80 ? str.substring(0, 77) + '...' : str; + console.log(` • ${displayStr}`); + }); +}); + +console.log('\n' + '='.repeat(60)); +console.log('Résumé :'); +console.log('-'.repeat(60)); +console.log(`Fichiers avec texte anglais : ${results.length}/${fs.readdirSync(FR_DIR).filter(f => f.endsWith('.js')).length}`); +console.log(`Total de textes anglais détectés : ${totalStrings}`); +console.log('='.repeat(60)); + +// Sauvegarder dans un fichier JSON +const outputFile = path.join(__dirname, 'english-texts-found.json'); +fs.writeFileSync(outputFile, JSON.stringify(results, null, 2), 'utf8'); +console.log(`\nRésultats sauvegardés dans : english-texts-found.json`); diff --git a/tools/generate-review-report.js b/tools/generate-review-report.js new file mode 100644 index 0000000..920ccbd --- /dev/null +++ b/tools/generate-review-report.js @@ -0,0 +1,103 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const WFRP4E_SCRIPTS = '/home/morr/work/foundryvtt/WFRP4e-FoundryVTT/scripts'; +const FR_SCRIPTS = '/home/morr/work/foundryvtt/foundryvtt-wh4-lang-fr-fr/scripts'; +const REVIEW_FILE = path.join(__dirname, 'scripts-to-review.json'); +const REPORT_FILE = path.join(__dirname, 'review-comparison.md'); + +const scriptsToReview = JSON.parse(fs.readFileSync(REVIEW_FILE, 'utf-8')); + +let report = `# Scripts nécessitant révision manuelle\n\n`; +report += `Total de scripts: ${scriptsToReview.length}\n\n`; +report += `Ces scripts contiennent des traductions en français mais ont été modifiés dans WFRP4E.\n`; +report += `Ils nécessitent une révision manuelle pour intégrer les changements tout en préservant les traductions.\n\n`; +report += `---\n\n`; + +scriptsToReview.forEach(({file}, index) => { + const wfrp4ePath = path.join(WFRP4E_SCRIPTS, file); + const frPath = path.join(FR_SCRIPTS, file); + + const wfrp4eContent = fs.readFileSync(wfrp4ePath, 'utf-8'); + const frContent = fs.readFileSync(frPath, 'utf-8'); + + report += `## ${index + 1}. ${file}\n\n`; + + // Extraire les différences notables + const wfrp4eLines = wfrp4eContent.split('\n').length; + const frLines = frContent.split('\n').length; + + report += `- **Lignes WFRP4E**: ${wfrp4eLines}\n`; + report += `- **Lignes FR**: ${frLines}\n`; + report += `- **Différence**: ${wfrp4eLines - frLines} lignes\n\n`; + + // Extraire les textes notables + const wfrp4eTexts = extractNotableTexts(wfrp4eContent); + const frTexts = extractNotableTexts(frContent); + + if (wfrp4eTexts.length > 0 || frTexts.length > 0) { + report += `### Textes identifiés\n\n`; + + if (wfrp4eTexts.length > 0) { + report += `**WFRP4E (anglais)**:\n`; + wfrp4eTexts.forEach(text => { + report += `- \`${text}\`\n`; + }); + report += `\n`; + } + + if (frTexts.length > 0) { + report += `**FR (français)**:\n`; + frTexts.forEach(text => { + report += `- \`${text}\`\n`; + }); + report += `\n`; + } + } + + // Afficher le code côte à côte si court + if (wfrp4eLines < 30 && frLines < 30) { + report += `### Code WFRP4E\n\n\`\`\`javascript\n${wfrp4eContent}\n\`\`\`\n\n`; + report += `### Code FR\n\n\`\`\`javascript\n${frContent}\n\`\`\`\n\n`; + } + + report += `### Actions recommandées\n\n`; + report += `- [ ] Vérifier les changements structurels dans WFRP4E\n`; + report += `- [ ] Intégrer les modifications tout en gardant les traductions FR\n`; + report += `- [ ] Tester le script après modification\n\n`; + report += `---\n\n`; +}); + +function extractNotableTexts(content) { + const texts = new Set(); + + // Patterns pour extraire les textes + const patterns = [ + /ui\.notifications\.(info|warn|error|notify)\s*\(\s*["'`]([^"'`]+)["'`]/g, + /this\.script\.(scriptNotification|scriptMessage|notification)\s*\(\s*["'`]([^"'`]+)["'`]/g, + /["'`](Loading|Could not find|Chargement|Impossible de trouver|créé|modifié|supprimé)[^"'`]*["'`]/gi + ]; + + patterns.forEach(pattern => { + const matches = content.matchAll(pattern); + for (const match of matches) { + const text = match[2] || match[1]; + if (text && text.length > 3 && text.length < 100) { + texts.add(text); + } + } + }); + + return Array.from(texts); +} + +fs.writeFileSync(REPORT_FILE, report, 'utf-8'); + +console.log(`\nRapport de révision généré: ${REPORT_FILE}`); +console.log(`\nNombre de scripts à réviser: ${scriptsToReview.length}`); +console.log(`\nOuvrez le fichier avec votre éditeur préféré pour réviser les scripts.`); +console.log(`Vous pouvez aussi utiliser un outil de diff comme 'meld' ou 'kdiff3' pour comparer:`); +console.log(`\nExemple:`); +console.log(` meld ${FR_SCRIPTS}/${scriptsToReview[0].file} ${WFRP4E_SCRIPTS}/${scriptsToReview[0].file}`); diff --git a/tools/generate-translation-report.js b/tools/generate-translation-report.js new file mode 100644 index 0000000..03bb59f --- /dev/null +++ b/tools/generate-translation-report.js @@ -0,0 +1,193 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +const WFRP4E_DIR = '/home/morr/work/foundryvtt/WFRP4e-FoundryVTT/scripts'; +const FR_DIR = path.join(__dirname, 'scripts'); +const TRANSLATIONS_FILE = path.join(__dirname, 'auto-translations-applied.json'); + +// Charger le mapping de traductions +const translations = JSON.parse(fs.readFileSync(TRANSLATIONS_FILE, 'utf8')); + +// Fonction pour générer le diff d'un fichier +function generateFileDiff(file) { + const frPath = path.join(FR_DIR, file); + const enPath = path.join(WFRP4E_DIR, file); + + if (!fs.existsSync(frPath) || !fs.existsSync(enPath)) { + return null; + } + + const frContent = fs.readFileSync(frPath, 'utf8'); + const enContent = fs.readFileSync(enPath, 'utf8'); + + const changes = []; + + // Trouver les traductions appliquées dans ce fichier + for (const [en, fr] of Object.entries(translations)) { + if (frContent.includes(fr) && enContent.includes(en)) { + changes.push({ en, fr }); + } + } + + return { + file, + changes, + frLines: frContent.split('\n').length, + enLines: enContent.split('\n').length + }; +} + +// Générer le rapport +console.log('Génération du rapport de traduction...\n'); + +const modifiedFiles = []; + +// Lire tous les fichiers JS du répertoire FR +const files = fs.readdirSync(FR_DIR).filter(f => f.endsWith('.js')); + +files.forEach(file => { + const diff = generateFileDiff(file); + if (diff && diff.changes.length > 0) { + modifiedFiles.push(diff); + } +}); + +// Trier par nombre de changements (décroissant) +modifiedFiles.sort((a, b) => b.changes.length - a.changes.length); + +// Générer le rapport Markdown +let report = `# Rapport de Traduction Automatique\n\n`; +report += `**Date**: ${new Date().toLocaleDateString('fr-FR')}\n\n`; +report += `**Fichiers modifiés**: ${modifiedFiles.length}\n`; +report += `**Traductions uniques appliquées**: ${Object.keys(translations).length}\n\n`; +report += `---\n\n`; + +// Statistiques globales +const totalChanges = modifiedFiles.reduce((sum, file) => sum + file.changes.length, 0); +report += `## Statistiques\n\n`; +report += `- **Total de fichiers analysés**: ${files.length}\n`; +report += `- **Fichiers modifiés**: ${modifiedFiles.length}\n`; +report += `- **Total de changements**: ${totalChanges}\n`; +report += `- **Moyenne de changements par fichier**: ${(totalChanges / modifiedFiles.length).toFixed(2)}\n\n`; + +// Top 20 des fichiers les plus modifiés +report += `## Top 20 des fichiers les plus modifiés\n\n`; +report += `| Fichier | Changements |\n`; +report += `|---------|-------------|\n`; +modifiedFiles.slice(0, 20).forEach(({ file, changes }) => { + report += `| ${file} | ${changes.length} |\n`; +}); +report += `\n`; + +// Traductions les plus fréquentes +const translationFrequency = new Map(); +modifiedFiles.forEach(({ changes }) => { + changes.forEach(({ en, fr }) => { + const key = `${en} → ${fr}`; + translationFrequency.set(key, (translationFrequency.get(key) || 0) + 1); + }); +}); + +const sortedTranslations = Array.from(translationFrequency.entries()) + .sort((a, b) => b[1] - a[1]) + .slice(0, 30); + +report += `## Top 30 des traductions les plus appliquées\n\n`; +report += `| Traduction | Occurrences |\n`; +report += `|------------|-------------|\n`; +sortedTranslations.forEach(([translation, count]) => { + const [en, fr] = translation.split(' → '); + const enShort = en.length > 60 ? en.substring(0, 57) + '...' : en; + const frShort = fr.length > 60 ? fr.substring(0, 57) + '...' : fr; + report += `| \`${enShort}\` → \`${frShort}\` | ${count} |\n`; +}); +report += `\n`; + +// Détails par fichier (exemples significatifs) +report += `## Exemples de modifications détaillées\n\n`; +report += `Voici quelques exemples de fichiers avec leurs traductions appliquées :\n\n`; + +modifiedFiles.slice(0, 10).forEach(({ file, changes }) => { + report += `### ${file}\n\n`; + report += `**Nombre de traductions**: ${changes.length}\n\n`; + + changes.slice(0, 5).forEach(({ en, fr }) => { + const enDisplay = en.length > 80 ? en.substring(0, 77) + '...' : en; + const frDisplay = fr.length > 80 ? fr.substring(0, 77) + '...' : fr; + report += `- ✏️ \`${enDisplay}\`\n`; + report += ` → \`${frDisplay}\`\n\n`; + }); + + if (changes.length > 5) { + report += `... et ${changes.length - 5} autre(s) traduction(s)\n\n`; + } +}); + +// Traductions potentiellement problématiques +report += `## ⚠️ Traductions à vérifier\n\n`; +report += `Certaines traductions automatiques peuvent nécessiter une révision manuelle :\n\n`; + +const problematicPatterns = [ + { pattern: /effet\./, reason: "Vérifier que 'effect' -> 'effet' est approprié dans le contexte" }, + { pattern: /Retiré/, reason: "Vérifier l'accord (retiré/retirée/retirés/retirées)" }, + { pattern: /Ajouté/, reason: "Vérifier l'accord (ajouté/ajoutée/ajoutés/ajoutées)" }, + { pattern: /Appliqué/, reason: "Vérifier l'accord (appliqué/appliquée/appliqués/appliquées)" }, +]; + +const filesToReview = new Map(); + +modifiedFiles.forEach(({ file, changes }) => { + changes.forEach(({ fr }) => { + problematicPatterns.forEach(({ pattern, reason }) => { + if (pattern.test(fr)) { + if (!filesToReview.has(reason)) { + filesToReview.set(reason, []); + } + filesToReview.get(reason).push({ file, translation: fr }); + } + }); + }); +}); + +for (const [reason, items] of filesToReview.entries()) { + report += `### ${reason}\n\n`; + const uniqueItems = [...new Map(items.map(item => [item.file, item])).values()].slice(0, 10); + uniqueItems.forEach(({ file, translation }) => { + const transShort = translation.length > 80 ? translation.substring(0, 77) + '...' : translation; + report += `- **${file}**: \`${transShort}\`\n`; + }); + if (items.length > 10) { + report += `\n... et ${items.length - 10} autre(s) occurrence(s)\n`; + } + report += `\n`; +} + +// Recommandations +report += `## 📋 Recommandations\n\n`; +report += `1. **Vérifier les accords grammaticaux** : Les participes passés (ajouté, retiré, appliqué) doivent s'accorder avec leur sujet.\n`; +report += `2. **Vérifier les contextes** : Certains mots comme "effect" peuvent être du code (à ne pas traduire) ou du texte (à traduire).\n`; +report += `3. **Tester en jeu** : Vérifier que les messages affichés aux joueurs sont grammaticalement corrects.\n`; +report += `4. **Révision manuelle** : Consulter les fichiers avec le plus de changements pour s'assurer de la cohérence.\n\n`; + +// Sauvegarder le rapport +const reportFile = path.join(__dirname, 'rapport-traduction-automatique.md'); +fs.writeFileSync(reportFile, report, 'utf8'); + +console.log('='.repeat(60)); +console.log('Rapport généré avec succès !'); +console.log('='.repeat(60)); +console.log(`Fichier : rapport-traduction-automatique.md`); +console.log(`\nStatistiques :`); +console.log(`- ${modifiedFiles.length} fichiers modifiés`); +console.log(`- ${totalChanges} changements au total`); +console.log(`- ${Object.keys(translations).length} traductions uniques`); +console.log('='.repeat(60)); + +// Afficher un aperçu du rapport +console.log('\n📄 APERÇU DU RAPPORT\n'); +console.log(report.split('\n').slice(0, 50).join('\n')); +console.log('\n... (voir le fichier complet pour plus de détails)'); diff --git a/tools/replace-review-scripts.js b/tools/replace-review-scripts.js new file mode 100644 index 0000000..33a9bd9 --- /dev/null +++ b/tools/replace-review-scripts.js @@ -0,0 +1,154 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const WFRP4E_SCRIPTS = '/home/morr/work/foundryvtt/WFRP4e-FoundryVTT/scripts'; +const FR_SCRIPTS = '/home/morr/work/foundryvtt/foundryvtt-wh4-lang-fr-fr/scripts'; +const REVIEW_FILE = path.join(__dirname, 'scripts-to-review.json'); +const OUTPUT_FILE = path.join(__dirname, 'scripts-replaced-list.md'); + +const scriptsToReview = JSON.parse(fs.readFileSync(REVIEW_FILE, 'utf-8')); + +console.log(`\n=== REMPLACEMENT DES SCRIPTS PAR LES VERSIONS SYSTÈME ===\n`); +console.log(`Nombre de scripts à remplacer: ${scriptsToReview.length}\n`); + +let replaced = 0; +let errors = []; +const replacedList = []; + +scriptsToReview.forEach(({file, reason}, index) => { + const wfrp4ePath = path.join(WFRP4E_SCRIPTS, file); + const frPath = path.join(FR_SCRIPTS, file); + const backupPath = frPath + '.fr-backup'; + + try { + // Sauvegarder la version FR avec traductions + if (fs.existsSync(frPath)) { + fs.copyFileSync(frPath, backupPath); + } + + // Remplacer par la version WFRP4E + if (fs.existsSync(wfrp4ePath)) { + fs.copyFileSync(wfrp4ePath, frPath); + replaced++; + + // Extraire les textes traduits de la sauvegarde pour référence + const frContent = fs.readFileSync(backupPath, 'utf-8'); + const translations = extractTranslations(frContent); + + replacedList.push({ + index: index + 1, + file, + translations + }); + + console.log(`✓ [${index + 1}/${scriptsToReview.length}] ${file}`); + } else { + errors.push(`Source non trouvée: ${file}`); + console.log(`✗ [${index + 1}/${scriptsToReview.length}] ${file} - Source non trouvée`); + } + } catch (error) { + errors.push(`${file}: ${error.message}`); + console.log(`✗ [${index + 1}/${scriptsToReview.length}] ${file} - Erreur: ${error.message}`); + } +}); + +function extractTranslations(content) { + const translations = []; + + // Patterns pour extraire les textes en français + const patterns = [ + /ui\.notifications\.(info|warn|error|notify)\s*\(\s*["'`]([^"'`]+)["'`]/g, + /this\.script\.(scriptNotification|scriptMessage|notification)\s*\(\s*["'`]([^"'`]+)["'`]/g, + /["'`](Chargement|Impossible|Êtes-vous|Voulez-vous|créé|modifié|supprimé|Erreur)[^"'`]*["'`]/gi, + /warhammer\.utility\.findAllItems\([^,]+,\s*["'`]([^"'`]+)["'`]/g + ]; + + patterns.forEach(pattern => { + const regex = new RegExp(pattern.source, pattern.flags); + let match; + while ((match = regex.exec(content)) !== null) { + const text = match[2] || match[1]; + if (text && text.length > 3 && /[a-zàâäéèêëïîôöùûüÿçœæ]/i.test(text)) { + if (!translations.includes(text)) { + translations.push(text); + } + } + } + }); + + return translations; +} + +// Générer le rapport +let report = `# Scripts remplacés par les versions système\n\n`; +report += `Date: ${new Date().toISOString()}\n\n`; +report += `## Résumé\n\n`; +report += `- **Scripts remplacés**: ${replaced}\n`; +report += `- **Erreurs**: ${errors.length}\n\n`; +report += `Tous les scripts ont été remplacés par leurs versions du système WFRP4E.\n`; +report += `Les versions françaises avec traductions sont sauvegardées avec l'extension \`.fr-backup\`.\n\n`; + +if (errors.length > 0) { + report += `## Erreurs\n\n`; + errors.forEach(error => { + report += `- ${error}\n`; + }); + report += `\n`; +} + +report += `## Scripts à revoir manuellement\n\n`; +report += `Pour chaque script, vous devez :\n`; +report += `1. Comparer la version actuelle (système) avec le backup (.fr-backup)\n`; +report += `2. Identifier les textes à traduire\n`; +report += `3. Appliquer les traductions nécessaires\n\n`; + +report += `| # | Fichier | Traductions trouvées |\n`; +report += `|---|---------|----------------------|\n`; + +replacedList.forEach(({index, file, translations}) => { + const translationsText = translations.length > 0 + ? translations.slice(0, 3).join(', ') + (translations.length > 3 ? '...' : '') + : 'Aucune'; + report += `| ${index} | \`${file}\` | ${translationsText} |\n`; +}); + +report += `\n## Commandes utiles\n\n`; +report += `### Comparer un script avec son backup\n\n`; +report += `\`\`\`bash\n`; +report += `# Avec meld\n`; +report += `meld scripts/ scripts/.fr-backup\n\n`; +report += `# Avec diff\n`; +report += `diff -u scripts/.fr-backup scripts/\n`; +report += `\`\`\`\n\n`; + +report += `### Exemples de scripts\n\n`; +if (replacedList.length > 0) { + const example = replacedList[0]; + report += `Premier script: \`${example.file}\`\n\n`; + report += `\`\`\`bash\n`; + report += `meld scripts/${example.file} scripts/${example.file}.fr-backup\n`; + report += `\`\`\`\n\n`; + + if (example.translations.length > 0) { + report += `Traductions à réappliquer:\n`; + example.translations.forEach(t => { + report += `- "${t}"\n`; + }); + } +} + +fs.writeFileSync(OUTPUT_FILE, report, 'utf-8'); + +console.log(`\n=== RÉSUMÉ ===`); +console.log(`Scripts remplacés: ${replaced}/${scriptsToReview.length}`); +console.log(`Erreurs: ${errors.length}`); +console.log(`\nBackups créés avec extension: .fr-backup`); +console.log(`Liste détaillée: ${OUTPUT_FILE}`); + +console.log(`\n=== PROCHAINES ÉTAPES ===`); +console.log(`1. Consulter: ${OUTPUT_FILE}`); +console.log(`2. Pour chaque script, comparer avec son .fr-backup`); +console.log(`3. Réappliquer les traductions nécessaires`); +console.log(`4. Supprimer les .fr-backup une fois terminé\n`); diff --git a/tools/review-comparison.md b/tools/review-comparison.md new file mode 100644 index 0000000..4213166 --- /dev/null +++ b/tools/review-comparison.md @@ -0,0 +1,1489 @@ +# Scripts nécessitant révision manuelle + +Total de scripts: 46 + +Ces scripts contiennent des traductions en français mais ont été modifiés dans WFRP4E. +Ils nécessitent une révision manuelle pour intégrer les changements tout en préservant les traductions. + +--- + +## 1. 0FWto1oEr3jbWggw.js + +- **Lignes WFRP4E**: 22 +- **Lignes FR**: 22 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${lore} spell. Try Again` +- `Loading` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver le sort ${lore}. Essayez à nouveau` +- `Chargement` +- `Impossible de trouver` + +### Code WFRP4E + +```javascript +let spells = await warhammer.utility.findAllItems("spell", "Loading Spells", true, ["system.lore.value"]) + +let text = (await game.wfrp4e.tables.rollTable("random-caster", {hideDSN: true})).result + +lore = Array.from(text.matchAll(/{(.+?)}/gm))[0][1] + +if (text == "GM's Choice") +{ + return this.script.notification(text) +} + +if (spellsWithLore.length > 0) +{ + let spellsWithLore = spells.filter(i => game.wfrp4e.config.magicLores[i.system.lore.value] == lore) + let selectedSpell = spellsWithLore[Math.floor(CONFIG.Dice.randomUniform() * spellsWithLore.length)] + this.script.notification(selectedSpell.name); + this.actor.createEmbeddedDocuments("Item", [(await fromUuid(selectedSpell)).toObject()]) +} +else +{ + ui.notifications.notify(`Could not find ${lore} spell. Try Again`) +} +``` + +### Code FR + +```javascript +let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts") + +let text = (await game.wfrp4e.tables.rollTable("random-caster", {hideDSN: true})).result + +lore = Array.from(text.matchAll(/{(.+?)}/gm))[0][1] + +if (text == "GM's Choice") +{ + return this.script.scriptNotification(text) +} + +if (spellsWithLore.length > 0) +{ + let spellsWithLore = spells.filter(i => game.wfrp4e.config.magicLores[i.system.lore.value] == lore) + let selectedSpell = spellsWithLore[Math.floor(CONFIG.Dice.randomUniform() * spellsWithLore.length)] + this.script.scriptNotification(selectedSpell.name); + this.actor.createEmbeddedDocuments("Item", [selectedSpell]) +} +else +{ + ui.notifications.notify(`Impossible de trouver le sort ${lore}. Essayez à nouveau`) +} +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 2. 1BT0MWM2cbhlEnrn.js + +- **Lignes WFRP4E**: 41 +- **Lignes FR**: 41 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 3. 1CeYp5MlPcH68UIw.js + +- **Lignes WFRP4E**: 89 +- **Lignes FR**: 89 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 4. 2Qi1hwLYhdE6v6Hs.js + +- **Lignes WFRP4E**: 9 +- **Lignes FR**: 9 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Cannot Dodge!` + +**FR (français)**: +- `Impossible d` + +### Code WFRP4E + +```javascript +if (!["rLeg", "lLeg"].includes(this.effect.getFlag("wfrp4e", "location"))) + return true; + +if (args.context.dodge) +{ + args.abort = true; + this.script.notification("Cannot Dodge!") +} +return ["t", "int", "wp", "fel"].includes(args.characteristic) +``` + +### Code FR + +```javascript +if (!["rLeg", "lLeg"].includes(this.effect.getFlag("wfrp4e", "location"))) + return true; + +if (args.options.dodge) +{ + args.abort = true; + this.script.scriptNotification("Impossible d'Esquiver!") +} +return ["t", "int", "wp", "fel"].includes(args.characteristic) +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 5. 4MQ7u4INxp51oyyR.js + +- **Lignes WFRP4E**: 75 +- **Lignes FR**: 75 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 6. 4ylzjgUdHY5D0yVh.js + +- **Lignes WFRP4E**: 112 +- **Lignes FR**: 112 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 7. 5JWC0l3JEpOsqbR9.js + +- **Lignes WFRP4E**: 76 +- **Lignes FR**: 76 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 8. 5JvKJZPcd6Hz5zvn.js + +- **Lignes WFRP4E**: 75 +- **Lignes FR**: 75 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 9. 5dR7Erj3nwsxLAV7.js + +- **Lignes WFRP4E**: 75 +- **Lignes FR**: 75 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 10. 6jcTzK1XEuWqAacN.js + +- **Lignes WFRP4E**: 2 +- **Lignes FR**: 2 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Cannot use ${game.wfrp4e.config.locations[this.effect.getFlag(` + +**FR (français)**: +- `Impossible d` + +### Code WFRP4E + +```javascript +args.abort = true; +this.script.notification(`Cannot use ${game.wfrp4e.config.locations[this.effect.getFlag("wfrp4e", "location")]}!`, "error") +``` + +### Code FR + +```javascript +args.abort = true; +this.script.scriptNotification(`Impossible d'utiliser ${game.wfrp4e.config.locations[this.effect.getFlag("wfrp4e", "location")]}!`, "error") +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 11. 6xTtJEhRc4OjcDTf.js + +- **Lignes WFRP4E**: 5 +- **Lignes FR**: 5 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Cannot update Fortune` + +**FR (français)**: +- `Impossible de mettre à jour la Fortune` + +### Code WFRP4E + +```javascript +if (foundry.utils.getProperty(args.data, "system.status.fortune.value")) +{ + this.script.notification("Cannot update Fortune"); + delete args.data.system.status.wounds.value; +} +``` + +### Code FR + +```javascript +if (getProperty(args.data, "system.status.fortune.value")) +{ + this.script.scriptNotification("Impossible de mettre à jour la Fortune"); + delete args.data.system.status.wounds.value; +} +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 12. A1odAcuRbq9797ZB.js + +- **Lignes WFRP4E**: 91 +- **Lignes FR**: 89 +- **Différence**: 2 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 13. I1J2m5uud84N50Lk.js + +- **Lignes WFRP4E**: 6 +- **Lignes FR**: 6 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Cannot cast Spells or use Prayers` + +**FR (français)**: +- `Impossible d` + +### Code WFRP4E + +```javascript +if (["cast", "channelling", "pray"].includes(args.type)) +{ + args.abort = true; + this.script.notification("Cannot cast Spells or use Prayers"); +} +else return true; +``` + +### Code FR + +```javascript +if (["cast", "channelling", "pray"].includes(args.type)) +{ + args.abort = true; + this.script.scriptNotification("Impossible d'incanter un Sort ou d'utiliser un Prière"); +} +else return true; +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 14. IslMfFgpgQq2brpu.js + +- **Lignes WFRP4E**: 5 +- **Lignes FR**: 5 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Cannot have Broken` + +**FR (français)**: +- `Impossible de supprimer l` + +### Code WFRP4E + +```javascript +if (this.actor.hasCondition("broken")) +{ + this.actor.removeCondition("broken") + this.script.notification(`Cannot have Broken`); +} +``` + +### Code FR + +```javascript +if (this.actor.hasCondition("broken")) +{ + this.actor.removeCondition("broken") + this.script.scriptNotification(`Impossible de supprimer l'état Brisé`); +} +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 15. IupskvzvoGyD2H5o.js + +- **Lignes WFRP4E**: 39 +- **Lignes FR**: 32 +- **Différence**: 7 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Adding ` +- `Could not find any Blessings associated with ${god}.` +- `Loading` +- `Could not find` + +**FR (français)**: +- `Adding ` +- `Impossible de trouver any Blessings associated with ${god}.` +- `Loading` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 16. KICZPwLvbUSxbDrE.js + +- **Lignes WFRP4E**: 18 +- **Lignes FR**: 18 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Cannot find table with key: mutatemental` +- `Item could not be found: ` +- `${item.name} added` + +**FR (français)**: +- `Impossible de trouver la table des Mutations Mentales` +- `Impossible de trouver l` +- `${item.name} added` +- `Impossible de trouver` + +### Code WFRP4E + +```javascript +let table = game.wfrp4e.tables.findTable("mutatemental"); +if (!table) +{ + ui.notifications.error("Cannot find table with key: mutatemental") +} +let result = (await table.roll()).results[0]; +let uuid = `Compendium.${result.documentCollection}.${result.documentId}` +let item = await fromUuid(uuid); + +if (item) +{ + this.script.notification(`${item.name} added`) + this.actor.createEmbeddedDocuments("Item", [item]) +} +else +{ + ui.notifications.error("Item could not be found: " + uuid) +} +``` + +### Code FR + +```javascript +let table = game.wfrp4e.tables.findTable("mutatemental"); +if (!table) +{ + ui.notifications.error("Impossible de trouver la table des Mutations Mentales") +} +let result = (await table.roll()).results[0]; +let uuid = `Compendium.${result.documentCollection}.${result.documentId}` +let item = await fromUuid(uuid); + +if (item) +{ + this.script.scriptNotification(`${item.name} added`) + this.actor.createEmbeddedDocuments("Item", [item]) +} +else +{ + ui.notifications.error("Impossible de trouver l'item: " + uuid) +} +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 17. N8hA6ysHCTlLd8Kj.js + +- **Lignes WFRP4E**: 77 +- **Lignes FR**: 77 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 18. RvipIYj9H7n4UDMe.js + +- **Lignes WFRP4E**: 74 +- **Lignes FR**: 74 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 19. TCtXPvDpbfz1yrVZ.js + +- **Lignes WFRP4E**: 86 +- **Lignes FR**: 86 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 20. TwgdEucxcHloc4cX.js + +- **Lignes WFRP4E**: 131 +- **Lignes FR**: 130 +- **Différence**: 1 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${c.name}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${c.name}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 21. U1UpSRJOSjPpO4HS.js + +- **Lignes WFRP4E**: 6 +- **Lignes FR**: 4 +- **Différence**: 2 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Added ${mutations[roll].name}` +- `Loading` + +**FR (français)**: +- `Ajout ${mutations[roll].name}` +- `Chargement` + +### Code WFRP4E + +```javascript +let mutations = await warhammer.utility.findAllItems("mutation", "Loading Mutations", true) + +let roll = Math.floor(CONFIG.Dice.randomUniform() * mutations.length); + +this.actor.createEmbeddedDocuments("Item", [(await fromUuid(mutations[roll].uuid)).toObject()]); +this.script.notification(`Added ${mutations[roll].name}`) +``` + +### Code FR + +```javascript +let mutations = await warhammer.utility.findAllItems("mutation", "Chargement des mutations") +let roll = Math.floor(CONFIG.Dice.randomUniform() * mutations.length); +this.actor.createEmbeddedDocuments("Item", [mutations[roll]]); +this.script.scriptNotification(`Ajout ${mutations[roll].name}`) +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 22. ULmZMLezDamerN04.js + +- **Lignes WFRP4E**: 32 +- **Lignes FR**: 32 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Loading` + +**FR (français)**: +- `Chargement` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 23. UQtXuQmUlTyDKqhe.js + +- **Lignes WFRP4E**: 144 +- **Lignes FR**: 144 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 24. UnqnWi0dZYLf5fTT.js + +- **Lignes WFRP4E**: 131 +- **Lignes FR**: 128 +- **Différence**: 3 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${c.name}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${c.name}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 25. V9zm2hKUVLVZtAcN.js + +- **Lignes WFRP4E**: 122 +- **Lignes FR**: 122 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trait}` +- `Could not find ${trapping}` +- `Could not find ${spell}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trait}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver ${spell}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 26. WO5n7Vbx8AgoVrwC.js + +- **Lignes WFRP4E**: 74 +- **Lignes FR**: 74 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 27. YN8719gme9AxYtyY.js + +- **Lignes WFRP4E**: 103 +- **Lignes FR**: 103 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 28. Z6jNlyZMECkW4Hon.js + +- **Lignes WFRP4E**: 13 +- **Lignes FR**: 13 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Loading` + +**FR (français)**: +- `Choisir @UUID[${choice[0].uuid}]{${choice[0].name}}` +- `Chargement` + +### Code WFRP4E + +```javascript +let spells = await warhammer.utility.findAllItems("spell", "Loading Spells", true); + +let choice = await ItemDialog.create(spells, 1); + +if (choice[0]) +{ + this.script.message(`Chose @UUID[${choice[0].uuid}]{${choice[0].name}}`) + let spell = (await fromUuid(choice[0].uuid)).toObject(); // Might be an index so retrieve item object for sure + foundry.utils.setProperty(spell, "flags.wfrp4e.boonOfTzeentch", true); + spell.system.wind.value = "Channelling (Dhar)"; + spell.system.memorized.value = true; + this.actor.createEmbeddedDocuments("Item", [spell], {fromEffect: this.effect.id}) +} +``` + +### Code FR + +```javascript +let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts", true); + +let choice = await ItemDialog.create(spells, 1); + +if (choice[0]) +{ + this.script.scriptMessage(`Choisir @UUID[${choice[0].uuid}]{${choice[0].name}}`) + let spell = (await fromUuid(choice[0].uuid)).toObject(); // Might be an index so retrieve item object for sure + setProperty(spell, "flags.wfrp4e.boonOfTzeentch", true); + spell.system.wind.value = "Focalisation (Dhar)"; + spell.system.memorized.value = true; + this.actor.createEmbeddedDocuments("Item", [spell], {fromEffect: this.effect.id}) +} +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 29. aeBetniKqq5SD9Ou.js + +- **Lignes WFRP4E**: 91 +- **Lignes FR**: 91 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 30. bEVlJOOA1kLlzpWx.js + +- **Lignes WFRP4E**: 77 +- **Lignes FR**: 77 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 31. ePPgxQOqL1Uhz2k9.js + +- **Lignes WFRP4E**: 75 +- **Lignes FR**: 85 +- **Différence**: -10 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 32. h766UvswLCsxcMow.js + +- **Lignes WFRP4E**: 122 +- **Lignes FR**: 122 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trait}` +- `Could not find ${trapping}` +- `Could not find ${spell}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trait}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver ${spell}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 33. hhv7PrRdlf9sfC82.js + +- **Lignes WFRP4E**: 74 +- **Lignes FR**: 74 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 34. hpwJRAhCsXTp9bd9.js + +- **Lignes WFRP4E**: 112 +- **Lignes FR**: 109 +- **Différence**: 3 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 35. iuSoKntfJ4eAPafQ.js + +- **Lignes WFRP4E**: 9 +- **Lignes FR**: 9 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Loading` + +**FR (français)**: +- `Chargement` + +### Code WFRP4E + +```javascript +let spells = await warhammer.utility.findAllItems("spell", "Loading Spells", true, ["system.lore.value"]) +spells = spells.filter(s => ["fire", "heavens", "beasts", "shadow", "light", "life", "death", "metal"].includes(s.system.lore.value)).sort((a, b) => a.system.lore.value > b.system.lore.value ? 1 : -1) + +let choice = await ItemDialog.create(spells, 1, {text : "Choose Spell", title : this.effect.name}); +if (choice[0]) +{ + this.actor.addEffectItems(choice.map(i => i.uuid), this.effect) +} + +``` + +### Code FR + +```javascript +let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts"); +spells = spells.filter(s => ["feu", "cieux", "bêtes", "ombres", "lumière", "vie", "mort", "métal"].includes(s.system.lore.value)).sort((a, b) => a.system.lore.value > b.system.lore.value ? 1 : -1) + +let choice = await ItemDialog.create(spells, 1, "Choisir un sort"); +if (choice[0]) +{ + this.actor.createEmbeddedDocuments("Item", choice, {fromEffect: this.effect.id}) +} + +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 36. jHgxpe6TJDlP3oTn.js + +- **Lignes WFRP4E**: 10 +- **Lignes FR**: 10 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Loading` + +**FR (français)**: +- `Chargement` + +### Code WFRP4E + +```javascript +let spells = await warhammer.utility.findAllItems("spell", "Loading Spells", true, ["system.lore.value"]) +spells = spells.filter(s => ["slaanesh"].includes(s.system.lore.value)) + +let choice = await ItemDialog.create(spells, 1, {text : "Choose Spell", title : this.effect.name}); +if (choice[0]) +{ + this.item.updateSource({name : this.item.name + ` (${choice[0].name})`}) + this.actor.addEffectItems(choice.map(i => i.uuid), this.effect) +} + +``` + +### Code FR + +```javascript +let spells = await warhammer.utility.findAllItems("spell", "Chargement des sorts"); +spells = spells.filter(s => ["slaanesh"].includes(s.system.lore.value)) + +let choice = await ItemDialog.create(spells, 1, "Choisir un sort"); +if (choice[0]) +{ + this.item.updateSource({name : this.item.name + ` (${choice[0].name})`}) + this.actor.createEmbeddedDocuments("Item", choice, {fromEffect: this.effect.id}) +} + +``` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 37. lII4KMRblqwFBlsV.js + +- **Lignes WFRP4E**: 122 +- **Lignes FR**: 122 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trait}` +- `Could not find ${trapping}` +- `Could not find ${spell}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trait}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver ${spell}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 38. oTXPA6rbPnYOKNmo.js + +- **Lignes WFRP4E**: 116 +- **Lignes FR**: 116 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 39. okW06V9UiPC4Vcrn.js + +- **Lignes WFRP4E**: 77 +- **Lignes FR**: 77 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 40. svCqdytEOtqFXCcs.js + +- **Lignes WFRP4E**: 103 +- **Lignes FR**: 103 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 41. sz0PqS1kroMOzUZk.js + +- **Lignes WFRP4E**: 91 +- **Lignes FR**: 91 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 42. v5xrDWcrTNFJkyQB.js + +- **Lignes WFRP4E**: 77 +- **Lignes FR**: 85 +- **Différence**: -8 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 43. whUSkaR1yem21bXp.js + +- **Lignes WFRP4E**: 122 +- **Lignes FR**: 122 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trait}` +- `Could not find ${trapping}` +- `Could not find ${spell}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trait}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver ${spell}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 44. y3F1K1sYBymPZCjz.js + +- **Lignes WFRP4E**: 93 +- **Lignes FR**: 93 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 45. z8mwLihZQu0JtUHY.js + +- **Lignes WFRP4E**: 96 +- **Lignes FR**: 96 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + +## 46. zadppy7FEbXvgUON.js + +- **Lignes WFRP4E**: 74 +- **Lignes FR**: 74 +- **Différence**: 0 lignes + +### Textes identifiés + +**WFRP4E (anglais)**: +- `Could not find ${talent}` +- `Could not find ${trapping}` +- `Could not find` + +**FR (français)**: +- `Impossible de trouver ${talent}` +- `Impossible de trouver ${trapping}` +- `Impossible de trouver` + +### Actions recommandées + +- [ ] Vérifier les changements structurels dans WFRP4E +- [ ] Intégrer les modifications tout en gardant les traductions FR +- [ ] Tester le script après modification + +--- + diff --git a/tools/script-comparison-data.json b/tools/script-comparison-data.json new file mode 100644 index 0000000..9edc13d --- /dev/null +++ b/tools/script-comparison-data.json @@ -0,0 +1,6591 @@ +{ + "identical": [ + "00ZCnahnTGvzG9KA.js", + "01VFjGVxkjb5P1ve.js", + "04bAiHISSW53w94Y.js", + "06IaVCOC0RCJbxEf.js", + "08S8Ozi5b4EdwZp5.js", + "09sSpnW8z2zcVEdf.js", + "0KG3HoTNoZhaINIj.js", + "0LCQtsiK2aUfYRmD.js", + "0e0UZT2FodOJDdgW.js", + "0e7OkamNAaAk4Oit.js", + "0iTLDgFHO9Rgc010.js", + "0jTqyz0wRlK6XPF7.js", + "0vaYwAlMWTmOBl8k.js", + "15C6LbCUmQgPEoDM.js", + "16nCOByUaSFDym1V.js", + "18MeEQ0As3JvER71.js", + "1E47r2ba6IGe8uFK.js", + "1IodsW9ImamYoEYz.js", + "1LDm3OB32skZe6Xv.js", + "1MDOKny7IirJPoI6.js", + "1PQPxFjmRlulHHzo.js", + "1UalUmNzjB4rp3SZ.js", + "1ZrzpfVwPJHdwp23.js", + "1wEjrgff7ASxKVmy.js", + "29wHhLMnuoVjfQtN.js", + "2Cw5j0iGAnFNegWr.js", + "2GYAd4OC888oQFBp.js", + "2OqLHRqEBEjBm2LW.js", + "2QB0LjueuJcIaHaC.js", + "2WBq5gW780C6zfCp.js", + "2mFNelLOAQ6iJsZl.js", + "2miWWeRrEpq1beG4.js", + "2p9IK6Y5Z4NQD6FY.js", + "2wk0yrRPlPsdqr3L.js", + "33PWizq5F7pkKnQT.js", + "3CdYFcInQVCIBUiE.js", + "3Cn2TlRahlm5LkSj.js", + "3LLiSgj6KGtgqcmo.js", + "3R6Y4NpNTqPc83wh.js", + "3TesBGh8HnlGuafu.js", + "3Vbe6gdW8N0bIvXJ.js", + "3aEzK0DehSHtVykd.js", + "3fdCQ3h3iVuhdDs9.js", + "3nTSOcCmNZpQWK8b.js", + "3tE8gFSl28EhCmo5.js", + "4HN98hMdQJxM35pA.js", + "4JVIy5xtVwvadoqv.js", + "4OlwxU60UqKg81yb.js", + "4QoxhoekgVeZcQA7.js", + "4XrAeL2DitxE8OaK.js", + "4cOZzUvu1nytcqNn.js", + "4cumLUlcuJ7m8C6t.js", + "4drWKXjMgasxY7Jy.js", + "4gkz3LR7CK1b8ulK.js", + "4otpLq2TnDdgzpvc.js", + "4rTmV3TNxctUe0ly.js", + "4rhxLzau7jZ4SDxg.js", + "4uAUUZmLgxBKSmXA.js", + "52kbfuWrOh6dsTtd.js", + "53HFDNuMnX1Aw1a4.js", + "5IoYTyedCMYwt3ys.js", + "5LdJCKfQem1AQK24.js", + "5Zxc13GBaJaxCf48.js", + "5lc1eHIYQNpSRWip.js", + "5sYpJkT2WXIe0gIZ.js", + "65o8pQj6oGNnXce6.js", + "6EXkbVTRBhKTEu81.js", + "6Fe8M5MdklKS2olx.js", + "6MSodMuZ5xk2JJJ9.js", + "6Mjy0jDqczA8BxhS.js", + "6U8xox4mBrn5eYIp.js", + "6Ws3ieQ7pG5poUyT.js", + "6XWJWOUQPgKMsFul.js", + "6elUNF58TaiYjxcx.js", + "6gRixT3zIOAberJb.js", + "6ubojp9zwbfJnosT.js", + "71DmrxCTKGYL4Z7X.js", + "7F3miqRA0ceMUBIu.js", + "7OmrMjaU48o2FEZi.js", + "7ScfB4o1QhXnNUfq.js", + "7ateEtT5HXg1vObY.js", + "87rrZ3ojHrXa3lCn.js", + "8AoA4bnstBtglRGZ.js", + "8K9tpCwvFC9INk5V.js", + "8LmUVQxOwTLSeabg.js", + "8ShLVT0bK1eQpinj.js", + "8ThudCYRqkjQIwJH.js", + "8WJsecxdndaHRxxS.js", + "8WeYU5e5LN9UeWFs.js", + "8fefDfiYKFOWdPER.js", + "8g2iitsgaJarKQpr.js", + "8gCja0mfKt4nYVZc.js", + "8hIyWDyfbgGAig65.js", + "8jvEVPUCg3rKG48Y.js", + "8noxHUQKR55Kx1YN.js", + "8oE0DTzz0krOfFlV.js", + "8vpAtJ93GIeye1qj.js", + "8wG9l4T9fc1bM0TN.js", + "8yBr6VbdKcrWUuqw.js", + "91S2GnBFYFbxmOCK.js", + "94eDAi6pkMhG3Ex9.js", + "956dUb5sd6OtbWZR.js", + "9HWEDsnNxSykqbF5.js", + "9MDi3ok9gPwtbALf.js", + "9MwRUzRinhq1IjhG.js", + "9ZFPDCk8M2TQxh7x.js", + "9bJGJrLqslV5lBya.js", + "9eWR4mdaoCSQawDT.js", + "9nroaZDkW3WXNkB7.js", + "9ob2lPnk3PDot9Tx.js", + "9qWUuEF8F5nehF1y.js", + "A3MW0UksYrHGa0Qw.js", + "AFiB20FaOBmBv2Kz.js", + "AI6bFrjWk4NH9FBd.js", + "AS7CstSosuCrwZ19.js", + "AVROqafFhKjN6TPR.js", + "AWgZnm9xLyIWCDnp.js", + "AZGXrZOQ4EzjxRL9.js", + "AaPPmnv7AtxsRVUs.js", + "AjC4dsiuhVCOnRGI.js", + "AmOMCUaWLJ2iJAt5.js", + "AmpDbT0BkDHeaRzf.js", + "AyS3iLljxHRKsHg4.js", + "B063u4vrbvzMaCQt.js", + "B1xgRS00RcTIZLnO.js", + "B87v1twc65qyvUWi.js", + "BVNKF9omCppWPLys.js", + "BZETMpgrI5k1ol5b.js", + "BcXTujburrHpjpwa.js", + "Be5rdfnZorbILhpC.js", + "Bexspr5viPhHiFmU.js", + "Bv3431tnG3VKaTJr.js", + "ByhEa1BxQOyrOmqg.js", + "BzDLuxBNw1QNIacg.js", + "C69xngEMghfwUx13.js", + "CCwuu3bPLCpVGAmb.js", + "CD4RnDpXZ9hnqVPQ.js", + "CDASLC4fWKSGQKf9.js", + "CM43kvw5mIIE1OsB.js", + "CMUFtmNA1kkD1ay7.js", + "CPQoK7NjzOwVTFXS.js", + "Ca1fXHTA1e2QLx0D.js", + "CicQ5REu9tbsc8wW.js", + "CoImIH9OCMx9DfQZ.js", + "D5XmzrUGFa1JN0cl.js", + "DANLE5HxrkTNelhl.js", + "DBafsY1HrclJRTtA.js", + "DL9vYNft9aXdV2aW.js", + "DMQ0taEpBUJU5njV.js", + "DcSJNRBXE9ZBBY7T.js", + "Dew3Ks9yC4DynSMi.js", + "DmbWR9s5I8LHBwxB.js", + "DpdSEHM6NMN1ey6h.js", + "DqJFo74trI916qXN.js", + "DyZ1jH88EAp1ueOK.js", + "Dzi2CKpYapRGwNVr.js", + "E1Xo4RVuN1YRRxg7.js", + "E2VfOVuju67qO3VL.js", + "E6v4YZrvFikbdXoO.js", + "EKkdyp51Wf4csw2B.js", + "EXiqepAIXmbqMiKa.js", + "EYny6z5oTOhxGDfb.js", + "EaSNOmXUxAkUHnm5.js", + "Eay7GpDyfsEE40jT.js", + "EiLaZW4b4ypw5sLV.js", + "EpdMj9d9SYPeP44q.js", + "ErgOwSiVnm9VLVHN.js", + "Et4tPHlrkueLqP3T.js", + "EwD053Fyy46b59ZI.js", + "Eye6dranWpNsILjm.js", + "F2u4L4o0r1LTWeWK.js", + "F4aGsdzJ9SYcX57F.js", + "F9P8Nh4AKnqSGg8C.js", + "FAB12eLcSCAOOQwk.js", + "FAf4iXj5LkdvukS2.js", + "FMSN5uRskkATexzB.js", + "FUgCtIoj1Stgqxt7.js", + "FX8ILw0VgbNxkObA.js", + "FXwfqF0jpXlBQ9Y3.js", + "FciJSTq7dZsZIPgl.js", + "FfTqCPxCoxwGDTQs.js", + "G1RletYc6BzigJrK.js", + "GAO8AozttWOyRkta.js", + "GEfWIFBSrXt0ldBM.js", + "GFaTz8f6PBNWrlad.js", + "GFkVnx4m9OwYsKGH.js", + "GNl5Zk7BZ2jhRV1I.js", + "GUkpYdPwoC5pc9BT.js", + "GcIQtshex11AMmh2.js", + "Gh7OidY6UdpWBS1g.js", + "GrF6tQ08jgKmUH4i.js", + "GuUCErVbk5hrFzR3.js", + "GuxbvztcvzJz2oH1.js", + "H1z3nWW7Rj3Oisxy.js", + "H3Wls12aVWAWTp9J.js", + "H7lcCU24gFDp7zK7.js", + "HOt2hHOiHDZ7oBgW.js", + "HX6CjNapYdC0VmQ8.js", + "HXJKkmpfxQUOnWOS.js", + "Hq1G30lhJYvtOSNb.js", + "HrYchgkdZBiu1yPF.js", + "HwbgUIbpX0D8JLOR.js", + "I0Jo6cbNAJtXUloc.js", + "I0oRZ7AWde5KI5jw.js", + "I93i49wI9ZrDHT4n.js", + "IG4zYqtN9fRSYE7q.js", + "IKiZv9YSFmKmHo6a.js", + "IN4ZFOPooqJtNuIQ.js", + "IOroJBqTsWvoakJN.js", + "IR86DuMbVdbGOJYt.js", + "IkGegSuQwwVPhrjF.js", + "Ip8sctF9SIE1Z2vF.js", + "IpoOOjYJs6RmVrpb.js", + "IukS0clr1yAleacc.js", + "IzZcsSngI8TZH4d8.js", + "J1FPDdrXGctKDTZz.js", + "J8aPichsl25t1QZ9.js", + "JFgXyb6bKjZJLmF8.js", + "JZIn1dsKHFE3smJU.js", + "JaiC5P6nIgctOacH.js", + "JavuFNZ9Pj5elVLc.js", + "JfOodll9a2Lw0fWg.js", + "JjDzMnUxaWQePIYh.js", + "JjiPprLSlSmmB5Ga.js", + "JwYZJGkZMSM2M3Si.js", + "JwgFQmPQtXWAP94i.js", + "K06v93N4FXb70mB7.js", + "KF69WqF4PSEtpdb2.js", + "KG4TxnXiLLpfWOQO.js", + "KJLAan0glJlyOyqF.js", + "KQmb5B27eJ1lkbVL.js", + "KT670CjGBEprx2fO.js", + "KVuPduDztyMZQNt9.js", + "KXzDe7cN2vynHjJO.js", + "KnwYZbeRSBA94hfl.js", + "KuUkUmOOLf05I4Bp.js", + "KuuWAhoSzk0rCxxw.js", + "KyswmGj1uG3QS3ng.js", + "L1RMLvKtRPFtnczI.js", + "L2cdQppcPwxz24hN.js", + "L89UcafRHqUfxoux.js", + "LAyLbcC0lOPwZP3U.js", + "LHUUXfZVLBhWqRvb.js", + "LLqAT9wEUGMLfDhU.js", + "LOL2TGf8p8KxP14D.js", + "LXEUhHuXe8keEPI9.js", + "LedRsrVo2f7lm3Ix.js", + "LgYyLg0Y2AQ1SKcS.js", + "LjXPlgdXBdllnA3i.js", + "LkPtgN9A36OI6Frh.js", + "LlRhPGorLl5qJCU8.js", + "Lm9IBkc918Duw3US.js", + "LxdLkPxH3SFvYrCJ.js", + "M0eOB2Jg9KzcN1gz.js", + "MCK6WyjwYT28lsTN.js", + "MI2GgNi3fZtUCtQD.js", + "MIhYSuJ6MI9B65UT.js", + "MOZn375tGD2060cC.js", + "McLR9YcgVUG3MooC.js", + "MgTqCMRjxhezT73T.js", + "MgZreqq3Jua10c8s.js", + "MkEcdViivk7abf1x.js", + "MnXny8SCh6OceJc9.js", + "Myl1Ishu9GBraYUZ.js", + "NI3ZzIAlpQfVSjvf.js", + "NNytXz5XFPrEF6dw.js", + "NQSvFWhmBQAyx5Zz.js", + "Nk6qAalTmc6UI2XQ.js", + "O9fc0hLHdkTgSuLg.js", + "OCFrGXAYfo9OYnhc.js", + "OJMgS8ZQv0j4tEFf.js", + "OMAUX1fnHyIpplul.js", + "OXoqtpOdfkURZbuL.js", + "Oa9FmLXRRZRpLrrq.js", + "OcQe0zfksf1DCJYe.js", + "Ofn6vDbP3fZ4UlSc.js", + "OnkEe4ISru1hjJWP.js", + "OqxeuZfZDfm9ax6h.js", + "OvIELZLvnlN2H2uw.js", + "Pg9C6nJX5QHIdqa9.js", + "PjRxGuUDKGmSmVDc.js", + "QF8LanKNoAlTkQG0.js", + "QHQ7XmFOjT9wXgw1.js", + "QKTA2TqZ77pvHWSJ.js", + "QKjR6P1WEHXf4K77.js", + "QQPiREc50HT5W2Tr.js", + "QaEUhlvxFPzowH0v.js", + "QaGNsqKm2Nf0zGVm.js", + "QbIYnshWeP1U8SUy.js", + "QqkE7rlqhkeRohFD.js", + "R5dOZWFxE2n6tooX.js", + "R95pDZMHnD9iHAl8.js", + "RI8crJxeD8JLDwMh.js", + "RJpglw5eVRM1f9t0.js", + "RNHrSTfMLXm5sXkC.js", + "RZlMkxJz5apn0mUj.js", + "RqWnhnwFxaHubgiA.js", + "RsWXCcYHONf3ANlD.js", + "RuW1PWUFxIbbSlIm.js", + "S3DCTw4yJ85eSaKp.js", + "S6tUyFJvGMV19mvP.js", + "S95QqpX1cZyIVCPy.js", + "SO4Aa9argKbuO9rQ.js", + "SPOkFWZWziZk5b7A.js", + "SRmfstEs278bP9Pz.js", + "SSqGxyN9hw0HDmED.js", + "SThruXFhxUdNKCG4.js", + "SUfCkHdJg7rttdM1.js", + "SefcrhXsdYGFcCW6.js", + "Ssn21dxoMQiqD1y4.js", + "SvFKt9hMcFQjeILA.js", + "T74FEjfFrh3f6MKv.js", + "TEiNj5FgkoD3YbhS.js", + "TNWmIkuubqBn38he.js", + "TQRL4mZhZohXg1Au.js", + "TY0xSQ00XXyEr49r.js", + "TcqumwUFAL6V0cty.js", + "TmaS8o33825QUMrx.js", + "TnFobCxG4pxlYmKr.js", + "TpZItJ5Ugbazaobd.js", + "TzgmYRXFXRspIo1i.js", + "U2xKn7R1gm8kiQm8.js", + "U5ndCwcJ1s3Ns26w.js", + "UWrzokgabRKUpnkG.js", + "UXdlnmwVgjc1QpF2.js", + "UYLXm2W6jVn21Age.js", + "Um6xMMiUftLXJxEt.js", + "UtqUthabeQ4rHDLQ.js", + "Uvk1X7sEhvv77YkD.js", + "UwjkHRAQHESdYXJs.js", + "Ux4buMc7llF1Kg8p.js", + "V2lsVTi6q28eL5jl.js", + "V7qmFwUMCY2tfziH.js", + "VKpKq4RSbI1KkUQK.js", + "VTS4RzbmReI87K9a.js", + "VXERNoc5IazQGuGO.js", + "Vb7rgl8T4VRswbnZ.js", + "Vkuu70BZV4DPYO2Q.js", + "VuE1mhrB6X6MYTzg.js", + "WJkwIrdj4NceOYe8.js", + "WKXyVHQwQCNTfSKv.js", + "WPQbVpD1uwSLAXq1.js", + "WRe1eGmGVGejPcS8.js", + "WY3DajPRGcMNt158.js", + "WeTlTniskT3Ej6vg.js", + "WnWA0e0bgqBsZp2L.js", + "WwxXgsNxlccmqTze.js", + "WzMmwjZbhyCbHxyZ.js", + "X08401eOhKJrhNf1.js", + "X3bLbOfcJAftOMa7.js", + "X7ikFOGKYzTMr4d1.js", + "XCAfy460IotarQek.js", + "XPxAKqPpPYE4E6B5.js", + "XRrGBbplNLZpXnCH.js", + "XXnzUdsIYQ9Wjyu0.js", + "XYaYeiVkc5GKYTjC.js", + "XfRvVBTVIuAm8RaZ.js", + "Xg4qHLsyXGuUZfT8.js", + "XthZ3GCC3WhsEI2g.js", + "Xu5cED1MhT4ba7da.js", + "Y6ppJBerpM3TtSic.js", + "YOKoZFlBEpFavfOS.js", + "Yf2MmOzazzMdmoPU.js", + "YjAIsFlxKTJvYs60.js", + "YsS2RZsl2ZsqjhWV.js", + "YyKU2rIRmFSCqSlW.js", + "Z1zriXibT0mAmdhb.js", + "Z30zYayPryXOjT5N.js", + "Z41L3MwOpJdAjVaj.js", + "Z4WrrlVGpPY4iUbG.js", + "ZCrfdLPOxiNDCDSg.js", + "ZEdDcBka21rnMuz5.js", + "ZGlJnrIemqul24j7.js", + "ZI2YnAAGoLpmVDIL.js", + "ZJy2rvpKmUHXGrAi.js", + "ZMwJad6v4G13SgjR.js", + "ZOgtDW3mkTfeyc5M.js", + "ZYsMgB4BwXBJcpYf.js", + "ZbuW8y7t9Y8oUFWq.js", + "ZhuitY1KOU1Xe7cP.js", + "ZrePyV2spv3v65Tg.js", + "ZsOHDb7XwmuUUWPL.js", + "ZsQR3AVKi0v5U593.js", + "ZuoIVv3nmlGhhdx0.js", + "Zxh4RAENoaAQAaNg.js", + "ZxtOdwsM2Sqj9Zam.js", + "a8RabrnJ08O07rDX.js", + "aMHGjWyn6BXCI4pw.js", + "abVIvJBzuskNzCQv.js", + "agsm3NI1NDtHRG4y.js", + "ahbA7o5G9dzMFl76.js", + "alJgj25l3239h2SW.js", + "araS9qYWOAVrV8F7.js", + "ayIbw2Vw2t9xg33P.js", + "b1zMefdoZYtzCm7i.js", + "b8G4cjfn3RG2tEYX.js", + "bBdXzBmxgFFBwMMS.js", + "bL98Sr1TRLMPEdlk.js", + "bRiFHPC1StKxqNIC.js", + "bRtZH0xRh8dgqMeW.js", + "bWr8leucbWslBCYG.js", + "brNRqfpPqD2Ki0cM.js", + "bwtQOSWn120NICkf.js", + "bzaoWcieMFaU5B5l.js", + "c31hjp7k0hlpdGBC.js", + "cAioHYtlxuOCwRLh.js", + "cApfxL7Ic0NKdoSr.js", + "cBSy9CR5NZvcLRg8.js", + "cDBhmHn5kjgWBAlT.js", + "cEg09bnvZD6Ysnpc.js", + "cJFDnq1HI4gXWcJo.js", + "cOuukVo8WakDZIUj.js", + "cUFCL02JoaZObRcX.js", + "cUnbADgOQ4fMKgrH.js", + "cYPIXzl86a3LFsTE.js", + "cgmA2N0MkjA7qIZy.js", + "ch5SD2XOQfcYo0X5.js", + "ckKbPfaTiQ2qBZdR.js", + "csLKDJKZaUK9vwLT.js", + "ct6WGaRMfrcnHhyv.js", + "cuqCtQsfLBBAGjnu.js", + "cysQDjlDzT8HdNeo.js", + "d29mu8vRt9AQUm0L.js", + "d6mVm08o8SeklAcW.js", + "d9iU08yvqcffF026.js", + "dM8FbRH2V8CpOkXw.js", + "dULCkRxtisuzQyuK.js", + "dZ4c5pKDqQV02aIK.js", + "dbHv7dAXgB2Oy1Fg.js", + "dbYjr4oG67Z880To.js", + "dh5mAlaOOLCBC0YQ.js", + "dk02qSJfJaIo3Geh.js", + "dkY7WRYjFVh8GB0m.js", + "dqvHDMlcitLx1pUx.js", + "dt85W8pzZ09w1QLi.js", + "dxxDFXNNqUsuMyUD.js", + "e0TuMgYuI7ZtGoQr.js", + "e4HotRnEiyXR0pIu.js", + "eAtqyBd1HsDWuBuI.js", + "eHRv7f2BTtle6Y1K.js", + "eHgk3HZ6eyLFTZ9o.js", + "eWWLmA2xINR321aK.js", + "eb69QPmNQEJXtk4l.js", + "esuLwq4g5T8k1kLT.js", + "f4vvAGQ8OGoEbrgy.js", + "f6WnrJvoNkfoNN9Y.js", + "f7WZvYle9iqefRsh.js", + "f8cnfvGKJH3bYVGN.js", + "fEyKQqCjDwml3DXO.js", + "fFGuTi0HLjwneMcJ.js", + "fFi9JD4uCY9DPC5B.js", + "fIUxKZMWJ8HMPmH9.js", + "fNUiKELi9e1vg7KY.js", + "fSTjJIqg5tvbwxKt.js", + "fTw3mpSUOlkqVVUC.js", + "fY0TsQwnU14fdPl2.js", + "faRFSsrQylQRZFLk.js", + "ffvcCEazZBinHlUX.js", + "fkFmNcesqqNTMhVn.js", + "fl762icfKrt9ear2.js", + "fve7tiyF5X9B7mHJ.js", + "g0SzfsLyW7aD2F19.js", + "g4t56A09yrpZaJQ2.js", + "gL0ftUnK5TNXBRRt.js", + "gMIenSmLklAkB2Zm.js", + "gOm8utR3HLQBT5hA.js", + "gVpFUka7qfGiEC1v.js", + "ga6bQzPuoIiQQrKg.js", + "gbhxWXboV9CytWNU.js", + "gh2KS1prBKcsSK6M.js", + "gpPaCe6yER79l4u8.js", + "gpuBg3y9rocJL7yT.js", + "gsCnd3mf1vXFU2ei.js", + "gxuBeGHwjZ7WfPeu.js", + "h2GSoiCQ2ZSlTjf7.js", + "hK0YMJfYbpbJZizO.js", + "hObTbWi4ZdwXimIW.js", + "hOgha3ir8K9TVphO.js", + "hSlEY2oh8quVmdXR.js", + "hWWvkPbgIN3lxz1u.js", + "hZAax4emLahEEqcZ.js", + "hfO4INH3EeETDTFt.js", + "hj7tI212neKIu9dh.js", + "hluehsCuBZYc1Ejt.js", + "ht7csu1KImHzpzL5.js", + "huJcVpVn6Q7sQkFC.js", + "hwHpIunCq3ifk2QU.js", + "i59IpmZNLJEPWZ3L.js", + "i7xl0jNpLnBT2h2l.js", + "iBEPQ3NwtI9DfkEy.js", + "iHn3YzvqNfbwzjZz.js", + "iM4B3IZ4VtpZsl09.js", + "iMDZLr7ueJWBnilj.js", + "iVhi3Z6zPaf1bf8g.js", + "igVAVU7DOuzhNG14.js", + "ioeTj5mx8jlA5EX5.js", + "ipkkRffJh61WE7zR.js", + "iqUvV1Vu81M3WyZ4.js", + "iuYuf05BNuZ5fllI.js", + "j1AmrY1SxFJQyapo.js", + "j3c6Y5aeA7nlFr9F.js", + "j3zDMWkns32Yrxn3.js", + "j6Bf1iivH8cqSnnK.js", + "jC8o5PbnqEvOoZ9N.js", + "jLsL4KRI6LEG9Ii2.js", + "jWkfoVpHLiRaHTza.js", + "jYJRO5XPyG7y6fih.js", + "jbZPLb4wuqJpHLUx.js", + "jfk5VDKMTIf4ee0v.js", + "jmxlpyLrIuoxQtvU.js", + "jrvj7bRyMBB9LixP.js", + "k0AkkBLtE8oZhBwn.js", + "k7ldJfyW201HgRFh.js", + "k9SvH4Lm3ZuI8S1N.js", + "kBXVEnSWzaQZLkJH.js", + "kIM4Fs1lFVV7TSnj.js", + "kbXDGAmWWD4CZJHB.js", + "kvnZz8yqdTZbErkr.js", + "lCOdnKz8XpnkDs6Q.js", + "lFO6XdfUODmFArqx.js", + "lRZhkh8pcu93QTKz.js", + "lSOAZ4FG44bT4jh1.js", + "lj7vOpa6tHHZ9bBB.js", + "ljGX2w8hCTyLAjRp.js", + "ljpM7muMyxGD04EX.js", + "lol5J6h0pErzM71s.js", + "lwVhn4bSXJ3eoT9q.js", + "m3qEVO5fseV6KHXa.js", + "m58MpMZBblpq5LJu.js", + "m84kG5cEPEByqHdd.js", + "mBcLf11upaHS8AQq.js", + "mGHKBkDp4omSaBlD.js", + "mJ9eMPub4epJSf00.js", + "mT7PDcjF3cJTDbjR.js", + "mV4Tmc0yfpL09KV7.js", + "mXvtf3qhJjshpopX.js", + "ma0sWhebqwdRHWvY.js", + "maKr58mvvyKxFyC3.js", + "masOBNgSi5HYkf3m.js", + "mgLGN1XPzPE4dReN.js", + "mlulnXQo8XU8vKLD.js", + "nCWAflBj7Si2BI1Q.js", + "nHJdlqbOP0ECgywb.js", + "nSXzktHyNjGUXjaw.js", + "nYtAjSArsNbrU2ob.js", + "neaaVy6D6tfcst5P.js", + "nlQA0shW8FCXjY7u.js", + "nqWu0ZplxzRiUEAg.js", + "nuIpPD4uaZRuJni8.js", + "nxNqWmmF6mJTnrLo.js", + "nzh8d46l1ikhkz8Q.js", + "o1zD8mej9TWKNxUq.js", + "oHenUKtaS3jT5xQn.js", + "oW1gtYVT5nrxDjM7.js", + "ocBW3osTFnb5JCfe.js", + "ofddAHvzn1xUueSG.js", + "ogJBAXTXyhTqACPO.js", + "ohl803m0tUwNfKAk.js", + "okr3TtzpFoefUuJS.js", + "oqgd9G6oI1ncPYLw.js", + "pBMioPUtDn1mk9f5.js", + "pG5OVokZzCRHIrwz.js", + "pLKv4moua6XhNdmA.js", + "pPV9oEydXb7oi6jX.js", + "pVSnn4Zw6y1EBDhv.js", + "pnB9TzSEytkxk3Rb.js", + "pvk5OhTNdVgwXoUa.js", + "px7eEdhOEt7zOTrq.js", + "pzimrxrqpv282Oqb.js", + "q3nRyXaxksdCiLFM.js", + "qK4q4o6cQhcGzFX3.js", + "qTcK1TSjLTi0jNQK.js", + "qUwnVlWpsmDom3RK.js", + "qZschZU0nee0kJlk.js", + "qcyl98GYD55BkJsD.js", + "qjli5evn8UA9uTeZ.js", + "qnJu82zgnfOsnqZV.js", + "r6hi5vMdLhTaaPfb.js", + "rIISfbCShejmJNKw.js", + "rLMaVNEGdZ6xj5Au.js", + "rRfff55c7elyvbCb.js", + "rUGSx06BuBvX9kgf.js", + "rVRDoxiWILo7d8FF.js", + "rVpPNILEzWL9lj6b.js", + "rdaMhMyHrJjQ6vVC.js", + "re1UFtxvRRjpPB7Z.js", + "rgSwSeB3shIMVMb6.js", + "rqTT8yOyK4bUwbdm.js", + "s07GKMPCvQ8Heorc.js", + "s0kTuDE0qv68V2KI.js", + "s5bO0Sf0qpS27Tve.js", + "s8idWt9YdMTRfnjV.js", + "s8xU6OOZbbfo6VIw.js", + "s94yKZ4o5XN4JWM1.js", + "sAVpm7hFRHpbCLXm.js", + "sHVLKIdPbzLVItCa.js", + "sHfkTRqTWPg2JAGN.js", + "sQDh3g11pWchxpW9.js", + "sYlGRLApZ3Ub24ea.js", + "scfm5iWWBxWI6QaK.js", + "sjnoYbWpAugyDilW.js", + "skVq3eDEYKFF2iZp.js", + "sm9d5lk6cM0OuUkf.js", + "t8LYOuN5peEdWeXP.js", + "tCIT1a12Gt6k2ohA.js", + "tFAKRRRfTjQfdQz3.js", + "tKBq1nGZo8t6vvQ6.js", + "tdICiJ26rJrDbxT6.js", + "thxlWeZbow8iE7xA.js", + "u5dNZ0s3lWfL8KFb.js", + "u6CYMSZADrfXd48Q.js", + "uAy4w7y8Uu9POF8C.js", + "uNYstk3eXmWamhzs.js", + "uOHAsKlkFuIaAmjb.js", + "ur2HAWDGSGvyAynU.js", + "v00nVCRKqqRvY28t.js", + "v18mmwUmuKiVfwzQ.js", + "v4ITTsSY9EvCbhZP.js", + "vM2BPwYhHQaBAt2C.js", + "vNp9wgdSvnNEjZyS.js", + "vPG4rV640aSzKzxe.js", + "vTebTUzXortx1Qut.js", + "vUpMQlbwDiYfMCNS.js", + "vY3xeTTL3ghPrJpN.js", + "vZ5HCrhY8e4R1TrG.js", + "vc8eVKtyjtOGvWlK.js", + "vcM0IgsYVmfWrlO3.js", + "vgfs0DXvF5iKrz1M.js", + "vjyTKcNrJzX4XWnS.js", + "vvVhAqreedtmOR9b.js", + "w3r54pKZQKaH2Yer.js", + "w6tr8mWy0ZSUkHLt.js", + "w7K0lbxQKJ2tsc6f.js", + "wAETU6aTRr9d4oCU.js", + "wRxgpGmlUpe7nwzJ.js", + "wUlYLBT59Efys5aS.js", + "wkY4Uj2NjT8mQNT4.js", + "x9G6Du5EWV6byf4C.js", + "xIRU2SaqLeWmqGDI.js", + "xL4S0H1RP8hhXW7c.js", + "xLKAuD6yzwjAL6tJ.js", + "xMhhVol8Is3DJ3gb.js", + "xPDMpOvC1ZBVxrNg.js", + "xPwa3NftkpMBc2AO.js", + "xQ3xR2Wf0wHFa76H.js", + "xQnoRTHotZKrwPrx.js", + "xRTmMwNfdirjsi8X.js", + "xYTkj8jhSVOSoLbC.js", + "xcy5GOUSZ0meIejZ.js", + "xgdhf0wlNP2cHIQx.js", + "xiyQSXozoLxt0MZs.js", + "xnHobI9HojObLHMp.js", + "xot4JWCRzLkobHtL.js", + "xpgXWoK2zDnG1uiF.js", + "xq3RANOtmPhy77ne.js", + "xvGxwv7X0Vq3vNqb.js", + "y3agVFVBR8tVqWyx.js", + "yPxYRObUiqAIhlNB.js", + "yamap8V6Gx2Z9Smu.js", + "ynNCBAYwJFkTiXV1.js", + "yr1FmaTY18JXWa8s.js", + "z14Tb2YKCjiE5ZTU.js", + "z926Cl2vxUfyLY0V.js", + "z9NEbIUBsKMaTuCz.js", + "zBHTIBU8OlYj1YIO.js", + "zUv9e0A3OEXWY9Mv.js", + "zk44dFEGkylB7kW6.js", + "zkc1gIPLj0VoAONT.js", + "zphxI8VSWbNQCMBy.js", + "zqShIJnrRReGgP94.js", + "ztIkD5Zt6ko9D4Ca.js" + ], + "needsUpdate": [ + { + "file": "03mJu59V4iByWlsO.js", + "wfrp4eSize": 1153, + "frSize": 1201, + "wfrp4eTexts": [], + "frTexts": [ + "

          ${this.actor.prototypeToken.name} :\n

            \n
          • Reçoit 3 états Empoisonnés, sans Test de Résistance possible
          • \n
          • Récupère ${this.actor.system.characteristics.t.bonus} Blessures
          • \n
          • Acuiert le Trait de Creature Régénération.
          • \n
          \n C" + ] + }, + { + "file": "0BP5l7bIkf744G1k.js", + "wfrp4eSize": 70, + "frSize": 70, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "0FWto1oEr3jbWggw.js", + "wfrp4eSize": 789, + "frSize": 766, + "wfrp4eTexts": [ + "Could not find ${lore} spell. Try Again" + ], + "frTexts": [ + "Impossible de trouver le sort ${lore}. Essayez à nouveau" + ] + }, + { + "file": "0R0QAr3D024kWPfo.js", + "wfrp4eSize": 552, + "frSize": 589, + "wfrp4eTexts": [ + "Mutation table not found, please ensure a table with the ", + "Item could not be found: ", + "${item.name} added" + ], + "frTexts": [ + "La table des Mutations n", + "L", + "${item.name} added" + ] + }, + { + "file": "0Uly7OmkH0zqYbxQ.js", + "wfrp4eSize": 584, + "frSize": 585, + "wfrp4eTexts": [ + "Dropped ${dropped.map(i => i.name).join(" + ], + "frTexts": [ + "Lache ${dropped.map(i => i.name).join(" + ] + }, + { + "file": "0abwNjpzo3SbEOeO.js", + "wfrp4eSize": 267, + "frSize": 270, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "0yyofYHeDRQlFliO.js", + "wfrp4eSize": 68, + "frSize": 68, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "11uCC0mK2uL783al.js", + "wfrp4eSize": 134, + "frSize": 133, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "190PHSHKGaJ74wsR.js", + "wfrp4eSize": 1169, + "frSize": 1060, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "1BT0MWM2cbhlEnrn.js", + "wfrp4eSize": 1169, + "frSize": 1176, + "wfrp4eTexts": [ + "Could not find ${talent}" + ], + "frTexts": [ + "Impossible de trouver ${talent}" + ] + }, + { + "file": "1CeYp5MlPcH68UIw.js", + "wfrp4eSize": 2481, + "frSize": 2498, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "1JwxZujbDcueLWBL.js", + "wfrp4eSize": 162, + "frSize": 168, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "1OpT3CXs07XFWWCT.js", + "wfrp4eSize": 30, + "frSize": 30, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "1ZArMNUI8qqH6zkX.js", + "wfrp4eSize": 247, + "frSize": 242, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "1exiWlVUHsXDLLAH.js", + "wfrp4eSize": 62, + "frSize": 70, + "wfrp4eTexts": [ + "Cannot enter ${this.effect.name}!" + ], + "frTexts": [ + "Ne peut saisir ${this.effect.name}!" + ] + }, + { + "file": "1fQr1Dg7DX0vfz3r.js", + "wfrp4eSize": 134, + "frSize": 145, + "wfrp4eTexts": [], + "frTexts": [ + "Soins de ${healed} Blessures" + ] + }, + { + "file": "1jQq9v8fXK8zuEBU.js", + "wfrp4eSize": 853, + "frSize": 863, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "1l7Jz2ZHbAWko7Vm.js", + "wfrp4eSize": 33, + "frSize": 33, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "1wrPvP6lJwIAfmsl.js", + "wfrp4eSize": 362, + "frSize": 371, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "1yOvw74jzFfaI87b.js", + "wfrp4eSize": 27, + "frSize": 27, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "23vWiHUjxtRQ3Efz.js", + "wfrp4eSize": 219, + "frSize": 218, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "2AOo7KUyzMrgIlgM.js", + "wfrp4eSize": 137, + "frSize": 129, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "2Qi1hwLYhdE6v6Hs.js", + "wfrp4eSize": 243, + "frSize": 258, + "wfrp4eTexts": [ + "Cannot Dodge!" + ], + "frTexts": [ + "Impossible d" + ] + }, + { + "file": "2cKarG9ToyW2ptCd.js", + "wfrp4eSize": 338, + "frSize": 340, + "wfrp4eTexts": [ + "None left!" + ], + "frTexts": [ + "Vide !" + ] + }, + { + "file": "2rzxQlL7A9ujZ9uK.js", + "wfrp4eSize": 315, + "frSize": 316, + "wfrp4eTexts": [ + "${this.effect.name}: Gained ${this.item.Advances} Advantage" + ], + "frTexts": [ + "${this.effect.name}: Gain de ${this.item.Advances} Avantages" + ] + }, + { + "file": "2yctEihGmdCfTTVx.js", + "wfrp4eSize": 88, + "frSize": 63, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "2zeP2nMSURjxrqYz.js", + "wfrp4eSize": 282, + "frSize": 302, + "wfrp4eTexts": [ + "No effect at 0 Wounds", + "Healed ${this.actor.characteristics.t.bonus} Wounds" + ], + "frTexts": [ + "Aucun effet à 0 Blessures", + "Soin de ${this.actor.characteristics.t.bonus} Blessures" + ] + }, + { + "file": "33US8YRgaMqYu2We.js", + "wfrp4eSize": 29, + "frSize": 29, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "37UN17gb8suFeZIW.js", + "wfrp4eSize": 133, + "frSize": 139, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "3D5ImpMgpOTPucvv.js", + "wfrp4eSize": 379, + "frSize": 379, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "3IGO7xEjRjat937X.js", + "wfrp4eSize": 232, + "frSize": 241, + "wfrp4eTexts": [ + "Removing Fatigued Condition, disabled effect" + ], + "frTexts": [ + "Suppression de l" + ] + }, + { + "file": "3eSaX0BeaUalNkEP.js", + "wfrp4eSize": 26, + "frSize": 26, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "3jm0NoYpgB6ZuUSl.js", + "wfrp4eSize": 38, + "frSize": 38, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "3l7MQSa10Kve2K3P.js", + "wfrp4eSize": 215, + "frSize": 221, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "4MQ7u4INxp51oyyR.js", + "wfrp4eSize": 1932, + "frSize": 1952, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "4ylzjgUdHY5D0yVh.js", + "wfrp4eSize": 3410, + "frSize": 3359, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "58rFc9HiBoX66J6p.js", + "wfrp4eSize": 444, + "frSize": 453, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "5DI6cHAg1LHo54Yv.js", + "wfrp4eSize": 420, + "frSize": 426, + "wfrp4eTexts": [], + "frTexts": [ + "1 Point de Fortune volé à ${this.actor.name}" + ] + }, + { + "file": "5JWC0l3JEpOsqbR9.js", + "wfrp4eSize": 1767, + "frSize": 1783, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "5JvKJZPcd6Hz5zvn.js", + "wfrp4eSize": 1886, + "frSize": 1906, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "5M6IgCUncCwyxHok.js", + "wfrp4eSize": 1217, + "frSize": 1197, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "5MxRDXzUBPfp2KKD.js", + "wfrp4eSize": 38, + "frSize": 38, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "5ScjIdRUOxblHdWS.js", + "wfrp4eSize": 1217, + "frSize": 1212, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "5dR7Erj3nwsxLAV7.js", + "wfrp4eSize": 1954, + "frSize": 1976, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "62Ky6bC1EnTllSJA.js", + "wfrp4eSize": 253, + "frSize": 259, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "65xE9OV5sA1ZWT7j.js", + "wfrp4eSize": 377, + "frSize": 377, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "6Aqq4F4Xui923sc6.js", + "wfrp4eSize": 779, + "frSize": 754, + "wfrp4eTexts": [], + "frTexts": [ + "

          ${this.actor.prototypeToken.name} reçoit le Trait de Créatuer A Sang Froid et peut inverser n" + ] + }, + { + "file": "6BmvV9c03FkfisnE.js", + "wfrp4eSize": 1069, + "frSize": 1107, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.name} porte le ${this.item.name}.
          \n Il gagne +1 Point de Corruption point si un Test de Corruption est échoué, à appliquer manuellement.
          Si le personnage porte le masque pendant plus d", + "${this.item.name} de ${this.actor.name} a été enlevé et a perdu ses propriétés. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils devront être manuellement supprimés." + ] + }, + { + "file": "6H6vNjzvMGl2ZqCR.js", + "wfrp4eSize": 285, + "frSize": 305, + "wfrp4eTexts": [], + "frTexts": [ + "Lame de Nurglitch: ${args.actor.name} doit réussir un Test d" + ] + }, + { + "file": "6QZUX7ZrFxOzqI0b.js", + "wfrp4eSize": 252, + "frSize": 268, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "6hAgggYpNR3r4QWC.js", + "wfrp4eSize": 279, + "frSize": 281, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "6jcTzK1XEuWqAacN.js", + "wfrp4eSize": 142, + "frSize": 159, + "wfrp4eTexts": [ + "Cannot use ${game.wfrp4e.config.locations[this.effect.getFlag(" + ], + "frTexts": [ + "Impossible d" + ] + }, + { + "file": "6jp8slPU33oBQe1V.js", + "wfrp4eSize": 55, + "frSize": 55, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "6kifXp2jXEaQVJsg.js", + "wfrp4eSize": 215, + "frSize": 338, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "6mpw9cGseG4W4eyd.js", + "wfrp4eSize": 299, + "frSize": 311, + "wfrp4eTexts": [ + "Advantage Subtracted", + "Not enough Advantage!" + ], + "frTexts": [ + "Avvantage soustrait", + "Pas assez d" + ] + }, + { + "file": "6oSs8qKFNFz2lSmh.js", + "wfrp4eSize": 100, + "frSize": 99, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "6qJP0hpShEM43ohx.js", + "wfrp4eSize": 844, + "frSize": 853, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "6uldpFvKOCoW92cC.js", + "wfrp4eSize": 293, + "frSize": 278, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "6xTtJEhRc4OjcDTf.js", + "wfrp4eSize": 174, + "frSize": 183, + "wfrp4eTexts": [ + "Cannot update Fortune" + ], + "frTexts": [ + "Impossible de mettre à jour la Fortune" + ] + }, + { + "file": "7F6aGxZJjwxm5e5P.js", + "wfrp4eSize": 640, + "frSize": 642, + "wfrp4eTexts": [ + "Lost ${value} Wounds" + ], + "frTexts": [ + "Lost ${value} Wounds" + ] + }, + { + "file": "7JW9t8AYSDkkzG2V.js", + "wfrp4eSize": 967, + "frSize": 1002, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.name} porte le ${this.item.name}.
          \n Si le personnage porte le masque pendant plus d", + "${this.item.name} porté par ${this.actor.name} a été enlevé et a perdu ses capacités. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils doivent être retirés manuellement." + ] + }, + { + "file": "7WR2hJjHPhHhHxAq.js", + "wfrp4eSize": 236, + "frSize": 251, + "wfrp4eTexts": [ + "Removed ${poisoned.conditionValue} Poisoned Conditions", + "No Poisoned Conditions" + ], + "frTexts": [ + "Suppression de ${poisoned.conditionValue} états Empoisonné", + "Aucun état Empoisonné" + ] + }, + { + "file": "7ZoFUMDG2WJd8RMg.js", + "wfrp4eSize": 74, + "frSize": 91, + "wfrp4eTexts": [], + "frTexts": [ + "Revendiquer le Bonus de ${this.effect.name} " + ] + }, + { + "file": "7f6OsttTzE7Hvzfk.js", + "wfrp4eSize": 170, + "frSize": 168, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "7n3SEAGRA5ESK8gV.js", + "wfrp4eSize": 27, + "frSize": 27, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "7w7QA7GBhzZ98OS0.js", + "wfrp4eSize": 882, + "frSize": 874, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "7wBWUw05q0igh508.js", + "wfrp4eSize": 852, + "frSize": 860, + "wfrp4eTexts": [], + "frTexts": [ + "

          ${this.actor.prototypeToken.name} gagne le Trait de Creature Insensible à la Douleur. Cet effet dure 1 heure, après quoi il disparait et le total des Blessures encaissés par le buveur sont encaissés d" + ] + }, + { + "file": "8GyJgdHVBaLrHCY8.js", + "wfrp4eSize": 684, + "frSize": 689, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "8TRiAJ8thIKE4IoL.js", + "wfrp4eSize": 196, + "frSize": 182, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "8araLuwmBq8GKEw3.js", + "wfrp4eSize": 310, + "frSize": 323, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "8rq4GL5d5nCn4kO7.js", + "wfrp4eSize": 240, + "frSize": 249, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.prototypeToken.name} regagne ${healed} Blessures" + ] + }, + { + "file": "8tyMXDfHR8AJBdDu.js", + "wfrp4eSize": 288, + "frSize": 296, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "8xqYrBIf1Zhlwizg.js", + "wfrp4eSize": 1193, + "frSize": 1190, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "8zTkDVziBPaNbMQX.js", + "wfrp4eSize": 607, + "frSize": 617, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "96Y1yIH1lRjTs5hL.js", + "wfrp4eSize": 102, + "frSize": 116, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "98nKfcimlaPeM9h5.js", + "wfrp4eSize": 129, + "frSize": 135, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "9A7rYY3FKi5XLihG.js", + "wfrp4eSize": 423, + "frSize": 437, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "9VfeubiCV83LN9iY.js", + "wfrp4eSize": 216, + "frSize": 212, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "9WZa63lr0K3SsP4G.js", + "wfrp4eSize": 192, + "frSize": 202, + "wfrp4eTexts": [ + "Applied after effects" + ], + "frTexts": [ + "Applique après les effets" + ] + }, + { + "file": "9Yn9uViEjcuaESJ2.js", + "wfrp4eSize": 232, + "frSize": 235, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "A0OK0qAMmnf8iNJf.js", + "wfrp4eSize": 382, + "frSize": 391, + "wfrp4eTexts": [], + "frTexts": [ + "Reçoit ${Math.abs(args.test.result.SL)} Points de Corruption" + ] + }, + { + "file": "A1odAcuRbq9797ZB.js", + "wfrp4eSize": 1946, + "frSize": 1908, + "wfrp4eTexts": [ + "Could not find ${talent}" + ], + "frTexts": [ + "Impossible de trouver ${talent}" + ] + }, + { + "file": "A6DcKPzAGntzSCil.js", + "wfrp4eSize": 187, + "frSize": 184, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ACtDCTLZXmd5uXjX.js", + "wfrp4eSize": 419, + "frSize": 430, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "AGD7zCyV4zruvnWu.js", + "wfrp4eSize": 122, + "frSize": 121, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "AMI2wDJqsIZsoq1e.js", + "wfrp4eSize": 372, + "frSize": 368, + "wfrp4eTexts": [], + "frTexts": [ + "Émet un nuage de poudre noire nauséabonde. Active l" + ] + }, + { + "file": "Adgs6Zs0FdefO6qx.js", + "wfrp4eSize": 217, + "frSize": 215, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Ah2wyywkL8hjJNXM.js", + "wfrp4eSize": 31, + "frSize": 31, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ApaLcUhuty3EzJoP.js", + "wfrp4eSize": 338, + "frSize": 352, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.prototypeToken.name} voit ses points de Destin augmentés de ${current} à ${fortunePoints + current}" + ] + }, + { + "file": "AqHLHp4kH6KULk3e.js", + "wfrp4eSize": 373, + "frSize": 387, + "wfrp4eTexts": [ + "None left!" + ], + "frTexts": [ + "Aucun disponible!" + ] + }, + { + "file": "AyNb5sj6FD2Z3Q5T.js", + "wfrp4eSize": 128, + "frSize": 134, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "BD7bVTU2pVoRSRBe.js", + "wfrp4eSize": 793, + "frSize": 802, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "BHbFqhJPzZI2txLs.js", + "wfrp4eSize": 394, + "frSize": 447, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Bj6bxItlgtI2sXVN.js", + "wfrp4eSize": 294, + "frSize": 268, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "CHnaBPHk6HdFS512.js", + "wfrp4eSize": 299, + "frSize": 305, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "CIxZYkHggBQ6EsHP.js", + "wfrp4eSize": 62, + "frSize": 70, + "wfrp4eTexts": [ + "Effect Used" + ], + "frTexts": [ + "Effet utilisé" + ] + }, + { + "file": "CS6O7UUjQcUJoOUP.js", + "wfrp4eSize": 564, + "frSize": 380, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "CW5Vlr57OaMkKJ8Q.js", + "wfrp4eSize": 293, + "frSize": 304, + "wfrp4eTexts": [ + "Advantage Subtracted", + "Not enough Advantage!" + ], + "frTexts": [ + "Avantage soustrait", + "Pas assez d" + ] + }, + { + "file": "CWNGrg7se91RC95g.js", + "wfrp4eSize": 443, + "frSize": 460, + "wfrp4eTexts": [], + "frTexts": [ + "${this.effect.name}: \n @Corruption[moderate]{Exposition Modérée à la Corruption}
          \n ${args.actor.prototypeToken.name} doit réussir un \n Test de Corruption (Modéré)" + ] + }, + { + "file": "Cjj4iLkdY1NaZRCi.js", + "wfrp4eSize": 599, + "frSize": 925, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ClkT2WG2UjVwQ97T.js", + "wfrp4eSize": 413, + "frSize": 415, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "DHxUKY9LMyifFgCi.js", + "wfrp4eSize": 90, + "frSize": 94, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "DVlZGbiuMIHEQOnM.js", + "wfrp4eSize": 413, + "frSize": 402, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.name} attaché à ${this.actor.getFlag(" + ] + }, + { + "file": "DWBxvzfWGcG7PVNP.js", + "wfrp4eSize": 218, + "frSize": 217, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "DhZqJso1JWYtGrKk.js", + "wfrp4eSize": 273, + "frSize": 279, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "E1vUepgop09FF5wy.js", + "wfrp4eSize": 785, + "frSize": 813, + "wfrp4eTexts": [ + "Not enough Advantage!", + "Adding ${frenzy.name}", + "Adding ${hatred.name}" + ], + "frTexts": [ + "Pas assez d", + "Ajout de ${frenzy.name}", + "Ajout de ${hatred.name}" + ] + }, + { + "file": "E3om295BMQojnM2F.js", + "wfrp4eSize": 140, + "frSize": 147, + "wfrp4eTexts": [ + "Removed Fatigued" + ], + "frTexts": [ + "Fatigue supprimée" + ] + }, + { + "file": "EBNrA6FNX4d05EUx.js", + "wfrp4eSize": 30, + "frSize": 30, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "EC8cZmqrE095cDc2.js", + "wfrp4eSize": 906, + "frSize": 914, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "EJObiSth3WdcJOXN.js", + "wfrp4eSize": 176, + "frSize": 186, + "wfrp4eTexts": [ + "Adding Prone" + ], + "frTexts": [ + "Ajout de A Terre" + ] + }, + { + "file": "EJaBfqADqlo92Fx6.js", + "wfrp4eSize": 219, + "frSize": 215, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ENGmwaItRXO5s0XY.js", + "wfrp4eSize": 255, + "frSize": 265, + "wfrp4eTexts": [], + "frTexts": [ + "Soigne ${this.actor.system.characteristics.t.bonus * 3} Blessures" + ] + }, + { + "file": "ERxrWzSpw8qwxFVi.js", + "wfrp4eSize": 97, + "frSize": 105, + "wfrp4eTexts": [ + "Cannot enter ${this.effect.name}!" + ], + "frTexts": [ + "Ne peut entrer ${this.effect.name}!" + ] + }, + { + "file": "EdTChmSouS0MSmk5.js", + "wfrp4eSize": 313, + "frSize": 352, + "wfrp4eTexts": [], + "frTexts": [ + "Peut effectuer une Action ou un Mouvement (en choisir un)", + "Ne peut pas effectuer d" + ] + }, + { + "file": "FMA16PvoObBV8vDl.js", + "wfrp4eSize": 263, + "frSize": 269, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "FPYNcxm21678boLT.js", + "wfrp4eSize": 787, + "frSize": 785, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "FSqUqSByMiztYOQM.js", + "wfrp4eSize": 270, + "frSize": 294, + "wfrp4eTexts": [], + "frTexts": [ + "Infecté: ${args.actor.name} doit réussir un Test de Résistance Facile (+40) ou recevoir une @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Blessure Purulente}" + ] + }, + { + "file": "FZFOC7bip0oiWEzk.js", + "wfrp4eSize": 196, + "frSize": 206, + "wfrp4eTexts": [ + "Added Bleeding" + ], + "frTexts": [ + "Ajout d" + ] + }, + { + "file": "FiD3mvWIBHNNIuO9.js", + "wfrp4eSize": 227, + "frSize": 232, + "wfrp4eTexts": [], + "frTexts": [ + "Localisation changée : Tête" + ] + }, + { + "file": "FqevMs0ukQ9WuUHl.js", + "wfrp4eSize": 349, + "frSize": 345, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "FtZf56VI6Qsspu0D.js", + "wfrp4eSize": 1215, + "frSize": 1210, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Fwk8WA8NfRivLFWJ.js", + "wfrp4eSize": 50, + "frSize": 53, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "G7sFEnJlXZvfXL3V.js", + "wfrp4eSize": 373, + "frSize": 384, + "wfrp4eTexts": [ + "None left!" + ], + "frTexts": [ + "Aucun restant!" + ] + }, + { + "file": "GRfCxtYzmEx2LYU7.js", + "wfrp4eSize": 449, + "frSize": 418, + "wfrp4eTexts": [], + "frTexts": [ + "Deux @UUID[Compendium.wfrp4e-eis.actors.iDy8SDTwJSlCzZMl]{Horreurs Bleues de Tzeentch} sortent de la chair hurlante de ${this.actor.name}, le tuant au passage." + ] + }, + { + "file": "GTZUO73pUJKpM1JB.js", + "wfrp4eSize": 257, + "frSize": 237, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "GjkxWj9wCAclM9WA.js", + "wfrp4eSize": 540, + "frSize": 580, + "wfrp4eTexts": [ + "All Effects have been used. Reset to select them again" + ], + "frTexts": [ + "Tous les effets ont été utilisés. Les remettre à 0 pour les utiliser à nouveau" + ] + }, + { + "file": "GsAyB5xnK3ASeoah.js", + "wfrp4eSize": 1210, + "frSize": 1205, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "GzSFlqL1YrIK1dxh.js", + "wfrp4eSize": 802, + "frSize": 811, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "GzsuEg7gZy1f0ljy.js", + "wfrp4eSize": 242, + "frSize": 256, + "wfrp4eTexts": [ + "Cleared ${bleeding.conditionValue} Bleeding Conditions", + "No Bleeding Conditions" + ], + "frTexts": [ + "Suppression de ${bleeding.conditionValue} états Hémorragiques", + "Aucune Hémorragie" + ] + }, + { + "file": "H06Ysj7oPiemW7S6.js", + "wfrp4eSize": 1383, + "frSize": 1392, + "wfrp4eTexts": [], + "frTexts": [ + "${args.actor.name}" + ] + }, + { + "file": "H85k4L3yICm7cfIk.js", + "wfrp4eSize": 1197, + "frSize": 1193, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "HG2fKOfruT5QV3A4.js", + "wfrp4eSize": 929, + "frSize": 943, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "HJ2X4ZtXei0BXbxf.js", + "wfrp4eSize": 441, + "frSize": 445, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "HYrl5aNMm8BAdqH7.js", + "wfrp4eSize": 333, + "frSize": 133, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "HmImVzvw6ecBy99l.js", + "wfrp4eSize": 173, + "frSize": 183, + "wfrp4eTexts": [ + "Added Bleeding" + ], + "frTexts": [ + "Ajout Hémorragique" + ] + }, + { + "file": "HoNTnPphrJISSQr1.js", + "wfrp4eSize": 193, + "frSize": 196, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "I1J2m5uud84N50Lk.js", + "wfrp4eSize": 162, + "frSize": 188, + "wfrp4eTexts": [ + "Cannot cast Spells or use Prayers" + ], + "frTexts": [ + "Impossible d" + ] + }, + { + "file": "IAGla7HJlYN0wa4H.js", + "wfrp4eSize": 275, + "frSize": 294, + "wfrp4eTexts": [], + "frTexts": [ + "Test de Force Mentale échoué, ${this.actor.prototypeToken.name} subit des @Symptom[Convulsions] pour [[1d10]] heures" + ] + }, + { + "file": "ILqHxk7deotgI3KD.js", + "wfrp4eSize": 269, + "frSize": 271, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "IfEu1hO8sKEZBpvg.js", + "wfrp4eSize": 310, + "frSize": 309, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "IrkWq7IiFS65bTvC.js", + "wfrp4eSize": 353, + "frSize": 370, + "wfrp4eTexts": [], + "frTexts": [ + "

          ${speaker.alias} tombe lourdements dans l" + ] + }, + { + "file": "IslMfFgpgQq2brpu.js", + "wfrp4eSize": 135, + "frSize": 159, + "wfrp4eTexts": [ + "Cannot have Broken" + ], + "frTexts": [ + "Impossible de supprimer l" + ] + }, + { + "file": "IupskvzvoGyD2H5o.js", + "wfrp4eSize": 1703, + "frSize": 1343, + "wfrp4eTexts": [ + "Adding ", + "Could not find any Blessings associated with ${god}." + ], + "frTexts": [ + "Adding ", + "Impossible de trouver any Blessings associated with ${god}." + ] + }, + { + "file": "IzoOmDywGLqLNljN.js", + "wfrp4eSize": 653, + "frSize": 648, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "JXBUE0XuJOJNG7zE.js", + "wfrp4eSize": 580, + "frSize": 587, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "JhbZWZhOJ23yOBmG.js", + "wfrp4eSize": 1210, + "frSize": 1205, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Jjq3oPYbI26zjxME.js", + "wfrp4eSize": 530, + "frSize": 531, + "wfrp4eTexts": [ + "Dropped ${dropped.map(i => i.name).join(" + ], + "frTexts": [ + "Lache ${dropped.map(i => i.name).join(" + ] + }, + { + "file": "JmZQRvdWjm9ykYfn.js", + "wfrp4eSize": 137, + "frSize": 144, + "wfrp4eTexts": [], + "frTexts": [ + "Ne peut être surpris" + ] + }, + { + "file": "Jnp5c09sPzDD61EK.js", + "wfrp4eSize": 185, + "frSize": 208, + "wfrp4eTexts": [ + "${args.actor.prototypeToken.name} must pass an Average (+20) Willpower Test to attack this target!" + ], + "frTexts": [ + "${args.actor.prototypeToken.name} doit réussir un Test Accessible (+20) de Force Mentale pour attaquer cette cible!" + ] + }, + { + "file": "KD4nCSdSXJVJmk0R.js", + "wfrp4eSize": 154, + "frSize": 160, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "KGK9vL1Yl0qmCeCN.js", + "wfrp4eSize": 2503, + "frSize": 2502, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "KICZPwLvbUSxbDrE.js", + "wfrp4eSize": 488, + "frSize": 512, + "wfrp4eTexts": [ + "Cannot find table with key: mutatemental", + "Item could not be found: ", + "${item.name} added" + ], + "frTexts": [ + "Impossible de trouver la table des Mutations Mentales", + "Impossible de trouver l", + "${item.name} added" + ] + }, + { + "file": "KQzbrpb0T5a7it4k.js", + "wfrp4eSize": 216, + "frSize": 216, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "KVpDUEjHhd3nLa0f.js", + "wfrp4eSize": 236, + "frSize": 242, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "KmngDrPD72xn22kZ.js", + "wfrp4eSize": 588, + "frSize": 606, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.prototypeToken.name} perd ${toughnessLost} points d" + ] + }, + { + "file": "LQEWSN5KnHHATPsf.js", + "wfrp4eSize": 262, + "frSize": 281, + "wfrp4eTexts": [], + "frTexts": [ + "${args.actor.name} doit réussir un Test Facile (+40) d" + ] + }, + { + "file": "Lp261O9fgEXmgPf3.js", + "wfrp4eSize": 241, + "frSize": 236, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "LyAK0dVDS5L09yq2.js", + "wfrp4eSize": 246, + "frSize": 256, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.prototypeToken.name} récupère ${bonus} Blessures" + ] + }, + { + "file": "M5bh0heeafA2fQQ8.js", + "wfrp4eSize": 347, + "frSize": 345, + "wfrp4eTexts": [], + "frTexts": [ + "${this.effect.name} s" + ] + }, + { + "file": "MDLttXplnNthncGr.js", + "wfrp4eSize": 121, + "frSize": 120, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "MFKhU9vp8bQpHP3I.js", + "wfrp4eSize": 313, + "frSize": 313, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Me1wS5XdqUEy7OGt.js", + "wfrp4eSize": 312, + "frSize": 335, + "wfrp4eTexts": [], + "frTexts": [ + "{this.actor.name} subit un ${crit} (localisation : ${loc}). Ne pas appliquer d" + ] + }, + { + "file": "MfxWXZwaZUjGSBqw.js", + "wfrp4eSize": 145, + "frSize": 157, + "wfrp4eTexts": [ + "Immune to Ablaze" + ], + "frTexts": [ + "Immunisé à En Flammes" + ] + }, + { + "file": "MfxzwJz2o9ho2hOM.js", + "wfrp4eSize": 46, + "frSize": 49, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "MgMMoC4Umpg7fmNI.js", + "wfrp4eSize": 1040, + "frSize": 1069, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.name} porte ${this.item.name}.
          \n Il ne peut plus lancer de Sorts ni effectuer de Prières ni Miracles.
          \n S", + "${this.item.name} sur ${this.actor.name} a été enlevé et à perdu ses propriétés. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils devront être supprimés manuellement." + ] + }, + { + "file": "Mhb67xufvA9uWO21.js", + "wfrp4eSize": 356, + "frSize": 375, + "wfrp4eTexts": [], + "frTexts": [ + "Attaque Caudale: ${args.actor.prototypeToken.name} est désormais A Terre" + ] + }, + { + "file": "Mir4FMHQRdVqazAF.js", + "wfrp4eSize": 505, + "frSize": 529, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "MnqQkXVp20Lw84I1.js", + "wfrp4eSize": 331, + "frSize": 337, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Msygc7oQQPB5fw0b.js", + "wfrp4eSize": 633, + "frSize": 637, + "wfrp4eTexts": [], + "frTexts": [ + "Reçoit ${points.total} Point de Corruption", + "Perd ${points} Point de Corruption" + ] + }, + { + "file": "MwUzyAgd0yPnmZCH.js", + "wfrp4eSize": 242, + "frSize": 241, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "N2MeOlf0GjPiRcSb.js", + "wfrp4eSize": 115, + "frSize": 114, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "N7nGncsPrTz2ZbDA.js", + "wfrp4eSize": 51, + "frSize": 51, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "N8hA6ysHCTlLd8Kj.js", + "wfrp4eSize": 2107, + "frSize": 2142, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "Na7Nanl9YmxZlTo7.js", + "wfrp4eSize": 56, + "frSize": 57, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "NdquQqyuOkGCj8Uo.js", + "wfrp4eSize": 485, + "frSize": 486, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "NrVFrIXM8GnIbojv.js", + "wfrp4eSize": 84, + "frSize": 86, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "O45vpR4jDbQQnmvJ.js", + "wfrp4eSize": 477, + "frSize": 474, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "O7lXFZLrLdFaShGR.js", + "wfrp4eSize": 28, + "frSize": 28, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "OEy2lxvic37dRBEt.js", + "wfrp4eSize": 607, + "frSize": 617, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "OGX4BneaYAnV25TO.js", + "wfrp4eSize": 1076, + "frSize": 1041, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "OeKeQAAcJhdI4Qky.js", + "wfrp4eSize": 172, + "frSize": 179, + "wfrp4eTexts": [ + "Disabled!" + ], + "frTexts": [ + "Désactivé!" + ] + }, + { + "file": "OicQSEVZBbqLtrcf.js", + "wfrp4eSize": 354, + "frSize": 376, + "wfrp4eTexts": [], + "frTexts": [ + "Guéri de ${choice.map(i => i.name).join(" + ] + }, + { + "file": "Op88kMtimSEWlY2h.js", + "wfrp4eSize": 288, + "frSize": 301, + "wfrp4eTexts": [ + "None left!" + ], + "frTexts": [ + "Aucun disponible!" + ] + }, + { + "file": "OsLXutfXyQCAkhAf.js", + "wfrp4eSize": 1207, + "frSize": 1203, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "OxsBnnVI3Smpknpb.js", + "wfrp4eSize": 199, + "frSize": 203, + "wfrp4eTexts": [ + "${this.actor.name} loses 1 Advantage" + ], + "frTexts": [ + "${this.actor.name} perd 1 Avantage" + ] + }, + { + "file": "Oz7pWF9mEc1pQypj.js", + "wfrp4eSize": 210, + "frSize": 184, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "PBW6IZtwawNHxB6y.js", + "wfrp4eSize": 49, + "frSize": 49, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "PI1QNaKFeqood6d7.js", + "wfrp4eSize": 649, + "frSize": 653, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "PeZYj8b0vedyJj00.js", + "wfrp4eSize": 574, + "frSize": 583, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Ph3TdQw1lGiFr049.js", + "wfrp4eSize": 956, + "frSize": 968, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "PmELrzD3RmF9qKkO.js", + "wfrp4eSize": 497, + "frSize": 387, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Pn5fekTbkwlr61XU.js", + "wfrp4eSize": 1216, + "frSize": 1211, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "PsO7aTdELJt35eHP.js", + "wfrp4eSize": 452, + "frSize": 400, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "PwqTmw7rsG8hzqCS.js", + "wfrp4eSize": 428, + "frSize": 430, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.name} subit @UUID[Compendium.${results.documentCollection}.${results.documentId}]{${results.text}}" + ] + }, + { + "file": "Q1trEhtqjIiDvFPF.js", + "wfrp4eSize": 73, + "frSize": 85, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Q68WiUWY7GxiXBbT.js", + "wfrp4eSize": 265, + "frSize": 267, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Q7eULXQ9AfDRmUGO.js", + "wfrp4eSize": 1222, + "frSize": 1217, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "QNxmImpLTou6WdMQ.js", + "wfrp4eSize": 208, + "frSize": 232, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "QRSACifDrvojIXHB.js", + "wfrp4eSize": 299, + "frSize": 303, + "wfrp4eTexts": [ + "No Conditions on this Actor" + ], + "frTexts": [ + "Aucun état sur cet Acteur" + ] + }, + { + "file": "Qgn92fZyc3Psn8QJ.js", + "wfrp4eSize": 572, + "frSize": 521, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Qk7t2l5ep9RDVpgE.js", + "wfrp4eSize": 27, + "frSize": 27, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "QoEOxRruQXYrZrv3.js", + "wfrp4eSize": 403, + "frSize": 399, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "QqybHxNCzPEzG1Qh.js", + "wfrp4eSize": 36, + "frSize": 64, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "QwHoqu2oO8QO8Mad.js", + "wfrp4eSize": 187, + "frSize": 213, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "R32U01LBjBrK1pns.js", + "wfrp4eSize": 1504, + "frSize": 1505, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "R6SnyF3y4Vsq6oga.js", + "wfrp4eSize": 394, + "frSize": 447, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "R8FBHZaaARA3z9pB.js", + "wfrp4eSize": 1217, + "frSize": 1212, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "R8ecKGRzOr4ThvVa.js", + "wfrp4eSize": 1214, + "frSize": 1209, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "RKIFGN583PQnqHGk.js", + "wfrp4eSize": 181, + "frSize": 188, + "wfrp4eTexts": [], + "frTexts": [ + "Ajout de 2 état Hémorragiques" + ] + }, + { + "file": "ROXCqAFSTLouJniL.js", + "wfrp4eSize": 238, + "frSize": 244, + "wfrp4eTexts": [], + "frTexts": [ + "${this.item.name} Surcharge!" + ] + }, + { + "file": "RPqgRUkiLY5thVbC.js", + "wfrp4eSize": 1211, + "frSize": 1206, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "RSsGiDFibuqg3sHr.js", + "wfrp4eSize": 377, + "frSize": 383, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "RlhOAKfN0ghrrooR.js", + "wfrp4eSize": 283, + "frSize": 289, + "wfrp4eTexts": [ + "Holed Ratings of ${this.actor.name} have been doubled." + ], + "frTexts": [ + "Holed Ratings of ${this.actor.name} have been doubled." + ] + }, + { + "file": "Rnpw6UQdJifLeuna.js", + "wfrp4eSize": 63, + "frSize": 72, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "RvipIYj9H7n4UDMe.js", + "wfrp4eSize": 1658, + "frSize": 1672, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "RwMw848y13Jq2L4f.js", + "wfrp4eSize": 646, + "frSize": 651, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "S1QihXuvdEVzeRtB.js", + "wfrp4eSize": 923, + "frSize": 936, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "S3Dev4hleOYqDNe9.js", + "wfrp4eSize": 705, + "frSize": 713, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "S4793DLFhjMxpM8x.js", + "wfrp4eSize": 106, + "frSize": 106, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "SGr50Hq1AHIEzIFN.js", + "wfrp4eSize": 286, + "frSize": 295, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "SLy1Fs3oXcHgFgjK.js", + "wfrp4eSize": 335, + "frSize": 321, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "SWIJjM2RCmzfr64u.js", + "wfrp4eSize": 255, + "frSize": 254, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "StAderQaQQsxb6Rv.js", + "wfrp4eSize": 316, + "frSize": 322, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "T5fiTzhXEQAv9Drf.js", + "wfrp4eSize": 590, + "frSize": 594, + "wfrp4eTexts": [ + "Dropped ${dropped.map(i => i.name).join(" + ], + "frTexts": [ + "Laché ${dropped.map(i => i.name).join(" + ] + }, + { + "file": "TAw9vXnfyIAl5DGs.js", + "wfrp4eSize": 376, + "frSize": 386, + "wfrp4eTexts": [ + "None left!" + ], + "frTexts": [ + "Quantité insuffisante!" + ] + }, + { + "file": "TBpNFRL5uehs0fze.js", + "wfrp4eSize": 269, + "frSize": 287, + "wfrp4eTexts": [ + "None left!" + ], + "frTexts": [ + "Quantité insuffisante!" + ] + }, + { + "file": "TCtXPvDpbfz1yrVZ.js", + "wfrp4eSize": 1952, + "frSize": 1912, + "wfrp4eTexts": [ + "Could not find ${talent}" + ], + "frTexts": [ + "Impossible de trouver ${talent}" + ] + }, + { + "file": "TGN070HeJLl3gSMY.js", + "wfrp4eSize": 229, + "frSize": 226, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "TwgdEucxcHloc4cX.js", + "wfrp4eSize": 2626, + "frSize": 2724, + "wfrp4eTexts": [ + "Could not find ${c.name}" + ], + "frTexts": [ + "Impossible de trouver ${c.name}" + ] + }, + { + "file": "TxfmxDGBj04AQQpt.js", + "wfrp4eSize": 321, + "frSize": 316, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "U1RUcgP8LD2qeGTm.js", + "wfrp4eSize": 27, + "frSize": 27, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "U1UpSRJOSjPpO4HS.js", + "wfrp4eSize": 319, + "frSize": 290, + "wfrp4eTexts": [ + "Added ${mutations[roll].name}" + ], + "frTexts": [ + "Ajout ${mutations[roll].name}" + ] + }, + { + "file": "U26XMie3Kjoddisj.js", + "wfrp4eSize": 227, + "frSize": 236, + "wfrp4eTexts": [ + "Cleared 1 Stunned Condition", + "No Stunned Conditions" + ], + "frTexts": [ + "Suppression de 1 état Assomé", + "Aucun état Assomé" + ] + }, + { + "file": "UDPsaymtZf39UsMk.js", + "wfrp4eSize": 410, + "frSize": 247, + "wfrp4eTexts": [ + "Fatigued added to " + ], + "frTexts": [ + "Fatigue ajouté à " + ] + }, + { + "file": "UH5MIzqi2MvEqTwj.js", + "wfrp4eSize": 268, + "frSize": 242, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ULmZMLezDamerN04.js", + "wfrp4eSize": 864, + "frSize": 852, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "UQtXuQmUlTyDKqhe.js", + "wfrp4eSize": 4069, + "frSize": 4096, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "UgQW0UMPOZ0jwfVJ.js", + "wfrp4eSize": 235, + "frSize": 250, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.prototypeToken.name} voit ses Points de Chance augmenter de ${current} à ${1 + current}" + ] + }, + { + "file": "UlRSaZG4ZUU6fMND.js", + "wfrp4eSize": 1224, + "frSize": 1219, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "UnqnWi0dZYLf5fTT.js", + "wfrp4eSize": 2626, + "frSize": 2535, + "wfrp4eTexts": [ + "Could not find ${c.name}" + ], + "frTexts": [ + "Impossible de trouver ${c.name}" + ] + }, + { + "file": "UsuwsmU1TUQLQVM2.js", + "wfrp4eSize": 173, + "frSize": 290, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "V1D2Uo3WDKYQePU3.js", + "wfrp4eSize": 614, + "frSize": 627, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "V9wD9FWHWxZUOGSI.js", + "wfrp4eSize": 489, + "frSize": 502, + "wfrp4eTexts": [ + "Fell Unconscious", + "Gained ${fatigued} conditions" + ], + "frTexts": [ + "Tombe Incoscient", + "Subit ${fatigued} état Fatigué" + ] + }, + { + "file": "V9xm4X1x3lPYTQaI.js", + "wfrp4eSize": 147, + "frSize": 157, + "wfrp4eTexts": [ + "Immune to Fear" + ], + "frTexts": [ + "Immunisé à la Peur" + ] + }, + { + "file": "V9zm2hKUVLVZtAcN.js", + "wfrp4eSize": 3124, + "frSize": 3154, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trait}", + "Could not find ${trapping}", + "Could not find ${spell}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trait}", + "Impossible de trouver ${trapping}", + "Impossible de trouver ${spell}" + ] + }, + { + "file": "VAPsww9x3HAw1sKP.js", + "wfrp4eSize": 26, + "frSize": 26, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "VINX6TBAJQznhVcN.js", + "wfrp4eSize": 1242, + "frSize": 1239, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "VLdF2HPnCrNIgp7a.js", + "wfrp4eSize": 463, + "frSize": 461, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "VzgTGb5QXKoyPNh3.js", + "wfrp4eSize": 651, + "frSize": 655, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "W9nyUNQStMr1pUHJ.js", + "wfrp4eSize": 169, + "frSize": 184, + "wfrp4eTexts": [ + "Added Bleeding" + ], + "frTexts": [ + "Ajout de Hémorragique" + ] + }, + { + "file": "WB6sIpLEPC8YPX67.js", + "wfrp4eSize": 153, + "frSize": 167, + "wfrp4eTexts": [ + "Cannot Dodge!" + ], + "frTexts": [ + "Ne peut pas esquiver!" + ] + }, + { + "file": "WO5n7Vbx8AgoVrwC.js", + "wfrp4eSize": 1755, + "frSize": 1769, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "WR0Kqn8CF5iwToak.js", + "wfrp4eSize": 1219, + "frSize": 1214, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "WiYtNU2Y5BJfIpeM.js", + "wfrp4eSize": 341, + "frSize": 345, + "wfrp4eTexts": [ + "Dropped ${dropped.map(i => i.name).join(" + ], + "frTexts": [ + "Lache ${dropped.map(i => i.name).join(" + ] + }, + { + "file": "Wo4wQKUxSItAhRzZ.js", + "wfrp4eSize": 394, + "frSize": 447, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "X3vpmNUj9SL2CDnF.js", + "wfrp4eSize": 118, + "frSize": 120, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "XO9m2AvFRAAeEuty.js", + "wfrp4eSize": 225, + "frSize": 223, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "XcvDYNZgJ2rpAdDV.js", + "wfrp4eSize": 410, + "frSize": 252, + "wfrp4eTexts": [ + "Fatigued added to " + ], + "frTexts": [ + "Etat Fatigué ajouté à " + ] + }, + { + "file": "Xe8ijqWU3bbtq7ZY.js", + "wfrp4eSize": 176, + "frSize": 180, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Xk9XPklxxTvFlwpI.js", + "wfrp4eSize": 41, + "frSize": 41, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Y7McxsHFeGhwQx0J.js", + "wfrp4eSize": 359, + "frSize": 345, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Y8J66v8VTKUASGuK.js", + "wfrp4eSize": 477, + "frSize": 481, + "wfrp4eTexts": [ + "No Conditions on this Actor" + ], + "frTexts": [ + "Aucun état sur cet acteur" + ] + }, + { + "file": "YHEIkBKWXKNPqglh.js", + "wfrp4eSize": 141, + "frSize": 133, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "YJX7WnxzXXIVdH6P.js", + "wfrp4eSize": 986, + "frSize": 954, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "YN8719gme9AxYtyY.js", + "wfrp4eSize": 3213, + "frSize": 3230, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "YQ2LnLxp0xgy3meI.js", + "wfrp4eSize": 156, + "frSize": 153, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "YRUTliBzAQvncGNX.js", + "wfrp4eSize": 79, + "frSize": 87, + "wfrp4eTexts": [ + "Added Fatigued" + ], + "frTexts": [ + "Ajout de Fatigué" + ] + }, + { + "file": "YaKnYEbmmZZtByJc.js", + "wfrp4eSize": 180, + "frSize": 187, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "YjJcRdytVRm88qLn.js", + "wfrp4eSize": 33, + "frSize": 33, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "YwLEw4BiKq4EMy57.js", + "wfrp4eSize": 580, + "frSize": 592, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "YySjPfSAPdMAfjsh.js", + "wfrp4eSize": 423, + "frSize": 416, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "Z52yZDm6lP6fOP3O.js", + "wfrp4eSize": 132, + "frSize": 143, + "wfrp4eTexts": [ + "Immune to Ablaze" + ], + "frTexts": [ + "Immunisé à En Flammes" + ] + }, + { + "file": "Z6jNlyZMECkW4Hon.js", + "wfrp4eSize": 599, + "frSize": 600, + "wfrp4eTexts": [], + "frTexts": [ + "Choisir @UUID[${choice[0].uuid}]{${choice[0].name}}" + ] + }, + { + "file": "ZCBcwbVFHFTFRntb.js", + "wfrp4eSize": 1217, + "frSize": 1212, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ZCkYe5XMVY1RWMXG.js", + "wfrp4eSize": 32, + "frSize": 32, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ZCuOjLAeENKN1Q4L.js", + "wfrp4eSize": 455, + "frSize": 420, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ZEXhYJqqxF6QAixX.js", + "wfrp4eSize": 75, + "frSize": 75, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ZNu4B0OdjkM9lmtu.js", + "wfrp4eSize": 221, + "frSize": 218, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ZRoG7GiMDQWso6gN.js", + "wfrp4eSize": 1222, + "frSize": 1217, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ZTE8LdRblyG4yYoE.js", + "wfrp4eSize": 266, + "frSize": 268, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ZdHvGvSJBsIuPphF.js", + "wfrp4eSize": 70, + "frSize": 66, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ZqTW093qENOwGONP.js", + "wfrp4eSize": 263, + "frSize": 269, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "a02tlRCXpaoaDjSN.js", + "wfrp4eSize": 604, + "frSize": 568, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "a7pEvCycVnFBXGAQ.js", + "wfrp4eSize": 228, + "frSize": 215, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "a8i0sA1RBnD8nHZt.js", + "wfrp4eSize": 1398, + "frSize": 1394, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "aCVtaW8ag1WibcAr.js", + "wfrp4eSize": 124, + "frSize": 133, + "wfrp4eTexts": [], + "frTexts": [ + "${args.attacker.prototypeToken.name} récupère 1 Blessure." + ] + }, + { + "file": "aIYUsBIDKWJ3CEtj.js", + "wfrp4eSize": 80, + "frSize": 86, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "abLWYtNTu1UVDQAs.js", + "wfrp4eSize": 264, + "frSize": 268, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "aeBetniKqq5SD9Ou.js", + "wfrp4eSize": 2685, + "frSize": 2700, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "b2Kb4IuD22RhKhR0.js", + "wfrp4eSize": 216, + "frSize": 225, + "wfrp4eTexts": [ + "No target!" + ], + "frTexts": [ + "Aucune cible!" + ] + }, + { + "file": "b2WaqRna5CFXmbDG.js", + "wfrp4eSize": 25, + "frSize": 25, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "b5DfAWtpV1x2R8If.js", + "wfrp4eSize": 113, + "frSize": 119, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "bEVlJOOA1kLlzpWx.js", + "wfrp4eSize": 2274, + "frSize": 2326, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "bLkt8VpTTPoTxW0W.js", + "wfrp4eSize": 174, + "frSize": 184, + "wfrp4eTexts": [ + "Added Bleeding" + ], + "frTexts": [ + "Ajout d" + ] + }, + { + "file": "bMEFHPCei2evnZZw.js", + "wfrp4eSize": 565, + "frSize": 566, + "wfrp4eTexts": [], + "frTexts": [ + "\n ${this.effect.name}:
          \n ${args.actor.name} reçoit un état @Condition[Empoisonné], qui peut être résisté avec un Test de Résistance Difficile (-10)." + ] + }, + { + "file": "bQyVajMN1ETwlzvM.js", + "wfrp4eSize": 358, + "frSize": 364, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "btPrQkGRKUkhNe3N.js", + "wfrp4eSize": 47, + "frSize": 49, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "cK1Jysfu5IMUUH0C.js", + "wfrp4eSize": 321, + "frSize": 334, + "wfrp4eTexts": [], + "frTexts": [ + "Protection améliorée de " + ] + }, + { + "file": "chUpiI3el8IO8MSs.js", + "wfrp4eSize": 261, + "frSize": 276, + "wfrp4eTexts": [], + "frTexts": [ + "Récupère ${woundsGained} Blessures" + ] + }, + { + "file": "dIxYt421K010eogY.js", + "wfrp4eSize": 333, + "frSize": 331, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "dM449AU0FQRnOc3l.js", + "wfrp4eSize": 90, + "frSize": 89, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "dWr3tkFoIzsAgelu.js", + "wfrp4eSize": 594, + "frSize": 647, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "dbOSvpgcPjsc2uvq.js", + "wfrp4eSize": 391, + "frSize": 386, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "dcwY8dCd3PNCEzk6.js", + "wfrp4eSize": 226, + "frSize": 243, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.prototypeToken.name} voit ses Points de Destin augmentés de ${current} à ${current + 1}" + ] + }, + { + "file": "e34s1XxHckAWfwHt.js", + "wfrp4eSize": 281, + "frSize": 281, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "e7IxnxePdXSy6L4E.js", + "wfrp4eSize": 199, + "frSize": 209, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.prototypeToken.name} subit une @Table[crithead]{Blessure Critique} si il n" + ] + }, + { + "file": "ePPgxQOqL1Uhz2k9.js", + "wfrp4eSize": 1649, + "frSize": 1906, + "wfrp4eTexts": [ + "Could not find ${talent}" + ], + "frTexts": [ + "Impossible de trouver ${talent}" + ] + }, + { + "file": "ebDQH0MdGAG02CHl.js", + "wfrp4eSize": 470, + "frSize": 473, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ed7Sud9HM3uB2j6b.js", + "wfrp4eSize": 523, + "frSize": 534, + "wfrp4eTexts": [ + "Adding " + ], + "frTexts": [ + "Ajout de " + ] + }, + { + "file": "egDtqMxe3iekc6hv.js", + "wfrp4eSize": 240, + "frSize": 243, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "eh1J3s0s4A2AxoFp.js", + "wfrp4eSize": 214, + "frSize": 215, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ekjJQHyMbZT2vqdc.js", + "wfrp4eSize": 268, + "frSize": 291, + "wfrp4eTexts": [ + "Used ${uses} times", + "Used up" + ], + "frTexts": [ + "Utilisé ${uses} fois", + "Utilisé" + ] + }, + { + "file": "eqxE7nBO13yJS7hc.js", + "wfrp4eSize": 206, + "frSize": 212, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ezGqDoC9hNRBnFTB.js", + "wfrp4eSize": 359, + "frSize": 363, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "f29Pv6TQtgILxt1h.js", + "wfrp4eSize": 767, + "frSize": 768, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "fEFfHFeJxkR0aIJK.js", + "wfrp4eSize": 366, + "frSize": 430, + "wfrp4eTexts": [], + "frTexts": [ + "Tous ceux dans un rayon de 7 mètres perde 1 Point de Blessure et doivent faire un Test de Résistance Difficile (-10) ou recevoir l" + ] + }, + { + "file": "fPKYkBllp7Et62lX.js", + "wfrp4eSize": 114, + "frSize": 90, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "fcY3pa72dELnOFXV.js", + "wfrp4eSize": 28, + "frSize": 28, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "feMPZhhFeXRtKdKY.js", + "wfrp4eSize": 274, + "frSize": 284, + "wfrp4eTexts": [ + "None left!" + ], + "frTexts": [ + "Aucun restant!" + ] + }, + { + "file": "fiF9sM5UpcHMYa33.js", + "wfrp4eSize": 295, + "frSize": 295, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ft0LaRWZT5WtnptP.js", + "wfrp4eSize": 355, + "frSize": 366, + "wfrp4eTexts": [ + "Advantage Subtracted", + "Not enough Advantage!" + ], + "frTexts": [ + "Avantage soustrait", + "Pas assez d" + ] + }, + { + "file": "fzTB7t3x4bLmAXji.js", + "wfrp4eSize": 231, + "frSize": 242, + "wfrp4eTexts": [ + "Healed ${roll.total} Wounds" + ], + "frTexts": [ + "Soins de ${roll.total} Blessures" + ] + }, + { + "file": "g1L8OYO9nCOhdKGL.js", + "wfrp4eSize": 533, + "frSize": 539, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "gKIPujyuFSn0No9v.js", + "wfrp4eSize": 117, + "frSize": 138, + "wfrp4eTexts": [ + "Reset Powers" + ], + "frTexts": [ + "Ré-initialiser les pouvoirs" + ] + }, + { + "file": "gPQrszvIgGlW9yM4.js", + "wfrp4eSize": 103, + "frSize": 79, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "goz8yTlMozlsz3uY.js", + "wfrp4eSize": 1201, + "frSize": 1196, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "groEX1wJ9l00PkDF.js", + "wfrp4eSize": 2361, + "frSize": 2371, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "h766UvswLCsxcMow.js", + "wfrp4eSize": 3017, + "frSize": 3045, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trait}", + "Could not find ${trapping}", + "Could not find ${spell}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trait}", + "Impossible de trouver ${trapping}", + "Impossible de trouver ${spell}" + ] + }, + { + "file": "hA8PzeiCsHqqlUZm.js", + "wfrp4eSize": 215, + "frSize": 226, + "wfrp4eTexts": [], + "frTexts": [ + "Gaine de @Condition[Nausée] pour [[1d10]] heures" + ] + }, + { + "file": "hCzxUyO6mjLNIpaM.js", + "wfrp4eSize": 284, + "frSize": 303, + "wfrp4eTexts": [], + "frTexts": [ + "Récupération de ${woundsGained} Blessures" + ] + }, + { + "file": "hSImyYjL0CENTvXf.js", + "wfrp4eSize": 646, + "frSize": 651, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "hYNWp75ggWSTht55.js", + "wfrp4eSize": 238, + "frSize": 267, + "wfrp4eTexts": [], + "frTexts": [ + "Peut effectuer un jet sur the @Table[crithead]{Coups Critiques à la Tête} au lieu de la localisation normale" + ] + }, + { + "file": "hhCs5VBKx50S5IsY.js", + "wfrp4eSize": 27, + "frSize": 27, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "hhv7PrRdlf9sfC82.js", + "wfrp4eSize": 1749, + "frSize": 1766, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "hlHKeFWrOA8CsLr9.js", + "wfrp4eSize": 80, + "frSize": 55, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "hmk8zV1LTElHUI8A.js", + "wfrp4eSize": 304, + "frSize": 313, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "hpwJRAhCsXTp9bd9.js", + "wfrp4eSize": 2554, + "frSize": 2426, + "wfrp4eTexts": [ + "Could not find ${talent}" + ], + "frTexts": [ + "Impossible de trouver ${talent}" + ] + }, + { + "file": "hwOZxgt7e65iWvYz.js", + "wfrp4eSize": 354, + "frSize": 360, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "hxmwtw5zAHyS2upG.js", + "wfrp4eSize": 78, + "frSize": 84, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "i5AN97A7IOeygEFA.js", + "wfrp4eSize": 395, + "frSize": 413, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "iAo3wxMLA64rsKjj.js", + "wfrp4eSize": 74, + "frSize": 80, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "iLpq4yCFN6YACrYA.js", + "wfrp4eSize": 131, + "frSize": 137, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "iMu8BZ7eHMAbPEO1.js", + "wfrp4eSize": 152, + "frSize": 166, + "wfrp4eTexts": [], + "frTexts": [ + "this.actor.prototypeToken.name Guérison de ${healed} Blessures" + ] + }, + { + "file": "iNAQJa5HyaEckknX.js", + "wfrp4eSize": 596, + "frSize": 602, + "wfrp4eTexts": [], + "frTexts": [ + "Ne se rappelle plus du sort ${chosen.name}" + ] + }, + { + "file": "iO2hCDwyQ7v4qrOI.js", + "wfrp4eSize": 684, + "frSize": 682, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "iX0ctHYHg12pjaCU.js", + "wfrp4eSize": 672, + "frSize": 664, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "id9ZdkERMZnZTWXt.js", + "wfrp4eSize": 222, + "frSize": 232, + "wfrp4eTexts": [ + "Immune to Fear" + ], + "frTexts": [ + "Immunisé à la Peur" + ] + }, + { + "file": "imKVsCy8rya2gkwO.js", + "wfrp4eSize": 935, + "frSize": 937, + "wfrp4eTexts": [], + "frTexts": [ + "

          ${this.actor.prototypeToken.name} ne souffre des pénalités dues à l" + ] + }, + { + "file": "inPxRSx0CDj1nwAm.js", + "wfrp4eSize": 146, + "frSize": 150, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "iuSoKntfJ4eAPafQ.js", + "wfrp4eSize": 496, + "frSize": 455, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "j98hvy6r9G2Vjmid.js", + "wfrp4eSize": 439, + "frSize": 468, + "wfrp4eTexts": [], + "frTexts": [ + "${this.effect.name}: \n @Corruption[minor]{Exposition Mineure à la Corruption}
          \n ${args.actor.prototypeToken.name} doit réaliser un Test \n Accessible (+20%) de Corruption (Mineur)" + ] + }, + { + "file": "jFwema0iwzBphxie.js", + "wfrp4eSize": 420, + "frSize": 432, + "wfrp4eTexts": [], + "frTexts": [ + "${args.attacker.prototypeToken.name} guéri de ${woundsGained} Blessures" + ] + }, + { + "file": "jGDk7avWFSnyFoql.js", + "wfrp4eSize": 463, + "frSize": 479, + "wfrp4eTexts": [ + "Removed ${broken.name}, added ${item.name} (${Math.ceil(CONFIG.Dice.randomUniform() * 10)} Rounds)" + ], + "frTexts": [ + "Suppression de ${broken.name}, ajout de ${item.name} (${Math.ceil(CONFIG.Dice.randomUniform() * 10)} Rounds)" + ] + }, + { + "file": "jHgxpe6TJDlP3oTn.js", + "wfrp4eSize": 443, + "frSize": 406, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "jObJanFoev4N6ZRv.js", + "wfrp4eSize": 121, + "frSize": 120, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "jOm7RxGFm1y6mCpN.js", + "wfrp4eSize": 58, + "frSize": 58, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "jW87rmQLtROdVEhW.js", + "wfrp4eSize": 266, + "frSize": 279, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "jXbrIGxznqf1SNxZ.js", + "wfrp4eSize": 633, + "frSize": 627, + "wfrp4eTexts": [], + "frTexts": [ + "

          ${speaker.alias} est immergé dans la Elémentair de Mer et subit la @UUID[Compendium.wfrp4e-core.journals.JournalEntry.NS3YGlJQxwTggjRX.JournalEntryPage.WCivInLZrqEtZzF4#drowning-and-suffocation]{Suffocation}

          Il peut essayer de s" + ] + }, + { + "file": "jdS2u1tQPYeO55WI.js", + "wfrp4eSize": 1609, + "frSize": 1573, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "jsgLEVYvMieyYT6L.js", + "wfrp4eSize": 697, + "frSize": 718, + "wfrp4eTexts": [ + "No Token Image path configured. The image path should be set in the first line of this script." + ], + "frTexts": [ + "Aucune image de Token configurée. Le chemin du token doit être configuré dans la première ligne de ce script." + ] + }, + { + "file": "kiJ6AiaYVUjt6aV6.js", + "wfrp4eSize": 360, + "frSize": 337, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "kvaN100w0nBUlLbj.js", + "wfrp4eSize": 136, + "frSize": 144, + "wfrp4eTexts": [], + "frTexts": [ + "Immunisé aux Poisons" + ] + }, + { + "file": "lII4KMRblqwFBlsV.js", + "wfrp4eSize": 3094, + "frSize": 3123, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trait}", + "Could not find ${trapping}", + "Could not find ${spell}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trait}", + "Impossible de trouver ${trapping}", + "Impossible de trouver ${spell}" + ] + }, + { + "file": "lOIHiAIDtj91kllN.js", + "wfrp4eSize": 294, + "frSize": 267, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "lOzkngzye4RmvALp.js", + "wfrp4eSize": 204, + "frSize": 213, + "wfrp4eTexts": [ + "Added " + ], + "frTexts": [ + "Ajout de " + ] + }, + { + "file": "lQJ68n3y1xDyNicE.js", + "wfrp4eSize": 78, + "frSize": 78, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "lU4s3UTtBkU38djI.js", + "wfrp4eSize": 206, + "frSize": 207, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "lZuavewrJzOehrJQ.js", + "wfrp4eSize": 410, + "frSize": 411, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "laptAldsT0Fm1rDt.js", + "wfrp4eSize": 273, + "frSize": 253, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "lvjcddwRiN9iGruy.js", + "wfrp4eSize": 1914, + "frSize": 1924, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "m8qBlbH7ROoqa22o.js", + "wfrp4eSize": 26, + "frSize": 26, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "mPxmCsXYirAIT913.js", + "wfrp4eSize": 259, + "frSize": 263, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "mRvLsSVxNyt8LVZb.js", + "wfrp4eSize": 219, + "frSize": 215, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "n5RJqJL9fdRIxkuN.js", + "wfrp4eSize": 298, + "frSize": 309, + "wfrp4eTexts": [ + "Advantage Subtracted", + "Not enough Advantage!" + ], + "frTexts": [ + "Avantage soustrait", + "Pas assez d" + ] + }, + { + "file": "nGTxNWBUBgTr87wU.js", + "wfrp4eSize": 381, + "frSize": 377, + "wfrp4eTexts": [], + "frTexts": [ + "Becomes lodged in the armour or flesh of the opponent. See @UUID[${this.item.uuid}]{${this.item.name}}." + ] + }, + { + "file": "naF5EWr1CBkYRZTK.js", + "wfrp4eSize": 348, + "frSize": 657, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ngMm7SgtVqVovFJG.js", + "wfrp4eSize": 335, + "frSize": 316, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "njPP9wDAsdh4WHIj.js", + "wfrp4eSize": 347, + "frSize": 367, + "wfrp4eTexts": [], + "frTexts": [ + "Infctée: ${args.actor.name} doit réussir un Test Facile (+40) de Résistance ou subir une @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Blessure Purulente}" + ] + }, + { + "file": "nkSmu7v9WiAaK4vq.js", + "wfrp4eSize": 1214, + "frSize": 1209, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "nkbTnaeBpthyhw4J.js", + "wfrp4eSize": 338, + "frSize": 352, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.prototypeToken.name} voit ses Points de Chance augmenter de ${current} à ${fortunePoints + current}" + ] + }, + { + "file": "nkdKBJ8ItqWiRAWL.js", + "wfrp4eSize": 1039, + "frSize": 1063, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.name} porte ${this.item.name}.
          \n Il bénéficie de +50 aux Tests de Natation et peut respirer sous l", + "${this.item.name} porté par ${this.actor.name} a été enlevé et a perdu ses propriétés. Cependant, ses effets perdurent pendant [[1d10+4]] jours, après quoi il faudra les supprimer manuellement." + ] + }, + { + "file": "o88xuUConwt0vFLw.js", + "wfrp4eSize": 231, + "frSize": 238, + "wfrp4eTexts": [], + "frTexts": [ + "Gagne ${points} Points de Chance" + ] + }, + { + "file": "oDNfCNyt5KaUYmg2.js", + "wfrp4eSize": 326, + "frSize": 339, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "oPg4se8iQRD14kmB.js", + "wfrp4eSize": 448, + "frSize": 443, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "oTXPA6rbPnYOKNmo.js", + "wfrp4eSize": 3529, + "frSize": 3507, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "oV81zgbZsuTFG6L2.js", + "wfrp4eSize": 186, + "frSize": 200, + "wfrp4eTexts": [], + "frTexts": [ + "Guérison de ${caster.system.characteristics.fel.bonus} Blessures" + ] + }, + { + "file": "oWa7RkScnl6lR5vd.js", + "wfrp4eSize": 443, + "frSize": 452, + "wfrp4eTexts": [], + "frTexts": [ + "Test de Force Mentale échoué, ${this.actor.prototypeToken.name} @UUID[Compendium.wfrp4e-core.items.AGcJl5rHjkyIQBPP] pour [[1d10]] heures" + ] + }, + { + "file": "okW06V9UiPC4Vcrn.js", + "wfrp4eSize": 1846, + "frSize": 1863, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "pR4Q2OnPxXtwRVli.js", + "wfrp4eSize": 389, + "frSize": 395, + "wfrp4eTexts": [ + "Cannot suffer Critical Wounds", + "Dormant for ${Math.ceil(CONFIG.Dice.randomUniform() * 10)} Rounds" + ], + "frTexts": [ + "Ne peut subir de Blessures Critiques", + "Endormi pour ${Math.ceil(CONFIG.Dice.randomUniform() * 10)} Rounds" + ] + }, + { + "file": "pkKpxVqRHIzywerL.js", + "wfrp4eSize": 136, + "frSize": 147, + "wfrp4eTexts": [ + "Resisted Ablaze" + ], + "frTexts": [ + "Résiste à En Flammes" + ] + }, + { + "file": "q0LvphC8RDSyR0oY.js", + "wfrp4eSize": 376, + "frSize": 382, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "q8lOAWr2970sZeTw.js", + "wfrp4eSize": 1224, + "frSize": 1219, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "qAEZgtu5CrfUkxhx.js", + "wfrp4eSize": 621, + "frSize": 621, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "qSwCYMMiIHmSV1X5.js", + "wfrp4eSize": 416, + "frSize": 422, + "wfrp4eTexts": [ + "None left!" + ], + "frTexts": [ + "None left!" + ] + }, + { + "file": "qT0WBPxLMMO9gvCd.js", + "wfrp4eSize": 203, + "frSize": 209, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "qmOt7h17hGAKqQe0.js", + "wfrp4eSize": 349, + "frSize": 505, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "qu194dVXm9Vx1TGk.js", + "wfrp4eSize": 529, + "frSize": 531, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "qxzhPtysAjPWspKf.js", + "wfrp4eSize": 130, + "frSize": 145, + "wfrp4eTexts": [ + "Cannot enter ${this.effect.name}!" + ], + "frTexts": [ + "Ne peut entrer ${this.effect.name}!" + ] + }, + { + "file": "rBAoyhzeU3Q8MVSk.js", + "wfrp4eSize": 1222, + "frSize": 1217, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "rCh3ltUrUMovd2Kc.js", + "wfrp4eSize": 143, + "frSize": 150, + "wfrp4eTexts": [ + "Cannot be surprised" + ], + "frTexts": [ + "Ne peut être surpris" + ] + }, + { + "file": "rF0Z3hTUUnSxL3Mq.js", + "wfrp4eSize": 2408, + "frSize": 2424, + "wfrp4eTexts": [ + "Adding ${items.map(i => i.name).join(" + ], + "frTexts": [ + "Ajout de ${items.map(i => i.name).join(" + ] + }, + { + "file": "rX8FTinyTMj9WJri.js", + "wfrp4eSize": 1322, + "frSize": 1328, + "wfrp4eTexts": [], + "frTexts": [ + "\n

          ${speaker.alias} sank due to having Holed (${totalHoled}) rating equal to, or exceeding its Toughness (${toughness })

          \n

          \n Holed due to Critical Damage: ${currentHoled}
          \n Holed due to opened Gun Ports: ${openGunPorts}\n

          \n " + ] + }, + { + "file": "ramav4ymrDDkPKK4.js", + "wfrp4eSize": 215, + "frSize": 233, + "wfrp4eTexts": [ + "Removed 1 Bleeding Condition", + "No Bleeding Conditions" + ], + "frTexts": [ + "Suppression d", + "Aucun état Hémorragique" + ] + }, + { + "file": "ratP9ByLjQPiLlFK.js", + "wfrp4eSize": 53, + "frSize": 27, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "rly9iBUy8EX7NhQT.js", + "wfrp4eSize": 1045, + "frSize": 1051, + "wfrp4eTexts": [ + "You must target exactly one Boat.", + "You can only Constrict a Boat", + "You can only Constrict vessels of Size Large or smaller" + ], + "frTexts": [ + "You must target exactly one Boat.", + "You can only Constrict a Boat", + "You can only Constrict vessels of Size Large or smaller", + "${speaker.alias} started wrapping itself around the ${target.name} and will be able to start crushing it after ${turns} turns." + ] + }, + { + "file": "rpxQU26BU7nwjtqY.js", + "wfrp4eSize": 628, + "frSize": 632, + "wfrp4eTexts": [ + "Dropped ${dropped.map(i => i.name).join(" + ], + "frTexts": [ + "Laché ${dropped.map(i => i.name).join(" + ] + }, + { + "file": "s6eZXfZkC1My6EXl.js", + "wfrp4eSize": 207, + "frSize": 210, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "sB4KB9bT3nQhAoqG.js", + "wfrp4eSize": 576, + "frSize": 585, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "sKO8TcLIkCTnFvXu.js", + "wfrp4eSize": 102, + "frSize": 114, + "wfrp4eTexts": [ + "Cannot use ${this.item.system.location.value}!" + ], + "frTexts": [ + "Ne peut utiliser ${this.item.system.location.value}!" + ] + }, + { + "file": "sNSfDBIA2k17hPYI.js", + "wfrp4eSize": 127, + "frSize": 137, + "wfrp4eTexts": [ + "Ignore Ablaze" + ], + "frTexts": [ + "Ignore En Flammes" + ] + }, + { + "file": "sPvfYQEnyAYNpIhF.js", + "wfrp4eSize": 585, + "frSize": 546, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "sZwLitzwKBTaFca3.js", + "wfrp4eSize": 258, + "frSize": 264, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "sbK1a7txpSoXFzyB.js", + "wfrp4eSize": 576, + "frSize": 534, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "shkBUtUuMPDKvFm7.js", + "wfrp4eSize": 368, + "frSize": 380, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.prototypeToken.name} tombe de ${fallen} mètres" + ] + }, + { + "file": "svCqdytEOtqFXCcs.js", + "wfrp4eSize": 3048, + "frSize": 3048, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "sx7Ikn8WW00gBFb4.js", + "wfrp4eSize": 838, + "frSize": 862, + "wfrp4eTexts": [ + "Rolled Left", + "Rolled Right", + "Dropped ${dropped.map(i => i.name).join(" + ], + "frTexts": [ + "Résultat : gauche", + "Résultat : Droite", + "Laché ${dropped.map(i => i.name).join(" + ] + }, + { + "file": "syqqBkyP5tGqZ78t.js", + "wfrp4eSize": 348, + "frSize": 343, + "wfrp4eTexts": [ + "Removed Immunity to Psychology, Adding ${roll.total} Broken Conditions" + ], + "frTexts": [ + "Immunité Psychologique a été supprimé de l" + ] + }, + { + "file": "sz0PqS1kroMOzUZk.js", + "wfrp4eSize": 2512, + "frSize": 2526, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "t48hkacYdOpzWvK9.js", + "wfrp4eSize": 30, + "frSize": 30, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "tGVEV6TLl310mFLP.js", + "wfrp4eSize": 347, + "frSize": 352, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "tNTO1LVN7JqHf4YN.js", + "wfrp4eSize": 381, + "frSize": 396, + "wfrp4eTexts": [], + "frTexts": [ + "Test de Force Mentale échoué, ${this.actor.prototypeToken.name} subit @Condition[Malaise] pour [[1d10]] heures" + ] + }, + { + "file": "tUwP7TjrOOOnaCYJ.js", + "wfrp4eSize": 240, + "frSize": 249, + "wfrp4eTexts": [ + "Cleared ${fatigued.conditionValue} Fatigued Conditions", + "No Fatigued Conditions" + ], + "frTexts": [ + "Suppression de ${fatigued.conditionValue} états Fatigué", + "Aucun état Fatigué" + ] + }, + { + "file": "toSrgcvWq9b5eN0K.js", + "wfrp4eSize": 283, + "frSize": 293, + "wfrp4eTexts": [], + "frTexts": [ + "Localisation: ${location.description}" + ] + }, + { + "file": "u3olS2p7Ls1JXfAH.js", + "wfrp4eSize": 91, + "frSize": 97, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "uLBDnWC3S0lRitbj.js", + "wfrp4eSize": 791, + "frSize": 789, + "wfrp4eTexts": [], + "frTexts": [ + "Reçoit un Point de Corruption" + ] + }, + { + "file": "ucF4aiJ1gpDB333G.js", + "wfrp4eSize": 387, + "frSize": 385, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ugL5IBB6R2yWyMWd.js", + "wfrp4eSize": 1129, + "frSize": 1131, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "uhCq5NwjQ2a2idPn.js", + "wfrp4eSize": 1214, + "frSize": 1209, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "v4CCxVaVGf9i8U7X.js", + "wfrp4eSize": 540, + "frSize": 844, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "v5xrDWcrTNFJkyQB.js", + "wfrp4eSize": 1651, + "frSize": 1834, + "wfrp4eTexts": [ + "Could not find ${talent}" + ], + "frTexts": [ + "Impossible de trouver ${talent}" + ] + }, + { + "file": "vFUVWZ1l8wpTjLcx.js", + "wfrp4eSize": 437, + "frSize": 457, + "wfrp4eTexts": [ + "Target has higher Willpower, no effect" + ], + "frTexts": [ + "La cible a une Force Mentale supérieure, aucun effet" + ] + }, + { + "file": "vJQRBxDfPwHens0a.js", + "wfrp4eSize": 475, + "frSize": 481, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "vS2D9QUslR7ZtXXm.js", + "wfrp4eSize": 453, + "frSize": 433, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "vSDMygIT9nNvEGWG.js", + "wfrp4eSize": 483, + "frSize": 480, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "vc4bELo0cWYoILfB.js", + "wfrp4eSize": 212, + "frSize": 244, + "wfrp4eTexts": [], + "frTexts": [ + "Guérison de ${choice[0]?.name}" + ] + }, + { + "file": "vuzRRj5d9XdNYx3o.js", + "wfrp4eSize": 130, + "frSize": 141, + "wfrp4eTexts": [ + "Removed Broken" + ], + "frTexts": [ + "Etat Brisé supprimé" + ] + }, + { + "file": "w4RuGIfseGoxXA3k.js", + "wfrp4eSize": 1224, + "frSize": 1219, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "w4zubIHP0XgMXsFe.js", + "wfrp4eSize": 77, + "frSize": 77, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "wAntJhgb8Og5vJXh.js", + "wfrp4eSize": 36, + "frSize": 36, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "wbM7tpw4TxvadcWm.js", + "wfrp4eSize": 436, + "frSize": 452, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "whUSkaR1yem21bXp.js", + "wfrp4eSize": 3059, + "frSize": 3087, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trait}", + "Could not find ${trapping}", + "Could not find ${spell}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trait}", + "Impossible de trouver ${trapping}", + "Impossible de trouver ${spell}" + ] + }, + { + "file": "wyTCozh9qGTx6yK0.js", + "wfrp4eSize": 169, + "frSize": 186, + "wfrp4eTexts": [ + "Does not need to make Fear or Terror tests" + ], + "frTexts": [ + "N" + ] + }, + { + "file": "x76tKw4L8dX00ikE.js", + "wfrp4eSize": 283, + "frSize": 269, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "x9iKFYYc4Ocy8PTS.js", + "wfrp4eSize": 880, + "frSize": 909, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "xBpLQa7yBPczDMY8.js", + "wfrp4eSize": 391, + "frSize": 392, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "xUpKYT7BZCSmAfUy.js", + "wfrp4eSize": 288, + "frSize": 306, + "wfrp4eTexts": [ + "None left!" + ], + "frTexts": [ + "Quantité insuffisante!" + ] + }, + { + "file": "xgplXZMs459X7XXM.js", + "wfrp4eSize": 1034, + "frSize": 1062, + "wfrp4eTexts": [], + "frTexts": [ + "${this.actor.name} porte ${this.item.name}.
          \n Il subit -20 à tout ses tests pour résister aux maladies.
          \n Si il porte le masque pendant plus d", + "${this.item.name} porté par ${this.actor.name} a été enlevé et a perdu ses propriétés. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils devront être supprimés manuellement." + ] + }, + { + "file": "xihniGjgqOhuaKWc.js", + "wfrp4eSize": 476, + "frSize": 221, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "xklncIMwQIespDxS.js", + "wfrp4eSize": 316, + "frSize": 308, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "xqWxV9w5ezBQdJkZ.js", + "wfrp4eSize": 31, + "frSize": 31, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "y3F1K1sYBymPZCjz.js", + "wfrp4eSize": 2686, + "frSize": 2698, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "yAL0YwZWVm8o1nxa.js", + "wfrp4eSize": 356, + "frSize": 354, + "wfrp4eTexts": [], + "frTexts": [ + "[[3d10]] @UUID[Compendium.wfrp4e-core.actors.T79RqnDOAQLn3I1s]{zombies} sortent des décombres." + ] + }, + { + "file": "yCgH3N9AurIiAv0i.js", + "wfrp4eSize": 1118, + "frSize": 979, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "yDvxF9llUYwJg0sE.js", + "wfrp4eSize": 883, + "frSize": 861, + "wfrp4eTexts": [ + "Repeater " + ], + "frTexts": [ + "Repeater " + ] + }, + { + "file": "yFMvxecXAZ6T2O0S.js", + "wfrp4eSize": 449, + "frSize": 405, + "wfrp4eTexts": [], + "frTexts": [ + "Deux @UUID[Compendium.wfrp4e-eis.actors.cLOGeMqUty61nYB9]{Horreurs bleus de Tzeentch} sortent du corps de ${this.actor.name}, le tuant au passage." + ] + }, + { + "file": "yMMzZ7daCqRlGT3N.js", + "wfrp4eSize": 290, + "frSize": 306, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "yQziCK8G8I1RYkTj.js", + "wfrp4eSize": 503, + "frSize": 465, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "yTmRoUstxHMso91c.js", + "wfrp4eSize": 195, + "frSize": 171, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ybxDG2ezvRx02LYx.js", + "wfrp4eSize": 31, + "frSize": 31, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ynV7tz0OdCwlsQp6.js", + "wfrp4eSize": 357, + "frSize": 363, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "ynoHNXXCGRS6fTqF.js", + "wfrp4eSize": 623, + "frSize": 632, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "yzN7ZNlgCiSVJqsU.js", + "wfrp4eSize": 192, + "frSize": 202, + "wfrp4eTexts": [ + "Applied after effects" + ], + "frTexts": [ + "Appliqué après les effets" + ] + }, + { + "file": "z8mwLihZQu0JtUHY.js", + "wfrp4eSize": 3018, + "frSize": 3059, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "zIpl3SkWv8zzlr2D.js", + "wfrp4eSize": 1133, + "frSize": 1144, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "zK38Rl5t9zbFi4Se.js", + "wfrp4eSize": 196, + "frSize": 208, + "wfrp4eTexts": [ + "Added Bleeding" + ], + "frTexts": [ + "Ajout d" + ] + }, + { + "file": "zL7ECmBBMAqf5Esn.js", + "wfrp4eSize": 1058, + "frSize": 1000, + "wfrp4eTexts": [], + "frTexts": [ + "

          ${this.item.name} caused an additional ${anchor.outerHTML} Critical Hits to the Hull!

          • ${uuids.join(" + ] + }, + { + "file": "zXh8rgMxWoCLTxVd.js", + "wfrp4eSize": 1204, + "frSize": 1200, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "zadppy7FEbXvgUON.js", + "wfrp4eSize": 1780, + "frSize": 1810, + "wfrp4eTexts": [ + "Could not find ${talent}", + "Could not find ${trapping}" + ], + "frTexts": [ + "Impossible de trouver ${talent}", + "Impossible de trouver ${trapping}" + ] + }, + { + "file": "zdGAvfL7zJ7wpYxG.js", + "wfrp4eSize": 1217, + "frSize": 1212, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "zi8Z3NlwVj3IfgAW.js", + "wfrp4eSize": 288, + "frSize": 306, + "wfrp4eTexts": [ + "None left!" + ], + "frTexts": [ + "Quantité insuffisante!" + ] + }, + { + "file": "zsoTVkHe4nHY1M52.js", + "wfrp4eSize": 160, + "frSize": 166, + "wfrp4eTexts": [], + "frTexts": [] + }, + { + "file": "zxG5KbliWE9xWNQD.js", + "wfrp4eSize": 88, + "frSize": 100, + "wfrp4eTexts": [], + "frTexts": [] + } + ], + "usesLocalize": [ + { + "file": "0FNOq4J1AdPd2A0q.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "0YKQGbsKdHSmYGE7.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "0mrUnxzufYgsR0Ph.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "1A87vGLh2PXH0rG0.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "1LDSzXeO5CzXgTOc.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "1kB2su7hLRYDhZ2H.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "1mNkLj9JYNr3ofC6.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "1wKVvxRTHOyV4Qdv.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "22bW97lkvCqisfHX.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "23HgjCB1oecxANvA.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "2AdSBXw7IwCiqawQ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "2NLINicPQWbuvp2n.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "2VNnVrtktdGUqXEV.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "2W9uMTT6iJhfQ044.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "2WSN306tL4apjRtD.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "2hzDv8ROulOe1elK.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "2sDH6RvoOAR40oqH.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "2vTVR0quRZQtjNfQ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "3JEzEzF1SeYA9lsV.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "3hfMQkUKYI4rCuBy.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "3plV9WFqs2prfAdp.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "3sfD1nedXLzuYoXJ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "454x3Q95pLvZm0Kx.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "4FGKZk2f0xrmIDnp.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "4ZR7p8G3OzOBWx0L.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "4fnTKgl0HW9ZrWyJ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "4iuTz0uInAfMaoGl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "4pQW4WLyhjbZR85k.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "4rb7LfMq9CTnlrpn.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "52mwb33mGrQjq89B.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "5Fe1ELaS6Gnvy0Cj.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "5o1XiceC4rutjMms.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "5sI9iYh5j2nx2XyT.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "6JrUjs3g5x6bFnj3.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "6V3qHON3mcerlBlB.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "6ZS1rQLkNvMDO0Fp.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "6fElmBxTjdAaubbK.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "6qUKKep5vhFYmo1J.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "6tjn0RH4VyOPFneS.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "715G1Bf0haOHvmYQ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "7Ck0fkzE4WQ62qVe.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "7H6wYyJ6cpaoc2QQ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "7VAhXHov6pR1SkgD.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "7e8FgQUF2oANANmx.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "7szLG4VALuuy1cPm.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "84IB8CWa55XzoAkv.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "86ivOsBQAuu0UmFg.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "8ByuHnUZ4RNTdGVv.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "8N3Uqjq1ZxPxo4pk.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "8RNziYGGb4sp3BGQ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "8ZAUBSH9CM9OTpTL.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "93K85NnVwjVNXlZq.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "9EVj4bmZJex45Mt7.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "9JnPK1jNUEso7Pv8.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "9RFoasDcFnYZ1txR.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "9fK07tqqZyPg7dpx.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "A3fvV69RS1lYgma0.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ACgKpKrEEHoNGG0h.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "AHZ8f7dfN8jNsYk6.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ALuPRzf85dmkEfLo.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "AMxezwtYnWCF6Oza.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "AV2Kj6jgmIc45zKi.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "B6ZbY3bxTPg6nCng.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "B950b0XnIUYCdVwu.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "BAOv7moTxsKlT3JS.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "BNJRV66jlrp51qZK.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "BtyFhdGMKiMamGhM.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "C4LZnaX0MYgwrszj.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "CCK1iIfPmB398ziT.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "CiFeduksZJ6PRulx.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "CkE8NZOhzPkuRrKJ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "DTiHS6RfwhF4THbf.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "DsE6rTSzxEn6uWMz.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "DuM5l2Yb4bdvDeaG.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "DxQnamsb2AuW0p2e.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "E4CHDe1xfmcV3oGv.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "E6DMqfDeczqmVMFV.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "E7D4bxz8gy4e1wL7.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "EDAMEOzdBfkoKHxP.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "EGWF3LHav3e2zFL4.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "EQ5dtGW5kQhtAb87.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "EU5j0hnDTG9Z6d1e.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "EVBSHEC5nmmj2X41.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "EmXwcuycEH8slEn5.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "EmmG49pMOPHRwDzR.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Ew3C2WmLCtc1KT46.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "FXuyiJoXdAh6WhRK.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "FYUPfYyTYZkxRLFT.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "FkTwk8hfHpRLbAp2.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "FmLx9pwOkzqqU7Ph.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Fvlc4RkeF4dHjW3m.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "GOq4TcnWbfyfCo2V.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "GZFsuynUhgZqwTGo.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "GbPEy22VuCNzlNv2.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Gc8S5TYlVdV8NnOT.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "H2CJvApKMnfGNNoo.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "HASsi6wYHVALExWq.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "HKhyn0kijKfzW6cw.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "HMC6hPND9DWLFfZE.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "HUKzssLxeQo1wbx9.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Hcpn1gU58DIKIhty.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "HdTuY2IGhdlMDOy3.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "HfCxNd7mFGZH4s9Y.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "HfZAQWoY8n3clLlo.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "HiMBS6GeOwEydWYN.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "HrOBAXsEX073ReKl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "I7ieW0hNYvvX0KFg.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "I9QAPKbaXwMMMBT4.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ID8mCcjkl7PCQhDq.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "IPPDvZdE8kn3H9z7.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "IR5URcjnCuWBFMoN.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "IsLAvY9ikR1cOJWw.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "J0IWUhxada2ONowP.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "JBoKPBr27C3PMoSD.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "JEbs0WlqhKNDOo5A.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "JQruHprM5R5vZ9DA.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "JeThJbOf6Xmbtgo1.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "JgCcgDVZX54slrWx.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "JhCMYHHYA860Kka8.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "JibNjuQrJRnY0yf9.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Jk7OHqx06oCUVAzb.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "JstrA46EYSEuRSy5.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "JyTxUG5dNW670Sf7.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "KIoVBinAZK8sMOqD.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "KPQfupKuaf4LCv4R.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "KSjsDlsx3DD6cT16.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "KTBVDHUndI3qDOXM.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "KUx0deSF3xNzMucL.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "KkjkYAGI9Em1NgiQ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "KyUPYV1RXJxPOfyA.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "L9eAtDyaoHvqryk4.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "LeKLtvEDrWh4yHsx.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Lg1oRg4oNRvucsvi.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "LjfScVGBf0Egr70E.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Lpv2N9LK9loeumiW.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Lrb1S2aK7SFVD0C7.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Lu27iXtJVkrJ8bOx.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "M0XhKnWjG14pk3iH.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "M2FshTX4PjKFVU8y.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "M9VgeYGiUO97ZUW4.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "MJB6WbZSF6Briz30.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "MMv2B8TH7jxNCtdl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "MMx8f5uJ15XOgJGg.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "MSJWJEUrX7ZmMvAD.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Mp8UjuCLa9jdzhBS.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "N9kA46ZQ9LiRjy6T.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "NDvNGATDM2xPFJK0.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "NkqtQaLEGYst0PUO.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "NnA4zpuO6iUXKhH7.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "NnDq4miIPNEtZUWb.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Np8P8IPT2GYlrh6G.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "OeCgX3hIsfLfmGvC.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "OgSI0Z6SHjYuqKIz.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "OqLKL0PiCvYH2QxW.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "P29tT1eMMdAw3CPF.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "PMISUsaEDBA7D3od.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "PMNjdEAusVBfam09.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "PVjaKAHTKDA0rA9J.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "PdClojv7yNgQpOUc.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "PoNnT5EqvLj2r5yf.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Q4EQgP4gZR8TTm7S.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Q5gh5Y9dCdclcwsD.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Q9EmlWmuDac83cJw.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "QPVVDPcJ4Xi5FmQl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "QQ2gHThZHdO4yLLX.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "QfTBRGXVfwQSghmd.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "RDtJXji3hgcKnEBk.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "RHyBLYT5oHf7EPnG.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "RNr9CwyvLhlnwD2h.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "RprZWlnopSqZt7KZ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "RrchOMpEdIvceJxl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "SNjG7IvgQzvCGczR.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "SrCHfOJFZwDickqa.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "T3RfSt3VMEat3iDD.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "TOyQLrugFGzwc5nY.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "TU2xjbJ0zFtytF3J.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "TdjlJro0RRVSh8g8.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ToKlHDAjJOsC51ag.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Tq45Nd8J3eTvHT41.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "TrIYdcG3jDER4WgY.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "TwwKxFjK6TNGKbRB.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "U4A8FDNmwBGTuQZO.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "U78c4oUjKwyUu6jT.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "U7lRf56BFaTfsC6B.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "U9xh2wriSqCosugW.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "UC6G3pFQwzUhrw6F.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "UTlgF4azrGQZsoDv.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "UaImulhbPURkLJg2.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "UsAHQecRlWL5PhP6.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "UvycHOjSPm5Zv9KJ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "VAs1nXvicdQK18Do.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "VCnNWmRBH28Rx0JH.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "VNOKTzCrFbZ6PJUj.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "VQaC6ynouW5EQCbC.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "VbL0TgaBAmYjrezZ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "VlFUDaKUYoBYKYn0.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "VlHuDIAvPr8JM1P5.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Vns6WrafVq8NjX7t.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "VqTrKPtxv9hpn0Hr.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "VurA2XNqC0d9U49C.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "VzO0ZDcTWvaBn4vm.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "WTRYAEzwxRuGENyI.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Wqff6ICWYzvLDYC8.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "XClTZOjuhcxWLF51.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Xf4FcZ4ZLdWmOXBa.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "XuFxKPYheYF4WMmQ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "YDqpKJVy8ijEKdLX.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "YEBw2CzHYxsTpTy5.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "YFSgWRXel0bWE3EE.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "YMaxpXnml01bLGpO.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "YhhiWEQbox3WZA3Q.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Z6OmmC0irJzxSnMH.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ZLspFT2I3ZdWWr2H.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ZNW3ubbKIYXAyE48.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "Ze9E2zR1GFGWGMVH.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ZgF1sYdbAKaOuHmK.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ZvbBM4gTJHPdU8jU.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "a0YU3whUm16wGBNu.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "a4Aza4a9v8JMU8dC.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "a6gacHsvgwtsIFSQ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "aAvJrAKLzXhS9qN6.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "afdmOvPGMpEdZvCb.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "b5prg1FLjCAvBjLy.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "bh2qDCKiAIWM0UPi.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "bhXUW7IJtEaUGAoV.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "bwx9wuEOJPF7btD1.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "c3KA1knL2NYNUEww.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "cAKqUBuJBsU85erO.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "cTYNaKbepMwqYsZ8.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "cV9JiAgUPOeUHKnS.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "cqYgZQk1C3kMARy5.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "dAMtbn3uQwF8KpKU.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "dSmRhZ6o1bUcOSF9.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "dXGosSxdoYbET2O8.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "dfEgat3jz4EtWszH.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "dfnCK8jCPXNLM7Gh.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "dkiNmwFXztIVbuxg.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "dsXGavzXLerXR8Xg.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "dtFvpY96RPzNnphq.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "dwSgcFxKN3S0hLJL.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "eGQAyzCFZAEQhyJl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "f062aa2BNClx08D6.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "f3rXusHh6VIpVPUl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "f5Mp3kXwCFdPkW6N.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "fKzlu6fFE2th9uIJ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "fP2edYbj6QjPPAjL.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "fYLSe6CrYciap5y8.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "g07HI7vyqiFXPB0o.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "gFUXBbTskQBKjxqm.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "gKPL3t4vlZAsvtGr.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "gnVpxOeBZpNF4HIF.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "gqZLfIr6svrtdwdC.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "gu72JaTs9GrSiVTd.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "h0DfPwUUOBjyAHMZ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "h1XKoMuVnS0bagRO.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "hDC6lroDEPVBituR.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "hR1qD2kpFHF8JT8h.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "hnsmzvcuiUYB065I.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "iM6JLF8jDXMViReZ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "iT0h3VZLEBQnn5Bx.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "iT3C15fMyQrj1RmG.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "jRSgPhpfN7MH7TTp.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "jgO1Kf60Ctt6R0qO.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "jpcU8FFWSlQ3gD0L.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "k3FqFgsF6a3TkxAD.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "k8TC0yzp4xfOXD2n.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "kEaBLoIHt1FpQVKq.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "kMSdRskYDI2J1gnp.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "kWynO1lQzjiSs8RK.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "kYiDBPRKIokFkr4Z.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "kYmscP2HuXjDovBD.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "kkC5EhqA05U6U0gU.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "kmsGLWGxCY8Z8jVG.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "l1ntrpa8RE3Lg5xE.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "l8qFKSnMpy4P7XQR.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "lPudo1grrVp05i7a.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "lYYkGzqNshiYc7WI.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "lhemR8EP5tGNKout.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "mTnmPcjWmvScIBWY.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "mYL4i1vNlMl4vFYy.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "mr8qm5Bg6k1idZ6Q.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "mziJBUYcsrhkdcCJ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "nD2QVg3DrPK3foMf.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "nEaF3jbCiVYD8jia.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "nIOeK0BrtdZeZW8X.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ncIjDE6TFx88IQA1.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "nvrFhHHVq3KzirlR.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "o3JUBKLvE6bBxK2n.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "oEsUsI74yGTZ9CwU.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "oGdsGPgJWcyWkiWl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "oWM43EdUiyHgUlfW.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "obIXhQXKFyyQoNNV.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "p222EiR8RRtlPm31.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "p7NJB1PsY6X5q8OO.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "pAgiAGyaLJY10894.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "pHyXdPnWwoFrUA5n.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "pNPjXEoQGHLKzq0r.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "pq1YQffxtOcqCRTn.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "pzknBcJtZWeliE27.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "qTk96NKh14YOIShf.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "qaVde0sTuMBRi2nl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "qijgjcOBCDmhglRX.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "quPcuKsq2fcild4a.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "qzGPJflVW7c2Ciim.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "rXMylpnEtZpwou6x.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "red2bt4PGgIWAdTR.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "rlTvhnDpj4lzfusf.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "rnioLwiJP7ps5Jwy.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "roKvPHDSpX4IV11C.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "rr4htuVq45onXdRG.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "rxB1AqfVMDqTRieE.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "s7gJQdzuM3fz2zQK.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "sSMg43ZjnNmpytfj.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "sUHuj00IpoZ7Gd03.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "sWyO1DNaqb2EdHoW.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "sagKJM6oDFlw4ED2.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "sgS9rblPkQB36C8S.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "syBgPp7rOymCZejX.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "t56mnblo1kv3gM1M.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "tDrs0aNIYmZPsOoS.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "tG1qGqzBLmAR3WHm.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "tcZug8ehU6lyYBd9.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "tn6SwmjAuNzqE6dx.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "tnE8LF6E3svIlLca.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "tnilBagajWM8UGQt.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "tolkNN5P7oOC8GKZ.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "tuIsytv3jl2yAIb2.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "uACa6u4JLNMRgFlr.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "uSwkYENTOcnfRrqA.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "upfK6GM33qZCZjll.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "uwdQvZtzy2HVeEzx.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ux3jaLpAUhZ5YqA6.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "v6LIG7EwWYALxCpP.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "vj3zArmX27vCxYJW.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "vvdo1NxjmGVkmFCT.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "vzMxIDjRlQSxXtCW.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "w4JKuTECFmu3YmTR.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "wS6OIR3QN4mOUHn0.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "wsqNM4NHnwaAAQym.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "wzkxiKjxVEeNS1di.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "x2RLUUNB7BiIDYCP.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "x8XK2fzzXCnSwfjt.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "xRd6oA1QWLVpfoBm.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "xS2su09zcza9du09.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "xVYVegD692CCv8Yl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "xWPgIZOQLba5nZ23.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "xobGBJbgFjQCrwvq.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "xvH4PKJasHcehOZz.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "yIGItnshXI4W46cp.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "yRRzSKlcN3L7rEEe.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "yXUPiWuQ5o0JBY4i.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "yatUu0cd7iKs50rq.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "z5HfNUrHy5MS3K7a.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "zA6TDttpwMSMl7D8.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "zFYCaGR0wbFWjl4T.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "zLBLEDl3aGcAxai2.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "zR4WAjzXHTZuiu5G.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "zY4ZjY7uyKIKMYmX.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "ziG9H5Kdb7xC3dFE.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "zsiV6XEHlCNGLLPl.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + }, + { + "file": "zzk2uRSFjFHB5kjw.js", + "details": "Le système utilise maintenant localize() - script FR obsolète" + } + ], + "onlyInFR": [ + "ZingXNvYyZ2BEvfY.js", + "tfdKU6nmvUtEjXE2.js" + ], + "onlyInWFRP4E": [ + "07tvKnPT8ICtv2us.js", + "0H2syk6qc0sCY0pj.js", + "0IAc5VFR2ogXOaGE.js", + "0NAD1LNcVyAZ1fC7.js", + "0PzfGjGhHQbxEwlb.js", + "0amHqfjTRp5ff6Op.js", + "0hAbiNR1nFkpFMRz.js", + "0hgTyeaEhMBLwzUn.js", + "0kUalAsb4OhtYbaJ.js", + "0uUxvBLJC76WIIBC.js", + "0wR0LWpfhLFA240I.js", + "0wmIC2MssUX6LW3N.js", + "1Du4e27M8WgP2iui.js", + "1PPh4vHd5sPKtudZ.js", + "1UvL0XA1EpQtjDNn.js", + "20fvE9nJmcfGYVzw.js", + "22PMOW0G5MWiBQmg.js", + "2EAYX5G9Fh3HJwiP.js", + "2Ej6LUqn8frTRURo.js", + "2IPTF0akWw9y48br.js", + "2S6XlGCdRlXuaaVw.js", + "2XXqxAF5s5Sws6qj.js", + "2XaJNYUMQAmSOsqi.js", + "2Yh4vQm0ZJukRH1x.js", + "2kRwCc31fuZgrsy8.js", + "2uyajbon5QX1CewS.js", + "2yW0kuwLfgRzJR2S.js", + "3CeKfDcMEVgQlcXm.js", + "3KH6OE7L7uJESI2Z.js", + "3SuLF6SImYWEHMo2.js", + "3ixqbsEMfSSTzAXU.js", + "3j8yybMaAZSwzxIE.js", + "3na3lnAt3bfysvcD.js", + "42UATqzohYML6a9t.js", + "4AO7Fowek5sSmE4g.js", + "4KYraZSHAEYmL6xx.js", + "4Q3Mp04O2sMgKv9x.js", + "4iu3CmOI19soOYuA.js", + "4jLe2XZQVUB8LztP.js", + "55eYGvSXetDMK80S.js", + "5GHQxfxlmjyt1fNq.js", + "5GP9UJMvBZv6kWtI.js", + "5KIozV7HxyGvskeD.js", + "5KVslRqhqzuFLyk4.js", + "5XAYjiq1i4M7Ky7j.js", + "5gPAT5Bb2FvQwYNQ.js", + "5lpR78CLhYH6Mjnu.js", + "5uokSqQsjgMapnCi.js", + "5z5nGwZC5RIwokev.js", + "6136BMmiGLwZ16H1.js", + "64aJznxPMUHAuf7F.js", + "6A6ddQDJo23oOWtK.js", + "6AsCMHZ4IYPq7Uxf.js", + "6HfCvw24X6oEe2vn.js", + "6LMzIdmCSYctgmGx.js", + "6P2QNPKfwQ1xwxZT.js", + "6frithfMs7Nbv0IZ.js", + "6maNAmREdataXmo4.js", + "6nA5LPXneAahHX2W.js", + "713v1T8HNste94pr.js", + "7T3iXgrL72fea67C.js", + "7UUS0gX2Pbi0HHiz.js", + "7y89OcMmGbjRMgTg.js", + "873KaarAnJ2qf1r2.js", + "8BCzpjFU0GeA17Wp.js", + "8R7O63iC0yANtkJ9.js", + "8pbVGsVFlDebu2Ac.js", + "8qOGotfGFA0HYQ6W.js", + "9AMoFRATTAfdKlKN.js", + "9eL5JbQQmCY030ba.js", + "9fNHye2N2DORR0A3.js", + "A3XrFB7SvV2vcg1a.js", + "AI7iVbQMPzXMP5on.js", + "AYEiCx2Es3QtMY28.js", + "AvRbjpBfTX3mn3bz.js", + "BEEvU2hE5ymcNOH9.js", + "BY4feKp244bQOWlB.js", + "Bu0KUpGvfmFF7LJs.js", + "C5NIkJwXL85Qbpe7.js", + "CUBpU1imu2eRS06C.js", + "CbfUDhUr5R4UnPPq.js", + "CcR9i3UzUXx7ieep.js", + "Cri5Q7ux6ni7zNVS.js", + "CxsKWGwQqtAaQdzX.js", + "CynUM4ZEiB9QbNQq.js", + "DUFSlDO38fQWclBE.js", + "Dk4VF4UXSMK5SaVP.js", + "DvJvHsjgkzIfFaks.js", + "DxM3NRgQYc7moMPc.js", + "Dy67jQmeGwHwV9NY.js", + "E0HHBSdQR3oH8KaL.js", + "E33J9JixYVGxaktQ.js", + "E7ksDLhihkJN4Vpt.js", + "ECUIJLcKt2TCSFS3.js", + "EHfOyVwYhFGWNjw1.js", + "ETfmit2Cx0Py77ai.js", + "ETrfkHI0B9YjJqM2.js", + "ElHBPMMx37SZMvOC.js", + "EsZx8cY34quYG4MQ.js", + "F7BHb4a7fqWMnYxH.js", + "F7E0Dr3sT7kkc2p7.js", + "F8Bmh6w01YvKsBIO.js", + "FGIHAkNdYXbTnewG.js", + "FKEH7DeqU0FH4dkk.js", + "FPQp6XfbUH1BMafj.js", + "FbfJjYUyp0ArtZMb.js", + "FttdVBQiNssDAARh.js", + "Fu8DTvSgLufcB5mr.js", + "G9ZPojp8qdjiXKZ5.js", + "GNgMG95jfabBeIwy.js", + "GYhPhHIVrhx4pkgF.js", + "GePFbu5kp2ymGYEQ.js", + "GjUD5L4h8FXGVgGQ.js", + "Gsilp71BmIyHHce6.js", + "GtfHQA9T1ip463le.js", + "GuSIY4Zqhc68qVEH.js", + "H8jDtK1Ewn4hL3A1.js", + "HgzIi6m6dkXbVWHp.js", + "Hi005w1Ul17Q8Uty.js", + "I2I4ZJjN3EUSow0t.js", + "I67tdJctEqXSQPE0.js", + "I79D8V8OFzMCtL40.js", + "I8JS4z90PtWIG2nb.js", + "IDvpVMkR2HXoNpPp.js", + "IEDJHIYaZLhmrK4X.js", + "IFXsTRAVDUeVvcRc.js", + "IM8nRo6Jx2I8RJ0L.js", + "IXXrxNSLqXEqtuDU.js", + "IhoCoul5okDx0jBa.js", + "IkVcIRmmgQjsBUUf.js", + "IurWrdbjsmMtTWuq.js", + "IuxMr6SFdJhqFtVD.js", + "J8k4ahQdZhXDfU1l.js", + "K54XxyNJa5PIWDEH.js", + "KSGIwJxR0qn10RLX.js", + "KkE8DtsTDYDyk1gN.js", + "KxIRA51YA0rktcSP.js", + "L41ao2Mw1miE0yri.js", + "L9pUSX8Z4y2zIAn7.js", + "LNxKkPI37im0bSjy.js", + "Lh3Ccqx3utIu6w0d.js", + "M6sb1yAdEAMlIvac.js", + "MB058H6OslhfBmxR.js", + "MKxYbHOrv0UuA7JB.js", + "MPK7U4HLmIAsjdqs.js", + "Mqbjr3t7IXwFnfCv.js", + "N6E9Jsd8n2ubCfz8.js", + "NEKLTgJJsayC7tpF.js", + "NMZ3Fb164tUfwChF.js", + "NTFpkiGyBpOtrV0s.js", + "NX9fApO15NQuTipW.js", + "Np25JqEiaoqerEk8.js", + "NqFvdCKDLqIXaE9m.js", + "Nuth9S5UHIhpEuIC.js", + "NvaPNfZt5d9RqKSE.js", + "OBF6r2CsMOEokAsS.js", + "OF4sSVOvHoKuPk7L.js", + "OFViRemr1cpnO3af.js", + "OYLqLl6vikJD8flg.js", + "OYRUSP7Q0Je0jdCY.js", + "On1itZhp0AOzNyyc.js", + "PGHvFHBIygB5pnWT.js", + "PjOi61gB2nSYooLs.js", + "Puv2wLrSVe6b1jLf.js", + "QBBrzcSAe8QqE4WP.js", + "QKt9ZYpVpznncfJ1.js", + "QLBxcP85duX1Z7LX.js", + "QLUaOkwuSPvBp7jU.js", + "R3OfRdi6xv0e9mzB.js", + "RRK91ySi5SzYCRvy.js", + "RUpVgB0czqg95K1Q.js", + "ReJpL0IVesKUbXgj.js", + "RgNdS87nO7RVawuw.js", + "RlVvlmhOfscaJqCd.js", + "RyQtuiRykUCQ6Xag.js", + "S1SQe0Do7ZcuNV5j.js", + "SK8paBvnvc5YLFI1.js", + "SKn61f2ykhzuwMdw.js", + "SjDNjLBGsd9fYObo.js", + "SlrslcNdnYONcSH3.js", + "SlzPn7ONIKab9URj.js", + "SreM9Jyj2XZjoezH.js", + "SwliIjjjFtZMnJH3.js", + "T0KBl8iEkcPq08RI.js", + "T4JEEDYCEIUbVHv4.js", + "TCgEBuMPPd5SLAsc.js", + "TIoUbjOtj7PTK2t8.js", + "TKjBb75exjae87fa.js", + "TSsHcn4EDulD03RU.js", + "TXce477AiXHKbepk.js", + "Td8M5K1P92GbM2IA.js", + "TpgK2aAe93ui3Rbs.js", + "UUHQRPRrrRSr9MIA.js", + "UfkysrAftCs09Fct.js", + "UlygtNPSDlWPIFCI.js", + "UxVfVoH7cbC9ESDr.js", + "V0b4yLTawjCnm9ke.js", + "V4PcjtHde941wv6J.js", + "VGuZMIR1lE8I1F1y.js", + "VOc9sKag2Vy4vGGZ.js", + "VRDS4lkwSAzbtvm4.js", + "VTzpExK3QSCaFQPf.js", + "VbI0Al6rJfypV3qY.js", + "VcE8Hie2jbpuyuM3.js", + "W2rdTwflbUVxFyfd.js", + "W5qtA7Ul5cOj18Nd.js", + "WOpRJluHKER1MdgI.js", + "WaeL2I8VVJmBBKHk.js", + "Wh1VV3javfzcV3bP.js", + "WsN2R1qOzuLa2qyB.js", + "WtbSIghR0q4euE7J.js", + "XPpHYTTT0hqYuSfa.js", + "XSbQKrrbjsN15Zp9.js", + "XfSxXatjEYlPEbaK.js", + "XjUXxUA0hbwjUatW.js", + "XzJotwVUIuQu6b0G.js", + "Y27MmN5KFw45d5vQ.js", + "Y43z8YCohJMA8Ia7.js", + "YDANERWYHyJ2ACeo.js", + "YdiQFkm8j48Xs7gI.js", + "YfRPSgJjvHvl50HW.js", + "YrXhk2YJaWSChMhp.js", + "YsUdMhQ2AArcJIqy.js", + "ZURBQYTYcP5jci5k.js", + "ZfgPAtNKA5KrETer.js", + "Znz4g56UH23SSCg7.js", + "a81IMxqmMtHgYnIF.js", + "aFwNs7TMVF90i9JF.js", + "aPZiVhgwR0Xql6AM.js", + "aRvJUcgYqhRmmWYC.js", + "aedzdFyjI80Ah3qC.js", + "b4CIeJF2L4E1qikC.js", + "b787rIfyHF5LnALd.js", + "b8XFmEUu1d2YNQ7F.js", + "bDS62ctjfnTU4xIu.js", + "bNhpJPWwoHLq68zD.js", + "bT4gLrE3W36DIP4k.js", + "bgLeMqihLya2iobP.js", + "bidoOQSAofp4NPf6.js", + "bkbWgG9COvZWZbAX.js", + "c7HTWfg3CbjN9e1M.js", + "c9xxdOCaQSwooK8n.js", + "cC7jjJDSVPi5BJUq.js", + "cW8ZuQ9YIUG5uvhf.js", + "cZVrzR4fxV86lxNW.js", + "cipTp0OS2bfKLjZS.js", + "clO7l82UYMJ4XVks.js", + "cxgGYbuiXM3NxIOI.js", + "czZI8S09By0Mqlsr.js", + "dEx8xfG7VLbN69Ha.js", + "dMeSZGdvw7zlnUKh.js", + "dVF5ywnzeiZQx9ke.js", + "dr9VJKGY3TeGuzXj.js", + "dxt3p07po06J9fO1.js", + "e0eKVlOSk3Vw1HiD.js", + "e2JlsKoW8oaFjn6Y.js", + "e3dBud1keWyhw6nw.js", + "eC61buStv62b3sN9.js", + "eIiiDhJohYez26qY.js", + "eLxdRg8LX3AdYSEq.js", + "ePv2YYcr4lz3AkGu.js", + "eRVVn8YtU8nnOW2q.js", + "eTHJSRutCEpuyPkR.js", + "eViKAYOtuaOqo6c7.js", + "eWvHTkxsjKuH2IKm.js", + "egc02UIueJgEQMqx.js", + "eieFcF4BxIvDTN3C.js", + "eq32dKXeTAbKhhLf.js", + "eu4mHsdZukvUEAGJ.js", + "eyrUJQAuHvdllCwi.js", + "fA1dIV1ANo4RVEqy.js", + "fC4KcY9S6V30IJyX.js", + "fLg90csmdOOKmEE6.js", + "fSDFCHAo97RLpwGU.js", + "fUD4gMdKe6P3sFdJ.js", + "fq2fqlWlrVfitkcB.js", + "fwiBeetIsvpXKtUc.js", + "fyjYWg7ekj8JJcmq.js", + "g5y0tdoHCDs7cBy7.js", + "gQJJaxbN83KSgi36.js", + "gSDhsSB8573joL64.js", + "gull3qgCahzk2xYu.js", + "h4lnexDYAhyQuiR5.js", + "h8JqPMh2mM2uhpxk.js", + "hEDuYAgc1O1zG3Rr.js", + "hL3JUSY3xMA4zj2Q.js", + "hO2CFW9hygGSYuJ2.js", + "hTsnYKgw0kK10PiC.js", + "hadXFC43VKyrE9jC.js", + "hg89FU1NAp8tIsgO.js", + "hpbraeEbjkXnmD75.js", + "hqMwzPozAVTzoCxa.js", + "i93PGV1lDSdi3BJu.js", + "iH9o7t8vGDn6pm1d.js", + "ij3BLXzNk7eZ3V95.js", + "iuoVkjFdL1rHdbqR.js", + "ivxpmCKu3pEMG05c.js", + "jFKnf2UdoxAQx76R.js", + "jOCLEsjNzERyVLsP.js", + "jOSCsBRUO117spv8.js", + "jb1ouw0eIBVy3Wwg.js", + "jvNuIbOtB46p0esq.js", + "k1Wdehpgdc0hP63E.js", + "k465TgRelwcSUdS2.js", + "k5792iKWEqKmVZMk.js", + "kY50G53IXdNXX9Sc.js", + "kYTEqcs8JpO2OmB9.js", + "kiolpXGbkmxfPiuI.js", + "knq8lNYLw0v757dQ.js", + "kvqJbHBvFr6iGLcI.js", + "lDIWlQvD6MGyP3QP.js", + "lG5lfAzNuM4t0rpM.js", + "lMRsQRgjMexY9dxE.js", + "laWHBP2jLrVxcgp9.js", + "lmBAZCtofsC8hHHG.js", + "luEuwzYCUrch58Bp.js", + "m4eagTrVOXtotonR.js", + "mnvczEiu7gUSWvuV.js", + "n5wowuDE8Dz1uBZn.js", + "n8X4Vgmrs4M5pyHK.js", + "n99CqhPx3uABCU15.js", + "nNwAFEURKlFhPcvA.js", + "nZtN0zM49xTuG86V.js", + "o2QhtiLAmUEpDgBX.js", + "oA197GIqHpU5WR9V.js", + "oHmtdXWVwm7y7BtO.js", + "oQI06eh8mJ9UqETO.js", + "pRp6hoBJ0JQa4NNG.js", + "pdvCwjxHI56EmxuU.js", + "pj7gjxHrnrZonC6U.js", + "ppc8L3WtIx6JzlAd.js", + "pqQkeUVpuZ0jOKnZ.js", + "pvTcazVvW4v04otW.js", + "q5RgoYr12kBF6FA5.js", + "qDYJnO2JosPJrjpz.js", + "qITSQMvvkgj81fW1.js", + "qZ8TBagp2d4dJAqI.js", + "qhjU1QdsfqA8h5iI.js", + "qmGwT929EiZ3lW2x.js", + "qmH61HmrEJcmQTiu.js", + "qyBmkCJo5606o4J9.js", + "rJ8pspSekyDLkiqG.js", + "rgnGu3IQrS8Vj9Op.js", + "roYVcP5Zqcsa8jVw.js", + "s7kW3lm2eU5IPrLP.js", + "s9J1TUkpGdvSWvPO.js", + "s9KcytRE7i0cU06n.js", + "syRJs8P4aBFB5USD.js", + "tHBlC7SpYiQ7SUGo.js", + "tg9N6aUo8WRPKj3H.js", + "tkZ8Ybqu518LQYEn.js", + "tpz88eQFTjWHdFL5.js", + "tyQLkRLk1AXB4g2u.js", + "u46KnlxCjP42F6QY.js", + "u4fKgGFEnOCnvvsv.js", + "uA5qaat5EXzkzltq.js", + "uCJk19rijMPRU8jg.js", + "uEVSUTTam4Z96JJ2.js", + "uMvD2HWFNGqCmrBM.js", + "uRiAvo9fb3U7FIIy.js", + "uZeNKQ24fToJ7qtY.js", + "ulXfbycWUu36vdmS.js", + "vBqrydNzHmEHClqZ.js", + "vNUGuypkhx2P5YIA.js", + "ve3RcfTi49rdYZU0.js", + "vejhfB9aI58iF1vr.js", + "vn13U388mwquGN9y.js", + "vphNSTVxfZjApblV.js", + "vtXJI2VGlU9vODXz.js", + "vzSj3vvPryp02EVC.js", + "w8s2RUzA1jmyu7vy.js", + "wBc8XvkAnv3j93vR.js", + "wFHjQyCR6Wzn6TeQ.js", + "wLg8LbPAPbQgUg0Z.js", + "wb1DpSdIhSqYG5cp.js", + "we6JUzDvybekAbtn.js", + "weDTna1dLMwHsNlJ.js", + "x1Ecj6MXY94kpcQq.js", + "xEE0ymsaH2tn2M99.js", + "xJZKVGE04o84Gibo.js", + "xcny1zYAphdfrKv9.js", + "xkdQhZ9KKqmocNLO.js", + "y7hk7prQ0lLTyv1Y.js", + "y9fwuiqn44t13WAq.js", + "yYNBZjmBnytXpRn3.js", + "yvtF2t9aibxibAIM.js", + "z8W5PAwBR0PXY6ty.js", + "zF1IKmobCB8ea58M.js", + "zGwtyjTUBeSQ110p.js", + "zI5hXv2NLGWqnmDD.js", + "zIErcRiBmIZRbary.js", + "zWZG8OmxqTpzHjFV.js", + "zasFOZohkrdFIBwr.js", + "zjTEhJuLcFVkzory.js" + ], + "total": 1505 +} \ No newline at end of file diff --git a/tools/script-comparison-report.md b/tools/script-comparison-report.md new file mode 100644 index 0000000..3882384 --- /dev/null +++ b/tools/script-comparison-report.md @@ -0,0 +1,713 @@ +# Rapport de comparaison des scripts + +Date: 2026-01-06T18:58:40.637Z + +## Résumé + +- **Total de fichiers communs**: 1505 +- **Scripts identiques**: 671 +- **Scripts nécessitant mise à jour**: 473 +- **Scripts utilisant localize() (obsolètes)**: 361 +- **Scripts uniquement dans FR**: 2 +- **Scripts uniquement dans WFRP4E**: 394 + +## Scripts obsolètes (utilisant localize() dans WFRP4E) + +Ces scripts peuvent être supprimés du module FR car le système utilise maintenant les fichiers de localisation. + +- `0FNOq4J1AdPd2A0q.js` - Le système utilise maintenant localize() - script FR obsolète +- `0YKQGbsKdHSmYGE7.js` - Le système utilise maintenant localize() - script FR obsolète +- `0mrUnxzufYgsR0Ph.js` - Le système utilise maintenant localize() - script FR obsolète +- `1A87vGLh2PXH0rG0.js` - Le système utilise maintenant localize() - script FR obsolète +- `1LDSzXeO5CzXgTOc.js` - Le système utilise maintenant localize() - script FR obsolète +- `1kB2su7hLRYDhZ2H.js` - Le système utilise maintenant localize() - script FR obsolète +- `1mNkLj9JYNr3ofC6.js` - Le système utilise maintenant localize() - script FR obsolète +- `1wKVvxRTHOyV4Qdv.js` - Le système utilise maintenant localize() - script FR obsolète +- `22bW97lkvCqisfHX.js` - Le système utilise maintenant localize() - script FR obsolète +- `23HgjCB1oecxANvA.js` - Le système utilise maintenant localize() - script FR obsolète +- `2AdSBXw7IwCiqawQ.js` - Le système utilise maintenant localize() - script FR obsolète +- `2NLINicPQWbuvp2n.js` - Le système utilise maintenant localize() - script FR obsolète +- `2VNnVrtktdGUqXEV.js` - Le système utilise maintenant localize() - script FR obsolète +- `2W9uMTT6iJhfQ044.js` - Le système utilise maintenant localize() - script FR obsolète +- `2WSN306tL4apjRtD.js` - Le système utilise maintenant localize() - script FR obsolète +- `2hzDv8ROulOe1elK.js` - Le système utilise maintenant localize() - script FR obsolète +- `2sDH6RvoOAR40oqH.js` - Le système utilise maintenant localize() - script FR obsolète +- `2vTVR0quRZQtjNfQ.js` - Le système utilise maintenant localize() - script FR obsolète +- `3JEzEzF1SeYA9lsV.js` - Le système utilise maintenant localize() - script FR obsolète +- `3hfMQkUKYI4rCuBy.js` - Le système utilise maintenant localize() - script FR obsolète +- `3plV9WFqs2prfAdp.js` - Le système utilise maintenant localize() - script FR obsolète +- `3sfD1nedXLzuYoXJ.js` - Le système utilise maintenant localize() - script FR obsolète +- `454x3Q95pLvZm0Kx.js` - Le système utilise maintenant localize() - script FR obsolète +- `4FGKZk2f0xrmIDnp.js` - Le système utilise maintenant localize() - script FR obsolète +- `4ZR7p8G3OzOBWx0L.js` - Le système utilise maintenant localize() - script FR obsolète +- `4fnTKgl0HW9ZrWyJ.js` - Le système utilise maintenant localize() - script FR obsolète +- `4iuTz0uInAfMaoGl.js` - Le système utilise maintenant localize() - script FR obsolète +- `4pQW4WLyhjbZR85k.js` - Le système utilise maintenant localize() - script FR obsolète +- `4rb7LfMq9CTnlrpn.js` - Le système utilise maintenant localize() - script FR obsolète +- `52mwb33mGrQjq89B.js` - Le système utilise maintenant localize() - script FR obsolète +- `5Fe1ELaS6Gnvy0Cj.js` - Le système utilise maintenant localize() - script FR obsolète +- `5o1XiceC4rutjMms.js` - Le système utilise maintenant localize() - script FR obsolète +- `5sI9iYh5j2nx2XyT.js` - Le système utilise maintenant localize() - script FR obsolète +- `6JrUjs3g5x6bFnj3.js` - Le système utilise maintenant localize() - script FR obsolète +- `6V3qHON3mcerlBlB.js` - Le système utilise maintenant localize() - script FR obsolète +- `6ZS1rQLkNvMDO0Fp.js` - Le système utilise maintenant localize() - script FR obsolète +- `6fElmBxTjdAaubbK.js` - Le système utilise maintenant localize() - script FR obsolète +- `6qUKKep5vhFYmo1J.js` - Le système utilise maintenant localize() - script FR obsolète +- `6tjn0RH4VyOPFneS.js` - Le système utilise maintenant localize() - script FR obsolète +- `715G1Bf0haOHvmYQ.js` - Le système utilise maintenant localize() - script FR obsolète +- `7Ck0fkzE4WQ62qVe.js` - Le système utilise maintenant localize() - script FR obsolète +- `7H6wYyJ6cpaoc2QQ.js` - Le système utilise maintenant localize() - script FR obsolète +- `7VAhXHov6pR1SkgD.js` - Le système utilise maintenant localize() - script FR obsolète +- `7e8FgQUF2oANANmx.js` - Le système utilise maintenant localize() - script FR obsolète +- `7szLG4VALuuy1cPm.js` - Le système utilise maintenant localize() - script FR obsolète +- `84IB8CWa55XzoAkv.js` - Le système utilise maintenant localize() - script FR obsolète +- `86ivOsBQAuu0UmFg.js` - Le système utilise maintenant localize() - script FR obsolète +- `8ByuHnUZ4RNTdGVv.js` - Le système utilise maintenant localize() - script FR obsolète +- `8N3Uqjq1ZxPxo4pk.js` - Le système utilise maintenant localize() - script FR obsolète +- `8RNziYGGb4sp3BGQ.js` - Le système utilise maintenant localize() - script FR obsolète +- `8ZAUBSH9CM9OTpTL.js` - Le système utilise maintenant localize() - script FR obsolète +- `93K85NnVwjVNXlZq.js` - Le système utilise maintenant localize() - script FR obsolète +- `9EVj4bmZJex45Mt7.js` - Le système utilise maintenant localize() - script FR obsolète +- `9JnPK1jNUEso7Pv8.js` - Le système utilise maintenant localize() - script FR obsolète +- `9RFoasDcFnYZ1txR.js` - Le système utilise maintenant localize() - script FR obsolète +- `9fK07tqqZyPg7dpx.js` - Le système utilise maintenant localize() - script FR obsolète +- `A3fvV69RS1lYgma0.js` - Le système utilise maintenant localize() - script FR obsolète +- `ACgKpKrEEHoNGG0h.js` - Le système utilise maintenant localize() - script FR obsolète +- `AHZ8f7dfN8jNsYk6.js` - Le système utilise maintenant localize() - script FR obsolète +- `ALuPRzf85dmkEfLo.js` - Le système utilise maintenant localize() - script FR obsolète +- `AMxezwtYnWCF6Oza.js` - Le système utilise maintenant localize() - script FR obsolète +- `AV2Kj6jgmIc45zKi.js` - Le système utilise maintenant localize() - script FR obsolète +- `B6ZbY3bxTPg6nCng.js` - Le système utilise maintenant localize() - script FR obsolète +- `B950b0XnIUYCdVwu.js` - Le système utilise maintenant localize() - script FR obsolète +- `BAOv7moTxsKlT3JS.js` - Le système utilise maintenant localize() - script FR obsolète +- `BNJRV66jlrp51qZK.js` - Le système utilise maintenant localize() - script FR obsolète +- `BtyFhdGMKiMamGhM.js` - Le système utilise maintenant localize() - script FR obsolète +- `C4LZnaX0MYgwrszj.js` - Le système utilise maintenant localize() - script FR obsolète +- `CCK1iIfPmB398ziT.js` - Le système utilise maintenant localize() - script FR obsolète +- `CiFeduksZJ6PRulx.js` - Le système utilise maintenant localize() - script FR obsolète +- `CkE8NZOhzPkuRrKJ.js` - Le système utilise maintenant localize() - script FR obsolète +- `DTiHS6RfwhF4THbf.js` - Le système utilise maintenant localize() - script FR obsolète +- `DsE6rTSzxEn6uWMz.js` - Le système utilise maintenant localize() - script FR obsolète +- `DuM5l2Yb4bdvDeaG.js` - Le système utilise maintenant localize() - script FR obsolète +- `DxQnamsb2AuW0p2e.js` - Le système utilise maintenant localize() - script FR obsolète +- `E4CHDe1xfmcV3oGv.js` - Le système utilise maintenant localize() - script FR obsolète +- `E6DMqfDeczqmVMFV.js` - Le système utilise maintenant localize() - script FR obsolète +- `E7D4bxz8gy4e1wL7.js` - Le système utilise maintenant localize() - script FR obsolète +- `EDAMEOzdBfkoKHxP.js` - Le système utilise maintenant localize() - script FR obsolète +- `EGWF3LHav3e2zFL4.js` - Le système utilise maintenant localize() - script FR obsolète +- `EQ5dtGW5kQhtAb87.js` - Le système utilise maintenant localize() - script FR obsolète +- `EU5j0hnDTG9Z6d1e.js` - Le système utilise maintenant localize() - script FR obsolète +- `EVBSHEC5nmmj2X41.js` - Le système utilise maintenant localize() - script FR obsolète +- `EmXwcuycEH8slEn5.js` - Le système utilise maintenant localize() - script FR obsolète +- `EmmG49pMOPHRwDzR.js` - Le système utilise maintenant localize() - script FR obsolète +- `Ew3C2WmLCtc1KT46.js` - Le système utilise maintenant localize() - script FR obsolète +- `FXuyiJoXdAh6WhRK.js` - Le système utilise maintenant localize() - script FR obsolète +- `FYUPfYyTYZkxRLFT.js` - Le système utilise maintenant localize() - script FR obsolète +- `FkTwk8hfHpRLbAp2.js` - Le système utilise maintenant localize() - script FR obsolète +- `FmLx9pwOkzqqU7Ph.js` - Le système utilise maintenant localize() - script FR obsolète +- `Fvlc4RkeF4dHjW3m.js` - Le système utilise maintenant localize() - script FR obsolète +- `GOq4TcnWbfyfCo2V.js` - Le système utilise maintenant localize() - script FR obsolète +- `GZFsuynUhgZqwTGo.js` - Le système utilise maintenant localize() - script FR obsolète +- `GbPEy22VuCNzlNv2.js` - Le système utilise maintenant localize() - script FR obsolète +- `Gc8S5TYlVdV8NnOT.js` - Le système utilise maintenant localize() - script FR obsolète +- `H2CJvApKMnfGNNoo.js` - Le système utilise maintenant localize() - script FR obsolète +- `HASsi6wYHVALExWq.js` - Le système utilise maintenant localize() - script FR obsolète +- `HKhyn0kijKfzW6cw.js` - Le système utilise maintenant localize() - script FR obsolète +- `HMC6hPND9DWLFfZE.js` - Le système utilise maintenant localize() - script FR obsolète +- `HUKzssLxeQo1wbx9.js` - Le système utilise maintenant localize() - script FR obsolète +- `Hcpn1gU58DIKIhty.js` - Le système utilise maintenant localize() - script FR obsolète +- `HdTuY2IGhdlMDOy3.js` - Le système utilise maintenant localize() - script FR obsolète +- `HfCxNd7mFGZH4s9Y.js` - Le système utilise maintenant localize() - script FR obsolète +- `HfZAQWoY8n3clLlo.js` - Le système utilise maintenant localize() - script FR obsolète +- `HiMBS6GeOwEydWYN.js` - Le système utilise maintenant localize() - script FR obsolète +- `HrOBAXsEX073ReKl.js` - Le système utilise maintenant localize() - script FR obsolète +- `I7ieW0hNYvvX0KFg.js` - Le système utilise maintenant localize() - script FR obsolète +- `I9QAPKbaXwMMMBT4.js` - Le système utilise maintenant localize() - script FR obsolète +- `ID8mCcjkl7PCQhDq.js` - Le système utilise maintenant localize() - script FR obsolète +- `IPPDvZdE8kn3H9z7.js` - Le système utilise maintenant localize() - script FR obsolète +- `IR5URcjnCuWBFMoN.js` - Le système utilise maintenant localize() - script FR obsolète +- `IsLAvY9ikR1cOJWw.js` - Le système utilise maintenant localize() - script FR obsolète +- `J0IWUhxada2ONowP.js` - Le système utilise maintenant localize() - script FR obsolète +- `JBoKPBr27C3PMoSD.js` - Le système utilise maintenant localize() - script FR obsolète +- `JEbs0WlqhKNDOo5A.js` - Le système utilise maintenant localize() - script FR obsolète +- `JQruHprM5R5vZ9DA.js` - Le système utilise maintenant localize() - script FR obsolète +- `JeThJbOf6Xmbtgo1.js` - Le système utilise maintenant localize() - script FR obsolète +- `JgCcgDVZX54slrWx.js` - Le système utilise maintenant localize() - script FR obsolète +- `JhCMYHHYA860Kka8.js` - Le système utilise maintenant localize() - script FR obsolète +- `JibNjuQrJRnY0yf9.js` - Le système utilise maintenant localize() - script FR obsolète +- `Jk7OHqx06oCUVAzb.js` - Le système utilise maintenant localize() - script FR obsolète +- `JstrA46EYSEuRSy5.js` - Le système utilise maintenant localize() - script FR obsolète +- `JyTxUG5dNW670Sf7.js` - Le système utilise maintenant localize() - script FR obsolète +- `KIoVBinAZK8sMOqD.js` - Le système utilise maintenant localize() - script FR obsolète +- `KPQfupKuaf4LCv4R.js` - Le système utilise maintenant localize() - script FR obsolète +- `KSjsDlsx3DD6cT16.js` - Le système utilise maintenant localize() - script FR obsolète +- `KTBVDHUndI3qDOXM.js` - Le système utilise maintenant localize() - script FR obsolète +- `KUx0deSF3xNzMucL.js` - Le système utilise maintenant localize() - script FR obsolète +- `KkjkYAGI9Em1NgiQ.js` - Le système utilise maintenant localize() - script FR obsolète +- `KyUPYV1RXJxPOfyA.js` - Le système utilise maintenant localize() - script FR obsolète +- `L9eAtDyaoHvqryk4.js` - Le système utilise maintenant localize() - script FR obsolète +- `LeKLtvEDrWh4yHsx.js` - Le système utilise maintenant localize() - script FR obsolète +- `Lg1oRg4oNRvucsvi.js` - Le système utilise maintenant localize() - script FR obsolète +- `LjfScVGBf0Egr70E.js` - Le système utilise maintenant localize() - script FR obsolète +- `Lpv2N9LK9loeumiW.js` - Le système utilise maintenant localize() - script FR obsolète +- `Lrb1S2aK7SFVD0C7.js` - Le système utilise maintenant localize() - script FR obsolète +- `Lu27iXtJVkrJ8bOx.js` - Le système utilise maintenant localize() - script FR obsolète +- `M0XhKnWjG14pk3iH.js` - Le système utilise maintenant localize() - script FR obsolète +- `M2FshTX4PjKFVU8y.js` - Le système utilise maintenant localize() - script FR obsolète +- `M9VgeYGiUO97ZUW4.js` - Le système utilise maintenant localize() - script FR obsolète +- `MJB6WbZSF6Briz30.js` - Le système utilise maintenant localize() - script FR obsolète +- `MMv2B8TH7jxNCtdl.js` - Le système utilise maintenant localize() - script FR obsolète +- `MMx8f5uJ15XOgJGg.js` - Le système utilise maintenant localize() - script FR obsolète +- `MSJWJEUrX7ZmMvAD.js` - Le système utilise maintenant localize() - script FR obsolète +- `Mp8UjuCLa9jdzhBS.js` - Le système utilise maintenant localize() - script FR obsolète +- `N9kA46ZQ9LiRjy6T.js` - Le système utilise maintenant localize() - script FR obsolète +- `NDvNGATDM2xPFJK0.js` - Le système utilise maintenant localize() - script FR obsolète +- `NkqtQaLEGYst0PUO.js` - Le système utilise maintenant localize() - script FR obsolète +- `NnA4zpuO6iUXKhH7.js` - Le système utilise maintenant localize() - script FR obsolète +- `NnDq4miIPNEtZUWb.js` - Le système utilise maintenant localize() - script FR obsolète +- `Np8P8IPT2GYlrh6G.js` - Le système utilise maintenant localize() - script FR obsolète +- `OeCgX3hIsfLfmGvC.js` - Le système utilise maintenant localize() - script FR obsolète +- `OgSI0Z6SHjYuqKIz.js` - Le système utilise maintenant localize() - script FR obsolète +- `OqLKL0PiCvYH2QxW.js` - Le système utilise maintenant localize() - script FR obsolète +- `P29tT1eMMdAw3CPF.js` - Le système utilise maintenant localize() - script FR obsolète +- `PMISUsaEDBA7D3od.js` - Le système utilise maintenant localize() - script FR obsolète +- `PMNjdEAusVBfam09.js` - Le système utilise maintenant localize() - script FR obsolète +- `PVjaKAHTKDA0rA9J.js` - Le système utilise maintenant localize() - script FR obsolète +- `PdClojv7yNgQpOUc.js` - Le système utilise maintenant localize() - script FR obsolète +- `PoNnT5EqvLj2r5yf.js` - Le système utilise maintenant localize() - script FR obsolète +- `Q4EQgP4gZR8TTm7S.js` - Le système utilise maintenant localize() - script FR obsolète +- `Q5gh5Y9dCdclcwsD.js` - Le système utilise maintenant localize() - script FR obsolète +- `Q9EmlWmuDac83cJw.js` - Le système utilise maintenant localize() - script FR obsolète +- `QPVVDPcJ4Xi5FmQl.js` - Le système utilise maintenant localize() - script FR obsolète +- `QQ2gHThZHdO4yLLX.js` - Le système utilise maintenant localize() - script FR obsolète +- `QfTBRGXVfwQSghmd.js` - Le système utilise maintenant localize() - script FR obsolète +- `RDtJXji3hgcKnEBk.js` - Le système utilise maintenant localize() - script FR obsolète +- `RHyBLYT5oHf7EPnG.js` - Le système utilise maintenant localize() - script FR obsolète +- `RNr9CwyvLhlnwD2h.js` - Le système utilise maintenant localize() - script FR obsolète +- `RprZWlnopSqZt7KZ.js` - Le système utilise maintenant localize() - script FR obsolète +- `RrchOMpEdIvceJxl.js` - Le système utilise maintenant localize() - script FR obsolète +- `SNjG7IvgQzvCGczR.js` - Le système utilise maintenant localize() - script FR obsolète +- `SrCHfOJFZwDickqa.js` - Le système utilise maintenant localize() - script FR obsolète +- `T3RfSt3VMEat3iDD.js` - Le système utilise maintenant localize() - script FR obsolète +- `TOyQLrugFGzwc5nY.js` - Le système utilise maintenant localize() - script FR obsolète +- `TU2xjbJ0zFtytF3J.js` - Le système utilise maintenant localize() - script FR obsolète +- `TdjlJro0RRVSh8g8.js` - Le système utilise maintenant localize() - script FR obsolète +- `ToKlHDAjJOsC51ag.js` - Le système utilise maintenant localize() - script FR obsolète +- `Tq45Nd8J3eTvHT41.js` - Le système utilise maintenant localize() - script FR obsolète +- `TrIYdcG3jDER4WgY.js` - Le système utilise maintenant localize() - script FR obsolète +- `TwwKxFjK6TNGKbRB.js` - Le système utilise maintenant localize() - script FR obsolète +- `U4A8FDNmwBGTuQZO.js` - Le système utilise maintenant localize() - script FR obsolète +- `U78c4oUjKwyUu6jT.js` - Le système utilise maintenant localize() - script FR obsolète +- `U7lRf56BFaTfsC6B.js` - Le système utilise maintenant localize() - script FR obsolète +- `U9xh2wriSqCosugW.js` - Le système utilise maintenant localize() - script FR obsolète +- `UC6G3pFQwzUhrw6F.js` - Le système utilise maintenant localize() - script FR obsolète +- `UTlgF4azrGQZsoDv.js` - Le système utilise maintenant localize() - script FR obsolète +- `UaImulhbPURkLJg2.js` - Le système utilise maintenant localize() - script FR obsolète +- `UsAHQecRlWL5PhP6.js` - Le système utilise maintenant localize() - script FR obsolète +- `UvycHOjSPm5Zv9KJ.js` - Le système utilise maintenant localize() - script FR obsolète +- `VAs1nXvicdQK18Do.js` - Le système utilise maintenant localize() - script FR obsolète +- `VCnNWmRBH28Rx0JH.js` - Le système utilise maintenant localize() - script FR obsolète +- `VNOKTzCrFbZ6PJUj.js` - Le système utilise maintenant localize() - script FR obsolète +- `VQaC6ynouW5EQCbC.js` - Le système utilise maintenant localize() - script FR obsolète +- `VbL0TgaBAmYjrezZ.js` - Le système utilise maintenant localize() - script FR obsolète +- `VlFUDaKUYoBYKYn0.js` - Le système utilise maintenant localize() - script FR obsolète +- `VlHuDIAvPr8JM1P5.js` - Le système utilise maintenant localize() - script FR obsolète +- `Vns6WrafVq8NjX7t.js` - Le système utilise maintenant localize() - script FR obsolète +- `VqTrKPtxv9hpn0Hr.js` - Le système utilise maintenant localize() - script FR obsolète +- `VurA2XNqC0d9U49C.js` - Le système utilise maintenant localize() - script FR obsolète +- `VzO0ZDcTWvaBn4vm.js` - Le système utilise maintenant localize() - script FR obsolète +- `WTRYAEzwxRuGENyI.js` - Le système utilise maintenant localize() - script FR obsolète +- `Wqff6ICWYzvLDYC8.js` - Le système utilise maintenant localize() - script FR obsolète +- `XClTZOjuhcxWLF51.js` - Le système utilise maintenant localize() - script FR obsolète +- `Xf4FcZ4ZLdWmOXBa.js` - Le système utilise maintenant localize() - script FR obsolète +- `XuFxKPYheYF4WMmQ.js` - Le système utilise maintenant localize() - script FR obsolète +- `YDqpKJVy8ijEKdLX.js` - Le système utilise maintenant localize() - script FR obsolète +- `YEBw2CzHYxsTpTy5.js` - Le système utilise maintenant localize() - script FR obsolète +- `YFSgWRXel0bWE3EE.js` - Le système utilise maintenant localize() - script FR obsolète +- `YMaxpXnml01bLGpO.js` - Le système utilise maintenant localize() - script FR obsolète +- `YhhiWEQbox3WZA3Q.js` - Le système utilise maintenant localize() - script FR obsolète +- `Z6OmmC0irJzxSnMH.js` - Le système utilise maintenant localize() - script FR obsolète +- `ZLspFT2I3ZdWWr2H.js` - Le système utilise maintenant localize() - script FR obsolète +- `ZNW3ubbKIYXAyE48.js` - Le système utilise maintenant localize() - script FR obsolète +- `Ze9E2zR1GFGWGMVH.js` - Le système utilise maintenant localize() - script FR obsolète +- `ZgF1sYdbAKaOuHmK.js` - Le système utilise maintenant localize() - script FR obsolète +- `ZvbBM4gTJHPdU8jU.js` - Le système utilise maintenant localize() - script FR obsolète +- `a0YU3whUm16wGBNu.js` - Le système utilise maintenant localize() - script FR obsolète +- `a4Aza4a9v8JMU8dC.js` - Le système utilise maintenant localize() - script FR obsolète +- `a6gacHsvgwtsIFSQ.js` - Le système utilise maintenant localize() - script FR obsolète +- `aAvJrAKLzXhS9qN6.js` - Le système utilise maintenant localize() - script FR obsolète +- `afdmOvPGMpEdZvCb.js` - Le système utilise maintenant localize() - script FR obsolète +- `b5prg1FLjCAvBjLy.js` - Le système utilise maintenant localize() - script FR obsolète +- `bh2qDCKiAIWM0UPi.js` - Le système utilise maintenant localize() - script FR obsolète +- `bhXUW7IJtEaUGAoV.js` - Le système utilise maintenant localize() - script FR obsolète +- `bwx9wuEOJPF7btD1.js` - Le système utilise maintenant localize() - script FR obsolète +- `c3KA1knL2NYNUEww.js` - Le système utilise maintenant localize() - script FR obsolète +- `cAKqUBuJBsU85erO.js` - Le système utilise maintenant localize() - script FR obsolète +- `cTYNaKbepMwqYsZ8.js` - Le système utilise maintenant localize() - script FR obsolète +- `cV9JiAgUPOeUHKnS.js` - Le système utilise maintenant localize() - script FR obsolète +- `cqYgZQk1C3kMARy5.js` - Le système utilise maintenant localize() - script FR obsolète +- `dAMtbn3uQwF8KpKU.js` - Le système utilise maintenant localize() - script FR obsolète +- `dSmRhZ6o1bUcOSF9.js` - Le système utilise maintenant localize() - script FR obsolète +- `dXGosSxdoYbET2O8.js` - Le système utilise maintenant localize() - script FR obsolète +- `dfEgat3jz4EtWszH.js` - Le système utilise maintenant localize() - script FR obsolète +- `dfnCK8jCPXNLM7Gh.js` - Le système utilise maintenant localize() - script FR obsolète +- `dkiNmwFXztIVbuxg.js` - Le système utilise maintenant localize() - script FR obsolète +- `dsXGavzXLerXR8Xg.js` - Le système utilise maintenant localize() - script FR obsolète +- `dtFvpY96RPzNnphq.js` - Le système utilise maintenant localize() - script FR obsolète +- `dwSgcFxKN3S0hLJL.js` - Le système utilise maintenant localize() - script FR obsolète +- `eGQAyzCFZAEQhyJl.js` - Le système utilise maintenant localize() - script FR obsolète +- `f062aa2BNClx08D6.js` - Le système utilise maintenant localize() - script FR obsolète +- `f3rXusHh6VIpVPUl.js` - Le système utilise maintenant localize() - script FR obsolète +- `f5Mp3kXwCFdPkW6N.js` - Le système utilise maintenant localize() - script FR obsolète +- `fKzlu6fFE2th9uIJ.js` - Le système utilise maintenant localize() - script FR obsolète +- `fP2edYbj6QjPPAjL.js` - Le système utilise maintenant localize() - script FR obsolète +- `fYLSe6CrYciap5y8.js` - Le système utilise maintenant localize() - script FR obsolète +- `g07HI7vyqiFXPB0o.js` - Le système utilise maintenant localize() - script FR obsolète +- `gFUXBbTskQBKjxqm.js` - Le système utilise maintenant localize() - script FR obsolète +- `gKPL3t4vlZAsvtGr.js` - Le système utilise maintenant localize() - script FR obsolète +- `gnVpxOeBZpNF4HIF.js` - Le système utilise maintenant localize() - script FR obsolète +- `gqZLfIr6svrtdwdC.js` - Le système utilise maintenant localize() - script FR obsolète +- `gu72JaTs9GrSiVTd.js` - Le système utilise maintenant localize() - script FR obsolète +- `h0DfPwUUOBjyAHMZ.js` - Le système utilise maintenant localize() - script FR obsolète +- `h1XKoMuVnS0bagRO.js` - Le système utilise maintenant localize() - script FR obsolète +- `hDC6lroDEPVBituR.js` - Le système utilise maintenant localize() - script FR obsolète +- `hR1qD2kpFHF8JT8h.js` - Le système utilise maintenant localize() - script FR obsolète +- `hnsmzvcuiUYB065I.js` - Le système utilise maintenant localize() - script FR obsolète +- `iM6JLF8jDXMViReZ.js` - Le système utilise maintenant localize() - script FR obsolète +- `iT0h3VZLEBQnn5Bx.js` - Le système utilise maintenant localize() - script FR obsolète +- `iT3C15fMyQrj1RmG.js` - Le système utilise maintenant localize() - script FR obsolète +- `jRSgPhpfN7MH7TTp.js` - Le système utilise maintenant localize() - script FR obsolète +- `jgO1Kf60Ctt6R0qO.js` - Le système utilise maintenant localize() - script FR obsolète +- `jpcU8FFWSlQ3gD0L.js` - Le système utilise maintenant localize() - script FR obsolète +- `k3FqFgsF6a3TkxAD.js` - Le système utilise maintenant localize() - script FR obsolète +- `k8TC0yzp4xfOXD2n.js` - Le système utilise maintenant localize() - script FR obsolète +- `kEaBLoIHt1FpQVKq.js` - Le système utilise maintenant localize() - script FR obsolète +- `kMSdRskYDI2J1gnp.js` - Le système utilise maintenant localize() - script FR obsolète +- `kWynO1lQzjiSs8RK.js` - Le système utilise maintenant localize() - script FR obsolète +- `kYiDBPRKIokFkr4Z.js` - Le système utilise maintenant localize() - script FR obsolète +- `kYmscP2HuXjDovBD.js` - Le système utilise maintenant localize() - script FR obsolète +- `kkC5EhqA05U6U0gU.js` - Le système utilise maintenant localize() - script FR obsolète +- `kmsGLWGxCY8Z8jVG.js` - Le système utilise maintenant localize() - script FR obsolète +- `l1ntrpa8RE3Lg5xE.js` - Le système utilise maintenant localize() - script FR obsolète +- `l8qFKSnMpy4P7XQR.js` - Le système utilise maintenant localize() - script FR obsolète +- `lPudo1grrVp05i7a.js` - Le système utilise maintenant localize() - script FR obsolète +- `lYYkGzqNshiYc7WI.js` - Le système utilise maintenant localize() - script FR obsolète +- `lhemR8EP5tGNKout.js` - Le système utilise maintenant localize() - script FR obsolète +- `mTnmPcjWmvScIBWY.js` - Le système utilise maintenant localize() - script FR obsolète +- `mYL4i1vNlMl4vFYy.js` - Le système utilise maintenant localize() - script FR obsolète +- `mr8qm5Bg6k1idZ6Q.js` - Le système utilise maintenant localize() - script FR obsolète +- `mziJBUYcsrhkdcCJ.js` - Le système utilise maintenant localize() - script FR obsolète +- `nD2QVg3DrPK3foMf.js` - Le système utilise maintenant localize() - script FR obsolète +- `nEaF3jbCiVYD8jia.js` - Le système utilise maintenant localize() - script FR obsolète +- `nIOeK0BrtdZeZW8X.js` - Le système utilise maintenant localize() - script FR obsolète +- `ncIjDE6TFx88IQA1.js` - Le système utilise maintenant localize() - script FR obsolète +- `nvrFhHHVq3KzirlR.js` - Le système utilise maintenant localize() - script FR obsolète +- `o3JUBKLvE6bBxK2n.js` - Le système utilise maintenant localize() - script FR obsolète +- `oEsUsI74yGTZ9CwU.js` - Le système utilise maintenant localize() - script FR obsolète +- `oGdsGPgJWcyWkiWl.js` - Le système utilise maintenant localize() - script FR obsolète +- `oWM43EdUiyHgUlfW.js` - Le système utilise maintenant localize() - script FR obsolète +- `obIXhQXKFyyQoNNV.js` - Le système utilise maintenant localize() - script FR obsolète +- `p222EiR8RRtlPm31.js` - Le système utilise maintenant localize() - script FR obsolète +- `p7NJB1PsY6X5q8OO.js` - Le système utilise maintenant localize() - script FR obsolète +- `pAgiAGyaLJY10894.js` - Le système utilise maintenant localize() - script FR obsolète +- `pHyXdPnWwoFrUA5n.js` - Le système utilise maintenant localize() - script FR obsolète +- `pNPjXEoQGHLKzq0r.js` - Le système utilise maintenant localize() - script FR obsolète +- `pq1YQffxtOcqCRTn.js` - Le système utilise maintenant localize() - script FR obsolète +- `pzknBcJtZWeliE27.js` - Le système utilise maintenant localize() - script FR obsolète +- `qTk96NKh14YOIShf.js` - Le système utilise maintenant localize() - script FR obsolète +- `qaVde0sTuMBRi2nl.js` - Le système utilise maintenant localize() - script FR obsolète +- `qijgjcOBCDmhglRX.js` - Le système utilise maintenant localize() - script FR obsolète +- `quPcuKsq2fcild4a.js` - Le système utilise maintenant localize() - script FR obsolète +- `qzGPJflVW7c2Ciim.js` - Le système utilise maintenant localize() - script FR obsolète +- `rXMylpnEtZpwou6x.js` - Le système utilise maintenant localize() - script FR obsolète +- `red2bt4PGgIWAdTR.js` - Le système utilise maintenant localize() - script FR obsolète +- `rlTvhnDpj4lzfusf.js` - Le système utilise maintenant localize() - script FR obsolète +- `rnioLwiJP7ps5Jwy.js` - Le système utilise maintenant localize() - script FR obsolète +- `roKvPHDSpX4IV11C.js` - Le système utilise maintenant localize() - script FR obsolète +- `rr4htuVq45onXdRG.js` - Le système utilise maintenant localize() - script FR obsolète +- `rxB1AqfVMDqTRieE.js` - Le système utilise maintenant localize() - script FR obsolète +- `s7gJQdzuM3fz2zQK.js` - Le système utilise maintenant localize() - script FR obsolète +- `sSMg43ZjnNmpytfj.js` - Le système utilise maintenant localize() - script FR obsolète +- `sUHuj00IpoZ7Gd03.js` - Le système utilise maintenant localize() - script FR obsolète +- `sWyO1DNaqb2EdHoW.js` - Le système utilise maintenant localize() - script FR obsolète +- `sagKJM6oDFlw4ED2.js` - Le système utilise maintenant localize() - script FR obsolète +- `sgS9rblPkQB36C8S.js` - Le système utilise maintenant localize() - script FR obsolète +- `syBgPp7rOymCZejX.js` - Le système utilise maintenant localize() - script FR obsolète +- `t56mnblo1kv3gM1M.js` - Le système utilise maintenant localize() - script FR obsolète +- `tDrs0aNIYmZPsOoS.js` - Le système utilise maintenant localize() - script FR obsolète +- `tG1qGqzBLmAR3WHm.js` - Le système utilise maintenant localize() - script FR obsolète +- `tcZug8ehU6lyYBd9.js` - Le système utilise maintenant localize() - script FR obsolète +- `tn6SwmjAuNzqE6dx.js` - Le système utilise maintenant localize() - script FR obsolète +- `tnE8LF6E3svIlLca.js` - Le système utilise maintenant localize() - script FR obsolète +- `tnilBagajWM8UGQt.js` - Le système utilise maintenant localize() - script FR obsolète +- `tolkNN5P7oOC8GKZ.js` - Le système utilise maintenant localize() - script FR obsolète +- `tuIsytv3jl2yAIb2.js` - Le système utilise maintenant localize() - script FR obsolète +- `uACa6u4JLNMRgFlr.js` - Le système utilise maintenant localize() - script FR obsolète +- `uSwkYENTOcnfRrqA.js` - Le système utilise maintenant localize() - script FR obsolète +- `upfK6GM33qZCZjll.js` - Le système utilise maintenant localize() - script FR obsolète +- `uwdQvZtzy2HVeEzx.js` - Le système utilise maintenant localize() - script FR obsolète +- `ux3jaLpAUhZ5YqA6.js` - Le système utilise maintenant localize() - script FR obsolète +- `v6LIG7EwWYALxCpP.js` - Le système utilise maintenant localize() - script FR obsolète +- `vj3zArmX27vCxYJW.js` - Le système utilise maintenant localize() - script FR obsolète +- `vvdo1NxjmGVkmFCT.js` - Le système utilise maintenant localize() - script FR obsolète +- `vzMxIDjRlQSxXtCW.js` - Le système utilise maintenant localize() - script FR obsolète +- `w4JKuTECFmu3YmTR.js` - Le système utilise maintenant localize() - script FR obsolète +- `wS6OIR3QN4mOUHn0.js` - Le système utilise maintenant localize() - script FR obsolète +- `wsqNM4NHnwaAAQym.js` - Le système utilise maintenant localize() - script FR obsolète +- `wzkxiKjxVEeNS1di.js` - Le système utilise maintenant localize() - script FR obsolète +- `x2RLUUNB7BiIDYCP.js` - Le système utilise maintenant localize() - script FR obsolète +- `x8XK2fzzXCnSwfjt.js` - Le système utilise maintenant localize() - script FR obsolète +- `xRd6oA1QWLVpfoBm.js` - Le système utilise maintenant localize() - script FR obsolète +- `xS2su09zcza9du09.js` - Le système utilise maintenant localize() - script FR obsolète +- `xVYVegD692CCv8Yl.js` - Le système utilise maintenant localize() - script FR obsolète +- `xWPgIZOQLba5nZ23.js` - Le système utilise maintenant localize() - script FR obsolète +- `xobGBJbgFjQCrwvq.js` - Le système utilise maintenant localize() - script FR obsolète +- `xvH4PKJasHcehOZz.js` - Le système utilise maintenant localize() - script FR obsolète +- `yIGItnshXI4W46cp.js` - Le système utilise maintenant localize() - script FR obsolète +- `yRRzSKlcN3L7rEEe.js` - Le système utilise maintenant localize() - script FR obsolète +- `yXUPiWuQ5o0JBY4i.js` - Le système utilise maintenant localize() - script FR obsolète +- `yatUu0cd7iKs50rq.js` - Le système utilise maintenant localize() - script FR obsolète +- `z5HfNUrHy5MS3K7a.js` - Le système utilise maintenant localize() - script FR obsolète +- `zA6TDttpwMSMl7D8.js` - Le système utilise maintenant localize() - script FR obsolète +- `zFYCaGR0wbFWjl4T.js` - Le système utilise maintenant localize() - script FR obsolète +- `zLBLEDl3aGcAxai2.js` - Le système utilise maintenant localize() - script FR obsolète +- `zR4WAjzXHTZuiu5G.js` - Le système utilise maintenant localize() - script FR obsolète +- `zY4ZjY7uyKIKMYmX.js` - Le système utilise maintenant localize() - script FR obsolète +- `ziG9H5Kdb7xC3dFE.js` - Le système utilise maintenant localize() - script FR obsolète +- `zsiV6XEHlCNGLLPl.js` - Le système utilise maintenant localize() - script FR obsolète +- `zzk2uRSFjFHB5kjw.js` - Le système utilise maintenant localize() - script FR obsolète + +## Scripts nécessitant une mise à jour + +### 03mJu59V4iByWlsO.js + +- Taille WFRP4E: 1153 octets +- Taille FR: 1201 octets +- Textes FR:

            ${this.actor.prototypeToken.name} : +

              +
            • Reçoit 3 états Empoisonnés, sans Test de Résistance possible
            • +
            • Récupère ${this.actor.system.characteristics.t.bonus} Blessures
            • +
            • Acuiert le Trait de Creature Régénération.
            • +
            + C + +### 0BP5l7bIkf744G1k.js + +- Taille WFRP4E: 70 octets +- Taille FR: 70 octets + +### 0FWto1oEr3jbWggw.js + +- Taille WFRP4E: 789 octets +- Taille FR: 766 octets +- Textes WFRP4E: Could not find ${lore} spell. Try Again +- Textes FR: Impossible de trouver le sort ${lore}. Essayez à nouveau + +### 0R0QAr3D024kWPfo.js + +- Taille WFRP4E: 552 octets +- Taille FR: 589 octets +- Textes WFRP4E: Mutation table not found, please ensure a table with the , Item could not be found: , ${item.name} added +- Textes FR: La table des Mutations n, L, ${item.name} added + +### 0Uly7OmkH0zqYbxQ.js + +- Taille WFRP4E: 584 octets +- Taille FR: 585 octets +- Textes WFRP4E: Dropped ${dropped.map(i => i.name).join( +- Textes FR: Lache ${dropped.map(i => i.name).join( + +### 0abwNjpzo3SbEOeO.js + +- Taille WFRP4E: 267 octets +- Taille FR: 270 octets + +### 0yyofYHeDRQlFliO.js + +- Taille WFRP4E: 68 octets +- Taille FR: 68 octets + +### 11uCC0mK2uL783al.js + +- Taille WFRP4E: 134 octets +- Taille FR: 133 octets + +### 190PHSHKGaJ74wsR.js + +- Taille WFRP4E: 1169 octets +- Taille FR: 1060 octets + +### 1BT0MWM2cbhlEnrn.js + +- Taille WFRP4E: 1169 octets +- Taille FR: 1176 octets +- Textes WFRP4E: Could not find ${talent} +- Textes FR: Impossible de trouver ${talent} + +### 1CeYp5MlPcH68UIw.js + +- Taille WFRP4E: 2481 octets +- Taille FR: 2498 octets +- Textes WFRP4E: Could not find ${talent}, Could not find ${trapping} +- Textes FR: Impossible de trouver ${talent}, Impossible de trouver ${trapping} + +### 1JwxZujbDcueLWBL.js + +- Taille WFRP4E: 162 octets +- Taille FR: 168 octets + +### 1OpT3CXs07XFWWCT.js + +- Taille WFRP4E: 30 octets +- Taille FR: 30 octets + +### 1ZArMNUI8qqH6zkX.js + +- Taille WFRP4E: 247 octets +- Taille FR: 242 octets + +### 1exiWlVUHsXDLLAH.js + +- Taille WFRP4E: 62 octets +- Taille FR: 70 octets +- Textes WFRP4E: Cannot enter ${this.effect.name}! +- Textes FR: Ne peut saisir ${this.effect.name}! + +### 1fQr1Dg7DX0vfz3r.js + +- Taille WFRP4E: 134 octets +- Taille FR: 145 octets +- Textes FR: Soins de ${healed} Blessures + +### 1jQq9v8fXK8zuEBU.js + +- Taille WFRP4E: 853 octets +- Taille FR: 863 octets + +### 1l7Jz2ZHbAWko7Vm.js + +- Taille WFRP4E: 33 octets +- Taille FR: 33 octets + +### 1wrPvP6lJwIAfmsl.js + +- Taille WFRP4E: 362 octets +- Taille FR: 371 octets + +### 1yOvw74jzFfaI87b.js + +- Taille WFRP4E: 27 octets +- Taille FR: 27 octets + +### 23vWiHUjxtRQ3Efz.js + +- Taille WFRP4E: 219 octets +- Taille FR: 218 octets + +### 2AOo7KUyzMrgIlgM.js + +- Taille WFRP4E: 137 octets +- Taille FR: 129 octets + +### 2Qi1hwLYhdE6v6Hs.js + +- Taille WFRP4E: 243 octets +- Taille FR: 258 octets +- Textes WFRP4E: Cannot Dodge! +- Textes FR: Impossible d + +### 2cKarG9ToyW2ptCd.js + +- Taille WFRP4E: 338 octets +- Taille FR: 340 octets +- Textes WFRP4E: None left! +- Textes FR: Vide ! + +### 2rzxQlL7A9ujZ9uK.js + +- Taille WFRP4E: 315 octets +- Taille FR: 316 octets +- Textes WFRP4E: ${this.effect.name}: Gained ${this.item.Advances} Advantage +- Textes FR: ${this.effect.name}: Gain de ${this.item.Advances} Avantages + +### 2yctEihGmdCfTTVx.js + +- Taille WFRP4E: 88 octets +- Taille FR: 63 octets + +### 2zeP2nMSURjxrqYz.js + +- Taille WFRP4E: 282 octets +- Taille FR: 302 octets +- Textes WFRP4E: No effect at 0 Wounds, Healed ${this.actor.characteristics.t.bonus} Wounds +- Textes FR: Aucun effet à 0 Blessures, Soin de ${this.actor.characteristics.t.bonus} Blessures + +### 33US8YRgaMqYu2We.js + +- Taille WFRP4E: 29 octets +- Taille FR: 29 octets + +### 37UN17gb8suFeZIW.js + +- Taille WFRP4E: 133 octets +- Taille FR: 139 octets + +### 3D5ImpMgpOTPucvv.js + +- Taille WFRP4E: 379 octets +- Taille FR: 379 octets + +### 3IGO7xEjRjat937X.js + +- Taille WFRP4E: 232 octets +- Taille FR: 241 octets +- Textes WFRP4E: Removing Fatigued Condition, disabled effect +- Textes FR: Suppression de l + +### 3eSaX0BeaUalNkEP.js + +- Taille WFRP4E: 26 octets +- Taille FR: 26 octets + +### 3jm0NoYpgB6ZuUSl.js + +- Taille WFRP4E: 38 octets +- Taille FR: 38 octets + +### 3l7MQSa10Kve2K3P.js + +- Taille WFRP4E: 215 octets +- Taille FR: 221 octets + +### 4MQ7u4INxp51oyyR.js + +- Taille WFRP4E: 1932 octets +- Taille FR: 1952 octets +- Textes WFRP4E: Could not find ${talent}, Could not find ${trapping} +- Textes FR: Impossible de trouver ${talent}, Impossible de trouver ${trapping} + +### 4ylzjgUdHY5D0yVh.js + +- Taille WFRP4E: 3410 octets +- Taille FR: 3359 octets +- Textes WFRP4E: Could not find ${talent}, Could not find ${trapping} +- Textes FR: Impossible de trouver ${talent}, Impossible de trouver ${trapping} + +### 58rFc9HiBoX66J6p.js + +- Taille WFRP4E: 444 octets +- Taille FR: 453 octets + +### 5DI6cHAg1LHo54Yv.js + +- Taille WFRP4E: 420 octets +- Taille FR: 426 octets +- Textes FR: 1 Point de Fortune volé à ${this.actor.name} + +### 5JWC0l3JEpOsqbR9.js + +- Taille WFRP4E: 1767 octets +- Taille FR: 1783 octets +- Textes WFRP4E: Could not find ${talent}, Could not find ${trapping} +- Textes FR: Impossible de trouver ${talent}, Impossible de trouver ${trapping} + +### 5JvKJZPcd6Hz5zvn.js + +- Taille WFRP4E: 1886 octets +- Taille FR: 1906 octets +- Textes WFRP4E: Could not find ${talent}, Could not find ${trapping} +- Textes FR: Impossible de trouver ${talent}, Impossible de trouver ${trapping} + +### 5M6IgCUncCwyxHok.js + +- Taille WFRP4E: 1217 octets +- Taille FR: 1197 octets + +### 5MxRDXzUBPfp2KKD.js + +- Taille WFRP4E: 38 octets +- Taille FR: 38 octets + +### 5ScjIdRUOxblHdWS.js + +- Taille WFRP4E: 1217 octets +- Taille FR: 1212 octets + +### 5dR7Erj3nwsxLAV7.js + +- Taille WFRP4E: 1954 octets +- Taille FR: 1976 octets +- Textes WFRP4E: Could not find ${talent}, Could not find ${trapping} +- Textes FR: Impossible de trouver ${talent}, Impossible de trouver ${trapping} + +### 62Ky6bC1EnTllSJA.js + +- Taille WFRP4E: 253 octets +- Taille FR: 259 octets + +### 65xE9OV5sA1ZWT7j.js + +- Taille WFRP4E: 377 octets +- Taille FR: 377 octets + +### 6Aqq4F4Xui923sc6.js + +- Taille WFRP4E: 779 octets +- Taille FR: 754 octets +- Textes FR:

            ${this.actor.prototypeToken.name} reçoit le Trait de Créatuer A Sang Froid et peut inverser n + +### 6BmvV9c03FkfisnE.js + +- Taille WFRP4E: 1069 octets +- Taille FR: 1107 octets +- Textes FR: ${this.actor.name} porte le ${this.item.name}.
            + Il gagne +1 Point de Corruption point si un Test de Corruption est échoué, à appliquer manuellement.
            Si le personnage porte le masque pendant plus d, ${this.item.name} de ${this.actor.name} a été enlevé et a perdu ses propriétés. Cependant, les effets perdurent pendant [[1d10+4]] jours, après quoi ils devront être manuellement supprimés. + +### 6H6vNjzvMGl2ZqCR.js + +- Taille WFRP4E: 285 octets +- Taille FR: 305 octets +- Textes FR: Lame de Nurglitch: ${args.actor.name} doit réussir un Test d + +### 6QZUX7ZrFxOzqI0b.js + +- Taille WFRP4E: 252 octets +- Taille FR: 268 octets + + +... et 423 autres fichiers + +## Scripts uniquement dans WFRP4E (394) + +Ces scripts existent dans WFRP4E mais pas dans le module FR. + +- 07tvKnPT8ICtv2us.js +- 0H2syk6qc0sCY0pj.js +- 0IAc5VFR2ogXOaGE.js +- 0NAD1LNcVyAZ1fC7.js +- 0PzfGjGhHQbxEwlb.js +- 0amHqfjTRp5ff6Op.js +- 0hAbiNR1nFkpFMRz.js +- 0hgTyeaEhMBLwzUn.js +- 0kUalAsb4OhtYbaJ.js +- 0uUxvBLJC76WIIBC.js +- 0wR0LWpfhLFA240I.js +- 0wmIC2MssUX6LW3N.js +- 1Du4e27M8WgP2iui.js +- 1PPh4vHd5sPKtudZ.js +- 1UvL0XA1EpQtjDNn.js +- 20fvE9nJmcfGYVzw.js +- 22PMOW0G5MWiBQmg.js +- 2EAYX5G9Fh3HJwiP.js +- 2Ej6LUqn8frTRURo.js +- 2IPTF0akWw9y48br.js + +... et 374 autres + +## Scripts uniquement dans FR (2) + +Ces scripts existent dans le module FR mais plus dans WFRP4E (probablement supprimés). + +- ZingXNvYyZ2BEvfY.js +- tfdKU6nmvUtEjXE2.js + diff --git a/tools/scripts-replaced-list.md b/tools/scripts-replaced-list.md new file mode 100644 index 0000000..3aaecd9 --- /dev/null +++ b/tools/scripts-replaced-list.md @@ -0,0 +1,93 @@ +# Scripts remplacés par les versions système + +Date: 2026-01-06T19:07:20.939Z + +## Résumé + +- **Scripts remplacés**: 46 +- **Erreurs**: 0 + +Tous les scripts ont été remplacés par leurs versions du système WFRP4E. +Les versions françaises avec traductions sont sauvegardées avec l'extension `.fr-backup`. + +## Scripts à revoir manuellement + +Pour chaque script, vous devez : +1. Comparer la version actuelle (système) avec le backup (.fr-backup) +2. Identifier les textes à traduire +3. Appliquer les traductions nécessaires + +| # | Fichier | Traductions trouvées | +|---|---------|----------------------| +| 1 | `0FWto1oEr3jbWggw.js` | Impossible de trouver le sort ${lore}. Essayez à nouveau, Chargement, Impossible... | +| 2 | `1BT0MWM2cbhlEnrn.js` | Impossible de trouver ${talent}, Impossible | +| 3 | `1CeYp5MlPcH68UIw.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 4 | `2Qi1hwLYhdE6v6Hs.js` | Impossible d, Impossible | +| 5 | `4MQ7u4INxp51oyyR.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 6 | `4ylzjgUdHY5D0yVh.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 7 | `5JWC0l3JEpOsqbR9.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 8 | `5JvKJZPcd6Hz5zvn.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 9 | `5dR7Erj3nwsxLAV7.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 10 | `6jcTzK1XEuWqAacN.js` | Impossible d, Impossible | +| 11 | `6xTtJEhRc4OjcDTf.js` | Impossible de mettre à jour la Fortune, Impossible | +| 12 | `A1odAcuRbq9797ZB.js` | Impossible de trouver ${talent}, Impossible | +| 13 | `I1J2m5uud84N50Lk.js` | Impossible d, Impossible | +| 14 | `IslMfFgpgQq2brpu.js` | Impossible de supprimer l, Impossible | +| 15 | `IupskvzvoGyD2H5o.js` | Adding , Impossible de trouver any Blessings associated with ${god}., Impossible... | +| 16 | `KICZPwLvbUSxbDrE.js` | Impossible de trouver la table des Mutations Mentales, Impossible de trouver l, ${item.name} added... | +| 17 | `N8hA6ysHCTlLd8Kj.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 18 | `RvipIYj9H7n4UDMe.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 19 | `TCtXPvDpbfz1yrVZ.js` | Impossible de trouver ${talent}, Impossible | +| 20 | `TwgdEucxcHloc4cX.js` | Impossible de trouver ${c.name}, Impossible | +| 21 | `U1UpSRJOSjPpO4HS.js` | Ajout ${mutations[roll].name}, Chargement, Chargement des mutations | +| 22 | `ULmZMLezDamerN04.js` | Chargement, Chargement des sorts | +| 23 | `UQtXuQmUlTyDKqhe.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 24 | `UnqnWi0dZYLf5fTT.js` | Impossible de trouver ${c.name}, Impossible | +| 25 | `V9zm2hKUVLVZtAcN.js` | Impossible de trouver ${talent}, Impossible de trouver ${trait}, Impossible de trouver ${trapping}... | +| 26 | `WO5n7Vbx8AgoVrwC.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 27 | `YN8719gme9AxYtyY.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 28 | `Z6jNlyZMECkW4Hon.js` | Chargement, Chargement des sorts | +| 29 | `aeBetniKqq5SD9Ou.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 30 | `bEVlJOOA1kLlzpWx.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 31 | `ePPgxQOqL1Uhz2k9.js` | Impossible de trouver ${talent}, Impossible | +| 32 | `h766UvswLCsxcMow.js` | Impossible de trouver ${talent}, Impossible de trouver ${trait}, Impossible de trouver ${trapping}... | +| 33 | `hhv7PrRdlf9sfC82.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 34 | `hpwJRAhCsXTp9bd9.js` | Impossible de trouver ${talent}, Impossible | +| 35 | `iuSoKntfJ4eAPafQ.js` | Chargement, Chargement des sorts | +| 36 | `jHgxpe6TJDlP3oTn.js` | Chargement, Chargement des sorts | +| 37 | `lII4KMRblqwFBlsV.js` | Impossible de trouver ${talent}, Impossible de trouver ${trait}, Impossible de trouver ${trapping}... | +| 38 | `oTXPA6rbPnYOKNmo.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 39 | `okW06V9UiPC4Vcrn.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 40 | `svCqdytEOtqFXCcs.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 41 | `sz0PqS1kroMOzUZk.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 42 | `v5xrDWcrTNFJkyQB.js` | Impossible de trouver ${talent}, Impossible | +| 43 | `whUSkaR1yem21bXp.js` | Impossible de trouver ${talent}, Impossible de trouver ${trait}, Impossible de trouver ${trapping}... | +| 44 | `y3F1K1sYBymPZCjz.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 45 | `z8mwLihZQu0JtUHY.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | +| 46 | `zadppy7FEbXvgUON.js` | Impossible de trouver ${talent}, Impossible de trouver ${trapping}, Impossible | + +## Commandes utiles + +### Comparer un script avec son backup + +```bash +# Avec meld +meld scripts/ scripts/.fr-backup + +# Avec diff +diff -u scripts/.fr-backup scripts/ +``` + +### Exemples de scripts + +Premier script: `0FWto1oEr3jbWggw.js` + +```bash +meld scripts/0FWto1oEr3jbWggw.js scripts/0FWto1oEr3jbWggw.js.fr-backup +``` + +Traductions à réappliquer: +- "Impossible de trouver le sort ${lore}. Essayez à nouveau" +- "Chargement" +- "Impossible" +- "Chargement des sorts" diff --git a/tools/scripts-to-review.json b/tools/scripts-to-review.json new file mode 100644 index 0000000..abbb7c9 --- /dev/null +++ b/tools/scripts-to-review.json @@ -0,0 +1,186 @@ +[ + { + "file": "0FWto1oEr3jbWggw.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "1BT0MWM2cbhlEnrn.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "1CeYp5MlPcH68UIw.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "2Qi1hwLYhdE6v6Hs.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "4MQ7u4INxp51oyyR.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "4ylzjgUdHY5D0yVh.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "5JWC0l3JEpOsqbR9.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "5JvKJZPcd6Hz5zvn.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "5dR7Erj3nwsxLAV7.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "6jcTzK1XEuWqAacN.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "6xTtJEhRc4OjcDTf.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "A1odAcuRbq9797ZB.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "I1J2m5uud84N50Lk.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "IslMfFgpgQq2brpu.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "IupskvzvoGyD2H5o.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "KICZPwLvbUSxbDrE.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "N8hA6ysHCTlLd8Kj.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "RvipIYj9H7n4UDMe.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "TCtXPvDpbfz1yrVZ.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "TwgdEucxcHloc4cX.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "U1UpSRJOSjPpO4HS.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "ULmZMLezDamerN04.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "UQtXuQmUlTyDKqhe.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "UnqnWi0dZYLf5fTT.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "V9zm2hKUVLVZtAcN.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "WO5n7Vbx8AgoVrwC.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "YN8719gme9AxYtyY.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "Z6jNlyZMECkW4Hon.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "aeBetniKqq5SD9Ou.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "bEVlJOOA1kLlzpWx.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "ePPgxQOqL1Uhz2k9.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "h766UvswLCsxcMow.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "hhv7PrRdlf9sfC82.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "hpwJRAhCsXTp9bd9.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "iuSoKntfJ4eAPafQ.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "jHgxpe6TJDlP3oTn.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "lII4KMRblqwFBlsV.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "oTXPA6rbPnYOKNmo.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "okW06V9UiPC4Vcrn.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "svCqdytEOtqFXCcs.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "sz0PqS1kroMOzUZk.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "v5xrDWcrTNFJkyQB.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "whUSkaR1yem21bXp.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "y3F1K1sYBymPZCjz.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "z8mwLihZQu0JtUHY.js", + "reason": "Contient des textes traduits en français" + }, + { + "file": "zadppy7FEbXvgUON.js", + "reason": "Contient des textes traduits en français" + } +] \ No newline at end of file diff --git a/tools/sync-scripts.js b/tools/sync-scripts.js new file mode 100644 index 0000000..698aeb7 --- /dev/null +++ b/tools/sync-scripts.js @@ -0,0 +1,196 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); + +const WFRP4E_SCRIPTS = '/home/morr/work/foundryvtt/WFRP4e-FoundryVTT/scripts'; +const FR_SCRIPTS = '/home/morr/work/foundryvtt/foundryvtt-wh4-lang-fr-fr/scripts'; +const REPORT_FILE = '/home/morr/work/foundryvtt/foundryvtt-wh4-lang-fr-fr/tools/script-comparison-report.md'; + +// Recherche des patterns qui indiquent du texte localisé +const LOCALIZE_PATTERNS = [ + /game\.i18n\.localize\(/g, + /game\.i18n\.format\(/g, + /game\.wfrp4e\.i18n\./g +]; + +// Patterns de textes en dur qui ont probablement été traduits +const HARDCODED_TEXT_PATTERNS = [ + /ui\.notifications\.(info|warn|error|notify)\s*\(\s*["'`]([^"'`]+)["'`]/g, + /this\.script\.(scriptNotification|scriptMessage|notification)\s*\(\s*["'`]([^"'`]+)["'`]/g +]; + +function analyzeScript(filePath) { + const content = fs.readFileSync(filePath, 'utf-8'); + + // Vérifie si le fichier utilise localize() + const hasLocalize = LOCALIZE_PATTERNS.some(pattern => pattern.test(content)); + + // Extrait les textes en dur + const hardcodedTexts = []; + HARDCODED_TEXT_PATTERNS.forEach(pattern => { + const matches = content.matchAll(pattern); + for (const match of matches) { + hardcodedTexts.push(match[2] || match[1]); + } + }); + + return { + hasLocalize, + hardcodedTexts, + content, + size: content.length + }; +} + +function compareScripts() { + const wfrp4eFiles = fs.readdirSync(WFRP4E_SCRIPTS).filter(f => f.endsWith('.js')); + const frFiles = fs.readdirSync(FR_SCRIPTS).filter(f => f.endsWith('.js')); + + const results = { + identical: [], + needsUpdate: [], + usesLocalize: [], + onlyInFR: [], + onlyInWFRP4E: [], + total: 0 + }; + + // Fichiers présents seulement dans le module FR + frFiles.forEach(file => { + if (!wfrp4eFiles.includes(file)) { + results.onlyInFR.push(file); + } + }); + + // Fichiers présents seulement dans WFRP4E + wfrp4eFiles.forEach(file => { + if (!frFiles.includes(file)) { + results.onlyInWFRP4E.push(file); + } + }); + + // Comparaison des fichiers communs + const commonFiles = wfrp4eFiles.filter(f => frFiles.includes(f)); + results.total = commonFiles.length; + + commonFiles.forEach(file => { + const wfrp4ePath = path.join(WFRP4E_SCRIPTS, file); + const frPath = path.join(FR_SCRIPTS, file); + + const wfrp4e = analyzeScript(wfrp4ePath); + const fr = analyzeScript(frPath); + + // Si WFRP4E utilise localize(), le script FR n'est plus nécessaire + if (wfrp4e.hasLocalize) { + results.usesLocalize.push({ + file, + details: 'Le système utilise maintenant localize() - script FR obsolète' + }); + } + // Si les contenus sont identiques + else if (wfrp4e.content === fr.content) { + results.identical.push(file); + } + // Si différents, besoin de mise à jour + else { + results.needsUpdate.push({ + file, + wfrp4eSize: wfrp4e.size, + frSize: fr.size, + wfrp4eTexts: wfrp4e.hardcodedTexts, + frTexts: fr.hardcodedTexts + }); + } + }); + + return results; +} + +function generateReport(results) { + let report = `# Rapport de comparaison des scripts\n\n`; + report += `Date: ${new Date().toISOString()}\n\n`; + report += `## Résumé\n\n`; + report += `- **Total de fichiers communs**: ${results.total}\n`; + report += `- **Scripts identiques**: ${results.identical.length}\n`; + report += `- **Scripts nécessitant mise à jour**: ${results.needsUpdate.length}\n`; + report += `- **Scripts utilisant localize() (obsolètes)**: ${results.usesLocalize.length}\n`; + report += `- **Scripts uniquement dans FR**: ${results.onlyInFR.length}\n`; + report += `- **Scripts uniquement dans WFRP4E**: ${results.onlyInWFRP4E.length}\n\n`; + + if (results.usesLocalize.length > 0) { + report += `## Scripts obsolètes (utilisant localize() dans WFRP4E)\n\n`; + report += `Ces scripts peuvent être supprimés du module FR car le système utilise maintenant les fichiers de localisation.\n\n`; + results.usesLocalize.forEach(({file, details}) => { + report += `- \`${file}\` - ${details}\n`; + }); + report += `\n`; + } + + if (results.needsUpdate.length > 0) { + report += `## Scripts nécessitant une mise à jour\n\n`; + results.needsUpdate.slice(0, 50).forEach(item => { + report += `### ${item.file}\n\n`; + report += `- Taille WFRP4E: ${item.wfrp4eSize} octets\n`; + report += `- Taille FR: ${item.frSize} octets\n`; + if (item.wfrp4eTexts.length > 0) { + report += `- Textes WFRP4E: ${item.wfrp4eTexts.join(', ')}\n`; + } + if (item.frTexts.length > 0) { + report += `- Textes FR: ${item.frTexts.join(', ')}\n`; + } + report += `\n`; + }); + if (results.needsUpdate.length > 50) { + report += `\n... et ${results.needsUpdate.length - 50} autres fichiers\n\n`; + } + } + + if (results.onlyInWFRP4E.length > 0) { + report += `## Scripts uniquement dans WFRP4E (${results.onlyInWFRP4E.length})\n\n`; + report += `Ces scripts existent dans WFRP4E mais pas dans le module FR.\n\n`; + results.onlyInWFRP4E.slice(0, 20).forEach(file => { + report += `- ${file}\n`; + }); + if (results.onlyInWFRP4E.length > 20) { + report += `\n... et ${results.onlyInWFRP4E.length - 20} autres\n`; + } + report += `\n`; + } + + if (results.onlyInFR.length > 0) { + report += `## Scripts uniquement dans FR (${results.onlyInFR.length})\n\n`; + report += `Ces scripts existent dans le module FR mais plus dans WFRP4E (probablement supprimés).\n\n`; + results.onlyInFR.slice(0, 20).forEach(file => { + report += `- ${file}\n`; + }); + if (results.onlyInFR.length > 20) { + report += `\n... et ${results.onlyInFR.length - 20} autres\n`; + } + report += `\n`; + } + + return report; +} + +console.log('Analyse des scripts en cours...'); +const results = compareScripts(); +const report = generateReport(results); + +fs.writeFileSync(REPORT_FILE, report, 'utf-8'); + +console.log(`\nRapport généré: ${REPORT_FILE}`); +console.log(`\nRésumé:`); +console.log(` Identiques: ${results.identical.length}`); +console.log(` À mettre à jour: ${results.needsUpdate.length}`); +console.log(` Obsolètes (localize): ${results.usesLocalize.length}`); +console.log(` Uniquement FR: ${results.onlyInFR.length}`); +console.log(` Uniquement WFRP4E: ${results.onlyInWFRP4E.length}`); + +// Export des résultats pour utilisation ultérieure +fs.writeFileSync( + path.join(path.dirname(REPORT_FILE), 'script-comparison-data.json'), + JSON.stringify(results, null, 2), + 'utf-8' +); diff --git a/tools/translate-ids.js b/tools/translate-ids.js new file mode 100644 index 0000000..b3bcad3 --- /dev/null +++ b/tools/translate-ids.js @@ -0,0 +1,81 @@ +import fs from 'fs'; +import path from 'path'; + +// Lire et parser le JSON +const jsonPath = './compendium/wfrp4e-core.items.json'; +console.log('Lecture du fichier JSON...'); +const jsonData = JSON.parse(fs.readFileSync(jsonPath, 'utf8')); + +// Créer le mapping id -> name +const idToName = {}; +jsonData.entries.forEach(entry => { + if (entry.id && entry.name) { + idToName[entry.id] = entry.name; + } +}); + +console.log(`Nombre d'entrées trouvées: ${Object.keys(idToName).length}`); + +// Fonction pour échapper les regex +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +// Parcourir tous les fichiers .js dans scripts/ +const scriptsDir = './scripts/'; +console.log('Analyse des fichiers dans', scriptsDir); +const files = fs.readdirSync(scriptsDir).filter(f => f.endsWith('.js')); +console.log(`${files.length} fichiers .js trouvés`); + +let totalReplacements = 0; +let filesModified = 0; +const modifications = {}; + +files.forEach(file => { + const filePath = path.join(scriptsDir, file); + let content = fs.readFileSync(filePath, 'utf8'); + let originalContent = content; + let fileReplacements = 0; + + // Pour chaque ID, chercher et remplacer les occurrences entre guillemets + Object.entries(idToName).forEach(([id, name]) => { + // Chercher l'ID entre guillemets simples ou doubles + const pattern1 = new RegExp('"' + escapeRegExp(id) + '"', 'g'); + const pattern2 = new RegExp("'" + escapeRegExp(id) + "'", 'g'); + + const matches1 = (content.match(pattern1) || []).length; + const matches2 = (content.match(pattern2) || []).length; + + if (matches1 > 0 || matches2 > 0) { + content = content.replace(pattern1, '"' + name + '"'); + content = content.replace(pattern2, "'" + name + "'"); + + if (!modifications[file]) modifications[file] = []; + modifications[file].push(` ${id} -> ${name} (${matches1 + matches2} fois)`); + fileReplacements += matches1 + matches2; + } + }); + + if (content !== originalContent) { + fs.writeFileSync(filePath, content, 'utf8'); + filesModified++; + totalReplacements += fileReplacements; + } +}); + +console.log('\n===== RÉSULTAT ====='); +console.log(`Fichiers modifiés: ${filesModified} / ${files.length}`); +console.log(`Total de remplacements: ${totalReplacements}`); + +if (filesModified > 0) { + console.log('\n===== DÉTAILS DES MODIFICATIONS ====='); + Object.entries(modifications).forEach(([file, changes]) => { + console.log(`\n${file}:`); + changes.slice(0, 10).forEach(change => console.log(change)); + if (changes.length > 10) { + console.log(` ... et ${changes.length - 10} autres remplacements`); + } + }); +} + +console.log('\n✓ Traitement terminé !'); diff --git a/tools/translate-scripts.js b/tools/translate-scripts.js new file mode 100644 index 0000000..9285056 --- /dev/null +++ b/tools/translate-scripts.js @@ -0,0 +1,177 @@ +import fs from 'fs'; +import path from 'path'; +import { fileURLToPath } from 'url'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); + +// Mappings de traduction basés sur fr.json +const translations = { + // Choose phrases + "Choose 12 Arcane Spells": "Choisissez 12 Sorts d'Arcane", + "Choose 1 Necromancy Spell": "Choisissez 1 Sort de Nécromancie", + "Choose 2 Arcane Spells": "Choisissez 2 Sorts d'Arcane", + "Choose 2 Skills to add +20": "Choisissez 2 Compétences pour ajouter +20", + "Choose 3 Arcane Spells": "Choisissez 3 Sorts d'Arcane", + "Choose 3 from the Lore of Necromancy": "Choisissez 3 dans le Savoir de Nécromancie", + "Choose 3 Petty Spells": "Choisissez 3 Sorts Mineurs", + "Choose 4 Petty Spells": "Choisissez 4 Sorts Mineurs", + "Choose 6 Arcane Spells": "Choisissez 6 Sorts d'Arcane", + "Choose 6 Petty Spells": "Choisissez 6 Sorts Mineurs", + "Choose 7 taken from any combination of spells from Colour Magic Lore, the Lore of Witchcraft, or Lore of Dark Magic": "Choisissez 7 Sorts parmi toute combinaison de Magie de Couleur, Sorcellerie ou Magie Noire", + "Choose 8 Arcane Spells & Lore of Death": "Choisissez 8 Sorts d'Arcane et Savoir de la Mort", + "Choose 9 Arcane Spells": "Choisissez 9 Sorts d'Arcane", + "Choose a characteristic": "Choisissez une caractéristique", + "Choose an appropriate Polearm or Two-Handed Weapon": "Choisissez une arme d'hast ou une arme à deux mains appropriée", + "Choose Chanty": "Choisissez un Chant", + "Choose Double Life Career": "Choisissez une Carrière de Double Vie", + "Choose Lore": "Choisissez un Savoir", + "Choose Rune": "Choisissez une Rune", + "Choose Sense": "Choisissez un Sens", + + // Enter phrases + "Enter Armour value": "Entrez la valeur d'Armure", + "Enter Etiquette Group": "Entrez le Groupe d'Étiquette", + "Enter Fear value": "Entrez la valeur de Peur", + "Enter Hatred Group": "Entrez le Groupe de Haine", + "Enter Resistance": "Entrez la Résistance", + "Enter Spellcasting Lore": "Entrez le Savoir d'Incantation", + "Enter Target Species": "Entrez l'Espèce Cible", + "Enter Target Species (singular)": "Entrez l'Espèce Cible (singulier)", + "Enter Terror value": "Entrez la valeur de Terreur", + "Enter the Armoured value": "Entrez la valeur d'Armure", + "Enter the number of diseases/poisons cured": "Entrez le nombre de maladies/poisons soignés", + "Enter the Sturdy value": "Entrez la valeur de Robustesse", + "Enter Venom Strength": "Entrez la Force du Venin", + "Enter Ward value": "Entrez la valeur de Protection", + "Enter Wounds Lost to gain SL": "Entrez les Blessures Perdues pour gagner DR", + + // Select phrases + "Select Column": "Sélectionnez une Colonne", + "Select Rune": "Sélectionnez une Rune", + "Select Target": "Sélectionnez une Cible", + "Select Target for Hatred": "Sélectionnez une Cible pour la Haine", + "Select the column to roll on to determine Beast Head": "Sélectionnez la colonne de lancer pour déterminer la Tête de Bête", + + // Damage/Combat terms + "Add Metal AP to Damage": "Ajouter PA de métal aux Dégâts", + "Blunt Damage Reduction": "Réduction des Dégâts Contondants", + "Critical (if successful attack)": "Critique (si attaque réussie)", + "Damage Increase": "Augmentation des Dégâts", + "Damage Reduction": "Réduction des Dégâts", + "Remove Damage Rating": "Retirer l'Indice de Dégâts", + "Double Wounds + 4": "Blessures Doublées + 4", + "Double Wounds vs Dragons": "Blessures Doublées vs Dragons", + + // Status/Values + "Armoured Value": "Valeur d'Armure", + "Halved": "Divisé par deux", + "Hatred Group": "Groupe de Haine", + "Sturdy Value": "Valeur de Robustesse", + + // Equipment + "Mail": "Mailles", + "Mail & Leather": "Mailles et Cuir", + "Two-Handed": "A deux mains", + + // Actions + "Misfire": "Raté", + "Misfire (Supercharged)": "Raté (Surchargé)", + "Roll": "Lancer", + + // Misc + "Basic": "Base", + "Choice": "Choix", + "Provide an tattooist Actor (close to skip Tests)": "Fournissez un Acteur tatoueur (fermer pour ignorer les Tests)", + "Skill": "Compétence", + "Target has Aethyric Attunement or Second Sight": "La Cible possède Harmonisation Aethyrique ou Seconde Vue", + "Victory Notes for Experience Log": "Notes de Victoire pour le Journal d'Expérience" +}; + +// Fonction pour échapper les caractères spéciaux pour regex +function escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); +} + +// Fonction pour traiter un fichier +function translateFile(filePath) { + let content = fs.readFileSync(filePath, 'utf8'); + let modified = false; + + // Appliquer chaque traduction + for (const [english, french] of Object.entries(translations)) { + const escapedEnglish = escapeRegExp(english); + + // Patterns pour détecter les contextes (label, text, title, details, message) + const patterns = [ + new RegExp(`(label\\s*:\\s*["'\`])${escapedEnglish}(["'\`])`, 'g'), + new RegExp(`(text\\s*:\\s*["'\`])${escapedEnglish}(["'\`])`, 'g'), + new RegExp(`(title\\s*:\\s*["'\`])${escapedEnglish}(["'\`])`, 'g'), + new RegExp(`(details\\s*:\\s*["'\`])${escapedEnglish}(["'\`])`, 'g'), + new RegExp(`(message\\s*:\\s*["'\`])${escapedEnglish}(["'\`])`, 'g'), + ]; + + patterns.forEach(pattern => { + if (pattern.test(content)) { + content = content.replace(pattern, `$1${french}$2`); + modified = true; + } + }); + } + + if (modified) { + fs.writeFileSync(filePath, content, 'utf8'); + return true; + } + + return false; +} + +// Fonction pour traiter récursivement un répertoire +function processDirectory(dirPath) { + const files = fs.readdirSync(dirPath); + let stats = { + total: 0, + modified: 0, + errors: 0 + }; + + files.forEach(file => { + const filePath = path.join(dirPath, file); + const stat = fs.statSync(filePath); + + if (stat.isDirectory()) { + const subStats = processDirectory(filePath); + stats.total += subStats.total; + stats.modified += subStats.modified; + stats.errors += subStats.errors; + } else if (file.endsWith('.js')) { + stats.total++; + try { + if (translateFile(filePath)) { + stats.modified++; + console.log(`✓ ${path.relative(process.cwd(), filePath)}`); + } + } catch (error) { + stats.errors++; + console.error(`✗ ${path.relative(process.cwd(), filePath)}: ${error.message}`); + } + } + }); + + return stats; +} + +// Main +console.log('Début de la traduction des scripts...\n'); + +const scriptsDir = path.join(__dirname, 'scripts'); +const stats = processDirectory(scriptsDir); + +console.log('\n' + '='.repeat(60)); +console.log('Traduction terminée !'); +console.log('='.repeat(60)); +console.log(`Fichiers traités : ${stats.total}`); +console.log(`Fichiers modifiés : ${stats.modified}`); +console.log(`Erreurs : ${stats.errors}`); +console.log('='.repeat(60)); diff --git a/tools/translation-opportunities.json b/tools/translation-opportunities.json new file mode 100644 index 0000000..d0a61cb --- /dev/null +++ b/tools/translation-opportunities.json @@ -0,0 +1,1196 @@ +{ + "reliableTranslations": { + "Regenerate": "Régénération", + "

            ${this.actor.prototypeToken.name} has \n

              \n
            • gained 3 Poisoned Conditions that cannot be resisted at first
            • \n
            • recovered ${this.actor.system.characteristics.t.bonus} Wounds
            • \n
            • acquired the Regenerate Creature Trait.
            • \n
            \n It’s up to Ranald if their regenerating can outpace their poisoning.

            \n

            When all Poisoned Conditions are lost, so too is Regenerate.

            ": "

            ${this.actor.prototypeToken.name} a :\n

              \n
            • Acquis 3 états Empoisonné qui ne peuvent pas être résistés au début du round.
            • \n
            • Récupération de ${this.actor.system.characteristics.t.bonus} Blessures
            • \n
            • Acquisition du Trait de Créature Régénération.
            • \n
            \n C’est à Ranald de décider si leur régénération peut dépasser leur empoisonnement.

            \n

            Lorsque tous les états Empoisonné sont perdus, la Régénération l’est aussi.

            ", + "Could not find ${lore} spell. Try Again": "Chargement des sorts", + "Target has Aethyric Attunement or Second Sight": "La Cible possède Harmonisation Aethyrique ou Seconde Vue", + "Mutation table not found, please ensure a table with the `mutatephys` key is imported in the world.": "Table de Mutation introuvable, veuillez vous assurer qu'une table avec la clé `mutatephys` est importée dans le monde.", + ", this.actor).roll()\n\nroll.toMessage(this.script.getChatData({flavor : `${this.effect.name} (Duration)`}));\n\nthis.effect.updateSource({": ")}!`)\n for(let weapon of dropped)\n {\n await weapon.system.toggleEquip();\n }\n }\n}\n\nlet roll = await new Roll(", + "${this.effect.name} (Duration)": "Dropped ${dropped.map(i => i.name).join(\", \")}!", + "
            : Ignore Metal (": ": Ignorer Métal (", + "Healed ${wounds} Wounds": "Soigne ${wounds} Blessures", + "Fear": "Peur", + "${this.effect.name}: Automatic Failure": "${this.effect.name}: Echec Automatique", + "Enter Target Species (singular)": "Saisir l'espèce cible (singulier)", + "Victory Notes for Experience Log": "Notes de Victoire pour le Journal d'Expérience", + ")])).map(i => i.text)\n \n for (let ch in characteristics)\n {\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n }\n \n for (let talent of talents)\n {\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else \n {\n ui.notifications.warn(`Could not find ${talent}`, {permanent : true})\n }\n }\n \n \n await this.actor.update(updateObj)\n this.actor.createEmbeddedDocuments(": ")])).map(i => i.text)\n\n for (let ch in characteristics)\n {\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n }\n\n for (let talent of talents)\n {\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})\n }\n }\n\n\n await this.actor.update(updateObj)\n this.actor.createEmbeddedDocuments(", + "Blinded while wearing the ${this.item.name}": "Aveuglé en portant ${this.item.name}", + "Choose Rune": "Choisissez une Rune", + "Cannot enter ${this.effect.name}!": "Impossible d'entrer dans ${this.effect.name} !", + "Healed ${healed} Wounds": "Soin de ${healed} Blessures", + "Endurance": "Résistance", + "(ignored ${metalAP} metal AP on ${game.wfrp4e.config.locations[loc]})": "(Ignore ${metalAP} PA de métal sur ${game.wfrp4e.config.locations[loc]})", + "Removed Broken.": "Condition Brisé supprimée.", + "Enter Armour value": "Entrez la valeur d'Armure", + "Cannot Dodge!": "Impossible d'Esquiver!", + "None left!": "Plus rien !", + "${this.effect.name}: Gained ${this.item.Advances} Advantage": "${this.effect.name}: Gain de ${this.item.Advances} Avantage(s)", + "Sail (Skycraft)": "Voile (Aéronavale)", + "No effect at 0 Wounds": "Aucun effet à 0 Blessures", + "Healed ${this.actor.characteristics.t.bonus} Wounds": "Soin de ${this.actor.characteristics.t.bonus} Blessures", + "Removing Fatigued Condition, disabled effect": "Etat Fatigué - Suppression de la condition Fatigué, effet désactivé", + "Wyrmslayer: Ignore TB vs Dragons": "Wyrmslayer: Ignore le BE contre les Dragons", + "Suffered @Condition[Fatigued] because of nightmares.": "Subi la @Condition[Fatigued] à cause de cauchemars.", + "Suffered nightmares, but slept well enough.": "Subi la @Condition[Fatigued] à cause de cauchemars.", + "Venom": "Venin", + "${this.effect.name}: Wound loss capped to 10": "${this.effect.name}: Perte de Blessures limitée à 10", + "Ethereal": "Éthéré", + ")\n if (traitItem)\n { \n let t = traitItem.toObject();\n t.system.specification.value = trait.value;\n if (trait.disabled)\n {\n t.system.disabled = true;\n }\n items.push(t);\n }\n else \n {\n ui.notifications.warn(`Could not find ${trait.name}`, {permanent : true})\n }\n}\n \n\n\nupdateObj.name = updateObj.name +=": "} ];\nlet items = [];\n\nlet updateObj = this.actor.toObject();\nfor (let ch in characteristics)\n{\n updateObj.system.characteristics[ch].modifier += characteristics[ch];\n}\n\nupdateObj.system.characteristics.int.initial = 0;\nupdateObj.system.characteristics.wp.initial = 0;\nupdateObj.system.characteristics.fel.initial = 0;\n\nfor (let trait of traits)\n{\n let traitItem = await game.wfrp4e.utility.find(trait.name,", + "Could not find ${trait.name}": ": -200\n}\nlet traits = [ {name:", + "Fortune point stolen from ${this.actor.name}": "1 Point de Chance volé à ${this.actor.name}", + "let weapons = args.actor.itemTypes.weapon.filter(i => !i.system.location.value);\nlet armour = args.actor.itemTags.armour.filter(i => !i.system.location.value);\nfor(let item of weapons)\n{\n\tif (item.system.properties.qualities.shield)\n\t{\n\t\tawait item.system.damageItem(1, \"shield\");\n\t}\n\telse \n\t{\n\t\tawait item.system.damageItem(1);\n\t}\n\tmsg +=": "let weapons = args.actor.itemTypes.weapon.filter(i => !i.system.location.value);\nlet armour = args.actor.itemTags.armour.filter(i => !i.system.location.value);\nfor(let item of weapons)\n{\n\tif (item.system.properties.qualities.shield)\n\t{\n\t\tawait item.system.damageItem(1, \"shield\");\n\t}\n\telse\n\t{\n\t\tawait item.system.damageItem(1);\n\t}\n\tmsg +=", + "Bless (Taal)": "Béni (Taal)", + "

            Finished repairing ${this.item.name}.

            ": "

            Réparation terminée ${this.item.name}.

            ", + ").roll({allowInteractive : false});\n let regen = regenRoll.total;\n \n if (wounds.value >= wounds.max)\n return;\n \n if (wounds.value > 0) {\n wounds.value += Math.floor(regen / 2);\n if (wounds.value > wounds.max) {\n wounds.value = wounds.max;\n }\n message += \\`\\${this.actor.name} regains \\${regen} Wounds.\\`;\n \n if (regen === 10) {\n message +=": ").roll({allowInteractive : false});\n let regen = regenRoll.total;\n\n if (wounds.value >= wounds.max)\n return;\n\n if (wounds.value > 0) {\n wounds.value += Math.floor(regen / 2);\n if (wounds.value > wounds.max) {\n wounds.value = wounds.max;\n }\n message += \\`\\${this.actor.name} regagne \\${regen} Blessures.\\`;\n\n if (regen === 10) {\n message +=", + "let chatData = {whisper: ChatMessage.getWhisperRecipients(\"GM\")};\n let message = \"\";\n \n let wounds = foundry.utils.duplicate(this.actor.status.wounds);\n let regenRoll = await new Roll(\"1d10\").roll({allowInteractive : false});\n let regen = regenRoll.total;\n \n if (wounds.value >= wounds.max)\n return;\n \n if (wounds.value > 0) {\n wounds.value += Math.floor(regen / 2);\n if (wounds.value > wounds.max) {\n wounds.value = wounds.max;\n }\n message += \\": ").roll({allowInteractive : false});\n let regen = regenRoll.total;\n\n if (wounds.value >= wounds.max)\n return;\n\n if (wounds.value > 0) {\n wounds.value += Math.floor(regen / 2);\n if (wounds.value > wounds.max) {\n wounds.value = wounds.max;\n }\n message += \\`\\${this.actor.name} regagne \\${regen} Blessures.\\`;\n\n if (regen === 10) {\n message +=", + "Arboreal": "Arboricole", + "${this.effect.name}: destroys magical ${args.attackerTest.item.name}.": "${this.effect.name}: détruit magique ${args.attackerTest.item.name}.", + "Cold Blooded": "À Sang Froid", + "

            ${this.actor.prototypeToken.name} has gained the Cold Blooded Creature Trait and may reverse any failed Willpower based Tests.

            \n

            If they gain a Surprised Condition, this Condition is not lost the first time it should be (which is typically at the end of the Round or if they victim is attacked).

            ": "

            ${this.actor.prototypeToken.name} a acquis le Trait de Créature À Sang Froid et peut annuler tout test de Volonté raté.

            \n

            Si ils gagnent une Condition Surpris, cette Condition n'est pas perdue la première fois qu'elle devrait l'être (ce qui est généralement à la fin du Round ou si la victime est attaquée).

            ", + "Blade of Nurglitch: ${args.actor.name} must pass an Difficult (-10) Endurance Test or gain a @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Festering Wound}": "Blade of Nurglitch: ${args.actor.name} doit réussir un Test d'Endurance de Difficulté (-10) ou recevoir une @UUID[Compendium.wfrp4e-core.items.kKccDTGzWzSXCBOb]{Blessure Purulente}", + "Stupid": "Stupide", + "Enter Spellcasting Lore": "Entrez le Savoir d'Incantation", + "of your species": "de votre espèce", + "Animosity (all not ${species})": "Compendium.wfrp4e-core.items.Q2MCUrG2HppMcvN0", + "Cannot use ${game.wfrp4e.config.locations[this.effect.getFlag(\"wfrp4e\", \"location\")]}!": "Impossible d'utiliser ${game.wfrp4e.config.locations[this.effect.getFlag(\"wfrp4e\", \"location\")]}!", + "

            Use Ward provided by ${this.effect.name}?": "

            Utiliser la Protection fournie par ${this.effect.name}?", + "Advantage Subtracted": "Avantage retiré", + "Not enough Advantage!": "Avantage retiré", + "Lore (Oceans)": "Savoir (Océans)", + "${actor.name} recognizes lure of the Leviathan.": ", {\n appendTitle: ` – ${this.effect.name}`,\n skipTargets: true,\n fields: {difficulty:", + "Cannot update Fortune": "system.status.fortune.value", + "Enter Wounds Lost to gain SL": "Entrez les Blessures Perdues pour gagner DR", + "Butcher contracts @UUID[${bloodyFluxUUID}].": "Compendium.wfrp4e-core.items.Item.herUmN51D9TiL2Vn", + "Removed ${poisoned.conditionValue} Poisoned Conditions": "SSuppression de ${poisoned.conditionValue} états Empoisonnés", + "No Poisoned Conditions": "Aucun état Empoisonné à supprimer.", + "Claimed ${this.effect.name} Bonus": "Bonus utilisé : ${this.effect.name}", + "Painless": "utilisateur d", + "

            ${this.actor.prototypeToken.name} has gained the Painless Creature Trait. This\n effect lasts for one hour, after which it dissipates and the full effect\n of all the imbiber's wounds come crashing down at once.

            \n

            Note that this does not prevent the user from acquiring a Critical\n Wound or dying from one. It merely allows them to ignore most\n of their effects.

            ": "

            ${this.actor.prototypeToken.name} a acquis le Trait de Créature Insensible à la douleur. Cet\n effet dure une heure, après quoi il se dissipe et l'effet complet\n de toutes les blessures du buveur s'abat d'un coup.

            \n

            Notez que cela n'empêche pas l'utilisateur d'acquérir une Blessure Critique\n ou d'en mourir. Cela leur permet simplement d'ignorer la plupart\n de leurs effets.

            ", + "Damage Increase": "Augmentation des Dégâts", + "Cannot acquire Ablaze Condition": "Ne peut recevoir un état En Flammes", + "${this.effect.name}: Ignore AP with Weakpoints (${APIgnored})": "${this.effect.name}: Ignore les PA avec des points faibles (${APIgnored})", + "${this.actor.prototypeToken.name} regains ${healed} Wounds": "${this.actor.prototypeToken.name} regagne ${healed} Blessures", + "${this.effect.name} - Ignore Weakpoints (${weakpointsAP})": "${this.effect.name} - Ignore les points faibles (${weakpointsAP})", + "Choose 6 Petty Spells": "system.lore.value", + "

            \n Select your choice\n

            \n
              \n
            1. Melee (Basic)
            2. \n
            3. Melee (Polearm)
            4. \n
            ": "

            \n Sélectionnez votre choix\n

            \n
              \n
            1. Mêlée (Base)
            2. \n
            3. Mêlée (arme d'hast)
            4. \n
            ", + "Halved": "× 0.5", + "Ranged": "Projectiles", + "Daemonic": "Démoniaque", + "Trade (Apothecary)": "Métier (Apothicaire)", + "Select the column to roll on to determine Beast Head": "Sélectionnez la colonne de lancer pour déterminer la Tête de Bête", + "Select Column": "Sélectionnez une Colonne", + "Select Rune": "wfrp4e-dwarfs.rune", + "Enter Terror value": "Entrez la valeur de Terreur", + "Entertain (Singing)": "Divertissement (Chant)", + "Sail": "Item", + "Cannot cast Spells or use Prayers": "Impossible d'incanter un Sort ou d'utiliser un Prière", + "Select Target": "Sélectionnez une Cible", + "Select Target for Hatred": "Sélectionnez une Cible", + "})\n }\n if (configBlessings.length)\n {\n // Combine blessings defined by config with actual blessing items found that specify this god, avoiding duplicates\n blessings = blessings.concat(\n configBlessings.map(i => {return {uuid : i.uuid, name : i.name}})\n .filter(bls => !(blessings.find(i => i.uuid == bls.uuid)))\n );\n }\n if (blessings.length)\n {\n this.script.notification(": "})\n }\n if (configBlessings.length)\n {\n // Combine blessings defined by config with actual blessing items found that specify this god, avoiding duplicates\n blessings = blessings.concat(\n configBlessings.map(i => {return {uuid : i.uuid, name : i.name}})\n .filter(bls => !(blessings.find(i => i.uuid == bls.uuid)))\n );\n }\n if (blessings.length)\n {\n this.script.scriptNotification(", + "Double Wounds + 4": "Blessures Doublées + 4", + "Cannot find table with key: mutatemental": "Impossible de trouver la table des Mutations Mentales", + "Item could not be found:": "Impossible de trouver l'objet :", + "Enter Fear value": "Entrez la valeur de Peur", + "Enter Target Species": "Entrez l'Espèce Cible", + "Size": "Taille", + "Choose 2 Skills to add +20": "Choisissez 2 Compétences pour ajouter +20", + ")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else \n {\n skillItem = await game.wfrp4e.utility.findSkill(skill)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else \n {\n ui.notifications.warn(`Could not find ${talent}`, {permanent : true})\n }\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(": ")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else\n {\n skillItem = await game.wfrp4e.utility.findSkill(skill)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true})\n }\n}\n\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + "Misfire": "Raté", + "Misfire (Supercharged)": "Raté (Surchargé)", + "s a specialization\n let traitSpec = traitMatches[3]\n\n let traitItem;\n try {\n traitItem = await WFRP_Utility.findItem(traitName, \"trait\")\n }\n catch { }\n if (!traitItem) {\n ui.notifications.warn(`Could not find ${trait}`, {permanent : true})\n }\n traitItem = traitItem.toObject()\n\n if (Number.isNumeric(traitVal))\n {\n traitItem.system.specification.value = traitName.includes(": "}`).trim()\n }\n else \n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells) \n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=", + "Add Metal AP to Damage": "Ajouter PA de métal aux Dégâts", + "Vomit": "rollTest", + "Choose 7 taken from any combination of spells from Colour Magic Lore, the Lore of Witchcraft, or Lore of Dark Magic": "Choisissez 7 Sorts parmi toute combinaison de Magie de Couleur, Sorcellerie ou Magie Noire", + "Channelling (Dhar)": "Loading Spells", + "Choose Double Life Career": "Loading Careers", + "Sturdy Value": "Valeur de Robustesse", + "Enter the Sturdy value": "Valeur de Robustesse", + "Blessing of Battle": "Bénédiction de Bataille", + "Enter Ward value": "Entrez la valeur de Protection", + "Add Option?\n

            \n Ranged (Bow) +10 and a Longbow with 12 Arrows\n

            ": "Ajouter une option?\n

            \n Projectile (Arc) +10 et un Arc long avec 12 flèches\n

            ", + "Amber Talons": "Serres d'ambre", + "Enter Venom Strength": "Entrez la Force du Venin", + "}`).trim()\n }\n else \n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells) \n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=": "}`).trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=", + "

            \n Select your choice\n

            \n
              \n
            1. Melee (Basic)
            2. \n
            3. Melee (Polearm)
            4. \n
            5. Melee (Two-Handed)
            6. \n
            ": "

            \n Sélectionnez votre choix\n

            \n
              \n
            1. Mêlée (Base)
            2. \n
            3. Mêlée (Arme d'hast)
            4. \n
            5. Mêlée (Deux mains)
            6. \n
            ", + "Armoured Value": "Valeur d'Armure", + "Choose Chanty": "Loading Chanties", + "Blunt Damage Reduction": "Réduction des Dégâts Contondants", + "Critical (if successful attack)": "Critique (si attaque réussie)", + "Stealthy": "Furtif", + "Night Vision": "Vision Nocturne", + "Undead": "Mort-vivant", + "Double Wounds vs Dragons": "Blessures Doublées vs Dragons", + "Priest": "Sigmar", + "Warrior Priest": "Prêtre Guerrier", + "Immunity to Psychology": "Immunité Psychologique", + "Damage Reduction": "Réduction des Dégâts", + "Blessing of Might": "Bénédiction de Puissance", + "Enter the number of diseases/poisons cured": "Entrez le nombre de maladies/poisons soignés", + "Scythe of Shyish": "La Faux de Shyish", + "Remove Damage Rating": "Retirer l'Indice de Dégâts", + "Choose 4 Petty Spells": "system.lore.value", + "Choose 8 Arcane Spells & Lore of Death": "Choisissez 4 Sorts Mineurs", + "Choose 3 from the Lore of Necromancy": "Choisissez 4 Sorts Mineurs" + }, + "opportunities": [ + { + "file": "01VFjGVxkjb5P1ve.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "03mJu59V4iByWlsO.js", + "translations": [ + { + "en": "Regenerate", + "fr": "Régénération" + } + ] + }, + { + "file": "0NAD1LNcVyAZ1fC7.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "0R0QAr3D024kWPfo.js", + "translations": [ + { + "en": "Item could not be found:", + "fr": "Impossible de trouver l'objet :" + } + ] + }, + { + "file": "0hgTyeaEhMBLwzUn.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "20fvE9nJmcfGYVzw.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "6Aqq4F4Xui923sc6.js", + "translations": [ + { + "en": "Painless", + "fr": "utilisateur d" + } + ] + }, + { + "file": "6H6vNjzvMGl2ZqCR.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "6LMzIdmCSYctgmGx.js", + "translations": [ + { + "en": "Stupid", + "fr": "Stupide" + } + ] + }, + { + "file": "7T3iXgrL72fea67C.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "7wBWUw05q0igh508.js", + "translations": [ + { + "en": "Painless", + "fr": "utilisateur d" + } + ] + }, + { + "file": "9AMoFRATTAfdKlKN.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + }, + { + "en": "Venom", + "fr": "Venin" + } + ] + }, + { + "file": "A6DcKPzAGntzSCil.js", + "translations": [ + { + "en": "${this.effect.name} (Duration)", + "fr": "Dropped ${dropped.map(i => i.name).join(\", \")}!" + } + ] + }, + { + "file": "AYEiCx2Es3QtMY28.js", + "translations": [ + { + "en": "Size", + "fr": "Taille" + } + ] + }, + { + "file": "AqHLHp4kH6KULk3e.js", + "translations": [ + { + "en": "None left!", + "fr": "Plus rien !" + } + ] + }, + { + "file": "Bv3431tnG3VKaTJr.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "CW5Vlr57OaMkKJ8Q.js", + "translations": [ + { + "en": "Advantage Subtracted", + "fr": "Avantage retiré" + }, + { + "en": "Not enough Advantage!", + "fr": "Avantage retiré" + } + ] + }, + { + "file": "Dk4VF4UXSMK5SaVP.js", + "translations": [ + { + "en": "Misfire", + "fr": "Raté" + } + ] + }, + { + "file": "E1vUepgop09FF5wy.js", + "translations": [ + { + "en": "Not enough Advantage!", + "fr": "Avantage retiré" + } + ] + }, + { + "file": "EHfOyVwYhFGWNjw1.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "ERxrWzSpw8qwxFVi.js", + "translations": [ + { + "en": "Cannot enter ${this.effect.name}!", + "fr": "Impossible d'entrer dans ${this.effect.name} !" + } + ] + }, + { + "file": "ETfmit2Cx0Py77ai.js", + "translations": [ + { + "en": "Could not find ${trait.name}", + "fr": ": -200\n}\nlet traits = [ {name:" + } + ] + }, + { + "file": "FSqUqSByMiztYOQM.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "G7sFEnJlXZvfXL3V.js", + "translations": [ + { + "en": "None left!", + "fr": "Plus rien !" + } + ] + }, + { + "file": "IfEu1hO8sKEZBpvg.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "Jjq3oPYbI26zjxME.js", + "translations": [ + { + "en": "${this.effect.name} (Duration)", + "fr": "Dropped ${dropped.map(i => i.name).join(\", \")}!" + } + ] + }, + { + "file": "JwYZJGkZMSM2M3Si.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "LLqAT9wEUGMLfDhU.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "LQEWSN5KnHHATPsf.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "MKxYbHOrv0UuA7JB.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "Mhb67xufvA9uWO21.js", + "translations": [ + { + "en": "Size", + "fr": "Taille" + } + ] + }, + { + "file": "Mir4FMHQRdVqazAF.js", + "translations": [ + { + "en": "Size", + "fr": "Taille" + } + ] + }, + { + "file": "NQSvFWhmBQAyx5Zz.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "NTFpkiGyBpOtrV0s.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "OFViRemr1cpnO3af.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "OGX4BneaYAnV25TO.js", + "translations": [ + { + "en": "Regenerate", + "fr": "Régénération" + } + ] + }, + { + "file": "Op88kMtimSEWlY2h.js", + "translations": [ + { + "en": "None left!", + "fr": "Plus rien !" + } + ] + }, + { + "file": "PjOi61gB2nSYooLs.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "PmELrzD3RmF9qKkO.js", + "translations": [ + { + "en": "Size", + "fr": "Taille" + } + ] + }, + { + "file": "QBBrzcSAe8QqE4WP.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "QLBxcP85duX1Z7LX.js", + "translations": [ + { + "en": "Bless (Taal)", + "fr": "Béni (Taal)" + } + ] + }, + { + "file": "RRK91ySi5SzYCRvy.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "SwliIjjjFtZMnJH3.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "TAw9vXnfyIAl5DGs.js", + "translations": [ + { + "en": "None left!", + "fr": "Plus rien !" + } + ] + }, + { + "file": "TBpNFRL5uehs0fze.js", + "translations": [ + { + "en": "None left!", + "fr": "Plus rien !" + } + ] + }, + { + "file": "TIoUbjOtj7PTK2t8.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "V1D2Uo3WDKYQePU3.js", + "translations": [ + { + "en": "(ignored ${metalAP} metal AP on ${game.wfrp4e.config.locations[loc]})", + "fr": "(Ignore ${metalAP} PA de métal sur ${game.wfrp4e.config.locations[loc]})" + } + ] + }, + { + "file": "V9xm4X1x3lPYTQaI.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "V9zm2hKUVLVZtAcN.js", + "translations": [ + { + "en": "s a specialization\n let traitSpec = traitMatches[3]\n\n let traitItem;\n try {\n traitItem = await WFRP_Utility.findItem(traitName, \"trait\")\n }\n catch { }\n if (!traitItem) {\n ui.notifications.warn(`Could not find ${trait}`, {permanent : true})\n }\n traitItem = traitItem.toObject()\n\n if (Number.isNumeric(traitVal))\n {\n traitItem.system.specification.value = traitName.includes(", + "fr": "}`).trim()\n }\n else \n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells) \n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=" + }, + { + "en": "}`).trim()\n }\n else \n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells) \n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=", + "fr": "}`).trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=" + } + ] + }, + { + "file": "VXERNoc5IazQGuGO.js", + "translations": [ + { + "en": ": Ignore Metal (", + "fr": ": Ignorer Métal (" + } + ] + }, + { + "file": "VcE8Hie2jbpuyuM3.js", + "translations": [ + { + "en": "Vomit", + "fr": "rollTest" + } + ] + }, + { + "file": "W2rdTwflbUVxFyfd.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "WB6sIpLEPC8YPX67.js", + "translations": [ + { + "en": "Cannot Dodge!", + "fr": "Impossible d'Esquiver!" + } + ] + }, + { + "file": "WO5n7Vbx8AgoVrwC.js", + "translations": [ + { + "en": ")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else \n {\n skillItem = await game.wfrp4e.utility.findSkill(skill)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else \n {\n ui.notifications.warn(`Could not find ${talent}`, {permanent : true})\n }\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + "fr": ")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else\n {\n skillItem = await game.wfrp4e.utility.findSkill(skill)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true})\n }\n}\n\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(" + } + ] + }, + { + "file": "WOpRJluHKER1MdgI.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "WaeL2I8VVJmBBKHk.js", + "translations": [ + { + "en": "Vomit", + "fr": "rollTest" + } + ] + }, + { + "file": "Y27MmN5KFw45d5vQ.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "ZYsMgB4BwXBJcpYf.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "bBdXzBmxgFFBwMMS.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "bMEFHPCei2evnZZw.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + }, + { + "en": "Venom", + "fr": "Venin" + } + ] + }, + { + "file": "dVF5ywnzeiZQx9ke.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "e3dBud1keWyhw6nw.js", + "translations": [ + { + "en": "Stupid", + "fr": "Stupide" + } + ] + }, + { + "file": "ed7Sud9HM3uB2j6b.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "eieFcF4BxIvDTN3C.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "fEFfHFeJxkR0aIJK.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "fFGuTi0HLjwneMcJ.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "feMPZhhFeXRtKdKY.js", + "translations": [ + { + "en": "None left!", + "fr": "Plus rien !" + } + ] + }, + { + "file": "fq2fqlWlrVfitkcB.js", + "translations": [ + { + "en": "Could not find ${trait.name}", + "fr": ": -200\n}\nlet traits = [ {name:" + }, + { + "en": "Stupid", + "fr": "Stupide" + } + ] + }, + { + "file": "ft0LaRWZT5WtnptP.js", + "translations": [ + { + "en": "Advantage Subtracted", + "fr": "Avantage retiré" + }, + { + "en": "Not enough Advantage!", + "fr": "Avantage retiré" + } + ] + }, + { + "file": "fyjYWg7ekj8JJcmq.js", + "translations": [ + { + "en": "Misfire", + "fr": "Raté" + } + ] + }, + { + "file": "g5y0tdoHCDs7cBy7.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "i5AN97A7IOeygEFA.js", + "translations": [ + { + "en": ": Ignore Metal (", + "fr": ": Ignorer Métal (" + } + ] + }, + { + "file": "id9ZdkERMZnZTWXt.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "lMRsQRgjMexY9dxE.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "n5RJqJL9fdRIxkuN.js", + "translations": [ + { + "en": "Advantage Subtracted", + "fr": "Avantage retiré" + }, + { + "en": "Not enough Advantage!", + "fr": "Avantage retiré" + } + ] + }, + { + "file": "n5wowuDE8Dz1uBZn.js", + "translations": [ + { + "en": "Daemonic", + "fr": "Démoniaque" + }, + { + "en": "Undead", + "fr": "Mort-vivant" + } + ] + }, + { + "file": "nSXzktHyNjGUXjaw.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "nZtN0zM49xTuG86V.js", + "translations": [ + { + "en": "Advantage Subtracted", + "fr": "Avantage retiré" + }, + { + "en": "Not enough Advantage!", + "fr": "Avantage retiré" + } + ] + }, + { + "file": "naF5EWr1CBkYRZTK.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "njPP9wDAsdh4WHIj.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "o2QhtiLAmUEpDgBX.js", + "translations": [ + { + "en": "Sail (Skycraft)", + "fr": "Voile (Aéronavale)" + }, + { + "en": "Sail", + "fr": "Item" + } + ] + }, + { + "file": "pj7gjxHrnrZonC6U.js", + "translations": [ + { + "en": "Undead", + "fr": "Mort-vivant" + } + ] + }, + { + "file": "pqQkeUVpuZ0jOKnZ.js", + "translations": [ + { + "en": "Mutation table not found, please ensure a table with the `mutatephys` key is imported in the world.", + "fr": "Table de Mutation introuvable, veuillez vous assurer qu'une table avec la clé `mutatephys` est importée dans le monde." + } + ] + }, + { + "file": "qDYJnO2JosPJrjpz.js", + "translations": [ + { + "en": "Venom", + "fr": "Venin" + } + ] + }, + { + "file": "qSwCYMMiIHmSV1X5.js", + "translations": [ + { + "en": "None left!", + "fr": "Plus rien !" + } + ] + }, + { + "file": "qxzhPtysAjPWspKf.js", + "translations": [ + { + "en": "Cannot enter ${this.effect.name}!", + "fr": "Impossible d'entrer dans ${this.effect.name} !" + } + ] + }, + { + "file": "rF0Z3hTUUnSxL3Mq.js", + "translations": [ + { + "en": "Regenerate", + "fr": "Régénération" + }, + { + "en": "Size", + "fr": "Taille" + }, + { + "en": "Immunity to Psychology", + "fr": "Immunité Psychologique" + } + ] + }, + { + "file": "rdaMhMyHrJjQ6vVC.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "rly9iBUy8EX7NhQT.js", + "translations": [ + { + "en": "Size", + "fr": "Taille" + } + ] + }, + { + "file": "sZwLitzwKBTaFca3.js", + "translations": [ + { + "en": "Undead", + "fr": "Mort-vivant" + } + ] + }, + { + "file": "sm9d5lk6cM0OuUkf.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "sx7Ikn8WW00gBFb4.js", + "translations": [ + { + "en": "${this.effect.name} (Duration)", + "fr": "Dropped ${dropped.map(i => i.name).join(\", \")}!" + } + ] + }, + { + "file": "syqqBkyP5tGqZ78t.js", + "translations": [ + { + "en": "Immunity to Psychology", + "fr": "Immunité Psychologique" + } + ] + }, + { + "file": "sz0PqS1kroMOzUZk.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "u4fKgGFEnOCnvvsv.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "uA5qaat5EXzkzltq.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "uEVSUTTam4Z96JJ2.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "ugL5IBB6R2yWyMWd.js", + "translations": [ + { + "en": "(ignored ${metalAP} metal AP on ${game.wfrp4e.config.locations[loc]})", + "fr": "(Ignore ${metalAP} PA de métal sur ${game.wfrp4e.config.locations[loc]})" + } + ] + }, + { + "file": "v00nVCRKqqRvY28t.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "v18mmwUmuKiVfwzQ.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "v5xrDWcrTNFJkyQB.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + }, + { + "en": "Add Option?\n

            \n Ranged (Bow) +10 and a Longbow with 12 Arrows\n

            ", + "fr": "Ajouter une option?\n

            \n Projectile (Arc) +10 et un Arc long avec 12 flèches\n

            " + } + ] + }, + { + "file": "vFUVWZ1l8wpTjLcx.js", + "translations": [ + { + "en": "Daemonic", + "fr": "Démoniaque" + } + ] + }, + { + "file": "ve3RcfTi49rdYZU0.js", + "translations": [ + { + "en": "Endurance", + "fr": "Résistance" + } + ] + }, + { + "file": "whUSkaR1yem21bXp.js", + "translations": [ + { + "en": "s a specialization\n let traitSpec = traitMatches[3]\n\n let traitItem;\n try {\n traitItem = await WFRP_Utility.findItem(traitName, \"trait\")\n }\n catch { }\n if (!traitItem) {\n ui.notifications.warn(`Could not find ${trait}`, {permanent : true})\n }\n traitItem = traitItem.toObject()\n\n if (Number.isNumeric(traitVal))\n {\n traitItem.system.specification.value = traitName.includes(", + "fr": "}`).trim()\n }\n else \n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells) \n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=" + }, + { + "en": "}`).trim()\n }\n else \n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells) \n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=", + "fr": "}`).trim()\n }\n else\n traitItem.system.specification.value = traitSpec\n\n items.push(traitItem)\n\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\nfor (let spell of spells)\n{\n let spellItem = await game.wfrp4e.utility.findItem(spell)\n if (spellItem)\n {\n spellItem = spellItem.toObject()\n\n items.push(spellItem);\n }\n else\n {\n ui.notifications.warn(`Could not find ${spell}`, {permanent : true})\n }\n}\n\nupdateObj.name = updateObj.name +=" + } + ] + }, + { + "file": "wyTCozh9qGTx6yK0.js", + "translations": [ + { + "en": "Fear", + "fr": "Peur" + } + ] + }, + { + "file": "xUpKYT7BZCSmAfUy.js", + "translations": [ + { + "en": "None left!", + "fr": "Plus rien !" + } + ] + }, + { + "file": "xiyQSXozoLxt0MZs.js", + "translations": [ + { + "en": "Painless", + "fr": "utilisateur d" + }, + { + "en": "Immunity to Psychology", + "fr": "Immunité Psychologique" + } + ] + }, + { + "file": "y7hk7prQ0lLTyv1Y.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "yQziCK8G8I1RYkTj.js", + "translations": [ + { + "en": "Ranged", + "fr": "Projectiles" + } + ] + }, + { + "file": "zadppy7FEbXvgUON.js", + "translations": [ + { + "en": ")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else \n {\n skillItem = await game.wfrp4e.utility.findSkill(skill)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else \n {\n ui.notifications.warn(`Could not find ${talent}`, {permanent : true})\n }\n}\n\nfor (let trapping of trappings) \n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else \n {\n ui.notifications.warn(`Could not find ${trapping}`, {permanent : true})\n }\n}\n\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(", + "fr": ")\n if (skillItem)\n skillItem.system.advances.value += skillAdvancements[index]\n else\n {\n skillItem = await game.wfrp4e.utility.findSkill(skill)\n skillItem = skillItem.toObject();\n skillItem.system.advances.value = skillAdvancements[index];\n items.push(skillItem);\n }\n}\n\nfor (let talent of talents)\n{\n let talentItem = await game.wfrp4e.utility.findTalent(talent)\n if (talentItem)\n {\n items.push(talentItem.toObject());\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${talent}`, {permanent : true})\n }\n}\n\nfor (let trapping of trappings)\n{\n let trappingItem = await game.wfrp4e.utility.findItem(trapping)\n if (trappingItem)\n {\n trappingItem = trappingItem.toObject()\n\n trappingItem.system.equipped.value = true;\n\n items.push(trappingItem);\n }\n else\n {\n ui.notifications.warn(`Impossible de trouver ${trapping}`, {permanent : true})\n }\n}\n\n\nawait this.actor.update(updateObj)\nthis.actor.createEmbeddedDocuments(" + } + ] + }, + { + "file": "zi8Z3NlwVj3IfgAW.js", + "translations": [ + { + "en": "None left!", + "fr": "Plus rien !" + } + ] + } + ] +} \ No newline at end of file diff --git a/wh4_fr.js b/wh4_fr.js index 52eec7d..527a09e 100644 --- a/wh4_fr.js +++ b/wh4_fr.js @@ -1,4 +1,11 @@ +import { initTravelV2 } from './modules/travelv2/travelv2-init.js'; +import { initInn } from './modules/inn/inn-init.js'; + Hooks.once("init", function() { - CONFIG.wfrp4e.supportedLanguages["fr"] = "fr"; - CONFIG.eis.supportedLanguages["fr"] = "fr"; + + // Initialiser le module TravelV2 + initTravelV2(); + + // Initialiser le module Inn (Auberge) + initInn(); })