Ready for release
Release Creation / build (release) Successful in 43s

This commit is contained in:
2026-06-12 20:53:44 +02:00
parent efe37b8a96
commit a53c7ace53
98 changed files with 1171 additions and 289 deletions
+4
View File
@@ -0,0 +1,4 @@
module.exports = {
testMatch: ['**/scripts/tests/*.test.js'],
transform: {},
};
+71 -1
View File
@@ -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"
}
}
]
}
+4
View File
@@ -0,0 +1,4 @@
{
"type": "module",
"private": true
}
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000100
MANIFEST-000132
+8 -3
View File
@@ -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)
+8 -8
View File
@@ -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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000199
MANIFEST-000231
+8 -3
View File
@@ -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)
+8 -8
View File
@@ -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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000083
MANIFEST-000115
+8 -3
View File
@@ -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)
+8 -8
View File
@@ -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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000202
MANIFEST-000234
+8 -3
View File
@@ -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)
+8 -8
View File
@@ -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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000136
MANIFEST-000168
+7 -3
View File
@@ -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)
+7 -7
View File
@@ -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)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000144
MANIFEST-000176
+8 -3
View File
@@ -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)
+8 -8
View File
@@ -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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000136
MANIFEST-000168
+7 -3
View File
@@ -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)
+7 -7
View File
@@ -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)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000117
MANIFEST-000149
+8 -3
View File
@@ -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)
+8 -8
View File
@@ -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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000144
MANIFEST-000176
+8 -3
View File
@@ -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)
+8 -8
View File
@@ -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)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000136
MANIFEST-000168
+7 -3
View File
@@ -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)
+7 -7
View File
@@ -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)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000144
MANIFEST-000176
+8 -3
View File
@@ -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)
+8 -8
View File
@@ -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)
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
MANIFEST-000014
View File
+8
View File
@@ -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)
+8
View File
@@ -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)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000171
MANIFEST-000291
+19 -104
View File
@@ -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)
+19 -39
View File
@@ -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)
Binary file not shown.
Binary file not shown.
View File
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000090
MANIFEST-000122
+8 -3
View File
@@ -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)
+8 -8
View File
@@ -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)
+89 -3
View File
@@ -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('<i class="fas fa-spinner fa-spin"></i> 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));
}
+277
View File
@@ -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,
};
}
+95
View File
@@ -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 } },
];
+1
View File
@@ -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`,
]);
}
+161
View File
@@ -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`);
}
+59
View File
@@ -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 {
+97
View File
@@ -0,0 +1,97 @@
<div class="mgt2-npc-result">
<div class="npc-header">
<h3>
<i class="fas fa-handshake"></i>
{{#if relationChanged}}
{{lookupRelationKey originalRelationKey}}{{relation.label}}
{{else}}
{{relation.label}}
{{/if}}
</h3>
</div>
<div class="npc-pill-row">
<span class="npc-pill">{{relation.label}}</span>
<span class="npc-pill npc-pill-muted">Score net : {{netScore}}</span>
</div>
<div class="npc-card-grid">
<div class="npc-card-block">
<div class="npc-card-title">Affinité ({{affinity.value}}/6)</div>
<div class="npc-roll-line">{{affinity.formula}}{{affinity.roll}}</div>
<div class="npc-card-value">{{affinity.label}}</div>
<div class="npc-subline">{{affinity.description}}</div>
</div>
<div class="npc-card-block">
<div class="npc-card-title">Inimitié ({{inimity.value}}/6)</div>
<div class="npc-roll-line">{{inimity.formula}}{{inimity.roll}}</div>
<div class="npc-card-value">-{{inimity.value}}{{inimity.label}}</div>
<div class="npc-subline">{{inimity.description}}</div>
</div>
</div>
<div class="npc-card-grid">
<div class="npc-card-block">
<div class="npc-card-title">Pouvoir ({{power.value}}/6)</div>
<div class="npc-card-value">{{power.label}}</div>
<div class="npc-subline">{{power.description}}</div>
</div>
<div class="npc-card-block">
<div class="npc-card-title">Influence ({{influence.value}}/6)</div>
<div class="npc-card-value">{{influence.label}}</div>
<div class="npc-subline">{{influence.description}}</div>
</div>
</div>
{{#if specialCharacteristics.length}}
<div class="npc-section">
<div class="npc-section-title">Caractéristiques spéciales</div>
{{#each specialCharacteristics}}
<div class="ae-special-entry">
<div class="ae-special-header">
<span class="npc-inline-roll">D{{d66}}</span>
<span>{{text}}</span>
</div>
{{#if rerollNote}}
<div class="ae-special-detail">{{rerollNote}}</div>
{{/if}}
{{#if swapNote}}
<div class="ae-special-detail">{{swapNote}}</div>
{{/if}}
{{#if narrativeText}}
<div class="ae-special-detail ae-narrative">{{narrativeText}}</div>
{{/if}}
{{#if newRelationKey}}
<div class="ae-special-detail">La relation devient : {{lookupRelationKey newRelationKey}}</div>
{{/if}}
<div class="ae-special-mods">
{{#if appliedDeltas.affinity}}
<span class="ae-mod ae-mod-{{#if (gt appliedDeltas.affinity 0)}}pos{{else}}neg{{/if}}">
Affinité {{formatSigned appliedDeltas.affinity}}
</span>
{{/if}}
{{#if appliedDeltas.inimity}}
<span class="ae-mod ae-mod-{{#if (gt appliedDeltas.inimity 0)}}pos{{else}}neg{{/if}}">
Inimitié {{formatSigned appliedDeltas.inimity}}
</span>
{{/if}}
{{#if appliedDeltas.power}}
<span class="ae-mod ae-mod-{{#if (gt appliedDeltas.power 0)}}pos{{else}}neg{{/if}}">
Pouvoir {{formatSigned appliedDeltas.power}}
</span>
{{/if}}
{{#if appliedDeltas.influence}}
<span class="ae-mod ae-mod-{{#if (gt appliedDeltas.influence 0)}}pos{{else}}neg{{/if}}">
Influence {{formatSigned appliedDeltas.influence}}
</span>
{{/if}}
</div>
</div>
{{/each}}
</div>
{{/if}}
<div class="npc-footer">
<small>Généré par le module {{MODULE_ID}}</small>
</div>
</div>
+59
View File
@@ -13,6 +13,9 @@
<a class="item {{#if (eq activeTab "traveller")}}active{{/if}}" data-tab="traveller">
<i class="fas fa-user-astronaut"></i> PNJ Détaillé
</a>
<a class="item {{#if (eq activeTab "ally-enemy")}}active{{/if}}" data-tab="ally-enemy">
<i class="fas fa-handshake"></i> Alliés & Ennemis
</a>
</nav>
<section class="tab-content">
@@ -232,6 +235,62 @@
</button>
</div>
</div>
<div class="tab {{#if (eq activeTab "ally-enemy")}}active{{/if}}" data-tab="ally-enemy">
<h3><i class="fas fa-handshake"></i> Alliés, Contacts, Rivaux et Ennemis</h3>
<p class="npc-intro">Génère une relation avec Affinité, Inimitié, Pouvoir et Influence selon les règles du Livre de l'Équipage.</p>
<fieldset>
<legend>Type de relation</legend>
<div class="form-group-row">
<div class="form-group">
<label for="ae-relation">Relation de base</label>
<select id="ae-relation" name="ae.relation">
{{#each relations}}
<option value="{{key}}" {{#if (eq ../ae.relation key)}}selected{{/if}}>{{label}}</option>
{{/each}}
</select>
</div>
</div>
<div class="form-group checkbox-group">
<label>
<input type="checkbox" name="ae.includeSpecial" {{#if ae.includeSpecial}}checked{{/if}}>
Inclure les caractéristiques spéciales (jet 2D, 8+)
</label>
</div>
</fieldset>
<fieldset>
<legend>Création de fiche d'acteur</legend>
<div class="form-group checkbox-group">
<label>
<input type="checkbox" name="ae.createActor" {{#if ae.createActor}}checked{{/if}}>
Créer une fiche PNJ dans les Acteurs
</label>
</div>
<div class="form-group-row">
<div class="form-group">
<label for="ae-actorName">Nom de la fiche <span class="hint">(facultatif)</span></label>
<input id="ae-actorName" name="ae.actorName" type="text" value="{{ae.actorName}}" placeholder="PNJ — Rival">
</div>
</div>
<div class="form-group checkbox-group">
<label>
<input type="checkbox" name="ae.openCreatedActor" {{#if ae.openCreatedActor}}checked{{/if}}>
Ouvrir automatiquement la fiche créée
</label>
</div>
</fieldset>
<div class="form-footer">
<button type="button" class="btn-calculate" data-action="generate-ally-enemy">
<i class="fas fa-dice-d6"></i> Générer la relation
</button>
</div>
</div>
</section>
</form>