diff --git a/jest.config.cjs b/jest.config.cjs new file mode 100644 index 0000000..d8b51e2 --- /dev/null +++ b/jest.config.cjs @@ -0,0 +1,4 @@ +module.exports = { + testMatch: ['**/scripts/tests/*.test.js'], + transform: {}, +}; diff --git a/module.json b/module.json index 7d599ae..a3ec1bd 100644 --- a/module.json +++ b/module.json @@ -25,6 +25,65 @@ "styles/npc.css", "styles/traveller-npc.css" ], + "packFolders": { + "name": "Amiral Denisov", + "sorting": "m", + "color": "#00435c", + "folders": [ + { + "name": "Equipements", + "sorting": "a", + "color": "#00435c", + "packs": [ + "armures", + "objet", + "equipement", + "ordinateur", + "contenant-sac-coffre", + "armes" + ], + "folders": [] + }, + { + "name": "Références", + "sorting": "b", + "color": "#00435c", + "packs": [ + "competences", + "maladie-poison-and-blessure", + "espece", + "talents-psioniques", + "carrieres" + ], + "folders": [] + }, + { + "name": "PNJ & Items", + "sorting": "c", + "color": "#00435c", + "packs": [ + "tables-pnj", + "pnj", + "competences", + "maladie-poison-and-blessure", + "espece", + "talents-psioniques", + "carrieres" + ], + "folders": [] + }, + { + "name": "Journaux", + "sorting": "d", + "color": "#00435c", + "packs": [ + "journal" + ], + "folders": [] + } + ], + "packs": [] + }, "packs": [ { "name": "armures", @@ -116,7 +175,7 @@ }, { "name": "journal", - "label": "Journal Psioniques", + "label": "Journal Psioniques", "path": "packs/journal", "type": "JournalEntry", "system": "mgt2e", @@ -168,6 +227,17 @@ "PLAYER": "OBSERVER", "ASSISTANT": "OWNER" } + }, + { + "name": "pnj", + "label": "PNJs", + "path": "packs/pnj", + "type": "Actor", + "system": "mgt2e", + "ownership": { + "PLAYER": "OBSERVER", + "ASSISTANT": "OWNER" + } } ] } diff --git a/package.json b/package.json new file mode 100644 index 0000000..094aa89 --- /dev/null +++ b/package.json @@ -0,0 +1,4 @@ +{ + "type": "module", + "private": true +} diff --git a/packs/armes/000101.log b/packs/armes/000134.log similarity index 100% rename from packs/armes/000101.log rename to packs/armes/000134.log diff --git a/packs/armes/CURRENT b/packs/armes/CURRENT index d7ae20e..c39c670 100644 --- a/packs/armes/CURRENT +++ b/packs/armes/CURRENT @@ -1 +1 @@ -MANIFEST-000100 +MANIFEST-000132 diff --git a/packs/armes/LOG b/packs/armes/LOG index 04a360d..1048abd 100644 --- a/packs/armes/LOG +++ b/packs/armes/LOG @@ -1,3 +1,8 @@ -2026/06/01-22:42:05.863670 7f52c63fe6c0 Recovering log #98 -2026/06/01-22:42:05.873307 7f52c63fe6c0 Delete type=3 #96 -2026/06/01-22:42:05.873357 7f52c63fe6c0 Delete type=0 #98 +2026/06/12-20:52:58.023135 7fc410ffe6c0 Recovering log #130 +2026/06/12-20:52:58.033792 7fc410ffe6c0 Delete type=3 #128 +2026/06/12-20:52:58.033845 7fc410ffe6c0 Delete type=0 #130 +2026/06/12-20:53:22.703483 7fc3c11be6c0 Level-0 table #135: started +2026/06/12-20:53:22.703533 7fc3c11be6c0 Level-0 table #135: 0 bytes OK +2026/06/12-20:53:22.710309 7fc3c11be6c0 Delete type=0 #133 +2026/06/12-20:53:22.717089 7fc3c11be6c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.724385 7fc3c11be6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end) diff --git a/packs/armes/LOG.old b/packs/armes/LOG.old index 94d90f6..3658466 100644 --- a/packs/armes/LOG.old +++ b/packs/armes/LOG.old @@ -1,8 +1,8 @@ -2026/06/01-08:35:53.535828 7f52c6bff6c0 Recovering log #94 -2026/06/01-08:35:53.546637 7f52c6bff6c0 Delete type=3 #92 -2026/06/01-08:35:53.546677 7f52c6bff6c0 Delete type=0 #94 -2026/06/01-08:51:10.470757 7f52c4bfb6c0 Level-0 table #99: started -2026/06/01-08:51:10.470772 7f52c4bfb6c0 Level-0 table #99: 0 bytes OK -2026/06/01-08:51:10.476934 7f52c4bfb6c0 Delete type=0 #97 -2026/06/01-08:51:10.484526 7f52c4bfb6c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end) -2026/06/01-08:51:10.491484 7f52c4bfb6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.594732 7fc3c3fff6c0 Recovering log #126 +2026/06/12-20:51:44.605104 7fc3c3fff6c0 Delete type=3 #124 +2026/06/12-20:51:44.605163 7fc3c3fff6c0 Delete type=0 #126 +2026/06/12-20:52:05.597166 7fc3c11be6c0 Level-0 table #131: started +2026/06/12-20:52:05.597184 7fc3c11be6c0 Level-0 table #131: 0 bytes OK +2026/06/12-20:52:05.604422 7fc3c11be6c0 Delete type=0 #129 +2026/06/12-20:52:05.618860 7fc3c11be6c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.619120 7fc3c11be6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end) diff --git a/packs/armes/MANIFEST-000100 b/packs/armes/MANIFEST-000132 similarity index 60% rename from packs/armes/MANIFEST-000100 rename to packs/armes/MANIFEST-000132 index 2398c38..455af58 100644 Binary files a/packs/armes/MANIFEST-000100 and b/packs/armes/MANIFEST-000132 differ diff --git a/packs/armures/000200.log b/packs/armures/000233.log similarity index 100% rename from packs/armures/000200.log rename to packs/armures/000233.log diff --git a/packs/armures/CURRENT b/packs/armures/CURRENT index d0dd497..61135ee 100644 --- a/packs/armures/CURRENT +++ b/packs/armures/CURRENT @@ -1 +1 @@ -MANIFEST-000199 +MANIFEST-000231 diff --git a/packs/armures/LOG b/packs/armures/LOG index 3e0f9fd..f6c3398 100644 --- a/packs/armures/LOG +++ b/packs/armures/LOG @@ -1,3 +1,8 @@ -2026/06/01-22:42:05.758175 7f52c53fc6c0 Recovering log #197 -2026/06/01-22:42:05.768018 7f52c53fc6c0 Delete type=3 #195 -2026/06/01-22:42:05.768044 7f52c53fc6c0 Delete type=0 #197 +2026/06/12-20:52:57.899810 7fc3c37fe6c0 Recovering log #229 +2026/06/12-20:52:57.911135 7fc3c37fe6c0 Delete type=3 #227 +2026/06/12-20:52:57.911180 7fc3c37fe6c0 Delete type=0 #229 +2026/06/12-20:53:22.642554 7fc3c11be6c0 Level-0 table #234: started +2026/06/12-20:53:22.642590 7fc3c11be6c0 Level-0 table #234: 0 bytes OK +2026/06/12-20:53:22.648801 7fc3c11be6c0 Delete type=0 #232 +2026/06/12-20:53:22.649072 7fc3c11be6c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.649091 7fc3c11be6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end) diff --git a/packs/armures/LOG.old b/packs/armures/LOG.old index c2f2881..4110f8e 100644 --- a/packs/armures/LOG.old +++ b/packs/armures/LOG.old @@ -1,8 +1,8 @@ -2026/06/01-08:35:53.408086 7f52c63fe6c0 Recovering log #193 -2026/06/01-08:35:53.419231 7f52c63fe6c0 Delete type=3 #191 -2026/06/01-08:35:53.419290 7f52c63fe6c0 Delete type=0 #193 -2026/06/01-08:51:10.410303 7f52c4bfb6c0 Level-0 table #198: started -2026/06/01-08:51:10.410335 7f52c4bfb6c0 Level-0 table #198: 0 bytes OK -2026/06/01-08:51:10.417249 7f52c4bfb6c0 Delete type=0 #196 -2026/06/01-08:51:10.423845 7f52c4bfb6c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end) -2026/06/01-08:51:10.424110 7f52c4bfb6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.470883 7fc3c37fe6c0 Recovering log #225 +2026/06/12-20:51:44.481326 7fc3c37fe6c0 Delete type=3 #223 +2026/06/12-20:51:44.481382 7fc3c37fe6c0 Delete type=0 #225 +2026/06/12-20:52:05.534179 7fc3c11be6c0 Level-0 table #230: started +2026/06/12-20:52:05.534214 7fc3c11be6c0 Level-0 table #230: 0 bytes OK +2026/06/12-20:52:05.540979 7fc3c11be6c0 Delete type=0 #228 +2026/06/12-20:52:05.541333 7fc3c11be6c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.562210 7fc3c11be6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end) diff --git a/packs/armures/MANIFEST-000199 b/packs/armures/MANIFEST-000231 similarity index 61% rename from packs/armures/MANIFEST-000199 rename to packs/armures/MANIFEST-000231 index d79bd83..4682bb3 100644 Binary files a/packs/armures/MANIFEST-000199 and b/packs/armures/MANIFEST-000231 differ diff --git a/packs/carrieres/000084.log b/packs/carrieres/000117.log similarity index 100% rename from packs/carrieres/000084.log rename to packs/carrieres/000117.log diff --git a/packs/carrieres/CURRENT b/packs/carrieres/CURRENT index 011e5ad..4843639 100644 --- a/packs/carrieres/CURRENT +++ b/packs/carrieres/CURRENT @@ -1 +1 @@ -MANIFEST-000083 +MANIFEST-000115 diff --git a/packs/carrieres/LOG b/packs/carrieres/LOG index 7289728..c749046 100644 --- a/packs/carrieres/LOG +++ b/packs/carrieres/LOG @@ -1,3 +1,8 @@ -2026/06/01-22:42:05.887236 7f52c63fe6c0 Recovering log #81 -2026/06/01-22:42:05.897193 7f52c63fe6c0 Delete type=3 #79 -2026/06/01-22:42:05.897236 7f52c63fe6c0 Delete type=0 #81 +2026/06/12-20:52:58.051634 7fc410ffe6c0 Recovering log #113 +2026/06/12-20:52:58.062421 7fc410ffe6c0 Delete type=3 #111 +2026/06/12-20:52:58.062480 7fc410ffe6c0 Delete type=0 #113 +2026/06/12-20:53:22.717098 7fc3c11be6c0 Level-0 table #118: started +2026/06/12-20:53:22.717122 7fc3c11be6c0 Level-0 table #118: 0 bytes OK +2026/06/12-20:53:22.724248 7fc3c11be6c0 Delete type=0 #116 +2026/06/12-20:53:22.822698 7fc3c11be6c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.829756 7fc3c11be6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end) diff --git a/packs/carrieres/LOG.old b/packs/carrieres/LOG.old index 3779354..61c9c41 100644 --- a/packs/carrieres/LOG.old +++ b/packs/carrieres/LOG.old @@ -1,8 +1,8 @@ -2026/06/01-08:35:53.563616 7f52c6bff6c0 Recovering log #77 -2026/06/01-08:35:53.575271 7f52c6bff6c0 Delete type=3 #75 -2026/06/01-08:35:53.575318 7f52c6bff6c0 Delete type=0 #77 -2026/06/01-08:51:10.477043 7f52c4bfb6c0 Level-0 table #82: started -2026/06/01-08:51:10.477061 7f52c4bfb6c0 Level-0 table #82: 0 bytes OK -2026/06/01-08:51:10.484427 7f52c4bfb6c0 Delete type=0 #80 -2026/06/01-08:51:10.491475 7f52c4bfb6c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end) -2026/06/01-08:51:10.498513 7f52c4bfb6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.625465 7fc3c37fe6c0 Recovering log #109 +2026/06/12-20:51:44.635539 7fc3c37fe6c0 Delete type=3 #107 +2026/06/12-20:51:44.635595 7fc3c37fe6c0 Delete type=0 #109 +2026/06/12-20:52:05.611307 7fc3c11be6c0 Level-0 table #114: started +2026/06/12-20:52:05.611325 7fc3c11be6c0 Level-0 table #114: 0 bytes OK +2026/06/12-20:52:05.618732 7fc3c11be6c0 Delete type=0 #112 +2026/06/12-20:52:05.619090 7fc3c11be6c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.619279 7fc3c11be6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end) diff --git a/packs/carrieres/MANIFEST-000083 b/packs/carrieres/MANIFEST-000115 similarity index 63% rename from packs/carrieres/MANIFEST-000083 rename to packs/carrieres/MANIFEST-000115 index 2daf3fd..50ad31a 100644 Binary files a/packs/carrieres/MANIFEST-000083 and b/packs/carrieres/MANIFEST-000115 differ diff --git a/packs/competences/000203.log b/packs/competences/000236.log similarity index 100% rename from packs/competences/000203.log rename to packs/competences/000236.log diff --git a/packs/competences/CURRENT b/packs/competences/CURRENT index 5639343..b4e971f 100644 --- a/packs/competences/CURRENT +++ b/packs/competences/CURRENT @@ -1 +1 @@ -MANIFEST-000202 +MANIFEST-000234 diff --git a/packs/competences/LOG b/packs/competences/LOG index 4af6a96..142da6e 100644 --- a/packs/competences/LOG +++ b/packs/competences/LOG @@ -1,3 +1,8 @@ -2026/06/01-22:42:05.770418 7f52c6bff6c0 Recovering log #200 -2026/06/01-22:42:05.779812 7f52c6bff6c0 Delete type=3 #198 -2026/06/01-22:42:05.779865 7f52c6bff6c0 Delete type=0 #200 +2026/06/12-20:52:57.913632 7fc410ffe6c0 Recovering log #232 +2026/06/12-20:52:57.923055 7fc410ffe6c0 Delete type=3 #230 +2026/06/12-20:52:57.923103 7fc410ffe6c0 Delete type=0 #232 +2026/06/12-20:53:22.662427 7fc3c11be6c0 Level-0 table #237: started +2026/06/12-20:53:22.662456 7fc3c11be6c0 Level-0 table #237: 0 bytes OK +2026/06/12-20:53:22.669591 7fc3c11be6c0 Delete type=0 #235 +2026/06/12-20:53:22.676441 7fc3c11be6c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.676637 7fc3c11be6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end) diff --git a/packs/competences/LOG.old b/packs/competences/LOG.old index 9bee816..e221c4d 100644 --- a/packs/competences/LOG.old +++ b/packs/competences/LOG.old @@ -1,8 +1,8 @@ -2026/06/01-08:35:53.422306 7f52c53fc6c0 Recovering log #196 -2026/06/01-08:35:53.433915 7f52c53fc6c0 Delete type=3 #194 -2026/06/01-08:35:53.433952 7f52c53fc6c0 Delete type=0 #196 -2026/06/01-08:51:10.450191 7f52c4bfb6c0 Level-0 table #201: started -2026/06/01-08:51:10.450225 7f52c4bfb6c0 Level-0 table #201: 0 bytes OK -2026/06/01-08:51:10.456638 7f52c4bfb6c0 Delete type=0 #199 -2026/06/01-08:51:10.463422 7f52c4bfb6c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end) -2026/06/01-08:51:10.470752 7f52c4bfb6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.484787 7fc410ffe6c0 Recovering log #228 +2026/06/12-20:51:44.494717 7fc410ffe6c0 Delete type=3 #226 +2026/06/12-20:51:44.494769 7fc410ffe6c0 Delete type=0 #228 +2026/06/12-20:52:05.541367 7fc3c11be6c0 Level-0 table #233: started +2026/06/12-20:52:05.541402 7fc3c11be6c0 Level-0 table #233: 0 bytes OK +2026/06/12-20:52:05.548343 7fc3c11be6c0 Delete type=0 #231 +2026/06/12-20:52:05.562225 7fc3c11be6c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.562411 7fc3c11be6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end) diff --git a/packs/competences/MANIFEST-000202 b/packs/competences/MANIFEST-000234 similarity index 60% rename from packs/competences/MANIFEST-000202 rename to packs/competences/MANIFEST-000234 index e376d4f..5427fce 100644 Binary files a/packs/competences/MANIFEST-000202 and b/packs/competences/MANIFEST-000234 differ diff --git a/packs/contenant-sac-coffre/000137.log b/packs/contenant-sac-coffre/000170.log similarity index 100% rename from packs/contenant-sac-coffre/000137.log rename to packs/contenant-sac-coffre/000170.log diff --git a/packs/contenant-sac-coffre/CURRENT b/packs/contenant-sac-coffre/CURRENT index 0eb07d3..57112f5 100644 --- a/packs/contenant-sac-coffre/CURRENT +++ b/packs/contenant-sac-coffre/CURRENT @@ -1 +1 @@ -MANIFEST-000136 +MANIFEST-000168 diff --git a/packs/contenant-sac-coffre/LOG b/packs/contenant-sac-coffre/LOG index cbb72e5..44594d8 100644 --- a/packs/contenant-sac-coffre/LOG +++ b/packs/contenant-sac-coffre/LOG @@ -1,3 +1,7 @@ -2026/06/01-22:42:05.829157 7f52c53fc6c0 Recovering log #134 -2026/06/01-22:42:05.838624 7f52c53fc6c0 Delete type=3 #132 -2026/06/01-22:42:05.838670 7f52c53fc6c0 Delete type=0 #134 +2026/06/12-20:52:57.981469 7fc410ffe6c0 Recovering log #166 +2026/06/12-20:52:57.992240 7fc410ffe6c0 Delete type=3 #164 +2026/06/12-20:52:57.992286 7fc410ffe6c0 Delete type=0 #166 +2026/06/12-20:53:22.676645 7fc3c11be6c0 Level-0 table #171: started +2026/06/12-20:53:22.676670 7fc3c11be6c0 Level-0 table #171: 0 bytes OK +2026/06/12-20:53:22.683046 7fc3c11be6c0 Delete type=0 #169 +2026/06/12-20:53:22.703339 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) diff --git a/packs/contenant-sac-coffre/LOG.old b/packs/contenant-sac-coffre/LOG.old index acb33e3..588f0b4 100644 --- a/packs/contenant-sac-coffre/LOG.old +++ b/packs/contenant-sac-coffre/LOG.old @@ -1,7 +1,7 @@ -2026/06/01-08:35:53.494562 7f52c6bff6c0 Recovering log #130 -2026/06/01-08:35:53.505274 7f52c6bff6c0 Delete type=3 #128 -2026/06/01-08:35:53.505312 7f52c6bff6c0 Delete type=0 #130 -2026/06/01-08:51:10.430797 7f52c4bfb6c0 Level-0 table #135: started -2026/06/01-08:51:10.430815 7f52c4bfb6c0 Level-0 table #135: 0 bytes OK -2026/06/01-08:51:10.436925 7f52c4bfb6c0 Delete type=0 #133 -2026/06/01-08:51:10.449909 7f52c4bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.553830 7fc3c37fe6c0 Recovering log #162 +2026/06/12-20:51:44.563465 7fc3c37fe6c0 Delete type=3 #160 +2026/06/12-20:51:44.563519 7fc3c37fe6c0 Delete type=0 #162 +2026/06/12-20:52:05.576474 7fc3c11be6c0 Level-0 table #167: started +2026/06/12-20:52:05.576496 7fc3c11be6c0 Level-0 table #167: 0 bytes OK +2026/06/12-20:52:05.583147 7fc3c11be6c0 Delete type=0 #165 +2026/06/12-20:52:05.590265 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) diff --git a/packs/contenant-sac-coffre/MANIFEST-000136 b/packs/contenant-sac-coffre/MANIFEST-000136 deleted file mode 100644 index a91cf01..0000000 Binary files a/packs/contenant-sac-coffre/MANIFEST-000136 and /dev/null differ diff --git a/packs/contenant-sac-coffre/MANIFEST-000168 b/packs/contenant-sac-coffre/MANIFEST-000168 new file mode 100644 index 0000000..4c76f3e Binary files /dev/null and b/packs/contenant-sac-coffre/MANIFEST-000168 differ diff --git a/packs/equipement/000145.log b/packs/equipement/000178.log similarity index 100% rename from packs/equipement/000145.log rename to packs/equipement/000178.log diff --git a/packs/equipement/CURRENT b/packs/equipement/CURRENT index 3e77273..4802dbe 100644 --- a/packs/equipement/CURRENT +++ b/packs/equipement/CURRENT @@ -1 +1 @@ -MANIFEST-000144 +MANIFEST-000176 diff --git a/packs/equipement/LOG b/packs/equipement/LOG index e46a6be..77645de 100644 --- a/packs/equipement/LOG +++ b/packs/equipement/LOG @@ -1,3 +1,8 @@ -2026/06/01-22:42:05.805356 7f52c5bfd6c0 Recovering log #142 -2026/06/01-22:42:05.815150 7f52c5bfd6c0 Delete type=3 #140 -2026/06/01-22:42:05.815203 7f52c5bfd6c0 Delete type=0 #142 +2026/06/12-20:52:57.954396 7fc410ffe6c0 Recovering log #174 +2026/06/12-20:52:57.964106 7fc410ffe6c0 Delete type=3 #172 +2026/06/12-20:52:57.964146 7fc410ffe6c0 Delete type=0 #174 +2026/06/12-20:53:22.669694 7fc3c11be6c0 Level-0 table #179: started +2026/06/12-20:53:22.669720 7fc3c11be6c0 Level-0 table #179: 0 bytes OK +2026/06/12-20:53:22.676299 7fc3c11be6c0 Delete type=0 #177 +2026/06/12-20:53:22.676452 7fc3c11be6c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.676473 7fc3c11be6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end) diff --git a/packs/equipement/LOG.old b/packs/equipement/LOG.old index 5f0056b..cb9bf3c 100644 --- a/packs/equipement/LOG.old +++ b/packs/equipement/LOG.old @@ -1,8 +1,8 @@ -2026/06/01-08:35:53.466145 7f52c6bff6c0 Recovering log #138 -2026/06/01-08:35:53.477972 7f52c6bff6c0 Delete type=3 #136 -2026/06/01-08:35:53.478013 7f52c6bff6c0 Delete type=0 #138 -2026/06/01-08:51:10.424141 7f52c4bfb6c0 Level-0 table #143: started -2026/06/01-08:51:10.424176 7f52c4bfb6c0 Level-0 table #143: 0 bytes OK -2026/06/01-08:51:10.430711 7f52c4bfb6c0 Delete type=0 #141 -2026/06/01-08:51:10.449900 7f52c4bfb6c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end) -2026/06/01-08:51:10.456752 7f52c4bfb6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.524826 7fc3c37fe6c0 Recovering log #170 +2026/06/12-20:51:44.535451 7fc3c37fe6c0 Delete type=3 #168 +2026/06/12-20:51:44.535506 7fc3c37fe6c0 Delete type=0 #170 +2026/06/12-20:52:05.562430 7fc3c11be6c0 Level-0 table #175: started +2026/06/12-20:52:05.562454 7fc3c11be6c0 Level-0 table #175: 0 bytes OK +2026/06/12-20:52:05.569802 7fc3c11be6c0 Delete type=0 #173 +2026/06/12-20:52:05.590244 7fc3c11be6c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.590432 7fc3c11be6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end) diff --git a/packs/equipement/MANIFEST-000144 b/packs/equipement/MANIFEST-000176 similarity index 60% rename from packs/equipement/MANIFEST-000144 rename to packs/equipement/MANIFEST-000176 index 5657cad..e6f0987 100644 Binary files a/packs/equipement/MANIFEST-000144 and b/packs/equipement/MANIFEST-000176 differ diff --git a/packs/espece/000137.log b/packs/espece/000170.log similarity index 100% rename from packs/espece/000137.log rename to packs/espece/000170.log diff --git a/packs/espece/CURRENT b/packs/espece/CURRENT index 0eb07d3..57112f5 100644 --- a/packs/espece/CURRENT +++ b/packs/espece/CURRENT @@ -1 +1 @@ -MANIFEST-000136 +MANIFEST-000168 diff --git a/packs/espece/LOG b/packs/espece/LOG index 507be2a..e880084 100644 --- a/packs/espece/LOG +++ b/packs/espece/LOG @@ -1,3 +1,7 @@ -2026/06/01-22:42:05.840284 7f52c6bff6c0 Recovering log #134 -2026/06/01-22:42:05.850204 7f52c6bff6c0 Delete type=3 #132 -2026/06/01-22:42:05.850246 7f52c6bff6c0 Delete type=0 #134 +2026/06/12-20:52:57.995403 7fc3c37fe6c0 Recovering log #166 +2026/06/12-20:52:58.005793 7fc3c37fe6c0 Delete type=3 #164 +2026/06/12-20:52:58.005851 7fc3c37fe6c0 Delete type=0 #166 +2026/06/12-20:53:22.683153 7fc3c11be6c0 Level-0 table #171: started +2026/06/12-20:53:22.683178 7fc3c11be6c0 Level-0 table #171: 0 bytes OK +2026/06/12-20:53:22.690078 7fc3c11be6c0 Delete type=0 #169 +2026/06/12-20:53:22.703354 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) diff --git a/packs/espece/LOG.old b/packs/espece/LOG.old index 9ff68eb..781fb27 100644 --- a/packs/espece/LOG.old +++ b/packs/espece/LOG.old @@ -1,7 +1,7 @@ -2026/06/01-08:35:53.508573 7f52c53fc6c0 Recovering log #130 -2026/06/01-08:35:53.519646 7f52c53fc6c0 Delete type=3 #128 -2026/06/01-08:35:53.519709 7f52c53fc6c0 Delete type=0 #130 -2026/06/01-08:51:10.437011 7f52c4bfb6c0 Level-0 table #135: started -2026/06/01-08:51:10.437031 7f52c4bfb6c0 Level-0 table #135: 0 bytes OK -2026/06/01-08:51:10.443132 7f52c4bfb6c0 Delete type=0 #133 -2026/06/01-08:51:10.449915 7f52c4bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.566595 7fc410ffe6c0 Recovering log #162 +2026/06/12-20:51:44.577675 7fc410ffe6c0 Delete type=3 #160 +2026/06/12-20:51:44.577730 7fc410ffe6c0 Delete type=0 #162 +2026/06/12-20:52:05.583251 7fc3c11be6c0 Level-0 table #167: started +2026/06/12-20:52:05.583269 7fc3c11be6c0 Level-0 table #167: 0 bytes OK +2026/06/12-20:52:05.590142 7fc3c11be6c0 Delete type=0 #165 +2026/06/12-20:52:05.590369 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) diff --git a/packs/espece/MANIFEST-000136 b/packs/espece/MANIFEST-000136 deleted file mode 100644 index a91cf01..0000000 Binary files a/packs/espece/MANIFEST-000136 and /dev/null differ diff --git a/packs/espece/MANIFEST-000168 b/packs/espece/MANIFEST-000168 new file mode 100644 index 0000000..4c76f3e Binary files /dev/null and b/packs/espece/MANIFEST-000168 differ diff --git a/packs/journal/000118.log b/packs/journal/000151.log similarity index 100% rename from packs/journal/000118.log rename to packs/journal/000151.log diff --git a/packs/journal/CURRENT b/packs/journal/CURRENT index 5ff346e..1dec270 100644 --- a/packs/journal/CURRENT +++ b/packs/journal/CURRENT @@ -1 +1 @@ -MANIFEST-000117 +MANIFEST-000149 diff --git a/packs/journal/LOG b/packs/journal/LOG index e0bb704..cebff72 100644 --- a/packs/journal/LOG +++ b/packs/journal/LOG @@ -1,3 +1,8 @@ -2026/06/01-22:42:05.852043 7f52c5bfd6c0 Recovering log #115 -2026/06/01-22:42:05.861694 7f52c5bfd6c0 Delete type=3 #113 -2026/06/01-22:42:05.861740 7f52c5bfd6c0 Delete type=0 #115 +2026/06/12-20:52:58.008917 7fc3c3fff6c0 Recovering log #147 +2026/06/12-20:52:58.019530 7fc3c3fff6c0 Delete type=3 #145 +2026/06/12-20:52:58.019585 7fc3c3fff6c0 Delete type=0 #147 +2026/06/12-20:53:22.690192 7fc3c11be6c0 Level-0 table #152: started +2026/06/12-20:53:22.690216 7fc3c11be6c0 Level-0 table #152: 0 bytes OK +2026/06/12-20:53:22.696652 7fc3c11be6c0 Delete type=0 #150 +2026/06/12-20:53:22.703367 7fc3c11be6c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.717074 7fc3c11be6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end) diff --git a/packs/journal/LOG.old b/packs/journal/LOG.old index 6fd6140..33615f4 100644 --- a/packs/journal/LOG.old +++ b/packs/journal/LOG.old @@ -1,8 +1,8 @@ -2026/06/01-08:35:53.522844 7f52c5bfd6c0 Recovering log #111 -2026/06/01-08:35:53.532856 7f52c5bfd6c0 Delete type=3 #109 -2026/06/01-08:35:53.532912 7f52c5bfd6c0 Delete type=0 #111 -2026/06/01-08:51:10.463428 7f52c4bfb6c0 Level-0 table #116: started -2026/06/01-08:51:10.463447 7f52c4bfb6c0 Level-0 table #116: 0 bytes OK -2026/06/01-08:51:10.470660 7f52c4bfb6c0 Delete type=0 #114 -2026/06/01-08:51:10.477037 7f52c4bfb6c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end) -2026/06/01-08:51:10.484516 7f52c4bfb6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.581216 7fc3c37fe6c0 Recovering log #143 +2026/06/12-20:51:44.591542 7fc3c37fe6c0 Delete type=3 #141 +2026/06/12-20:51:44.591593 7fc3c37fe6c0 Delete type=0 #143 +2026/06/12-20:52:05.590481 7fc3c11be6c0 Level-0 table #148: started +2026/06/12-20:52:05.590505 7fc3c11be6c0 Level-0 table #148: 0 bytes OK +2026/06/12-20:52:05.597069 7fc3c11be6c0 Delete type=0 #146 +2026/06/12-20:52:05.618846 7fc3c11be6c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.619137 7fc3c11be6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end) diff --git a/packs/journal/MANIFEST-000117 b/packs/journal/MANIFEST-000149 similarity index 67% rename from packs/journal/MANIFEST-000117 rename to packs/journal/MANIFEST-000149 index dc0f34c..4971a1e 100644 Binary files a/packs/journal/MANIFEST-000117 and b/packs/journal/MANIFEST-000149 differ diff --git a/packs/maladie-poison-and-blessure/000145.log b/packs/maladie-poison-and-blessure/000178.log similarity index 100% rename from packs/maladie-poison-and-blessure/000145.log rename to packs/maladie-poison-and-blessure/000178.log diff --git a/packs/maladie-poison-and-blessure/CURRENT b/packs/maladie-poison-and-blessure/CURRENT index 3e77273..4802dbe 100644 --- a/packs/maladie-poison-and-blessure/CURRENT +++ b/packs/maladie-poison-and-blessure/CURRENT @@ -1 +1 @@ -MANIFEST-000144 +MANIFEST-000176 diff --git a/packs/maladie-poison-and-blessure/LOG b/packs/maladie-poison-and-blessure/LOG index 0ff057b..f60a2e4 100644 --- a/packs/maladie-poison-and-blessure/LOG +++ b/packs/maladie-poison-and-blessure/LOG @@ -1,3 +1,8 @@ -2026/06/01-22:42:05.782042 7f52c5bfd6c0 Recovering log #142 -2026/06/01-22:42:05.791804 7f52c5bfd6c0 Delete type=3 #140 -2026/06/01-22:42:05.791860 7f52c5bfd6c0 Delete type=0 #142 +2026/06/12-20:52:57.926432 7fc3c37fe6c0 Recovering log #174 +2026/06/12-20:52:57.936438 7fc3c37fe6c0 Delete type=3 #172 +2026/06/12-20:52:57.936485 7fc3c37fe6c0 Delete type=0 #174 +2026/06/12-20:53:22.649158 7fc3c11be6c0 Level-0 table #179: started +2026/06/12-20:53:22.649178 7fc3c11be6c0 Level-0 table #179: 0 bytes OK +2026/06/12-20:53:22.655504 7fc3c11be6c0 Delete type=0 #177 +2026/06/12-20:53:22.676414 7fc3c11be6c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.676616 7fc3c11be6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end) diff --git a/packs/maladie-poison-and-blessure/LOG.old b/packs/maladie-poison-and-blessure/LOG.old index e184c8d..78bccbc 100644 --- a/packs/maladie-poison-and-blessure/LOG.old +++ b/packs/maladie-poison-and-blessure/LOG.old @@ -1,8 +1,8 @@ -2026/06/01-08:35:53.437746 7f52c6bff6c0 Recovering log #138 -2026/06/01-08:35:53.448341 7f52c6bff6c0 Delete type=3 #136 -2026/06/01-08:35:53.448380 7f52c6bff6c0 Delete type=0 #138 -2026/06/01-08:51:10.443210 7f52c4bfb6c0 Level-0 table #143: started -2026/06/01-08:51:10.443229 7f52c4bfb6c0 Level-0 table #143: 0 bytes OK -2026/06/01-08:51:10.449810 7f52c4bfb6c0 Delete type=0 #141 -2026/06/01-08:51:10.450168 7f52c4bfb6c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end) -2026/06/01-08:51:10.463413 7f52c4bfb6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.497744 7fc3c3fff6c0 Recovering log #170 +2026/06/12-20:51:44.508610 7fc3c3fff6c0 Delete type=3 #168 +2026/06/12-20:51:44.508662 7fc3c3fff6c0 Delete type=0 #170 +2026/06/12-20:52:05.548467 7fc3c11be6c0 Level-0 table #175: started +2026/06/12-20:52:05.548492 7fc3c11be6c0 Level-0 table #175: 0 bytes OK +2026/06/12-20:52:05.555571 7fc3c11be6c0 Delete type=0 #173 +2026/06/12-20:52:05.562235 7fc3c11be6c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.562402 7fc3c11be6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end) diff --git a/packs/maladie-poison-and-blessure/MANIFEST-000144 b/packs/maladie-poison-and-blessure/MANIFEST-000176 similarity index 62% rename from packs/maladie-poison-and-blessure/MANIFEST-000144 rename to packs/maladie-poison-and-blessure/MANIFEST-000176 index fcb3162..7af93a2 100644 Binary files a/packs/maladie-poison-and-blessure/MANIFEST-000144 and b/packs/maladie-poison-and-blessure/MANIFEST-000176 differ diff --git a/packs/objet/000137.log b/packs/objet/000170.log similarity index 100% rename from packs/objet/000137.log rename to packs/objet/000170.log diff --git a/packs/objet/CURRENT b/packs/objet/CURRENT index 0eb07d3..57112f5 100644 --- a/packs/objet/CURRENT +++ b/packs/objet/CURRENT @@ -1 +1 @@ -MANIFEST-000136 +MANIFEST-000168 diff --git a/packs/objet/LOG b/packs/objet/LOG index db37743..5fb6462 100644 --- a/packs/objet/LOG +++ b/packs/objet/LOG @@ -1,3 +1,7 @@ -2026/06/01-22:42:05.793837 7f52c53fc6c0 Recovering log #134 -2026/06/01-22:42:05.803487 7f52c53fc6c0 Delete type=3 #132 -2026/06/01-22:42:05.803533 7f52c53fc6c0 Delete type=0 #134 +2026/06/12-20:52:57.939847 7fc4117ff6c0 Recovering log #166 +2026/06/12-20:52:57.951112 7fc4117ff6c0 Delete type=3 #164 +2026/06/12-20:52:57.951166 7fc4117ff6c0 Delete type=0 #166 +2026/06/12-20:53:22.655606 7fc3c11be6c0 Level-0 table #171: started +2026/06/12-20:53:22.655631 7fc3c11be6c0 Level-0 table #171: 0 bytes OK +2026/06/12-20:53:22.662292 7fc3c11be6c0 Delete type=0 #169 +2026/06/12-20:53:22.676430 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) diff --git a/packs/objet/LOG.old b/packs/objet/LOG.old index e7d9279..c5bcd98 100644 --- a/packs/objet/LOG.old +++ b/packs/objet/LOG.old @@ -1,7 +1,7 @@ -2026/06/01-08:35:53.451848 7f52c63fe6c0 Recovering log #130 -2026/06/01-08:35:53.463255 7f52c63fe6c0 Delete type=3 #128 -2026/06/01-08:35:53.463313 7f52c63fe6c0 Delete type=0 #130 -2026/06/01-08:51:10.417333 7f52c4bfb6c0 Level-0 table #135: started -2026/06/01-08:51:10.417354 7f52c4bfb6c0 Level-0 table #135: 0 bytes OK -2026/06/01-08:51:10.423737 7f52c4bfb6c0 Delete type=0 #133 -2026/06/01-08:51:10.424133 7f52c4bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.511682 7fc410ffe6c0 Recovering log #162 +2026/06/12-20:51:44.521666 7fc410ffe6c0 Delete type=3 #160 +2026/06/12-20:51:44.521720 7fc410ffe6c0 Delete type=0 #162 +2026/06/12-20:52:05.555691 7fc3c11be6c0 Level-0 table #167: started +2026/06/12-20:52:05.555716 7fc3c11be6c0 Level-0 table #167: 0 bytes OK +2026/06/12-20:52:05.562097 7fc3c11be6c0 Delete type=0 #165 +2026/06/12-20:52:05.562305 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end) diff --git a/packs/objet/MANIFEST-000136 b/packs/objet/MANIFEST-000136 deleted file mode 100644 index a91cf01..0000000 Binary files a/packs/objet/MANIFEST-000136 and /dev/null differ diff --git a/packs/objet/MANIFEST-000168 b/packs/objet/MANIFEST-000168 new file mode 100644 index 0000000..4c76f3e Binary files /dev/null and b/packs/objet/MANIFEST-000168 differ diff --git a/packs/ordinateur/000145.log b/packs/ordinateur/000178.log similarity index 100% rename from packs/ordinateur/000145.log rename to packs/ordinateur/000178.log diff --git a/packs/ordinateur/CURRENT b/packs/ordinateur/CURRENT index 3e77273..4802dbe 100644 --- a/packs/ordinateur/CURRENT +++ b/packs/ordinateur/CURRENT @@ -1 +1 @@ -MANIFEST-000144 +MANIFEST-000176 diff --git a/packs/ordinateur/LOG b/packs/ordinateur/LOG index 0fd58e7..662f216 100644 --- a/packs/ordinateur/LOG +++ b/packs/ordinateur/LOG @@ -1,3 +1,8 @@ -2026/06/01-22:42:05.817864 7f52c6bff6c0 Recovering log #142 -2026/06/01-22:42:05.827428 7f52c6bff6c0 Delete type=3 #140 -2026/06/01-22:42:05.827476 7f52c6bff6c0 Delete type=0 #142 +2026/06/12-20:52:57.967451 7fc4117ff6c0 Recovering log #174 +2026/06/12-20:52:57.978196 7fc4117ff6c0 Delete type=3 #172 +2026/06/12-20:52:57.978251 7fc4117ff6c0 Delete type=0 #174 +2026/06/12-20:53:22.696764 7fc3c11be6c0 Level-0 table #179: started +2026/06/12-20:53:22.696789 7fc3c11be6c0 Level-0 table #179: 0 bytes OK +2026/06/12-20:53:22.703214 7fc3c11be6c0 Delete type=0 #177 +2026/06/12-20:53:22.703379 7fc3c11be6c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.710437 7fc3c11be6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end) diff --git a/packs/ordinateur/LOG.old b/packs/ordinateur/LOG.old index 613dd21..bd51f4f 100644 --- a/packs/ordinateur/LOG.old +++ b/packs/ordinateur/LOG.old @@ -1,8 +1,8 @@ -2026/06/01-08:35:53.480904 7f52c63fe6c0 Recovering log #138 -2026/06/01-08:35:53.491518 7f52c63fe6c0 Delete type=3 #136 -2026/06/01-08:35:53.491573 7f52c63fe6c0 Delete type=0 #138 -2026/06/01-08:51:10.456761 7f52c4bfb6c0 Level-0 table #143: started -2026/06/01-08:51:10.456779 7f52c4bfb6c0 Level-0 table #143: 0 bytes OK -2026/06/01-08:51:10.463323 7f52c4bfb6c0 Delete type=0 #141 -2026/06/01-08:51:10.470745 7f52c4bfb6c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end) -2026/06/01-08:51:10.477028 7f52c4bfb6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.538990 7fc410ffe6c0 Recovering log #170 +2026/06/12-20:51:44.550083 7fc410ffe6c0 Delete type=3 #168 +2026/06/12-20:51:44.550141 7fc410ffe6c0 Delete type=0 #170 +2026/06/12-20:52:05.569908 7fc3c11be6c0 Level-0 table #175: started +2026/06/12-20:52:05.569929 7fc3c11be6c0 Level-0 table #175: 0 bytes OK +2026/06/12-20:52:05.576375 7fc3c11be6c0 Delete type=0 #173 +2026/06/12-20:52:05.590256 7fc3c11be6c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.590425 7fc3c11be6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end) diff --git a/packs/ordinateur/MANIFEST-000144 b/packs/ordinateur/MANIFEST-000176 similarity index 61% rename from packs/ordinateur/MANIFEST-000144 rename to packs/ordinateur/MANIFEST-000176 index fbdf399..c74e940 100644 Binary files a/packs/ordinateur/MANIFEST-000144 and b/packs/ordinateur/MANIFEST-000176 differ diff --git a/packs/pnj/000005.ldb b/packs/pnj/000005.ldb new file mode 100644 index 0000000..42095f2 Binary files /dev/null and b/packs/pnj/000005.ldb differ diff --git a/packs/talents-psioniques/000091.log b/packs/pnj/000016.log similarity index 100% rename from packs/talents-psioniques/000091.log rename to packs/pnj/000016.log diff --git a/packs/pnj/CURRENT b/packs/pnj/CURRENT new file mode 100644 index 0000000..23b73d9 --- /dev/null +++ b/packs/pnj/CURRENT @@ -0,0 +1 @@ +MANIFEST-000014 diff --git a/packs/pnj/LOCK b/packs/pnj/LOCK new file mode 100644 index 0000000..e69de29 diff --git a/packs/pnj/LOG b/packs/pnj/LOG new file mode 100644 index 0000000..a528098 --- /dev/null +++ b/packs/pnj/LOG @@ -0,0 +1,8 @@ +2026/06/12-20:52:58.209985 7fc3c3fff6c0 Recovering log #12 +2026/06/12-20:52:58.222276 7fc3c3fff6c0 Delete type=3 #10 +2026/06/12-20:52:58.222315 7fc3c3fff6c0 Delete type=0 #12 +2026/06/12-20:53:22.822733 7fc3c11be6c0 Level-0 table #17: started +2026/06/12-20:53:22.822761 7fc3c11be6c0 Level-0 table #17: 0 bytes OK +2026/06/12-20:53:22.829641 7fc3c11be6c0 Delete type=0 #15 +2026/06/12-20:53:22.836426 7fc3c11be6c0 Manual compaction at level-0 from '!actors!DL3zXfXxWMOQhXJY' @ 72057594037927935 : 1 .. '!actors.items!JAHYXFedTxNlGYX8.nmIgA3CQkOSEpCSP' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.960032 7fc3c11be6c0 Manual compaction at level-1 from '!actors!DL3zXfXxWMOQhXJY' @ 72057594037927935 : 1 .. '!actors.items!JAHYXFedTxNlGYX8.nmIgA3CQkOSEpCSP' @ 0 : 0; will stop at (end) diff --git a/packs/pnj/LOG.old b/packs/pnj/LOG.old new file mode 100644 index 0000000..e519ed8 --- /dev/null +++ b/packs/pnj/LOG.old @@ -0,0 +1,8 @@ +2026/06/12-20:51:44.772467 7fc3c37fe6c0 Recovering log #8 +2026/06/12-20:51:44.784739 7fc3c37fe6c0 Delete type=3 #6 +2026/06/12-20:51:44.784799 7fc3c37fe6c0 Delete type=0 #8 +2026/06/12-20:52:05.700099 7fc3c11be6c0 Level-0 table #13: started +2026/06/12-20:52:05.700122 7fc3c11be6c0 Level-0 table #13: 0 bytes OK +2026/06/12-20:52:05.707051 7fc3c11be6c0 Delete type=0 #11 +2026/06/12-20:52:05.714022 7fc3c11be6c0 Manual compaction at level-0 from '!actors!DL3zXfXxWMOQhXJY' @ 72057594037927935 : 1 .. '!actors.items!JAHYXFedTxNlGYX8.nmIgA3CQkOSEpCSP' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.714257 7fc3c11be6c0 Manual compaction at level-1 from '!actors!DL3zXfXxWMOQhXJY' @ 72057594037927935 : 1 .. '!actors.items!JAHYXFedTxNlGYX8.nmIgA3CQkOSEpCSP' @ 0 : 0; will stop at (end) diff --git a/packs/pnj/MANIFEST-000014 b/packs/pnj/MANIFEST-000014 new file mode 100644 index 0000000..98fbd13 Binary files /dev/null and b/packs/pnj/MANIFEST-000014 differ diff --git a/packs/tables-pnj/000168.ldb b/packs/tables-pnj/000168.ldb deleted file mode 100644 index 5131ae3..0000000 Binary files a/packs/tables-pnj/000168.ldb and /dev/null differ diff --git a/packs/tables-pnj/000170.ldb b/packs/tables-pnj/000170.ldb deleted file mode 100644 index fdbebad..0000000 Binary files a/packs/tables-pnj/000170.ldb and /dev/null differ diff --git a/packs/tables-pnj/000213.ldb b/packs/tables-pnj/000213.ldb deleted file mode 100644 index 04786d9..0000000 Binary files a/packs/tables-pnj/000213.ldb and /dev/null differ diff --git a/packs/tables-pnj/000214.ldb b/packs/tables-pnj/000214.ldb deleted file mode 100644 index 33c43ef..0000000 Binary files a/packs/tables-pnj/000214.ldb and /dev/null differ diff --git a/packs/tables-pnj/000215.ldb b/packs/tables-pnj/000215.ldb deleted file mode 100644 index a0c7699..0000000 Binary files a/packs/tables-pnj/000215.ldb and /dev/null differ diff --git a/packs/tables-pnj/000217.ldb b/packs/tables-pnj/000217.ldb deleted file mode 100644 index 70a139a..0000000 Binary files a/packs/tables-pnj/000217.ldb and /dev/null differ diff --git a/packs/tables-pnj/000218.log b/packs/tables-pnj/000218.log deleted file mode 100644 index 4bd7786..0000000 Binary files a/packs/tables-pnj/000218.log and /dev/null differ diff --git a/packs/tables-pnj/000219.ldb b/packs/tables-pnj/000219.ldb deleted file mode 100644 index 482da88..0000000 Binary files a/packs/tables-pnj/000219.ldb and /dev/null differ diff --git a/packs/tables-pnj/000293.log b/packs/tables-pnj/000293.log new file mode 100644 index 0000000..e69de29 diff --git a/packs/tables-pnj/000295.ldb b/packs/tables-pnj/000295.ldb new file mode 100644 index 0000000..9f06347 Binary files /dev/null and b/packs/tables-pnj/000295.ldb differ diff --git a/packs/tables-pnj/000296.ldb b/packs/tables-pnj/000296.ldb new file mode 100644 index 0000000..031d070 Binary files /dev/null and b/packs/tables-pnj/000296.ldb differ diff --git a/packs/tables-pnj/000297.ldb b/packs/tables-pnj/000297.ldb new file mode 100644 index 0000000..ffd6064 Binary files /dev/null and b/packs/tables-pnj/000297.ldb differ diff --git a/packs/tables-pnj/CURRENT b/packs/tables-pnj/CURRENT index 91e41f4..15d9120 100644 --- a/packs/tables-pnj/CURRENT +++ b/packs/tables-pnj/CURRENT @@ -1 +1 @@ -MANIFEST-000171 +MANIFEST-000291 diff --git a/packs/tables-pnj/LOG b/packs/tables-pnj/LOG index 95f2192..a1041bd 100644 --- a/packs/tables-pnj/LOG +++ b/packs/tables-pnj/LOG @@ -1,104 +1,19 @@ -2026/06/01-22:42:05.898881 7f52c6bff6c0 Recovering log #164 -2026/06/01-22:42:05.908070 7f52c6bff6c0 Delete type=3 #158 -2026/06/01-22:42:05.908116 7f52c6bff6c0 Delete type=0 #164 -2026/06/01-22:42:20.631787 7f52c4bfb6c0 Level-0 table #174: started -2026/06/01-22:42:20.664092 7f52c4bfb6c0 Level-0 table #174: 3534281 bytes OK -2026/06/01-22:42:20.670615 7f52c4bfb6c0 Delete type=0 #172 -2026/06/01-22:44:14.476907 7f52c4bfb6c0 Level-0 table #176: started -2026/06/01-22:44:14.517289 7f52c4bfb6c0 Level-0 table #176: 3590317 bytes OK -2026/06/01-22:44:14.524467 7f52c4bfb6c0 Delete type=0 #173 -2026/06/01-22:46:05.183822 7f52c4bfb6c0 Level-0 table #178: started -2026/06/01-22:46:05.221801 7f52c4bfb6c0 Level-0 table #178: 3635543 bytes OK -2026/06/01-22:46:05.228261 7f52c4bfb6c0 Delete type=0 #175 -2026/06/01-22:47:46.984190 7f52c4bfb6c0 Level-0 table #180: started -2026/06/01-22:47:47.016424 7f52c4bfb6c0 Level-0 table #180: 3689250 bytes OK -2026/06/01-22:47:47.022818 7f52c4bfb6c0 Delete type=0 #177 -2026/06/01-22:49:07.037465 7f52c4bfb6c0 Level-0 table #182: started -2026/06/01-22:49:07.113718 7f52c4bfb6c0 Level-0 table #182: 3742709 bytes OK -2026/06/01-22:49:07.141920 7f52c4bfb6c0 Delete type=0 #179 -2026/06/01-22:49:07.142905 7f52c4bfb6c0 Compacting 4@0 + 1@1 files -2026/06/01-22:49:07.200300 7f52c4bfb6c0 Generated table #183@0: 12232 keys, 2147703 bytes -2026/06/01-22:49:07.251271 7f52c4bfb6c0 Generated table #184@0: 12346 keys, 1594009 bytes -2026/06/01-22:49:07.251297 7f52c4bfb6c0 Compacted 4@0 + 1@1 files => 3741712 bytes -2026/06/01-22:49:07.282491 7f52c4bfb6c0 compacted to: files[ 0 2 2 0 0 0 0 ] -2026/06/01-22:49:07.282953 7f52c4bfb6c0 Delete type=2 #174 -2026/06/01-22:49:07.283509 7f52c4bfb6c0 Delete type=2 #176 -2026/06/01-22:49:07.284069 7f52c4bfb6c0 Delete type=2 #178 -2026/06/01-22:49:07.284659 7f52c4bfb6c0 Delete type=2 #180 -2026/06/01-22:49:07.285224 7f52c4bfb6c0 Delete type=2 #182 -2026/06/01-22:50:15.076056 7f52c4bfb6c0 Level-0 table #186: started -2026/06/01-22:50:15.139569 7f52c4bfb6c0 Level-0 table #186: 3791699 bytes OK -2026/06/01-22:50:15.177008 7f52c4bfb6c0 Delete type=0 #181 -2026/06/01-22:51:23.050617 7f52c4bfb6c0 Level-0 table #188: started -2026/06/01-22:51:23.083717 7f52c4bfb6c0 Level-0 table #188: 3847811 bytes OK -2026/06/01-22:51:23.090754 7f52c4bfb6c0 Delete type=0 #185 -2026/06/01-22:54:31.041731 7f52c4bfb6c0 Level-0 table #190: started -2026/06/01-22:54:31.075783 7f52c4bfb6c0 Level-0 table #190: 3898158 bytes OK -2026/06/01-22:54:31.085709 7f52c4bfb6c0 Delete type=0 #187 -2026/06/01-22:56:43.017283 7f52c4bfb6c0 Level-0 table #192: started -2026/06/01-22:56:43.056579 7f52c4bfb6c0 Level-0 table #192: 3942180 bytes OK -2026/06/01-22:56:43.067120 7f52c4bfb6c0 Delete type=0 #189 -2026/06/01-22:56:43.067709 7f52c4bfb6c0 Compacting 4@0 + 2@1 files -2026/06/01-22:56:43.096331 7f52c4bfb6c0 Generated table #193@0: 12110 keys, 2146786 bytes -2026/06/01-22:56:43.123233 7f52c4bfb6c0 Generated table #194@0: 13796 keys, 1794145 bytes -2026/06/01-22:56:43.123251 7f52c4bfb6c0 Compacted 4@0 + 2@1 files => 3940931 bytes -2026/06/01-22:56:43.135664 7f52c4bfb6c0 compacted to: files[ 0 2 2 0 0 0 0 ] -2026/06/01-22:56:43.136005 7f52c4bfb6c0 Delete type=2 #183 -2026/06/01-22:56:43.136216 7f52c4bfb6c0 Delete type=2 #184 -2026/06/01-22:56:43.136413 7f52c4bfb6c0 Delete type=2 #186 -2026/06/01-22:56:43.136721 7f52c4bfb6c0 Delete type=2 #188 -2026/06/01-22:56:43.137001 7f52c4bfb6c0 Delete type=2 #190 -2026/06/01-22:56:43.137270 7f52c4bfb6c0 Delete type=2 #192 -2026/06/01-23:02:49.561038 7f52c4bfb6c0 Level-0 table #196: started -2026/06/01-23:02:49.590283 7f52c4bfb6c0 Level-0 table #196: 3996082 bytes OK -2026/06/01-23:02:49.596507 7f52c4bfb6c0 Delete type=0 #191 -2026/06/01-23:05:28.996035 7f52c4bfb6c0 Level-0 table #198: started -2026/06/01-23:05:29.028796 7f52c4bfb6c0 Level-0 table #198: 4042529 bytes OK -2026/06/01-23:05:29.035710 7f52c4bfb6c0 Delete type=0 #195 -2026/06/01-23:11:22.779385 7f52c4bfb6c0 Level-0 table #200: started -2026/06/01-23:11:22.817516 7f52c4bfb6c0 Level-0 table #200: 4095432 bytes OK -2026/06/01-23:11:22.823424 7f52c4bfb6c0 Delete type=0 #197 -2026/06/01-23:19:54.339957 7f52c4bfb6c0 Level-0 table #202: started -2026/06/01-23:19:54.367799 7f52c4bfb6c0 Level-0 table #202: 4146311 bytes OK -2026/06/01-23:19:54.373753 7f52c4bfb6c0 Delete type=0 #199 -2026/06/01-23:19:54.374306 7f52c4bfb6c0 Compacting 4@0 + 2@1 files -2026/06/01-23:19:54.395646 7f52c4bfb6c0 Generated table #203@0: 11893 keys, 2146843 bytes -2026/06/01-23:19:54.419845 7f52c4bfb6c0 Generated table #204@0: 15341 keys, 1997992 bytes -2026/06/01-23:19:54.419877 7f52c4bfb6c0 Compacted 4@0 + 2@1 files => 4144835 bytes -2026/06/01-23:19:54.426071 7f52c4bfb6c0 compacted to: files[ 0 2 2 0 0 0 0 ] -2026/06/01-23:19:54.426414 7f52c4bfb6c0 Delete type=2 #193 -2026/06/01-23:19:54.426875 7f52c4bfb6c0 Delete type=2 #194 -2026/06/01-23:19:54.427165 7f52c4bfb6c0 Delete type=2 #196 -2026/06/01-23:19:54.427644 7f52c4bfb6c0 Delete type=2 #198 -2026/06/01-23:19:54.428125 7f52c4bfb6c0 Delete type=2 #200 -2026/06/01-23:19:54.428618 7f52c4bfb6c0 Delete type=2 #202 -2026/06/01-23:23:22.212670 7f52c4bfb6c0 Level-0 table #206: started -2026/06/01-23:23:22.246031 7f52c4bfb6c0 Level-0 table #206: 4199267 bytes OK -2026/06/01-23:23:22.252324 7f52c4bfb6c0 Delete type=0 #201 -2026/06/01-23:32:01.046035 7f52c4bfb6c0 Level-0 table #208: started -2026/06/01-23:32:01.083523 7f52c4bfb6c0 Level-0 table #208: 4245727 bytes OK -2026/06/01-23:32:01.090732 7f52c4bfb6c0 Delete type=0 #205 -2026/06/01-23:34:50.675178 7f52c4bfb6c0 Level-0 table #210: started -2026/06/01-23:34:50.708986 7f52c4bfb6c0 Level-0 table #210: 4300427 bytes OK -2026/06/01-23:34:50.715366 7f52c4bfb6c0 Delete type=0 #207 -2026/06/01-23:37:05.691865 7f52c4bfb6c0 Level-0 table #212: started -2026/06/01-23:37:05.728371 7f52c4bfb6c0 Level-0 table #212: 4351044 bytes OK -2026/06/01-23:37:05.735021 7f52c4bfb6c0 Delete type=0 #209 -2026/06/01-23:37:05.735982 7f52c4bfb6c0 Compacting 4@0 + 2@1 files -2026/06/01-23:37:05.756894 7f52c4bfb6c0 Generated table #213@0: 11588 keys, 2145171 bytes -2026/06/01-23:37:05.783035 7f52c4bfb6c0 Generated table #214@0: 16666 keys, 2163321 bytes -2026/06/01-23:37:05.787317 7f52c4bfb6c0 Generated table #215@0: 308 keys, 41171 bytes -2026/06/01-23:37:05.787329 7f52c4bfb6c0 Compacted 4@0 + 2@1 files => 4349663 bytes -2026/06/01-23:37:05.793772 7f52c4bfb6c0 compacted to: files[ 0 3 2 0 0 0 0 ] -2026/06/01-23:37:05.793970 7f52c4bfb6c0 Delete type=2 #203 -2026/06/01-23:37:05.794138 7f52c4bfb6c0 Delete type=2 #204 -2026/06/01-23:37:05.794271 7f52c4bfb6c0 Delete type=2 #206 -2026/06/01-23:37:05.794472 7f52c4bfb6c0 Delete type=2 #208 -2026/06/01-23:37:05.794734 7f52c4bfb6c0 Delete type=2 #210 -2026/06/01-23:37:05.794942 7f52c4bfb6c0 Delete type=2 #212 -2026/06/01-23:54:42.760778 7f52c4bfb6c0 Level-0 table #217: started -2026/06/01-23:54:42.788274 7f52c4bfb6c0 Level-0 table #217: 4406061 bytes OK -2026/06/01-23:54:42.794452 7f52c4bfb6c0 Delete type=0 #211 -2026/06/02-00:07:09.406466 7f52c4bfb6c0 Level-0 table #219: started -2026/06/02-00:07:09.441912 7f52c4bfb6c0 Level-0 table #219: 4455911 bytes OK -2026/06/02-00:07:09.447798 7f52c4bfb6c0 Delete type=0 #216 +2026/06/12-20:52:58.065673 7fc3c3fff6c0 Recovering log #286 +2026/06/12-20:52:58.076152 7fc3c3fff6c0 Delete type=3 #284 +2026/06/12-20:52:58.076196 7fc3c3fff6c0 Delete type=0 #286 +2026/06/12-20:53:22.724394 7fc3c11be6c0 Level-0 table #294: started +2026/06/12-20:53:22.813324 7fc3c11be6c0 Level-0 table #294: 5029605 bytes OK +2026/06/12-20:53:22.820890 7fc3c11be6c0 Delete type=0 #292 +2026/06/12-20:53:22.829771 7fc3c11be6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.836453 7fc3c11be6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 1617840 : 1 +2026/06/12-20:53:22.836460 7fc3c11be6c0 Compacting 1@1 + 3@2 files +2026/06/12-20:53:22.873874 7fc3c11be6c0 Generated table #295@1: 10562 keys, 2142429 bytes +2026/06/12-20:53:22.924542 7fc3c11be6c0 Generated table #296@1: 16816 keys, 2164017 bytes +2026/06/12-20:53:22.944331 7fc3c11be6c0 Generated table #297@1: 5500 keys, 721026 bytes +2026/06/12-20:53:22.944361 7fc3c11be6c0 Compacted 1@1 + 3@2 files => 5027472 bytes +2026/06/12-20:53:22.951445 7fc3c11be6c0 compacted to: files[ 0 0 3 0 0 0 0 ] +2026/06/12-20:53:22.951933 7fc3c11be6c0 Delete type=2 #288 +2026/06/12-20:53:22.952420 7fc3c11be6c0 Delete type=2 #289 +2026/06/12-20:53:22.952708 7fc3c11be6c0 Delete type=2 #290 +2026/06/12-20:53:22.953103 7fc3c11be6c0 Delete type=2 #294 +2026/06/12-20:53:22.960065 7fc3c11be6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 1617840 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end) diff --git a/packs/tables-pnj/LOG.old b/packs/tables-pnj/LOG.old index 6a3a4ef..8d0431b 100644 --- a/packs/tables-pnj/LOG.old +++ b/packs/tables-pnj/LOG.old @@ -1,39 +1,19 @@ -2026/06/01-08:35:53.577873 7f52c53fc6c0 Recovering log #151 -2026/06/01-08:35:53.588883 7f52c53fc6c0 Delete type=3 #115 -2026/06/01-08:35:53.588945 7f52c53fc6c0 Delete type=0 #151 -2026/06/01-08:47:35.073031 7f52c4bfb6c0 Level-0 table #161: started -2026/06/01-08:47:35.109060 7f52c4bfb6c0 Level-0 table #161: 3389567 bytes OK -2026/06/01-08:47:35.119693 7f52c4bfb6c0 Delete type=0 #159 -2026/06/01-08:49:55.679233 7f52c4bfb6c0 Level-0 table #163: started -2026/06/01-08:49:55.721583 7f52c4bfb6c0 Level-0 table #163: 3442926 bytes OK -2026/06/01-08:49:55.728383 7f52c4bfb6c0 Delete type=0 #160 -2026/06/01-08:51:10.512438 7f52c4bfb6c0 Level-0 table #165: started -2026/06/01-08:51:10.552653 7f52c4bfb6c0 Level-0 table #165: 3485558 bytes OK -2026/06/01-08:51:10.559696 7f52c4bfb6c0 Delete type=0 #162 -2026/06/01-08:51:10.560948 7f52c4bfb6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 761930 : 1 -2026/06/01-08:51:10.560964 7f52c4bfb6c0 Compacting 2@0 + 1@1 files -2026/06/01-08:51:10.590673 7f52c4bfb6c0 Generated table #166@0: 12461 keys, 2148113 bytes -2026/06/01-08:51:10.614131 7f52c4bfb6c0 Generated table #167@0: 10457 keys, 1336575 bytes -2026/06/01-08:51:10.614152 7f52c4bfb6c0 Compacted 2@0 + 1@1 files => 3484688 bytes -2026/06/01-08:51:10.620854 7f52c4bfb6c0 compacted to: files[ 0 2 2 0 0 0 0 ] -2026/06/01-08:51:10.621202 7f52c4bfb6c0 Delete type=2 #161 -2026/06/01-08:51:10.621653 7f52c4bfb6c0 Delete type=2 #163 -2026/06/01-08:51:10.622090 7f52c4bfb6c0 Delete type=2 #165 -2026/06/01-08:51:10.641251 7f52c4bfb6c0 Manual compaction at level-0 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 761930 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end) -2026/06/01-08:51:10.649348 7f52c4bfb6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!e9c7LNgXUFbYLZF1.0q5zLunzoX2kqo8m' @ 780825 : 1 -2026/06/01-08:51:10.649351 7f52c4bfb6c0 Compacting 1@1 + 1@2 files -2026/06/01-08:51:10.679226 7f52c4bfb6c0 Generated table #168@1: 12461 keys, 2148113 bytes -2026/06/01-08:51:10.684351 7f52c4bfb6c0 Generated table #169@1: 755 keys, 94591 bytes -2026/06/01-08:51:10.684370 7f52c4bfb6c0 Compacted 1@1 + 1@2 files => 2242704 bytes -2026/06/01-08:51:10.692020 7f52c4bfb6c0 compacted to: files[ 0 1 3 0 0 0 0 ] -2026/06/01-08:51:10.692313 7f52c4bfb6c0 Delete type=2 #155 -2026/06/01-08:51:10.692659 7f52c4bfb6c0 Delete type=2 #166 -2026/06/01-08:51:10.711439 7f52c4bfb6c0 Manual compaction at level-1 from '!tables.results!e9c7LNgXUFbYLZF1.0q5zLunzoX2kqo8m' @ 780825 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 784560 : 1 -2026/06/01-08:51:10.711444 7f52c4bfb6c0 Compacting 1@1 + 2@2 files -2026/06/01-08:51:10.734315 7f52c4bfb6c0 Generated table #170@1: 10457 keys, 1336575 bytes -2026/06/01-08:51:10.734332 7f52c4bfb6c0 Compacted 1@1 + 2@2 files => 1336575 bytes -2026/06/01-08:51:10.741118 7f52c4bfb6c0 compacted to: files[ 0 0 2 0 0 0 0 ] -2026/06/01-08:51:10.741262 7f52c4bfb6c0 Delete type=2 #157 -2026/06/01-08:51:10.741508 7f52c4bfb6c0 Delete type=2 #167 -2026/06/01-08:51:10.741680 7f52c4bfb6c0 Delete type=2 #169 -2026/06/01-08:51:10.747933 7f52c4bfb6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 784560 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.638713 7fc410ffe6c0 Recovering log #279 +2026/06/12-20:51:44.649235 7fc410ffe6c0 Delete type=3 #277 +2026/06/12-20:51:44.649296 7fc410ffe6c0 Delete type=0 #279 +2026/06/12-20:52:05.627084 7fc3c11be6c0 Level-0 table #287: started +2026/06/12-20:52:05.691136 7fc3c11be6c0 Level-0 table #287: 4971536 bytes OK +2026/06/12-20:52:05.698145 7fc3c11be6c0 Delete type=0 #285 +2026/06/12-20:52:05.714008 7fc3c11be6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.714299 7fc3c11be6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 1585250 : 1 +2026/06/12-20:52:05.714307 7fc3c11be6c0 Compacting 1@1 + 3@2 files +2026/06/12-20:52:05.744344 7fc3c11be6c0 Generated table #288@1: 10660 keys, 2142130 bytes +2026/06/12-20:52:05.781422 7fc3c11be6c0 Generated table #289@1: 16841 keys, 2165292 bytes +2026/06/12-20:52:05.794598 7fc3c11be6c0 Generated table #290@1: 5045 keys, 662072 bytes +2026/06/12-20:52:05.794618 7fc3c11be6c0 Compacted 1@1 + 3@2 files => 4969494 bytes +2026/06/12-20:52:05.801998 7fc3c11be6c0 compacted to: files[ 0 0 3 0 0 0 0 ] +2026/06/12-20:52:05.802346 7fc3c11be6c0 Delete type=2 #281 +2026/06/12-20:52:05.802678 7fc3c11be6c0 Delete type=2 #282 +2026/06/12-20:52:05.802871 7fc3c11be6c0 Delete type=2 #283 +2026/06/12-20:52:05.803095 7fc3c11be6c0 Delete type=2 #287 +2026/06/12-20:52:05.821244 7fc3c11be6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 1585250 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end) diff --git a/packs/tables-pnj/MANIFEST-000171 b/packs/tables-pnj/MANIFEST-000171 deleted file mode 100644 index 5b8cc7b..0000000 Binary files a/packs/tables-pnj/MANIFEST-000171 and /dev/null differ diff --git a/packs/tables-pnj/MANIFEST-000291 b/packs/tables-pnj/MANIFEST-000291 new file mode 100644 index 0000000..4957093 Binary files /dev/null and b/packs/tables-pnj/MANIFEST-000291 differ diff --git a/packs/talents-psioniques/000124.log b/packs/talents-psioniques/000124.log new file mode 100644 index 0000000..e69de29 diff --git a/packs/talents-psioniques/CURRENT b/packs/talents-psioniques/CURRENT index 2f2c868..d9766b1 100644 --- a/packs/talents-psioniques/CURRENT +++ b/packs/talents-psioniques/CURRENT @@ -1 +1 @@ -MANIFEST-000090 +MANIFEST-000122 diff --git a/packs/talents-psioniques/LOG b/packs/talents-psioniques/LOG index 1f0fb88..c78e0b8 100644 --- a/packs/talents-psioniques/LOG +++ b/packs/talents-psioniques/LOG @@ -1,3 +1,8 @@ -2026/06/01-22:42:05.875087 7f52c6bff6c0 Recovering log #88 -2026/06/01-22:42:05.885101 7f52c6bff6c0 Delete type=3 #86 -2026/06/01-22:42:05.885133 7f52c6bff6c0 Delete type=0 #88 +2026/06/12-20:52:58.037556 7fc3c3fff6c0 Recovering log #120 +2026/06/12-20:52:58.047938 7fc3c3fff6c0 Delete type=3 #118 +2026/06/12-20:52:58.048005 7fc3c3fff6c0 Delete type=0 #120 +2026/06/12-20:53:22.710451 7fc3c11be6c0 Level-0 table #125: started +2026/06/12-20:53:22.710474 7fc3c11be6c0 Level-0 table #125: 0 bytes OK +2026/06/12-20:53:22.716951 7fc3c11be6c0 Delete type=0 #123 +2026/06/12-20:53:22.724368 7fc3c11be6c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end) +2026/06/12-20:53:22.822717 7fc3c11be6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end) diff --git a/packs/talents-psioniques/LOG.old b/packs/talents-psioniques/LOG.old index d49837c..5a51aca 100644 --- a/packs/talents-psioniques/LOG.old +++ b/packs/talents-psioniques/LOG.old @@ -1,8 +1,8 @@ -2026/06/01-08:35:53.549764 7f52c5bfd6c0 Recovering log #84 -2026/06/01-08:35:53.560355 7f52c5bfd6c0 Delete type=3 #82 -2026/06/01-08:35:53.560413 7f52c5bfd6c0 Delete type=0 #84 -2026/06/01-08:51:10.491490 7f52c4bfb6c0 Level-0 table #89: started -2026/06/01-08:51:10.491513 7f52c4bfb6c0 Level-0 table #89: 0 bytes OK -2026/06/01-08:51:10.498412 7f52c4bfb6c0 Delete type=0 #87 -2026/06/01-08:51:10.505791 7f52c4bfb6c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end) -2026/06/01-08:51:10.560715 7f52c4bfb6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end) +2026/06/12-20:51:44.607543 7fc410ffe6c0 Recovering log #116 +2026/06/12-20:51:44.622157 7fc410ffe6c0 Delete type=3 #114 +2026/06/12-20:51:44.622215 7fc410ffe6c0 Delete type=0 #116 +2026/06/12-20:52:05.604539 7fc3c11be6c0 Level-0 table #121: started +2026/06/12-20:52:05.604563 7fc3c11be6c0 Level-0 table #121: 0 bytes OK +2026/06/12-20:52:05.611212 7fc3c11be6c0 Delete type=0 #119 +2026/06/12-20:52:05.618870 7fc3c11be6c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end) +2026/06/12-20:52:05.619129 7fc3c11be6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end) diff --git a/packs/talents-psioniques/MANIFEST-000090 b/packs/talents-psioniques/MANIFEST-000122 similarity index 62% rename from packs/talents-psioniques/MANIFEST-000090 rename to packs/talents-psioniques/MANIFEST-000122 index 6d27032..2717f5c 100644 Binary files a/packs/talents-psioniques/MANIFEST-000090 and b/packs/talents-psioniques/MANIFEST-000122 differ diff --git a/scripts/NpcDialog.js b/scripts/NpcDialog.js index c1aaf55..79a91ee 100644 --- a/scripts/NpcDialog.js +++ b/scripts/NpcDialog.js @@ -1,5 +1,6 @@ import { formatCredits } from './tradeHelper.js'; -import { createNpcActor, generateClientMission, generateEncounter, generateQuickNpc } from './npcHelper.js'; +import { createNpcActor, generateClientMission, generateEncounter, generateQuickNpc, formatSigned } from './npcHelper.js'; +import { generateAllyEnemy } from './allyEnemyGenerator.js'; import { NPC_RELATIONS } from './data/npcTables.js'; import { generateAndCreateTravellerNpc } from './travellerNpcGenerator.js'; import { generateRandomName } from './data/travellerNpcGenerator.js'; @@ -68,6 +69,13 @@ export class NpcDialog extends HandlebarsApplicationMixin(ApplicationV2) { actorName: '', openCreatedActor: DEFAULT_OPTIONS.openCreatedActor, }, + ae: { + relation: options.relation ?? 'contact', + includeSpecial: true, + createActor: false, + actorName: '', + openCreatedActor: true, + }, }; } @@ -138,6 +146,12 @@ export class NpcDialog extends HandlebarsApplicationMixin(ApplicationV2) { await this._handleTravellerNpc(); }); + html.find('[data-action="generate-ally-enemy"]').on('click', async (event) => { + event.preventDefault(); + this._readForm(html); + await this._handleAllyEnemy(); + }); + html.find('[data-action="randomize-name"]').on('click', (event) => { event.preventDefault(); this._randomizeTravellerName(html); @@ -205,6 +219,13 @@ export class NpcDialog extends HandlebarsApplicationMixin(ApplicationV2) { this._formData.encounter.context = html.find('[name="encounter.context"]').val(); this._formData.encounter.includeFollowUp = html.find('[name="encounter.includeFollowUp"]').is(':checked'); + // Données pour l'onglet Alliés/Ennemis + this._formData.ae.relation = html.find('[name="ae.relation"]').val(); + this._formData.ae.includeSpecial = html.find('[name="ae.includeSpecial"]').is(':checked'); + this._formData.ae.createActor = html.find('[name="ae.createActor"]').is(':checked'); + this._formData.ae.actorName = html.find('[name="ae.actorName"]').val(); + this._formData.ae.openCreatedActor = html.find('[name="ae.openCreatedActor"]').is(':checked'); + // Données pour l'onglet PNJ Détaillé (Traveller) this._formData.traveller.citizenCategory = html.find('[name="traveller.citizenCategory"]').val(); this._formData.traveller.experience = html.find('[name="traveller.experience"]').val(); @@ -281,6 +302,60 @@ export class NpcDialog extends HandlebarsApplicationMixin(ApplicationV2) { } } + async _handleAllyEnemy() { + const button = $(this.element).find('[data-action="generate-ally-enemy"]'); + const originalLabel = button.html(); + + try { + button.prop('disabled', true).html(' Génération...'); + + const result = await generateAllyEnemy(this._formData.ae.relation, { + includeSpecial: this._formData.ae.includeSpecial, + }); + + if (result.success) { + if (this._formData.ae.createActor) { + const ae = this._formData.ae; + const actorName = ae.actorName?.trim() || `PNJ — ${result.relation.label}`; + const baseActorSystem = game.system?.id === 'mgt2e' + ? await (await import('./travellerNpcGenerator.js')).getMgt2eBaseActorSystem() + : null; + const actorData = { + name: actorName, + type: 'npc', + img: 'systems/mgt2e/icons/cargo/passenger-middle.svg', + system: { + settings: foundry.utils.mergeObject(foundry.utils.deepClone(baseActorSystem?.settings ?? {}), { + hideUntrained: true, lockCharacteristics: true, + }), + sophont: foundry.utils.mergeObject(foundry.utils.deepClone(baseActorSystem?.sophont ?? {}), { + age: 18, homeworld: '', profession: result.relation.label, + }), + characteristics: foundry.utils.deepClone(baseActorSystem?.characteristics ?? {}), + hits: foundry.utils.deepClone(baseActorSystem?.hits ?? {}), + skills: foundry.utils.deepClone(baseActorSystem?.skills ?? {}), + }, + flags: { + [MODULE_ID]: { generatedAllyEnemy: { relation: result.relation.key } }, + }, + }; + const actor = await Actor.create(actorData, { renderSheet: false }); + result.createdActor = { id: actor.id, name: actor.name }; + if (ae.openCreatedActor) actor.sheet?.render(true); + ui.notifications.info(`Fiche PNJ créée : ${actor.name}`); + } + await this._postToChatResult(result); + } else { + ui.notifications.error('Erreur lors de la génération de la relation'); + } + } catch (error) { + console.error(`${MODULE_ID} | Erreur AE:`, error); + ui.notifications.error(`Erreur: ${error.message}`); + } finally { + button.prop('disabled', false).html(originalLabel); + } + } + _randomizeTravellerName(html) { const name = generateRandomName(this._formData.traveller.gender); html.find('[name="traveller.firstName"]').val(name.firstName); @@ -295,13 +370,15 @@ export class NpcDialog extends HandlebarsApplicationMixin(ApplicationV2) { async _postToChatResult(data) { registerHandlebarsHelpers(); - // Déterminer quel template utiliser en fonction du type de données let template = `modules/${MODULE_ID}/templates/npc-result.hbs`; let resultType = 'npc-result'; - + if (data.type === 'traveller-npc' || data?.flags?.[MODULE_ID]?.type === 'traveller-npc-result') { template = `modules/${MODULE_ID}/templates/traveller-npc-result.hbs`; resultType = 'traveller-npc-result'; + } else if (data.type === 'ally-enemy') { + template = `modules/${MODULE_ID}/templates/ally-enemy-result.hbs`; + resultType = 'ally-enemy-result'; } const html = await foundry.applications.handlebars.renderTemplate(template, data); @@ -369,4 +446,13 @@ function registerHandlebarsHelpers() { if (!obj || !key) return ''; return obj[key] !== undefined ? obj[key] : ''; }); + + const RELATION_LABELS = Object.entries(NPC_RELATIONS).reduce((acc, [key, val]) => { + acc[key] = val.label; + return acc; + }, {}); + + Handlebars.registerHelper('lookupRelationKey', (key) => RELATION_LABELS[key] || key); + + Handlebars.registerHelper('formatSigned', (value) => formatSigned(value)); } diff --git a/scripts/allyEnemyGenerator.js b/scripts/allyEnemyGenerator.js new file mode 100644 index 0000000..012f73f --- /dev/null +++ b/scripts/allyEnemyGenerator.js @@ -0,0 +1,277 @@ +import { NPC_RELATIONS } from './data/npcTables.js'; +import { + RELATION_FORMULAS, + AFFINITY_INIMITY_MAP, + POWER_INFLUENCE_MAP, + AFFINITY_LABELS, + INIMITY_LABELS, + POWER_LABELS, + INFLUENCE_LABELS, + SPECIAL_CHARACTERISTICS_TABLE, +} from './data/allyEnemyTables.js'; + +export function mapRollToValue(roll, mapping) { + return mapping[roll] ?? 0; +} + +export function getLabel(value, labels) { + return labels.find(l => l.value === Math.abs(value)) ?? labels[0]; +} + +export function clamp(value, min, max) { + return Math.max(min, Math.min(max, value)); +} + +async function rollFormula(formula) { + const roll = await new Roll(formula).evaluate(); + return { formula, total: roll.total }; +} + +function getD66Entry(entries, total) { + return entries.find(e => e.d66 === total) ?? null; +} + +async function rollD66(entries) { + const tens = await rollFormula('1d6'); + const ones = await rollFormula('1d6'); + const total = (tens.total * 10) + ones.total; + return { + total, + tens: tens.total, + ones: ones.total, + entry: getD66Entry(entries, total), + }; +} + +async function rollAffinityInimity(relationKey) { + const formulas = RELATION_FORMULAS[relationKey]; + let affinityRoll = null; + let inimityRoll = null; + + if (formulas.affinity !== '0') { + affinityRoll = await rollFormula(formulas.affinity); + } + if (formulas.inimity !== '0') { + inimityRoll = await rollFormula(formulas.inimity); + } + + return { + affinityValue: affinityRoll ? mapRollToValue(affinityRoll.total, AFFINITY_INIMITY_MAP) : 0, + inimityValue: inimityRoll ? mapRollToValue(inimityRoll.total, AFFINITY_INIMITY_MAP) : 0, + affinityRoll, + inimityRoll, + formulas, + }; +} + +async function resolveSpecialCharacteristics(currentRelationKey, depth = 0) { + if (depth > 5) return []; + + const d66Result = await rollD66(SPECIAL_CHARACTERISTICS_TABLE); + if (!d66Result.entry) return []; + + const entry = d66Result.entry; + const result = { + d66: d66Result.total, + text: entry.text, + effects: entry.effects, + appliedDeltas: { affinity: 0, inimity: 0, power: 0, influence: 0 }, + rerollNote: null, + swapNote: null, + narrativeText: entry.effects.action === 'narrativeOnly' ? entry.text : null, + newRelationKey: null, + subCharacteristics: [], + }; + + if (entry.effects.affinityMod) result.appliedDeltas.affinity = entry.effects.affinityMod; + if (entry.effects.inimityMod) result.appliedDeltas.inimity = entry.effects.inimityMod; + if (entry.effects.powerMod) result.appliedDeltas.power = entry.effects.powerMod; + if (entry.effects.influenceMod) result.appliedDeltas.influence = entry.effects.influenceMod; + + if (entry.effects.action === 'extraRolls') { + const count = entry.effects.actionValue || 1; + for (let i = 0; i < count; i++) { + const extra = await resolveSpecialCharacteristics(currentRelationKey, depth + 1); + result.subCharacteristics.push(...extra); + } + } + + return result; +} + +export async function generateAllyEnemy(relationKey = 'contact', options = {}) { + const relation = NPC_RELATIONS[relationKey]; + let currentRelationKey = relationKey; + + const initial = await rollAffinityInimity(relationKey); + let affinityValue = initial.affinityValue; + let inimityValue = initial.inimityValue; + let affinityRoll = initial.affinityRoll; + let inimityRoll = initial.inimityRoll; + let currentFormulas = initial.formulas; + + const powerRoll = await rollFormula('2d6'); + const influenceRoll = await rollFormula('2d6'); + let powerValue = mapRollToValue(powerRoll.total, POWER_INFLUENCE_MAP); + let influenceValue = mapRollToValue(influenceRoll.total, POWER_INFLUENCE_MAP); + + let specialRoll = null; + let specialCharacteristics = []; + + if (options.includeSpecial !== false) { + specialRoll = await rollFormula('2d6'); + + if (specialRoll.total >= 8) { + let queue = await resolveSpecialCharacteristics(currentRelationKey); + + while (queue.length > 0) { + const sc = queue.shift(); + + if (sc.effects.action === 'extraRolls') { + queue.push(...sc.subCharacteristics); + } + + if (sc.effects.action === 'moderateRelation') { + if (currentRelationKey === 'enemy') { + currentRelationKey = 'rival'; + const rerolled = await rollAffinityInimity(currentRelationKey); + affinityValue = rerolled.affinityValue; + inimityValue = rerolled.inimityValue; + affinityRoll = rerolled.affinityRoll; + inimityRoll = rerolled.inimityRoll; + currentFormulas = rerolled.formulas; + sc.newRelationKey = currentRelationKey; + } else if (currentRelationKey === 'ally') { + currentRelationKey = 'contact'; + const rerolled = await rollAffinityInimity(currentRelationKey); + affinityValue = rerolled.affinityValue; + inimityValue = rerolled.inimityValue; + affinityRoll = rerolled.affinityRoll; + inimityRoll = rerolled.inimityRoll; + currentFormulas = rerolled.formulas; + sc.newRelationKey = currentRelationKey; + } + } + + if (sc.effects.action === 'intensifyRelation') { + if (currentRelationKey === 'rival') { + currentRelationKey = 'enemy'; + const rerolled = await rollAffinityInimity(currentRelationKey); + affinityValue = rerolled.affinityValue; + inimityValue = rerolled.inimityValue; + affinityRoll = rerolled.affinityRoll; + inimityRoll = rerolled.inimityRoll; + currentFormulas = rerolled.formulas; + sc.newRelationKey = currentRelationKey; + } else if (currentRelationKey === 'contact') { + currentRelationKey = 'ally'; + const rerolled = await rollAffinityInimity(currentRelationKey); + affinityValue = rerolled.affinityValue; + inimityValue = rerolled.inimityValue; + affinityRoll = rerolled.affinityRoll; + inimityRoll = rerolled.inimityRoll; + currentFormulas = rerolled.formulas; + sc.newRelationKey = currentRelationKey; + } + } + + if (sc.effects.action === 'reRollAffinity') { + const reroll = await rollFormula('2d6'); + const rerolledValue = mapRollToValue(reroll.total, AFFINITY_INIMITY_MAP); + if (rerolledValue > affinityValue) { + sc.rerollNote = `Affinité relancée : ${reroll.total} → ${rerolledValue} (était ${affinityValue})`; + sc.appliedDeltas.affinity = rerolledValue - affinityValue; + } + } + + if (sc.effects.action === 'reRollInimity') { + const reroll = await rollFormula('2d6'); + const rerolledValue = mapRollToValue(reroll.total, AFFINITY_INIMITY_MAP); + if (rerolledValue > inimityValue) { + sc.rerollNote = `Inimitié relancée : ${reroll.total} → ${rerolledValue} (était ${inimityValue})`; + sc.appliedDeltas.inimity = rerolledValue - inimityValue; + } + } + + if (sc.effects.action === 'swapAffinityInimity') { + sc.swapNote = 'Affinité et Inimitié échangées'; + const tmpAff = affinityValue; + const tmpInim = inimityValue; + sc.appliedDeltas.affinity = tmpInim - affinityValue; + sc.appliedDeltas.inimity = tmpAff - inimityValue; + } + + if (sc.effects.action === 'setPowerToZero') { + sc.appliedDeltas.power = -powerValue; + } + + if (sc.effects.action === 'createEnemy') { + sc.narrativeText = 'Un nouvel Ennemi commun au Voyageur et à cet individu est créé.'; + } + + if (sc.effects.action === 'createContactOrRival') { + const net = affinityValue - inimityValue; + sc.narrativeText = net > 0 + ? 'Un nouveau Contact est créé (Affinité supérieure à l\'Inimitié).' + : 'Un nouveau Rival est créé (Inimitié supérieure à l\'Affinité).'; + } + + let newAffinity = affinityValue + (sc.appliedDeltas.affinity || 0); + let newInimity = inimityValue + (sc.appliedDeltas.inimity || 0); + let newPower = powerValue + (sc.appliedDeltas.power || 0); + let newInfluence = influenceValue + (sc.appliedDeltas.influence || 0); + + affinityValue = clamp(newAffinity, 0, 6); + inimityValue = clamp(newInimity, 0, 6); + powerValue = clamp(newPower, 0, 6); + influenceValue = clamp(newInfluence, 0, 6); + + specialCharacteristics.push(sc); + } + } + } + + const finalRelation = currentRelationKey !== relationKey + ? NPC_RELATIONS[currentRelationKey] + : relation; + + const netScore = affinityValue - inimityValue; + + return { + success: true, + type: 'ally-enemy', + relation: { key: currentRelationKey, label: finalRelation.label, summary: finalRelation.summary }, + originalRelationKey: relationKey, + relationChanged: currentRelationKey !== relationKey, + + affinity: { + formula: currentFormulas.affinity, + roll: affinityRoll?.total ?? 0, + value: affinityValue, + label: getLabel(affinityValue, AFFINITY_LABELS).label, + description: getLabel(affinityValue, AFFINITY_LABELS).description, + }, + inimity: { + formula: currentFormulas.inimity, + roll: inimityRoll?.total ?? 0, + value: inimityValue, + label: getLabel(inimityValue, INIMITY_LABELS).label, + description: getLabel(inimityValue, INIMITY_LABELS).description, + }, + netScore, + + power: { + value: powerValue, + label: getLabel(powerValue, POWER_LABELS).label, + description: getLabel(powerValue, POWER_LABELS).description, + }, + influence: { + value: influenceValue, + label: getLabel(influenceValue, INFLUENCE_LABELS).label, + description: getLabel(influenceValue, INFLUENCE_LABELS).description, + }, + + specialRoll: specialRoll ? { roll: specialRoll.total, triggered: specialRoll.total >= 8 } : null, + specialCharacteristics, + }; +} diff --git a/scripts/data/allyEnemyTables.js b/scripts/data/allyEnemyTables.js new file mode 100644 index 0000000..6266101 --- /dev/null +++ b/scripts/data/allyEnemyTables.js @@ -0,0 +1,95 @@ +export const RELATION_FORMULAS = { + ally: { affinity: '2d6', inimity: '0' }, + contact: { affinity: '1d6+1', inimity: '1d6-1' }, + rival: { affinity: '1d6-1', inimity: '1d6+1' }, + enemy: { affinity: '0', inimity: '2d6' }, +}; + +export const AFFINITY_INIMITY_MAP = { + 2: 0, 3: 1, 4: 1, 5: 2, 6: 2, + 7: 3, 8: 3, 9: 4, 10: 4, 11: 5, 12: 6, +}; + +export const POWER_INFLUENCE_MAP = { + 2: 0, 3: 0, 4: 0, 5: 0, + 6: 1, 7: 1, 8: 2, 9: 3, 10: 4, 11: 5, 12: 6, +}; + +export const AFFINITY_LABELS = [ + { value: 0, label: 'Aucune', description: 'Aucune affinité envers le Voyageur. Peut être un ennemi ou quelqu\'un d\'indifférent selon son Inimitié.' }, + { value: 1, label: 'Vaguement bienveillant', description: 'Bienveillance comparable à celle d\'un inconnu ordinaire. Petits gestes d\'entraide par courtoisie.' }, + { value: 2, label: 'Bienveillant', description: 'Aidera probablement le Voyageur si simple et sans danger, même sans récompense.' }, + { value: 3, label: 'Très bienveillant', description: 'N\'hésitera pas à prendre des risques modérés ou à offrir son aide de son propre chef.' }, + { value: 4, label: 'Ami loyal', description: 'Fera presque tout son possible pour aider, mais peut être retenu par d\'autres loyautés.' }, + { value: 5, label: 'Amour', description: 'Passera très probablement les intérêts du Voyageur avant les siens ou ceux d\'autrui.' }, + { value: 6, label: 'Fanatique', description: 'Fera tout ce que le Voyageur exige, quels que soient les risques.' }, +]; + +export const INIMITY_LABELS = [ + { value: 0, label: 'Aucune', description: 'Aucune inimitié envers le Voyageur.' }, + { value: 1, label: 'Méfiant', description: 'Vaguement mal disposé mais ne fera pas d\'efforts particuliers pour faire obstacle.' }, + { value: 2, label: 'Malveillant', description: 'Peut commettre des actes de malveillance mineurs par pure mesquinerie.' }, + { value: 3, label: 'Très malveillant', description: 'Se donnera du mal pour faire obstacle au Voyageur par simple rancune.' }, + { value: 4, label: 'Haine', description: 'Fera presque tout pour avoir le dessus sur le Voyageur.' }, + { value: 5, label: 'Haine farouche', description: 'Complotera activement ou prendra de grands risques pour nuire au Voyageur.' }, + { value: 6, label: 'Haine aveugle', description: 'Peut s\'engager dans des actions autodestructrices pour nuire au Voyageur.' }, +]; + +export const POWER_LABELS = [ + { value: 0, label: 'Négligeable', description: 'Ne dispose pratiquement d\'aucune ressource mobilisable en dehors de ses possessions personnelles.' }, + { value: 1, label: 'Faible', description: 'Quelques amis ou contacts. Équivalent d\'un groupe de Voyageurs typique.' }, + { value: 2, label: 'Utile', description: 'Possède un atout majeur : petit vaisseau, unité de mercenaires, équipe d\'avocats.' }, + { value: 3, label: 'Modérément puissant', description: 'Ressources très importantes : unité de mercenaires ou entreprise de taille moyenne.' }, + { value: 4, label: 'Puissant', description: 'Atouts majeurs : compagnie de transport marchand ou grand groupe commercial.' }, + { value: 5, label: 'Très puissant', description: 'Pouvoir colossal : haute sphère gouvernementale ou PDG d\'une grande compagnie.' }, + { value: 6, label: 'Acteur majeur', description: 'Pèse sur la politique interstellaire : amiral ou haut dignitaire.' }, +]; + +export const INFLUENCE_LABELS = [ + { value: 0, label: 'Aucune influence', description: 'N\'a pratiquement aucune influence sur qui que ce soit.' }, + { value: 1, label: 'Faible influence', description: 'Peut faire jouer quelques faveurs auprès de fonctionnaires mineurs.' }, + { value: 2, label: 'Influence modérée', description: 'A un ou plusieurs notables locaux « dans la poche ».' }, + { value: 3, label: 'Influent', description: 'Exerce une influence sur des gens de pouvoir (fonctionnaires, négociants).' }, + { value: 4, label: 'Très influent', description: 'Influence interplanétaire, personnalités gouvernementales ou figures de la pègre.' }, + { value: 5, label: 'Extrêmement influent', description: 'Influence interstellaire, pression sur les législateurs.' }, + { value: 6, label: 'Incontournable', description: 'A l\'oreille de personnes extrêmement puissantes (noble dirigeant le sous-secteur).' }, +]; + +export const SPECIAL_CHARACTERISTICS_TABLE = [ + { d66: 11, text: 'Cet individu a des raisons de pardonner au Voyageur ou de l\'apprécier plus que d\'ordinaire.', effects: { affinityMod: 1 } }, + { d66: 12, text: 'Les relations entre le Voyageur et cet individu se sont particulièrement détériorées.', effects: { inimityMod: 1, affinityMod: -1 } }, + { d66: 13, text: 'Un événement a altéré la relation entre le Voyageur et cet associé.', effects: { affinityMod: 1, inimityMod: -1 } }, + { d66: 14, text: 'Un incident augmente l\'Inimitié entre le Voyageur et cet individu.', effects: { inimityMod: 1 } }, + { d66: 15, text: 'La relation devient plus modérée. Un Ennemi devient un Rival et un Allié devient un Contact. Relancez l\'Affinité et l\'Inimitié.', effects: { action: 'moderateRelation' } }, + { d66: 16, text: 'La relation s\'intensifie. Un Rival devient un Ennemi et un Contact devient un Allié. Relancez l\'Affinité et l\'Inimitié.', effects: { action: 'intensifyRelation' } }, + { d66: 21, text: 'Cet individu gagne en pouvoir.', effects: { powerMod: 1 } }, + { d66: 22, text: 'Cet individu perd une partie de sa base de pouvoir.', effects: { powerMod: -1 } }, + { d66: 23, text: 'Cet individu gagne en influence.', effects: { influenceMod: 1 } }, + { d66: 24, text: 'L\'influence de cet individu diminue.', effects: { influenceMod: -1 } }, + { d66: 25, text: 'Cet individu gagne à la fois en pouvoir et en influence.', effects: { powerMod: 1, influenceMod: 1 } }, + { d66: 26, text: 'Cet individu perd à la fois en pouvoir et en influence.', effects: { powerMod: -1, influenceMod: -1 } }, + { d66: 31, text: 'Cet individu appartient à un groupe culturel ou religieux inhabituel.', effects: { action: 'narrativeOnly' } }, + { d66: 32, text: 'Cet individu appartient à une xéno-espèce rare.', effects: { action: 'narrativeOnly' } }, + { d66: 33, text: 'Cet individu est particulièrement atypique (intelligence artificielle ou entité profondément xéno).', effects: { action: 'narrativeOnly' } }, + { d66: 34, text: 'Cet individu représente en réalité une organisation (mouvement politique, entreprise).', effects: { action: 'narrativeOnly' } }, + { d66: 35, text: 'Cet individu est membre d\'une organisation dont la vision est généralement opposée à celle du Voyageur.', effects: { action: 'narrativeOnly' } }, + { d66: 36, text: 'Cet individu est une figure douteuse (criminel, pirate ou noble déchu). Le Voyageur sera jugé par association.', effects: { action: 'narrativeOnly' } }, + { d66: 41, text: 'Le Voyageur et cet individu se sont violemment brouillés. Relancez l\'Inimitié sur 2D et utilisez le nouveau résultat s\'il est supérieur.', effects: { action: 'reRollInimity' } }, + { d66: 42, text: 'Le Voyageur et cet individu se sont réconciliés. Relancez l\'Affinité sur 2D et appliquez le nouveau résultat s\'il est supérieur.', effects: { action: 'reRollAffinity' } }, + { d66: 43, text: 'Cet individu traverse une période difficile.', effects: { powerMod: -1 } }, + { d66: 44, text: 'Cet individu a été ruiné par un malheur causé par le Voyageur.', effects: { action: 'setPowerToZero', inimityMod: 1 } }, + { d66: 45, text: 'Cet individu a gagné en influence grâce à l\'aide du Voyageur.', effects: { influenceMod: 1, affinityMod: 1 } }, + { d66: 46, text: 'Cet individu a gagné du pouvoir aux dépens d\'un tiers qui blâme désormais le Voyageur.', effects: { powerMod: 1, action: 'createEnemy' } }, + { d66: 51, text: 'Cet individu a disparu dans des circonstances suspectes.', effects: { action: 'narrativeOnly' } }, + { d66: 52, text: 'Cet individu est injoignable, occupé à quelque chose d\'intéressant mais sans caractère suspect.', effects: { action: 'narrativeOnly' } }, + { d66: 53, text: 'Cet individu est en grave difficulté et aurait bien besoin de l\'aide du Voyageur.', effects: { action: 'narrativeOnly' } }, + { d66: 54, text: 'Cet individu a récemment bénéficié d\'une chance insolente.', effects: { action: 'narrativeOnly' } }, + { d66: 55, text: 'Cet individu est incarcéré ou piégé quelque part.', effects: { action: 'narrativeOnly' } }, + { d66: 56, text: 'Cet individu est retrouvé ou déclaré mort. Ce n\'est peut-être pas toute la vérité…', effects: { action: 'narrativeOnly' } }, + { d66: 61, text: 'Cet individu s\'est récemment marié ou a vécu un événement bouleversant sa vie.', effects: { action: 'narrativeOnly' } }, + { d66: 62, text: 'Cet individu a été renié par sa famille, a divorcé ou a vécu un événement tragique.', effects: { action: 'narrativeOnly' } }, + { d66: 63, text: 'Les relations de cet individu commencent à affecter le Voyageur. Créez un nouveau Contact si son Affinité est supérieure à son Inimitié, ou un Rival si l\'Inimitié est supérieure.', effects: { action: 'createContactOrRival' } }, + { d66: 64, text: 'La relation entre le Voyageur et cet associé est complètement redéfinie. Alliés↔Ennemis, Rivaux↔Contacts. Échangez les valeurs d\'Affinité et d\'Inimitié.', effects: { action: 'swapAffinityInimity' } }, + { d66: 65, text: 'Tirez deux autres caractéristiques spéciales.', effects: { action: 'extraRolls', actionValue: 2 } }, + { d66: 66, text: 'Tirez trois autres caractéristiques spéciales.', effects: { action: 'extraRolls', actionValue: 3 } }, +]; diff --git a/scripts/npc.js b/scripts/npc.js index 10393ae..7c56ecd 100644 --- a/scripts/npc.js +++ b/scripts/npc.js @@ -37,6 +37,7 @@ Hooks.once('init', () => { `modules/${MODULE_ID}/templates/npc-result.hbs`, `modules/${MODULE_ID}/templates/traveller-npc-dialog.hbs`, `modules/${MODULE_ID}/templates/traveller-npc-result.hbs`, + `modules/${MODULE_ID}/templates/ally-enemy-result.hbs`, ]); } diff --git a/scripts/tests/allyEnemyGenerator.test.js b/scripts/tests/allyEnemyGenerator.test.js new file mode 100644 index 0000000..1030290 --- /dev/null +++ b/scripts/tests/allyEnemyGenerator.test.js @@ -0,0 +1,161 @@ +import { strict as assert } from 'assert'; +import { + RELATION_FORMULAS, + AFFINITY_INIMITY_MAP, + POWER_INFLUENCE_MAP, + AFFINITY_LABELS, + INIMITY_LABELS, + POWER_LABELS, + INFLUENCE_LABELS, + SPECIAL_CHARACTERISTICS_TABLE, +} from '../data/allyEnemyTables.js'; + +import { mapRollToValue, getLabel, clamp } from '../allyEnemyGenerator.js'; + +let passed = 0; +let failed = 0; + +function test(name, fn) { + try { + fn(); + passed++; + console.log(` PASS ${name}`); + } catch (e) { + failed++; + console.error(` FAIL ${name}\n ${e.message}`); + } +} + +function assertEqual(actual, expected, msg) { + assert.strictEqual(actual, expected, msg || `expected ${expected}, got ${actual}`); +} + +// ────────────────────────────────────── +console.log('\nmapRollToValue'); +// ────────────────────────────────────── +test('maps 2→0', () => assertEqual(mapRollToValue(2, AFFINITY_INIMITY_MAP), 0)); +test('maps 3→1', () => assertEqual(mapRollToValue(3, AFFINITY_INIMITY_MAP), 1)); +test('maps 5→2', () => assertEqual(mapRollToValue(5, AFFINITY_INIMITY_MAP), 2)); +test('maps 7→3', () => assertEqual(mapRollToValue(7, AFFINITY_INIMITY_MAP), 3)); +test('maps 9→4', () => assertEqual(mapRollToValue(9, AFFINITY_INIMITY_MAP), 4)); +test('maps 11→5', () => assertEqual(mapRollToValue(11, AFFINITY_INIMITY_MAP), 5)); +test('maps 12→6', () => assertEqual(mapRollToValue(12, AFFINITY_INIMITY_MAP), 6)); +test('unknown roll → 0', () => assertEqual(mapRollToValue(13, AFFINITY_INIMITY_MAP), 0)); + +test('power 2-5→0', () => { assertEqual(mapRollToValue(2, POWER_INFLUENCE_MAP), 0); assertEqual(mapRollToValue(5, POWER_INFLUENCE_MAP), 0); }); +test('power 6-7→1', () => { assertEqual(mapRollToValue(6, POWER_INFLUENCE_MAP), 1); assertEqual(mapRollToValue(7, POWER_INFLUENCE_MAP), 1); }); +test('power 8→2', () => assertEqual(mapRollToValue(8, POWER_INFLUENCE_MAP), 2)); +test('power 9→3', () => assertEqual(mapRollToValue(9, POWER_INFLUENCE_MAP), 3)); +test('power 10→4', () => assertEqual(mapRollToValue(10, POWER_INFLUENCE_MAP), 4)); +test('power 11→5', () => assertEqual(mapRollToValue(11, POWER_INFLUENCE_MAP), 5)); +test('power 12→6', () => assertEqual(mapRollToValue(12, POWER_INFLUENCE_MAP), 6)); + +// ────────────────────────────────────── +console.log('\ngetLabel'); +// ────────────────────────────────────── +test('finds matching affinity label', () => { + assertEqual(getLabel(3, AFFINITY_LABELS).label, 'Très bienveillant'); +}); + +test('returns first for out-of-range', () => { + assertEqual(getLabel(99, AFFINITY_LABELS).label, 'Aucune'); +}); + +test('finds inimity label', () => { + assertEqual(getLabel(4, INIMITY_LABELS).label, 'Haine'); +}); + +test('finds power label', () => { + assertEqual(getLabel(5, POWER_LABELS).label, 'Très puissant'); +}); + +test('finds influence label', () => { + assertEqual(getLabel(2, INFLUENCE_LABELS).label, 'Influence modérée'); +}); + +// ────────────────────────────────────── +console.log('\nclamp'); +// ────────────────────────────────────── +test('within range', () => assertEqual(clamp(3, 0, 6), 3)); +test('below min', () => assertEqual(clamp(-1, 0, 6), 0)); +test('above max', () => assertEqual(clamp(7, 0, 6), 6)); +test('edge min', () => assertEqual(clamp(0, 0, 6), 0)); +test('edge max', () => assertEqual(clamp(6, 0, 6), 6)); + +// ────────────────────────────────────── +console.log('\nRELATION_FORMULAS'); +// ────────────────────────────────────── +test('ally: 2d6 affinity, 0 inimity', () => { + assertEqual(RELATION_FORMULAS.ally.affinity, '2d6'); + assertEqual(RELATION_FORMULAS.ally.inimity, '0'); +}); + +test('contact: 1d6+1 affinity, 1d6-1 inimity', () => { + assertEqual(RELATION_FORMULAS.contact.affinity, '1d6+1'); + assertEqual(RELATION_FORMULAS.contact.inimity, '1d6-1'); +}); + +test('rival: 1d6-1 affinity, 1d6+1 inimity', () => { + assertEqual(RELATION_FORMULAS.rival.affinity, '1d6-1'); + assertEqual(RELATION_FORMULAS.rival.inimity, '1d6+1'); +}); + +test('enemy: 0 affinity, 2d6 inimity', () => { + assertEqual(RELATION_FORMULAS.enemy.affinity, '0'); + assertEqual(RELATION_FORMULAS.enemy.inimity, '2d6'); +}); + +// ────────────────────────────────────── +console.log('\nLABELS — array lengths'); +// ────────────────────────────────────── +test('AFFINITY_LABELS has 7 entries', () => assertEqual(AFFINITY_LABELS.length, 7)); +test('INIMITY_LABELS has 7 entries', () => assertEqual(INIMITY_LABELS.length, 7)); +test('POWER_LABELS has 7 entries', () => assertEqual(POWER_LABELS.length, 7)); +test('INFLUENCE_LABELS has 7 entries', () => assertEqual(INFLUENCE_LABELS.length, 7)); + +// ────────────────────────────────────── +console.log('\nSPECIAL_CHARACTERISTICS_TABLE'); +// ────────────────────────────────────── +test('has 36 D66 entries', () => assertEqual(SPECIAL_CHARACTERISTICS_TABLE.length, 36)); + +test('all entries have valid D66 range', () => { + for (const e of SPECIAL_CHARACTERISTICS_TABLE) { + if (e.d66 < 11 || e.d66 > 66) throw new Error(`entry d66=${e.d66} out of range`); + if (!e.text) throw new Error(`entry d66=${e.d66} missing text`); + if (!e.effects) throw new Error(`entry d66=${e.d66} missing effects`); + } +}); + +test('D66 65 is extraRolls 2', () => { + const e = SPECIAL_CHARACTERISTICS_TABLE.find(x => x.d66 === 65); + assertEqual(e.effects.action, 'extraRolls'); + assertEqual(e.effects.actionValue, 2); +}); + +test('D66 66 is extraRolls 3', () => { + const e = SPECIAL_CHARACTERISTICS_TABLE.find(x => x.d66 === 66); + assertEqual(e.effects.action, 'extraRolls'); + assertEqual(e.effects.actionValue, 3); +}); + +test('D66 11 has affinityMod 1', () => { + const e = SPECIAL_CHARACTERISTICS_TABLE.find(x => x.d66 === 11); + assertEqual(e.effects.affinityMod, 1); +}); + +test('D66 44 has setPowerToZero + inimityMod 1', () => { + const e = SPECIAL_CHARACTERISTICS_TABLE.find(x => x.d66 === 44); + assertEqual(e.effects.action, 'setPowerToZero'); + assertEqual(e.effects.inimityMod, 1); +}); + +// ────────────────────────────────────── +console.log('\n'); +// ────────────────────────────────────── + +if (failed > 0) { + console.error(`\n ${failed} of ${passed + failed} tests FAILED\n`); + process.exit(1); +} else { + console.log(` All ${passed} tests passed\n`); +} diff --git a/styles/npc.css b/styles/npc.css index 91c3e3e..49359b1 100644 --- a/styles/npc.css +++ b/styles/npc.css @@ -330,6 +330,65 @@ button.btn-calculate:hover, background: #eef8ee; } +/* === MGT2 Alliés & Ennemis (result chat) ================================== */ + +.ae-special-entry { + background: #fbf8f1; + border: 1px solid #d7ccb0; + border-radius: 4px; + padding: 7px 9px; + margin: 6px 0; + font-size: 0.85em; +} + +.ae-special-header { + display: flex; + gap: 6px; + align-items: baseline; + font-weight: 500; + color: #222; +} + +.ae-special-detail { + margin-top: 4px; + color: #555; + font-size: 0.92em; + padding-left: 2px; +} + +.ae-narrative { + font-style: italic; + color: #6a5422; +} + +.ae-special-mods { + display: flex; + flex-wrap: wrap; + gap: 4px; + margin-top: 5px; +} + +.ae-mod { + display: inline-flex; + align-items: center; + padding: 1px 7px; + border-radius: 3px; + font-size: 0.82em; + font-weight: bold; +} + +.ae-mod-pos { + background: #dff0d8; + color: #2a6a2a; + border: 1px solid #b8d498; +} + +.ae-mod-neg { + background: #fce4e4; + color: #a33; + border: 1px solid #e8b4b4; +} + /* === MGT2 Sector Map ====================================================== */ #mgt2-sector-map .window-content { diff --git a/templates/ally-enemy-result.hbs b/templates/ally-enemy-result.hbs new file mode 100644 index 0000000..b302cc5 --- /dev/null +++ b/templates/ally-enemy-result.hbs @@ -0,0 +1,97 @@ +
+
+

