Compare commits
8 Commits
2.3.0
...
f4ba85bcb9
| Author | SHA1 | Date | |
|---|---|---|---|
| f4ba85bcb9 | |||
| 47442be3ef | |||
| 8882cf8ee2 | |||
| 00bcc775fe | |||
| 5a4d4c45dc | |||
| 7fc8d2c09c | |||
| bfe24812bd | |||
| 746f9e23bb |
+5
-1
@@ -7,18 +7,22 @@
|
|||||||
"verified": "13",
|
"verified": "13",
|
||||||
"maximum": "14"
|
"maximum": "14"
|
||||||
},
|
},
|
||||||
|
"socket": "true",
|
||||||
"description": "Module de compendium et d'outils Mongoose Traveller 2e pour FoundryVTT écrit par JdR.Ninja.\nInclut les commandes /commerce, /pnj, /rencontre et /mission pour automatiser le commerce, les PNJ rapides, les rencontres et les contrats aléatoires. La fenêtre /pnj inclut un onglet 'PNJ Détaillé' pour la génération de PNJ Traveller selon les règles du générateur officiel, en s'appuyant sur les compétences natives des fiches.",
|
"description": "Module de compendium et d'outils Mongoose Traveller 2e pour FoundryVTT écrit par JdR.Ninja.\nInclut les commandes /commerce, /pnj, /rencontre et /mission pour automatiser le commerce, les PNJ rapides, les rencontres et les contrats aléatoires. La fenêtre /pnj inclut un onglet 'PNJ Détaillé' pour la génération de PNJ Traveller selon les règles du générateur officiel, en s'appuyant sur les compétences natives des fiches.",
|
||||||
"esmodules": [
|
"esmodules": [
|
||||||
|
"scripts/batchNpcCreator.js",
|
||||||
"scripts/commerce.js",
|
"scripts/commerce.js",
|
||||||
"scripts/npc.js",
|
"scripts/npc.js",
|
||||||
"scripts/sector.js",
|
"scripts/sector.js",
|
||||||
|
"scripts/sectorSocket.js",
|
||||||
"scripts/utils/travellerNpcUtils.js",
|
"scripts/utils/travellerNpcUtils.js",
|
||||||
"scripts/data/travellerNpcGenerator.js",
|
"scripts/data/travellerNpcGenerator.js",
|
||||||
"scripts/travellerNpcGenerator.js",
|
"scripts/travellerNpcGenerator.js",
|
||||||
"scripts/TravellerNpcDialog.js",
|
"scripts/TravellerNpcDialog.js",
|
||||||
"scripts/mgt2eMigration.js",
|
"scripts/mgt2eMigration.js",
|
||||||
"scripts/npcRollTableSync.js",
|
"scripts/npcRollTableSync.js",
|
||||||
"scripts/mgt2eSkills.js"
|
"scripts/mgt2eSkills.js",
|
||||||
|
"scripts/imperialCalendar.js"
|
||||||
],
|
],
|
||||||
"styles": [
|
"styles": [
|
||||||
"styles/commerce.css",
|
"styles/commerce.css",
|
||||||
|
|||||||
+1
-1
@@ -1 +1 @@
|
|||||||
MANIFEST-000132
|
MANIFEST-000180
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:52:58.023135 7fc410ffe6c0 Recovering log #130
|
2026/07/25-16:54:40.235374 7fb397fff6c0 Recovering log #178
|
||||||
2026/06/12-20:52:58.033792 7fc410ffe6c0 Delete type=3 #128
|
2026/07/25-16:54:40.246219 7fb397fff6c0 Delete type=3 #176
|
||||||
2026/06/12-20:52:58.033845 7fc410ffe6c0 Delete type=0 #130
|
2026/07/25-16:54:40.246321 7fb397fff6c0 Delete type=0 #178
|
||||||
2026/06/12-20:53:22.703483 7fc3c11be6c0 Level-0 table #135: started
|
2026/07/25-17:22:36.365586 7fb394b4f6c0 Level-0 table #183: started
|
||||||
2026/06/12-20:53:22.703533 7fc3c11be6c0 Level-0 table #135: 0 bytes OK
|
2026/07/25-17:22:36.365618 7fb394b4f6c0 Level-0 table #183: 0 bytes OK
|
||||||
2026/06/12-20:53:22.710309 7fc3c11be6c0 Delete type=0 #133
|
2026/07/25-17:22:36.372300 7fb394b4f6c0 Delete type=0 #181
|
||||||
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/07/25-17:22:36.379902 7fb394b4f6c0 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)
|
2026/07/25-17:22:36.380052 7fb394b4f6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:51:44.594732 7fc3c3fff6c0 Recovering log #126
|
2026/07/25-16:21:45.460294 7fb3977fe6c0 Recovering log #174
|
||||||
2026/06/12-20:51:44.605104 7fc3c3fff6c0 Delete type=3 #124
|
2026/07/25-16:21:45.470482 7fb3977fe6c0 Delete type=3 #172
|
||||||
2026/06/12-20:51:44.605163 7fc3c3fff6c0 Delete type=0 #126
|
2026/07/25-16:21:45.470569 7fb3977fe6c0 Delete type=0 #174
|
||||||
2026/06/12-20:52:05.597166 7fc3c11be6c0 Level-0 table #131: started
|
2026/07/25-16:34:16.350463 7fb394b4f6c0 Level-0 table #179: started
|
||||||
2026/06/12-20:52:05.597184 7fc3c11be6c0 Level-0 table #131: 0 bytes OK
|
2026/07/25-16:34:16.350531 7fb394b4f6c0 Level-0 table #179: 0 bytes OK
|
||||||
2026/06/12-20:52:05.604422 7fc3c11be6c0 Delete type=0 #129
|
2026/07/25-16:34:16.357551 7fb394b4f6c0 Delete type=0 #177
|
||||||
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/07/25-16:34:16.510151 7fb394b4f6c0 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)
|
2026/07/25-16:34:16.680246 7fb394b4f6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000231
|
MANIFEST-000279
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:52:57.899810 7fc3c37fe6c0 Recovering log #229
|
2026/07/25-16:54:40.104032 7fb3e4fff6c0 Recovering log #277
|
||||||
2026/06/12-20:52:57.911135 7fc3c37fe6c0 Delete type=3 #227
|
2026/07/25-16:54:40.114576 7fb3e4fff6c0 Delete type=3 #275
|
||||||
2026/06/12-20:52:57.911180 7fc3c37fe6c0 Delete type=0 #229
|
2026/07/25-16:54:40.114680 7fb3e4fff6c0 Delete type=0 #277
|
||||||
2026/06/12-20:53:22.642554 7fc3c11be6c0 Level-0 table #234: started
|
2026/07/25-17:22:36.288710 7fb394b4f6c0 Level-0 table #282: started
|
||||||
2026/06/12-20:53:22.642590 7fc3c11be6c0 Level-0 table #234: 0 bytes OK
|
2026/07/25-17:22:36.288757 7fb394b4f6c0 Level-0 table #282: 0 bytes OK
|
||||||
2026/06/12-20:53:22.648801 7fc3c11be6c0 Delete type=0 #232
|
2026/07/25-17:22:36.295586 7fb394b4f6c0 Delete type=0 #280
|
||||||
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/07/25-17:22:36.302495 7fb394b4f6c0 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)
|
2026/07/25-17:22:36.302790 7fb394b4f6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:51:44.470883 7fc3c37fe6c0 Recovering log #225
|
2026/07/25-16:21:45.335501 7fb397fff6c0 Recovering log #273
|
||||||
2026/06/12-20:51:44.481326 7fc3c37fe6c0 Delete type=3 #223
|
2026/07/25-16:21:45.346461 7fb397fff6c0 Delete type=3 #271
|
||||||
2026/06/12-20:51:44.481382 7fc3c37fe6c0 Delete type=0 #225
|
2026/07/25-16:21:45.346548 7fb397fff6c0 Delete type=0 #273
|
||||||
2026/06/12-20:52:05.534179 7fc3c11be6c0 Level-0 table #230: started
|
2026/07/25-16:34:16.287513 7fb394b4f6c0 Level-0 table #278: started
|
||||||
2026/06/12-20:52:05.534214 7fc3c11be6c0 Level-0 table #230: 0 bytes OK
|
2026/07/25-16:34:16.287557 7fb394b4f6c0 Level-0 table #278: 0 bytes OK
|
||||||
2026/06/12-20:52:05.540979 7fc3c11be6c0 Delete type=0 #228
|
2026/07/25-16:34:16.294033 7fb394b4f6c0 Delete type=0 #276
|
||||||
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/07/25-16:34:16.294225 7fb394b4f6c0 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)
|
2026/07/25-16:34:16.301494 7fb394b4f6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000115
|
MANIFEST-000163
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:52:58.051634 7fc410ffe6c0 Recovering log #113
|
2026/07/25-16:54:40.265755 7fb397fff6c0 Recovering log #161
|
||||||
2026/06/12-20:52:58.062421 7fc410ffe6c0 Delete type=3 #111
|
2026/07/25-16:54:40.276688 7fb397fff6c0 Delete type=3 #159
|
||||||
2026/06/12-20:52:58.062480 7fc410ffe6c0 Delete type=0 #113
|
2026/07/25-16:54:40.276786 7fb397fff6c0 Delete type=0 #161
|
||||||
2026/06/12-20:53:22.717098 7fc3c11be6c0 Level-0 table #118: started
|
2026/07/25-17:22:36.380101 7fb394b4f6c0 Level-0 table #166: started
|
||||||
2026/06/12-20:53:22.717122 7fc3c11be6c0 Level-0 table #118: 0 bytes OK
|
2026/07/25-17:22:36.380168 7fb394b4f6c0 Level-0 table #166: 0 bytes OK
|
||||||
2026/06/12-20:53:22.724248 7fc3c11be6c0 Delete type=0 #116
|
2026/07/25-17:22:36.386681 7fb394b4f6c0 Delete type=0 #164
|
||||||
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/07/25-17:22:36.535741 7fb394b4f6c0 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)
|
2026/07/25-17:22:36.806569 7fb394b4f6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:51:44.625465 7fc3c37fe6c0 Recovering log #109
|
2026/07/25-16:21:45.488403 7fb397fff6c0 Recovering log #157
|
||||||
2026/06/12-20:51:44.635539 7fc3c37fe6c0 Delete type=3 #107
|
2026/07/25-16:21:45.499075 7fb397fff6c0 Delete type=3 #155
|
||||||
2026/06/12-20:51:44.635595 7fc3c37fe6c0 Delete type=0 #109
|
2026/07/25-16:21:45.499160 7fb397fff6c0 Delete type=0 #157
|
||||||
2026/06/12-20:52:05.611307 7fc3c11be6c0 Level-0 table #114: started
|
2026/07/25-16:34:16.357718 7fb394b4f6c0 Level-0 table #162: started
|
||||||
2026/06/12-20:52:05.611325 7fc3c11be6c0 Level-0 table #114: 0 bytes OK
|
2026/07/25-16:34:16.357749 7fb394b4f6c0 Level-0 table #162: 0 bytes OK
|
||||||
2026/06/12-20:52:05.618732 7fc3c11be6c0 Delete type=0 #112
|
2026/07/25-16:34:16.364285 7fb394b4f6c0 Delete type=0 #160
|
||||||
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/07/25-16:34:16.510175 7fb394b4f6c0 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)
|
2026/07/25-16:34:16.680277 7fb394b4f6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000234
|
MANIFEST-000282
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:52:57.913632 7fc410ffe6c0 Recovering log #232
|
2026/07/25-16:54:40.118657 7fb3977fe6c0 Recovering log #280
|
||||||
2026/06/12-20:52:57.923055 7fc410ffe6c0 Delete type=3 #230
|
2026/07/25-16:54:40.129567 7fb3977fe6c0 Delete type=3 #278
|
||||||
2026/06/12-20:52:57.923103 7fc410ffe6c0 Delete type=0 #232
|
2026/07/25-16:54:40.129662 7fb3977fe6c0 Delete type=0 #280
|
||||||
2026/06/12-20:53:22.662427 7fc3c11be6c0 Level-0 table #237: started
|
2026/07/25-17:22:36.295712 7fb394b4f6c0 Level-0 table #285: started
|
||||||
2026/06/12-20:53:22.662456 7fc3c11be6c0 Level-0 table #237: 0 bytes OK
|
2026/07/25-17:22:36.295740 7fb394b4f6c0 Level-0 table #285: 0 bytes OK
|
||||||
2026/06/12-20:53:22.669591 7fc3c11be6c0 Delete type=0 #235
|
2026/07/25-17:22:36.302356 7fb394b4f6c0 Delete type=0 #283
|
||||||
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/07/25-17:22:36.302757 7fb394b4f6c0 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)
|
2026/07/25-17:22:36.317403 7fb394b4f6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:51:44.484787 7fc410ffe6c0 Recovering log #228
|
2026/07/25-16:21:45.349559 7fb396ffd6c0 Recovering log #276
|
||||||
2026/06/12-20:51:44.494717 7fc410ffe6c0 Delete type=3 #226
|
2026/07/25-16:21:45.359598 7fb396ffd6c0 Delete type=3 #274
|
||||||
2026/06/12-20:51:44.494769 7fc410ffe6c0 Delete type=0 #228
|
2026/07/25-16:21:45.359698 7fb396ffd6c0 Delete type=0 #276
|
||||||
2026/06/12-20:52:05.541367 7fc3c11be6c0 Level-0 table #233: started
|
2026/07/25-16:34:16.308405 7fb394b4f6c0 Level-0 table #281: started
|
||||||
2026/06/12-20:52:05.541402 7fc3c11be6c0 Level-0 table #233: 0 bytes OK
|
2026/07/25-16:34:16.308432 7fb394b4f6c0 Level-0 table #281: 0 bytes OK
|
||||||
2026/06/12-20:52:05.548343 7fc3c11be6c0 Delete type=0 #231
|
2026/07/25-16:34:16.316009 7fb394b4f6c0 Delete type=0 #279
|
||||||
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/07/25-16:34:16.322893 7fb394b4f6c0 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)
|
2026/07/25-16:34:16.323046 7fb394b4f6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000168
|
MANIFEST-000216
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/06/12-20:52:57.981469 7fc410ffe6c0 Recovering log #166
|
2026/07/25-16:54:40.192611 7fb3e4fff6c0 Recovering log #214
|
||||||
2026/06/12-20:52:57.992240 7fc410ffe6c0 Delete type=3 #164
|
2026/07/25-16:54:40.203144 7fb3e4fff6c0 Delete type=3 #212
|
||||||
2026/06/12-20:52:57.992286 7fc410ffe6c0 Delete type=0 #166
|
2026/07/25-16:54:40.203218 7fb3e4fff6c0 Delete type=0 #214
|
||||||
2026/06/12-20:53:22.676645 7fc3c11be6c0 Level-0 table #171: started
|
2026/07/25-17:22:36.334207 7fb394b4f6c0 Level-0 table #219: started
|
||||||
2026/06/12-20:53:22.676670 7fc3c11be6c0 Level-0 table #171: 0 bytes OK
|
2026/07/25-17:22:36.334237 7fb394b4f6c0 Level-0 table #219: 0 bytes OK
|
||||||
2026/06/12-20:53:22.683046 7fc3c11be6c0 Delete type=0 #169
|
2026/07/25-17:22:36.344490 7fb394b4f6c0 Delete type=0 #217
|
||||||
2026/06/12-20:53:22.703339 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/07/25-17:22:36.358562 7fb394b4f6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/06/12-20:51:44.553830 7fc3c37fe6c0 Recovering log #162
|
2026/07/25-16:21:45.418689 7fb397fff6c0 Recovering log #210
|
||||||
2026/06/12-20:51:44.563465 7fc3c37fe6c0 Delete type=3 #160
|
2026/07/25-16:21:45.429568 7fb397fff6c0 Delete type=3 #208
|
||||||
2026/06/12-20:51:44.563519 7fc3c37fe6c0 Delete type=0 #162
|
2026/07/25-16:21:45.429651 7fb397fff6c0 Delete type=0 #210
|
||||||
2026/06/12-20:52:05.576474 7fc3c11be6c0 Level-0 table #167: started
|
2026/07/25-16:34:16.329833 7fb394b4f6c0 Level-0 table #215: started
|
||||||
2026/06/12-20:52:05.576496 7fc3c11be6c0 Level-0 table #167: 0 bytes OK
|
2026/07/25-16:34:16.329859 7fb394b4f6c0 Level-0 table #215: 0 bytes OK
|
||||||
2026/06/12-20:52:05.583147 7fc3c11be6c0 Delete type=0 #165
|
2026/07/25-16:34:16.336695 7fb394b4f6c0 Delete type=0 #213
|
||||||
2026/06/12-20:52:05.590265 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/07/25-16:34:16.350122 7fb394b4f6c0 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 @@
|
|||||||
MANIFEST-000176
|
MANIFEST-000224
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:52:57.954396 7fc410ffe6c0 Recovering log #174
|
2026/07/25-16:54:40.162927 7fb3e4fff6c0 Recovering log #222
|
||||||
2026/06/12-20:52:57.964106 7fc410ffe6c0 Delete type=3 #172
|
2026/07/25-16:54:40.173541 7fb3e4fff6c0 Delete type=3 #220
|
||||||
2026/06/12-20:52:57.964146 7fc410ffe6c0 Delete type=0 #174
|
2026/07/25-16:54:40.173643 7fb3e4fff6c0 Delete type=0 #222
|
||||||
2026/06/12-20:53:22.669694 7fc3c11be6c0 Level-0 table #179: started
|
2026/07/25-17:22:36.324212 7fb394b4f6c0 Level-0 table #227: started
|
||||||
2026/06/12-20:53:22.669720 7fc3c11be6c0 Level-0 table #179: 0 bytes OK
|
2026/07/25-17:22:36.324245 7fb394b4f6c0 Level-0 table #227: 0 bytes OK
|
||||||
2026/06/12-20:53:22.676299 7fc3c11be6c0 Delete type=0 #177
|
2026/07/25-17:22:36.333994 7fb394b4f6c0 Delete type=0 #225
|
||||||
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/07/25-17:22:36.358543 7fb394b4f6c0 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)
|
2026/07/25-17:22:36.358932 7fb394b4f6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:51:44.524826 7fc3c37fe6c0 Recovering log #170
|
2026/07/25-16:21:45.391004 7fb397fff6c0 Recovering log #218
|
||||||
2026/06/12-20:51:44.535451 7fc3c37fe6c0 Delete type=3 #168
|
2026/07/25-16:21:45.401154 7fb397fff6c0 Delete type=3 #216
|
||||||
2026/06/12-20:51:44.535506 7fc3c37fe6c0 Delete type=0 #170
|
2026/07/25-16:21:45.401258 7fb397fff6c0 Delete type=0 #218
|
||||||
2026/06/12-20:52:05.562430 7fc3c11be6c0 Level-0 table #175: started
|
2026/07/25-16:34:16.316171 7fb394b4f6c0 Level-0 table #223: started
|
||||||
2026/06/12-20:52:05.562454 7fc3c11be6c0 Level-0 table #175: 0 bytes OK
|
2026/07/25-16:34:16.316199 7fb394b4f6c0 Level-0 table #223: 0 bytes OK
|
||||||
2026/06/12-20:52:05.569802 7fc3c11be6c0 Delete type=0 #173
|
2026/07/25-16:34:16.322746 7fb394b4f6c0 Delete type=0 #221
|
||||||
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/07/25-16:34:16.323022 7fb394b4f6c0 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)
|
2026/07/25-16:34:16.329820 7fb394b4f6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000168
|
MANIFEST-000216
|
||||||
|
|||||||
+7
-7
@@ -1,7 +1,7 @@
|
|||||||
2026/06/12-20:52:57.995403 7fc3c37fe6c0 Recovering log #166
|
2026/07/25-16:54:40.207018 7fb396ffd6c0 Recovering log #214
|
||||||
2026/06/12-20:52:58.005793 7fc3c37fe6c0 Delete type=3 #164
|
2026/07/25-16:54:40.218111 7fb396ffd6c0 Delete type=3 #212
|
||||||
2026/06/12-20:52:58.005851 7fc3c37fe6c0 Delete type=0 #166
|
2026/07/25-16:54:40.218206 7fb396ffd6c0 Delete type=0 #214
|
||||||
2026/06/12-20:53:22.683153 7fc3c11be6c0 Level-0 table #171: started
|
2026/07/25-17:22:36.344663 7fb394b4f6c0 Level-0 table #219: started
|
||||||
2026/06/12-20:53:22.683178 7fc3c11be6c0 Level-0 table #171: 0 bytes OK
|
2026/07/25-17:22:36.344695 7fb394b4f6c0 Level-0 table #219: 0 bytes OK
|
||||||
2026/06/12-20:53:22.690078 7fc3c11be6c0 Delete type=0 #169
|
2026/07/25-17:22:36.351019 7fb394b4f6c0 Delete type=0 #217
|
||||||
2026/06/12-20:53:22.703354 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/07/25-17:22:36.358578 7fb394b4f6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/06/12-20:51:44.566595 7fc410ffe6c0 Recovering log #162
|
2026/07/25-16:21:45.432370 7fb3e4fff6c0 Recovering log #210
|
||||||
2026/06/12-20:51:44.577675 7fc410ffe6c0 Delete type=3 #160
|
2026/07/25-16:21:45.442645 7fb3e4fff6c0 Delete type=3 #208
|
||||||
2026/06/12-20:51:44.577730 7fc410ffe6c0 Delete type=0 #162
|
2026/07/25-16:21:45.442704 7fb3e4fff6c0 Delete type=0 #210
|
||||||
2026/06/12-20:52:05.583251 7fc3c11be6c0 Level-0 table #167: started
|
2026/07/25-16:34:16.336838 7fb394b4f6c0 Level-0 table #215: started
|
||||||
2026/06/12-20:52:05.583269 7fc3c11be6c0 Level-0 table #167: 0 bytes OK
|
2026/07/25-16:34:16.336867 7fb394b4f6c0 Level-0 table #215: 0 bytes OK
|
||||||
2026/06/12-20:52:05.590142 7fc3c11be6c0 Delete type=0 #165
|
2026/07/25-16:34:16.343246 7fb394b4f6c0 Delete type=0 #213
|
||||||
2026/06/12-20:52:05.590369 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/07/25-16:34:16.350151 7fb394b4f6c0 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 @@
|
|||||||
MANIFEST-000149
|
MANIFEST-000197
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:52:58.008917 7fc3c3fff6c0 Recovering log #147
|
2026/07/25-16:54:40.221457 7fb3e4fff6c0 Recovering log #195
|
||||||
2026/06/12-20:52:58.019530 7fc3c3fff6c0 Delete type=3 #145
|
2026/07/25-16:54:40.231541 7fb3e4fff6c0 Delete type=3 #193
|
||||||
2026/06/12-20:52:58.019585 7fc3c3fff6c0 Delete type=0 #147
|
2026/07/25-16:54:40.231630 7fb3e4fff6c0 Delete type=0 #195
|
||||||
2026/06/12-20:53:22.690192 7fc3c11be6c0 Level-0 table #152: started
|
2026/07/25-17:22:36.358974 7fb394b4f6c0 Level-0 table #200: started
|
||||||
2026/06/12-20:53:22.690216 7fc3c11be6c0 Level-0 table #152: 0 bytes OK
|
2026/07/25-17:22:36.359013 7fb394b4f6c0 Level-0 table #200: 0 bytes OK
|
||||||
2026/06/12-20:53:22.696652 7fc3c11be6c0 Delete type=0 #150
|
2026/07/25-17:22:36.365407 7fb394b4f6c0 Delete type=0 #198
|
||||||
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/07/25-17:22:36.379885 7fb394b4f6c0 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)
|
2026/07/25-17:22:36.380062 7fb394b4f6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:51:44.581216 7fc3c37fe6c0 Recovering log #143
|
2026/07/25-16:21:45.445936 7fb397fff6c0 Recovering log #191
|
||||||
2026/06/12-20:51:44.591542 7fc3c37fe6c0 Delete type=3 #141
|
2026/07/25-16:21:45.456628 7fb397fff6c0 Delete type=3 #189
|
||||||
2026/06/12-20:51:44.591593 7fc3c37fe6c0 Delete type=0 #143
|
2026/07/25-16:21:45.456706 7fb397fff6c0 Delete type=0 #191
|
||||||
2026/06/12-20:52:05.590481 7fc3c11be6c0 Level-0 table #148: started
|
2026/07/25-16:34:16.343456 7fb394b4f6c0 Level-0 table #196: started
|
||||||
2026/06/12-20:52:05.590505 7fc3c11be6c0 Level-0 table #148: 0 bytes OK
|
2026/07/25-16:34:16.343486 7fb394b4f6c0 Level-0 table #196: 0 bytes OK
|
||||||
2026/06/12-20:52:05.597069 7fc3c11be6c0 Delete type=0 #146
|
2026/07/25-16:34:16.349952 7fb394b4f6c0 Delete type=0 #194
|
||||||
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/07/25-16:34:16.350230 7fb394b4f6c0 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)
|
2026/07/25-16:34:16.350280 7fb394b4f6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000176
|
MANIFEST-000224
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:52:57.926432 7fc3c37fe6c0 Recovering log #174
|
2026/07/25-16:54:40.134268 7fb3e4fff6c0 Recovering log #222
|
||||||
2026/06/12-20:52:57.936438 7fc3c37fe6c0 Delete type=3 #172
|
2026/07/25-16:54:40.144763 7fb3e4fff6c0 Delete type=3 #220
|
||||||
2026/06/12-20:52:57.936485 7fc3c37fe6c0 Delete type=0 #174
|
2026/07/25-16:54:40.144868 7fb3e4fff6c0 Delete type=0 #222
|
||||||
2026/06/12-20:53:22.649158 7fc3c11be6c0 Level-0 table #179: started
|
2026/07/25-17:22:36.302800 7fb394b4f6c0 Level-0 table #227: started
|
||||||
2026/06/12-20:53:22.649178 7fc3c11be6c0 Level-0 table #179: 0 bytes OK
|
2026/07/25-17:22:36.302838 7fb394b4f6c0 Level-0 table #227: 0 bytes OK
|
||||||
2026/06/12-20:53:22.655504 7fc3c11be6c0 Delete type=0 #177
|
2026/07/25-17:22:36.309558 7fb394b4f6c0 Delete type=0 #225
|
||||||
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/07/25-17:22:36.324180 7fb394b4f6c0 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)
|
2026/07/25-17:22:36.334192 7fb394b4f6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:51:44.497744 7fc3c3fff6c0 Recovering log #170
|
2026/07/25-16:21:45.362950 7fb397fff6c0 Recovering log #218
|
||||||
2026/06/12-20:51:44.508610 7fc3c3fff6c0 Delete type=3 #168
|
2026/07/25-16:21:45.374396 7fb397fff6c0 Delete type=3 #216
|
||||||
2026/06/12-20:51:44.508662 7fc3c3fff6c0 Delete type=0 #170
|
2026/07/25-16:21:45.374487 7fb397fff6c0 Delete type=0 #218
|
||||||
2026/06/12-20:52:05.548467 7fc3c11be6c0 Level-0 table #175: started
|
2026/07/25-16:34:16.294555 7fb394b4f6c0 Level-0 table #223: started
|
||||||
2026/06/12-20:52:05.548492 7fc3c11be6c0 Level-0 table #175: 0 bytes OK
|
2026/07/25-16:34:16.294610 7fb394b4f6c0 Level-0 table #223: 0 bytes OK
|
||||||
2026/06/12-20:52:05.555571 7fc3c11be6c0 Delete type=0 #173
|
2026/07/25-16:34:16.301357 7fb394b4f6c0 Delete type=0 #221
|
||||||
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/07/25-16:34:16.316155 7fb394b4f6c0 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)
|
2026/07/25-16:34:16.322906 7fb394b4f6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
BIN
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
|||||||
MANIFEST-000168
|
MANIFEST-000216
|
||||||
|
|||||||
+7
-7
@@ -1,7 +1,7 @@
|
|||||||
2026/06/12-20:52:57.939847 7fc4117ff6c0 Recovering log #166
|
2026/07/25-16:54:40.148506 7fb3977fe6c0 Recovering log #214
|
||||||
2026/06/12-20:52:57.951112 7fc4117ff6c0 Delete type=3 #164
|
2026/07/25-16:54:40.159742 7fb3977fe6c0 Delete type=3 #212
|
||||||
2026/06/12-20:52:57.951166 7fc4117ff6c0 Delete type=0 #166
|
2026/07/25-16:54:40.159842 7fb3977fe6c0 Delete type=0 #214
|
||||||
2026/06/12-20:53:22.655606 7fc3c11be6c0 Level-0 table #171: started
|
2026/07/25-17:22:36.317424 7fb394b4f6c0 Level-0 table #219: started
|
||||||
2026/06/12-20:53:22.655631 7fc3c11be6c0 Level-0 table #171: 0 bytes OK
|
2026/07/25-17:22:36.317453 7fb394b4f6c0 Level-0 table #219: 0 bytes OK
|
||||||
2026/06/12-20:53:22.662292 7fc3c11be6c0 Delete type=0 #169
|
2026/07/25-17:22:36.324008 7fb394b4f6c0 Delete type=0 #217
|
||||||
2026/06/12-20:53:22.676430 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/07/25-17:22:36.334172 7fb394b4f6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
+7
-7
@@ -1,7 +1,7 @@
|
|||||||
2026/06/12-20:51:44.511682 7fc410ffe6c0 Recovering log #162
|
2026/07/25-16:21:45.377631 7fb3e4fff6c0 Recovering log #210
|
||||||
2026/06/12-20:51:44.521666 7fc410ffe6c0 Delete type=3 #160
|
2026/07/25-16:21:45.388254 7fb3e4fff6c0 Delete type=3 #208
|
||||||
2026/06/12-20:51:44.521720 7fc410ffe6c0 Delete type=0 #162
|
2026/07/25-16:21:45.388347 7fb3e4fff6c0 Delete type=0 #210
|
||||||
2026/06/12-20:52:05.555691 7fc3c11be6c0 Level-0 table #167: started
|
2026/07/25-16:34:16.301508 7fb394b4f6c0 Level-0 table #215: started
|
||||||
2026/06/12-20:52:05.555716 7fc3c11be6c0 Level-0 table #167: 0 bytes OK
|
2026/07/25-16:34:16.301533 7fb394b4f6c0 Level-0 table #215: 0 bytes OK
|
||||||
2026/06/12-20:52:05.562097 7fc3c11be6c0 Delete type=0 #165
|
2026/07/25-16:34:16.308270 7fb394b4f6c0 Delete type=0 #213
|
||||||
2026/06/12-20:52:05.562305 7fc3c11be6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/07/25-16:34:16.322878 7fb394b4f6c0 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 @@
|
|||||||
MANIFEST-000176
|
MANIFEST-000224
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:52:57.967451 7fc4117ff6c0 Recovering log #174
|
2026/07/25-16:54:40.177967 7fb397fff6c0 Recovering log #222
|
||||||
2026/06/12-20:52:57.978196 7fc4117ff6c0 Delete type=3 #172
|
2026/07/25-16:54:40.189174 7fb397fff6c0 Delete type=3 #220
|
||||||
2026/06/12-20:52:57.978251 7fc4117ff6c0 Delete type=0 #174
|
2026/07/25-16:54:40.189264 7fb397fff6c0 Delete type=0 #222
|
||||||
2026/06/12-20:53:22.696764 7fc3c11be6c0 Level-0 table #179: started
|
2026/07/25-17:22:36.351191 7fb394b4f6c0 Level-0 table #227: started
|
||||||
2026/06/12-20:53:22.696789 7fc3c11be6c0 Level-0 table #179: 0 bytes OK
|
2026/07/25-17:22:36.351222 7fb394b4f6c0 Level-0 table #227: 0 bytes OK
|
||||||
2026/06/12-20:53:22.703214 7fc3c11be6c0 Delete type=0 #177
|
2026/07/25-17:22:36.358358 7fb394b4f6c0 Delete type=0 #225
|
||||||
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/07/25-17:22:36.358960 7fb394b4f6c0 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)
|
2026/07/25-17:22:36.379865 7fb394b4f6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:51:44.538990 7fc410ffe6c0 Recovering log #170
|
2026/07/25-16:21:45.404647 7fb3e4fff6c0 Recovering log #218
|
||||||
2026/06/12-20:51:44.550083 7fc410ffe6c0 Delete type=3 #168
|
2026/07/25-16:21:45.415371 7fb3e4fff6c0 Delete type=3 #216
|
||||||
2026/06/12-20:51:44.550141 7fc410ffe6c0 Delete type=0 #170
|
2026/07/25-16:21:45.415456 7fb3e4fff6c0 Delete type=0 #218
|
||||||
2026/06/12-20:52:05.569908 7fc3c11be6c0 Level-0 table #175: started
|
2026/07/25-16:34:16.323056 7fb394b4f6c0 Level-0 table #223: started
|
||||||
2026/06/12-20:52:05.569929 7fc3c11be6c0 Level-0 table #175: 0 bytes OK
|
2026/07/25-16:34:16.323083 7fb394b4f6c0 Level-0 table #223: 0 bytes OK
|
||||||
2026/06/12-20:52:05.576375 7fc3c11be6c0 Delete type=0 #173
|
2026/07/25-16:34:16.329677 7fb394b4f6c0 Delete type=0 #221
|
||||||
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/07/25-16:34:16.343438 7fb394b4f6c0 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)
|
2026/07/25-16:34:16.350140 7fb394b4f6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
|||||||
MANIFEST-000014
|
MANIFEST-000062
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:52:58.209985 7fc3c3fff6c0 Recovering log #12
|
2026/07/25-16:54:40.546836 7fb3e4fff6c0 Recovering log #60
|
||||||
2026/06/12-20:52:58.222276 7fc3c3fff6c0 Delete type=3 #10
|
2026/07/25-16:54:40.559140 7fb3e4fff6c0 Delete type=3 #58
|
||||||
2026/06/12-20:52:58.222315 7fc3c3fff6c0 Delete type=0 #12
|
2026/07/25-16:54:40.559230 7fb3e4fff6c0 Delete type=0 #60
|
||||||
2026/06/12-20:53:22.822733 7fc3c11be6c0 Level-0 table #17: started
|
2026/07/25-17:22:36.806586 7fb394b4f6c0 Level-0 table #65: started
|
||||||
2026/06/12-20:53:22.822761 7fc3c11be6c0 Level-0 table #17: 0 bytes OK
|
2026/07/25-17:22:36.806624 7fb394b4f6c0 Level-0 table #65: 0 bytes OK
|
||||||
2026/06/12-20:53:22.829641 7fc3c11be6c0 Delete type=0 #15
|
2026/07/25-17:22:36.813457 7fb394b4f6c0 Delete type=0 #63
|
||||||
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/07/25-17:22:36.832126 7fb394b4f6c0 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)
|
2026/07/25-17:22:36.880816 7fb394b4f6c0 Manual compaction at level-1 from '!actors!DL3zXfXxWMOQhXJY' @ 72057594037927935 : 1 .. '!actors.items!JAHYXFedTxNlGYX8.nmIgA3CQkOSEpCSP' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:51:44.772467 7fc3c37fe6c0 Recovering log #8
|
2026/07/25-16:21:45.739454 7fb397fff6c0 Recovering log #56
|
||||||
2026/06/12-20:51:44.784739 7fc3c37fe6c0 Delete type=3 #6
|
2026/07/25-16:21:45.751415 7fb397fff6c0 Delete type=3 #54
|
||||||
2026/06/12-20:51:44.784799 7fc3c37fe6c0 Delete type=0 #8
|
2026/07/25-16:21:45.751507 7fb397fff6c0 Delete type=0 #56
|
||||||
2026/06/12-20:52:05.700099 7fc3c11be6c0 Level-0 table #13: started
|
2026/07/25-16:34:16.722283 7fb394b4f6c0 Level-0 table #61: started
|
||||||
2026/06/12-20:52:05.700122 7fc3c11be6c0 Level-0 table #13: 0 bytes OK
|
2026/07/25-16:34:16.722319 7fb394b4f6c0 Level-0 table #61: 0 bytes OK
|
||||||
2026/06/12-20:52:05.707051 7fc3c11be6c0 Delete type=0 #11
|
2026/07/25-16:34:16.729649 7fb394b4f6c0 Delete type=0 #59
|
||||||
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/07/25-16:34:16.800931 7fb394b4f6c0 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)
|
2026/07/25-16:34:16.860353 7fb394b4f6c0 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.
@@ -1 +1 @@
|
|||||||
MANIFEST-000291
|
MANIFEST-000530
|
||||||
|
|||||||
+63
-19
@@ -1,19 +1,63 @@
|
|||||||
2026/06/12-20:52:58.065673 7fc3c3fff6c0 Recovering log #286
|
2026/07/25-16:54:40.280606 7fb3e4fff6c0 Recovering log #517
|
||||||
2026/06/12-20:52:58.076152 7fc3c3fff6c0 Delete type=3 #284
|
2026/07/25-16:54:40.291187 7fb3e4fff6c0 Delete type=3 #513
|
||||||
2026/06/12-20:52:58.076196 7fc3c3fff6c0 Delete type=0 #286
|
2026/07/25-16:54:40.291276 7fb3e4fff6c0 Delete type=0 #517
|
||||||
2026/06/12-20:53:22.724394 7fc3c11be6c0 Level-0 table #294: started
|
2026/07/25-16:55:19.321188 7fb394b4f6c0 Level-0 table #533: started
|
||||||
2026/06/12-20:53:22.813324 7fc3c11be6c0 Level-0 table #294: 5029605 bytes OK
|
2026/07/25-16:55:19.444275 7fb394b4f6c0 Level-0 table #533: 8047048 bytes OK
|
||||||
2026/06/12-20:53:22.820890 7fc3c11be6c0 Delete type=0 #292
|
2026/07/25-16:55:19.451577 7fb394b4f6c0 Delete type=0 #531
|
||||||
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/07/25-17:21:46.121006 7fb394b4f6c0 Level-0 table #535: started
|
||||||
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/07/25-17:21:46.222937 7fb394b4f6c0 Level-0 table #535: 8120620 bytes OK
|
||||||
2026/06/12-20:53:22.836460 7fc3c11be6c0 Compacting 1@1 + 3@2 files
|
2026/07/25-17:21:46.230171 7fb394b4f6c0 Delete type=0 #532
|
||||||
2026/06/12-20:53:22.873874 7fc3c11be6c0 Generated table #295@1: 10562 keys, 2142429 bytes
|
2026/07/25-17:22:03.264081 7fb394b4f6c0 Level-0 table #537: started
|
||||||
2026/06/12-20:53:22.924542 7fc3c11be6c0 Generated table #296@1: 16816 keys, 2164017 bytes
|
2026/07/25-17:22:03.358383 7fb394b4f6c0 Level-0 table #537: 8159715 bytes OK
|
||||||
2026/06/12-20:53:22.944331 7fc3c11be6c0 Generated table #297@1: 5500 keys, 721026 bytes
|
2026/07/25-17:22:03.366011 7fb394b4f6c0 Delete type=0 #534
|
||||||
2026/06/12-20:53:22.944361 7fc3c11be6c0 Compacted 1@1 + 3@2 files => 5027472 bytes
|
2026/07/25-17:22:36.394386 7fb394b4f6c0 Level-0 table #539: started
|
||||||
2026/06/12-20:53:22.951445 7fc3c11be6c0 compacted to: files[ 0 0 3 0 0 0 0 ]
|
2026/07/25-17:22:36.518263 7fb394b4f6c0 Level-0 table #539: 8197558 bytes OK
|
||||||
2026/06/12-20:53:22.951933 7fc3c11be6c0 Delete type=2 #288
|
2026/07/25-17:22:36.525099 7fb394b4f6c0 Delete type=0 #536
|
||||||
2026/06/12-20:53:22.952420 7fc3c11be6c0 Delete type=2 #289
|
2026/07/25-17:22:36.535793 7fb394b4f6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 4024266 : 1
|
||||||
2026/06/12-20:53:22.952708 7fc3c11be6c0 Delete type=2 #290
|
2026/07/25-17:22:36.535803 7fb394b4f6c0 Compacting 3@0 + 1@1 files
|
||||||
2026/06/12-20:53:22.953103 7fc3c11be6c0 Delete type=2 #294
|
2026/07/25-17:22:36.589302 7fb394b4f6c0 Generated table #540@0: 7833 keys, 2132558 bytes
|
||||||
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)
|
2026/07/25-17:22:36.667506 7fb394b4f6c0 Generated table #541@0: 15560 keys, 2160278 bytes
|
||||||
|
2026/07/25-17:22:36.735222 7fb394b4f6c0 Generated table #542@0: 16090 keys, 2162299 bytes
|
||||||
|
2026/07/25-17:22:36.791787 7fb394b4f6c0 Generated table #543@0: 12983 keys, 1738102 bytes
|
||||||
|
2026/07/25-17:22:36.791824 7fb394b4f6c0 Compacted 3@0 + 1@1 files => 8193237 bytes
|
||||||
|
2026/07/25-17:22:36.798979 7fb394b4f6c0 compacted to: files[ 0 4 4 0 0 0 0 ]
|
||||||
|
2026/07/25-17:22:36.799753 7fb394b4f6c0 Delete type=2 #533
|
||||||
|
2026/07/25-17:22:36.801735 7fb394b4f6c0 Delete type=2 #535
|
||||||
|
2026/07/25-17:22:36.803482 7fb394b4f6c0 Delete type=2 #537
|
||||||
|
2026/07/25-17:22:36.805232 7fb394b4f6c0 Delete type=2 #539
|
||||||
|
2026/07/25-17:22:36.813620 7fb394b4f6c0 Manual compaction at level-0 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 4024266 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end)
|
||||||
|
2026/07/25-17:22:36.832161 7fb394b4f6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!Eg3PdOfCx9R54Tm6.NHK48nIoycLq56X4' @ 4160142 : 1
|
||||||
|
2026/07/25-17:22:36.832171 7fb394b4f6c0 Compacting 1@1 + 1@2 files
|
||||||
|
2026/07/25-17:22:36.867333 7fb394b4f6c0 Generated table #544@1: 7833 keys, 2132558 bytes
|
||||||
|
2026/07/25-17:22:36.872505 7fb394b4f6c0 Generated table #545@1: 338 keys, 55239 bytes
|
||||||
|
2026/07/25-17:22:36.872544 7fb394b4f6c0 Compacted 1@1 + 1@2 files => 2187797 bytes
|
||||||
|
2026/07/25-17:22:36.879490 7fb394b4f6c0 compacted to: files[ 0 3 5 0 0 0 0 ]
|
||||||
|
2026/07/25-17:22:36.879931 7fb394b4f6c0 Delete type=2 #523
|
||||||
|
2026/07/25-17:22:36.880474 7fb394b4f6c0 Delete type=2 #540
|
||||||
|
2026/07/25-17:22:36.880920 7fb394b4f6c0 Manual compaction at level-1 from '!tables.results!Eg3PdOfCx9R54Tm6.NHK48nIoycLq56X4' @ 4160142 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!bQ64721XzgOetD2v.6a2Kk3rl0H7Rij2U' @ 4171077 : 1
|
||||||
|
2026/07/25-17:22:36.880928 7fb394b4f6c0 Compacting 1@1 + 2@2 files
|
||||||
|
2026/07/25-17:22:36.931840 7fb394b4f6c0 Generated table #546@1: 15560 keys, 2160278 bytes
|
||||||
|
2026/07/25-17:22:36.938177 7fb394b4f6c0 Generated table #547@1: 737 keys, 105748 bytes
|
||||||
|
2026/07/25-17:22:36.938217 7fb394b4f6c0 Compacted 1@1 + 2@2 files => 2266026 bytes
|
||||||
|
2026/07/25-17:22:36.945137 7fb394b4f6c0 compacted to: files[ 0 2 5 0 0 0 0 ]
|
||||||
|
2026/07/25-17:22:36.945519 7fb394b4f6c0 Delete type=2 #525
|
||||||
|
2026/07/25-17:22:36.946090 7fb394b4f6c0 Delete type=2 #541
|
||||||
|
2026/07/25-17:22:36.946379 7fb394b4f6c0 Delete type=2 #545
|
||||||
|
2026/07/25-17:22:36.965952 7fb394b4f6c0 Manual compaction at level-1 from '!tables.results!bQ64721XzgOetD2v.6a2Kk3rl0H7Rij2U' @ 4171077 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!gXa1mHCjJYOtPiRx.w274XsrKfEGnYr0a' @ 4145219 : 1
|
||||||
|
2026/07/25-17:22:36.965988 7fb394b4f6c0 Compacting 1@1 + 2@2 files
|
||||||
|
2026/07/25-17:22:37.021652 7fb394b4f6c0 Generated table #548@1: 16090 keys, 2162299 bytes
|
||||||
|
2026/07/25-17:22:37.028936 7fb394b4f6c0 Generated table #549@1: 1170 keys, 156119 bytes
|
||||||
|
2026/07/25-17:22:37.028974 7fb394b4f6c0 Compacted 1@1 + 2@2 files => 2318418 bytes
|
||||||
|
2026/07/25-17:22:37.035841 7fb394b4f6c0 compacted to: files[ 0 1 5 0 0 0 0 ]
|
||||||
|
2026/07/25-17:22:37.036188 7fb394b4f6c0 Delete type=2 #527
|
||||||
|
2026/07/25-17:22:37.036784 7fb394b4f6c0 Delete type=2 #542
|
||||||
|
2026/07/25-17:22:37.037237 7fb394b4f6c0 Delete type=2 #547
|
||||||
|
2026/07/25-17:22:37.044891 7fb394b4f6c0 Manual compaction at level-1 from '!tables.results!gXa1mHCjJYOtPiRx.w274XsrKfEGnYr0a' @ 4145219 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 4128290 : 1
|
||||||
|
2026/07/25-17:22:37.044907 7fb394b4f6c0 Compacting 1@1 + 2@2 files
|
||||||
|
2026/07/25-17:22:37.084375 7fb394b4f6c0 Generated table #550@1: 12983 keys, 1738102 bytes
|
||||||
|
2026/07/25-17:22:37.084414 7fb394b4f6c0 Compacted 1@1 + 2@2 files => 1738102 bytes
|
||||||
|
2026/07/25-17:22:37.091282 7fb394b4f6c0 compacted to: files[ 0 0 4 0 0 0 0 ]
|
||||||
|
2026/07/25-17:22:37.091499 7fb394b4f6c0 Delete type=2 #529
|
||||||
|
2026/07/25-17:22:37.091903 7fb394b4f6c0 Delete type=2 #543
|
||||||
|
2026/07/25-17:22:37.092142 7fb394b4f6c0 Delete type=2 #549
|
||||||
|
2026/07/25-17:22:37.106687 7fb394b4f6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 4128290 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
+55
-19
@@ -1,19 +1,55 @@
|
|||||||
2026/06/12-20:51:44.638713 7fc410ffe6c0 Recovering log #279
|
2026/07/25-16:21:45.501792 7fb3e4fff6c0 Recovering log #500
|
||||||
2026/06/12-20:51:44.649235 7fc410ffe6c0 Delete type=3 #277
|
2026/07/25-16:21:45.512008 7fb3e4fff6c0 Delete type=3 #496
|
||||||
2026/06/12-20:51:44.649296 7fc410ffe6c0 Delete type=0 #279
|
2026/07/25-16:21:45.512073 7fb3e4fff6c0 Delete type=0 #500
|
||||||
2026/06/12-20:52:05.627084 7fc3c11be6c0 Level-0 table #287: started
|
2026/07/25-16:24:19.128277 7fb394b4f6c0 Level-0 table #516: started
|
||||||
2026/06/12-20:52:05.691136 7fc3c11be6c0 Level-0 table #287: 4971536 bytes OK
|
2026/07/25-16:24:19.244728 7fb394b4f6c0 Level-0 table #516: 7956529 bytes OK
|
||||||
2026/06/12-20:52:05.698145 7fc3c11be6c0 Delete type=0 #285
|
2026/07/25-16:24:19.251153 7fb394b4f6c0 Delete type=0 #514
|
||||||
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/07/25-16:34:16.371434 7fb394b4f6c0 Level-0 table #518: started
|
||||||
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/07/25-16:34:16.500326 7fb394b4f6c0 Level-0 table #518: 7998817 bytes OK
|
||||||
2026/06/12-20:52:05.714307 7fc3c11be6c0 Compacting 1@1 + 3@2 files
|
2026/07/25-16:34:16.508005 7fb394b4f6c0 Delete type=0 #515
|
||||||
2026/06/12-20:52:05.744344 7fc3c11be6c0 Generated table #288@1: 10660 keys, 2142130 bytes
|
2026/07/25-16:34:16.510322 7fb394b4f6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 3921570 : 1
|
||||||
2026/06/12-20:52:05.781422 7fc3c11be6c0 Generated table #289@1: 16841 keys, 2165292 bytes
|
2026/07/25-16:34:16.510331 7fb394b4f6c0 Compacting 1@0 + 1@1 files
|
||||||
2026/06/12-20:52:05.794598 7fc3c11be6c0 Generated table #290@1: 5045 keys, 662072 bytes
|
2026/07/25-16:34:16.542074 7fb394b4f6c0 Generated table #519@0: 7972 keys, 2131647 bytes
|
||||||
2026/06/12-20:52:05.794618 7fc3c11be6c0 Compacted 1@1 + 3@2 files => 4969494 bytes
|
2026/07/25-16:34:16.588781 7fb394b4f6c0 Generated table #520@0: 15567 keys, 2160383 bytes
|
||||||
2026/06/12-20:52:05.801998 7fc3c11be6c0 compacted to: files[ 0 0 3 0 0 0 0 ]
|
2026/07/25-16:34:16.635707 7fb394b4f6c0 Generated table #521@0: 16112 keys, 2162117 bytes
|
||||||
2026/06/12-20:52:05.802346 7fc3c11be6c0 Delete type=2 #281
|
2026/07/25-16:34:16.671030 7fb394b4f6c0 Generated table #522@0: 11487 keys, 1540844 bytes
|
||||||
2026/06/12-20:52:05.802678 7fc3c11be6c0 Delete type=2 #282
|
2026/07/25-16:34:16.671069 7fb394b4f6c0 Compacted 1@0 + 1@1 files => 7994991 bytes
|
||||||
2026/06/12-20:52:05.802871 7fc3c11be6c0 Delete type=2 #283
|
2026/07/25-16:34:16.677382 7fb394b4f6c0 compacted to: files[ 0 4 4 0 0 0 0 ]
|
||||||
2026/06/12-20:52:05.803095 7fc3c11be6c0 Delete type=2 #287
|
2026/07/25-16:34:16.678276 7fb394b4f6c0 Delete type=2 #516
|
||||||
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)
|
2026/07/25-16:34:16.679572 7fb394b4f6c0 Delete type=2 #518
|
||||||
|
2026/07/25-16:34:16.680429 7fb394b4f6c0 Manual compaction at level-0 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 3921570 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end)
|
||||||
|
2026/07/25-16:34:16.680597 7fb394b4f6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!Eg3PdOfCx9R54Tm6.QmTmqRtZ2zqUbNDK' @ 3951925 : 1
|
||||||
|
2026/07/25-16:34:16.680618 7fb394b4f6c0 Compacting 1@1 + 1@2 files
|
||||||
|
2026/07/25-16:34:16.710701 7fb394b4f6c0 Generated table #523@1: 7972 keys, 2131647 bytes
|
||||||
|
2026/07/25-16:34:16.714887 7fb394b4f6c0 Generated table #524@1: 166 keys, 27091 bytes
|
||||||
|
2026/07/25-16:34:16.714917 7fb394b4f6c0 Compacted 1@1 + 1@2 files => 2158738 bytes
|
||||||
|
2026/07/25-16:34:16.721082 7fb394b4f6c0 compacted to: files[ 0 3 5 0 0 0 0 ]
|
||||||
|
2026/07/25-16:34:16.721504 7fb394b4f6c0 Delete type=2 #506
|
||||||
|
2026/07/25-16:34:16.722019 7fb394b4f6c0 Delete type=2 #519
|
||||||
|
2026/07/25-16:34:16.743211 7fb394b4f6c0 Manual compaction at level-1 from '!tables.results!Eg3PdOfCx9R54Tm6.QmTmqRtZ2zqUbNDK' @ 3951925 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!bQ64721XzgOetD2v.EReJqu3wyM6vwWR7' @ 3963654 : 1
|
||||||
|
2026/07/25-16:34:16.743231 7fb394b4f6c0 Compacting 1@1 + 2@2 files
|
||||||
|
2026/07/25-16:34:16.788469 7fb394b4f6c0 Generated table #525@1: 15567 keys, 2160383 bytes
|
||||||
|
2026/07/25-16:34:16.793007 7fb394b4f6c0 Generated table #526@1: 370 keys, 53494 bytes
|
||||||
|
2026/07/25-16:34:16.793036 7fb394b4f6c0 Compacted 1@1 + 2@2 files => 2213877 bytes
|
||||||
|
2026/07/25-16:34:16.799791 7fb394b4f6c0 compacted to: files[ 0 2 5 0 0 0 0 ]
|
||||||
|
2026/07/25-16:34:16.800112 7fb394b4f6c0 Delete type=2 #508
|
||||||
|
2026/07/25-16:34:16.800586 7fb394b4f6c0 Delete type=2 #520
|
||||||
|
2026/07/25-16:34:16.800854 7fb394b4f6c0 Delete type=2 #524
|
||||||
|
2026/07/25-16:34:16.801124 7fb394b4f6c0 Manual compaction at level-1 from '!tables.results!bQ64721XzgOetD2v.EReJqu3wyM6vwWR7' @ 3963654 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!jup6vzXHR8WYariQ.9MLFLfBZxah8tU5d' @ 3930763 : 1
|
||||||
|
2026/07/25-16:34:16.801134 7fb394b4f6c0 Compacting 1@1 + 2@2 files
|
||||||
|
2026/07/25-16:34:16.847533 7fb394b4f6c0 Generated table #527@1: 16112 keys, 2162117 bytes
|
||||||
|
2026/07/25-16:34:16.852860 7fb394b4f6c0 Generated table #528@1: 669 keys, 88745 bytes
|
||||||
|
2026/07/25-16:34:16.852890 7fb394b4f6c0 Compacted 1@1 + 2@2 files => 2250862 bytes
|
||||||
|
2026/07/25-16:34:16.859163 7fb394b4f6c0 compacted to: files[ 0 1 5 0 0 0 0 ]
|
||||||
|
2026/07/25-16:34:16.859513 7fb394b4f6c0 Delete type=2 #510
|
||||||
|
2026/07/25-16:34:16.859993 7fb394b4f6c0 Delete type=2 #521
|
||||||
|
2026/07/25-16:34:16.860259 7fb394b4f6c0 Delete type=2 #526
|
||||||
|
2026/07/25-16:34:16.868258 7fb394b4f6c0 Manual compaction at level-1 from '!tables.results!jup6vzXHR8WYariQ.9MLFLfBZxah8tU5d' @ 3930763 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 3921570 : 1
|
||||||
|
2026/07/25-16:34:16.868275 7fb394b4f6c0 Compacting 1@1 + 2@2 files
|
||||||
|
2026/07/25-16:34:16.902985 7fb394b4f6c0 Generated table #529@1: 11487 keys, 1540844 bytes
|
||||||
|
2026/07/25-16:34:16.903023 7fb394b4f6c0 Compacted 1@1 + 2@2 files => 1540844 bytes
|
||||||
|
2026/07/25-16:34:16.910466 7fb394b4f6c0 compacted to: files[ 0 0 4 0 0 0 0 ]
|
||||||
|
2026/07/25-16:34:16.910669 7fb394b4f6c0 Delete type=2 #512
|
||||||
|
2026/07/25-16:34:16.911042 7fb394b4f6c0 Delete type=2 #522
|
||||||
|
2026/07/25-16:34:16.911269 7fb394b4f6c0 Delete type=2 #528
|
||||||
|
2026/07/25-16:34:16.928914 7fb394b4f6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 3921570 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000122
|
MANIFEST-000170
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:52:58.037556 7fc3c3fff6c0 Recovering log #120
|
2026/07/25-16:54:40.250077 7fb3977fe6c0 Recovering log #168
|
||||||
2026/06/12-20:52:58.047938 7fc3c3fff6c0 Delete type=3 #118
|
2026/07/25-16:54:40.261282 7fb3977fe6c0 Delete type=3 #166
|
||||||
2026/06/12-20:52:58.048005 7fc3c3fff6c0 Delete type=0 #120
|
2026/07/25-16:54:40.261388 7fb3977fe6c0 Delete type=0 #168
|
||||||
2026/06/12-20:53:22.710451 7fc3c11be6c0 Level-0 table #125: started
|
2026/07/25-17:22:36.372487 7fb394b4f6c0 Level-0 table #173: started
|
||||||
2026/06/12-20:53:22.710474 7fc3c11be6c0 Level-0 table #125: 0 bytes OK
|
2026/07/25-17:22:36.372517 7fb394b4f6c0 Level-0 table #173: 0 bytes OK
|
||||||
2026/06/12-20:53:22.716951 7fc3c11be6c0 Delete type=0 #123
|
2026/07/25-17:22:36.379686 7fb394b4f6c0 Delete type=0 #171
|
||||||
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/07/25-17:22:36.379949 7fb394b4f6c0 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)
|
2026/07/25-17:22:36.379970 7fb394b4f6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/06/12-20:51:44.607543 7fc410ffe6c0 Recovering log #116
|
2026/07/25-16:21:45.473663 7fb3e4fff6c0 Recovering log #164
|
||||||
2026/06/12-20:51:44.622157 7fc410ffe6c0 Delete type=3 #114
|
2026/07/25-16:21:45.484922 7fb3e4fff6c0 Delete type=3 #162
|
||||||
2026/06/12-20:51:44.622215 7fc410ffe6c0 Delete type=0 #116
|
2026/07/25-16:21:45.484999 7fb3e4fff6c0 Delete type=0 #164
|
||||||
2026/06/12-20:52:05.604539 7fc3c11be6c0 Level-0 table #121: started
|
2026/07/25-16:34:16.364464 7fb394b4f6c0 Level-0 table #169: started
|
||||||
2026/06/12-20:52:05.604563 7fc3c11be6c0 Level-0 table #121: 0 bytes OK
|
2026/07/25-16:34:16.364495 7fb394b4f6c0 Level-0 table #169: 0 bytes OK
|
||||||
2026/06/12-20:52:05.611212 7fc3c11be6c0 Delete type=0 #119
|
2026/07/25-16:34:16.371260 7fb394b4f6c0 Delete type=0 #167
|
||||||
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/07/25-16:34:16.510187 7fb394b4f6c0 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)
|
2026/07/25-16:34:16.680263 7fb394b4f6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
@@ -0,0 +1,95 @@
|
|||||||
|
import { formatImperialDate } from './calendarDate.js';
|
||||||
|
|
||||||
|
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
|
||||||
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
|
||||||
|
export class CalendarApp extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
id: 'mgt2-calendar',
|
||||||
|
classes: ['mgt2-calendar'],
|
||||||
|
position: { width: 260, height: 'auto' },
|
||||||
|
window: {
|
||||||
|
icon: 'fas fa-calendar-alt',
|
||||||
|
title: 'Calendrier Impérial',
|
||||||
|
resizable: false,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: {
|
||||||
|
template: `modules/${MODULE_ID}/templates/calendar-app.hbs`,
|
||||||
|
root: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
constructor({ onConfig, onClose, onNote } = {}) {
|
||||||
|
super();
|
||||||
|
const saved = game.settings?.get(MODULE_ID, 'calendarPosition');
|
||||||
|
if (saved?.left != null && saved?.top != null) {
|
||||||
|
this.position.left = saved.left;
|
||||||
|
this.position.top = saved.top;
|
||||||
|
}
|
||||||
|
this._onConfig = onConfig;
|
||||||
|
this._onClose = onClose;
|
||||||
|
this._onNote = onNote;
|
||||||
|
this._data = { year: 1116, day: 1, hour: 12, minute: 0, planet: '' };
|
||||||
|
}
|
||||||
|
|
||||||
|
get title() {
|
||||||
|
return 'Calendrier Impérial';
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
return {
|
||||||
|
dateLabel: formatImperialDate(this._data),
|
||||||
|
isGM: game.user?.isGM ?? false,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async _onRender(context, options) {
|
||||||
|
await super._onRender(context, options);
|
||||||
|
const html = $(this.element);
|
||||||
|
html.find('.mgt2-cal-config-btn').on('click', () => {
|
||||||
|
this._onConfig?.();
|
||||||
|
});
|
||||||
|
html.find('.mgt2-cal-note-btn').on('click', () => {
|
||||||
|
this._onNote?.();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
setPosition(position) {
|
||||||
|
const result = super.setPosition(position);
|
||||||
|
this._debouncedSavePos();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
_debouncedSavePos() {
|
||||||
|
if (this._savePosTimeout) clearTimeout(this._savePosTimeout);
|
||||||
|
this._savePosTimeout = setTimeout(() => {
|
||||||
|
game.settings?.set(MODULE_ID, 'calendarPosition', {
|
||||||
|
left: this.position.left,
|
||||||
|
top: this.position.top,
|
||||||
|
});
|
||||||
|
this._savePosTimeout = null;
|
||||||
|
}, 300);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateDisplay(data) {
|
||||||
|
this._data = { ...this._data, ...data };
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
async close() {
|
||||||
|
if (game.settings) {
|
||||||
|
await game.settings.set(MODULE_ID, 'calendarPosition', {
|
||||||
|
left: this.position.left,
|
||||||
|
top: this.position.top,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
this._onConfig = null;
|
||||||
|
this._onNote = null;
|
||||||
|
this._onClose?.();
|
||||||
|
this._onClose = null;
|
||||||
|
return super.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
import { getDayLabel, computeConversions } from './calendarDate.js';
|
||||||
|
|
||||||
|
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
|
||||||
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
|
||||||
|
export class CalendarConfigDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
id: 'mgt2-calendar-config',
|
||||||
|
classes: ['mgt2-calendar'],
|
||||||
|
position: { width: 300, height: 'auto' },
|
||||||
|
window: {
|
||||||
|
icon: 'fas fa-cog',
|
||||||
|
title: 'Configurer le calendrier',
|
||||||
|
resizable: false,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: {
|
||||||
|
template: `modules/${MODULE_ID}/templates/calendar-config.hbs`,
|
||||||
|
root: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
constructor({ data, onApply } = {}) {
|
||||||
|
super();
|
||||||
|
this._data = { ...data };
|
||||||
|
this._onApply = onApply;
|
||||||
|
}
|
||||||
|
|
||||||
|
get title() {
|
||||||
|
return 'Configurer le calendrier';
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
return {
|
||||||
|
year: this._data.year,
|
||||||
|
day: this._data.day,
|
||||||
|
hour: this._data.hour,
|
||||||
|
minute: this._data.minute,
|
||||||
|
planet: this._data.planet ?? '',
|
||||||
|
dayLabel: getDayLabel(this._data.day),
|
||||||
|
conversions: computeConversions(this._data.year),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async _onRender(context, options) {
|
||||||
|
await super._onRender(context, options);
|
||||||
|
const html = $(this.element);
|
||||||
|
|
||||||
|
html.find('[name="day"]').on('input', () => {
|
||||||
|
const day = parseInt(html.find('[name="day"]').val(), 10);
|
||||||
|
if (day >= 1 && day <= 365) {
|
||||||
|
html.find('.mgt2-cal-day-label').text(getDayLabel(day));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[name="year"]').on('input', () => {
|
||||||
|
const year = parseInt(html.find('[name="year"]').val(), 10) || 0;
|
||||||
|
const conv = computeConversions(year);
|
||||||
|
html.find('.mgt2-cal-conv-val[data-cal="solomani"]').text(conv.solomani);
|
||||||
|
html.find('.mgt2-cal-conv-val[data-cal="vilani"]').text(conv.vilani);
|
||||||
|
html.find('.mgt2-cal-conv-val[data-cal="zhodani"]').text(conv.zhodani);
|
||||||
|
html.find('.mgt2-cal-conv-val[data-cal="aslan"]').text(conv.aslan);
|
||||||
|
html.find('.mgt2-cal-conv-val[data-cal="kkree"]').text(conv.kkree);
|
||||||
|
html.find('.mgt2-cal-conv-val[data-cal="hiver"]').text(conv.hiver);
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[data-action="day-inc"]').on('click', () => {
|
||||||
|
const input = html.find('[name="day"]');
|
||||||
|
let day = parseInt(input.val(), 10) || 1;
|
||||||
|
day = day >= 365 ? 1 : day + 1;
|
||||||
|
input.val(day);
|
||||||
|
html.find('.mgt2-cal-day-label').text(getDayLabel(day));
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[data-action="hour-inc"]').on('click', () => {
|
||||||
|
const dayInput = html.find('[name="day"]');
|
||||||
|
const hourInput = html.find('[name="hour"]');
|
||||||
|
const minuteInput = html.find('[name="minute"]');
|
||||||
|
let day = parseInt(dayInput.val(), 10) || 1;
|
||||||
|
let hour = parseInt(hourInput.val(), 10) || 0;
|
||||||
|
let minute = parseInt(minuteInput.val(), 10) || 0;
|
||||||
|
|
||||||
|
hour += 1;
|
||||||
|
if (hour >= 24) {
|
||||||
|
hour = 0;
|
||||||
|
day = day >= 365 ? 1 : day + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
hourInput.val(hour);
|
||||||
|
dayInput.val(day);
|
||||||
|
html.find('.mgt2-cal-day-label').text(getDayLabel(day));
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[data-action="apply"]').on('click', () => {
|
||||||
|
this._readAndApply(html);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_readAndApply(html) {
|
||||||
|
const year = parseInt(html.find('[name="year"]').val(), 10) || 1116;
|
||||||
|
const day = Math.min(365, Math.max(1, parseInt(html.find('[name="day"]').val(), 10) || 1));
|
||||||
|
const hour = Math.min(23, Math.max(0, parseInt(html.find('[name="hour"]').val(), 10) || 0));
|
||||||
|
const minute = Math.min(59, Math.max(0, parseInt(html.find('[name="minute"]').val(), 10) || 0));
|
||||||
|
const planet = html.find('[name="planet"]').val()?.trim() ?? '';
|
||||||
|
|
||||||
|
const data = { year, day, hour, minute, planet };
|
||||||
|
this._onApply?.(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this._onApply = null;
|
||||||
|
return super.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
|
||||||
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
|
||||||
|
export class JournalNoteDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
id: 'mgt2-journal-note',
|
||||||
|
classes: ['mgt2-calendar'],
|
||||||
|
position: { width: 320, height: 'auto' },
|
||||||
|
window: {
|
||||||
|
icon: 'fas fa-pen',
|
||||||
|
title: 'Note de bord',
|
||||||
|
resizable: false,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: {
|
||||||
|
template: `modules/${MODULE_ID}/templates/journal-note-dialog.hbs`,
|
||||||
|
root: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
constructor({ imperialDate, realDate, onSave } = {}) {
|
||||||
|
super();
|
||||||
|
this._imperialDate = imperialDate;
|
||||||
|
this._realDate = realDate;
|
||||||
|
this._onSave = onSave;
|
||||||
|
}
|
||||||
|
|
||||||
|
get title() {
|
||||||
|
return 'Note de bord';
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
return {
|
||||||
|
imperialDate: this._imperialDate,
|
||||||
|
realDate: this._realDate,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async _onRender(context, options) {
|
||||||
|
await super._onRender(context, options);
|
||||||
|
const html = $(this.element);
|
||||||
|
|
||||||
|
html.find('[data-action="save"]').on('click', async () => {
|
||||||
|
const content = html.find('[name="content"]').val()?.trim();
|
||||||
|
try {
|
||||||
|
await this._onSave?.(content);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`${MODULE_ID} | Erreur sauvegarde note:`, err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
close() {
|
||||||
|
this._onSave = null;
|
||||||
|
return super.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
+114
-40
@@ -19,12 +19,15 @@ export class SectorMapApp extends ApplicationV2 {
|
|||||||
window: { icon: 'fas fa-map', resizable: true, controls: [] },
|
window: { icon: 'fas fa-map', resizable: true, controls: [] },
|
||||||
};
|
};
|
||||||
|
|
||||||
constructor(sector, subsector) {
|
constructor(sector, subsector, { readOnly = false } = {}) {
|
||||||
super();
|
super();
|
||||||
this._sector = sector;
|
this._sector = sector;
|
||||||
this._subsector = subsector;
|
this._subsector = subsector;
|
||||||
|
this._readOnly = readOnly;
|
||||||
this._handler = null;
|
this._handler = null;
|
||||||
this._mapHex = null;
|
this._mapHex = null;
|
||||||
|
this._mapCenter = null;
|
||||||
|
this._mapScale = null;
|
||||||
this._searchTimeout = null;
|
this._searchTimeout = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,13 +40,16 @@ export class SectorMapApp extends ApplicationV2 {
|
|||||||
|
|
||||||
get _mapUrl() {
|
get _mapUrl() {
|
||||||
const base = 'https://travellermap.com';
|
const base = 'https://travellermap.com';
|
||||||
|
const cb = this._readOnly ? '' : '&callback=postmessage';
|
||||||
if (!this._sector) return `${base}/?style=mongoose&hideui=1`;
|
if (!this._sector) return `${base}/?style=mongoose&hideui=1`;
|
||||||
if (this._subsector) {
|
if (this._subsector) {
|
||||||
return `${base}/?sector=${encodeURIComponent(this._sector)}&subsector=${encodeURIComponent(this._subsector)}&style=mongoose&hideui=1`;
|
return `${base}/?sector=${encodeURIComponent(this._sector)}&subsector=${encodeURIComponent(this._subsector)}&style=mongoose&hideui=1${cb}`;
|
||||||
}
|
}
|
||||||
let url = `${base}/go/${encodeURIComponent(this._sector)}?style=mongoose`;
|
let url = `${base}/?sector=${encodeURIComponent(this._sector)}&style=mongoose&hideui=1${cb}`;
|
||||||
if (this._mapHex) {
|
if (this._mapHex) {
|
||||||
url += `&hex=${this._mapHex}&scale=512`;
|
url += `&hex=${this._mapHex}&scale=512`;
|
||||||
|
} else if (this._mapCenter && this._mapScale) {
|
||||||
|
url += `¢er=${this._mapCenter}&scale=${this._mapScale}`;
|
||||||
}
|
}
|
||||||
return url;
|
return url;
|
||||||
}
|
}
|
||||||
@@ -58,6 +64,20 @@ export class SectorMapApp extends ApplicationV2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_renderHTML() {
|
_renderHTML() {
|
||||||
|
if (this._readOnly) {
|
||||||
|
return `<div class="mgt2-sector-map-outer">
|
||||||
|
<div class="mgt2-sector-map-toolbar mgt2-sector-map-toolbar--ro">
|
||||||
|
<span class="mgt2-sector-map-label">${SectorMapApp._escapeAttr(this.title)}</span>
|
||||||
|
<span class="mgt2-sector-map-hint">Carte partagée par le MJ</span>
|
||||||
|
</div>
|
||||||
|
<iframe
|
||||||
|
src="${this._mapUrl}"
|
||||||
|
class="mgt2-sector-map-frame"
|
||||||
|
allow="clipboard-write"
|
||||||
|
referrerpolicy="no-referrer">
|
||||||
|
</iframe>
|
||||||
|
</div>`;
|
||||||
|
}
|
||||||
return `<div class="mgt2-sector-map-outer">
|
return `<div class="mgt2-sector-map-outer">
|
||||||
<div class="mgt2-sector-map-toolbar">
|
<div class="mgt2-sector-map-toolbar">
|
||||||
<div class="mgt2-sector-map-search">
|
<div class="mgt2-sector-map-search">
|
||||||
@@ -66,8 +86,7 @@ export class SectorMapApp extends ApplicationV2 {
|
|||||||
</div>
|
</div>
|
||||||
<span class="mgt2-sector-map-label">${this._sector ? `${this._sector}${this._subsector ? ` — ss.${this._subsector}` : ''}` : 'Toute la carte'}</span>
|
<span class="mgt2-sector-map-label">${this._sector ? `${this._sector}${this._subsector ? ` — ss.${this._subsector}` : ''}` : 'Toute la carte'}</span>
|
||||||
<span class="mgt2-sector-map-hint">Cliquez sur un hex pour voir les détails du monde</span>
|
<span class="mgt2-sector-map-hint">Cliquez sur un hex pour voir les détails du monde</span>
|
||||||
<button type="button" class="mgt2-sector-map-share" title="Partager une image fixe dans le chat"><i class="fas fa-image"></i> Partager</button>
|
<button type="button" class="mgt2-sector-map-sync" disabled title="Cliquez d'abord sur un hex pour définir la position à synchroniser"><i class="fas fa-users"></i> Synchroniser</button>
|
||||||
<button type="button" class="mgt2-sector-map-sync" title="Ouvrir la carte interactive chez tous les joueurs"><i class="fas fa-users"></i> Synchroniser</button>
|
|
||||||
<button type="button" class="mgt2-sector-map-travel" title="Planifier un voyage"><i class="fas fa-route"></i> Voyage</button>
|
<button type="button" class="mgt2-sector-map-travel" title="Planifier un voyage"><i class="fas fa-route"></i> Voyage</button>
|
||||||
</div>
|
</div>
|
||||||
<iframe
|
<iframe
|
||||||
@@ -80,10 +99,11 @@ export class SectorMapApp extends ApplicationV2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async _onRender(context, options) {
|
async _onRender(context, options) {
|
||||||
|
if (this._readOnly) {
|
||||||
|
this._listen();
|
||||||
|
return;
|
||||||
|
}
|
||||||
this._listen();
|
this._listen();
|
||||||
this.element?.querySelector('.mgt2-sector-map-share')?.addEventListener('click', () => {
|
|
||||||
this._shareMap();
|
|
||||||
});
|
|
||||||
this.element?.querySelector('.mgt2-sector-map-sync')?.addEventListener('click', () => {
|
this.element?.querySelector('.mgt2-sector-map-sync')?.addEventListener('click', () => {
|
||||||
this._syncAll();
|
this._syncAll();
|
||||||
});
|
});
|
||||||
@@ -112,16 +132,24 @@ export class SectorMapApp extends ApplicationV2 {
|
|||||||
_listen() {
|
_listen() {
|
||||||
if (this._handler) return;
|
if (this._handler) return;
|
||||||
this._handler = (event) => {
|
this._handler = (event) => {
|
||||||
// Accept messages from travellermap or any origin (for testing)
|
|
||||||
const d = event.data || {};
|
const d = event.data || {};
|
||||||
|
if (d.type === 'viewport') {
|
||||||
|
this._sector = d.sector || this._sector;
|
||||||
|
this._subsector = d.subsector || this._subsector;
|
||||||
|
this._mapHex = d.hex || null;
|
||||||
|
this._mapCenter = (d.x != null && d.y != null) ? `${d.x},${d.y}` : null;
|
||||||
|
this._mapScale = d.scale || null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Click on map
|
||||||
const wx = d.x ?? d.location?.x;
|
const wx = d.x ?? d.location?.x;
|
||||||
const wy = d.y ?? d.location?.y;
|
const wy = d.y ?? d.location?.y;
|
||||||
if (wx == null || wy == null) return;
|
if (wx == null || wy == null) return;
|
||||||
const x = Number(wx);
|
const x = Number(wx);
|
||||||
const y = Number(wy);
|
const y = Number(wy);
|
||||||
if (isNaN(x) || isNaN(y)) return;
|
if (isNaN(x) || isNaN(y)) return;
|
||||||
console.log('SectorMapApp | click at', x, y, 'from', event.origin);
|
this._onMapClick({ x, y }).catch(err => {
|
||||||
this._onMapClick({x, y}).catch(err => {
|
|
||||||
console.error('SectorMapApp | click handler failed:', err);
|
console.error('SectorMapApp | click handler failed:', err);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -149,6 +177,13 @@ export class SectorMapApp extends ApplicationV2 {
|
|||||||
const sectorName = meta.Names?.[0]?.Text;
|
const sectorName = meta.Names?.[0]?.Text;
|
||||||
if (!sectorName) { console.error('SectorMapApp | no Names[0].Text in metadata', meta); return; }
|
if (!sectorName) { console.error('SectorMapApp | no Names[0].Text in metadata', meta); return; }
|
||||||
|
|
||||||
|
// Store click position for sync
|
||||||
|
this._sector = sectorName;
|
||||||
|
this._subsector = null;
|
||||||
|
this._mapHex = String(hx).padStart(2, '0') + String(hy).padStart(2, '0');
|
||||||
|
this._mapCenter = `${wx},${wy}`;
|
||||||
|
this._mapScale = loc.scale || 512;
|
||||||
|
|
||||||
const hex = String(hx).padStart(2, '0') + String(hy).padStart(2, '0');
|
const hex = String(hx).padStart(2, '0') + String(hy).padStart(2, '0');
|
||||||
const resp = await fetch(
|
const resp = await fetch(
|
||||||
`https://travellermap.com/data/${encodeURIComponent(sectorName)}/${hex}`
|
`https://travellermap.com/data/${encodeURIComponent(sectorName)}/${hex}`
|
||||||
@@ -159,9 +194,19 @@ export class SectorMapApp extends ApplicationV2 {
|
|||||||
const world = data.Worlds?.[0];
|
const world = data.Worlds?.[0];
|
||||||
if (!world) { console.error('SectorMapApp | no Worlds in data', data); return; }
|
if (!world) { console.error('SectorMapApp | no Worlds in data', data); return; }
|
||||||
|
|
||||||
|
this._enableSyncButton(world.Name || hex);
|
||||||
|
|
||||||
this._postWorldCard(world);
|
this._postWorldCard(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_enableSyncButton(worldName) {
|
||||||
|
const btn = this.element?.querySelector('.mgt2-sector-map-sync');
|
||||||
|
if (btn) {
|
||||||
|
btn.disabled = false;
|
||||||
|
btn.title = worldName ? `Synchroniser la vue sur ${worldName}` : 'Ouvrir la carte interactive chez tous les joueurs';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ───── Carte de chat ───── */
|
/* ───── Carte de chat ───── */
|
||||||
|
|
||||||
static _STARPORT = { A:'Excellent', B:'Bon', C:'Routinier', D:'Médiocre', E:'Frontière', X:'Aucun' };
|
static _STARPORT = { A:'Excellent', B:'Bon', C:'Routinier', D:'Médiocre', E:'Frontière', X:'Aucun' };
|
||||||
@@ -508,6 +553,9 @@ export class SectorMapApp extends ApplicationV2 {
|
|||||||
this._sector = sector;
|
this._sector = sector;
|
||||||
this._subsector = null;
|
this._subsector = null;
|
||||||
this._mapHex = hex;
|
this._mapHex = hex;
|
||||||
|
this._mapCenter = null;
|
||||||
|
this._mapScale = null;
|
||||||
|
this._enableSyncButton(name);
|
||||||
|
|
||||||
const iframe = this.element?.querySelector('.mgt2-sector-map-frame');
|
const iframe = this.element?.querySelector('.mgt2-sector-map-frame');
|
||||||
if (iframe) iframe.src = this._mapUrl;
|
if (iframe) iframe.src = this._mapUrl;
|
||||||
@@ -517,41 +565,67 @@ export class SectorMapApp extends ApplicationV2 {
|
|||||||
|
|
||||||
/* ───── Partage ───── */
|
/* ───── Partage ───── */
|
||||||
|
|
||||||
_shareMap() {
|
async _syncAll() {
|
||||||
if (!this._sector) {
|
if (!game.socket?.emit) {
|
||||||
ui.notifications.warn('Aucun secteur sélectionné — utilisez la recherche pour centrer sur un secteur');
|
ui.notifications.warn('Socket indisponible — impossible de synchroniser');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const posterUrl = `https://travellermap.com/api/poster?sector=${encodeURIComponent(this._sector)}${this._subsector ? `&subsector=${encodeURIComponent(this._subsector)}` : ''}&style=mongoose&scale=128&dpr=2`;
|
try {
|
||||||
const label = this._subsector
|
// Tentative de récupération du zoom via getViewport
|
||||||
? `Sous-secteur ${this._subsector} — ${this._sector}`
|
const viewport = await new Promise((resolve) => {
|
||||||
: `Secteur ${this._sector}`;
|
const handler = (event) => {
|
||||||
|
if (event.data?.type === 'viewport') {
|
||||||
|
window.removeEventListener('message', handler);
|
||||||
|
resolve(event.data);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
window.addEventListener('message', handler);
|
||||||
|
const iframe = this.element?.querySelector('.mgt2-sector-map-frame');
|
||||||
|
if (iframe?.contentWindow) {
|
||||||
|
iframe.contentWindow.postMessage(
|
||||||
|
{ source: 'travellermap', type: 'getViewport' },
|
||||||
|
'*'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
setTimeout(() => {
|
||||||
|
window.removeEventListener('message', handler);
|
||||||
|
resolve(null);
|
||||||
|
}, 1000);
|
||||||
|
});
|
||||||
|
|
||||||
const html = `<section class="mgt2-shared-map">
|
if (viewport) {
|
||||||
<div class="mgt2-world-card-header">
|
this._sector = viewport.sector || this._sector;
|
||||||
<span class="mgt2-world-name">${label}</span>
|
this._subsector = viewport.subsector || this._subsector;
|
||||||
</div>
|
this._mapHex = viewport.hex || this._mapHex;
|
||||||
<div class="mgt2-shared-map-image">
|
this._mapCenter = (viewport.x != null && viewport.y != null) ? `${viewport.x},${viewport.y}` : this._mapCenter;
|
||||||
<img src="${posterUrl}" alt="${label}">
|
this._mapScale = viewport.scale || this._mapScale;
|
||||||
</div>
|
}
|
||||||
<div class="mgt2-shared-map-footer">
|
|
||||||
<a href="https://travellermap.com/go/${encodeURIComponent(this._sector)}" target="_blank" rel="noopener">
|
|
||||||
Ouvrir sur Traveller Map <i class="fas fa-external-link-alt"></i>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</section>`;
|
|
||||||
|
|
||||||
ChatMessage.create({ content: html, rollMode: 'public' });
|
const payload = {
|
||||||
ui.notifications.info(`Carte partagée avec les joueurs`);
|
_type: 'sectorMapSync',
|
||||||
|
sector: this._sector,
|
||||||
|
subsector: this._subsector,
|
||||||
|
mapHex: this._mapHex,
|
||||||
|
mapCenter: this._mapCenter,
|
||||||
|
mapScale: this._mapScale,
|
||||||
|
};
|
||||||
|
const players = game.users.filter(u => !u.isGM && u.active);
|
||||||
|
for (const player of players) {
|
||||||
|
game.socket.emit(`module.${MODULE_ID}`, payload);
|
||||||
|
}
|
||||||
|
ui.notifications.info(`Vue synchronisée chez ${players.length} joueur(s)`);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`${MODULE_ID} | Erreur socket sync:`, err);
|
||||||
|
ui.notifications.error('Erreur lors de la synchronisation');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_syncAll() {
|
updatePosition(sector, subsector, mapHex, mapUrl) {
|
||||||
game.socket.emit(`module.${MODULE_ID}`, {
|
this._sector = sector;
|
||||||
type: 'sectorMapSync',
|
this._subsector = subsector;
|
||||||
sector: this._sector,
|
this._mapHex = mapHex || null;
|
||||||
subsector: this._subsector,
|
const iframe = this.element?.querySelector('.mgt2-sector-map-frame');
|
||||||
});
|
if (iframe) iframe.src = mapUrl || this._mapUrl;
|
||||||
ui.notifications.info(`Carte synchronisée chez tous les joueurs`);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_openTravelDialog() {
|
_openTravelDialog() {
|
||||||
|
|||||||
@@ -0,0 +1,300 @@
|
|||||||
|
import { CommerceDialog } from './CommerceDialog.js';
|
||||||
|
import { NpcDialog } from './NpcDialog.js';
|
||||||
|
import { SectorMapApp } from './SectorMapApp.js';
|
||||||
|
|
||||||
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
|
||||||
|
|
||||||
|
const IMAGE_EXTENSIONS = new Set(['png', 'webp', 'jpg', 'jpeg', 'gif', 'svg', 'avif', 'bmp', 'tiff', 'tif']);
|
||||||
|
|
||||||
|
class BatchNpcDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
id: 'mgt2-batch-npc',
|
||||||
|
classes: ['mgt2-npc-dialog'],
|
||||||
|
position: { width: 540, height: 'auto' },
|
||||||
|
window: { title: 'Création de PNJs par lots', resizable: true },
|
||||||
|
form: { submitOnClose: false, closeOnSubmit: false },
|
||||||
|
};
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: {
|
||||||
|
template: `modules/${MODULE_ID}/templates/batch-npc-dialog.hbs`,
|
||||||
|
root: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
constructor(options = {}) {
|
||||||
|
super(options);
|
||||||
|
this._formData = {
|
||||||
|
batch: {
|
||||||
|
directory: '',
|
||||||
|
folderName: 'PNJs importés',
|
||||||
|
openSheets: false,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
return { ...this._formData };
|
||||||
|
}
|
||||||
|
|
||||||
|
async _onRender(context, options) {
|
||||||
|
await super._onRender(context, options);
|
||||||
|
const html = $('#' + this.id).find('.window-content');
|
||||||
|
|
||||||
|
this._applyTheme(html);
|
||||||
|
|
||||||
|
html.find('[data-action="browse-directory"]').on('click', async () => {
|
||||||
|
// Foundry v14: FilePicker avec pickFolders pour sélectionner un répertoire
|
||||||
|
try {
|
||||||
|
const fp = new FilePicker({
|
||||||
|
type: 'folder',
|
||||||
|
current: this._formData.batch.directory || '',
|
||||||
|
callback: (path) => {
|
||||||
|
this._formData.batch.directory = path;
|
||||||
|
html.find('[name="batch.directory"]').val(path);
|
||||||
|
},
|
||||||
|
pickFolders: true,
|
||||||
|
field: null,
|
||||||
|
button: null,
|
||||||
|
});
|
||||||
|
fp.render(true);
|
||||||
|
return;
|
||||||
|
} catch (_e) { /* fallback v13 */ }
|
||||||
|
// Fallback v13: selection d'un fichier → extraction du dossier parent
|
||||||
|
const fp = new FilePicker({
|
||||||
|
type: 'image',
|
||||||
|
current: this._formData.batch.directory || '',
|
||||||
|
callback: (path) => {
|
||||||
|
const dir = path.split('/').slice(0, -1).join('/');
|
||||||
|
this._formData.batch.directory = dir;
|
||||||
|
html.find('[name="batch.directory"]').val(dir);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
fp.render(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[data-action="batch-create"]').on('click', async () => {
|
||||||
|
this._readForm(html);
|
||||||
|
await this._executeBatch(html);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_readForm(html) {
|
||||||
|
this._formData.batch.directory = (html.find('[name="batch.directory"]').val()?.trim() || '').replace(/\/+$/, '');
|
||||||
|
this._formData.batch.folderName = html.find('[name="batch.folderName"]').val()?.trim() || 'PNJs importés';
|
||||||
|
this._formData.batch.openSheets = html.find('[name="batch.openSheets"]').is(':checked');
|
||||||
|
}
|
||||||
|
|
||||||
|
_applyTheme(html) {
|
||||||
|
html.find('h3').css({ color: '#5f4300', 'border-bottom-color': '#b78f26', 'text-shadow': 'none' });
|
||||||
|
html.find('legend').css({ color: '#7a5c00', 'text-shadow': 'none' });
|
||||||
|
}
|
||||||
|
|
||||||
|
async _executeBatch(html) {
|
||||||
|
const { directory, folderName, openSheets } = this._formData.batch;
|
||||||
|
|
||||||
|
if (!directory) {
|
||||||
|
ui.notifications.warn('Veuillez spécifier un répertoire source.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const $progress = html.find('#batch-progress');
|
||||||
|
const $fill = html.find('#batch-progress-fill');
|
||||||
|
const $text = html.find('#batch-progress-text');
|
||||||
|
$progress.show();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$text.text('Analyse du répertoire...');
|
||||||
|
|
||||||
|
let files;
|
||||||
|
try {
|
||||||
|
const result = await FilePicker.browse('data', directory);
|
||||||
|
files = result.files || [];
|
||||||
|
} catch (e) {
|
||||||
|
$progress.hide();
|
||||||
|
ui.notifications.error(`Impossible de lire le répertoire « ${directory} » : ${e.message}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const imageFiles = files.filter(f => {
|
||||||
|
const ext = f.split('.').pop()?.toLowerCase();
|
||||||
|
return ext && IMAGE_EXTENSIONS.has(ext);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (imageFiles.length === 0) {
|
||||||
|
$progress.hide();
|
||||||
|
ui.notifications.warn(`Aucune image trouvée dans « ${directory} ».`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$text.text(`${imageFiles.length} image(s) trouvée(s). Vérification des doublons...`);
|
||||||
|
|
||||||
|
const normalizePath = (p) => p.replace(/^[\\/]+/, '').replace(/[\\/]+/g, '/').toLowerCase();
|
||||||
|
|
||||||
|
const existingImages = new Set();
|
||||||
|
for (const actor of game.actors) {
|
||||||
|
if (actor.img && actor.img !== 'icons/svg/mystery-man.svg') {
|
||||||
|
existingImages.add(normalizePath(actor.img));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const toCreate = imageFiles.filter(f => !existingImages.has(normalizePath(f)));
|
||||||
|
|
||||||
|
if (toCreate.length === 0) {
|
||||||
|
$progress.hide();
|
||||||
|
ui.notifications.info('Tous les PNJs existent déjà (aucune nouvelle image à traiter).');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let folder = null;
|
||||||
|
if (folderName) {
|
||||||
|
folder = game.folders.find(f => f.name === folderName && f.type === 'Actor');
|
||||||
|
if (!folder) {
|
||||||
|
folder = await Folder.create({ name: folderName, type: 'Actor', parent: null });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$text.text(`Création de ${toCreate.length} PNJ(s)...`);
|
||||||
|
|
||||||
|
const chunkSize = 10;
|
||||||
|
let created = 0;
|
||||||
|
const allCreated = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < toCreate.length; i += chunkSize) {
|
||||||
|
const chunk = toCreate.slice(i, i + chunkSize);
|
||||||
|
const actorsData = chunk.map(path => {
|
||||||
|
const name = path.split('/').pop().replace(/\.[^/.]+$/, '');
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
type: 'npc',
|
||||||
|
img: path,
|
||||||
|
folder: folder?.id || null,
|
||||||
|
token: {
|
||||||
|
name,
|
||||||
|
img: path,
|
||||||
|
actorLink: true,
|
||||||
|
disposition: 0,
|
||||||
|
sight: { enabled: false },
|
||||||
|
},
|
||||||
|
system: {
|
||||||
|
settings: { hideUntrained: true, lockCharacteristics: true },
|
||||||
|
characteristics: {},
|
||||||
|
hits: {},
|
||||||
|
skills: {},
|
||||||
|
},
|
||||||
|
flags: {
|
||||||
|
[MODULE_ID]: { batchImported: true, sourceImage: path },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
const actors = await Actor.create(actorsData, { renderSheet: false });
|
||||||
|
allCreated.push(...actors);
|
||||||
|
created += actors.length;
|
||||||
|
|
||||||
|
const pct = Math.min(100, Math.round((i + chunkSize) / toCreate.length * 100));
|
||||||
|
$fill.css('width', pct + '%');
|
||||||
|
$text.text(`${created}/${toCreate.length} PNJ(s) créé(s)...`);
|
||||||
|
}
|
||||||
|
|
||||||
|
ui.actors?.render(false);
|
||||||
|
|
||||||
|
$fill.css('width', '100%');
|
||||||
|
$text.text(`${created} PNJ(s) créé(s) avec succès dans le dossier « ${folderName} » !`);
|
||||||
|
ui.notifications.info(`${created} PNJ(s) créé(s) à partir des images.`);
|
||||||
|
|
||||||
|
if (openSheets && allCreated.length > 0) {
|
||||||
|
const lastActor = allCreated[allCreated.length - 1];
|
||||||
|
if (lastActor) lastActor.sheet?.render(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`${MODULE_ID} | Batch NPC creation error:`, error);
|
||||||
|
$text.text(`Erreur : ${error.message}`);
|
||||||
|
ui.notifications.error(`Erreur lors de la création : ${error.message}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Hooks.on('renderActorDirectory', (app, html, data) => {
|
||||||
|
if (!game.user?.isGM) return;
|
||||||
|
const $html = html instanceof jQuery ? html : $(html);
|
||||||
|
if ($html.find('.mgt2-batch-npc-btn').length) return;
|
||||||
|
|
||||||
|
const btn = $(`<button class="mgt2-batch-npc-btn" style="margin:4px 8px;flex:0;background:#2c2c3e;color:#d9b24c;border:1px solid #c9a227;">
|
||||||
|
<i class="fas fa-users"></i> Importer PNJs par lots
|
||||||
|
</button>`);
|
||||||
|
|
||||||
|
const shortcuts = [
|
||||||
|
{ icon: 'fa-balance-scale', label: 'Commerce', abbr: 'Commerce', action: 'commerce', cls: 'mgt2-shortcut-commerce', title: 'Ouvrir le commerce' },
|
||||||
|
{ icon: 'fa-user', label: 'PNJ rapide', abbr: 'PNJ', action: 'npc', cls: 'mgt2-shortcut-pnj', title: 'Générer un PNJ rapide' },
|
||||||
|
{ icon: 'fa-random', label: 'Rencontre', abbr: 'Rencontre', action: 'encounter', cls: 'mgt2-shortcut-rencontre', title: 'Générer une rencontre' },
|
||||||
|
{ icon: 'fa-briefcase', label: 'Mission', abbr: 'Mission', action: 'mission', cls: 'mgt2-shortcut-mission', title: 'Générer une mission' },
|
||||||
|
{ icon: 'fa-image', label: 'Fermer portraits', abbr: 'Fermer img', action: 'closePortraits', cls: 'mgt2-shortcut-closeimg', title: 'Fermer les portraits affichés aux joueurs' },
|
||||||
|
];
|
||||||
|
|
||||||
|
const grid = $(`<div style="display:grid;grid-template-columns:1fr 1fr;gap:4px;margin:4px 8px;"></div>`);
|
||||||
|
shortcuts.forEach(s => {
|
||||||
|
const b = $(`<button class="${s.cls}" title="${s.title}" style="background:#2c2c3e;color:#d9b24c;border:1px solid #c9a227;padding:4px 6px;font-size:0.78em;cursor:pointer;border-radius:3px;text-align:center;">
|
||||||
|
<i class="fas ${s.icon}"></i> ${s.abbr}
|
||||||
|
</button>`).on('click', () => {
|
||||||
|
if (s.action === 'commerce') new CommerceDialog().render({ force: true });
|
||||||
|
else if (s.action === 'closePortraits') {
|
||||||
|
game.socket.emit(`module.${MODULE_ID}`, { _type: 'closeImagePopout' });
|
||||||
|
ui.notifications.info('Fermeture des portraits envoyée aux joueurs');
|
||||||
|
}
|
||||||
|
else new NpcDialog({ initialTab: s.action }).render({ force: true });
|
||||||
|
});
|
||||||
|
grid.append(b);
|
||||||
|
});
|
||||||
|
|
||||||
|
const footer = $html.find('.directory-footer');
|
||||||
|
if (footer.length) {
|
||||||
|
footer.append(btn);
|
||||||
|
footer.append(grid);
|
||||||
|
} else {
|
||||||
|
$html.find('.directory-header').after(btn);
|
||||||
|
$html.find('.directory-header').after(grid);
|
||||||
|
}
|
||||||
|
|
||||||
|
btn.on('click', () => {
|
||||||
|
new BatchNpcDialog().render({ force: true });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
Hooks.on('renderSceneDirectory', (app, html, data) => {
|
||||||
|
if (!game.user?.isGM) return;
|
||||||
|
const $html = html instanceof jQuery ? html : $(html);
|
||||||
|
if ($html.find('.mgt2-sector-btn').length) return;
|
||||||
|
|
||||||
|
const sectorBtn = $(`<button class="mgt2-sector-btn" style="margin:4px 8px;flex:0;background:#2c2c3e;color:#d9b24c;border:1px solid #c9a227;cursor:pointer;">
|
||||||
|
<i class="fas fa-map"></i> Traveller Map
|
||||||
|
</button>`).on('click', () => {
|
||||||
|
new SectorMapApp().render({ force: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
const canvasBtn = $(`<button class="mgt2-canvas-sync-btn" style="margin:4px 8px;flex:0;background:#2c2c3e;color:#d9b24c;border:1px solid #c9a227;cursor:pointer;">
|
||||||
|
<i class="fas fa-eye"></i> Sync vue MJ
|
||||||
|
</button>`).on('click', () => {
|
||||||
|
const pivot = canvas.stage?.pivot;
|
||||||
|
const scale = canvas.stage?.scale?.x;
|
||||||
|
if (!pivot || !scale) { ui.notifications.warn('Canvas pas encore prêt'); return; }
|
||||||
|
const players = game.users.filter(u => !u.isGM && u.active).map(u => u.id);
|
||||||
|
if (!players.length) { ui.notifications.warn('Aucun joueur connecté'); return; }
|
||||||
|
game.socket.emit(`module.${MODULE_ID}`, {
|
||||||
|
_type: 'canvasSync',
|
||||||
|
x: pivot.x,
|
||||||
|
y: pivot.y,
|
||||||
|
scale,
|
||||||
|
});
|
||||||
|
ui.notifications.info(`Vue synchronisée chez ${players.length} joueur(s)`);
|
||||||
|
});
|
||||||
|
|
||||||
|
const grid = $(`<div style="display:grid;grid-template-columns:1fr 1fr;gap:4px;margin:4px 8px;"></div>`);
|
||||||
|
grid.append(sectorBtn, canvasBtn);
|
||||||
|
|
||||||
|
const footer = $html.find('.directory-footer');
|
||||||
|
if (footer.length) footer.append(grid);
|
||||||
|
else $html.find('.directory-header').after(grid);
|
||||||
|
});
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
|
||||||
|
export function imperialToSolomani(impYear) {
|
||||||
|
return Math.round(impYear * 1.0006644 + 4521);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function imperialToVilani(impYear) {
|
||||||
|
return Math.round((impYear + 4045) / 1.312);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function imperialToZhodani(impYear) {
|
||||||
|
const raw = (impYear + 6731) / 2.26;
|
||||||
|
const olympiad = Math.floor(raw);
|
||||||
|
const frac = raw - olympiad;
|
||||||
|
const year = Math.min(3, Math.max(1, Math.round(frac * 3)));
|
||||||
|
return { olympiad, year, label: `${olympiad}.${year}` };
|
||||||
|
}
|
||||||
|
|
||||||
|
export function imperialToAslan(impYear) {
|
||||||
|
return Math.round((impYear + 2083) / 0.877);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function imperialToKkree(impYear) {
|
||||||
|
return Math.round((impYear + 8145) / 1.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function imperialToHiver(impYear) {
|
||||||
|
return Math.round((impYear - 410) * 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function computeConversions(impYear) {
|
||||||
|
const y = impYear ?? 1116;
|
||||||
|
const z = imperialToZhodani(y);
|
||||||
|
return {
|
||||||
|
solomani: `${imperialToSolomani(y)} AD`,
|
||||||
|
vilani: `${imperialToVilani(y)} VI`,
|
||||||
|
zhodani: z.label,
|
||||||
|
aslan: `${imperialToAslan(y)}`,
|
||||||
|
kkree: `${imperialToKkree(y)}`,
|
||||||
|
hiver: `${imperialToHiver(y)} HF`,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export const DAY_NAMES = [
|
||||||
|
'Holiday',
|
||||||
|
'Wonday',
|
||||||
|
'Tuday',
|
||||||
|
'Thirday',
|
||||||
|
'Forday',
|
||||||
|
'Fiday',
|
||||||
|
'Sixday',
|
||||||
|
'Senday',
|
||||||
|
];
|
||||||
|
|
||||||
|
export const DAY_LABELS_FR = {
|
||||||
|
Holiday: 'Holiday',
|
||||||
|
Wonday: 'Wonday',
|
||||||
|
Tuday: 'Tuday',
|
||||||
|
Thirday: 'Thirday',
|
||||||
|
Forday: 'Forday',
|
||||||
|
Fiday: 'Fiday',
|
||||||
|
Sixday: 'Sixday',
|
||||||
|
Senday: 'Senday',
|
||||||
|
};
|
||||||
|
|
||||||
|
export function getDayLabel(day) {
|
||||||
|
if (day < 1 || day > 365) return '?';
|
||||||
|
if (day === 1) return DAY_NAMES[0];
|
||||||
|
return DAY_NAMES[((day - 2) % 7) + 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getWeekday(day) {
|
||||||
|
if (day < 1 || day > 365) return -1;
|
||||||
|
if (day === 1) return -1;
|
||||||
|
return (day - 2) % 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function formatImperialDate({ year, day, hour, minute, planet } = {}) {
|
||||||
|
const y = year ?? 1116;
|
||||||
|
const d = day ?? 1;
|
||||||
|
const dayLabel = getDayLabel(d);
|
||||||
|
const dayStr = String(d).padStart(3, '0');
|
||||||
|
let label = `${dayLabel}, ${dayStr}-${y} IC`;
|
||||||
|
if (hour != null && minute != null) {
|
||||||
|
const h = String(Math.round(hour)).padStart(2, '0');
|
||||||
|
const m = String(Math.round(minute)).padStart(2, '0');
|
||||||
|
label += ` ─ ${h}:${m}`;
|
||||||
|
if (planet) label += ` (${planet})`;
|
||||||
|
}
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getDefaultCalendar() {
|
||||||
|
return { year: 1116, day: 1, hour: 12, minute: 0, planet: '' };
|
||||||
|
}
|
||||||
|
|
||||||
|
export function formatRealDate() {
|
||||||
|
const d = new Date();
|
||||||
|
const y = d.getFullYear();
|
||||||
|
const m = String(d.getMonth() + 1).padStart(2, '0');
|
||||||
|
const day = String(d.getDate()).padStart(2, '0');
|
||||||
|
const h = String(d.getHours()).padStart(2, '0');
|
||||||
|
const min = String(d.getMinutes()).padStart(2, '0');
|
||||||
|
return `${day}/${m}/${y} ${h}:${min}`;
|
||||||
|
}
|
||||||
@@ -0,0 +1,274 @@
|
|||||||
|
import { CalendarApp } from './CalendarApp.js';
|
||||||
|
import { CalendarConfigDialog } from './CalendarConfigDialog.js';
|
||||||
|
import { JournalNoteDialog } from './JournalNoteDialog.js';
|
||||||
|
import { getDefaultCalendar, formatImperialDate, formatRealDate } from './calendarDate.js';
|
||||||
|
|
||||||
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
const ChatLogV2 = foundry.applications.sidebar.tabs.ChatLog;
|
||||||
|
|
||||||
|
let _calendarApp = null;
|
||||||
|
|
||||||
|
function readCalendar() {
|
||||||
|
return {
|
||||||
|
year: game.settings.get(MODULE_ID, 'calendarYear'),
|
||||||
|
day: game.settings.get(MODULE_ID, 'calendarDay'),
|
||||||
|
hour: game.settings.get(MODULE_ID, 'calendarHour'),
|
||||||
|
minute: game.settings.get(MODULE_ID, 'calendarMinute'),
|
||||||
|
planet: game.settings.get(MODULE_ID, 'calendarPlanet'),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async function writeCalendar(data) {
|
||||||
|
await game.settings.set(MODULE_ID, 'calendarYear', data.year);
|
||||||
|
await game.settings.set(MODULE_ID, 'calendarDay', data.day);
|
||||||
|
await game.settings.set(MODULE_ID, 'calendarHour', data.hour);
|
||||||
|
await game.settings.set(MODULE_ID, 'calendarMinute', data.minute);
|
||||||
|
await game.settings.set(MODULE_ID, 'calendarPlanet', data.planet);
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyCalendar(data) {
|
||||||
|
if (_calendarApp) {
|
||||||
|
_calendarApp.updateDisplay(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function broadcastCalendar(data) {
|
||||||
|
if (!game.socket?.emit) return;
|
||||||
|
game.socket.emit(`module.${MODULE_ID}`, {
|
||||||
|
_type: 'calendarSync',
|
||||||
|
...data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function openCalendarApp() {
|
||||||
|
if (_calendarApp) {
|
||||||
|
_calendarApp.bringToTop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const data = readCalendar();
|
||||||
|
_calendarApp = new CalendarApp({
|
||||||
|
onConfig: () => openCalendarConfig(),
|
||||||
|
onNote: () => openJournalNote(),
|
||||||
|
onClose: () => { _calendarApp = null; },
|
||||||
|
});
|
||||||
|
_calendarApp.updateDisplay(data);
|
||||||
|
_calendarApp.render({ force: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
function openCalendarConfig() {
|
||||||
|
const data = readCalendar();
|
||||||
|
const dialog = new CalendarConfigDialog({
|
||||||
|
data,
|
||||||
|
onApply: async (newData) => {
|
||||||
|
await writeCalendar(newData);
|
||||||
|
applyCalendar(newData);
|
||||||
|
broadcastCalendar(newData);
|
||||||
|
dialog.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
dialog.render({ force: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
async function appendJournalNote(content, { dateLabel, realLabel } = {}) {
|
||||||
|
if (!content) return false;
|
||||||
|
const journalName = game.settings.get(MODULE_ID, 'calendarJournalName') || 'Journal de bord';
|
||||||
|
let journal = game.journal.getName(journalName);
|
||||||
|
if (!journal) {
|
||||||
|
journal = await JournalEntry.create({ name: journalName });
|
||||||
|
if (!journal) {
|
||||||
|
ui.notifications.error('Impossible de créer le journal');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!dateLabel || !realLabel) {
|
||||||
|
const c = readCalendar();
|
||||||
|
dateLabel = formatImperialDate(c);
|
||||||
|
realLabel = formatRealDate();
|
||||||
|
}
|
||||||
|
const safeContent = $('<div>').text(content).html().replace(/\n/g, '<br>');
|
||||||
|
const noteHtml = `<hr>
|
||||||
|
<h3>${realLabel} — ${dateLabel}</h3>
|
||||||
|
<p>${safeContent}</p>`;
|
||||||
|
let page = journal.pages.contents[0];
|
||||||
|
if (!page) {
|
||||||
|
[page] = await journal.createEmbeddedDocuments('JournalEntryPage', [{ name: 'Notes', text: { content: '' } }]);
|
||||||
|
}
|
||||||
|
if (!page) {
|
||||||
|
ui.notifications.error('Impossible de créer une page dans le journal');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const existing = page.text?.content || '';
|
||||||
|
await page.update({ 'text.content': existing + '\n' + noteHtml });
|
||||||
|
ui.notifications.info(`Note ajoutée au journal « ${journalName} »`);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function openJournalNote() {
|
||||||
|
const calendar = readCalendar();
|
||||||
|
const dateLabel = formatImperialDate(calendar);
|
||||||
|
const realLabel = formatRealDate();
|
||||||
|
const dialog = new JournalNoteDialog({
|
||||||
|
imperialDate: dateLabel,
|
||||||
|
realDate: realLabel,
|
||||||
|
onSave: async (content) => {
|
||||||
|
const ok = await appendJournalNote(content, { dateLabel, realLabel });
|
||||||
|
if (ok) dialog.close();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
dialog.render({ force: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
function registerCalCommand() {
|
||||||
|
if (!ChatLogV2?.CHAT_COMMANDS) return;
|
||||||
|
ChatLogV2.CHAT_COMMANDS.cal = {
|
||||||
|
rgx: /^\/cal(?:\s+(.*))?$/i,
|
||||||
|
fn: () => {
|
||||||
|
openCalendarApp();
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(`${MODULE_ID} | Commande /cal enregistrée via ChatLog.CHAT_COMMANDS`);
|
||||||
|
}
|
||||||
|
|
||||||
|
Hooks.once('init', () => {
|
||||||
|
const def = getDefaultCalendar();
|
||||||
|
|
||||||
|
game.settings.register(MODULE_ID, 'calendarYear', {
|
||||||
|
name: 'Année impériale',
|
||||||
|
scope: 'world',
|
||||||
|
config: false,
|
||||||
|
type: Number,
|
||||||
|
default: def.year,
|
||||||
|
});
|
||||||
|
game.settings.register(MODULE_ID, 'calendarDay', {
|
||||||
|
name: 'Jour impérial (1-365)',
|
||||||
|
scope: 'world',
|
||||||
|
config: false,
|
||||||
|
type: Number,
|
||||||
|
default: def.day,
|
||||||
|
});
|
||||||
|
game.settings.register(MODULE_ID, 'calendarHour', {
|
||||||
|
name: 'Heure locale',
|
||||||
|
scope: 'world',
|
||||||
|
config: false,
|
||||||
|
type: Number,
|
||||||
|
default: def.hour,
|
||||||
|
});
|
||||||
|
game.settings.register(MODULE_ID, 'calendarMinute', {
|
||||||
|
name: 'Minute locale',
|
||||||
|
scope: 'world',
|
||||||
|
config: false,
|
||||||
|
type: Number,
|
||||||
|
default: def.minute,
|
||||||
|
});
|
||||||
|
game.settings.register(MODULE_ID, 'calendarPlanet', {
|
||||||
|
name: 'Planète',
|
||||||
|
scope: 'world',
|
||||||
|
config: false,
|
||||||
|
type: String,
|
||||||
|
default: def.planet,
|
||||||
|
});
|
||||||
|
game.settings.register(MODULE_ID, 'calendarAutoOpen', {
|
||||||
|
name: 'Calendrier impérial : auto-ouverture',
|
||||||
|
hint: 'Ouvre automatiquement la fenêtre du calendrier au démarrage',
|
||||||
|
scope: 'world',
|
||||||
|
config: true,
|
||||||
|
type: Boolean,
|
||||||
|
default: true,
|
||||||
|
});
|
||||||
|
game.settings.register(MODULE_ID, 'calendarJournalName', {
|
||||||
|
name: 'Journal de bord',
|
||||||
|
hint: 'Nom du journal utilisé pour les notes de session. Créé automatiquement s\'il n\'existe pas.',
|
||||||
|
scope: 'world',
|
||||||
|
config: true,
|
||||||
|
type: String,
|
||||||
|
default: 'Journal de bord',
|
||||||
|
});
|
||||||
|
game.settings.register(MODULE_ID, 'calendarPosition', {
|
||||||
|
scope: 'client',
|
||||||
|
config: false,
|
||||||
|
type: Object,
|
||||||
|
default: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
const loadTemplatesFn = foundry.applications?.handlebars?.loadTemplates || loadTemplates;
|
||||||
|
if (loadTemplatesFn) {
|
||||||
|
loadTemplatesFn([
|
||||||
|
`modules/${MODULE_ID}/templates/calendar-app.hbs`,
|
||||||
|
`modules/${MODULE_ID}/templates/calendar-config.hbs`,
|
||||||
|
`modules/${MODULE_ID}/templates/journal-note-dialog.hbs`,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCalCommand();
|
||||||
|
console.log(`${MODULE_ID} | Calendrier impérial initialisé`);
|
||||||
|
});
|
||||||
|
|
||||||
|
Hooks.once('ready', () => {
|
||||||
|
game.socket.on(`module.${MODULE_ID}`, (data) => {
|
||||||
|
if (game.user?.isGM) return;
|
||||||
|
if (data?._type !== 'calendarSync') return;
|
||||||
|
if (!_calendarApp) {
|
||||||
|
const { year, day, hour, minute, planet } = data;
|
||||||
|
_calendarApp = new CalendarApp({
|
||||||
|
onClose: () => { _calendarApp = null; },
|
||||||
|
});
|
||||||
|
_calendarApp.updateDisplay({ year, day, hour, minute, planet });
|
||||||
|
_calendarApp.render({ force: true });
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_calendarApp.updateDisplay(data);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (game.settings.get(MODULE_ID, 'calendarAutoOpen')) {
|
||||||
|
openCalendarApp();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Hooks.on('preCreateChatMessage', (message, data, options) => {
|
||||||
|
const content = message.content?.trim()?.toLowerCase();
|
||||||
|
if (content === '/cal' || content?.startsWith('/cal ')) {
|
||||||
|
openCalendarApp();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Hooks.on('chatMessage', (...args) => {
|
||||||
|
let message;
|
||||||
|
if (args[0]?.content !== undefined) {
|
||||||
|
message = args[0].content;
|
||||||
|
} else if (typeof args[1] === 'string') {
|
||||||
|
message = args[1];
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const trimmed = message?.trim()?.toLowerCase();
|
||||||
|
if (trimmed === '/cal' || trimmed?.startsWith('/cal ')) {
|
||||||
|
openCalendarApp();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Hooks.on('renderChatInput', (app, html, data) => {
|
||||||
|
let input;
|
||||||
|
if (html?.element) {
|
||||||
|
input = $(html.element).find('textarea[name="content"]');
|
||||||
|
} else if (html?.find) {
|
||||||
|
input = html.find('textarea[name="content"]');
|
||||||
|
} else {
|
||||||
|
input = $(html).find('textarea[name="content"]');
|
||||||
|
}
|
||||||
|
if (input.data('mgt2-cal-listener')) return;
|
||||||
|
input.data('mgt2-cal-listener', true);
|
||||||
|
input.on('keydown', (event) => {
|
||||||
|
if (event.key === 'Enter' && !event.shiftKey) {
|
||||||
|
const content = input.val()?.trim();
|
||||||
|
if (content === '/cal' || content?.startsWith('/cal ')) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopImmediatePropagation();
|
||||||
|
openCalendarApp();
|
||||||
|
input.val('');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -38,6 +38,8 @@ Hooks.once('init', () => {
|
|||||||
`modules/${MODULE_ID}/templates/traveller-npc-dialog.hbs`,
|
`modules/${MODULE_ID}/templates/traveller-npc-dialog.hbs`,
|
||||||
`modules/${MODULE_ID}/templates/traveller-npc-result.hbs`,
|
`modules/${MODULE_ID}/templates/traveller-npc-result.hbs`,
|
||||||
`modules/${MODULE_ID}/templates/ally-enemy-result.hbs`,
|
`modules/${MODULE_ID}/templates/ally-enemy-result.hbs`,
|
||||||
|
`modules/${MODULE_ID}/templates/batch-npc-dialog.hbs`,
|
||||||
|
`modules/${MODULE_ID}/templates/player-map.hbs`,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-10
@@ -16,9 +16,10 @@ let _pendingHandle = false;
|
|||||||
|
|
||||||
/* ───── Fonctions partagées ───── */
|
/* ───── Fonctions partagées ───── */
|
||||||
|
|
||||||
async function openMap(sector, subsector) {
|
async function openMap(sector, subsector, { readOnly = false } = {}) {
|
||||||
const app = new SectorMapApp(sector, subsector);
|
const app = new SectorMapApp(sector, subsector, { readOnly });
|
||||||
await app.render({ force: true });
|
await app.render({ force: true });
|
||||||
|
return app;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function handleSectorCommand(sector, subsector) {
|
async function handleSectorCommand(sector, subsector) {
|
||||||
@@ -139,16 +140,9 @@ Hooks.on('preCreateChatMessage', (message, data, options) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/* ───── Socket (synchronisation MJ → joueurs) ───── */
|
/* ───── Socket (synchronisation MJ → joueurs) ───── voir sectorSocket.js ───── */
|
||||||
|
|
||||||
Hooks.once('ready', () => {
|
Hooks.once('ready', () => {
|
||||||
game.socket.on(`module.${MODULE_ID}`, (data) => {
|
|
||||||
if (data?.type !== 'sectorMapSync') return;
|
|
||||||
if (game.user?.isGM) return;
|
|
||||||
openMap(data.sector, data.subsector);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Clics sur les liens de monde dans les journals de trajet
|
|
||||||
document.addEventListener('click', (event) => {
|
document.addEventListener('click', (event) => {
|
||||||
const link = event.target.closest('.mgt2-world-link');
|
const link = event.target.closest('.mgt2-world-link');
|
||||||
if (!link) return;
|
if (!link) return;
|
||||||
|
|||||||
@@ -0,0 +1,108 @@
|
|||||||
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
|
||||||
|
|
||||||
|
let _playerDialog = null;
|
||||||
|
|
||||||
|
class PlayerMapDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
id: 'mgt2-sector-map-player',
|
||||||
|
classes: ['mgt2-sector-map'],
|
||||||
|
position: { width: 960, height: 720 },
|
||||||
|
window: { icon: 'fas fa-map', resizable: true },
|
||||||
|
};
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: {
|
||||||
|
template: `modules/${MODULE_ID}/templates/player-map.hbs`,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
constructor(url, sector) {
|
||||||
|
super();
|
||||||
|
this._mapUrl = url;
|
||||||
|
this._sectorLabel = sector ? `Secteur ${sector}` : 'Carte stellaire';
|
||||||
|
}
|
||||||
|
|
||||||
|
get title() { return this._sectorLabel; }
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
return { url: this._mapUrl };
|
||||||
|
}
|
||||||
|
|
||||||
|
updateMap(url) {
|
||||||
|
this._mapUrl = url;
|
||||||
|
const iframe = this.element?.querySelector('iframe');
|
||||||
|
if (iframe) iframe.src = url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildMapUrl(sector, subsector, mapHex, mapCenter, mapScale) {
|
||||||
|
const base = 'https://travellermap.com';
|
||||||
|
if (!sector) return `${base}/?style=mongoose&hideui=1`;
|
||||||
|
if (subsector) {
|
||||||
|
let url = `${base}/?sector=${encodeURIComponent(sector)}&subsector=${encodeURIComponent(subsector)}&style=mongoose&hideui=1`;
|
||||||
|
if (mapCenter && mapScale) url += `¢er=${mapCenter}&scale=${mapScale}`;
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
let url = `${base}/?sector=${encodeURIComponent(sector)}&style=mongoose&hideui=1`;
|
||||||
|
if (mapHex) {
|
||||||
|
url += `&hex=${mapHex}&scale=512`;
|
||||||
|
} else if (mapCenter && mapScale) {
|
||||||
|
url += `¢er=${mapCenter}&scale=${mapScale}`;
|
||||||
|
}
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
|
Hooks.once('ready', () => {
|
||||||
|
console.log(`${MODULE_ID} | sectorSocket pret`);
|
||||||
|
|
||||||
|
game.socket.on(`module.${MODULE_ID}`, (data) => {
|
||||||
|
if (game.user?.isGM) return;
|
||||||
|
|
||||||
|
if (data?._type === 'sectorMapSync') {
|
||||||
|
try {
|
||||||
|
const url = buildMapUrl(data.sector, data.subsector, data.mapHex, data.mapCenter, data.mapScale);
|
||||||
|
if (_playerDialog) {
|
||||||
|
_playerDialog.updateMap(url);
|
||||||
|
_playerDialog.bringToTop?.();
|
||||||
|
console.log(`${MODULE_ID} | Carte mise a jour`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_playerDialog = new PlayerMapDialog(url, data.sector);
|
||||||
|
_playerDialog.render({ force: true }).then(() => {
|
||||||
|
console.log(`${MODULE_ID} | Dialog affiche`);
|
||||||
|
}).catch(err => {
|
||||||
|
console.error(`${MODULE_ID} | Erreur render:`, err);
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`${MODULE_ID} | Erreur:`, err);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data?._type === 'canvasSync') {
|
||||||
|
try {
|
||||||
|
const { x, y, scale } = data;
|
||||||
|
console.log(`${MODULE_ID} | Canvas sync recu:`, x, y, scale);
|
||||||
|
canvas.animatePan({ x, y, scale, duration: 0 });
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`${MODULE_ID} | Erreur canvas sync:`, err);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data?._type === 'closeImagePopout') {
|
||||||
|
try {
|
||||||
|
let closed = 0;
|
||||||
|
document.querySelectorAll('.image-popout, [class*="image-popout"], [id*="image-popout"]').forEach(el => {
|
||||||
|
el.remove(); closed++;
|
||||||
|
});
|
||||||
|
console.log(`${MODULE_ID} | ${closed} portrait(s) fermé(s)`);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(`${MODULE_ID} | Erreur close portraits:`, err);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -12,7 +12,7 @@ function buildStartupNoticeHtml() {
|
|||||||
<div style="padding:6px 8px;border-left:4px solid #c9a227;background:#f5f0e8;color:#2c2c3e;line-height:1.45;">
|
<div style="padding:6px 8px;border-left:4px solid #c9a227;background:#f5f0e8;color:#2c2c3e;line-height:1.45;">
|
||||||
<strong>MgT2e – outils</strong>
|
<strong>MgT2e – outils</strong>
|
||||||
<span style="color:#6a5422;">·</span>
|
<span style="color:#6a5422;">·</span>
|
||||||
<code>/commerce</code> <code>/pnj</code> <code>/rencontre</code> <code>/mission</code>
|
<code>/cal</code> <code>/commerce</code> <code>/pnj</code> <code>/rencontre</code> <code>/mission</code> <code>/sector</code>
|
||||||
<div style="margin-top:2px;font-size:0.92em;color:#6a5422;">
|
<div style="margin-top:2px;font-size:0.92em;color:#6a5422;">
|
||||||
par <a href="https://www.uberwald.me" target="_blank" rel="noopener noreferrer">LeRatierBretonnien / Uberwald</a>
|
par <a href="https://www.uberwald.me" target="_blank" rel="noopener noreferrer">LeRatierBretonnien / Uberwald</a>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+329
-6
@@ -414,6 +414,14 @@ button.btn-calculate:hover,
|
|||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mgt2-sector-map-toolbar--ro {
|
||||||
|
justify-content: center;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
background: #1e2833;
|
||||||
|
border-bottom: 1px solid #5f7a99;
|
||||||
|
}
|
||||||
|
|
||||||
.mgt2-sector-map-label {
|
.mgt2-sector-map-label {
|
||||||
color: #d9b24c;
|
color: #d9b24c;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
@@ -508,7 +516,6 @@ button.btn-calculate:hover,
|
|||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mgt2-sector-map-share,
|
|
||||||
.mgt2-sector-map-sync,
|
.mgt2-sector-map-sync,
|
||||||
.mgt2-sector-map-travel {
|
.mgt2-sector-map-travel {
|
||||||
background: #c9a227;
|
background: #c9a227;
|
||||||
@@ -522,7 +529,6 @@ button.btn-calculate:hover,
|
|||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mgt2-sector-map-share:hover,
|
|
||||||
.mgt2-sector-map-sync:hover,
|
.mgt2-sector-map-sync:hover,
|
||||||
.mgt2-sector-map-travel:hover {
|
.mgt2-sector-map-travel:hover {
|
||||||
background: #d9b24c;
|
background: #d9b24c;
|
||||||
@@ -766,10 +772,6 @@ button.btn-calculate:hover,
|
|||||||
color: #222;
|
color: #222;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mgt2-shared-map .mgt2-sector-map-share {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.mgt2-shared-map-image {
|
.mgt2-shared-map-image {
|
||||||
line-height: 0;
|
line-height: 0;
|
||||||
}
|
}
|
||||||
@@ -1113,3 +1115,324 @@ a.mgt2-world-link {
|
|||||||
a.mgt2-world-link:hover {
|
a.mgt2-world-link:hover {
|
||||||
color: #8a4aaa;
|
color: #8a4aaa;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* === Batch NPC Creator =================================================== */
|
||||||
|
|
||||||
|
.mgt2-batch-npc-form {
|
||||||
|
gap: 10px;
|
||||||
|
padding: 14px 16px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-batch-npc-form .input-group {
|
||||||
|
display: flex;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-batch-npc-form .input-group input {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-batch-npc-form .input-group .btn-small {
|
||||||
|
flex: 0 0 32px;
|
||||||
|
padding: 4px 6px;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-progress {
|
||||||
|
margin: 8px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-progress-bar {
|
||||||
|
height: 8px;
|
||||||
|
background: #ddd;
|
||||||
|
border-radius: 4px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-progress-fill {
|
||||||
|
height: 100%;
|
||||||
|
width: 0%;
|
||||||
|
background: linear-gradient(90deg, #b78f26, #d9b24c);
|
||||||
|
border-radius: 4px;
|
||||||
|
transition: width 0.3s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.batch-progress-text {
|
||||||
|
font-size: 0.85em;
|
||||||
|
color: #555;
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* === Calendrier Impérial =================================================== */
|
||||||
|
|
||||||
|
.mgt2-calendar .window-header {
|
||||||
|
background: linear-gradient(180deg, rgba(44, 44, 62, 0.96) 0%, rgba(30, 30, 43, 0.96) 100%);
|
||||||
|
border-bottom: 1px solid #c9a227;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-calendar .window-title {
|
||||||
|
color: #d9b24c;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-calendar .window-content {
|
||||||
|
padding: 4px 8px;
|
||||||
|
background: #1a1a2e;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-window {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
gap: 8px;
|
||||||
|
min-height: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-display {
|
||||||
|
flex: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-actions {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
gap: 2px;
|
||||||
|
flex: 0 0 auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-date {
|
||||||
|
color: #d8c79a;
|
||||||
|
font-size: 0.95em;
|
||||||
|
font-family: 'Roboto', sans-serif;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-config-btn {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
padding: 0;
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
color: #8a7a5a;
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 0.85em;
|
||||||
|
border-radius: 3px;
|
||||||
|
transition: color 0.15s, background 0.15s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-config-btn:hover {
|
||||||
|
color: #d9b24c;
|
||||||
|
background: rgba(201, 162, 39, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Config dialog */
|
||||||
|
|
||||||
|
.mgt2-cal-config {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 8px;
|
||||||
|
background: #1a1a2e;
|
||||||
|
color: #d8c79a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-config-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-config-row label {
|
||||||
|
flex: 0 0 80px;
|
||||||
|
font-size: 0.85em;
|
||||||
|
color: #b8a87a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-config-row input[type="number"],
|
||||||
|
.mgt2-cal-config-row input[type="text"] {
|
||||||
|
flex: 1;
|
||||||
|
padding: 3px 6px;
|
||||||
|
border: 1px solid #3a3a4e;
|
||||||
|
border-radius: 3px;
|
||||||
|
background: #252540;
|
||||||
|
color: #d8c79a;
|
||||||
|
font-size: 0.85em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-config-row input:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: #c9a227;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-day-group {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-day-group input {
|
||||||
|
flex: 0 0 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-day-label {
|
||||||
|
font-size: 0.85em;
|
||||||
|
color: #d9b24c;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-config-actions {
|
||||||
|
display: flex;
|
||||||
|
gap: 6px;
|
||||||
|
justify-content: flex-end;
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-btn {
|
||||||
|
padding: 4px 10px;
|
||||||
|
border: 1px solid #3a3a4e;
|
||||||
|
border-radius: 3px;
|
||||||
|
background: #252540;
|
||||||
|
color: #d8c79a;
|
||||||
|
font-size: 0.82em;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: background 0.15s, border-color 0.15s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-btn:hover {
|
||||||
|
background: #303050;
|
||||||
|
border-color: #c9a227;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-btn-primary {
|
||||||
|
background: linear-gradient(180deg, #c9a227 0%, #a8881e 100%);
|
||||||
|
color: #1a1a2e;
|
||||||
|
border-color: #c9a227;
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-btn-primary:hover {
|
||||||
|
background: linear-gradient(180deg, #d9b24c 0%, #c9a227 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-conversions {
|
||||||
|
margin-top: 8px;
|
||||||
|
border: 1px solid #3a3a4e;
|
||||||
|
border-radius: 3px;
|
||||||
|
background: #1e1e32;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-conversions summary {
|
||||||
|
padding: 4px 8px;
|
||||||
|
color: #b8a87a;
|
||||||
|
font-size: 0.82em;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-conversions summary:hover {
|
||||||
|
color: #d9b24c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-conv-note {
|
||||||
|
font-size: 0.85em;
|
||||||
|
color: #6a6a7e;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-conv-row {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 2px 8px;
|
||||||
|
font-size: 0.82em;
|
||||||
|
color: #d8c79a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-conv-row:nth-child(even) {
|
||||||
|
background: rgba(255,255,255,0.03);
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-conv-label {
|
||||||
|
color: #8a7a5a;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Note button on calendar app */
|
||||||
|
|
||||||
|
.mgt2-cal-note-btn {
|
||||||
|
flex: 0 0 auto;
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
padding: 0;
|
||||||
|
border: none;
|
||||||
|
background: transparent;
|
||||||
|
color: #8a7a5a;
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-size: 0.85em;
|
||||||
|
border-radius: 3px;
|
||||||
|
transition: color 0.15s, background 0.15s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-cal-note-btn:hover {
|
||||||
|
color: #d9b24c;
|
||||||
|
background: rgba(201, 162, 39, 0.15);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Note dialog */
|
||||||
|
|
||||||
|
.mgt2-note-form {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 8px;
|
||||||
|
background: #1a1a2e;
|
||||||
|
color: #d8c79a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-note-row {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-note-row label {
|
||||||
|
font-size: 0.8em;
|
||||||
|
color: #8a7a5a;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-note-value {
|
||||||
|
font-size: 0.9em;
|
||||||
|
color: #d8c79a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-note-row textarea {
|
||||||
|
width: 100%;
|
||||||
|
padding: 6px;
|
||||||
|
border: 1px solid #3a3a4e;
|
||||||
|
border-radius: 3px;
|
||||||
|
background: #252540;
|
||||||
|
color: #d8c79a;
|
||||||
|
font-size: 0.85em;
|
||||||
|
font-family: inherit;
|
||||||
|
resize: vertical;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-note-row textarea:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: #c9a227;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mgt2-note-actions {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
margin-top: 4px;
|
||||||
|
}
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
<form class="mgt2-npc-form mgt2-batch-npc-form">
|
||||||
|
|
||||||
|
<fieldset style="padding:8px 10px;margin:0 0 6px">
|
||||||
|
<div class="form-group-row" style="gap:8px">
|
||||||
|
<div class="form-group" style="flex:1;min-width:0">
|
||||||
|
<label for="batch-directory" style="font-size:0.88em">Répertoire des images</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<input id="batch-directory" name="batch.directory" type="text" value="{{batch.directory}}" placeholder="worlds/mon-monde/images">
|
||||||
|
<button type="button" class="btn-small" data-action="browse-directory" title="Parcourir" style="flex:0 0 28px;padding:2px 4px"><i class="fas fa-folder-open"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group" style="flex:0 0 180px">
|
||||||
|
<label for="batch-folderName" style="font-size:0.88em">Dossier Acteur</label>
|
||||||
|
<input id="batch-folderName" name="batch.folderName" type="text" value="{{batch.folderName}}" placeholder="PNJs importés">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
|
||||||
|
<div class="form-group checkbox-group" style="margin:0 0 6px;padding:0 10px">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" name="batch.openSheets" {{#if batch.openSheets}}checked{{/if}}>
|
||||||
|
Ouvrir la dernière fiche
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="batch-progress" class="batch-progress" style="display:none;margin:0 10px 6px">
|
||||||
|
<div class="batch-progress-bar"><div class="batch-progress-fill" id="batch-progress-fill"></div></div>
|
||||||
|
<div class="batch-progress-text" id="batch-progress-text" style="font-size:0.78em">Initialisation...</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-footer" style="padding:6px 10px">
|
||||||
|
<button type="button" class="btn-calculate" data-action="batch-create" style="padding:4px 12px;font-size:0.85em">
|
||||||
|
<i class="fas fa-dice-d6"></i> Créer les PNJs
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<div class="mgt2-cal-window">
|
||||||
|
<div class="mgt2-cal-display">
|
||||||
|
<span class="mgt2-cal-date">{{dateLabel}}</span>
|
||||||
|
</div>
|
||||||
|
{{#if isGM}}
|
||||||
|
<div class="mgt2-cal-actions">
|
||||||
|
<button type="button" class="mgt2-cal-note-btn" title="Ajouter une note de bord">
|
||||||
|
<i class="fas fa-pen"></i>
|
||||||
|
</button>
|
||||||
|
<button type="button" class="mgt2-cal-config-btn" title="Configurer le calendrier">
|
||||||
|
<i class="fas fa-cog"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
<form class="mgt2-cal-config">
|
||||||
|
<div class="mgt2-cal-config-row">
|
||||||
|
<label for="cal-year">Année</label>
|
||||||
|
<input type="number" id="cal-year" name="year" value="{{year}}" min="0" max="9999">
|
||||||
|
</div>
|
||||||
|
<div class="mgt2-cal-config-row">
|
||||||
|
<label for="cal-day">Jour</label>
|
||||||
|
<div class="mgt2-cal-day-group">
|
||||||
|
<input type="number" id="cal-day" name="day" value="{{day}}" min="1" max="365">
|
||||||
|
<span class="mgt2-cal-day-label">{{dayLabel}}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="mgt2-cal-config-row">
|
||||||
|
<label for="cal-hour">Heure</label>
|
||||||
|
<input type="number" id="cal-hour" name="hour" value="{{hour}}" min="0" max="23">
|
||||||
|
</div>
|
||||||
|
<div class="mgt2-cal-config-row">
|
||||||
|
<label for="cal-minute">Minute</label>
|
||||||
|
<input type="number" id="cal-minute" name="minute" value="{{minute}}" min="0" max="59">
|
||||||
|
</div>
|
||||||
|
<div class="mgt2-cal-config-row">
|
||||||
|
<label for="cal-planet">Planète</label>
|
||||||
|
<input type="text" id="cal-planet" name="planet" value="{{planet}}" placeholder="p. ex. Terra">
|
||||||
|
</div>
|
||||||
|
<div class="mgt2-cal-config-actions">
|
||||||
|
<button type="button" class="mgt2-cal-btn" data-action="day-inc"><i class="fas fa-plus"></i> +1 jour</button>
|
||||||
|
<button type="button" class="mgt2-cal-btn" data-action="hour-inc"><i class="fas fa-plus"></i> +1 heure</button>
|
||||||
|
<button type="button" class="mgt2-cal-btn mgt2-cal-btn-primary" data-action="apply">Appliquer</button>
|
||||||
|
</div>
|
||||||
|
<details class="mgt2-cal-conversions">
|
||||||
|
<summary>Conversions calendaires <span class="mgt2-cal-conv-note">(approximatif)</span></summary>
|
||||||
|
<div class="mgt2-cal-conv-row"><span class="mgt2-cal-conv-label">Solomani</span><span class="mgt2-cal-conv-val" data-cal="solomani">{{conversions.solomani}}</span></div>
|
||||||
|
<div class="mgt2-cal-conv-row"><span class="mgt2-cal-conv-label">Vilani</span><span class="mgt2-cal-conv-val" data-cal="vilani">{{conversions.vilani}}</span></div>
|
||||||
|
<div class="mgt2-cal-conv-row"><span class="mgt2-cal-conv-label">Zhodani</span><span class="mgt2-cal-conv-val" data-cal="zhodani">{{conversions.zhodani}}</span></div>
|
||||||
|
<div class="mgt2-cal-conv-row"><span class="mgt2-cal-conv-label">Aslan</span><span class="mgt2-cal-conv-val" data-cal="aslan">{{conversions.aslan}}</span></div>
|
||||||
|
<div class="mgt2-cal-conv-row"><span class="mgt2-cal-conv-label">K'Kree</span><span class="mgt2-cal-conv-val" data-cal="kkree">{{conversions.kkree}}</span></div>
|
||||||
|
<div class="mgt2-cal-conv-row"><span class="mgt2-cal-conv-label">Hiver</span><span class="mgt2-cal-conv-val" data-cal="hiver">{{conversions.hiver}}</span></div>
|
||||||
|
</details>
|
||||||
|
</form>
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
<form class="mgt2-note-form">
|
||||||
|
<div class="mgt2-note-row">
|
||||||
|
<label>Date impériale</label>
|
||||||
|
<span class="mgt2-note-value">{{imperialDate}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="mgt2-note-row">
|
||||||
|
<label>Date réelle</label>
|
||||||
|
<span class="mgt2-note-value">{{realDate}}</span>
|
||||||
|
</div>
|
||||||
|
<div class="mgt2-note-row">
|
||||||
|
<label for="note-content">Note</label>
|
||||||
|
<textarea id="note-content" name="content" rows="6" placeholder="Saisissez votre note…" autofocus></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="mgt2-note-actions">
|
||||||
|
<button type="button" class="mgt2-cal-btn mgt2-cal-btn-primary" data-action="save">
|
||||||
|
<i class="fas fa-save"></i> Enregistrer
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<div style="display:flex;flex-direction:column;height:100%;padding:0;overflow:hidden">
|
||||||
|
<iframe src="{{url}}" width="100%" height="100%" style="border:none" allow="clipboard-write" referrerpolicy="no-referrer"></iframe>
|
||||||
|
</div>
|
||||||
Reference in New Issue
Block a user