wiki update

minjaesong
2025-11-28 19:07:15 +09:00
parent 34543c6b68
commit 4f4ae755df

@@ -29,9 +29,10 @@ This separation allows:
Saves are stored in the appdata directory: Saves are stored in the appdata directory:
``` ```
<appdata>/Savegames/ <appdata>/Worlds/
── WorldName_w.tvd # World disk ── world uuid # World disk
└── PlayerName_p.tvd # Player disk <appdata>/Players/
└── player uuid # Player disk
``` ```
## VirtualDisk Format ## VirtualDisk Format
@@ -143,11 +144,9 @@ Offset 0x3000: Entry ID 42 (updated - USED on read) ← Appended by quicksave
This makes quicksaves faster (no rebuild) but results in larger file sizes over time. Periodic full saves compact the disk by removing duplicate and deleted entries. This makes quicksaves faster (no rebuild) but results in larger file sizes over time. Periodic full saves compact the disk by removing duplicate and deleted entries.
## Snapshot System
### Snapshot Numbers ### Snapshot Numbers
Saves are versioned using snapshot numbers in the format: `YYwWWX` When the save is created on dev version, the shanpshot number is recorded here.
```kotlin ```kotlin
// Format: 0b A_yyyyyyy wwwwww_aa // Format: 0b A_yyyyyyy wwwwww_aa
@@ -157,14 +156,12 @@ Saves are versioned using snapshot numbers in the format: `YYwWWX`
// f = revision 6 (a=1, b=2, ..., f=6) // f = revision 6 (a=1, b=2, ..., f=6)
``` ```
This allows tracking save compatibility and detecting version mismatches.
### Version Compatibility ### Version Compatibility
When loading a save, the engine checks: When loading a save, the engine checks:
1. **Snapshot number** — Warn if from newer version 1. **Snapshot number** — Warn if from newer version
2. **GENVER** — Game version that created the save 2. **GENVER** — Game version that created the save (stored in the main JSON descriptor file)
3. **Module versions** — Check module compatibility 3. **Module versions** — Check module compatibility
## Serialisation ## Serialisation
@@ -223,7 +220,7 @@ DiskSkimmer provides efficient read/write access to virtual disks without loadin
### Creating a Skimmer ### Creating a Skimmer
```kotlin ```kotlin
val skimmer = DiskSkimmer(File("save.tvd")) val skimmer = DiskSkimmer(File("savegame"))
``` ```
### Reading Entries ### Reading Entries
@@ -266,7 +263,8 @@ This is what distinguishes a **full save** from a **quicksave**.
```kotlin ```kotlin
COMP_NONE = 0 // No compression COMP_NONE = 0 // No compression
COMP_GZIP = 1 // Gzip compression COMP_GZIP = 1 // Gzip compression (only maintained for older version compatibility)
COMP_UNUSED = 2 // Used to be LZMA (now removed)
COMP_ZSTD = 3 // Zstandard (recommended) COMP_ZSTD = 3 // Zstandard (recommended)
COMP_SNAPPY = 4 // Snappy (fast, lower ratio) COMP_SNAPPY = 4 // Snappy (fast, lower ratio)
``` ```
@@ -317,7 +315,7 @@ val world = INGAME.world
val player = INGAME.actorNowPlaying as IngamePlayer val player = INGAME.actorNowPlaying as IngamePlayer
// 2. Open existing disk (don't rebuild) // 2. Open existing disk (don't rebuild)
val worldDisk = DiskSkimmer(File("${worldName}_w.tvd")) val worldDisk = DiskSkimmer(File("${App.worldsDir}/${world.UUID}"))
// 3. Serialise changed data to JSON // 3. Serialise changed data to JSON
val worldJson = Common.jsoner.toJson(world) val worldJson = Common.jsoner.toJson(world)
@@ -346,8 +344,8 @@ worldDisk.sync() // Write clean disk
```kotlin ```kotlin
// 1. Open disks // 1. Open disks
val worldDisk = DiskSkimmer(File("${worldName}_w.tvd")) val worldDisk = DiskSkimmer(File("${App.worldsDir}/${worldUUID}"))
val playerDisk = DiskSkimmer(File("${playerName}_p.tvd")) val playerDisk = DiskSkimmer(File("${App.playersDir}/${playerUUID}"))
// 2. Read and decompress (automatically uses latest entry if duplicates exist) // 2. Read and decompress (automatically uses latest entry if duplicates exist)
val worldData = worldDisk.requestFile(0x00) // Gets entry at highest offset val worldData = worldDisk.requestFile(0x00) // Gets entry at highest offset