Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9abc2a8b19 | |||
| 9d96ec5543 | |||
| b6a4148829 | |||
| d8c61458ea | |||
| 9453c15d58 | |||
| 76870c27bf | |||
| ef7fe6e2bd | |||
| 4f53d903eb | |||
| c3cf8f176d | |||
| 386cf89d68 |
+30
-21
@@ -1,19 +1,28 @@
|
|||||||
{
|
{
|
||||||
"id": "mgt2-compendium-amiral-denisov",
|
"id": "mgt2-compendium-amiral-denisov",
|
||||||
"title": "MGT2 - Compendium Amiral Denisov",
|
"title": "MgT2e - Compendium Amiral Denisov",
|
||||||
"version": "1.1.0",
|
"version": "1.3.0",
|
||||||
"compatibility": {
|
"compatibility": {
|
||||||
"minimum": "11",
|
"minimum": "13",
|
||||||
"verified": "13"
|
"verified": "13",
|
||||||
|
"maximum": "14"
|
||||||
},
|
},
|
||||||
"description": "Module de compendium et d'outils MGT2 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.",
|
"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/commerce.js",
|
"scripts/commerce.js",
|
||||||
"scripts/npc.js"
|
"scripts/npc.js",
|
||||||
|
"scripts/utils/travellerNpcUtils.js",
|
||||||
|
"scripts/data/travellerNpcGenerator.js",
|
||||||
|
"scripts/travellerNpcGenerator.js",
|
||||||
|
"scripts/TravellerNpcDialog.js",
|
||||||
|
"scripts/mgt2eMigration.js",
|
||||||
|
"scripts/npcRollTableSync.js",
|
||||||
|
"scripts/mgt2eSkills.js"
|
||||||
],
|
],
|
||||||
"styles": [
|
"styles": [
|
||||||
"styles/commerce.css",
|
"styles/commerce.css",
|
||||||
"styles/npc.css"
|
"styles/npc.css",
|
||||||
|
"styles/traveller-npc.css"
|
||||||
],
|
],
|
||||||
"packs": [
|
"packs": [
|
||||||
{
|
{
|
||||||
@@ -21,7 +30,7 @@
|
|||||||
"label": "Armures",
|
"label": "Armures",
|
||||||
"path": "packs/armures",
|
"path": "packs/armures",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -29,10 +38,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "competences",
|
"name": "competences",
|
||||||
"label": "Compétences",
|
"label": "Références de compétences",
|
||||||
"path": "packs/competences",
|
"path": "packs/competences",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -43,7 +52,7 @@
|
|||||||
"label": "Maladie, Poison & Blessure",
|
"label": "Maladie, Poison & Blessure",
|
||||||
"path": "packs/maladie-poison-and-blessure",
|
"path": "packs/maladie-poison-and-blessure",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -54,7 +63,7 @@
|
|||||||
"label": "Objets",
|
"label": "Objets",
|
||||||
"path": "packs/objet",
|
"path": "packs/objet",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -65,7 +74,7 @@
|
|||||||
"label": "Équipement",
|
"label": "Équipement",
|
||||||
"path": "packs/equipement",
|
"path": "packs/equipement",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -76,7 +85,7 @@
|
|||||||
"label": "Ordinateur",
|
"label": "Ordinateur",
|
||||||
"path": "packs/ordinateur",
|
"path": "packs/ordinateur",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -87,7 +96,7 @@
|
|||||||
"label": "Contenant (sac, coffre)",
|
"label": "Contenant (sac, coffre)",
|
||||||
"path": "packs/contenant-sac-coffre",
|
"path": "packs/contenant-sac-coffre",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -98,7 +107,7 @@
|
|||||||
"label": "Espèce",
|
"label": "Espèce",
|
||||||
"path": "packs/espece",
|
"path": "packs/espece",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -109,7 +118,7 @@
|
|||||||
"label": "Journal Psioniques",
|
"label": "Journal Psioniques",
|
||||||
"path": "packs/journal",
|
"path": "packs/journal",
|
||||||
"type": "JournalEntry",
|
"type": "JournalEntry",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -120,7 +129,7 @@
|
|||||||
"label": "Armes",
|
"label": "Armes",
|
||||||
"path": "packs/armes",
|
"path": "packs/armes",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -131,7 +140,7 @@
|
|||||||
"label": "Talents psioniques",
|
"label": "Talents psioniques",
|
||||||
"path": "packs/talents-psioniques",
|
"path": "packs/talents-psioniques",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -142,7 +151,7 @@
|
|||||||
"label": "Carrières",
|
"label": "Carrières",
|
||||||
"path": "packs/carrieres",
|
"path": "packs/carrieres",
|
||||||
"type": "Item",
|
"type": "Item",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
@@ -153,7 +162,7 @@
|
|||||||
"label": "Tables PNJ & Rencontres",
|
"label": "Tables PNJ & Rencontres",
|
||||||
"path": "packs/tables-pnj",
|
"path": "packs/tables-pnj",
|
||||||
"type": "RollTable",
|
"type": "RollTable",
|
||||||
"system": "mgt2",
|
"system": "mgt2e",
|
||||||
"ownership": {
|
"ownership": {
|
||||||
"PLAYER": "OBSERVER",
|
"PLAYER": "OBSERVER",
|
||||||
"ASSISTANT": "OWNER"
|
"ASSISTANT": "OWNER"
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
|||||||
MANIFEST-000057
|
MANIFEST-000084
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/04/14-09:09:27.978364 7fddd97be6c0 Recovering log #53
|
2026/05/27-23:11:58.414164 7f3e6f7fe6c0 Recovering log #82
|
||||||
2026/04/14-09:09:28.036731 7fddd97be6c0 Delete type=3 #51
|
2026/05/27-23:11:58.424222 7f3e6f7fe6c0 Delete type=3 #80
|
||||||
2026/04/14-09:09:28.036869 7fddd97be6c0 Delete type=0 #53
|
2026/05/27-23:11:58.424274 7f3e6f7fe6c0 Delete type=0 #82
|
||||||
2026/04/14-09:37:12.068876 7fddca1c26c0 Level-0 table #60: started
|
2026/05/28-01:07:03.306861 7f3e6effd6c0 Level-0 table #87: started
|
||||||
2026/04/14-09:37:12.068921 7fddca1c26c0 Level-0 table #60: 0 bytes OK
|
2026/05/28-01:07:03.306872 7f3e6effd6c0 Level-0 table #87: 0 bytes OK
|
||||||
2026/04/14-09:37:12.075223 7fddca1c26c0 Delete type=0 #58
|
2026/05/28-01:07:03.314015 7f3e6effd6c0 Delete type=0 #85
|
||||||
2026/04/14-09:37:12.095906 7fddca1c26c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.314175 7f3e6effd6c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
|
||||||
2026/04/14-09:37:12.096000 7fddca1c26c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.314198 7f3e6effd6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
+8
-23
@@ -1,23 +1,8 @@
|
|||||||
2026/04/09-07:31:00.942216 7f20ecbfc6c0 Recovering log #50
|
2026/05/27-14:31:25.639035 7f3e6f7fe6c0 Recovering log #77
|
||||||
2026/04/09-07:31:00.952200 7f20ecbfc6c0 Delete type=0 #50
|
2026/05/27-14:31:25.648169 7f3e6f7fe6c0 Delete type=3 #75
|
||||||
2026/04/09-07:31:00.952272 7f20ecbfc6c0 Delete type=3 #49
|
2026/05/27-14:31:25.648196 7f3e6f7fe6c0 Delete type=0 #77
|
||||||
2026/04/09-23:11:56.221289 7f1e4ffff6c0 Level-0 table #54: started
|
2026/05/27-14:33:21.786747 7f3e6effd6c0 Level-0 table #83: started
|
||||||
2026/04/09-23:11:56.221324 7f1e4ffff6c0 Level-0 table #54: 0 bytes OK
|
2026/05/27-14:33:21.786766 7f3e6effd6c0 Level-0 table #83: 0 bytes OK
|
||||||
2026/04/09-23:11:56.284030 7f1e4ffff6c0 Delete type=0 #52
|
2026/05/27-14:33:21.793932 7f3e6effd6c0 Delete type=0 #81
|
||||||
2026/04/09-23:11:56.464040 7f1e4ffff6c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at '!items!yoIqL0RQEnzNVJB6' @ 51 : 1
|
2026/05/27-14:33:21.800554 7f3e6effd6c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:56.464048 7f1e4ffff6c0 Compacting 3@0 + 0@1 files
|
2026/05/27-14:33:21.800579 7f3e6effd6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:56.489855 7f1e4ffff6c0 Generated table #55@0: 22 keys, 13361 bytes
|
|
||||||
2026/04/09-23:11:56.489882 7f1e4ffff6c0 Compacted 3@0 + 0@1 files => 13361 bytes
|
|
||||||
2026/04/09-23:11:56.553027 7f1e4ffff6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:56.553148 7f1e4ffff6c0 Delete type=2 #35
|
|
||||||
2026/04/09-23:11:56.553292 7f1e4ffff6c0 Delete type=2 #38
|
|
||||||
2026/04/09-23:11:56.553357 7f1e4ffff6c0 Delete type=2 #45
|
|
||||||
2026/04/09-23:11:56.649265 7f1e4ffff6c0 Manual compaction at level-0 from '!items!yoIqL0RQEnzNVJB6' @ 51 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/09-23:11:56.821563 7f1e4ffff6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at '!items!yoIqL0RQEnzNVJB6' @ 95 : 1
|
|
||||||
2026/04/09-23:11:56.821571 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/09-23:11:56.851887 7f1e4ffff6c0 Generated table #56@1: 29 keys, 14529 bytes
|
|
||||||
2026/04/09-23:11:56.851915 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 14529 bytes
|
|
||||||
2026/04/09-23:11:56.904874 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:56.904997 7f1e4ffff6c0 Delete type=2 #11
|
|
||||||
2026/04/09-23:11:56.905136 7f1e4ffff6c0 Delete type=2 #55
|
|
||||||
2026/04/09-23:11:56.975641 7f1e4ffff6c0 Manual compaction at level-1 from '!items!yoIqL0RQEnzNVJB6' @ 95 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000156
|
MANIFEST-000183
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/04/14-09:09:27.370951 7fddd97be6c0 Recovering log #152
|
2026/05/27-23:11:58.290859 7f3e6f7fe6c0 Recovering log #181
|
||||||
2026/04/14-09:09:27.434776 7fddd97be6c0 Delete type=3 #150
|
2026/05/27-23:11:58.307573 7f3e6f7fe6c0 Delete type=3 #179
|
||||||
2026/04/14-09:09:27.434901 7fddd97be6c0 Delete type=0 #152
|
2026/05/27-23:11:58.307626 7f3e6f7fe6c0 Delete type=0 #181
|
||||||
2026/04/14-09:37:12.026954 7fddca1c26c0 Level-0 table #159: started
|
2026/05/28-01:07:03.251844 7f3e6effd6c0 Level-0 table #186: started
|
||||||
2026/04/14-09:37:12.027005 7fddca1c26c0 Level-0 table #159: 0 bytes OK
|
2026/05/28-01:07:03.251857 7f3e6effd6c0 Level-0 table #186: 0 bytes OK
|
||||||
2026/04/14-09:37:12.034241 7fddca1c26c0 Delete type=0 #157
|
2026/05/28-01:07:03.257706 7f3e6effd6c0 Delete type=0 #184
|
||||||
2026/04/14-09:37:12.041328 7fddca1c26c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.263618 7f3e6effd6c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
|
||||||
2026/04/14-09:37:12.041399 7fddca1c26c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.275995 7f3e6effd6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
+8
-23
@@ -1,23 +1,8 @@
|
|||||||
2026/04/09-07:31:00.828199 7f20ecbfc6c0 Recovering log #149
|
2026/05/27-14:31:25.531736 7f3ebd7ff6c0 Recovering log #176
|
||||||
2026/04/09-07:31:00.838410 7f20ecbfc6c0 Delete type=0 #149
|
2026/05/27-14:31:25.541455 7f3ebd7ff6c0 Delete type=3 #174
|
||||||
2026/04/09-07:31:00.838471 7f20ecbfc6c0 Delete type=3 #148
|
2026/05/27-14:31:25.541507 7f3ebd7ff6c0 Delete type=0 #176
|
||||||
2026/04/09-23:11:55.234068 7f1e4ffff6c0 Level-0 table #153: started
|
2026/05/27-14:33:21.722465 7f3e6effd6c0 Level-0 table #182: started
|
||||||
2026/04/09-23:11:55.245101 7f1e4ffff6c0 Level-0 table #153: 0 bytes OK
|
2026/05/27-14:33:21.722495 7f3e6effd6c0 Level-0 table #182: 0 bytes OK
|
||||||
2026/04/09-23:11:55.298794 7f1e4ffff6c0 Delete type=0 #151
|
2026/05/27-14:33:21.728923 7f3e6effd6c0 Delete type=0 #180
|
||||||
2026/04/09-23:11:55.490694 7f1e4ffff6c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at '!items!wpBopoosZiWXjlKD' @ 48 : 1
|
2026/05/27-14:33:21.735721 7f3e6effd6c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:55.490705 7f1e4ffff6c0 Compacting 3@0 + 0@1 files
|
2026/05/27-14:33:21.735741 7f3e6effd6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:55.533263 7f1e4ffff6c0 Generated table #154@0: 6 keys, 3346 bytes
|
|
||||||
2026/04/09-23:11:55.533295 7f1e4ffff6c0 Compacted 3@0 + 0@1 files => 3346 bytes
|
|
||||||
2026/04/09-23:11:55.591200 7f1e4ffff6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:55.591374 7f1e4ffff6c0 Delete type=2 #134
|
|
||||||
2026/04/09-23:11:55.591529 7f1e4ffff6c0 Delete type=2 #137
|
|
||||||
2026/04/09-23:11:55.591571 7f1e4ffff6c0 Delete type=2 #144
|
|
||||||
2026/04/09-23:11:55.689808 7f1e4ffff6c0 Manual compaction at level-0 from '!items!wpBopoosZiWXjlKD' @ 48 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/09-23:11:55.770926 7f1e4ffff6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at '!items!wpBopoosZiWXjlKD' @ 60 : 1
|
|
||||||
2026/04/09-23:11:55.770937 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/09-23:11:55.809869 7f1e4ffff6c0 Generated table #155@1: 6 keys, 3346 bytes
|
|
||||||
2026/04/09-23:11:55.809897 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 3346 bytes
|
|
||||||
2026/04/09-23:11:55.875143 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:55.875284 7f1e4ffff6c0 Delete type=2 #48
|
|
||||||
2026/04/09-23:11:55.875433 7f1e4ffff6c0 Delete type=2 #154
|
|
||||||
2026/04/09-23:11:56.005548 7f1e4ffff6c0 Manual compaction at level-1 from '!items!wpBopoosZiWXjlKD' @ 60 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000040
|
MANIFEST-000067
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/04/14-09:09:28.118399 7fddd9fbf6c0 Recovering log #36
|
2026/05/27-23:11:58.442577 7f3e6f7fe6c0 Recovering log #65
|
||||||
2026/04/14-09:09:28.175883 7fddd9fbf6c0 Delete type=3 #34
|
2026/05/27-23:11:58.452097 7f3e6f7fe6c0 Delete type=3 #63
|
||||||
2026/04/14-09:09:28.175997 7fddd9fbf6c0 Delete type=0 #36
|
2026/05/27-23:11:58.452144 7f3e6f7fe6c0 Delete type=0 #65
|
||||||
2026/04/14-09:37:12.089374 7fddca1c26c0 Level-0 table #43: started
|
2026/05/28-01:07:03.320241 7f3e6effd6c0 Level-0 table #70: started
|
||||||
2026/04/14-09:37:12.089426 7fddca1c26c0 Level-0 table #43: 0 bytes OK
|
2026/05/28-01:07:03.320254 7f3e6effd6c0 Level-0 table #70: 0 bytes OK
|
||||||
2026/04/14-09:37:12.095733 7fddca1c26c0 Delete type=0 #41
|
2026/05/28-01:07:03.326319 7f3e6effd6c0 Delete type=0 #68
|
||||||
2026/04/14-09:37:12.095967 7fddca1c26c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.356879 7f3e6effd6c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
|
||||||
2026/04/14-09:37:12.096017 7fddca1c26c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.381785 7f3e6effd6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
+8
-23
@@ -1,23 +1,8 @@
|
|||||||
2026/04/09-07:31:00.979881 7f20ee3ff6c0 Recovering log #33
|
2026/05/27-14:31:25.663213 7f3e6f7fe6c0 Recovering log #60
|
||||||
2026/04/09-07:31:00.989409 7f20ee3ff6c0 Delete type=0 #33
|
2026/05/27-14:31:25.672282 7f3e6f7fe6c0 Delete type=3 #58
|
||||||
2026/04/09-07:31:00.989487 7f20ee3ff6c0 Delete type=3 #32
|
2026/05/27-14:31:25.672315 7f3e6f7fe6c0 Delete type=0 #60
|
||||||
2026/04/09-23:11:57.513730 7f1e4ffff6c0 Level-0 table #37: started
|
2026/05/27-14:33:21.794049 7f3e6effd6c0 Level-0 table #66: started
|
||||||
2026/04/09-23:11:57.513772 7f1e4ffff6c0 Level-0 table #37: 0 bytes OK
|
2026/05/27-14:33:21.794078 7f3e6effd6c0 Level-0 table #66: 0 bytes OK
|
||||||
2026/04/09-23:11:57.575380 7f1e4ffff6c0 Delete type=0 #35
|
2026/05/27-14:33:21.800426 7f3e6effd6c0 Delete type=0 #64
|
||||||
2026/04/09-23:11:57.666141 7f1e4ffff6c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at '!items!vJInnoigCTJzuY2S' @ 46 : 1
|
2026/05/27-14:33:21.808266 7f3e6effd6c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:57.666147 7f1e4ffff6c0 Compacting 3@0 + 0@1 files
|
2026/05/27-14:33:21.831733 7f3e6effd6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:57.697606 7f1e4ffff6c0 Generated table #38@0: 16 keys, 3810 bytes
|
|
||||||
2026/04/09-23:11:57.697641 7f1e4ffff6c0 Compacted 3@0 + 0@1 files => 3810 bytes
|
|
||||||
2026/04/09-23:11:57.756255 7f1e4ffff6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:57.756373 7f1e4ffff6c0 Delete type=2 #18
|
|
||||||
2026/04/09-23:11:57.756513 7f1e4ffff6c0 Delete type=2 #21
|
|
||||||
2026/04/09-23:11:57.756574 7f1e4ffff6c0 Delete type=2 #28
|
|
||||||
2026/04/09-23:11:57.875863 7f1e4ffff6c0 Manual compaction at level-0 from '!items!vJInnoigCTJzuY2S' @ 46 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/09-23:11:57.944060 7f1e4ffff6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at '!items!vJInnoigCTJzuY2S' @ 78 : 1
|
|
||||||
2026/04/09-23:11:57.944066 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/09-23:11:57.976628 7f1e4ffff6c0 Generated table #39@1: 16 keys, 3810 bytes
|
|
||||||
2026/04/09-23:11:57.976654 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 3810 bytes
|
|
||||||
2026/04/09-23:11:58.029512 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:58.029648 7f1e4ffff6c0 Delete type=2 #10
|
|
||||||
2026/04/09-23:11:58.029805 7f1e4ffff6c0 Delete type=2 #38
|
|
||||||
2026/04/09-23:11:58.156587 7f1e4ffff6c0 Manual compaction at level-1 from '!items!vJInnoigCTJzuY2S' @ 78 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000159
|
MANIFEST-000186
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/04/14-09:09:27.438726 7fddd8fbd6c0 Recovering log #155
|
2026/05/27-23:11:58.309946 7f3ebcffe6c0 Recovering log #184
|
||||||
2026/04/14-09:09:27.499900 7fddd8fbd6c0 Delete type=3 #153
|
2026/05/27-23:11:58.320486 7f3ebcffe6c0 Delete type=3 #182
|
||||||
2026/04/14-09:09:27.500001 7fddd8fbd6c0 Delete type=0 #155
|
2026/05/27-23:11:58.320525 7f3ebcffe6c0 Delete type=0 #184
|
||||||
2026/04/14-09:37:12.020541 7fddca1c26c0 Level-0 table #162: started
|
2026/05/28-01:07:03.257742 7f3e6effd6c0 Level-0 table #189: started
|
||||||
2026/04/14-09:37:12.020592 7fddca1c26c0 Level-0 table #162: 0 bytes OK
|
2026/05/28-01:07:03.257754 7f3e6effd6c0 Level-0 table #189: 0 bytes OK
|
||||||
2026/04/14-09:37:12.026769 7fddca1c26c0 Delete type=0 #160
|
2026/05/28-01:07:03.263574 7f3e6effd6c0 Delete type=0 #187
|
||||||
2026/04/14-09:37:12.041308 7fddca1c26c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.263715 7f3e6effd6c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
|
||||||
2026/04/14-09:37:12.041379 7fddca1c26c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.275990 7f3e6effd6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,22 +1,8 @@
|
|||||||
2026/04/09-07:31:00.841062 7f20ee3ff6c0 Recovering log #152
|
2026/05/27-14:31:25.544106 7f3ebd7ff6c0 Recovering log #179
|
||||||
2026/04/09-07:31:00.850932 7f20ee3ff6c0 Delete type=0 #152
|
2026/05/27-14:31:25.554048 7f3ebd7ff6c0 Delete type=3 #177
|
||||||
2026/04/09-07:31:00.850998 7f20ee3ff6c0 Delete type=3 #150
|
2026/05/27-14:31:25.554071 7f3ebd7ff6c0 Delete type=0 #179
|
||||||
2026/04/09-23:11:55.298948 7f1e4ffff6c0 Level-0 table #156: started
|
2026/05/27-14:33:21.729016 7f3e6effd6c0 Level-0 table #185: started
|
||||||
2026/04/09-23:11:55.298983 7f1e4ffff6c0 Level-0 table #156: 0 bytes OK
|
2026/05/27-14:33:21.729040 7f3e6effd6c0 Level-0 table #185: 0 bytes OK
|
||||||
2026/04/09-23:11:55.355717 7f1e4ffff6c0 Delete type=0 #154
|
2026/05/27-14:33:21.735577 7f3e6effd6c0 Delete type=0 #183
|
||||||
2026/04/09-23:11:55.591617 7f1e4ffff6c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at '!items!zNLvaapQFfVlfPw5' @ 364 : 0
|
2026/05/27-14:33:21.735798 7f3e6effd6c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:55.591623 7f1e4ffff6c0 Compacting 1@0 + 1@1 files
|
2026/05/27-14:33:21.735816 7f3e6effd6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:55.630597 7f1e4ffff6c0 Generated table #157@0: 78 keys, 30738 bytes
|
|
||||||
2026/04/09-23:11:55.630628 7f1e4ffff6c0 Compacted 1@0 + 1@1 files => 30738 bytes
|
|
||||||
2026/04/09-23:11:55.689396 7f1e4ffff6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:55.689523 7f1e4ffff6c0 Delete type=2 #147
|
|
||||||
2026/04/09-23:11:55.689696 7f1e4ffff6c0 Delete type=2 #151
|
|
||||||
2026/04/09-23:11:55.689818 7f1e4ffff6c0 Manual compaction at level-0 from '!items!zNLvaapQFfVlfPw5' @ 364 : 0 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/09-23:11:55.689841 7f1e4ffff6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at '!items!zNLvaapQFfVlfPw5' @ 364 : 0
|
|
||||||
2026/04/09-23:11:55.689848 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/09-23:11:55.720254 7f1e4ffff6c0 Generated table #158@1: 39 keys, 29257 bytes
|
|
||||||
2026/04/09-23:11:55.720280 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 29257 bytes
|
|
||||||
2026/04/09-23:11:55.770532 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:55.770656 7f1e4ffff6c0 Delete type=2 #52
|
|
||||||
2026/04/09-23:11:55.770823 7f1e4ffff6c0 Delete type=2 #157
|
|
||||||
2026/04/09-23:11:56.005533 7f1e4ffff6c0 Manual compaction at level-1 from '!items!zNLvaapQFfVlfPw5' @ 364 : 0 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000096
|
MANIFEST-000120
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/14-09:09:27.758609 7fddd97be6c0 Recovering log #94
|
2026/05/27-23:11:58.375862 7f3e6ffff6c0 Recovering log #118
|
||||||
2026/04/14-09:09:27.824657 7fddd97be6c0 Delete type=3 #92
|
2026/05/27-23:11:58.385912 7f3e6ffff6c0 Delete type=3 #116
|
||||||
2026/04/14-09:09:27.824750 7fddd97be6c0 Delete type=0 #94
|
2026/05/27-23:11:58.385947 7f3e6ffff6c0 Delete type=0 #118
|
||||||
2026/04/14-09:37:12.054469 7fddca1c26c0 Level-0 table #99: started
|
2026/05/28-01:07:03.287852 7f3e6effd6c0 Level-0 table #123: started
|
||||||
2026/04/14-09:37:12.054520 7fddca1c26c0 Level-0 table #99: 0 bytes OK
|
2026/05/28-01:07:03.287863 7f3e6effd6c0 Level-0 table #123: 0 bytes OK
|
||||||
2026/04/14-09:37:12.061714 7fddca1c26c0 Delete type=0 #97
|
2026/05/28-01:07:03.294442 7f3e6effd6c0 Delete type=0 #121
|
||||||
2026/04/14-09:37:12.068669 7fddca1c26c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.300889 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-07:31:00.905329 7f20ed3fd6c0 Recovering log #91
|
2026/05/27-14:31:25.604521 7f3ebd7ff6c0 Recovering log #114
|
||||||
2026/04/09-07:31:00.914802 7f20ed3fd6c0 Delete type=0 #91
|
2026/05/27-14:31:25.613630 7f3ebd7ff6c0 Delete type=3 #112
|
||||||
2026/04/09-07:31:00.914843 7f20ed3fd6c0 Delete type=3 #90
|
2026/05/27-14:31:25.613651 7f3ebd7ff6c0 Delete type=0 #114
|
||||||
2026/04/09-23:11:55.355863 7f1e4ffff6c0 Level-0 table #95: started
|
2026/05/27-14:33:21.767043 7f3e6effd6c0 Level-0 table #119: started
|
||||||
2026/04/09-23:11:55.362963 7f1e4ffff6c0 Level-0 table #95: 0 bytes OK
|
2026/05/27-14:33:21.767067 7f3e6effd6c0 Level-0 table #119: 0 bytes OK
|
||||||
2026/04/09-23:11:55.422939 7f1e4ffff6c0 Delete type=0 #93
|
2026/05/27-14:33:21.773608 7f3e6effd6c0 Delete type=0 #117
|
||||||
2026/04/09-23:11:55.689784 7f1e4ffff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/05/27-14:33:21.780095 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000101
|
MANIFEST-000128
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/04/14-09:09:27.635794 7fddd9fbf6c0 Recovering log #97
|
2026/05/27-23:11:58.349736 7f3e6ffff6c0 Recovering log #126
|
||||||
2026/04/14-09:09:27.685698 7fddd9fbf6c0 Delete type=3 #95
|
2026/05/27-23:11:58.359183 7f3e6ffff6c0 Delete type=3 #124
|
||||||
2026/04/14-09:09:27.685843 7fddd9fbf6c0 Delete type=0 #97
|
2026/05/27-23:11:58.359211 7f3e6ffff6c0 Delete type=0 #126
|
||||||
2026/04/14-09:37:12.041593 7fddca1c26c0 Level-0 table #104: started
|
2026/05/28-01:07:03.276071 7f3e6effd6c0 Level-0 table #131: started
|
||||||
2026/04/14-09:37:12.041649 7fddca1c26c0 Level-0 table #104: 0 bytes OK
|
2026/05/28-01:07:03.276086 7f3e6effd6c0 Level-0 table #131: 0 bytes OK
|
||||||
2026/04/14-09:37:12.047872 7fddca1c26c0 Delete type=0 #102
|
2026/05/28-01:07:03.281962 7f3e6effd6c0 Delete type=0 #129
|
||||||
2026/04/14-09:37:12.068624 7fddca1c26c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.300877 7f3e6effd6c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
|
||||||
2026/04/14-09:37:12.068703 7fddca1c26c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.300894 7f3e6effd6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,23 +1,8 @@
|
|||||||
2026/04/09-07:31:00.880382 7f20ee3ff6c0 Recovering log #94
|
2026/05/27-14:31:25.580201 7f3ebd7ff6c0 Recovering log #121
|
||||||
2026/04/09-07:31:00.890560 7f20ee3ff6c0 Delete type=0 #94
|
2026/05/27-14:31:25.589450 7f3ebd7ff6c0 Delete type=3 #119
|
||||||
2026/04/09-07:31:00.890618 7f20ee3ff6c0 Delete type=3 #93
|
2026/05/27-14:31:25.589494 7f3ebd7ff6c0 Delete type=0 #121
|
||||||
2026/04/09-23:11:55.934801 7f1e4ffff6c0 Level-0 table #98: started
|
2026/05/27-14:33:21.747566 7f3e6effd6c0 Level-0 table #127: started
|
||||||
2026/04/09-23:11:55.934839 7f1e4ffff6c0 Level-0 table #98: 0 bytes OK
|
2026/05/27-14:33:21.747585 7f3e6effd6c0 Level-0 table #127: 0 bytes OK
|
||||||
2026/04/09-23:11:56.005383 7f1e4ffff6c0 Delete type=0 #96
|
2026/05/27-14:33:21.754474 7f3e6effd6c0 Delete type=0 #125
|
||||||
2026/04/09-23:11:56.005574 7f1e4ffff6c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at '!items!zRJfxioYBRq4iSBR' @ 78 : 1
|
2026/05/27-14:33:21.760899 7f3e6effd6c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:56.005581 7f1e4ffff6c0 Compacting 3@0 + 0@1 files
|
2026/05/27-14:33:21.760915 7f3e6effd6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:56.031392 7f1e4ffff6c0 Generated table #99@0: 36 keys, 19300 bytes
|
|
||||||
2026/04/09-23:11:56.031419 7f1e4ffff6c0 Compacted 3@0 + 0@1 files => 19300 bytes
|
|
||||||
2026/04/09-23:11:56.099555 7f1e4ffff6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:56.099688 7f1e4ffff6c0 Delete type=2 #79
|
|
||||||
2026/04/09-23:11:56.099839 7f1e4ffff6c0 Delete type=2 #82
|
|
||||||
2026/04/09-23:11:56.099918 7f1e4ffff6c0 Delete type=2 #89
|
|
||||||
2026/04/09-23:11:56.284189 7f1e4ffff6c0 Manual compaction at level-0 from '!items!zRJfxioYBRq4iSBR' @ 78 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/09-23:11:56.553421 7f1e4ffff6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at '!items!zRJfxioYBRq4iSBR' @ 150 : 1
|
|
||||||
2026/04/09-23:11:56.553430 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/09-23:11:56.584164 7f1e4ffff6c0 Generated table #100@1: 42 keys, 19157 bytes
|
|
||||||
2026/04/09-23:11:56.584191 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 19157 bytes
|
|
||||||
2026/04/09-23:11:56.648837 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:56.648989 7f1e4ffff6c0 Delete type=2 #75
|
|
||||||
2026/04/09-23:11:56.649134 7f1e4ffff6c0 Delete type=2 #99
|
|
||||||
2026/04/09-23:11:56.649274 7f1e4ffff6c0 Manual compaction at level-1 from '!items!zRJfxioYBRq4iSBR' @ 150 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000096
|
MANIFEST-000120
|
||||||
|
|||||||
+7
-7
@@ -1,7 +1,7 @@
|
|||||||
2026/04/14-09:09:27.828638 7fddcbfff6c0 Recovering log #94
|
2026/05/27-23:11:58.388239 7f3e6f7fe6c0 Recovering log #118
|
||||||
2026/04/14-09:09:27.891453 7fddcbfff6c0 Delete type=3 #92
|
2026/05/27-23:11:58.398684 7f3e6f7fe6c0 Delete type=3 #116
|
||||||
2026/04/14-09:09:27.891583 7fddcbfff6c0 Delete type=0 #94
|
2026/05/27-23:11:58.398724 7f3e6f7fe6c0 Delete type=0 #118
|
||||||
2026/04/14-09:37:12.061903 7fddca1c26c0 Level-0 table #99: started
|
2026/05/28-01:07:03.294489 7f3e6effd6c0 Level-0 table #123: started
|
||||||
2026/04/14-09:37:12.061955 7fddca1c26c0 Level-0 table #99: 0 bytes OK
|
2026/05/28-01:07:03.294501 7f3e6effd6c0 Level-0 table #123: 0 bytes OK
|
||||||
2026/04/14-09:37:12.068457 7fddca1c26c0 Delete type=0 #97
|
2026/05/28-01:07:03.300827 7f3e6effd6c0 Delete type=0 #121
|
||||||
2026/04/14-09:37:12.068687 7fddca1c26c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.314060 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-07:31:00.916824 7f20ecbfc6c0 Recovering log #91
|
2026/05/27-14:31:25.615623 7f3ebd7ff6c0 Recovering log #114
|
||||||
2026/04/09-07:31:00.927322 7f20ecbfc6c0 Delete type=0 #91
|
2026/05/27-14:31:25.625348 7f3ebd7ff6c0 Delete type=3 #112
|
||||||
2026/04/09-07:31:00.927410 7f20ecbfc6c0 Delete type=3 #90
|
2026/05/27-14:31:25.625369 7f3ebd7ff6c0 Delete type=0 #114
|
||||||
2026/04/09-23:11:55.875522 7f1e4ffff6c0 Level-0 table #95: started
|
2026/05/27-14:33:21.761003 7f3e6effd6c0 Level-0 table #119: started
|
||||||
2026/04/09-23:11:55.875555 7f1e4ffff6c0 Level-0 table #95: 0 bytes OK
|
2026/05/27-14:33:21.761022 7f3e6effd6c0 Level-0 table #119: 0 bytes OK
|
||||||
2026/04/09-23:11:55.934643 7f1e4ffff6c0 Delete type=0 #93
|
2026/05/27-14:33:21.766953 7f3e6effd6c0 Delete type=0 #117
|
||||||
2026/04/09-23:11:56.005560 7f1e4ffff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/05/27-14:33:21.780083 7f3e6effd6c0 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-000077
|
MANIFEST-000101
|
||||||
|
|||||||
+8
-8
@@ -1,8 +1,8 @@
|
|||||||
2026/04/14-09:09:27.895712 7fddd8fbd6c0 Recovering log #73
|
2026/05/27-23:11:58.400455 7f3ebd7ff6c0 Recovering log #99
|
||||||
2026/04/14-09:09:27.973731 7fddd8fbd6c0 Delete type=3 #71
|
2026/05/27-23:11:58.410587 7f3ebd7ff6c0 Delete type=3 #97
|
||||||
2026/04/14-09:09:27.973870 7fddd8fbd6c0 Delete type=0 #73
|
2026/05/27-23:11:58.410645 7f3ebd7ff6c0 Delete type=0 #99
|
||||||
2026/04/14-09:37:12.075441 7fddca1c26c0 Level-0 table #80: started
|
2026/05/28-01:07:03.300932 7f3e6effd6c0 Level-0 table #104: started
|
||||||
2026/04/14-09:37:12.075490 7fddca1c26c0 Level-0 table #80: 0 bytes OK
|
2026/05/28-01:07:03.300945 7f3e6effd6c0 Level-0 table #104: 0 bytes OK
|
||||||
2026/04/14-09:37:12.081733 7fddca1c26c0 Delete type=0 #78
|
2026/05/28-01:07:03.306823 7f3e6effd6c0 Delete type=0 #102
|
||||||
2026/04/14-09:37:12.095930 7fddca1c26c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.314070 7f3e6effd6c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
|
||||||
2026/04/14-09:37:12.095983 7fddca1c26c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.314229 7f3e6effd6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
+8
-23
@@ -1,23 +1,8 @@
|
|||||||
2026/04/09-07:31:00.929957 7f20edbfe6c0 Recovering log #70
|
2026/05/27-14:31:25.627132 7f3ebd7ff6c0 Recovering log #95
|
||||||
2026/04/09-07:31:00.939549 7f20edbfe6c0 Delete type=0 #70
|
2026/05/27-14:31:25.636967 7f3ebd7ff6c0 Delete type=3 #93
|
||||||
2026/04/09-07:31:00.939612 7f20edbfe6c0 Delete type=3 #69
|
2026/05/27-14:31:25.637002 7f3ebd7ff6c0 Delete type=0 #95
|
||||||
2026/04/09-23:11:56.905232 7f1e4ffff6c0 Level-0 table #74: started
|
2026/05/27-14:33:21.773684 7f3e6effd6c0 Level-0 table #100: started
|
||||||
2026/04/09-23:11:56.905265 7f1e4ffff6c0 Level-0 table #74: 0 bytes OK
|
2026/05/27-14:33:21.773700 7f3e6effd6c0 Level-0 table #100: 0 bytes OK
|
||||||
2026/04/09-23:11:56.975463 7f1e4ffff6c0 Delete type=0 #72
|
2026/05/27-14:33:21.779958 7f3e6effd6c0 Delete type=0 #98
|
||||||
2026/04/09-23:11:56.975665 7f1e4ffff6c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 8 : 1
|
2026/05/27-14:33:21.786739 7f3e6effd6c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:56.975673 7f1e4ffff6c0 Compacting 3@0 + 0@1 files
|
2026/05/27-14:33:21.800533 7f3e6effd6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:57.005759 7f1e4ffff6c0 Generated table #75@0: 2 keys, 2815 bytes
|
|
||||||
2026/04/09-23:11:57.005786 7f1e4ffff6c0 Compacted 3@0 + 0@1 files => 2815 bytes
|
|
||||||
2026/04/09-23:11:57.078432 7f1e4ffff6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:57.078623 7f1e4ffff6c0 Delete type=2 #55
|
|
||||||
2026/04/09-23:11:57.078774 7f1e4ffff6c0 Delete type=2 #58
|
|
||||||
2026/04/09-23:11:57.078833 7f1e4ffff6c0 Delete type=2 #65
|
|
||||||
2026/04/09-23:11:57.276364 7f1e4ffff6c0 Manual compaction at level-0 from '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 8 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/09-23:11:57.363786 7f1e4ffff6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 12 : 1
|
|
||||||
2026/04/09-23:11:57.363793 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/09-23:11:57.394341 7f1e4ffff6c0 Generated table #76@1: 2 keys, 2815 bytes
|
|
||||||
2026/04/09-23:11:57.394378 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 2815 bytes
|
|
||||||
2026/04/09-23:11:57.451312 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:57.451448 7f1e4ffff6c0 Delete type=2 #9
|
|
||||||
2026/04/09-23:11:57.451666 7f1e4ffff6c0 Delete type=2 #75
|
|
||||||
2026/04/09-23:11:57.575520 7f1e4ffff6c0 Manual compaction at level-1 from '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 12 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000101
|
MANIFEST-000128
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/04/14-09:09:27.505383 7fddcbfff6c0 Recovering log #97
|
2026/05/27-23:11:58.323722 7f3e6f7fe6c0 Recovering log #126
|
||||||
2026/04/14-09:09:27.573701 7fddcbfff6c0 Delete type=3 #95
|
2026/05/27-23:11:58.334612 7f3e6f7fe6c0 Delete type=3 #124
|
||||||
2026/04/14-09:09:27.573885 7fddcbfff6c0 Delete type=0 #97
|
2026/05/27-23:11:58.334668 7f3e6f7fe6c0 Delete type=0 #126
|
||||||
2026/04/14-09:37:12.013930 7fddca1c26c0 Level-0 table #104: started
|
2026/05/28-01:07:03.263720 7f3e6effd6c0 Level-0 table #131: started
|
||||||
2026/04/14-09:37:12.014060 7fddca1c26c0 Level-0 table #104: 0 bytes OK
|
2026/05/28-01:07:03.263735 7f3e6effd6c0 Level-0 table #131: 0 bytes OK
|
||||||
2026/04/14-09:37:12.020364 7fddca1c26c0 Delete type=0 #102
|
2026/05/28-01:07:03.269766 7f3e6effd6c0 Delete type=0 #129
|
||||||
2026/04/14-09:37:12.041283 7fddca1c26c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.275999 7f3e6effd6c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
|
||||||
2026/04/14-09:37:12.041363 7fddca1c26c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.276022 7f3e6effd6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,23 +1,8 @@
|
|||||||
2026/04/09-07:31:00.854245 7f20edbfe6c0 Recovering log #94
|
2026/05/27-14:31:25.557570 7f3ebd7ff6c0 Recovering log #121
|
||||||
2026/04/09-07:31:00.865063 7f20edbfe6c0 Delete type=0 #94
|
2026/05/27-14:31:25.567130 7f3ebd7ff6c0 Delete type=3 #119
|
||||||
2026/04/09-07:31:00.865121 7f20edbfe6c0 Delete type=3 #93
|
2026/05/27-14:31:25.567150 7f3ebd7ff6c0 Delete type=0 #121
|
||||||
2026/04/09-23:11:56.099981 7f1e4ffff6c0 Level-0 table #98: started
|
2026/05/27-14:33:21.735841 7f3e6effd6c0 Level-0 table #127: started
|
||||||
2026/04/09-23:11:56.105569 7f1e4ffff6c0 Level-0 table #98: 0 bytes OK
|
2026/05/27-14:33:21.735866 7f3e6effd6c0 Level-0 table #127: 0 bytes OK
|
||||||
2026/04/09-23:11:56.159882 7f1e4ffff6c0 Delete type=0 #96
|
2026/05/27-14:33:21.741712 7f3e6effd6c0 Delete type=0 #125
|
||||||
2026/04/09-23:11:56.284217 7f1e4ffff6c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at '!items!yleVHgRqGoYLvzxT' @ 16 : 1
|
2026/05/27-14:33:21.760883 7f3e6effd6c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:56.284226 7f1e4ffff6c0 Compacting 3@0 + 0@1 files
|
2026/05/27-14:33:21.760906 7f3e6effd6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:56.306198 7f1e4ffff6c0 Generated table #99@0: 8 keys, 1953 bytes
|
|
||||||
2026/04/09-23:11:56.306252 7f1e4ffff6c0 Compacted 3@0 + 0@1 files => 1953 bytes
|
|
||||||
2026/04/09-23:11:56.365749 7f1e4ffff6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:56.365864 7f1e4ffff6c0 Delete type=2 #79
|
|
||||||
2026/04/09-23:11:56.366005 7f1e4ffff6c0 Delete type=2 #82
|
|
||||||
2026/04/09-23:11:56.366066 7f1e4ffff6c0 Delete type=2 #89
|
|
||||||
2026/04/09-23:11:56.649232 7f1e4ffff6c0 Manual compaction at level-0 from '!items!yleVHgRqGoYLvzxT' @ 16 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/09-23:11:56.649287 7f1e4ffff6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at '!items!yleVHgRqGoYLvzxT' @ 32 : 1
|
|
||||||
2026/04/09-23:11:56.649293 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/09-23:11:56.673369 7f1e4ffff6c0 Generated table #100@1: 8 keys, 1953 bytes
|
|
||||||
2026/04/09-23:11:56.673396 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 1953 bytes
|
|
||||||
2026/04/09-23:11:56.738661 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:56.738800 7f1e4ffff6c0 Delete type=2 #33
|
|
||||||
2026/04/09-23:11:56.738971 7f1e4ffff6c0 Delete type=2 #99
|
|
||||||
2026/04/09-23:11:56.975609 7f1e4ffff6c0 Manual compaction at level-1 from '!items!yleVHgRqGoYLvzxT' @ 32 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
+1
-1
@@ -1 +1 @@
|
|||||||
MANIFEST-000096
|
MANIFEST-000120
|
||||||
|
|||||||
+7
-7
@@ -1,7 +1,7 @@
|
|||||||
2026/04/14-09:09:27.576965 7fddd97be6c0 Recovering log #94
|
2026/05/27-23:11:58.337311 7f3ebcffe6c0 Recovering log #118
|
||||||
2026/04/14-09:09:27.633055 7fddd97be6c0 Delete type=3 #92
|
2026/05/27-23:11:58.347349 7f3ebcffe6c0 Delete type=3 #116
|
||||||
2026/04/14-09:09:27.633158 7fddd97be6c0 Delete type=0 #94
|
2026/05/27-23:11:58.347392 7f3ebcffe6c0 Delete type=0 #118
|
||||||
2026/04/14-09:37:12.034435 7fddca1c26c0 Level-0 table #99: started
|
2026/05/28-01:07:03.269795 7f3e6effd6c0 Level-0 table #123: started
|
||||||
2026/04/14-09:37:12.034485 7fddca1c26c0 Level-0 table #99: 0 bytes OK
|
2026/05/28-01:07:03.269808 7f3e6effd6c0 Level-0 table #123: 0 bytes OK
|
||||||
2026/04/14-09:37:12.041061 7fddca1c26c0 Delete type=0 #97
|
2026/05/28-01:07:03.275958 7f3e6effd6c0 Delete type=0 #121
|
||||||
2026/04/14-09:37:12.041346 7fddca1c26c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.276003 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
+7
-7
@@ -1,7 +1,7 @@
|
|||||||
2026/04/09-07:31:00.868584 7f20ed3fd6c0 Recovering log #91
|
2026/05/27-14:31:25.569405 7f3ebd7ff6c0 Recovering log #114
|
||||||
2026/04/09-07:31:00.878275 7f20ed3fd6c0 Delete type=0 #91
|
2026/05/27-14:31:25.578632 7f3ebd7ff6c0 Delete type=3 #112
|
||||||
2026/04/09-07:31:00.878335 7f20ed3fd6c0 Delete type=3 #90
|
2026/05/27-14:31:25.578657 7f3ebd7ff6c0 Delete type=0 #114
|
||||||
2026/04/09-23:11:55.423085 7f1e4ffff6c0 Level-0 table #95: started
|
2026/05/27-14:33:21.741780 7f3e6effd6c0 Level-0 table #119: started
|
||||||
2026/04/09-23:11:55.423120 7f1e4ffff6c0 Level-0 table #95: 0 bytes OK
|
2026/05/27-14:33:21.741799 7f3e6effd6c0 Level-0 table #119: 0 bytes OK
|
||||||
2026/04/09-23:11:55.490502 7f1e4ffff6c0 Delete type=0 #93
|
2026/05/27-14:33:21.747507 7f3e6effd6c0 Delete type=0 #117
|
||||||
2026/04/09-23:11:55.689798 7f1e4ffff6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
2026/05/27-14:33:21.760892 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000101
|
MANIFEST-000128
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/04/14-09:09:27.691723 7fddd8fbd6c0 Recovering log #97
|
2026/05/27-23:11:58.362926 7f3ebd7ff6c0 Recovering log #126
|
||||||
2026/04/14-09:09:27.751300 7fddd8fbd6c0 Delete type=3 #95
|
2026/05/27-23:11:58.372894 7f3ebd7ff6c0 Delete type=3 #124
|
||||||
2026/04/14-09:09:27.751449 7fddd8fbd6c0 Delete type=0 #97
|
2026/05/27-23:11:58.372934 7f3ebd7ff6c0 Delete type=0 #126
|
||||||
2026/04/14-09:37:12.048047 7fddca1c26c0 Level-0 table #104: started
|
2026/05/28-01:07:03.281993 7f3e6effd6c0 Level-0 table #131: started
|
||||||
2026/04/14-09:37:12.048094 7fddca1c26c0 Level-0 table #104: 0 bytes OK
|
2026/05/28-01:07:03.282003 7f3e6effd6c0 Level-0 table #131: 0 bytes OK
|
||||||
2026/04/14-09:37:12.054263 7fddca1c26c0 Delete type=0 #102
|
2026/05/28-01:07:03.287823 7f3e6effd6c0 Delete type=0 #129
|
||||||
2026/04/14-09:37:12.068648 7fddca1c26c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.300883 7f3e6effd6c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
|
||||||
2026/04/14-09:37:12.068720 7fddca1c26c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.314065 7f3e6effd6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,23 +1,8 @@
|
|||||||
2026/04/09-07:31:00.893292 7f20edbfe6c0 Recovering log #94
|
2026/05/27-14:31:25.591969 7f3ebd7ff6c0 Recovering log #121
|
||||||
2026/04/09-07:31:00.903184 7f20edbfe6c0 Delete type=0 #94
|
2026/05/27-14:31:25.601963 7f3ebd7ff6c0 Delete type=3 #119
|
||||||
2026/04/09-07:31:00.903229 7f20edbfe6c0 Delete type=3 #93
|
2026/05/27-14:31:25.601983 7f3ebd7ff6c0 Delete type=0 #121
|
||||||
2026/04/09-23:11:56.160046 7f1e4ffff6c0 Level-0 table #98: started
|
2026/05/27-14:33:21.754559 7f3e6effd6c0 Level-0 table #127: started
|
||||||
2026/04/09-23:11:56.160087 7f1e4ffff6c0 Level-0 table #98: 0 bytes OK
|
2026/05/27-14:33:21.754583 7f3e6effd6c0 Level-0 table #127: 0 bytes OK
|
||||||
2026/04/09-23:11:56.221142 7f1e4ffff6c0 Delete type=0 #96
|
2026/05/27-14:33:21.760810 7f3e6effd6c0 Delete type=0 #125
|
||||||
2026/04/09-23:11:56.366148 7f1e4ffff6c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at '!items!yFvuDyV00NdojxGt' @ 28 : 1
|
2026/05/27-14:33:21.760994 7f3e6effd6c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:56.366156 7f1e4ffff6c0 Compacting 3@0 + 0@1 files
|
2026/05/27-14:33:21.773676 7f3e6effd6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:56.403336 7f1e4ffff6c0 Generated table #99@0: 13 keys, 5518 bytes
|
|
||||||
2026/04/09-23:11:56.403367 7f1e4ffff6c0 Compacted 3@0 + 0@1 files => 5518 bytes
|
|
||||||
2026/04/09-23:11:56.463634 7f1e4ffff6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:56.463768 7f1e4ffff6c0 Delete type=2 #79
|
|
||||||
2026/04/09-23:11:56.463912 7f1e4ffff6c0 Delete type=2 #82
|
|
||||||
2026/04/09-23:11:56.463976 7f1e4ffff6c0 Delete type=2 #89
|
|
||||||
2026/04/09-23:11:56.649253 7f1e4ffff6c0 Manual compaction at level-0 from '!items!yFvuDyV00NdojxGt' @ 28 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/09-23:11:56.739065 7f1e4ffff6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at '!items!yFvuDyV00NdojxGt' @ 54 : 1
|
|
||||||
2026/04/09-23:11:56.739073 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/09-23:11:56.767928 7f1e4ffff6c0 Generated table #100@1: 15 keys, 5685 bytes
|
|
||||||
2026/04/09-23:11:56.767955 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 5685 bytes
|
|
||||||
2026/04/09-23:11:56.821206 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:56.821329 7f1e4ffff6c0 Delete type=2 #67
|
|
||||||
2026/04/09-23:11:56.821468 7f1e4ffff6c0 Delete type=2 #99
|
|
||||||
2026/04/09-23:11:56.975628 7f1e4ffff6c0 Manual compaction at level-1 from '!items!yFvuDyV00NdojxGt' @ 54 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000002
|
MANIFEST-000048
|
||||||
|
|||||||
+92
-5
@@ -1,5 +1,92 @@
|
|||||||
2026/04/14-09:09:28.285829 7fddcbfff6c0 Delete type=3 #1
|
2026/05/27-23:11:58.454344 7f3ebcffe6c0 Recovering log #44
|
||||||
2026/04/14-09:37:12.115891 7fddca1c26c0 Level-0 table #5: started
|
2026/05/27-23:11:58.463285 7f3ebcffe6c0 Delete type=3 #40
|
||||||
2026/04/14-09:37:12.134263 7fddca1c26c0 Level-0 table #5: 442791 bytes OK
|
2026/05/27-23:11:58.463300 7f3ebcffe6c0 Delete type=0 #44
|
||||||
2026/04/14-09:37:12.141689 7fddca1c26c0 Delete type=0 #3
|
2026/05/27-23:37:44.587645 7f3e6effd6c0 Level-0 table #51: started
|
||||||
2026/04/14-09:37:12.149394 7fddca1c26c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at (end)
|
2026/05/27-23:37:44.605872 7f3e6effd6c0 Level-0 table #51: 1343154 bytes OK
|
||||||
|
2026/05/27-23:37:44.612030 7f3e6effd6c0 Delete type=0 #49
|
||||||
|
2026/05/28-00:04:39.168329 7f3e6effd6c0 Level-0 table #53: started
|
||||||
|
2026/05/28-00:04:39.185209 7f3e6effd6c0 Level-0 table #53: 1393674 bytes OK
|
||||||
|
2026/05/28-00:04:39.191603 7f3e6effd6c0 Delete type=0 #50
|
||||||
|
2026/05/28-00:18:55.273857 7f3e6effd6c0 Level-0 table #55: started
|
||||||
|
2026/05/28-00:18:55.294346 7f3e6effd6c0 Level-0 table #55: 1451564 bytes OK
|
||||||
|
2026/05/28-00:18:55.300308 7f3e6effd6c0 Delete type=0 #52
|
||||||
|
2026/05/28-00:20:15.021651 7f3e6effd6c0 Level-0 table #57: started
|
||||||
|
2026/05/28-00:20:15.040525 7f3e6effd6c0 Level-0 table #57: 1496314 bytes OK
|
||||||
|
2026/05/28-00:20:15.046886 7f3e6effd6c0 Delete type=0 #54
|
||||||
|
2026/05/28-00:20:43.720521 7f3e6effd6c0 Level-0 table #59: started
|
||||||
|
2026/05/28-00:20:43.742455 7f3e6effd6c0 Level-0 table #59: 1546947 bytes OK
|
||||||
|
2026/05/28-00:20:43.748835 7f3e6effd6c0 Delete type=0 #56
|
||||||
|
2026/05/28-00:20:43.749387 7f3e6effd6c0 Compacting 4@0 + 1@1 files
|
||||||
|
2026/05/28-00:20:43.771709 7f3e6effd6c0 Generated table #60@0: 10302 keys, 1546947 bytes
|
||||||
|
2026/05/28-00:20:43.771721 7f3e6effd6c0 Compacted 4@0 + 1@1 files => 1546947 bytes
|
||||||
|
2026/05/28-00:20:43.777946 7f3e6effd6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
||||||
|
2026/05/28-00:20:43.778171 7f3e6effd6c0 Delete type=2 #51
|
||||||
|
2026/05/28-00:20:43.778444 7f3e6effd6c0 Delete type=2 #53
|
||||||
|
2026/05/28-00:20:43.778777 7f3e6effd6c0 Delete type=2 #55
|
||||||
|
2026/05/28-00:20:43.778977 7f3e6effd6c0 Delete type=2 #57
|
||||||
|
2026/05/28-00:20:43.779160 7f3e6effd6c0 Delete type=2 #59
|
||||||
|
2026/05/28-00:21:51.457842 7f3e6effd6c0 Level-0 table #62: started
|
||||||
|
2026/05/28-00:21:51.479532 7f3e6effd6c0 Level-0 table #62: 1604425 bytes OK
|
||||||
|
2026/05/28-00:21:51.485724 7f3e6effd6c0 Delete type=0 #58
|
||||||
|
2026/05/28-00:30:27.802783 7f3e6effd6c0 Level-0 table #64: started
|
||||||
|
2026/05/28-00:30:27.823947 7f3e6effd6c0 Level-0 table #64: 1651065 bytes OK
|
||||||
|
2026/05/28-00:30:27.829721 7f3e6effd6c0 Delete type=0 #61
|
||||||
|
2026/05/28-00:35:01.919877 7f3e6effd6c0 Level-0 table #66: started
|
||||||
|
2026/05/28-00:35:01.987012 7f3e6effd6c0 Level-0 table #66: 1703060 bytes OK
|
||||||
|
2026/05/28-00:35:02.043369 7f3e6effd6c0 Delete type=0 #63
|
||||||
|
2026/05/28-00:37:26.052331 7f3e6effd6c0 Level-0 table #68: started
|
||||||
|
2026/05/28-00:37:26.076959 7f3e6effd6c0 Level-0 table #68: 1753179 bytes OK
|
||||||
|
2026/05/28-00:37:26.083119 7f3e6effd6c0 Delete type=0 #65
|
||||||
|
2026/05/28-00:37:26.083369 7f3e6effd6c0 Compacting 4@0 + 1@1 files
|
||||||
|
2026/05/28-00:37:26.103213 7f3e6effd6c0 Generated table #69@0: 11630 keys, 1753179 bytes
|
||||||
|
2026/05/28-00:37:26.103227 7f3e6effd6c0 Compacted 4@0 + 1@1 files => 1753179 bytes
|
||||||
|
2026/05/28-00:37:26.109075 7f3e6effd6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
||||||
|
2026/05/28-00:37:26.109152 7f3e6effd6c0 Delete type=2 #60
|
||||||
|
2026/05/28-00:37:26.109336 7f3e6effd6c0 Delete type=2 #62
|
||||||
|
2026/05/28-00:37:26.109453 7f3e6effd6c0 Delete type=2 #64
|
||||||
|
2026/05/28-00:37:26.109722 7f3e6effd6c0 Delete type=2 #66
|
||||||
|
2026/05/28-00:37:26.109828 7f3e6effd6c0 Delete type=2 #68
|
||||||
|
2026/05/28-00:48:03.393850 7f3e6effd6c0 Level-0 table #71: started
|
||||||
|
2026/05/28-00:48:03.411976 7f3e6effd6c0 Level-0 table #71: 1806724 bytes OK
|
||||||
|
2026/05/28-00:48:03.419030 7f3e6effd6c0 Delete type=0 #67
|
||||||
|
2026/05/28-00:52:05.605289 7f3e6effd6c0 Level-0 table #73: started
|
||||||
|
2026/05/28-00:52:05.629208 7f3e6effd6c0 Level-0 table #73: 1856591 bytes OK
|
||||||
|
2026/05/28-00:52:05.635297 7f3e6effd6c0 Delete type=0 #70
|
||||||
|
2026/05/28-00:53:23.184161 7f3e6effd6c0 Level-0 table #75: started
|
||||||
|
2026/05/28-00:53:23.202618 7f3e6effd6c0 Level-0 table #75: 1901920 bytes OK
|
||||||
|
2026/05/28-00:53:23.208730 7f3e6effd6c0 Delete type=0 #72
|
||||||
|
2026/05/28-01:02:57.320650 7f3e6effd6c0 Level-0 table #77: started
|
||||||
|
2026/05/28-01:02:57.341951 7f3e6effd6c0 Level-0 table #77: 1962797 bytes OK
|
||||||
|
2026/05/28-01:02:57.347793 7f3e6effd6c0 Delete type=0 #74
|
||||||
|
2026/05/28-01:02:57.348132 7f3e6effd6c0 Compacting 4@0 + 1@1 files
|
||||||
|
2026/05/28-01:02:57.369982 7f3e6effd6c0 Generated table #78@0: 12958 keys, 1962797 bytes
|
||||||
|
2026/05/28-01:02:57.370013 7f3e6effd6c0 Compacted 4@0 + 1@1 files => 1962797 bytes
|
||||||
|
2026/05/28-01:02:57.376098 7f3e6effd6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
||||||
|
2026/05/28-01:02:57.376330 7f3e6effd6c0 Delete type=2 #69
|
||||||
|
2026/05/28-01:02:57.376716 7f3e6effd6c0 Delete type=2 #71
|
||||||
|
2026/05/28-01:02:57.377097 7f3e6effd6c0 Delete type=2 #73
|
||||||
|
2026/05/28-01:02:57.377594 7f3e6effd6c0 Delete type=2 #75
|
||||||
|
2026/05/28-01:02:57.377833 7f3e6effd6c0 Delete type=2 #77
|
||||||
|
2026/05/28-01:06:35.052396 7f3e6effd6c0 Level-0 table #80: started
|
||||||
|
2026/05/28-01:06:35.067526 7f3e6effd6c0 Level-0 table #80: 2007084 bytes OK
|
||||||
|
2026/05/28-01:06:35.074274 7f3e6effd6c0 Delete type=0 #76
|
||||||
|
2026/05/28-01:07:03.326355 7f3e6effd6c0 Level-0 table #82: started
|
||||||
|
2026/05/28-01:07:03.344521 7f3e6effd6c0 Level-0 table #82: 2055614 bytes OK
|
||||||
|
2026/05/28-01:07:03.350350 7f3e6effd6c0 Delete type=0 #79
|
||||||
|
2026/05/28-01:07:03.356890 7f3e6effd6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 261156 : 1
|
||||||
|
2026/05/28-01:07:03.356894 7f3e6effd6c0 Compacting 2@0 + 1@1 files
|
||||||
|
2026/05/28-01:07:03.375384 7f3e6effd6c0 Generated table #83@0: 13622 keys, 2055614 bytes
|
||||||
|
2026/05/28-01:07:03.375400 7f3e6effd6c0 Compacted 2@0 + 1@1 files => 2055614 bytes
|
||||||
|
2026/05/28-01:07:03.381064 7f3e6effd6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
||||||
|
2026/05/28-01:07:03.381439 7f3e6effd6c0 Delete type=2 #78
|
||||||
|
2026/05/28-01:07:03.381593 7f3e6effd6c0 Delete type=2 #80
|
||||||
|
2026/05/28-01:07:03.381689 7f3e6effd6c0 Delete type=2 #82
|
||||||
|
2026/05/28-01:07:03.381868 7f3e6effd6c0 Manual compaction at level-0 from '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 261156 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at (end)
|
||||||
|
2026/05/28-01:07:03.416170 7f3e6effd6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 274490 : 1
|
||||||
|
2026/05/28-01:07:03.416174 7f3e6effd6c0 Compacting 1@1 + 1@2 files
|
||||||
|
2026/05/28-01:07:03.432983 7f3e6effd6c0 Generated table #84@1: 13622 keys, 2055614 bytes
|
||||||
|
2026/05/28-01:07:03.432994 7f3e6effd6c0 Compacted 1@1 + 1@2 files => 2055614 bytes
|
||||||
|
2026/05/28-01:07:03.438860 7f3e6effd6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
||||||
|
2026/05/28-01:07:03.438913 7f3e6effd6c0 Delete type=2 #47
|
||||||
|
2026/05/28-01:07:03.439160 7f3e6effd6c0 Delete type=2 #83
|
||||||
|
2026/05/28-01:07:03.445861 7f3e6effd6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 274490 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
2026/05/27-14:31:25.674162 7f3e6f7fe6c0 Recovering log #36
|
||||||
|
2026/05/27-14:31:25.684284 7f3e6f7fe6c0 Delete type=3 #21
|
||||||
|
2026/05/27-14:31:25.684327 7f3e6f7fe6c0 Delete type=0 #36
|
||||||
|
2026/05/27-14:32:13.276652 7f3e6effd6c0 Level-0 table #43: started
|
||||||
|
2026/05/27-14:32:13.292995 7f3e6effd6c0 Level-0 table #43: 1244894 bytes OK
|
||||||
|
2026/05/27-14:32:13.298790 7f3e6effd6c0 Delete type=0 #41
|
||||||
|
2026/05/27-14:33:21.808275 7f3e6effd6c0 Level-0 table #45: started
|
||||||
|
2026/05/27-14:33:21.824612 7f3e6effd6c0 Level-0 table #45: 1294793 bytes OK
|
||||||
|
2026/05/27-14:33:21.831380 7f3e6effd6c0 Delete type=0 #42
|
||||||
|
2026/05/27-14:33:21.838976 7f3e6effd6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 109340 : 1
|
||||||
|
2026/05/27-14:33:21.838980 7f3e6effd6c0 Compacting 1@0 + 1@1 files
|
||||||
|
2026/05/27-14:33:21.852317 7f3e6effd6c0 Generated table #46@0: 8642 keys, 1294793 bytes
|
||||||
|
2026/05/27-14:33:21.852331 7f3e6effd6c0 Compacted 1@0 + 1@1 files => 1294793 bytes
|
||||||
|
2026/05/27-14:33:21.859689 7f3e6effd6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
||||||
|
2026/05/27-14:33:21.859935 7f3e6effd6c0 Delete type=2 #43
|
||||||
|
2026/05/27-14:33:21.860058 7f3e6effd6c0 Delete type=2 #45
|
||||||
|
2026/05/27-14:33:21.877111 7f3e6effd6c0 Manual compaction at level-0 from '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 109340 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at (end)
|
||||||
|
2026/05/27-14:33:21.877144 7f3e6effd6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 109340 : 1
|
||||||
|
2026/05/27-14:33:21.877150 7f3e6effd6c0 Compacting 1@1 + 1@2 files
|
||||||
|
2026/05/27-14:33:21.895679 7f3e6effd6c0 Generated table #47@1: 8642 keys, 1294793 bytes
|
||||||
|
2026/05/27-14:33:21.895699 7f3e6effd6c0 Compacted 1@1 + 1@2 files => 1294793 bytes
|
||||||
|
2026/05/27-14:33:21.901922 7f3e6effd6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
||||||
|
2026/05/27-14:33:21.902059 7f3e6effd6c0 Delete type=2 #39
|
||||||
|
2026/05/27-14:33:21.902514 7f3e6effd6c0 Delete type=2 #46
|
||||||
|
2026/05/27-14:33:21.908609 7f3e6effd6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 109340 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zyJ49IY9JAmeIucJ' @ 0 : 0; will stop at (end)
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
|||||||
MANIFEST-000047
|
MANIFEST-000074
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
2026/04/14-09:09:28.041722 7fddd8fbd6c0 Recovering log #43
|
2026/05/27-23:11:58.427900 7f3ebd7ff6c0 Recovering log #72
|
||||||
2026/04/14-09:09:28.113572 7fddd8fbd6c0 Delete type=3 #41
|
2026/05/27-23:11:58.438233 7f3ebd7ff6c0 Delete type=3 #70
|
||||||
2026/04/14-09:09:28.113676 7fddd8fbd6c0 Delete type=0 #43
|
2026/05/27-23:11:58.438292 7f3ebd7ff6c0 Delete type=0 #72
|
||||||
2026/04/14-09:37:12.081908 7fddca1c26c0 Level-0 table #50: started
|
2026/05/28-01:07:03.314279 7f3e6effd6c0 Level-0 table #77: started
|
||||||
2026/04/14-09:37:12.081954 7fddca1c26c0 Level-0 table #50: 0 bytes OK
|
2026/05/28-01:07:03.314328 7f3e6effd6c0 Level-0 table #77: 0 bytes OK
|
||||||
2026/04/14-09:37:12.089167 7fddca1c26c0 Delete type=0 #48
|
2026/05/28-01:07:03.320204 7f3e6effd6c0 Delete type=0 #75
|
||||||
2026/04/14-09:37:12.095948 7fddca1c26c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.356871 7f3e6effd6c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
|
||||||
2026/04/14-09:37:12.096033 7fddca1c26c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
|
2026/05/28-01:07:03.381781 7f3e6effd6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
|
||||||
|
|||||||
@@ -1,23 +1,8 @@
|
|||||||
2026/04/09-07:31:00.966317 7f20edbfe6c0 Recovering log #40
|
2026/05/27-14:31:25.650849 7f3e6f7fe6c0 Recovering log #67
|
||||||
2026/04/09-07:31:00.977411 7f20edbfe6c0 Delete type=0 #40
|
2026/05/27-14:31:25.660624 7f3e6f7fe6c0 Delete type=3 #65
|
||||||
2026/04/09-07:31:00.977467 7f20edbfe6c0 Delete type=3 #39
|
2026/05/27-14:31:25.660648 7f3e6f7fe6c0 Delete type=0 #67
|
||||||
2026/04/09-23:11:57.078885 7f1e4ffff6c0 Level-0 table #44: started
|
2026/05/27-14:33:21.780104 7f3e6effd6c0 Level-0 table #73: started
|
||||||
2026/04/09-23:11:57.078928 7f1e4ffff6c0 Level-0 table #44: 0 bytes OK
|
2026/05/27-14:33:21.780129 7f3e6effd6c0 Level-0 table #73: 0 bytes OK
|
||||||
2026/04/09-23:11:57.137852 7f1e4ffff6c0 Delete type=0 #42
|
2026/05/27-14:33:21.786659 7f3e6effd6c0 Delete type=0 #71
|
||||||
2026/04/09-23:11:57.276385 7f1e4ffff6c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at '!items!xFUyR7XECD8QJcIw' @ 66 : 1
|
2026/05/27-14:33:21.800546 7f3e6effd6c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:57.276393 7f1e4ffff6c0 Compacting 3@0 + 0@1 files
|
2026/05/27-14:33:21.808253 7f3e6effd6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
|
||||||
2026/04/09-23:11:57.302978 7f1e4ffff6c0 Generated table #45@0: 33 keys, 19448 bytes
|
|
||||||
2026/04/09-23:11:57.303006 7f1e4ffff6c0 Compacted 3@0 + 0@1 files => 19448 bytes
|
|
||||||
2026/04/09-23:11:57.363252 7f1e4ffff6c0 compacted to: files[ 0 1 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:57.363399 7f1e4ffff6c0 Delete type=2 #25
|
|
||||||
2026/04/09-23:11:57.363603 7f1e4ffff6c0 Delete type=2 #28
|
|
||||||
2026/04/09-23:11:57.363689 7f1e4ffff6c0 Delete type=2 #35
|
|
||||||
2026/04/09-23:11:57.451783 7f1e4ffff6c0 Manual compaction at level-0 from '!items!xFUyR7XECD8QJcIw' @ 66 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
|
|
||||||
2026/04/09-23:11:57.575538 7f1e4ffff6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at '!items!xFUyR7XECD8QJcIw' @ 132 : 1
|
|
||||||
2026/04/09-23:11:57.575546 7f1e4ffff6c0 Compacting 1@1 + 1@2 files
|
|
||||||
2026/04/09-23:11:57.607243 7f1e4ffff6c0 Generated table #46@1: 33 keys, 19448 bytes
|
|
||||||
2026/04/09-23:11:57.607267 7f1e4ffff6c0 Compacted 1@1 + 1@2 files => 19448 bytes
|
|
||||||
2026/04/09-23:11:57.665733 7f1e4ffff6c0 compacted to: files[ 0 0 1 0 0 0 0 ]
|
|
||||||
2026/04/09-23:11:57.665877 7f1e4ffff6c0 Delete type=2 #5
|
|
||||||
2026/04/09-23:11:57.666030 7f1e4ffff6c0 Delete type=2 #45
|
|
||||||
2026/04/09-23:11:57.809717 7f1e4ffff6c0 Manual compaction at level-1 from '!items!xFUyR7XECD8QJcIw' @ 132 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
|
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
+216
-107
@@ -1,21 +1,42 @@
|
|||||||
/**
|
/**
|
||||||
* MGT2 Commerce – CommerceDialog
|
* MGT2 Commerce – CommerceDialog
|
||||||
*
|
*
|
||||||
* Boîte de dialogue principale (FormApplication FoundryVTT).
|
* Boîte de dialogue principale (ApplicationV2 FoundryVTT).
|
||||||
* Trois onglets : Passagers / Cargaison / Commerce spéculatif.
|
* Trois onglets : Passagers / Cargaison / Commerce spéculatif.
|
||||||
* Les résultats sont postés dans le chat.
|
* Les résultats sont postés dans le chat.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { calculatePassengers, calculateCargo, findAvailableGoods, calculatePrice, formatCredits } from './tradeHelper.js';
|
import { calculatePassengers, calculateCargo, findAvailableGoods, calculatePrice, formatCredits } from './tradeHelper.js';
|
||||||
import { searchWorlds, fetchWorldDetail, fetchWorldCoordinates, calcParsecs } from './travellerMapApi.js';
|
import { searchWorlds, fetchWorldDetail, fetchWorldCoordinates, calcParsecs } from './travellerMapApi.js';
|
||||||
|
import { buildActiveActorContext, COMMERCE_SKILLS, getActiveTravellerActor, rollActorSkillEffect, getActorSkillSummary } from './mgt2eSkills.js';
|
||||||
|
|
||||||
|
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
|
||||||
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
|
||||||
export class CommerceDialog extends FormApplication {
|
export class CommerceDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
id: 'mgt2-commerce',
|
||||||
|
classes: ['mgt2-commerce-dialog'],
|
||||||
|
position: {
|
||||||
|
width: 780,
|
||||||
|
height: 'auto',
|
||||||
|
},
|
||||||
|
window: {
|
||||||
|
title: 'Commerce – MgT2e',
|
||||||
|
resizable: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: {
|
||||||
|
template: `modules/${MODULE_ID}/templates/commerce-dialog.hbs`,
|
||||||
|
root: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
constructor(options = {}) {
|
constructor(options = {}) {
|
||||||
super({}, options);
|
super(options);
|
||||||
// Valeurs par défaut du formulaire
|
this._activeTab = options.initialTab ?? 'passengers';
|
||||||
this._formData = {
|
this._formData = {
|
||||||
pax: {
|
pax: {
|
||||||
uwpDep: '', uwpDest: '', zoneDep: 'normal', zoneDest: 'normal',
|
uwpDep: '', uwpDest: '', zoneDep: 'normal', zoneDest: 'normal',
|
||||||
@@ -29,62 +50,135 @@ export class CommerceDialog extends FormApplication {
|
|||||||
uwp: '', zone: 'normal', brokerSkill: 0, previousAttempts: 0, blackMarket: false,
|
uwp: '', zone: 'normal', brokerSkill: 0, previousAttempts: 0, blackMarket: false,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
this._tradeGoods = null; // résultats de findAvailableGoods, conservés pour le calcul des prix
|
this._tradeGoods = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
static get defaultOptions() {
|
async _prepareContext() {
|
||||||
return mergeObject(super.defaultOptions, {
|
|
||||||
id: 'mgt2-commerce',
|
|
||||||
title: 'Commerce – MGT2',
|
|
||||||
template: `modules/${MODULE_ID}/templates/commerce-dialog.hbs`,
|
|
||||||
width: 780,
|
|
||||||
height: 'auto',
|
|
||||||
resizable: true,
|
|
||||||
tabs: [{
|
|
||||||
navSelector: '.tabs',
|
|
||||||
contentSelector: '.tab-content',
|
|
||||||
initial: 'passengers',
|
|
||||||
}],
|
|
||||||
classes: ['mgt2-commerce-dialog'],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getData() {
|
|
||||||
_registerHandlebarsHelpers();
|
_registerHandlebarsHelpers();
|
||||||
return foundry.utils.mergeObject(super.getData(), this._formData);
|
return {
|
||||||
|
...this._formData,
|
||||||
|
activeActor: buildActiveActorContext(),
|
||||||
|
activeTab: this._activeTab,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
activateListeners(html) {
|
async _onRender(context, options) {
|
||||||
super.activateListeners(html);
|
await super._onRender(context, options);
|
||||||
|
|
||||||
|
const html = this._getForm();
|
||||||
|
if (!html?.length) return;
|
||||||
|
html.addClass('mgt2-commerce-form');
|
||||||
|
|
||||||
|
this._applyThemeStyles(html);
|
||||||
|
|
||||||
// Bouton "Calculer les passagers"
|
|
||||||
html.find('[data-action="calculate-passengers"]').on('click', async (ev) => {
|
html.find('[data-action="calculate-passengers"]').on('click', async (ev) => {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
this._readForm(html);
|
this._readForm(html);
|
||||||
await this._handlePassengers();
|
await this._handlePassengers();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Bouton "Calculer la cargaison"
|
|
||||||
html.find('[data-action="calculate-cargo"]').on('click', async (ev) => {
|
html.find('[data-action="calculate-cargo"]').on('click', async (ev) => {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
this._readForm(html);
|
this._readForm(html);
|
||||||
await this._handleCargo();
|
await this._handleCargo();
|
||||||
});
|
});
|
||||||
|
|
||||||
// Bouton "Trouver un fournisseur & marchandises"
|
|
||||||
html.find('[data-action="find-goods"]').on('click', async (ev) => {
|
html.find('[data-action="find-goods"]').on('click', async (ev) => {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
this._readForm(html);
|
this._readForm(html);
|
||||||
await this._handleFindGoods(html);
|
await this._handleFindGoods(html);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Bouton "Calculer les prix d'achat"
|
|
||||||
html.on('click', '[data-action="calculate-buy-prices"]', async (ev) => {
|
html.on('click', '[data-action="calculate-buy-prices"]', async (ev) => {
|
||||||
ev.preventDefault();
|
ev.preventDefault();
|
||||||
|
this._readForm(html);
|
||||||
await this._handleBuyPrices();
|
await this._handleBuyPrices();
|
||||||
});
|
});
|
||||||
|
|
||||||
// ─── Recherche de monde (Traveller Map API) ───────────────────────────────
|
html.find('[data-action="load-pax-actor"]').on('click', async (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
this._applyPassengerActorData(html);
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[data-action="roll-pax-effect"]').on('click', async (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
await this._rollActorEffectIntoField(html, 'pax.skillEffect', COMMERCE_SKILLS.passengerEffect);
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[data-action="load-cargo-actor"]').on('click', async (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
this._applyCargoActorData(html);
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[data-action="roll-cargo-effect"]').on('click', async (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
await this._rollActorEffectIntoField(html, 'cargo.skillEffect', COMMERCE_SKILLS.cargoEffect);
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[data-action="load-trade-actor"]').on('click', async (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
this._applyTradeActorData(html);
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('.tabs .item').on('click', (ev) => {
|
||||||
|
ev.preventDefault();
|
||||||
|
this._readForm(html);
|
||||||
|
this._activateTab($(ev.currentTarget).data('tab'));
|
||||||
|
});
|
||||||
|
|
||||||
|
this._bindWorldSearch(html);
|
||||||
|
|
||||||
|
html.on('click', (ev) => {
|
||||||
|
if (!$(ev.target).closest('.world-search-widget').length) {
|
||||||
|
html.find('.world-search-results').empty();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_getForm() {
|
||||||
|
return $(this.element).find('.window-content');
|
||||||
|
}
|
||||||
|
|
||||||
|
_activateTab(tabId) {
|
||||||
|
const html = this._getForm();
|
||||||
|
if (!html?.length) return;
|
||||||
|
|
||||||
|
this._activeTab = tabId;
|
||||||
|
html.find('.tabs .item').removeClass('active');
|
||||||
|
html.find(`.tabs .item[data-tab="${tabId}"]`).addClass('active');
|
||||||
|
html.find('.tab-content .tab').removeClass('active');
|
||||||
|
html.find(`.tab-content .tab[data-tab="${tabId}"]`).addClass('active');
|
||||||
|
this._applyThemeStyles(html);
|
||||||
|
}
|
||||||
|
|
||||||
|
_applyThemeStyles(html) {
|
||||||
|
html.find('.tabs .item').css({
|
||||||
|
color: '#d8c79a',
|
||||||
|
'text-shadow': 'none',
|
||||||
|
'background-color': '',
|
||||||
|
'border-bottom-color': 'transparent'
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('.tabs .item.active').css({
|
||||||
|
color: '#d9b24c',
|
||||||
|
'text-shadow': 'none',
|
||||||
|
'background-color': 'rgba(201, 162, 39, 0.18)',
|
||||||
|
'border-bottom-color': '#c9a227'
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('h3').css({
|
||||||
|
color: '#5f4300',
|
||||||
|
'border-bottom-color': '#b78f26',
|
||||||
|
'text-shadow': 'none'
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('legend').css({
|
||||||
|
color: '#7a5c00',
|
||||||
|
'text-shadow': 'none'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_bindWorldSearch(html) {
|
||||||
html.find('.world-search-widget').each((_, widget) => {
|
html.find('.world-search-widget').each((_, widget) => {
|
||||||
const $widget = $(widget);
|
const $widget = $(widget);
|
||||||
const $input = $widget.find('.world-search-input');
|
const $input = $widget.find('.world-search-input');
|
||||||
@@ -105,12 +199,11 @@ export class CommerceDialog extends FormApplication {
|
|||||||
if (!worlds.length) {
|
if (!worlds.length) {
|
||||||
$results.append('<li class="no-result">Aucun monde trouvé</li>');
|
$results.append('<li class="no-result">Aucun monde trouvé</li>');
|
||||||
} else {
|
} else {
|
||||||
worlds.slice(0, 10).forEach(w => {
|
worlds.slice(0, 10).forEach((w) => {
|
||||||
const $li = $(`<li data-sector="${w.sector}" data-hex="${w.hex}"><span class="world-name">${w.name}</span> <span class="world-uwp">${w.uwp}</span> <span class="world-sector">${w.sector}</span></li>`);
|
const $li = $(`<li data-sector="${w.sector}" data-hex="${w.hex}"><span class="world-name">${w.name}</span> <span class="world-uwp">${w.uwp}</span> <span class="world-sector">${w.sector}</span></li>`);
|
||||||
$li.on('click', async () => {
|
$li.on('click', async () => {
|
||||||
$results.empty();
|
$results.empty();
|
||||||
$input.val(w.name);
|
$input.val(w.name);
|
||||||
// Récupère les détails (UWP précis + zone) et les coordonnées en parallèle
|
|
||||||
const [detail, coords] = await Promise.all([
|
const [detail, coords] = await Promise.all([
|
||||||
fetchWorldDetail(w.sector, w.hex).catch(() => null),
|
fetchWorldDetail(w.sector, w.hex).catch(() => null),
|
||||||
fetchWorldCoordinates(w.sector, w.hex).catch(() => null),
|
fetchWorldCoordinates(w.sector, w.hex).catch(() => null),
|
||||||
@@ -121,11 +214,8 @@ export class CommerceDialog extends FormApplication {
|
|||||||
|
|
||||||
html.find(`[name="${uwpTarget}"]`).val(resolvedUwp);
|
html.find(`[name="${uwpTarget}"]`).val(resolvedUwp);
|
||||||
html.find(`[name="${zoneTarget}"]`).val(resolvedZone);
|
html.find(`[name="${zoneTarget}"]`).val(resolvedZone);
|
||||||
|
|
||||||
// Stocker les coordonnées dans le widget courant
|
|
||||||
$widget.data('coords', coords);
|
$widget.data('coords', coords);
|
||||||
|
|
||||||
// Synchronisation inter-onglets : départ Passagers → départ Cargaison + monde Commerce
|
|
||||||
if (uwpTarget === 'pax.uwpDep') {
|
if (uwpTarget === 'pax.uwpDep') {
|
||||||
const $cargoDep = html.find('.world-search-widget[data-uwp-target="cargo.uwpDep"]');
|
const $cargoDep = html.find('.world-search-widget[data-uwp-target="cargo.uwpDep"]');
|
||||||
$cargoDep.find('.world-search-input').val(w.name);
|
$cargoDep.find('.world-search-input').val(w.name);
|
||||||
@@ -139,73 +229,129 @@ export class CommerceDialog extends FormApplication {
|
|||||||
html.find('[name="trade.zone"]').val(resolvedZone);
|
html.find('[name="trade.zone"]').val(resolvedZone);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculer les parsecs si le widget partenaire a aussi ses coordonnées
|
|
||||||
if (parsecsTarget) {
|
if (parsecsTarget) {
|
||||||
const partnerRole = role === 'dep' ? 'dest' : 'dep';
|
const partnerRole = role === 'dep' ? 'dest' : 'dep';
|
||||||
const $partner = html.find(
|
const $partner = html.find(`.world-search-widget[data-parsecs-target="${parsecsTarget}"][data-role="${partnerRole}"]`);
|
||||||
`.world-search-widget[data-parsecs-target="${parsecsTarget}"][data-role="${partnerRole}"]`
|
|
||||||
);
|
|
||||||
const partnerCoords = $partner.data('coords');
|
const partnerCoords = $partner.data('coords');
|
||||||
if (coords && partnerCoords) {
|
if (coords && partnerCoords) {
|
||||||
const dist = calcParsecs(coords, partnerCoords);
|
const dist = calcParsecs(coords, partnerCoords);
|
||||||
html.find(`[name="${parsecsTarget}"]`).val(dist);
|
html.find(`[name="${parsecsTarget}"]`).val(dist);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._readForm(html);
|
||||||
});
|
});
|
||||||
$results.append($li);
|
$results.append($li);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (_err) {
|
||||||
$results.append('<li class="no-result">Erreur de connexion à Traveller Map</li>');
|
$results.append('<li class="no-result">Erreur de connexion à Traveller Map</li>');
|
||||||
}
|
}
|
||||||
$btn.prop('disabled', false).html('<i class="fas fa-globe"></i> Chercher');
|
$btn.prop('disabled', false).html('<i class="fas fa-globe"></i> Chercher');
|
||||||
};
|
};
|
||||||
|
|
||||||
$btn.on('click', doSearch);
|
$btn.on('click', doSearch);
|
||||||
$input.on('keydown', (ev) => { if (ev.key === 'Enter') { ev.preventDefault(); doSearch(); } });
|
$input.on('keydown', (ev) => {
|
||||||
});
|
if (ev.key === 'Enter') {
|
||||||
|
ev.preventDefault();
|
||||||
// Fermer les listes de résultats en cliquant ailleurs
|
doSearch();
|
||||||
html.on('click', (ev) => {
|
|
||||||
if (!$(ev.target).closest('.world-search-widget').length) {
|
|
||||||
html.find('.world-search-results').empty();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Lecture du formulaire ─────────────────────────────────────────────────
|
|
||||||
|
|
||||||
_readForm(html) {
|
_readForm(html) {
|
||||||
// Passagers
|
|
||||||
this._formData.pax.uwpDep = html.find('[name="pax.uwpDep"]').val();
|
this._formData.pax.uwpDep = html.find('[name="pax.uwpDep"]').val();
|
||||||
this._formData.pax.uwpDest = html.find('[name="pax.uwpDest"]').val();
|
this._formData.pax.uwpDest = html.find('[name="pax.uwpDest"]').val();
|
||||||
this._formData.pax.zoneDep = html.find('[name="pax.zoneDep"]').val();
|
this._formData.pax.zoneDep = html.find('[name="pax.zoneDep"]').val();
|
||||||
this._formData.pax.zoneDest = html.find('[name="pax.zoneDest"]').val();
|
this._formData.pax.zoneDest = html.find('[name="pax.zoneDest"]').val();
|
||||||
this._formData.pax.parsecs = parseInt(html.find('[name="pax.parsecs"]').val()) || 1;
|
this._formData.pax.parsecs = parseInt(html.find('[name="pax.parsecs"]').val(), 10) || 1;
|
||||||
this._formData.pax.skillEffect = parseInt(html.find('[name="pax.skillEffect"]').val()) || 0;
|
this._formData.pax.skillEffect = parseInt(html.find('[name="pax.skillEffect"]').val(), 10) || 0;
|
||||||
this._formData.pax.stewardLevel = parseInt(html.find('[name="pax.stewardLevel"]').val()) || 0;
|
this._formData.pax.stewardLevel = parseInt(html.find('[name="pax.stewardLevel"]').val(), 10) || 0;
|
||||||
|
|
||||||
// Cargaison
|
|
||||||
this._formData.cargo.uwpDep = html.find('[name="cargo.uwpDep"]').val();
|
this._formData.cargo.uwpDep = html.find('[name="cargo.uwpDep"]').val();
|
||||||
this._formData.cargo.uwpDest = html.find('[name="cargo.uwpDest"]').val();
|
this._formData.cargo.uwpDest = html.find('[name="cargo.uwpDest"]').val();
|
||||||
this._formData.cargo.zoneDep = html.find('[name="cargo.zoneDep"]').val();
|
this._formData.cargo.zoneDep = html.find('[name="cargo.zoneDep"]').val();
|
||||||
this._formData.cargo.zoneDest = html.find('[name="cargo.zoneDest"]').val();
|
this._formData.cargo.zoneDest = html.find('[name="cargo.zoneDest"]').val();
|
||||||
this._formData.cargo.parsecs = parseInt(html.find('[name="cargo.parsecs"]').val()) || 1;
|
this._formData.cargo.parsecs = parseInt(html.find('[name="cargo.parsecs"]').val(), 10) || 1;
|
||||||
this._formData.cargo.skillEffect = parseInt(html.find('[name="cargo.skillEffect"]').val()) || 0;
|
this._formData.cargo.skillEffect = parseInt(html.find('[name="cargo.skillEffect"]').val(), 10) || 0;
|
||||||
this._formData.cargo.navyRank = parseInt(html.find('[name="cargo.navyRank"]').val()) || 0;
|
this._formData.cargo.navyRank = parseInt(html.find('[name="cargo.navyRank"]').val(), 10) || 0;
|
||||||
this._formData.cargo.scoutRank = parseInt(html.find('[name="cargo.scoutRank"]').val()) || 0;
|
this._formData.cargo.scoutRank = parseInt(html.find('[name="cargo.scoutRank"]').val(), 10) || 0;
|
||||||
this._formData.cargo.socMod = parseInt(html.find('[name="cargo.socMod"]').val()) || 0;
|
this._formData.cargo.socMod = parseInt(html.find('[name="cargo.socMod"]').val(), 10) || 0;
|
||||||
this._formData.cargo.armed = html.find('[name="cargo.armed"]').is(':checked');
|
this._formData.cargo.armed = html.find('[name="cargo.armed"]').is(':checked');
|
||||||
|
|
||||||
// Commerce spéculatif
|
|
||||||
this._formData.trade.uwp = html.find('[name="trade.uwp"]').val();
|
this._formData.trade.uwp = html.find('[name="trade.uwp"]').val();
|
||||||
this._formData.trade.zone = html.find('[name="trade.zone"]').val();
|
this._formData.trade.zone = html.find('[name="trade.zone"]').val();
|
||||||
this._formData.trade.brokerSkill = parseInt(html.find('[name="trade.brokerSkill"]').val()) || 0;
|
this._formData.trade.brokerSkill = parseInt(html.find('[name="trade.brokerSkill"]').val(), 10) || 0;
|
||||||
this._formData.trade.previousAttempts = parseInt(html.find('[name="trade.previousAttempts"]').val()) || 0;
|
this._formData.trade.previousAttempts = parseInt(html.find('[name="trade.previousAttempts"]').val(), 10) || 0;
|
||||||
this._formData.trade.blackMarket = html.find('[name="trade.blackMarket"]').is(':checked');
|
this._formData.trade.blackMarket = html.find('[name="trade.blackMarket"]').is(':checked');
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Passagers ─────────────────────────────────────────────────────────────
|
_getActiveActorOrWarn() {
|
||||||
|
const { actor } = getActiveTravellerActor();
|
||||||
|
if (!actor) {
|
||||||
|
ui.notifications.warn('Aucun token sélectionné ni personnage assigné pour lire les compétences mgt2e.');
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return actor;
|
||||||
|
}
|
||||||
|
|
||||||
|
_applyPassengerActorData(html) {
|
||||||
|
const actor = this._getActiveActorOrWarn();
|
||||||
|
if (!actor) return;
|
||||||
|
|
||||||
|
const steward = getActorSkillSummary(actor, COMMERCE_SKILLS.steward);
|
||||||
|
this._setNumericSelectValue(html, 'pax.stewardLevel', steward.value);
|
||||||
|
this._readForm(html);
|
||||||
|
ui.notifications.info(`${actor.name} : Intendant ${steward.value} chargé dans le calcul passagers.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
_applyCargoActorData(html) {
|
||||||
|
const actor = this._getActiveActorOrWarn();
|
||||||
|
if (!actor) return;
|
||||||
|
|
||||||
|
const socMod = Number(actor.system.characteristics?.SOC?.dm ?? 0);
|
||||||
|
this._setNumericSelectValue(html, 'cargo.socMod', socMod);
|
||||||
|
this._readForm(html);
|
||||||
|
ui.notifications.info(`${actor.name} : DM SOC ${socMod >= 0 ? '+' : ''}${socMod} chargé dans le calcul cargaison.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
_applyTradeActorData(html) {
|
||||||
|
const actor = this._getActiveActorOrWarn();
|
||||||
|
if (!actor) return;
|
||||||
|
|
||||||
|
const broker = getActorSkillSummary(actor, COMMERCE_SKILLS.tradeBroker);
|
||||||
|
this._setNumericSelectValue(html, 'trade.brokerSkill', broker.value);
|
||||||
|
this._readForm(html);
|
||||||
|
ui.notifications.info(`${actor.name} : Courtier ${broker.value} chargé pour le commerce spéculatif.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
async _rollActorEffectIntoField(html, fieldName, skillList) {
|
||||||
|
const actor = this._getActiveActorOrWarn();
|
||||||
|
if (!actor) return;
|
||||||
|
|
||||||
|
const rollResult = await rollActorSkillEffect(actor, skillList);
|
||||||
|
if (!rollResult) {
|
||||||
|
ui.notifications.warn(`${actor.name} ne possède aucune des compétences attendues pour ce calcul.`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._setNumericSelectValue(html, fieldName, rollResult.effect);
|
||||||
|
this._readForm(html);
|
||||||
|
ui.notifications.info(`${actor.name} : ${rollResult.label} → 2D6 (${rollResult.diceTotal}) + ${rollResult.totalModifier >= 0 ? '+' : ''}${rollResult.totalModifier} = ${rollResult.total}, effet ${rollResult.effect >= 0 ? '+' : ''}${rollResult.effect}.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
_setNumericSelectValue(html, fieldName, value) {
|
||||||
|
const select = html.find(`[name="${fieldName}"]`);
|
||||||
|
if (!select.length) return;
|
||||||
|
|
||||||
|
const normalized = Number(value ?? 0);
|
||||||
|
if (!select.find(`option[value="${normalized}"]`).length) {
|
||||||
|
const label = normalized > 0 ? `+${normalized}` : `${normalized}`;
|
||||||
|
select.append(`<option value="${normalized}">${label}</option>`);
|
||||||
|
}
|
||||||
|
select.val(`${normalized}`);
|
||||||
|
}
|
||||||
|
|
||||||
async _handlePassengers() {
|
async _handlePassengers() {
|
||||||
const p = this._formData.pax;
|
const p = this._formData.pax;
|
||||||
@@ -223,15 +369,10 @@ export class CommerceDialog extends FormApplication {
|
|||||||
stewardLevel: p.stewardLevel,
|
stewardLevel: p.stewardLevel,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!result.success) {
|
if (!result.success) return ui.notifications.error(result.errors.join(' | '));
|
||||||
return ui.notifications.error(result.errors.join(' | '));
|
|
||||||
}
|
|
||||||
|
|
||||||
await this._postToChatResult(result);
|
await this._postToChatResult(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Cargaison ─────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
async _handleCargo() {
|
async _handleCargo() {
|
||||||
const c = this._formData.cargo;
|
const c = this._formData.cargo;
|
||||||
if (!c.uwpDep || !c.uwpDest) {
|
if (!c.uwpDep || !c.uwpDest) {
|
||||||
@@ -251,18 +392,11 @@ export class CommerceDialog extends FormApplication {
|
|||||||
armed: c.armed,
|
armed: c.armed,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!result.success) {
|
if (!result.success) return ui.notifications.error(result.errors.join(' | '));
|
||||||
return ui.notifications.error(result.errors.join(' | '));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calcule le sous-total cargaison pour le template
|
|
||||||
result.cargoRevenue = result.lots.reduce((s, l) => s + l.revenue, 0);
|
result.cargoRevenue = result.lots.reduce((s, l) => s + l.revenue, 0);
|
||||||
|
|
||||||
await this._postToChatResult(result);
|
await this._postToChatResult(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Commerce spéculatif – trouver les marchandises ────────────────────────
|
|
||||||
|
|
||||||
async _handleFindGoods(html) {
|
async _handleFindGoods(html) {
|
||||||
const t = this._formData.trade;
|
const t = this._formData.trade;
|
||||||
if (!t.uwp) {
|
if (!t.uwp) {
|
||||||
@@ -277,20 +411,16 @@ export class CommerceDialog extends FormApplication {
|
|||||||
previousAttempts: t.previousAttempts,
|
previousAttempts: t.previousAttempts,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!result.success) {
|
if (!result.success) return ui.notifications.error(result.errors.join(' | '));
|
||||||
return ui.notifications.error(result.errors.join(' | '));
|
|
||||||
}
|
|
||||||
|
|
||||||
this._tradeGoods = result;
|
this._tradeGoods = result;
|
||||||
|
|
||||||
// Affiche un aperçu inline dans l'onglet
|
|
||||||
const goodsDiv = html.find('.trade-goods-result');
|
const goodsDiv = html.find('.trade-goods-result');
|
||||||
const listDiv = html.find('.trade-goods-list');
|
const listDiv = html.find('.trade-goods-list');
|
||||||
|
|
||||||
if (result.goods.length === 0) {
|
if (result.goods.length === 0) {
|
||||||
listDiv.html('<p><em>Aucune marchandise disponible sur ce monde.</em></p>');
|
listDiv.html('<p><em>Aucune marchandise disponible sur ce monde.</em></p>');
|
||||||
} else {
|
} else {
|
||||||
const rows = result.goods.map(g => `
|
const rows = result.goods.map((g) => `
|
||||||
<div class="trade-good-item">
|
<div class="trade-good-item">
|
||||||
<label>
|
<label>
|
||||||
<input type="checkbox" class="good-select" data-d66="${g.d66}" checked>
|
<input type="checkbox" class="good-select" data-d66="${g.d66}" checked>
|
||||||
@@ -308,8 +438,6 @@ export class CommerceDialog extends FormApplication {
|
|||||||
await this._postToChatResult(result);
|
await this._postToChatResult(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Commerce spéculatif – calculer les prix d'achat ───────────────────────
|
|
||||||
|
|
||||||
async _handleBuyPrices() {
|
async _handleBuyPrices() {
|
||||||
if (!this._tradeGoods || !this._tradeGoods.goods.length) {
|
if (!this._tradeGoods || !this._tradeGoods.goods.length) {
|
||||||
return ui.notifications.warn('Veuillez d\'abord trouver les marchandises disponibles.');
|
return ui.notifications.warn('Veuillez d\'abord trouver les marchandises disponibles.');
|
||||||
@@ -317,7 +445,6 @@ export class CommerceDialog extends FormApplication {
|
|||||||
|
|
||||||
const brokerSkill = this._formData.trade.brokerSkill;
|
const brokerSkill = this._formData.trade.brokerSkill;
|
||||||
const prices = [];
|
const prices = [];
|
||||||
|
|
||||||
for (const g of this._tradeGoods.goods) {
|
for (const g of this._tradeGoods.goods) {
|
||||||
const priceResult = await calculatePrice({
|
const priceResult = await calculatePrice({
|
||||||
basePrice: g.basePrice,
|
basePrice: g.basePrice,
|
||||||
@@ -340,34 +467,20 @@ export class CommerceDialog extends FormApplication {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const grandTotal = prices.reduce((s, p) => s + p.totalCost, 0);
|
const grandTotal = prices.reduce((s, p) => s + p.totalCost, 0);
|
||||||
|
|
||||||
await this._postToChatResult({ type: 'buy-prices', prices, grandTotal });
|
await this._postToChatResult({ type: 'buy-prices', prices, grandTotal });
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Post en chat ───────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
async _postToChatResult(data) {
|
async _postToChatResult(data) {
|
||||||
// Ajoute les helpers Handlebars nécessaires (si pas déjà enregistrés)
|
|
||||||
_registerHandlebarsHelpers();
|
_registerHandlebarsHelpers();
|
||||||
|
const html = await foundry.applications.handlebars.renderTemplate(`modules/${MODULE_ID}/templates/commerce-result.hbs`, data);
|
||||||
const html = await renderTemplate(
|
|
||||||
`modules/${MODULE_ID}/templates/commerce-result.hbs`,
|
|
||||||
data,
|
|
||||||
);
|
|
||||||
|
|
||||||
await ChatMessage.create({
|
await ChatMessage.create({
|
||||||
content: html,
|
content: html,
|
||||||
speaker: ChatMessage.getSpeaker(),
|
speaker: ChatMessage.getSpeaker(),
|
||||||
flags: { [MODULE_ID]: { type: 'commerce-result' } },
|
flags: { [MODULE_ID]: { type: 'commerce-result' } },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Nécessaire pour FormApplication : ne soumet rien (tout est piloté par boutons). */
|
|
||||||
async _updateObject(_event, _formData) {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ─── Helpers Handlebars ───────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
let _helpersRegistered = false;
|
let _helpersRegistered = false;
|
||||||
|
|
||||||
function _registerHandlebarsHelpers() {
|
function _registerHandlebarsHelpers() {
|
||||||
@@ -379,11 +492,7 @@ function _registerHandlebarsHelpers() {
|
|||||||
Handlebars.registerHelper('gt', (a, b) => a > b);
|
Handlebars.registerHelper('gt', (a, b) => a > b);
|
||||||
Handlebars.registerHelper('gte', (a, b) => a >= b);
|
Handlebars.registerHelper('gte', (a, b) => a >= b);
|
||||||
Handlebars.registerHelper('eq', (a, b) => a === b);
|
Handlebars.registerHelper('eq', (a, b) => a === b);
|
||||||
|
Handlebars.registerHelper('modClass', (n) => (Number(n) > 0 ? 'mod-pos' : Number(n) < 0 ? 'mod-neg' : 'mod-zero'));
|
||||||
/** Classe CSS selon le signe du modificateur. */
|
|
||||||
Handlebars.registerHelper('modClass', (n) => Number(n) > 0 ? 'mod-pos' : Number(n) < 0 ? 'mod-neg' : 'mod-zero');
|
|
||||||
|
|
||||||
/** Génère un <select> numérique de min à max, avec +N pour les positifs. */
|
|
||||||
Handlebars.registerHelper('modSelect', function(id, name, value, min, max) {
|
Handlebars.registerHelper('modSelect', function(id, name, value, min, max) {
|
||||||
let opts = '';
|
let opts = '';
|
||||||
for (let i = min; i <= max; i++) {
|
for (let i = min; i <= max; i++) {
|
||||||
|
|||||||
+271
-35
@@ -1,12 +1,48 @@
|
|||||||
import { formatCredits } from './tradeHelper.js';
|
import { formatCredits } from './tradeHelper.js';
|
||||||
import { createNpcActor, generateClientMission, generateEncounter, generateQuickNpc } from './npcHelper.js';
|
import { createNpcActor, generateClientMission, generateEncounter, generateQuickNpc } from './npcHelper.js';
|
||||||
import { NPC_RELATIONS } from './data/npcTables.js';
|
import { NPC_RELATIONS } from './data/npcTables.js';
|
||||||
|
import { generateAndCreateTravellerNpc } from './travellerNpcGenerator.js';
|
||||||
|
import { generateRandomName } from './data/travellerNpcGenerator.js';
|
||||||
|
import { localizeSkill } from './mgt2eSkills.js';
|
||||||
|
import {
|
||||||
|
CITIZEN_CATEGORY_LIST,
|
||||||
|
EXPERIENCE_LEVEL_LIST,
|
||||||
|
ROLE_LIST,
|
||||||
|
GENDER_LIST,
|
||||||
|
DEFAULT_OPTIONS,
|
||||||
|
CITIZEN_CATEGORY_LABELS_FR,
|
||||||
|
EXPERIENCE_LEVEL_LABELS_FR,
|
||||||
|
ROLE_LABELS_FR,
|
||||||
|
GENDER_LABELS_FR
|
||||||
|
} from './data/travellerNpcGenerator.js';
|
||||||
|
|
||||||
|
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
|
||||||
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
|
||||||
export class NpcDialog extends FormApplication {
|
export class NpcDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
id: 'mgt2-npc',
|
||||||
|
classes: ['mgt2-npc-dialog'],
|
||||||
|
position: {
|
||||||
|
width: 720,
|
||||||
|
height: 'auto',
|
||||||
|
},
|
||||||
|
window: {
|
||||||
|
title: 'PNJ & Rencontres – MgT2e',
|
||||||
|
resizable: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: {
|
||||||
|
template: `modules/${MODULE_ID}/templates/npc-dialog.hbs`,
|
||||||
|
root: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
constructor(options = {}) {
|
constructor(options = {}) {
|
||||||
super({}, options);
|
super(options);
|
||||||
|
this._activeTab = options.initialTab ?? 'npc';
|
||||||
this._formData = {
|
this._formData = {
|
||||||
npc: {
|
npc: {
|
||||||
relation: options.relation ?? 'contact',
|
relation: options.relation ?? 'contact',
|
||||||
@@ -19,36 +55,57 @@ export class NpcDialog extends FormApplication {
|
|||||||
context: options.context ?? 'starport',
|
context: options.context ?? 'starport',
|
||||||
includeFollowUp: true,
|
includeFollowUp: true,
|
||||||
},
|
},
|
||||||
|
mission: {},
|
||||||
|
traveller: {
|
||||||
|
citizenCategory: DEFAULT_OPTIONS.citizenCategory,
|
||||||
|
experience: DEFAULT_OPTIONS.experience,
|
||||||
|
role: DEFAULT_OPTIONS.role,
|
||||||
|
gender: DEFAULT_OPTIONS.gender,
|
||||||
|
firstName: '',
|
||||||
|
surname: '',
|
||||||
|
useRandomName: true,
|
||||||
|
createActor: DEFAULT_OPTIONS.createActor,
|
||||||
|
actorName: '',
|
||||||
|
openCreatedActor: DEFAULT_OPTIONS.openCreatedActor,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
static get defaultOptions() {
|
async _prepareContext() {
|
||||||
return foundry.utils.mergeObject(super.defaultOptions, {
|
|
||||||
id: 'mgt2-npc',
|
|
||||||
title: 'PNJ & Rencontres – MGT2',
|
|
||||||
template: `modules/${MODULE_ID}/templates/npc-dialog.hbs`,
|
|
||||||
width: 720,
|
|
||||||
height: 'auto',
|
|
||||||
resizable: true,
|
|
||||||
tabs: [{
|
|
||||||
navSelector: '.tabs',
|
|
||||||
contentSelector: '.tab-content',
|
|
||||||
initial: 'npc',
|
|
||||||
}],
|
|
||||||
classes: ['mgt2-npc-dialog'],
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getData() {
|
|
||||||
registerHandlebarsHelpers();
|
registerHandlebarsHelpers();
|
||||||
return foundry.utils.mergeObject(super.getData(), {
|
return {
|
||||||
...this._formData,
|
...this._formData,
|
||||||
|
activeTab: this._activeTab,
|
||||||
relations: Object.entries(NPC_RELATIONS).map(([key, value]) => ({ key, label: value.label })),
|
relations: Object.entries(NPC_RELATIONS).map(([key, value]) => ({ key, label: value.label })),
|
||||||
});
|
citizenCategories: CITIZEN_CATEGORY_LIST.map(c => ({
|
||||||
|
key: c.key,
|
||||||
|
label: CITIZEN_CATEGORY_LABELS_FR[c.key] || c.label,
|
||||||
|
description: c.description
|
||||||
|
})),
|
||||||
|
experienceLevels: EXPERIENCE_LEVEL_LIST.map(e => ({
|
||||||
|
key: e.key,
|
||||||
|
label: EXPERIENCE_LEVEL_LABELS_FR[e.key] || e.label,
|
||||||
|
description: e.description
|
||||||
|
})),
|
||||||
|
roles: ROLE_LIST.map(r => ({
|
||||||
|
key: r.key,
|
||||||
|
label: ROLE_LABELS_FR[r.key] || r.label,
|
||||||
|
description: r.description
|
||||||
|
})),
|
||||||
|
genders: GENDER_LIST.map(g => ({
|
||||||
|
key: g.key,
|
||||||
|
label: GENDER_LABELS_FR[g.key] || g.label
|
||||||
|
})),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
activateListeners(html) {
|
async _onRender(context, options) {
|
||||||
super.activateListeners(html);
|
await super._onRender(context, options);
|
||||||
|
const html = this._getForm();
|
||||||
|
if (!html?.length) return;
|
||||||
|
html.addClass('mgt2-npc-form');
|
||||||
|
|
||||||
|
this._applyThemeStyles(html);
|
||||||
|
|
||||||
html.find('[data-action="generate-npc"]').on('click', async (event) => {
|
html.find('[data-action="generate-npc"]').on('click', async (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
@@ -64,12 +121,79 @@ export class NpcDialog extends FormApplication {
|
|||||||
|
|
||||||
html.find('[data-action="generate-mission"]').on('click', async (event) => {
|
html.find('[data-action="generate-mission"]').on('click', async (event) => {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
this._readForm(html);
|
||||||
await this._handleMission();
|
await this._handleMission();
|
||||||
});
|
});
|
||||||
|
|
||||||
if (this.options.initialTab) {
|
html.find('.tabs .item').on('click', (event) => {
|
||||||
this._tabs?.[0]?.activate(this.options.initialTab);
|
event.preventDefault();
|
||||||
|
this._readForm(html);
|
||||||
|
this._activateTab($(event.currentTarget).data('tab'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Gestion des événements pour l'onglet PNJ Détaillé (Traveller)
|
||||||
|
html.find('[data-action="generate-traveller-npc"]').on('click', async (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
this._readForm(html);
|
||||||
|
await this._handleTravellerNpc();
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[data-action="randomize-name"]').on('click', (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
this._randomizeTravellerName(html);
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[name="traveller.useRandomName"]').on('change', (event) => {
|
||||||
|
const useRandom = event.target.checked;
|
||||||
|
this._formData.traveller.useRandomName = useRandom;
|
||||||
|
html.find('.traveller-name-fields').toggleClass('hidden', useRandom);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Initialiser l'affichage des champs de nom pour l'onglet Traveller
|
||||||
|
html.find('.traveller-name-fields').toggleClass('hidden', this._formData.traveller.useRandomName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_getForm() {
|
||||||
|
return $(this.element).find('.window-content');
|
||||||
|
}
|
||||||
|
|
||||||
|
_activateTab(tabId) {
|
||||||
|
const html = this._getForm();
|
||||||
|
if (!html?.length) return;
|
||||||
|
|
||||||
|
this._activeTab = tabId;
|
||||||
|
html.find('.tabs .item').removeClass('active');
|
||||||
|
html.find(`.tabs .item[data-tab="${tabId}"]`).addClass('active');
|
||||||
|
html.find('.tab-content .tab').removeClass('active');
|
||||||
|
html.find(`.tab-content .tab[data-tab="${tabId}"]`).addClass('active');
|
||||||
|
this._applyThemeStyles(html);
|
||||||
|
}
|
||||||
|
|
||||||
|
_applyThemeStyles(html) {
|
||||||
|
html.find('.tabs .item').css({
|
||||||
|
color: '#d8c79a',
|
||||||
|
'text-shadow': 'none',
|
||||||
|
'background-color': '',
|
||||||
|
'border-bottom-color': 'transparent'
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('.tabs .item.active').css({
|
||||||
|
color: '#d9b24c',
|
||||||
|
'text-shadow': 'none',
|
||||||
|
'background-color': 'rgba(201, 162, 39, 0.18)',
|
||||||
|
'border-bottom-color': '#c9a227'
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('h3').css({
|
||||||
|
color: '#5f4300',
|
||||||
|
'border-bottom-color': '#b78f26',
|
||||||
|
'text-shadow': 'none'
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('legend').css({
|
||||||
|
color: '#7a5c00',
|
||||||
|
'text-shadow': 'none'
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
_readForm(html) {
|
_readForm(html) {
|
||||||
@@ -80,6 +204,18 @@ export class NpcDialog extends FormApplication {
|
|||||||
this._formData.npc.openCreatedActor = html.find('[name="npc.openCreatedActor"]').is(':checked');
|
this._formData.npc.openCreatedActor = html.find('[name="npc.openCreatedActor"]').is(':checked');
|
||||||
this._formData.encounter.context = html.find('[name="encounter.context"]').val();
|
this._formData.encounter.context = html.find('[name="encounter.context"]').val();
|
||||||
this._formData.encounter.includeFollowUp = html.find('[name="encounter.includeFollowUp"]').is(':checked');
|
this._formData.encounter.includeFollowUp = html.find('[name="encounter.includeFollowUp"]').is(':checked');
|
||||||
|
|
||||||
|
// Données pour l'onglet PNJ Détaillé (Traveller)
|
||||||
|
this._formData.traveller.citizenCategory = html.find('[name="traveller.citizenCategory"]').val();
|
||||||
|
this._formData.traveller.experience = html.find('[name="traveller.experience"]').val();
|
||||||
|
this._formData.traveller.role = html.find('[name="traveller.role"]').val();
|
||||||
|
this._formData.traveller.gender = html.find('[name="traveller.gender"]').val();
|
||||||
|
this._formData.traveller.firstName = html.find('[name="traveller.firstName"]').val();
|
||||||
|
this._formData.traveller.surname = html.find('[name="traveller.surname"]').val();
|
||||||
|
this._formData.traveller.useRandomName = html.find('[name="traveller.useRandomName"]').is(':checked');
|
||||||
|
this._formData.traveller.createActor = html.find('[name="traveller.createActor"]').is(':checked');
|
||||||
|
this._formData.traveller.actorName = html.find('[name="traveller.actorName"]').val();
|
||||||
|
this._formData.traveller.openCreatedActor = html.find('[name="traveller.openCreatedActor"]').is(':checked');
|
||||||
}
|
}
|
||||||
|
|
||||||
async _handleNpc() {
|
async _handleNpc() {
|
||||||
@@ -89,10 +225,7 @@ export class NpcDialog extends FormApplication {
|
|||||||
name: this._formData.npc.actorName,
|
name: this._formData.npc.actorName,
|
||||||
openSheet: this._formData.npc.openCreatedActor,
|
openSheet: this._formData.npc.openCreatedActor,
|
||||||
});
|
});
|
||||||
result.createdActor = {
|
result.createdActor = { id: actor.id, name: actor.name };
|
||||||
id: actor.id,
|
|
||||||
name: actor.name,
|
|
||||||
};
|
|
||||||
ui.notifications.info(`Fiche PNJ créée : ${actor.name}`);
|
ui.notifications.info(`Fiche PNJ créée : ${actor.name}`);
|
||||||
}
|
}
|
||||||
await this._postToChatResult(result);
|
await this._postToChatResult(result);
|
||||||
@@ -108,19 +241,77 @@ export class NpcDialog extends FormApplication {
|
|||||||
await this._postToChatResult(result);
|
await this._postToChatResult(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async _handleTravellerNpc() {
|
||||||
|
const button = $(this.element).find('[data-action="generate-traveller-npc"]');
|
||||||
|
const originalLabel = button.html();
|
||||||
|
|
||||||
|
try {
|
||||||
|
button.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i> Génération...');
|
||||||
|
|
||||||
|
const generateOptions = {
|
||||||
|
citizenCategory: this._formData.traveller.citizenCategory,
|
||||||
|
experience: this._formData.traveller.experience,
|
||||||
|
role: this._formData.traveller.role,
|
||||||
|
gender: this._formData.traveller.gender,
|
||||||
|
createActor: this._formData.traveller.createActor,
|
||||||
|
actorName: this._formData.traveller.actorName,
|
||||||
|
openCreatedActor: this._formData.traveller.openCreatedActor
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!this._formData.traveller.useRandomName && this._formData.traveller.firstName && this._formData.traveller.surname) {
|
||||||
|
generateOptions.firstName = this._formData.traveller.firstName;
|
||||||
|
generateOptions.surname = this._formData.traveller.surname;
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = await generateAndCreateTravellerNpc(generateOptions);
|
||||||
|
|
||||||
|
if (result.success) {
|
||||||
|
await this._postToChatResult(result);
|
||||||
|
if (result.createdActor) {
|
||||||
|
ui.notifications.info(`Fiche PNJ Traveller créée : ${result.createdActor.name}`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ui.notifications.error('Erreur lors de la génération du PNJ Traveller');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`${MODULE_ID} | Erreur lors de la génération du PNJ Traveller:`, error);
|
||||||
|
ui.notifications.error(`Erreur: ${error.message}`);
|
||||||
|
} finally {
|
||||||
|
button.prop('disabled', false).html(originalLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_randomizeTravellerName(html) {
|
||||||
|
const name = generateRandomName(this._formData.traveller.gender);
|
||||||
|
html.find('[name="traveller.firstName"]').val(name.firstName);
|
||||||
|
html.find('[name="traveller.surname"]').val(name.surname);
|
||||||
|
this._formData.traveller.firstName = name.firstName;
|
||||||
|
this._formData.traveller.surname = name.surname;
|
||||||
|
this._formData.traveller.useRandomName = false;
|
||||||
|
html.find('[name="traveller.useRandomName"]').prop('checked', false);
|
||||||
|
html.find('.traveller-name-fields').removeClass('hidden');
|
||||||
|
}
|
||||||
|
|
||||||
async _postToChatResult(data) {
|
async _postToChatResult(data) {
|
||||||
registerHandlebarsHelpers();
|
registerHandlebarsHelpers();
|
||||||
const renderHbs = foundry.applications?.handlebars?.renderTemplate ?? renderTemplate;
|
|
||||||
const html = await renderHbs(`modules/${MODULE_ID}/templates/npc-result.hbs`, data);
|
// Déterminer quel template utiliser en fonction du type de données
|
||||||
|
let template = `modules/${MODULE_ID}/templates/npc-result.hbs`;
|
||||||
|
let resultType = 'npc-result';
|
||||||
|
|
||||||
|
if (data.type === 'traveller-npc' || data?.flags?.[MODULE_ID]?.type === 'traveller-npc-result') {
|
||||||
|
template = `modules/${MODULE_ID}/templates/traveller-npc-result.hbs`;
|
||||||
|
resultType = 'traveller-npc-result';
|
||||||
|
}
|
||||||
|
|
||||||
|
const html = await foundry.applications.handlebars.renderTemplate(template, data);
|
||||||
|
|
||||||
await ChatMessage.create({
|
await ChatMessage.create({
|
||||||
content: html,
|
content: html,
|
||||||
speaker: ChatMessage.getSpeaker(),
|
speaker: ChatMessage.getSpeaker(),
|
||||||
flags: { [MODULE_ID]: { type: 'npc-result' } },
|
flags: { [MODULE_ID]: { type: resultType } },
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async _updateObject(_event, _formData) {}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let helpersRegistered = false;
|
let helpersRegistered = false;
|
||||||
@@ -129,8 +320,53 @@ function registerHandlebarsHelpers() {
|
|||||||
if (helpersRegistered) return;
|
if (helpersRegistered) return;
|
||||||
helpersRegistered = true;
|
helpersRegistered = true;
|
||||||
|
|
||||||
|
// Helpers existants pour NPC
|
||||||
Handlebars.registerHelper('eq', (a, b) => a === b);
|
Handlebars.registerHelper('eq', (a, b) => a === b);
|
||||||
Handlebars.registerHelper('join', (arr, sep) => (Array.isArray(arr) ? arr.join(sep) : ''));
|
Handlebars.registerHelper('join', (arr, sep) => (Array.isArray(arr) ? arr.join(sep) : ''));
|
||||||
Handlebars.registerHelper('formatCredits', (amount) => formatCredits(amount));
|
Handlebars.registerHelper('formatCredits', (amount) => formatCredits(amount));
|
||||||
Handlebars.registerHelper('contains', (text, search) => String(text ?? '').includes(search));
|
Handlebars.registerHelper('contains', (text, search) => String(text ?? '').includes(search));
|
||||||
|
|
||||||
|
// Helper pour localiser une compétence (ex: 'pilot' -> 'Pilote')
|
||||||
|
Handlebars.registerHelper('localizeSkill', (skillFqn) => {
|
||||||
|
if (!skillFqn) return '';
|
||||||
|
return localizeSkill(String(skillFqn));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Helper pour joindre un tableau de compétences en les localisant
|
||||||
|
Handlebars.registerHelper('joinLocalizedSkills', (arr, sep = ', ') => {
|
||||||
|
if (!Array.isArray(arr)) return '';
|
||||||
|
return arr.map(skill => localizeSkill(String(skill))).join(sep);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Helpers pour Traveller NPC
|
||||||
|
Handlebars.registerHelper('gt', (a, b) => a > b);
|
||||||
|
|
||||||
|
// Helper pour afficher le niveau de compétence avec un symbole
|
||||||
|
Handlebars.registerHelper('skillLevelSymbol', (level) => {
|
||||||
|
if (level === 0) return '';
|
||||||
|
if (level === 1) return '★';
|
||||||
|
if (level === 2) return '★★';
|
||||||
|
if (level === 3) return '★★★';
|
||||||
|
return `+${level}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Helper pour formater le DM (Difficulté Modificateur)
|
||||||
|
Handlebars.registerHelper('formatDm', (value) => {
|
||||||
|
const dm = Math.floor((value - 6) / 3);
|
||||||
|
return dm >= 0 ? `+${dm}` : `${dm}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Helper pour obtenir la classe CSS du niveau de compétence
|
||||||
|
Handlebars.registerHelper('skillLevelClass', (level) => {
|
||||||
|
if (level === 3) return 'skill-level-3';
|
||||||
|
if (level === 2) return 'skill-level-2';
|
||||||
|
if (level === 1) return 'skill-level-1';
|
||||||
|
return 'skill-level-0';
|
||||||
|
});
|
||||||
|
|
||||||
|
// Helper pour lookup dans un objet
|
||||||
|
Handlebars.registerHelper('lookup', (obj, key) => {
|
||||||
|
if (!obj || !key) return '';
|
||||||
|
return obj[key] !== undefined ? obj[key] : '';
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,281 @@
|
|||||||
|
/**
|
||||||
|
* Traveller NPC Generator - Dialogue de génération
|
||||||
|
*
|
||||||
|
* Ce fichier contient le dialogue pour générer des PNJ Traveller.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { generateAndCreateTravellerNpc } from './travellerNpcGenerator.js';
|
||||||
|
import {
|
||||||
|
CITIZEN_CATEGORY_LIST,
|
||||||
|
EXPERIENCE_LEVEL_LIST,
|
||||||
|
ROLE_LIST,
|
||||||
|
GENDER_LIST,
|
||||||
|
DEFAULT_OPTIONS,
|
||||||
|
generateRandomName,
|
||||||
|
CITIZEN_CATEGORY_LABELS_FR,
|
||||||
|
EXPERIENCE_LEVEL_LABELS_FR,
|
||||||
|
ROLE_LABELS_FR,
|
||||||
|
GENDER_LABELS_FR
|
||||||
|
} from './data/travellerNpcGenerator.js';
|
||||||
|
|
||||||
|
const { ApplicationV2, HandlebarsApplicationMixin } = foundry.applications.api;
|
||||||
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
|
||||||
|
export class TravellerNpcDialog extends HandlebarsApplicationMixin(ApplicationV2) {
|
||||||
|
static DEFAULT_OPTIONS = {
|
||||||
|
id: 'mgt2-traveller-npc',
|
||||||
|
classes: ['mgt2-npc-dialog', 'mgt2-traveller-npc-dialog'],
|
||||||
|
position: {
|
||||||
|
width: 700,
|
||||||
|
height: 'auto',
|
||||||
|
},
|
||||||
|
window: {
|
||||||
|
title: 'Générateur de PNJ Traveller – MgT2e',
|
||||||
|
resizable: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static PARTS = {
|
||||||
|
main: {
|
||||||
|
template: `modules/${MODULE_ID}/templates/traveller-npc-dialog.hbs`,
|
||||||
|
root: true,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
constructor(options = {}) {
|
||||||
|
super(options);
|
||||||
|
|
||||||
|
// Form data avec valeurs par défaut
|
||||||
|
this._formData = {
|
||||||
|
citizenCategory: options.citizenCategory || DEFAULT_OPTIONS.citizenCategory,
|
||||||
|
experience: options.experience || DEFAULT_OPTIONS.experience,
|
||||||
|
role: options.role || DEFAULT_OPTIONS.role,
|
||||||
|
gender: options.gender || DEFAULT_OPTIONS.gender,
|
||||||
|
firstName: options.firstName || '',
|
||||||
|
surname: options.surname || '',
|
||||||
|
useRandomName: options.useRandomName !== false,
|
||||||
|
createActor: options.createActor !== undefined ? options.createActor : DEFAULT_OPTIONS.createActor,
|
||||||
|
actorName: options.actorName || '',
|
||||||
|
openCreatedActor: options.openCreatedActor !== undefined ? options.openCreatedActor : DEFAULT_OPTIONS.openCreatedActor,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Bind les méthodes pour éviter les problèmes de contexte
|
||||||
|
this._readForm = this._readForm.bind(this);
|
||||||
|
this._handleGenerate = this._handleGenerate.bind(this);
|
||||||
|
this._randomizeName = this._randomizeName.bind(this);
|
||||||
|
this._applyThemeStyles = this._applyThemeStyles.bind(this);
|
||||||
|
this._getForm = this._getForm.bind(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
async _prepareContext() {
|
||||||
|
registerHandlebarsHelpers();
|
||||||
|
return {
|
||||||
|
...this._formData,
|
||||||
|
citizenCategories: CITIZEN_CATEGORY_LIST.map(c => ({
|
||||||
|
key: c.key,
|
||||||
|
label: CITIZEN_CATEGORY_LABELS_FR[c.key] || c.label,
|
||||||
|
description: c.description
|
||||||
|
})),
|
||||||
|
experienceLevels: EXPERIENCE_LEVEL_LIST.map(e => ({
|
||||||
|
key: e.key,
|
||||||
|
label: EXPERIENCE_LEVEL_LABELS_FR[e.key] || e.label,
|
||||||
|
description: e.description
|
||||||
|
})),
|
||||||
|
roles: ROLE_LIST.map(r => ({
|
||||||
|
key: r.key,
|
||||||
|
label: ROLE_LABELS_FR[r.key] || r.label,
|
||||||
|
description: r.description
|
||||||
|
})),
|
||||||
|
genders: GENDER_LIST.map(g => ({
|
||||||
|
key: g.key,
|
||||||
|
label: GENDER_LABELS_FR[g.key] || g.label
|
||||||
|
}))
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
async _onRender(context, options) {
|
||||||
|
await super._onRender(context, options);
|
||||||
|
const html = this._getForm();
|
||||||
|
if (!html?.length) return;
|
||||||
|
|
||||||
|
html.addClass('mgt2-traveller-npc-form');
|
||||||
|
this._applyThemeStyles(html);
|
||||||
|
|
||||||
|
// Gestion des événements
|
||||||
|
html.find('[data-action="generate-traveller-npc"]').on('click', async (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
this._readForm(html);
|
||||||
|
await this._handleGenerate();
|
||||||
|
});
|
||||||
|
|
||||||
|
html.find('[data-action="randomize-name"]').on('click', (event) => {
|
||||||
|
event.preventDefault();
|
||||||
|
this._randomizeName(html);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Gestion du basculement entre nom aléatoire et nom personnalisé
|
||||||
|
html.find('[name="useRandomName"]').on('change', (event) => {
|
||||||
|
const useRandom = event.target.checked;
|
||||||
|
this._formData.useRandomName = useRandom;
|
||||||
|
html.find('.name-fields').toggleClass('hidden', useRandom);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Initialiser l'affichage des champs de nom
|
||||||
|
html.find('.name-fields').toggleClass('hidden', this._formData.useRandomName);
|
||||||
|
}
|
||||||
|
|
||||||
|
_getForm() {
|
||||||
|
return $(this.element).find('.window-content');
|
||||||
|
}
|
||||||
|
|
||||||
|
_applyThemeStyles(html) {
|
||||||
|
// Les styles sont maintenant gérés par CSS, cette méthode peut être vide
|
||||||
|
// ou utilisée pour des ajustements spécifiques si nécessaire
|
||||||
|
// Les styles de base sont cohérents avec mgt2-npc-dialog et mgt2-commerce-dialog
|
||||||
|
}
|
||||||
|
|
||||||
|
_readForm(html) {
|
||||||
|
this._formData.citizenCategory = html.find('[name="citizenCategory"]').val();
|
||||||
|
this._formData.experience = html.find('[name="experience"]').val();
|
||||||
|
this._formData.role = html.find('[name="role"]').val();
|
||||||
|
this._formData.gender = html.find('[name="gender"]').val();
|
||||||
|
this._formData.firstName = html.find('[name="firstName"]').val();
|
||||||
|
this._formData.surname = html.find('[name="surname"]').val();
|
||||||
|
this._formData.useRandomName = html.find('[name="useRandomName"]').is(':checked');
|
||||||
|
this._formData.createActor = html.find('[name="createActor"]').is(':checked');
|
||||||
|
this._formData.actorName = html.find('[name="actorName"]').val();
|
||||||
|
this._formData.openCreatedActor = html.find('[name="openCreatedActor"]').is(':checked');
|
||||||
|
}
|
||||||
|
|
||||||
|
_randomizeName(html) {
|
||||||
|
const name = generateRandomName(this._formData.gender);
|
||||||
|
html.find('[name="firstName"]').val(name.firstName);
|
||||||
|
html.find('[name="surname"]').val(name.surname);
|
||||||
|
this._formData.firstName = name.firstName;
|
||||||
|
this._formData.surname = name.surname;
|
||||||
|
this._formData.useRandomName = false;
|
||||||
|
html.find('[name="useRandomName"]').prop('checked', false);
|
||||||
|
html.find('.name-fields').removeClass('hidden');
|
||||||
|
}
|
||||||
|
|
||||||
|
async _handleGenerate() {
|
||||||
|
const button = $(this.element).find('[data-action="generate-traveller-npc"]');
|
||||||
|
const originalLabel = button.html();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Désactiver le bouton pendant la génération
|
||||||
|
button.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i> Génération...');
|
||||||
|
|
||||||
|
// Préparer les options de génération
|
||||||
|
const generateOptions = {
|
||||||
|
citizenCategory: this._formData.citizenCategory,
|
||||||
|
experience: this._formData.experience,
|
||||||
|
role: this._formData.role,
|
||||||
|
gender: this._formData.gender,
|
||||||
|
createActor: this._formData.createActor,
|
||||||
|
actorName: this._formData.actorName,
|
||||||
|
openCreatedActor: this._formData.openCreatedActor
|
||||||
|
};
|
||||||
|
|
||||||
|
// Si on n'utilise pas de nom aléatoire, passer le nom personnalisé
|
||||||
|
if (!this._formData.useRandomName && this._formData.firstName && this._formData.surname) {
|
||||||
|
generateOptions.firstName = this._formData.firstName;
|
||||||
|
generateOptions.surname = this._formData.surname;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Générer le PNJ
|
||||||
|
const result = await generateAndCreateTravellerNpc(generateOptions);
|
||||||
|
|
||||||
|
if (result.success) {
|
||||||
|
// Afficher le résultat dans le chat
|
||||||
|
await this._postToChatResult(result);
|
||||||
|
|
||||||
|
if (result.createdActor) {
|
||||||
|
ui.notifications.info(`Fiche PNJ Traveller créée : ${result.createdActor.name}`);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
ui.notifications.error('Erreur lors de la génération du PNJ Traveller');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`${MODULE_ID} | Erreur lors de la génération du PNJ Traveller:`, error);
|
||||||
|
ui.notifications.error(`Erreur: ${error.message}`);
|
||||||
|
} finally {
|
||||||
|
// Réactiver le bouton
|
||||||
|
button.prop('disabled', false).html(originalLabel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async _postToChatResult(data) {
|
||||||
|
registerHandlebarsHelpers();
|
||||||
|
const html = await foundry.applications.handlebars.renderTemplate(
|
||||||
|
`modules/${MODULE_ID}/templates/traveller-npc-result.hbs`,
|
||||||
|
data
|
||||||
|
);
|
||||||
|
|
||||||
|
await ChatMessage.create({
|
||||||
|
content: html,
|
||||||
|
speaker: ChatMessage.getSpeaker(),
|
||||||
|
flags: { [MODULE_ID]: { type: 'traveller-npc-result' } },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============================================================================
|
||||||
|
// Helper functions
|
||||||
|
// ============================================================================
|
||||||
|
|
||||||
|
// Import des données pour les helpers
|
||||||
|
import { CHARACTERISTIC_LIST, UPP_ORDER } from './data/travellerNpcGenerator.js';
|
||||||
|
|
||||||
|
let helpersRegistered = false;
|
||||||
|
|
||||||
|
function registerHandlebarsHelpers() {
|
||||||
|
if (helpersRegistered) return;
|
||||||
|
helpersRegistered = true;
|
||||||
|
|
||||||
|
// Helper pour comparer deux valeurs
|
||||||
|
Handlebars.registerHelper('eq', (a, b) => a === b);
|
||||||
|
|
||||||
|
// Helper pour rejoindre un tableau
|
||||||
|
Handlebars.registerHelper('join', (arr, sep) => (Array.isArray(arr) ? arr.join(sep) : ''));
|
||||||
|
|
||||||
|
// Helper pour vérifier si une valeur contient du texte
|
||||||
|
Handlebars.registerHelper('contains', (text, search) => String(text ?? '').includes(search));
|
||||||
|
|
||||||
|
// Helper pour vérifier si a > b
|
||||||
|
Handlebars.registerHelper('gt', (a, b) => a > b);
|
||||||
|
|
||||||
|
// Helper pour afficher le niveau de compétence avec un symbole
|
||||||
|
Handlebars.registerHelper('skillLevelSymbol', (level) => {
|
||||||
|
if (level === 0) return '';
|
||||||
|
if (level === 1) return '★';
|
||||||
|
if (level === 2) return '★★';
|
||||||
|
if (level === 3) return '★★★';
|
||||||
|
return `+${level}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Helper pour formater le DM
|
||||||
|
Handlebars.registerHelper('formatDm', (value) => {
|
||||||
|
const dm = Math.floor((value - 6) / 3);
|
||||||
|
return dm >= 0 ? `+${dm}` : `${dm}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Helper pour obtenir la classe CSS du niveau de compétence
|
||||||
|
Handlebars.registerHelper('skillLevelClass', (level) => {
|
||||||
|
if (level === 3) return 'skill-level-3';
|
||||||
|
if (level === 2) return 'skill-level-2';
|
||||||
|
if (level === 1) return 'skill-level-1';
|
||||||
|
return 'skill-level-0';
|
||||||
|
});
|
||||||
|
|
||||||
|
// Helper pour lookup dans un objet
|
||||||
|
Handlebars.registerHelper('lookup', (obj, key) => {
|
||||||
|
if (!obj || !key) return '';
|
||||||
|
return obj[key] !== undefined ? obj[key] : '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exporter pour pouvoir l'ouvrir depuis d'autres modules
|
||||||
|
export function openTravellerNpcDialog(options = {}) {
|
||||||
|
new TravellerNpcDialog(options).render({ force: true });
|
||||||
|
}
|
||||||
+99
-5
@@ -3,34 +3,128 @@
|
|||||||
*
|
*
|
||||||
* Chargé par FoundryVTT via "esmodules" dans module.json.
|
* Chargé par FoundryVTT via "esmodules" dans module.json.
|
||||||
* Enregistre la commande /commerce dans le chat.
|
* Enregistre la commande /commerce dans le chat.
|
||||||
|
* Compatible Foundry VTT v13 et v14
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { CommerceDialog } from './CommerceDialog.js';
|
import { CommerceDialog } from './CommerceDialog.js';
|
||||||
|
import './mgt2eMigration.js';
|
||||||
|
import './startupNotice.js';
|
||||||
|
|
||||||
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
|
||||||
|
const COMMERCE_COMMAND = 'commerce';
|
||||||
|
const ChatLogV2 = foundry.applications.sidebar.tabs.ChatLog;
|
||||||
|
|
||||||
|
function openCommerceDialog() {
|
||||||
|
new CommerceDialog().render({ force: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
function registerCommerceCommand() {
|
||||||
|
if (!ChatLogV2?.CHAT_COMMANDS) {
|
||||||
|
console.warn(`${MODULE_ID} | ChatLog.CHAT_COMMANDS indisponible, commande /${COMMERCE_COMMAND} non enregistrée`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatLogV2.CHAT_COMMANDS[COMMERCE_COMMAND] = {
|
||||||
|
rgx: /^\/commerce(?:\s+(.*))?$/i,
|
||||||
|
fn: () => {
|
||||||
|
openCommerceDialog();
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
console.log(`${MODULE_ID} | Commande /${COMMERCE_COMMAND} enregistrée via ChatLog.CHAT_COMMANDS`);
|
||||||
|
}
|
||||||
|
|
||||||
Hooks.once('init', () => {
|
Hooks.once('init', () => {
|
||||||
console.log(`${MODULE_ID} | Commerce module initialisé`);
|
console.log(`${MODULE_ID} | Commerce module initialisé`);
|
||||||
|
|
||||||
// Pré-charge les templates Handlebars
|
// Pré-charge les templates Handlebars
|
||||||
loadTemplates([
|
// Compatibilité v13 et v14
|
||||||
|
const loadTemplatesFn = foundry.applications?.handlebars?.loadTemplates || loadTemplates;
|
||||||
|
if (loadTemplatesFn) {
|
||||||
|
loadTemplatesFn([
|
||||||
`modules/${MODULE_ID}/templates/commerce-dialog.hbs`,
|
`modules/${MODULE_ID}/templates/commerce-dialog.hbs`,
|
||||||
`modules/${MODULE_ID}/templates/commerce-result.hbs`,
|
`modules/${MODULE_ID}/templates/commerce-result.hbs`,
|
||||||
]);
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCommerceCommand();
|
||||||
});
|
});
|
||||||
|
|
||||||
Hooks.once('ready', () => {
|
Hooks.once('ready', () => {
|
||||||
console.log(`${MODULE_ID} | Commerce module prêt – tapez /commerce dans le chat`);
|
console.log(`${MODULE_ID} | Commerce module prêt – tapez /commerce dans le chat`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Solution pour Foundry v14 : Intercepte les commandes AVANT la validation
|
||||||
|
* Utilise renderChatInput pour modifier le comportement de l'input
|
||||||
|
* Compatible v13 (jQuery) et v14 (DOM element)
|
||||||
|
*/
|
||||||
|
Hooks.on('renderChatInput', (app, html, data) => {
|
||||||
|
// Foundry v14 passe un objet avec element, v13 passe jQuery
|
||||||
|
let input;
|
||||||
|
|
||||||
|
// Vérifie si html est un objet avec element (v14)
|
||||||
|
if (html?.element) {
|
||||||
|
input = $(html.element).find('textarea[name="content"]');
|
||||||
|
} else if (html?.find) {
|
||||||
|
// v13 ou déjà jQuery
|
||||||
|
input = html.find('textarea[name="content"]');
|
||||||
|
} else {
|
||||||
|
// Dernier recours : suppose que html est l'élément
|
||||||
|
input = $(html).find('textarea[name="content"]');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Évite les doublons d'écouteurs
|
||||||
|
if (input.data('mgt2-commerce-listener')) return;
|
||||||
|
input.data('mgt2-commerce-listener', true);
|
||||||
|
|
||||||
|
input.on('keydown', (event) => {
|
||||||
|
// Intercepte Entrée (13) et vérifie si c'est une de nos commandes
|
||||||
|
if (event.key === 'Enter' && !event.shiftKey) {
|
||||||
|
const content = input.val()?.trim();
|
||||||
|
if (content?.startsWith('/commerce')) {
|
||||||
|
event.preventDefault();
|
||||||
|
event.stopImmediatePropagation();
|
||||||
|
openCommerceDialog();
|
||||||
|
input.val('');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Intercepte les messages de chat commençant par /commerce.
|
* Intercepte les messages de chat commençant par /commerce.
|
||||||
|
* Utilise preCreateChatMessage pour Foundry v14+ (avant que le message ne soit validé)
|
||||||
|
* Compatible avec Foundry v13 et v14
|
||||||
* Retourne false pour empêcher l'envoi du message brut.
|
* Retourne false pour empêcher l'envoi du message brut.
|
||||||
*/
|
*/
|
||||||
Hooks.on('chatMessage', (_chatLog, message, _chatData) => {
|
Hooks.on('preCreateChatMessage', (message, data, options) => {
|
||||||
const trimmed = message.trim().toLowerCase();
|
const content = message.content?.trim()?.toLowerCase();
|
||||||
if (trimmed === '/commerce' || trimmed.startsWith('/commerce ')) {
|
if (content === '/commerce' || content?.startsWith('/commerce ')) {
|
||||||
new CommerceDialog().render(true);
|
openCommerceDialog();
|
||||||
|
return false; // Empêche la création du message
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Gardé pour compatibilité v13
|
||||||
|
Hooks.on('chatMessage', (...args) => {
|
||||||
|
// Foundry v14 passe un objet ChatMessage en premier paramètre
|
||||||
|
// Foundry v13 passe (chatLog, message, chatData)
|
||||||
|
let message;
|
||||||
|
|
||||||
|
if (args[0]?.content !== undefined) {
|
||||||
|
// v14: premier argument est ChatMessage
|
||||||
|
message = args[0].content;
|
||||||
|
} else if (typeof args[1] === 'string') {
|
||||||
|
// v13: deuxième argument est la string message
|
||||||
|
message = args[1];
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const trimmed = message?.trim()?.toLowerCase();
|
||||||
|
if (trimmed === '/commerce' || trimmed?.startsWith('/commerce ')) {
|
||||||
|
openCommerceDialog();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user