AJout gestion map

This commit is contained in:
2026-06-01 22:51:48 +02:00
parent 9abc2a8b19
commit 49423f40f5
82 changed files with 1206 additions and 316 deletions
+73
View File
@@ -0,0 +1,73 @@
# AGENTS.md — mgt2-compendium-amiral-denisov
## First read
- `.github/copilot-instructions.md` — packs, icons, module.json conventions (this file builds on it, don't repeat it)
## No package manager / no build
There is **no** `package.json`, no lockfile, no bundler. JavaScript is plain ESM loaded directly by FoundryVTT. Do not run `npm install` or any build command.
## Commands
5 chat commands registered at runtime (not declared in `module.json`):
| Command | Entrypoint | Dialog |
|---|---|---|
| `/commerce` | `scripts/commerce.js` | `CommerceDialog` (3 tabs) |
| `/pnj` | `scripts/npc.js` | `NpcDialog` (4 tabs) |
| `/rencontre` | `scripts/npc.js` | same dialog (tab 2) |
| `/mission` | `scripts/npc.js` | same dialog (tab 3) |
| `/sector` | `scripts/sector.js` | `SectorMapApp` (IFRAME Traveller Map, clics→chat) |
| `/subsector` | `scripts/sector.js` | `SectorMapApp` (IFRAME) |
Commands are registered via `ChatLogV2.CHAT_COMMANDS` — not Hooks.on("chatMessage") as the copilot-instructions say (that file is stale). See `commerce.js:15` and `npc.js:15` for the actual pattern.
## Framework quirks
- **ApplicationV2** + `HandlebarsApplicationMixin` for all dialogs.
- Foundry v13/v14 dual code paths: some hooks must handle both jQuery (v13) and DOM (v14) APIs.
- Dice rolls: `await new Roll(formula).evaluate()` — always async.
- Skill FQN format for `game.i18n`: e.g. `pilot.spacecraft`, `electronics.computers`, `gunner.turret`.
## Runtime systems (run at `ready` hook, GM only)
1. **Migration** (`mgt2eMigration.js`): converts legacy item types to mgt2e (armor→armour, equipment→item/augment, computer→hardware, etc.). Tracked via `game.settings` version flag. Forced re-run requires deleting the setting.
2. **NPC RollTable sync** (`npcRollTableSync.js`): writes D66 tables from `scripts/data/npcTables.js` into the `tables-pnj` compendium pack. Checksums to avoid redundant writes.
## Testing
```sh
# standalone, no npm needed — install jest globally or use npx
npx jest scripts/tests/travellerNpcGenerator.test.js
```
- Single file, 1096 lines, hand-rolled FoundryVTT mocks.
- Covers: utilities, lookups, validation, characteristic/skill generation, skill conversion, full NPC gen, ModuleCache, errors, config validation.
- No CI test step — you must run manually.
- No Jest config file — relies on defaults.
## Versioning
- `module.json``"version"` is the single source of truth.
- Git tag format: `v1.3.0` (CI strips `v`).
- No changelog file.
## CI/CD (Gitea)
- Only triggers on **`release: [published]`** — not on push/PR.
- Builds a zip archive of `module.json + assets/ + packs/ + scripts/ + styles/ + templates/` and uploads to the release.
- No test step in CI.
## Deprecated packs (still on disk, NOT in module.json)
- `packs/arme/` → superseded by `armes`
- `packs/carriere/` → superseded by `carrieres`
- `packs/talent-psy/` → superseded by `talents-psioniques`
Do not re-add them to `module.json`. They remain for historical data recovery only.
## All content is in French
Labels, comments, commit messages, UI strings, icon file names, rule references — everything. Check French naming before searching/grepping.
+1
View File
@@ -11,6 +11,7 @@
"esmodules": [
"scripts/commerce.js",
"scripts/npc.js",
"scripts/sector.js",
"scripts/utils/travellerNpcUtils.js",
"scripts/data/travellerNpcGenerator.js",
"scripts/travellerNpcGenerator.js",
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000084
MANIFEST-000100
+3 -8
View File
@@ -1,8 +1,3 @@
2026/05/27-23:11:58.414164 7f3e6f7fe6c0 Recovering log #82
2026/05/27-23:11:58.424222 7f3e6f7fe6c0 Delete type=3 #80
2026/05/27-23:11:58.424274 7f3e6f7fe6c0 Delete type=0 #82
2026/05/28-01:07:03.306861 7f3e6effd6c0 Level-0 table #87: started
2026/05/28-01:07:03.306872 7f3e6effd6c0 Level-0 table #87: 0 bytes OK
2026/05/28-01:07:03.314015 7f3e6effd6c0 Delete type=0 #85
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/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)
2026/06/01-22:42:05.863670 7f52c63fe6c0 Recovering log #98
2026/06/01-22:42:05.873307 7f52c63fe6c0 Delete type=3 #96
2026/06/01-22:42:05.873357 7f52c63fe6c0 Delete type=0 #98
+8 -8
View File
@@ -1,8 +1,8 @@
2026/05/27-14:31:25.639035 7f3e6f7fe6c0 Recovering log #77
2026/05/27-14:31:25.648169 7f3e6f7fe6c0 Delete type=3 #75
2026/05/27-14:31:25.648196 7f3e6f7fe6c0 Delete type=0 #77
2026/05/27-14:33:21.786747 7f3e6effd6c0 Level-0 table #83: started
2026/05/27-14:33:21.786766 7f3e6effd6c0 Level-0 table #83: 0 bytes OK
2026/05/27-14:33:21.793932 7f3e6effd6c0 Delete type=0 #81
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/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/06/01-08:35:53.535828 7f52c6bff6c0 Recovering log #94
2026/06/01-08:35:53.546637 7f52c6bff6c0 Delete type=3 #92
2026/06/01-08:35:53.546677 7f52c6bff6c0 Delete type=0 #94
2026/06/01-08:51:10.470757 7f52c4bfb6c0 Level-0 table #99: started
2026/06/01-08:51:10.470772 7f52c4bfb6c0 Level-0 table #99: 0 bytes OK
2026/06/01-08:51:10.476934 7f52c4bfb6c0 Delete type=0 #97
2026/06/01-08:51:10.484526 7f52c4bfb6c0 Manual compaction at level-0 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
2026/06/01-08:51:10.491484 7f52c4bfb6c0 Manual compaction at level-1 from '!folders!673DRfEBYUliGnKJ' @ 72057594037927935 : 1 .. '!items!yoIqL0RQEnzNVJB6' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000183
MANIFEST-000199
+3 -8
View File
@@ -1,8 +1,3 @@
2026/05/27-23:11:58.290859 7f3e6f7fe6c0 Recovering log #181
2026/05/27-23:11:58.307573 7f3e6f7fe6c0 Delete type=3 #179
2026/05/27-23:11:58.307626 7f3e6f7fe6c0 Delete type=0 #181
2026/05/28-01:07:03.251844 7f3e6effd6c0 Level-0 table #186: started
2026/05/28-01:07:03.251857 7f3e6effd6c0 Level-0 table #186: 0 bytes OK
2026/05/28-01:07:03.257706 7f3e6effd6c0 Delete type=0 #184
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/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)
2026/06/01-22:42:05.758175 7f52c53fc6c0 Recovering log #197
2026/06/01-22:42:05.768018 7f52c53fc6c0 Delete type=3 #195
2026/06/01-22:42:05.768044 7f52c53fc6c0 Delete type=0 #197
+8 -8
View File
@@ -1,8 +1,8 @@
2026/05/27-14:31:25.531736 7f3ebd7ff6c0 Recovering log #176
2026/05/27-14:31:25.541455 7f3ebd7ff6c0 Delete type=3 #174
2026/05/27-14:31:25.541507 7f3ebd7ff6c0 Delete type=0 #176
2026/05/27-14:33:21.722465 7f3e6effd6c0 Level-0 table #182: started
2026/05/27-14:33:21.722495 7f3e6effd6c0 Level-0 table #182: 0 bytes OK
2026/05/27-14:33:21.728923 7f3e6effd6c0 Delete type=0 #180
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/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/06/01-08:35:53.408086 7f52c63fe6c0 Recovering log #193
2026/06/01-08:35:53.419231 7f52c63fe6c0 Delete type=3 #191
2026/06/01-08:35:53.419290 7f52c63fe6c0 Delete type=0 #193
2026/06/01-08:51:10.410303 7f52c4bfb6c0 Level-0 table #198: started
2026/06/01-08:51:10.410335 7f52c4bfb6c0 Level-0 table #198: 0 bytes OK
2026/06/01-08:51:10.417249 7f52c4bfb6c0 Delete type=0 #196
2026/06/01-08:51:10.423845 7f52c4bfb6c0 Manual compaction at level-0 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
2026/06/01-08:51:10.424110 7f52c4bfb6c0 Manual compaction at level-1 from '!items!8xqChkoKK7i0c9M1' @ 72057594037927935 : 1 .. '!items!wpBopoosZiWXjlKD' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000067
MANIFEST-000083
+3 -8
View File
@@ -1,8 +1,3 @@
2026/05/27-23:11:58.442577 7f3e6f7fe6c0 Recovering log #65
2026/05/27-23:11:58.452097 7f3e6f7fe6c0 Delete type=3 #63
2026/05/27-23:11:58.452144 7f3e6f7fe6c0 Delete type=0 #65
2026/05/28-01:07:03.320241 7f3e6effd6c0 Level-0 table #70: started
2026/05/28-01:07:03.320254 7f3e6effd6c0 Level-0 table #70: 0 bytes OK
2026/05/28-01:07:03.326319 7f3e6effd6c0 Delete type=0 #68
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/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)
2026/06/01-22:42:05.887236 7f52c63fe6c0 Recovering log #81
2026/06/01-22:42:05.897193 7f52c63fe6c0 Delete type=3 #79
2026/06/01-22:42:05.897236 7f52c63fe6c0 Delete type=0 #81
+8 -8
View File
@@ -1,8 +1,8 @@
2026/05/27-14:31:25.663213 7f3e6f7fe6c0 Recovering log #60
2026/05/27-14:31:25.672282 7f3e6f7fe6c0 Delete type=3 #58
2026/05/27-14:31:25.672315 7f3e6f7fe6c0 Delete type=0 #60
2026/05/27-14:33:21.794049 7f3e6effd6c0 Level-0 table #66: started
2026/05/27-14:33:21.794078 7f3e6effd6c0 Level-0 table #66: 0 bytes OK
2026/05/27-14:33:21.800426 7f3e6effd6c0 Delete type=0 #64
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/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/06/01-08:35:53.563616 7f52c6bff6c0 Recovering log #77
2026/06/01-08:35:53.575271 7f52c6bff6c0 Delete type=3 #75
2026/06/01-08:35:53.575318 7f52c6bff6c0 Delete type=0 #77
2026/06/01-08:51:10.477043 7f52c4bfb6c0 Level-0 table #82: started
2026/06/01-08:51:10.477061 7f52c4bfb6c0 Level-0 table #82: 0 bytes OK
2026/06/01-08:51:10.484427 7f52c4bfb6c0 Delete type=0 #80
2026/06/01-08:51:10.491475 7f52c4bfb6c0 Manual compaction at level-0 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
2026/06/01-08:51:10.498513 7f52c4bfb6c0 Manual compaction at level-1 from '!items!57vgsVVCy9MRKM2M' @ 72057594037927935 : 1 .. '!items!vJInnoigCTJzuY2S' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000186
MANIFEST-000202
+3 -8
View File
@@ -1,8 +1,3 @@
2026/05/27-23:11:58.309946 7f3ebcffe6c0 Recovering log #184
2026/05/27-23:11:58.320486 7f3ebcffe6c0 Delete type=3 #182
2026/05/27-23:11:58.320525 7f3ebcffe6c0 Delete type=0 #184
2026/05/28-01:07:03.257742 7f3e6effd6c0 Level-0 table #189: started
2026/05/28-01:07:03.257754 7f3e6effd6c0 Level-0 table #189: 0 bytes OK
2026/05/28-01:07:03.263574 7f3e6effd6c0 Delete type=0 #187
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/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)
2026/06/01-22:42:05.770418 7f52c6bff6c0 Recovering log #200
2026/06/01-22:42:05.779812 7f52c6bff6c0 Delete type=3 #198
2026/06/01-22:42:05.779865 7f52c6bff6c0 Delete type=0 #200
+8 -8
View File
@@ -1,8 +1,8 @@
2026/05/27-14:31:25.544106 7f3ebd7ff6c0 Recovering log #179
2026/05/27-14:31:25.554048 7f3ebd7ff6c0 Delete type=3 #177
2026/05/27-14:31:25.554071 7f3ebd7ff6c0 Delete type=0 #179
2026/05/27-14:33:21.729016 7f3e6effd6c0 Level-0 table #185: started
2026/05/27-14:33:21.729040 7f3e6effd6c0 Level-0 table #185: 0 bytes OK
2026/05/27-14:33:21.735577 7f3e6effd6c0 Delete type=0 #183
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/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/06/01-08:35:53.422306 7f52c53fc6c0 Recovering log #196
2026/06/01-08:35:53.433915 7f52c53fc6c0 Delete type=3 #194
2026/06/01-08:35:53.433952 7f52c53fc6c0 Delete type=0 #196
2026/06/01-08:51:10.450191 7f52c4bfb6c0 Level-0 table #201: started
2026/06/01-08:51:10.450225 7f52c4bfb6c0 Level-0 table #201: 0 bytes OK
2026/06/01-08:51:10.456638 7f52c4bfb6c0 Delete type=0 #199
2026/06/01-08:51:10.463422 7f52c4bfb6c0 Manual compaction at level-0 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
2026/06/01-08:51:10.470752 7f52c4bfb6c0 Manual compaction at level-1 from '!items!04MdBSzwkYWUMJBC' @ 72057594037927935 : 1 .. '!items!yqjKyTCgpclCuHyK' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000120
MANIFEST-000136
+3 -7
View File
@@ -1,7 +1,3 @@
2026/05/27-23:11:58.375862 7f3e6ffff6c0 Recovering log #118
2026/05/27-23:11:58.385912 7f3e6ffff6c0 Delete type=3 #116
2026/05/27-23:11:58.385947 7f3e6ffff6c0 Delete type=0 #118
2026/05/28-01:07:03.287852 7f3e6effd6c0 Level-0 table #123: started
2026/05/28-01:07:03.287863 7f3e6effd6c0 Level-0 table #123: 0 bytes OK
2026/05/28-01:07:03.294442 7f3e6effd6c0 Delete type=0 #121
2026/05/28-01:07:03.300889 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2026/06/01-22:42:05.829157 7f52c53fc6c0 Recovering log #134
2026/06/01-22:42:05.838624 7f52c53fc6c0 Delete type=3 #132
2026/06/01-22:42:05.838670 7f52c53fc6c0 Delete type=0 #134
+7 -7
View File
@@ -1,7 +1,7 @@
2026/05/27-14:31:25.604521 7f3ebd7ff6c0 Recovering log #114
2026/05/27-14:31:25.613630 7f3ebd7ff6c0 Delete type=3 #112
2026/05/27-14:31:25.613651 7f3ebd7ff6c0 Delete type=0 #114
2026/05/27-14:33:21.767043 7f3e6effd6c0 Level-0 table #119: started
2026/05/27-14:33:21.767067 7f3e6effd6c0 Level-0 table #119: 0 bytes OK
2026/05/27-14:33:21.773608 7f3e6effd6c0 Delete type=0 #117
2026/05/27-14:33:21.780095 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2026/06/01-08:35:53.494562 7f52c6bff6c0 Recovering log #130
2026/06/01-08:35:53.505274 7f52c6bff6c0 Delete type=3 #128
2026/06/01-08:35:53.505312 7f52c6bff6c0 Delete type=0 #130
2026/06/01-08:51:10.430797 7f52c4bfb6c0 Level-0 table #135: started
2026/06/01-08:51:10.430815 7f52c4bfb6c0 Level-0 table #135: 0 bytes OK
2026/06/01-08:51:10.436925 7f52c4bfb6c0 Delete type=0 #133
2026/06/01-08:51:10.449909 7f52c4bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000128
MANIFEST-000144
+3 -8
View File
@@ -1,8 +1,3 @@
2026/05/27-23:11:58.349736 7f3e6ffff6c0 Recovering log #126
2026/05/27-23:11:58.359183 7f3e6ffff6c0 Delete type=3 #124
2026/05/27-23:11:58.359211 7f3e6ffff6c0 Delete type=0 #126
2026/05/28-01:07:03.276071 7f3e6effd6c0 Level-0 table #131: started
2026/05/28-01:07:03.276086 7f3e6effd6c0 Level-0 table #131: 0 bytes OK
2026/05/28-01:07:03.281962 7f3e6effd6c0 Delete type=0 #129
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/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)
2026/06/01-22:42:05.805356 7f52c5bfd6c0 Recovering log #142
2026/06/01-22:42:05.815150 7f52c5bfd6c0 Delete type=3 #140
2026/06/01-22:42:05.815203 7f52c5bfd6c0 Delete type=0 #142
+8 -8
View File
@@ -1,8 +1,8 @@
2026/05/27-14:31:25.580201 7f3ebd7ff6c0 Recovering log #121
2026/05/27-14:31:25.589450 7f3ebd7ff6c0 Delete type=3 #119
2026/05/27-14:31:25.589494 7f3ebd7ff6c0 Delete type=0 #121
2026/05/27-14:33:21.747566 7f3e6effd6c0 Level-0 table #127: started
2026/05/27-14:33:21.747585 7f3e6effd6c0 Level-0 table #127: 0 bytes OK
2026/05/27-14:33:21.754474 7f3e6effd6c0 Delete type=0 #125
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/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/06/01-08:35:53.466145 7f52c6bff6c0 Recovering log #138
2026/06/01-08:35:53.477972 7f52c6bff6c0 Delete type=3 #136
2026/06/01-08:35:53.478013 7f52c6bff6c0 Delete type=0 #138
2026/06/01-08:51:10.424141 7f52c4bfb6c0 Level-0 table #143: started
2026/06/01-08:51:10.424176 7f52c4bfb6c0 Level-0 table #143: 0 bytes OK
2026/06/01-08:51:10.430711 7f52c4bfb6c0 Delete type=0 #141
2026/06/01-08:51:10.449900 7f52c4bfb6c0 Manual compaction at level-0 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
2026/06/01-08:51:10.456752 7f52c4bfb6c0 Manual compaction at level-1 from '!folders!8swFcTr6RH7BnGiu' @ 72057594037927935 : 1 .. '!items!zRJfxioYBRq4iSBR' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000120
MANIFEST-000136
+3 -7
View File
@@ -1,7 +1,3 @@
2026/05/27-23:11:58.388239 7f3e6f7fe6c0 Recovering log #118
2026/05/27-23:11:58.398684 7f3e6f7fe6c0 Delete type=3 #116
2026/05/27-23:11:58.398724 7f3e6f7fe6c0 Delete type=0 #118
2026/05/28-01:07:03.294489 7f3e6effd6c0 Level-0 table #123: started
2026/05/28-01:07:03.294501 7f3e6effd6c0 Level-0 table #123: 0 bytes OK
2026/05/28-01:07:03.300827 7f3e6effd6c0 Delete type=0 #121
2026/05/28-01:07:03.314060 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2026/06/01-22:42:05.840284 7f52c6bff6c0 Recovering log #134
2026/06/01-22:42:05.850204 7f52c6bff6c0 Delete type=3 #132
2026/06/01-22:42:05.850246 7f52c6bff6c0 Delete type=0 #134
+7 -7
View File
@@ -1,7 +1,7 @@
2026/05/27-14:31:25.615623 7f3ebd7ff6c0 Recovering log #114
2026/05/27-14:31:25.625348 7f3ebd7ff6c0 Delete type=3 #112
2026/05/27-14:31:25.625369 7f3ebd7ff6c0 Delete type=0 #114
2026/05/27-14:33:21.761003 7f3e6effd6c0 Level-0 table #119: started
2026/05/27-14:33:21.761022 7f3e6effd6c0 Level-0 table #119: 0 bytes OK
2026/05/27-14:33:21.766953 7f3e6effd6c0 Delete type=0 #117
2026/05/27-14:33:21.780083 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2026/06/01-08:35:53.508573 7f52c53fc6c0 Recovering log #130
2026/06/01-08:35:53.519646 7f52c53fc6c0 Delete type=3 #128
2026/06/01-08:35:53.519709 7f52c53fc6c0 Delete type=0 #130
2026/06/01-08:51:10.437011 7f52c4bfb6c0 Level-0 table #135: started
2026/06/01-08:51:10.437031 7f52c4bfb6c0 Level-0 table #135: 0 bytes OK
2026/06/01-08:51:10.443132 7f52c4bfb6c0 Delete type=0 #133
2026/06/01-08:51:10.449915 7f52c4bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000101
MANIFEST-000117
+3 -8
View File
@@ -1,8 +1,3 @@
2026/05/27-23:11:58.400455 7f3ebd7ff6c0 Recovering log #99
2026/05/27-23:11:58.410587 7f3ebd7ff6c0 Delete type=3 #97
2026/05/27-23:11:58.410645 7f3ebd7ff6c0 Delete type=0 #99
2026/05/28-01:07:03.300932 7f3e6effd6c0 Level-0 table #104: started
2026/05/28-01:07:03.300945 7f3e6effd6c0 Level-0 table #104: 0 bytes OK
2026/05/28-01:07:03.306823 7f3e6effd6c0 Delete type=0 #102
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/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)
2026/06/01-22:42:05.852043 7f52c5bfd6c0 Recovering log #115
2026/06/01-22:42:05.861694 7f52c5bfd6c0 Delete type=3 #113
2026/06/01-22:42:05.861740 7f52c5bfd6c0 Delete type=0 #115
+8 -8
View File
@@ -1,8 +1,8 @@
2026/05/27-14:31:25.627132 7f3ebd7ff6c0 Recovering log #95
2026/05/27-14:31:25.636967 7f3ebd7ff6c0 Delete type=3 #93
2026/05/27-14:31:25.637002 7f3ebd7ff6c0 Delete type=0 #95
2026/05/27-14:33:21.773684 7f3e6effd6c0 Level-0 table #100: started
2026/05/27-14:33:21.773700 7f3e6effd6c0 Level-0 table #100: 0 bytes OK
2026/05/27-14:33:21.779958 7f3e6effd6c0 Delete type=0 #98
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/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/06/01-08:35:53.522844 7f52c5bfd6c0 Recovering log #111
2026/06/01-08:35:53.532856 7f52c5bfd6c0 Delete type=3 #109
2026/06/01-08:35:53.532912 7f52c5bfd6c0 Delete type=0 #111
2026/06/01-08:51:10.463428 7f52c4bfb6c0 Level-0 table #116: started
2026/06/01-08:51:10.463447 7f52c4bfb6c0 Level-0 table #116: 0 bytes OK
2026/06/01-08:51:10.470660 7f52c4bfb6c0 Delete type=0 #114
2026/06/01-08:51:10.477037 7f52c4bfb6c0 Manual compaction at level-0 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
2026/06/01-08:51:10.484516 7f52c4bfb6c0 Manual compaction at level-1 from '!journal!26ZqV9BvS47hrLmV' @ 72057594037927935 : 1 .. '!journal.pages!26ZqV9BvS47hrLmV.ZS4936SEQUT9IA8i' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000128
MANIFEST-000144
+3 -8
View File
@@ -1,8 +1,3 @@
2026/05/27-23:11:58.323722 7f3e6f7fe6c0 Recovering log #126
2026/05/27-23:11:58.334612 7f3e6f7fe6c0 Delete type=3 #124
2026/05/27-23:11:58.334668 7f3e6f7fe6c0 Delete type=0 #126
2026/05/28-01:07:03.263720 7f3e6effd6c0 Level-0 table #131: started
2026/05/28-01:07:03.263735 7f3e6effd6c0 Level-0 table #131: 0 bytes OK
2026/05/28-01:07:03.269766 7f3e6effd6c0 Delete type=0 #129
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/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)
2026/06/01-22:42:05.782042 7f52c5bfd6c0 Recovering log #142
2026/06/01-22:42:05.791804 7f52c5bfd6c0 Delete type=3 #140
2026/06/01-22:42:05.791860 7f52c5bfd6c0 Delete type=0 #142
+8 -8
View File
@@ -1,8 +1,8 @@
2026/05/27-14:31:25.557570 7f3ebd7ff6c0 Recovering log #121
2026/05/27-14:31:25.567130 7f3ebd7ff6c0 Delete type=3 #119
2026/05/27-14:31:25.567150 7f3ebd7ff6c0 Delete type=0 #121
2026/05/27-14:33:21.735841 7f3e6effd6c0 Level-0 table #127: started
2026/05/27-14:33:21.735866 7f3e6effd6c0 Level-0 table #127: 0 bytes OK
2026/05/27-14:33:21.741712 7f3e6effd6c0 Delete type=0 #125
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/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/06/01-08:35:53.437746 7f52c6bff6c0 Recovering log #138
2026/06/01-08:35:53.448341 7f52c6bff6c0 Delete type=3 #136
2026/06/01-08:35:53.448380 7f52c6bff6c0 Delete type=0 #138
2026/06/01-08:51:10.443210 7f52c4bfb6c0 Level-0 table #143: started
2026/06/01-08:51:10.443229 7f52c4bfb6c0 Level-0 table #143: 0 bytes OK
2026/06/01-08:51:10.449810 7f52c4bfb6c0 Delete type=0 #141
2026/06/01-08:51:10.450168 7f52c4bfb6c0 Manual compaction at level-0 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
2026/06/01-08:51:10.463413 7f52c4bfb6c0 Manual compaction at level-1 from '!items!QHovFMj93BC7bqBu' @ 72057594037927935 : 1 .. '!items!yleVHgRqGoYLvzxT' @ 0 : 0; will stop at (end)
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000120
MANIFEST-000136
+3 -7
View File
@@ -1,7 +1,3 @@
2026/05/27-23:11:58.337311 7f3ebcffe6c0 Recovering log #118
2026/05/27-23:11:58.347349 7f3ebcffe6c0 Delete type=3 #116
2026/05/27-23:11:58.347392 7f3ebcffe6c0 Delete type=0 #118
2026/05/28-01:07:03.269795 7f3e6effd6c0 Level-0 table #123: started
2026/05/28-01:07:03.269808 7f3e6effd6c0 Level-0 table #123: 0 bytes OK
2026/05/28-01:07:03.275958 7f3e6effd6c0 Delete type=0 #121
2026/05/28-01:07:03.276003 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2026/06/01-22:42:05.793837 7f52c53fc6c0 Recovering log #134
2026/06/01-22:42:05.803487 7f52c53fc6c0 Delete type=3 #132
2026/06/01-22:42:05.803533 7f52c53fc6c0 Delete type=0 #134
+7 -7
View File
@@ -1,7 +1,7 @@
2026/05/27-14:31:25.569405 7f3ebd7ff6c0 Recovering log #114
2026/05/27-14:31:25.578632 7f3ebd7ff6c0 Delete type=3 #112
2026/05/27-14:31:25.578657 7f3ebd7ff6c0 Delete type=0 #114
2026/05/27-14:33:21.741780 7f3e6effd6c0 Level-0 table #119: started
2026/05/27-14:33:21.741799 7f3e6effd6c0 Level-0 table #119: 0 bytes OK
2026/05/27-14:33:21.747507 7f3e6effd6c0 Delete type=0 #117
2026/05/27-14:33:21.760892 7f3e6effd6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
2026/06/01-08:35:53.451848 7f52c63fe6c0 Recovering log #130
2026/06/01-08:35:53.463255 7f52c63fe6c0 Delete type=3 #128
2026/06/01-08:35:53.463313 7f52c63fe6c0 Delete type=0 #130
2026/06/01-08:51:10.417333 7f52c4bfb6c0 Level-0 table #135: started
2026/06/01-08:51:10.417354 7f52c4bfb6c0 Level-0 table #135: 0 bytes OK
2026/06/01-08:51:10.423737 7f52c4bfb6c0 Delete type=0 #133
2026/06/01-08:51:10.424133 7f52c4bfb6c0 Manual compaction at level-0 from 'undefined' @ 72057594037927935 : 1 .. 'undefined' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000128
MANIFEST-000144
+3 -8
View File
@@ -1,8 +1,3 @@
2026/05/27-23:11:58.362926 7f3ebd7ff6c0 Recovering log #126
2026/05/27-23:11:58.372894 7f3ebd7ff6c0 Delete type=3 #124
2026/05/27-23:11:58.372934 7f3ebd7ff6c0 Delete type=0 #126
2026/05/28-01:07:03.281993 7f3e6effd6c0 Level-0 table #131: started
2026/05/28-01:07:03.282003 7f3e6effd6c0 Level-0 table #131: 0 bytes OK
2026/05/28-01:07:03.287823 7f3e6effd6c0 Delete type=0 #129
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/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)
2026/06/01-22:42:05.817864 7f52c6bff6c0 Recovering log #142
2026/06/01-22:42:05.827428 7f52c6bff6c0 Delete type=3 #140
2026/06/01-22:42:05.827476 7f52c6bff6c0 Delete type=0 #142
+8 -8
View File
@@ -1,8 +1,8 @@
2026/05/27-14:31:25.591969 7f3ebd7ff6c0 Recovering log #121
2026/05/27-14:31:25.601963 7f3ebd7ff6c0 Delete type=3 #119
2026/05/27-14:31:25.601983 7f3ebd7ff6c0 Delete type=0 #121
2026/05/27-14:33:21.754559 7f3e6effd6c0 Level-0 table #127: started
2026/05/27-14:33:21.754583 7f3e6effd6c0 Level-0 table #127: 0 bytes OK
2026/05/27-14:33:21.760810 7f3e6effd6c0 Delete type=0 #125
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/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/06/01-08:35:53.480904 7f52c63fe6c0 Recovering log #138
2026/06/01-08:35:53.491518 7f52c63fe6c0 Delete type=3 #136
2026/06/01-08:35:53.491573 7f52c63fe6c0 Delete type=0 #138
2026/06/01-08:51:10.456761 7f52c4bfb6c0 Level-0 table #143: started
2026/06/01-08:51:10.456779 7f52c4bfb6c0 Level-0 table #143: 0 bytes OK
2026/06/01-08:51:10.463323 7f52c4bfb6c0 Delete type=0 #141
2026/06/01-08:51:10.470745 7f52c4bfb6c0 Manual compaction at level-0 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
2026/06/01-08:51:10.477028 7f52c4bfb6c0 Manual compaction at level-1 from '!folders!qrqRBmTP6UuS30DF' @ 72057594037927935 : 1 .. '!items!yFvuDyV00NdojxGt' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000048
MANIFEST-000171
+34 -92
View File
@@ -1,92 +1,34 @@
2026/05/27-23:11:58.454344 7f3ebcffe6c0 Recovering log #44
2026/05/27-23:11:58.463285 7f3ebcffe6c0 Delete type=3 #40
2026/05/27-23:11:58.463300 7f3ebcffe6c0 Delete type=0 #44
2026/05/27-23:37:44.587645 7f3e6effd6c0 Level-0 table #51: started
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)
2026/06/01-22:42:05.898881 7f52c6bff6c0 Recovering log #164
2026/06/01-22:42:05.908070 7f52c6bff6c0 Delete type=3 #158
2026/06/01-22:42:05.908116 7f52c6bff6c0 Delete type=0 #164
2026/06/01-22:42:20.631787 7f52c4bfb6c0 Level-0 table #174: started
2026/06/01-22:42:20.664092 7f52c4bfb6c0 Level-0 table #174: 3534281 bytes OK
2026/06/01-22:42:20.670615 7f52c4bfb6c0 Delete type=0 #172
2026/06/01-22:44:14.476907 7f52c4bfb6c0 Level-0 table #176: started
2026/06/01-22:44:14.517289 7f52c4bfb6c0 Level-0 table #176: 3590317 bytes OK
2026/06/01-22:44:14.524467 7f52c4bfb6c0 Delete type=0 #173
2026/06/01-22:46:05.183822 7f52c4bfb6c0 Level-0 table #178: started
2026/06/01-22:46:05.221801 7f52c4bfb6c0 Level-0 table #178: 3635543 bytes OK
2026/06/01-22:46:05.228261 7f52c4bfb6c0 Delete type=0 #175
2026/06/01-22:47:46.984190 7f52c4bfb6c0 Level-0 table #180: started
2026/06/01-22:47:47.016424 7f52c4bfb6c0 Level-0 table #180: 3689250 bytes OK
2026/06/01-22:47:47.022818 7f52c4bfb6c0 Delete type=0 #177
2026/06/01-22:49:07.037465 7f52c4bfb6c0 Level-0 table #182: started
2026/06/01-22:49:07.113718 7f52c4bfb6c0 Level-0 table #182: 3742709 bytes OK
2026/06/01-22:49:07.141920 7f52c4bfb6c0 Delete type=0 #179
2026/06/01-22:49:07.142905 7f52c4bfb6c0 Compacting 4@0 + 1@1 files
2026/06/01-22:49:07.200300 7f52c4bfb6c0 Generated table #183@0: 12232 keys, 2147703 bytes
2026/06/01-22:49:07.251271 7f52c4bfb6c0 Generated table #184@0: 12346 keys, 1594009 bytes
2026/06/01-22:49:07.251297 7f52c4bfb6c0 Compacted 4@0 + 1@1 files => 3741712 bytes
2026/06/01-22:49:07.282491 7f52c4bfb6c0 compacted to: files[ 0 2 2 0 0 0 0 ]
2026/06/01-22:49:07.282953 7f52c4bfb6c0 Delete type=2 #174
2026/06/01-22:49:07.283509 7f52c4bfb6c0 Delete type=2 #176
2026/06/01-22:49:07.284069 7f52c4bfb6c0 Delete type=2 #178
2026/06/01-22:49:07.284659 7f52c4bfb6c0 Delete type=2 #180
2026/06/01-22:49:07.285224 7f52c4bfb6c0 Delete type=2 #182
2026/06/01-22:50:15.076056 7f52c4bfb6c0 Level-0 table #186: started
2026/06/01-22:50:15.139569 7f52c4bfb6c0 Level-0 table #186: 3791699 bytes OK
2026/06/01-22:50:15.177008 7f52c4bfb6c0 Delete type=0 #181
2026/06/01-22:51:23.050617 7f52c4bfb6c0 Level-0 table #188: started
2026/06/01-22:51:23.083717 7f52c4bfb6c0 Level-0 table #188: 3847811 bytes OK
2026/06/01-22:51:23.090754 7f52c4bfb6c0 Delete type=0 #185
+39 -25
View File
@@ -1,25 +1,39 @@
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)
2026/06/01-08:35:53.577873 7f52c53fc6c0 Recovering log #151
2026/06/01-08:35:53.588883 7f52c53fc6c0 Delete type=3 #115
2026/06/01-08:35:53.588945 7f52c53fc6c0 Delete type=0 #151
2026/06/01-08:47:35.073031 7f52c4bfb6c0 Level-0 table #161: started
2026/06/01-08:47:35.109060 7f52c4bfb6c0 Level-0 table #161: 3389567 bytes OK
2026/06/01-08:47:35.119693 7f52c4bfb6c0 Delete type=0 #159
2026/06/01-08:49:55.679233 7f52c4bfb6c0 Level-0 table #163: started
2026/06/01-08:49:55.721583 7f52c4bfb6c0 Level-0 table #163: 3442926 bytes OK
2026/06/01-08:49:55.728383 7f52c4bfb6c0 Delete type=0 #160
2026/06/01-08:51:10.512438 7f52c4bfb6c0 Level-0 table #165: started
2026/06/01-08:51:10.552653 7f52c4bfb6c0 Level-0 table #165: 3485558 bytes OK
2026/06/01-08:51:10.559696 7f52c4bfb6c0 Delete type=0 #162
2026/06/01-08:51:10.560948 7f52c4bfb6c0 Manual compaction at level-0 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 761930 : 1
2026/06/01-08:51:10.560964 7f52c4bfb6c0 Compacting 2@0 + 1@1 files
2026/06/01-08:51:10.590673 7f52c4bfb6c0 Generated table #166@0: 12461 keys, 2148113 bytes
2026/06/01-08:51:10.614131 7f52c4bfb6c0 Generated table #167@0: 10457 keys, 1336575 bytes
2026/06/01-08:51:10.614152 7f52c4bfb6c0 Compacted 2@0 + 1@1 files => 3484688 bytes
2026/06/01-08:51:10.620854 7f52c4bfb6c0 compacted to: files[ 0 2 2 0 0 0 0 ]
2026/06/01-08:51:10.621202 7f52c4bfb6c0 Delete type=2 #161
2026/06/01-08:51:10.621653 7f52c4bfb6c0 Delete type=2 #163
2026/06/01-08:51:10.622090 7f52c4bfb6c0 Delete type=2 #165
2026/06/01-08:51:10.641251 7f52c4bfb6c0 Manual compaction at level-0 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 761930 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end)
2026/06/01-08:51:10.649348 7f52c4bfb6c0 Manual compaction at level-1 from '!tables!BbXMbmHKcLJrBCmk' @ 72057594037927935 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!e9c7LNgXUFbYLZF1.0q5zLunzoX2kqo8m' @ 780825 : 1
2026/06/01-08:51:10.649351 7f52c4bfb6c0 Compacting 1@1 + 1@2 files
2026/06/01-08:51:10.679226 7f52c4bfb6c0 Generated table #168@1: 12461 keys, 2148113 bytes
2026/06/01-08:51:10.684351 7f52c4bfb6c0 Generated table #169@1: 755 keys, 94591 bytes
2026/06/01-08:51:10.684370 7f52c4bfb6c0 Compacted 1@1 + 1@2 files => 2242704 bytes
2026/06/01-08:51:10.692020 7f52c4bfb6c0 compacted to: files[ 0 1 3 0 0 0 0 ]
2026/06/01-08:51:10.692313 7f52c4bfb6c0 Delete type=2 #155
2026/06/01-08:51:10.692659 7f52c4bfb6c0 Delete type=2 #166
2026/06/01-08:51:10.711439 7f52c4bfb6c0 Manual compaction at level-1 from '!tables.results!e9c7LNgXUFbYLZF1.0q5zLunzoX2kqo8m' @ 780825 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 784560 : 1
2026/06/01-08:51:10.711444 7f52c4bfb6c0 Compacting 1@1 + 2@2 files
2026/06/01-08:51:10.734315 7f52c4bfb6c0 Generated table #170@1: 10457 keys, 1336575 bytes
2026/06/01-08:51:10.734332 7f52c4bfb6c0 Compacted 1@1 + 2@2 files => 1336575 bytes
2026/06/01-08:51:10.741118 7f52c4bfb6c0 compacted to: files[ 0 0 2 0 0 0 0 ]
2026/06/01-08:51:10.741262 7f52c4bfb6c0 Delete type=2 #157
2026/06/01-08:51:10.741508 7f52c4bfb6c0 Delete type=2 #167
2026/06/01-08:51:10.741680 7f52c4bfb6c0 Delete type=2 #169
2026/06/01-08:51:10.747933 7f52c4bfb6c0 Manual compaction at level-1 from '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 784560 : 1 .. '!tables.results!xe7x4qufBpzLaEby.zzqLG98O4eFQZHp0' @ 0 : 0; will stop at (end)
Binary file not shown.
Binary file not shown.
View File
+1 -1
View File
@@ -1 +1 @@
MANIFEST-000074
MANIFEST-000090
+3 -8
View File
@@ -1,8 +1,3 @@
2026/05/27-23:11:58.427900 7f3ebd7ff6c0 Recovering log #72
2026/05/27-23:11:58.438233 7f3ebd7ff6c0 Delete type=3 #70
2026/05/27-23:11:58.438292 7f3ebd7ff6c0 Delete type=0 #72
2026/05/28-01:07:03.314279 7f3e6effd6c0 Level-0 table #77: started
2026/05/28-01:07:03.314328 7f3e6effd6c0 Level-0 table #77: 0 bytes OK
2026/05/28-01:07:03.320204 7f3e6effd6c0 Delete type=0 #75
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/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)
2026/06/01-22:42:05.875087 7f52c6bff6c0 Recovering log #88
2026/06/01-22:42:05.885101 7f52c6bff6c0 Delete type=3 #86
2026/06/01-22:42:05.885133 7f52c6bff6c0 Delete type=0 #88
+8 -8
View File
@@ -1,8 +1,8 @@
2026/05/27-14:31:25.650849 7f3e6f7fe6c0 Recovering log #67
2026/05/27-14:31:25.660624 7f3e6f7fe6c0 Delete type=3 #65
2026/05/27-14:31:25.660648 7f3e6f7fe6c0 Delete type=0 #67
2026/05/27-14:33:21.780104 7f3e6effd6c0 Level-0 table #73: started
2026/05/27-14:33:21.780129 7f3e6effd6c0 Level-0 table #73: 0 bytes OK
2026/05/27-14:33:21.786659 7f3e6effd6c0 Delete type=0 #71
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/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/06/01-08:35:53.549764 7f52c5bfd6c0 Recovering log #84
2026/06/01-08:35:53.560355 7f52c5bfd6c0 Delete type=3 #82
2026/06/01-08:35:53.560413 7f52c5bfd6c0 Delete type=0 #84
2026/06/01-08:51:10.491490 7f52c4bfb6c0 Level-0 table #89: started
2026/06/01-08:51:10.491513 7f52c4bfb6c0 Level-0 table #89: 0 bytes OK
2026/06/01-08:51:10.498412 7f52c4bfb6c0 Delete type=0 #87
2026/06/01-08:51:10.505791 7f52c4bfb6c0 Manual compaction at level-0 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
2026/06/01-08:51:10.560715 7f52c4bfb6c0 Manual compaction at level-1 from '!items!0ZfAXacF6oWS120o' @ 72057594037927935 : 1 .. '!items!xFUyR7XECD8QJcIw' @ 0 : 0; will stop at (end)
+496
View File
@@ -0,0 +1,496 @@
/**
* MGT2 SectorMapApp
*
* Application interactive affichant une carte Traveller Map dans un IFRAME.
* Les clics sur la carte affichent les détails du monde dans le chat.
*/
const { ApplicationV2 } = foundry.applications.api;
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
export class SectorMapApp extends ApplicationV2 {
static DEFAULT_OPTIONS = {
id: 'mgt2-sector-map',
classes: ['mgt2-sector-map'],
position: { width: 960, height: 720 },
window: { icon: 'fas fa-map', resizable: true, controls: [] },
};
constructor(sector, subsector) {
super();
this._sector = sector;
this._subsector = subsector;
this._handler = null;
}
get title() {
return this._subsector
? `Sous-secteur ${this._subsector}${this._sector}`
: `Secteur ${this._sector}`;
}
get _mapUrl() {
const base = 'https://travellermap.com';
if (this._subsector) {
return `${base}/?sector=${encodeURIComponent(this._sector)}&subsector=${encodeURIComponent(this._subsector)}&style=mongoose&hideui=1`;
}
return `${base}/go/${encodeURIComponent(this._sector)}?style=mongoose`;
}
/* ───── Rendu ───── */
_replaceHTML(result, config) {
const content = this.element?.querySelector('.window-content');
if (!content) return;
const html = typeof result === 'string' ? result : this._lastHTML;
content.innerHTML = typeof html === 'string' ? html : '';
}
_renderHTML() {
return `<div class="mgt2-sector-map-outer">
<div class="mgt2-sector-map-toolbar">
<span class="mgt2-sector-map-label">${this._sector}${this._subsector ? ` — sous-secteur ${this._subsector}` : ''}</span>
<span class="mgt2-sector-map-hint">Cliquez sur un hex pour voir les détails du monde</span>
<button type="button" class="mgt2-sector-map-share" title="Partager une image fixe dans le chat"><i class="fas fa-image"></i> Partager</button>
<button type="button" class="mgt2-sector-map-sync" title="Ouvrir la carte interactive chez tous les joueurs"><i class="fas fa-users"></i> Synchroniser</button>
</div>
<iframe
src="${this._mapUrl}"
class="mgt2-sector-map-frame"
allow="clipboard-write"
referrerpolicy="no-referrer">
</iframe>
</div>`;
}
async _onRender(context, options) {
this._listen();
this.element?.querySelector('.mgt2-sector-map-share')?.addEventListener('click', () => {
this._shareMap();
});
this.element?.querySelector('.mgt2-sector-map-sync')?.addEventListener('click', () => {
this._syncAll();
});
}
/* ───── Écoute des clics IFRAME ───── */
_listen() {
if (this._handler) return;
this._handler = (event) => {
// Accept messages from travellermap or any origin (for testing)
const d = event.data || {};
const wx = d.x ?? d.location?.x;
const wy = d.y ?? d.location?.y;
if (wx == null || wy == null) return;
const x = Number(wx);
const y = Number(wy);
if (isNaN(x) || isNaN(y)) return;
console.log('SectorMapApp | click at', x, y, 'from', event.origin);
this._onMapClick({x, y}).catch(err => {
console.error('SectorMapApp | click handler failed:', err);
});
};
window.addEventListener('message', this._handler);
}
async _onMapClick(loc) {
const wx = loc?.x;
const wy = loc?.y;
if (wx == null || wy == null) return;
const coordResp = await fetch(
`https://travellermap.com/api/coordinates?x=${wx}&y=${wy}`
);
if (!coordResp.ok) { console.error('SectorMapApp | /api/coordinates failed', coordResp.status); return; }
const coord = await coordResp.json();
const { sx, sy, hx, hy } = coord;
if (sx == null || hx == null || hy == null) { console.error('SectorMapApp | no sx/hx/hy in', coord); return; }
const metaResp = await fetch(
`https://travellermap.com/api/metadata?sx=${sx}&sy=${sy}`
);
if (!metaResp.ok) { console.error('SectorMapApp | /api/metadata failed', metaResp.status); return; }
const meta = await metaResp.json();
const sectorName = meta.Names?.[0]?.Text;
if (!sectorName) { console.error('SectorMapApp | no Names[0].Text in metadata', meta); return; }
const hex = String(hx).padStart(2, '0') + String(hy).padStart(2, '0');
const resp = await fetch(
`https://travellermap.com/data/${encodeURIComponent(sectorName)}/${hex}`
);
if (!resp.ok) { console.error('SectorMapApp | /data failed', resp.status, sectorName, hex); return; }
const data = await resp.json();
const world = data.Worlds?.[0];
if (!world) { console.error('SectorMapApp | no Worlds in data', data); return; }
this._postWorldCard(world);
}
/* ───── Carte de chat ───── */
static _STARPORT = { A:'Excellent', B:'Bon', C:'Routinier', D:'Médiocre', E:'Frontière', X:'Aucun' };
static _SIZE = ['Aucun (Astéroïde)','1 600 km','3 200 km','4 800 km','6 400 km','8 000 km','9 600 km','11 200 km','12 800 km','14 400 km','16 000 km']; // A=10, F=15=Gaz géant (géré à part)
static _ATMO = [
'Aucune (vide)','Trace','Très ténue (polluée)','Très ténue','Ténue (polluée)','Ténue','Standard','Standard (polluée)','Dense','Dense (polluée)',
'Exotique','Corrosive','Insidieuse','','',''];
static _HYDRO = [ '05% (désert)','615%','1625%','2635%','3645%','4655%','5665%','6675%','7685%','8695%','96100%' ];
static _POP = ['','Dizaines','Centaines','Milliers','Dizaines de milliers','Centaines de milliers','Millions','Dizaines de millions','Centaines de millions','Milliards','Dizaines de milliards','','','','','',''];
static _GOV = [
'Aucun','Compagnie / Corporation','Démocratie participative','Oligarchie auto-perpétuée',
'Démocratie représentative','Technocratie féodale','Gouvernement captif / Colonie',
'Balkanisation','Bureaucratie de service civil','Bureaucratie impersonnelle',
'Dictature charismatique','Dictature non-charismatique','Oligarchie charismatique',
'Dictature religieuse','Oligarchie religieuse','Gouvernement tribal'];
static _LAW = [
'Aucune', 'Armes de poing, explosifs, poison','Armes à énergie portatives','Mitrailleuses, armes auto',
'Armes d\'assaut légères, PM','Armes de poing individuelles','Toutes les armes à feu sauf neutralisateur',
'Fusils, neutralisateur','Armes blanches, neutralisateur','Armes hors du domicile','Armes interdites',
'Contrôle rigide','Aucune arme','Contrôle militariste sévère'];
static _TL = [
'Âge de pierre','Âge du bronze/fer','Médiéval','Grandes découvertes','Révolution industrielle',
'Production mécanisée','Ère nucléaire','Pré-stellaire (ère de l\'information)','Propulsion à saut (1re gen)',
'Propulsion à saut-2','Propulsion à saut-3','Propulsion à saut-4','Propulsion à saut-5',
'Propulsion à saut-6','Transporteur','Moyenne stellaire'];
static _hexVal(ch) {
const n = parseInt(ch, 36);
if (isNaN(n)) return -1;
return n;
}
static _uwpDigit(desc, val) {
return `<span class="uwp-dig" title="${desc}">${val}</span>`;
}
_uwpBreakdown(uwp) {
if (!uwp || uwp.length < 2) return '';
const d = SectorMapApp._hexVal;
const s = d(uwp[0]), sz = d(uwp[1]), a = d(uwp[2]), h = d(uwp[3]);
const p = d(uwp[4]), g = d(uwp[5]), l = d(uwp[6]);
const t = uwp.length > 8 ? d(uwp[8]) : -1;
const lines = [];
const starport = SectorMapApp._STARPORT[uwp[0]];
lines.push(`<tr><td>${uwp[0]}</td><td>Starport</td><td>${starport ?? '—'}</td></tr>`);
if (uwp[1] === 'F' || uwp[1] === 'f') {
lines.push(`<tr><td>${uwp[1]}</td><td>Taille</td><td>Gaz géant</td></tr>`);
} else if (sz >= 0 && sz <= 10) {
const km = SectorMapApp._SIZE[sz];
const grav = sz === 0 ? '0g' : (sz < 10 ? `0.${sz}g` : '1.0g+');
lines.push(`<tr><td>${uwp[1]}</td><td>Taille</td><td>${km} (${grav})</td></tr>`);
}
if (a >= 0 && a <= 15) {
const atmo = SectorMapApp._ATMO[a] ?? '—';
lines.push(`<tr><td>${uwp[2]}</td><td>Atmosphère</td><td>${atmo}</td></tr>`);
}
if (h >= 0 && h <= 10) {
lines.push(`<tr><td>${uwp[3]}</td><td>Hydrosphère</td><td>${SectorMapApp._HYDRO[h]}</td></tr>`);
}
if (p >= 0 && p <= 15) {
lines.push(`<tr><td>${uwp[4]}</td><td>Population</td><td>${SectorMapApp._POP[p] ?? '—'}</td></tr>`);
}
if (g >= 0 && g <= 15) {
lines.push(`<tr><td>${uwp[5]}</td><td>Gouvernement</td><td>${SectorMapApp._GOV[g] ?? '—'}</td></tr>`);
}
if (l >= 0 && l <= 15) {
lines.push(`<tr><td>${uwp[6]}</td><td>Niveau légal</td><td>${SectorMapApp._LAW[l] ?? '—'}</td></tr>`);
}
if (t >= 0 && t <= 15) {
lines.push(`<tr><td>${uwp[8]}</td><td>Technologie</td><td>${SectorMapApp._TL[t] ?? '—'}</td></tr>`);
}
return `<table class="uwp-breakdown"><tbody>${lines.join('')}</tbody></table>`;
}
static _REMARKS_HELP = {
AB:'Anneau (ceinture)', AG:'Agricole', AN:'Site ancien', AS:'Astéroïde',
BA:'Bande astéroïdale', CP:'Sous-secteur capitale', CS:'Colonie',
CX:'Chasseur (Croiseur)', CY:'Colonie', DA:'Déchu', DE:'Désertique',
DI:'Interdit (Diebar)', FL:'Fluides Lo', FO:'Interdit (Forbidden)',
FR:'Gelé (Frozen)', GA:'Jardin (Garden)', HE:'Helios', HI:'Haute population',
HT:'Haute technologie', IC:'Mondes gelés (Ice)', IN:'Industrialisé',
LI:'Faible population', LO:'Faible population (Low)', LT:'Basse technologie (Low Tech)',
MI:'Militaire', MR:'Mine (ressources)', NA:'Non-agricole',
NI:'Non-industrialisé', OC:'Océanique', OX:'Oxydant',
PA:'Pré-agricole (Pre-Agricultural)', PH:'Phosphore',
PO:'Pauvre (Poor)', PR:'Pré-industriel (Pre-Industrial)',
PX:'Prisonnier (exil)', PZ:'Puzzle (énigmatique)',
RE:'Religieux (Religious)', RI:'Riche (Rich)',
SA:'Bande d\'astéroïdes (Satellite)', SC:'Sainte (colonie)',
SL:'Esclavage (Slave)', SO:'Soleil (Sol)', SP:'Désert (Despoiled)',
SR:'Réserve (Reserve)', ST:'Base stellaire', SU:'Secteur capitale',
TR:'Traces (Trace)', TU:'Tucannides', TZ:'Mondes Tz',
UN:'Inhabité (Uninhabited)', VA:'Vide (Vacuum)',
WA:'Monde aquatique (Water)', WT:'Monde d\'eau (Watery)',
};
static _STAR_TYPES = { O:'Bleu (hypergéante)', B:'Bleu-blanc', A:'Blanc', F:'Blanc-jaune', G:'Jaune (naine)', K:'Orange (naine)', M:'Rouge (naine)', L:'Brune', T:'Brune', Y:'Brune' };
static _STAR_CLASS = { 'I':'Supergéante', 'II':'Géante brillante', 'III':'Géante', 'IV':'Sous-géante', 'V':'Naine (séquence principale)', 'VI':'Sous-naine', 'VII':'Naine blanche' };
static _BASES_HELP = {
N:'Base navale', S:'Base scout', W:'Relais', D:'Dépôt naval',
T:'Base TAS', C:'Consulat', P:'Base pirate', R:'Base de réparation',
K:'Base navale (K.)', X:'Relais Xboat',
};
_tooltipHelp(map, codes) {
if (!codes) return '';
return codes.split(/[\s,;]+/).map(c => {
const desc = map[c.toUpperCase()];
return `${c}${desc ? ' — ' + desc : ''}`;
}).join(' | ');
}
static _NOBILITY = {
B:'Chevalier (Baronet)', C:'Baron', D:'Marquis', E:'Comte', F:'Duc', G:'Archiduc', H:'Empereur',
};
static _IMPORTANCE = {
'-5':'Très mineur', '-4':'Mineur', '-3':'Mineur', '-2':'Très secondaire', '-1':'Secondaire',
'0':'Ordinaire', '1':'Important', '2':'Important', '3':'Très important', '4':'Majeure',
'5':'Majeure', '6':'Capitale',
};
/* ───── Lignes dépliables (details/summary) ───── */
_foldRow(label, value, detail, titleAttr) {
const valAttr = titleAttr ? ` title="${titleAttr}"` : '';
return `<tr><td colspan="2">
<details>
<summary><span class="fold-label">${label}</span><span class="fold-value"${valAttr}>${value}</span></summary>
<div class="fold-content">${detail}</div>
</details>
</td></tr>`;
}
_decodeImportance(ix) {
if (!ix) return '';
const m = String(ix).match(/\{?\s*(-?\d+)\s*\}?/);
if (!m) return this._foldRow('Importance', ix, '');
const val = m[1];
const desc = SectorMapApp._IMPORTANCE[val] || '—';
const detail = `<div class="fold-desc">Valeur dimportance économique et stratégique du monde.<br>${val} = ${desc}</div>`;
return this._foldRow('Importance', `{ ${val} } ${desc}`, detail);
}
_decodeEconomics(ex) {
if (!ex) return '';
let s = String(ex).replace(/[()\s]/g, '');
const m = s.match(/^([\dA-F])([\dA-F])([\dA-F])([+-]\d+)$/i);
if (!m) return this._foldRow('Économie', ex, '');
const res = m[1], lab = m[2], inf = m[3], eff = m[4];
const detail = `<table class="fold-subtable">
<tr><td>Ressources</td><td>${res}</td></tr>
<tr><td>Main-d’œuvre</td><td>${lab}</td></tr>
<tr><td>Infrastructure</td><td>${inf}</td></tr>
<tr><td>Efficacité</td><td>${eff}</td></tr>
</table>`;
return this._foldRow('Économie', `( ${res} ${lab} ${inf} ${eff} )`, detail);
}
_decodeCulture(cx) {
if (!cx) return '';
const s = String(cx).replace(/[\[\]\s]/g, '');
if (s.length < 4) return this._foldRow('Culture', cx, '');
const h = s[0].toUpperCase(), t = s[1].toUpperCase(), p = s[2].toUpperCase(), a = s[3].toUpperCase();
const detail = `<table class="fold-subtable">
<tr><td>Hétérogénéité</td><td>${h}</td></tr>
<tr><td>Traditionalisme</td><td>${t}</td></tr>
<tr><td>Progressisme</td><td>${p}</td></tr>
<tr><td>Agressivité</td><td>${a}</td></tr>
</table>`;
return this._foldRow('Culture', `[ ${h} ${t} ${p} ${a} ]`, detail);
}
_decodePopulation(uwp, pbg) {
if (!uwp || uwp.length < 5) return '';
const popUwp = SectorMapApp._hexVal(uwp[4]);
if (popUwp < 0) return '';
const popPbg = pbg ? parseInt(pbg[0], 10) : null;
const multiplier = popPbg != null && !isNaN(popPbg) ? popPbg : 1;
const base = Math.pow(10, popUwp);
const total = multiplier * base;
const fmtBase = `10<sup>${popUwp}</sup>`;
const fmtMult = multiplier;
const fmtTotal = total >= 1e9 ? `${(total / 1e9).toFixed(1)}&nbsp;milliards`
: total >= 1e6 ? `${(total / 1e6).toFixed(1)}&nbsp;millions`
: total >= 1e3 ? `${(total / 1e3).toFixed(0)}&nbsp;000`
: String(total);
const belts = pbg ? parseInt(pbg[1], 10) : null;
const gas = pbg ? parseInt(pbg[2], 10) : null;
const detail = `<div class="fold-desc">Population = multiplicateur (PBG: <b>${popPbg}</b>) × 10<sup>chiffre UWP (${uwp[4]})</sup><br>
Ceintures dastéroïdes : <b>${belts ?? '?'}</b> &nbsp;|&nbsp; Géantes gazeuses : <b>${gas ?? '?'}</b></div>`;
return this._foldRow('Population', `${fmtMult} × ${fmtBase} = ${fmtTotal}`, detail);
}
_decodeNobility(nob) {
if (!nob) return '';
const titles = [];
for (const ch of nob) {
const desc = SectorMapApp._NOBILITY[ch.toUpperCase()];
if (desc) titles.push(`${ch} (${desc})`);
}
if (!titles.length) return this._foldRow('Noblesse', nob, '');
const detail = `<div class="fold-desc">Titres de noblesse impériale présents sur ce monde.</div>`;
return this._foldRow('Noblesse', titles.join(', '), detail);
}
_postWorldCard(w) {
const sector = w.Sector || '';
const hex = w.Hex || '';
const name = w.Name || '—';
const uwp = w.UWP || '???????-?';
const bases = w.Bases || '';
const remarks = w.Remarks || '';
const allegiance = w.Allegiance || '';
const stellar = w.Stellar || '';
const zone = w.Zone || '';
const pbg = w.PBG || '';
const zoneLabel = zone === 'R' ? 'Rouge'
: zone === 'A' ? 'Ambre'
: 'Verte';
// Construction des lignes pliables
const lines = [];
// UWP
const uwpDetail = this._uwpBreakdown(uwp);
lines.push(this._foldRow('UWP', `<span class="mono">${uwp}</span>`, uwpDetail));
// Champs étendus
const ixRow = this._decodeImportance(w.Ix);
if (ixRow) lines.push(ixRow);
const exRow = this._decodeEconomics(w.Ex);
if (exRow) lines.push(exRow);
const cxRow = this._decodeCulture(w.Cx);
if (cxRow) lines.push(cxRow);
const popRow = this._decodePopulation(uwp, pbg);
if (popRow) lines.push(popRow);
const nobRow = this._decodeNobility(w.Nobility);
if (nobRow) lines.push(nobRow);
// Bases
if (bases) {
const bCodes = bases.split(/[\s,;]+/);
const bList = bCodes.map(c => {
const desc = SectorMapApp._BASES_HELP[c.toUpperCase()];
return `<tr><td class="mono">${c}</td><td>${desc || '—'}</td></tr>`;
}).join('');
const bDetail = `<table class="fold-subtable"><tbody>${bList}</tbody></table>`;
lines.push(this._foldRow('Bases', bases, bDetail));
}
// Remarques
if (remarks) {
const rCodes = remarks.split(/[\s,;]+/);
const rList = rCodes.map(c => {
const desc = SectorMapApp._REMARKS_HELP[c.toUpperCase()];
return `<tr><td class="mono">${c}</td><td>${desc || '—'}</td></tr>`;
}).join('');
const rDetail = `<table class="fold-subtable"><tbody>${rList}</tbody></table>`;
lines.push(this._foldRow('Remarques', remarks, rDetail));
}
// Allégeance
if (allegiance) {
const allegFull = w.AllegianceName || '';
const aDetail = `<div class="fold-desc">${allegFull || allegiance}</div>`;
lines.push(this._foldRow('Allégeance', allegFull ? `${allegiance} (${allegFull})` : allegiance, aDetail));
}
// Étoile (les notations comme "G3 V" contiennent un espace entre sous-classe et luminosité)
if (stellar) {
const sList = [];
let remaining = stellar.trim();
const reStar = /^([OBAFGKMLTY])(\d)\s*(VII|VI|V|IV|III|II|I)\s*/i;
while (remaining) {
const m = remaining.match(reStar);
if (m) {
const type = SectorMapApp._STAR_TYPES[m[1].toUpperCase()] || m[1];
const cls = SectorMapApp._STAR_CLASS[m[3]] || m[3];
sList.push(`<tr><td class="mono">${m[1]}${m[2]} ${m[3]}</td><td>${type} · ${cls}</td></tr>`);
remaining = remaining.slice(m[0].length).trimStart();
} else {
// Saute les tokens non reconnus (BD, compagnon, etc.)
const next = remaining.indexOf(' ');
if (next < 0) break;
remaining = remaining.slice(next + 1).trimStart();
}
}
const sDetail = sList.length ? `<table class="fold-subtable"><tbody>${sList.join('')}</tbody></table>` : `<div class="fold-desc">${stellar}</div>`;
lines.push(this._foldRow('Étoile', `<span class="mono">${stellar}</span>`, sDetail));
}
const html = `<section class="mgt2-world-card">
<div class="mgt2-world-card-header">
<span class="mgt2-world-name">${name}</span>
<span class="mgt2-world-hex">${sector} ${hex}</span>
<span class="mgt2-world-zone zone-${zone.toLowerCase() || 'g'}">${zoneLabel}</span>
</div>
<table class="mgt2-world-card-body"><tbody>${lines.join('')}</tbody></table>
</section>`;
ChatMessage.create({
content: html,
whisper: [game.user.id],
});
}
/* ───── Partage ───── */
_shareMap() {
const posterUrl = `https://travellermap.com/api/poster?sector=${encodeURIComponent(this._sector)}${this._subsector ? `&subsector=${encodeURIComponent(this._subsector)}` : ''}&style=mongoose&scale=128&dpr=2`;
const label = this._subsector
? `Sous-secteur ${this._subsector}${this._sector}`
: `Secteur ${this._sector}`;
const html = `<section class="mgt2-shared-map">
<div class="mgt2-world-card-header">
<span class="mgt2-world-name">${label}</span>
</div>
<div class="mgt2-shared-map-image">
<img src="${posterUrl}" alt="${label}">
</div>
<div class="mgt2-shared-map-footer">
<a href="https://travellermap.com/go/${encodeURIComponent(this._sector)}" target="_blank" rel="noopener">
Ouvrir sur Traveller Map <i class="fas fa-external-link-alt"></i>
</a>
</div>
</section>`;
ChatMessage.create({ content: html, rollMode: 'public' });
ui.notifications.info(`Carte partagée avec les joueurs`);
}
_syncAll() {
game.socket.emit(`module.${MODULE_ID}`, {
type: 'sectorMapSync',
sector: this._sector,
subsector: this._subsector,
});
ui.notifications.info(`Carte synchronisée chez tous les joueurs`);
}
/* ───── Nettoyage ───── */
close() {
if (this._handler) {
window.removeEventListener('message', this._handler);
this._handler = null;
}
return super.close();
}
}
+146
View File
@@ -0,0 +1,146 @@
/**
* MGT2 Commandes /sector et /subsector
*
* Ouvre l'application interactive SectorMapApp (IFRAME Traveller Map).
* Compatible Foundry VTT v13 et v14
*/
import { SectorMapApp } from './SectorMapApp.js';
const MODULE_ID = 'mgt2-compendium-amiral-denisov';
const ChatLogV2 = foundry.applications?.sidebar?.tabs?.ChatLog;
let _pendingHandle = false;
/* ───── Fonctions partagées ───── */
async function openMap(sector, subsector) {
const app = new SectorMapApp(sector, subsector);
await app.render({ force: true });
}
async function handleSectorCommand(sector, subsector) {
if (_pendingHandle) return;
_pendingHandle = true;
try {
if (!sector?.trim()) {
ui.notifications.warn('Usage : /sector <nom du secteur> (ex: /sector "Spinward Marches")');
return;
}
if (!game.user?.isGM) {
ui.notifications.error('Seul le MJ peut utiliser cette commande');
return;
}
await openMap(sector.trim());
} catch (err) {
console.error(`${MODULE_ID} | Erreur /sector :`, err);
ui.notifications.error(`Erreur : ${err.message}`);
} finally {
_pendingHandle = false;
}
}
async function handleSubsectorCommand(raw) {
if (_pendingHandle) return;
_pendingHandle = true;
try {
const parts = raw?.trim().split(/\s+/);
if (!parts || parts.length < 2) {
ui.notifications.warn('Usage : /subsector <secteur> <sous-secteur> (ex: /subsector "Spinward Marches" C)');
return;
}
const sub = parts.pop();
const sector = parts.join(' ');
if (!sector || !sub) {
ui.notifications.warn('Usage : /subsector <secteur> <sous-secteur>');
return;
}
if (!game.user?.isGM) {
ui.notifications.error('Seul le MJ peut utiliser cette commande');
return;
}
await openMap(sector.trim(), sub.trim());
} catch (err) {
console.error(`${MODULE_ID} | Erreur /subsector :`, err);
ui.notifications.error(`Erreur : ${err.message}`);
} finally {
_pendingHandle = false;
}
}
/* ───── Commande /sector ───── */
if (ChatLogV2?.CHAT_COMMANDS) {
ChatLogV2.CHAT_COMMANDS['sector'] = {
rgx: /^\/sector(?:\s+(.*))?$/i,
fn: function() {
const raw = arguments[1]?.[1]?.trim?.();
if (raw) {
handleSectorCommand(raw);
return false;
}
return true;
},
};
console.log(`${MODULE_ID} | Commande /sector enregistrée`);
ChatLogV2.CHAT_COMMANDS['subsector'] = {
rgx: /^\/subsector(?:\s+(.*))?$/i,
fn: function() {
const raw = arguments[1]?.[1]?.trim?.();
if (raw) {
handleSubsectorCommand(raw);
return false;
}
return true;
},
};
console.log(`${MODULE_ID} | Commande /subsector enregistrée`);
}
/* ───── Hooks de secours (v13 / fallback v14) ───── */
Hooks.on('preCreateChatMessage', (message, data, options) => {
const c = message.content?.trim();
let m = c?.match(/^\/sector(?:\s+(.*))?$/i);
if (m) {
handleSectorCommand(m[1]?.trim());
return false;
}
m = c?.match(/^\/subsector(?:\s+(.*))?$/i);
if (m) {
handleSubsectorCommand(m[1]?.trim());
return false;
}
});
/* ───── Socket (synchronisation MJ → joueurs) ───── */
Hooks.once('ready', () => {
game.socket.on(`module.${MODULE_ID}`, (data) => {
if (data?.type !== 'sectorMapSync') return;
if (game.user?.isGM) return;
openMap(data.sector, data.subsector);
});
});
Hooks.on('chatMessage', (...args) => {
let msg;
if (args[0]?.content !== undefined) msg = args[0].content;
else if (typeof args[1] === 'string') msg = args[1];
else return;
let m = msg?.trim()?.match(/^\/sector(?:\s+(.*))?$/i);
if (m) {
handleSectorCommand(m[1]?.trim());
return false;
}
m = msg?.trim()?.match(/^\/subsector(?:\s+(.*))?$/i);
if (m) {
handleSubsectorCommand(m[1]?.trim());
return false;
}
});
+275
View File
@@ -329,3 +329,278 @@ button.btn-calculate:hover,
border-color: #a9d0a9;
background: #eef8ee;
}
/* === MGT2 Sector Map ====================================================== */
#mgt2-sector-map .window-content {
padding: 0;
overflow: hidden;
background: #1a1a2e;
}
.mgt2-sector-map-outer {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
}
.mgt2-sector-map-toolbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 6px 12px;
background: #2c2c3e;
border-bottom: 1px solid #c9a227;
flex-shrink: 0;
}
.mgt2-sector-map-label {
color: #d9b24c;
font-weight: bold;
font-size: 0.85em;
}
.mgt2-sector-map-hint {
color: #a99c7a;
font-size: 0.78em;
}
.mgt2-sector-map-share {
background: #c9a227;
color: #1a1a2e;
border: none;
border-radius: 3px;
padding: 4px 12px;
font-size: 0.8em;
font-weight: bold;
cursor: pointer;
flex-shrink: 0;
}
.mgt2-sector-map-share:hover {
background: #d9b24c;
}
.mgt2-sector-map-frame {
width: 100%;
flex: 1;
border: none;
}
/* === MGT2 World Card (chat) ============================================== */
.mgt2-world-card {
background: #f5f0e8;
border: 1px solid #c9a227;
border-radius: 5px;
overflow: hidden;
font-family: 'Signika', sans-serif;
color: #222;
}
.mgt2-world-card-header {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
background: #2c2c3e;
border-bottom: 2px solid #c9a227;
}
.mgt2-world-name {
font-size: 1.1em;
font-weight: bold;
color: #d9b24c;
}
.mgt2-world-hex {
font-size: 0.78em;
color: #a99c7a;
font-weight: normal;
}
.mgt2-world-zone {
margin-left: auto;
font-size: 0.75em;
font-weight: bold;
padding: 2px 8px;
border-radius: 999px;
text-transform: uppercase;
}
.mgt2-world-zone.zone-g {
background: #2a6a2a;
color: #fff;
}
.mgt2-world-zone.zone-a {
background: #b8860b;
color: #fff;
}
.mgt2-world-zone.zone-r {
background: #8b0000;
color: #fff;
}
.mgt2-world-card-body {
width: 100%;
border-collapse: collapse;
}
.mgt2-world-card-body td {
padding: 0;
border-bottom: 1px solid #e0d8c8;
}
.mgt2-world-card-body .mono {
font-family: 'Courier New', monospace;
letter-spacing: 0.1em;
}
/* === Fold rows (details/summary) ========================================= */
.mgt2-world-card-body details {
display: block;
}
.mgt2-world-card-body summary {
display: flex;
align-items: center;
gap: 8px;
padding: 4px 12px;
cursor: pointer;
list-style: none;
user-select: none;
}
.mgt2-world-card-body summary::-webkit-details-marker {
display: none;
}
.mgt2-world-card-body summary::before {
content: '▸';
color: #c9a227;
font-size: 0.75em;
flex-shrink: 0;
transition: transform 0.15s;
}
.mgt2-world-card-body details[open] summary::before {
transform: rotate(90deg);
}
.mgt2-world-card-body summary:hover {
background: rgba(201, 162, 39, 0.08);
}
.fold-label {
width: 100px;
flex-shrink: 0;
font-weight: bold;
color: #5f4300;
font-size: 0.83em;
}
.fold-value {
font-size: 0.83em;
color: #222;
}
.fold-content {
padding: 4px 12px 8px 28px;
font-size: 0.78em;
color: #555;
background: rgba(201, 162, 39, 0.04);
border-top: 1px solid #ece6da;
}
.fold-desc {
line-height: 1.5;
}
.fold-subtable {
width: 100%;
border-collapse: collapse;
}
.fold-subtable td {
padding: 2px 8px;
font-size: 0.95em;
border: none;
}
.fold-subtable td:first-child {
width: 120px;
font-weight: 600;
color: #5f4300;
}
.fold-subtable td:nth-child(2) {
font-family: 'Courier New', monospace;
color: #7a5c00;
letter-spacing: 0.1em;
}
/* === UWP breakdown inside fold =========================================== */
.uwp-breakdown {
width: 100%;
border-collapse: collapse;
}
.uwp-breakdown td {
padding: 2px 8px;
font-size: 0.95em;
border-bottom: 1px solid #ece6da;
border-top: none;
color: #555;
}
.uwp-breakdown td:first-child {
width: 24px;
font-family: 'Courier New', monospace;
font-weight: bold;
color: #7a5c00;
letter-spacing: 0.05em;
}
.uwp-breakdown td:nth-child(2) {
width: 110px;
font-weight: 600;
color: #5f4300;
}
.uwp-breakdown td:nth-child(3) {
color: #666;
}
.uwp-breakdown tr:last-child td {
border-bottom: none;
}
/* === MGT2 Shared Map (chat) ============================================== */
.mgt2-shared-map {
background: #f5f0e8;
border: 1px solid #c9a227;
border-radius: 5px;
overflow: hidden;
font-family: 'Signika', sans-serif;
color: #222;
}
.mgt2-shared-map .mgt2-sector-map-share {
display: none;
}
.mgt2-shared-map-image {
line-height: 0;
}
.mgt2-shared-map-image img {
display: block;
max-width: 100%;
height: auto;
}