+ + {{#if relationChanged}} + {{lookupRelationKey originalRelationKey}} → {{relation.label}} + {{else}} + {{relation.label}} + {{/if}} +

+
+ +
+ {{relation.label}} + Score net : {{netScore}} +
+ +
+
+
Affinité ({{affinity.value}}/6)
+
{{affinity.formula}} → {{affinity.roll}}
+
{{affinity.label}}
+
{{affinity.description}}
+
+
+
Inimitié ({{inimity.value}}/6)
+
{{inimity.formula}} → {{inimity.roll}}
+
-{{inimity.value}} — {{inimity.label}}
+
{{inimity.description}}
+
+
+ +
+
+
Pouvoir ({{power.value}}/6)
+
{{power.label}}
+
{{power.description}}
+
+
+
Influence ({{influence.value}}/6)
+
{{influence.label}}
+
{{influence.description}}
+
+
+ + {{#if specialCharacteristics.length}} +
+
Caractéristiques spéciales
+ {{#each specialCharacteristics}} +
+
+ D{{d66}} + {{text}} +
+ {{#if rerollNote}} +
{{rerollNote}}
+ {{/if}} + {{#if swapNote}} +
{{swapNote}}
+ {{/if}} + {{#if narrativeText}} +
{{narrativeText}}
+ {{/if}} + {{#if newRelationKey}} +
La relation devient : {{lookupRelationKey newRelationKey}}
+ {{/if}} +
+ {{#if appliedDeltas.affinity}} + + Affinité {{formatSigned appliedDeltas.affinity}} + + {{/if}} + {{#if appliedDeltas.inimity}} + + Inimitié {{formatSigned appliedDeltas.inimity}} + + {{/if}} + {{#if appliedDeltas.power}} + + Pouvoir {{formatSigned appliedDeltas.power}} + + {{/if}} + {{#if appliedDeltas.influence}} + + Influence {{formatSigned appliedDeltas.influence}} + + {{/if}} +
+
+ {{/each}} +
+ {{/if}} + + +
diff --git a/templates/npc-dialog.hbs b/templates/npc-dialog.hbs index ec3991f..db7b678 100644 --- a/templates/npc-dialog.hbs +++ b/templates/npc-dialog.hbs @@ -13,6 +13,9 @@ PNJ Détaillé + + Alliés & Ennemis +
@@ -232,6 +235,62 @@ + +
+

Alliés, Contacts, Rivaux et Ennemis

+

Génère une relation avec Affinité, Inimitié, Pouvoir et Influence selon les règles du Livre de l'Équipage.

+ +
+ Type de relation +
+
+ + +
+
+
+ +
+
+ +
+ Création de fiche d'acteur + +
+ +
+ +
+
+ + +
+
+ +
+ +
+
+ + +