mirror of
https://github.com/DrBeef/JKXR.git
synced 2024-11-23 12:32:26 +00:00
42 lines
2.2 KiB
Markdown
42 lines
2.2 KiB
Markdown
|
# Save Games
|
||
|
|
||
|
Save games are handled in `code/server/sv_savegame.cpp`. A save game consists of blocks which start with their type (a 4 byte string) and length; in Jedi Academy they are as follows:
|
||
|
|
||
|
1. Save Game Version ("_VER" read in `SG_Open()`; must be iSAVEGAME_VERSION)
|
||
|
2. Comment ("COMM" read in `SG_ReadSavegame()`)
|
||
|
3. ??? ignored ("CMTM" read in `SG_ReadSavegame()`)
|
||
|
4. Map ("MPCM" read in `SG_ReadSavegame()`)
|
||
|
5. CVars: Count ("CVCN" in `SG_ReadCvars()`) and each name and value ("CVAR" and "VALU")
|
||
|
6. Whether it's an autosave ("GAME")
|
||
|
|
||
|
And if so, it reads various Cvars:
|
||
|
1. "playersave" which contains the players' status ("CVSV")
|
||
|
2. "playerammo" ("AMMO")
|
||
|
3. "playerinv" ("IVTY")
|
||
|
4. "playerfplvl" ("FPLV")
|
||
|
|
||
|
Else:
|
||
|
|
||
|
1. server time ("TIME")
|
||
|
2. server residual time ("TIMR")
|
||
|
3. Portals ("PRTS")
|
||
|
4. Server Config Strings: Count ("CSCN") and each index ("CSIN") and value ("CSDA")
|
||
|
7. *At this point we enter game code; we are now in `ReadLevel()` in `code/game/g_savegame.cpp`.*
|
||
|
|
||
|
There's some special case handling for autosaves and transitions (which I believe have to do with hub levels), but typically it then loads the client (`level.clients[0]`, "GCLI"). This is done using `EvaluateFields()`, which first reads the binary data, then possibly adjusts for differences between retail and patch (changed `saberInfo_t`) and finally fixes the pointers in the read data, e.g. strings. Half of the `level_locals_t` data is loaded in the same way ("LVLC").
|
||
|
8. Objectives ("OBJT")
|
||
|
9. Effects ("FXLE", 32 \* "FXFN")
|
||
|
10. Entities: `ReadGEntities()`
|
||
|
1. All the entities (count = "NMED", count * "EDNM", "GENT", "GNPC", "GCLI", "PARM", "VHIC", "GHL2")
|
||
|
* "GHL2" is handled by renderer, which has the G2 code.
|
||
|
2. Timers
|
||
|
3. Icarus `CIcarus::Load()`
|
||
|
1. Version ("ICAR", must match `CIcarus::ICARUS_VERSION`)
|
||
|
2. Buffer ("ISEQ") - flat buffer that is subsequently parsed to reconstruct the Icarus state
|
||
|
4. Icarus Endmarker ("ICOK")
|
||
|
5. `g_entityInUseBits` ("INUS")
|
||
|
11. Icarus Variables ("[FS]VAR", "[FS]IDL", "[FS]IDS", "[FS]VAL", "SVSZ")
|
||
|
12. `player_locked` ("LCKD")
|
||
|
13. `CG_ReadTheEvilCGHackStuff()` ("FPSL", "IVSL")
|
||
|
14. End marker ("DONE")
|