Форматы файлов сохранения.md


sfallgv.sav

Структура файла.

// Sfall Savegame sfallgv.sav

LittleEndian();

typedef struct {
    union {
      char name[8];
      int64 id;
    } _id;
    union {
        int   val;
        float fval;
    } _val;
    int unused;
} TGlobal;

DWORD globalsCount; // количество sfall глобальных переменных (начало файла)
for (i=0; i<globalsCount; i++) TGlobal gvar;

DWORD uniqueID; // счетчик уникальных номеров для объектов
short addedYears;  // количество прошедших лет
short GainStatFix; // old now unused

typedef struct {
	int Level;
	int Image;
	char Name[64];
	char Desc[512];
	char gap[510]; // reserve block
	short id; // индификатор перка
} TFakePerk;

DWORD traitsCount;
for (i=0; i<traitsCount; i++)
    TFakePerk trait;

DWORD fakePerksCount;
for (i=0; i<fakePerksCount; i++)
    TFakePerk fakePerk;

DWORD selectablePerksCount;
for (i=0; i<selectablePerksCount; i++)
    TFakePerk selPerk;

DWORD unused; // for backward compatibility with 3.3-
DWORD arraysCount; // количество сохраненных массивов
for (i=0; i<arraysCount; i++)
    TArray2 array; 

// NEW arrays:
typedef struct {
    TDataType dataType;
    if (dataType == _FLOAT) {
        float val;
    } else if (dataType == _STR) {
        DWORD strLen;
        char str[strLen];
    } else {
        int val;
    }
} TElement2;

typedef struct {
    //DWORD hash;
    //DWORD _unused;
    DWORD flags;
    DWORD size;
    if (flags & 1) {
        for (j=0; j<size/2; j++) {
            TElement2 key;
            TElement2 val;
        }
    } else {
        for (j=0; j<size; j++) {
            TElement2 val;
        }
    }
} TArray2;

if (!FEof()) {
    DWORD arrays2Count;
    for (i=0; i<arrays2Count; i++)
        TArray2 array;
}

typedef enum <DWORD> {_NONE = 0 , _INT = 1, _FLOAT = 2, _STR = 3} TDataType;

////////////// OLD arrays format ////////////////////
typedef struct {
    if (dataType[j] == _FLOAT) {
        float val;
        FSkip(datalen - 4);
    } else if (dataType[j] == _STR) {
        char val[datalen];
    } else {
        int val;
        FSkip(datalen - 4);
    }
} TElement;

typedef struct {
	DWORD id;
	DWORD len;
    DWORD datalen;
	TDataType dataType[len];
    for (j=0; j<len; j++) {
        TElement val;
    }
} TArray;

// после массивов идут данные об использованных предметов Drugs для персонажа игрока
DWORD count;


sfalldb.sav

  • Содержит данные о текущем состоянии возможности отдыха на картах.
  • Данные характеристик критеров при использовании ими предметов типа Drugs.
  • В конце файла всегда содержится номер версии sfall в формате: 00 XX XX XX в котором произошло сохранение.