src/saveload.cpp
author rubidium
Mon, 16 Jul 2007 23:55:22 +0000
changeset 7272 d47fc9e22d1c
parent 7258 8ea218277d00
child 7321 f91bdca345e8
permissions -rw-r--r--
(svn r10601) -Codechange: store (and use) the type of stations instead of hardcoding station types by graphics IDs.
2186
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
db48cf29b983 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
     3
/** @file saveload.cpp
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
     4
 * All actions handling saving and loading goes on in this file. The general actions
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
     5
 * are as follows for saving a game (loading is analogous):
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
     6
 * <ol>
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
     7
 * <li>initialize the writer by creating a temporary memory-buffer for it
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
     8
 * <li>go through all to-be saved elements, each 'chunk' (ChunkHandler) prefixed by a label
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
     9
 * <li>use their description array (SaveLoad) to know what elements to save and in what version
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
    10
 *    of the game it was active (used when loading)
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
    11
 * <li>write all data byte-by-byte to the temporary buffer so it is endian-safe
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
    12
 * <li>when the buffer is full; flush it to the output (eg save to file) (_sl.buf, _sl.bufp, _sl.bufe)
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
    13
 * <li>repeat this until everything is done, and flush any remaining output to file
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
    14
 * </ol>
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
    15
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    16
#include "stdafx.h"
1891
862800791170 (svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents: 1886
diff changeset
    17
#include "openttd.h"
1299
39c06aba09aa (svn r1803) Move debugging stuff into files of it's own
tron
parents: 1284
diff changeset
    18
#include "debug.h"
2163
b17b313113a0 (svn r2673) Include functions.h directly, not globally via openttd.h
tron
parents: 2162
diff changeset
    19
#include "functions.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    20
#include "vehicle.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    21
#include "station.h"
2285
410dedcf46d1 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents: 2283
diff changeset
    22
#include "thread.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    23
#include "town.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    24
#include "player.h"
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    25
#include "saveload.h"
5469
7edfc643abbc (svn r7751) -Codechange: move network_* to a new network map. Furthermore move the low level network functions to network/core, so they can be reused by the masterserver and website-serverlist-updater.
rubidium
parents: 5436
diff changeset
    26
#include "network/network.h"
2159
f6284cf5fab0 (svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents: 2150
diff changeset
    27
#include "variables.h"
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
    28
#include "table/strings.h"
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
    29
#include "strings.h"
2335
c02c57fbb1b7 (svn r2861) Move inclusion of setjmp.h into saveload.c, should've been part of r2819
tron
parents: 2295
diff changeset
    30
#include <setjmp.h>
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
    31
#include <list>
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    32
7272
d47fc9e22d1c (svn r10601) -Codechange: store (and use) the type of stations instead of hardcoding station types by graphics IDs.
rubidium
parents: 7258
diff changeset
    33
extern const uint16 SAVEGAME_VERSION = 72;
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    34
uint16 _sl_version;       ///< the major savegame version identifier
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    35
byte   _sl_minor_version; ///< the minor savegame version, DO NOT USE!
2295
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
    36
2337
d8b9e722672d (svn r2863) Move some type declarations into saveload.c, should've been part of r2819
tron
parents: 2335
diff changeset
    37
typedef void WriterProc(uint len);
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
    38
typedef uint ReaderProc();
2337
d8b9e722672d (svn r2863) Move some type declarations into saveload.c, should've been part of r2819
tron
parents: 2335
diff changeset
    39
2295
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
    40
/** The saveload struct, containing reader-writer functions, bufffer, version, etc. */
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
    41
static struct {
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    42
	bool save;                           ///< are we doing a save or a load atm. True when saving
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    43
	byte need_length;                    ///< ???
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    44
	byte block_mode;                     ///< ???
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    45
	bool error;                          ///< did an error occur or not
2295
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
    46
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    47
	int obj_len;                         ///< the length of the current object we are busy with
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    48
	int array_index, last_array_index;   ///< in the case of an array, the current and last positions
2295
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
    49
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    50
	uint32 offs_base;                    ///< the offset in number of bytes since we started writing data (eg uncompressed savegame size)
2295
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
    51
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    52
	WriterProc *write_bytes;             ///< savegame writer function
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    53
	ReaderProc *read_bytes;              ///< savegame loader function
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    54
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    55
	const ChunkHandler* const *chs;      ///< the chunk of data that is being processed atm (vehicles, signs, etc.)
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    56
	const SaveLoad* const *includes;     ///< the internal layouf of the given chunk
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    57
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    58
	/* When saving/loading savegames, they are always saved to a temporary memory-place
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    59
	 * to be flushed to file (save) or to final place (load) when full. */
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    60
	byte *bufp, *bufe;                   ///< bufp(ointer) gives the current position in the buffer bufe(nd) gives the end of the buffer
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    61
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    62
	/* these 3 may be used by compressor/decompressors. */
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    63
	byte *buf;                           ///< pointer to temporary memory to read/write, initialized by SaveLoadFormat->initread/write
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    64
	byte *buf_ori;                       ///< pointer to the original memory location of buf, used to free it afterwards
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    65
	uint bufsize;                        ///< the size of the temporary memory *buf
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    66
	FILE *fh;                            ///< the file from which is read or written to
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    67
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
    68
	void (*excpt_uninit)();              ///< the function to execute on any encountered error
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
    69
	StringID error_str;                  ///< the translateable error message to show
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
    70
	char *extra_msg;                     ///< the error message
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    71
	jmp_buf excpt;                       ///< @todo used to jump to "exception handler";  really ugly
2295
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
    72
} _sl;
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
    73
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
    74
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
    75
enum NeedLengthValues {NL_NONE = 0, NL_WANTLENGTH = 1, NL_CALCLENGTH = 2};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    76
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
    77
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
    78
 * Fill the input buffer by reading from the file with the given reader
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
    79
 */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
    80
static void SlReadFill()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    81
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    82
	uint len = _sl.read_bytes();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    83
	assert(len != 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    84
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    85
	_sl.bufp = _sl.buf;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    86
	_sl.bufe = _sl.buf + len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    87
	_sl.offs_base += len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    88
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    89
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
    90
static inline uint32 SlGetOffs() {return _sl.offs_base - (_sl.bufe - _sl.bufp);}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
    91
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
    92
/** Return the size in bytes of a certain type of normal/atomic variable
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    93
 * as it appears in memory. See VarTypes
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
    94
 * @param conv VarType type of variable that is used for calculating the size
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
    95
 * @return Return the size of this type in bytes */
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
    96
static inline byte SlCalcConvMemLen(VarType conv)
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
    97
{
3048
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
    98
	static const byte conv_mem_size[] = {1, 1, 1, 2, 2, 4, 4, 8, 8, 0};
3625
929df0b3484a (svn r4524) - Codechange: Use GB() macros for getting the saveload file/memory types
Darkvater
parents: 3585
diff changeset
    99
	byte length = GB(conv, 4, 4);
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   100
	assert(length < lengthof(conv_mem_size));
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   101
	return conv_mem_size[length];
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   102
}
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   103
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   104
/** Return the size in bytes of a certain type of normal/atomic variable
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   105
 * as it appears in a saved game. See VarTypes
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   106
 * @param conv VarType type of variable that is used for calculating the size
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   107
 * @return Return the size of this type in bytes */
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   108
static inline byte SlCalcConvFileLen(VarType conv)
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   109
{
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   110
	static const byte conv_file_size[] = {1, 1, 2, 2, 4, 4, 8, 8, 2};
3625
929df0b3484a (svn r4524) - Codechange: Use GB() macros for getting the saveload file/memory types
Darkvater
parents: 3585
diff changeset
   111
	byte length = GB(conv, 0, 4);
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   112
	assert(length < lengthof(conv_file_size));
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   113
	return conv_file_size[length];
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   114
}
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   115
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   116
/** Return the size in bytes of a reference (pointer) */
7054
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   117
static inline size_t SlCalcRefLen() {return CheckSavegameVersion(69) ? 2 : 4;}
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   118
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   119
/** Flush the output buffer by writing to disk with the given reader.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   120
 * If the buffer pointer has not yet been set up, set it up now. Usually
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   121
 * only called when the buffer is full, or there is no more data to be processed
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   122
 */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   123
static void SlWriteFill()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   124
{
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   125
	/* flush the buffer to disk (the writer) */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   126
	if (_sl.bufp != NULL) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   127
		uint len = _sl.bufp - _sl.buf;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   128
		_sl.offs_base += len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   129
		if (len) _sl.write_bytes(len);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   130
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
   131
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   132
	/* All the data from the buffer has been written away, rewind to the beginning
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   133
	 * to start reading in more data */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   134
	_sl.bufp = _sl.buf;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   135
	_sl.bufe = _sl.buf + _sl.bufsize;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   136
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   137
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   138
/** Error handler, calls longjmp to simulate an exception.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   139
 * @todo this was used to have a central place to handle errors, but it is
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   140
 * pretty ugly, and seriously interferes with any multithreaded approaches */
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
   141
static void NORETURN SlError(StringID string, const char *extra_msg = NULL)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   142
{
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
   143
	_sl.error_str = string;
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
   144
	free(_sl.extra_msg);
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
   145
	_sl.extra_msg = (extra_msg == NULL) ? NULL : strdup(extra_msg);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   146
	longjmp(_sl.excpt, 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   147
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   148
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   149
/** Read in a single byte from file. If the temporary buffer is full,
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   150
 * flush it to its final destination
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   151
 * @return return the read byte from file
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   152
 */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   153
static inline byte SlReadByteInternal()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   154
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   155
	if (_sl.bufp == _sl.bufe) SlReadFill();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   156
	return *_sl.bufp++;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   157
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   158
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   159
/** Wrapper for SlReadByteInternal */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   160
byte SlReadByte() {return SlReadByteInternal();}
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   161
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   162
/** Write away a single byte from memory. If the temporary buffer is full,
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   163
 * flush it to its destination (file)
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   164
 * @param b the byte that is currently written
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   165
 */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   166
static inline void SlWriteByteInternal(byte b)
1514
b389a8fca4e0 (svn r2018) Yet another workaround
tron
parents: 1513
diff changeset
   167
{
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   168
	if (_sl.bufp == _sl.bufe) SlWriteFill();
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   169
	*_sl.bufp++ = b;
1514
b389a8fca4e0 (svn r2018) Yet another workaround
tron
parents: 1513
diff changeset
   170
}
b389a8fca4e0 (svn r2018) Yet another workaround
tron
parents: 1513
diff changeset
   171
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   172
/** Wrapper for SlWriteByteInternal */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   173
void SlWriteByte(byte b) {SlWriteByteInternal(b);}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   174
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   175
static inline int SlReadUint16()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   176
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   177
	int x = SlReadByte() << 8;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   178
	return x | SlReadByte();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   179
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   180
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   181
static inline uint32 SlReadUint32()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   182
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   183
	uint32 x = SlReadUint16() << 16;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   184
	return x | SlReadUint16();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   185
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   186
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   187
static inline uint64 SlReadUint64()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   188
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   189
	uint32 x = SlReadUint32();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   190
	uint32 y = SlReadUint32();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   191
	return (uint64)x << 32 | y;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   192
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   193
2144
eb9f5557b52f (svn r2654) SlWriteUint16() should have a uint16 as parameter, not some arbitrary enum
tron
parents: 2141
diff changeset
   194
static inline void SlWriteUint16(uint16 v)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   195
{
2150
f710b959b1c4 (svn r2660) Get rid of some more shifting/anding/casting
tron
parents: 2144
diff changeset
   196
	SlWriteByte(GB(v, 8, 8));
f710b959b1c4 (svn r2660) Get rid of some more shifting/anding/casting
tron
parents: 2144
diff changeset
   197
	SlWriteByte(GB(v, 0, 8));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   198
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   199
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   200
static inline void SlWriteUint32(uint32 v)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   201
{
2150
f710b959b1c4 (svn r2660) Get rid of some more shifting/anding/casting
tron
parents: 2144
diff changeset
   202
	SlWriteUint16(GB(v, 16, 16));
f710b959b1c4 (svn r2660) Get rid of some more shifting/anding/casting
tron
parents: 2144
diff changeset
   203
	SlWriteUint16(GB(v,  0, 16));
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   204
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   205
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   206
static inline void SlWriteUint64(uint64 x)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   207
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   208
	SlWriteUint32((uint32)(x >> 32));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   209
	SlWriteUint32((uint32)x);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   210
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   211
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   212
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   213
 * Read in the header descriptor of an object or an array.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   214
 * If the highest bit is set (7), then the index is bigger than 127
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   215
 * elements, so use the next byte to read in the real value.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   216
 * The actual value is then both bytes added with the first shifted
1886
0c760142c249 (svn r2392) - Fix some typos (Tron)
Darkvater
parents: 1885
diff changeset
   217
 * 8 bits to the left, and dropping the highest bit (which only indicated a big index).
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   218
 * x = ((x & 0x7F) << 8) + SlReadByte();
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   219
 * @return Return the value of the index
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   220
 */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   221
static uint SlReadSimpleGamma()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   222
{
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   223
	uint i = SlReadByte();
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   224
	if (HASBIT(i, 7)) {
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   225
		i &= ~0x80;
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   226
		if (HASBIT(i, 6)) {
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   227
			i &= ~0x40;
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   228
			if (HASBIT(i, 5)) {
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   229
				i &= ~0x20;
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   230
				if (HASBIT(i, 4))
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
   231
					SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unsupported gamma");
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   232
				i = (i << 8) | SlReadByte();
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   233
			}
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   234
			i = (i << 8) | SlReadByte();
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   235
		}
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   236
		i = (i << 8) | SlReadByte();
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   237
	}
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   238
	return i;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   239
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   240
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   241
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   242
 * Write the header descriptor of an object or an array.
1886
0c760142c249 (svn r2392) - Fix some typos (Tron)
Darkvater
parents: 1885
diff changeset
   243
 * If the element is bigger than 127, use 2 bytes for saving
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   244
 * and use the highest byte of the first written one as a notice
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   245
 * that the length consists of 2 bytes, etc.. like this:
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   246
 * 0xxxxxxx
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   247
 * 10xxxxxx xxxxxxxx
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   248
 * 110xxxxx xxxxxxxx xxxxxxxx
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   249
 * 1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   250
 * @param i Index being written
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   251
 */
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   252
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   253
static void SlWriteSimpleGamma(uint i)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   254
{
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   255
	if (i >= (1 << 7)) {
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   256
		if (i >= (1 << 14)) {
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   257
			if (i >= (1 << 21)) {
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   258
				assert(i < (1 << 28));
6491
00dc414c909d (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6486
diff changeset
   259
				SlWriteByte((byte)0xE0 | (i >> 24));
00dc414c909d (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6486
diff changeset
   260
				SlWriteByte((byte)(i >> 16));
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   261
			} else {
6491
00dc414c909d (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6486
diff changeset
   262
				SlWriteByte((byte)0xC0 | (i >> 16));
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   263
			}
6491
00dc414c909d (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6486
diff changeset
   264
			SlWriteByte((byte)(i >> 8));
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   265
		} else {
6491
00dc414c909d (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6486
diff changeset
   266
			SlWriteByte((byte)(0x80 | (i >> 8)));
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   267
		}
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   268
	}
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   269
	SlWriteByte(i);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   270
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   271
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   272
/** Return how many bytes used to encode a gamma value */
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   273
static inline uint SlGetGammaLength(uint i) {
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   274
	return 1 + (i >= (1 << 7)) + (i >= (1 << 14)) + (i >= (1 << 21));
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   275
}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   276
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   277
static inline uint SlReadSparseIndex() {return SlReadSimpleGamma();}
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   278
static inline void SlWriteSparseIndex(uint index) {SlWriteSimpleGamma(index);}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   279
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   280
static inline uint SlReadArrayLength() {return SlReadSimpleGamma();}
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   281
static inline void SlWriteArrayLength(uint length) {SlWriteSimpleGamma(length);}
3509
bd375685efd1 (svn r4360) - CodeChange: add shortcut to SlGetArrayLength of the gamma-function along the lines of the Write/Read functions
Darkvater
parents: 3431
diff changeset
   282
static inline uint SlGetArrayLength(uint length) {return SlGetGammaLength(length);}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   283
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   284
void SlSetArrayIndex(uint index)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   285
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   286
	_sl.need_length = NL_WANTLENGTH;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   287
	_sl.array_index = index;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   288
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   289
7100
a4dd8e1b9f6e (svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
rubidium
parents: 7054
diff changeset
   290
static uint32 _next_offs;
a4dd8e1b9f6e (svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
rubidium
parents: 7054
diff changeset
   291
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   292
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   293
 * Iterate through the elements of an array and read the whole thing
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   294
 * @return The index of the object, or -1 if we have reached the end of current block
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   295
 */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   296
int SlIterateArray()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   297
{
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   298
	int index;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
   299
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   300
	/* After reading in the whole array inside the loop
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   301
	 * we must have read in all the data, so we must be at end of current block. */
7100
a4dd8e1b9f6e (svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
rubidium
parents: 7054
diff changeset
   302
	if (_next_offs != 0 && SlGetOffs() != _next_offs) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Invalid chunk size");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   303
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   304
	while (true) {
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   305
		uint length = SlReadArrayLength();
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   306
		if (length == 0) {
7100
a4dd8e1b9f6e (svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
rubidium
parents: 7054
diff changeset
   307
			_next_offs = 0;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   308
			return -1;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   309
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   310
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   311
		_sl.obj_len = --length;
7100
a4dd8e1b9f6e (svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
rubidium
parents: 7054
diff changeset
   312
		_next_offs = SlGetOffs() + length;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   313
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   314
		switch (_sl.block_mode) {
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   315
		case CH_SPARSE_ARRAY: index = (int)SlReadSparseIndex(); break;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   316
		case CH_ARRAY:        index = _sl.array_index++; break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   317
		default:
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5296
diff changeset
   318
			DEBUG(sl, 0, "SlIterateArray error");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   319
			return -1; // error
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   320
		}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
   321
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   322
		if (length != 0) return index;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   323
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   324
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   325
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   326
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   327
 * Sets the length of either a RIFF object or the number of items in an array.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   328
 * This lets us load an object or an array of arbitrary size
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   329
 * @param length The length of the sought object/array
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   330
 */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   331
void SlSetLength(size_t length)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   332
{
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   333
	assert(_sl.save);
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   334
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   335
	switch (_sl.need_length) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   336
	case NL_WANTLENGTH:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   337
		_sl.need_length = NL_NONE;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   338
		switch (_sl.block_mode) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   339
		case CH_RIFF:
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   340
			/* Ugly encoding of >16M RIFF chunks
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   341
			 * The lower 24 bits are normal
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   342
			 * The uppermost 4 bits are bits 24:27 */
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   343
			assert(length < (1<<28));
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   344
			SlWriteUint32((length & 0xFFFFFF) | ((length >> 24) << 28));
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   345
			break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   346
		case CH_ARRAY:
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   347
			assert(_sl.last_array_index <= _sl.array_index);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   348
			while (++_sl.last_array_index <= _sl.array_index)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   349
				SlWriteArrayLength(1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   350
			SlWriteArrayLength(length + 1);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   351
			break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   352
		case CH_SPARSE_ARRAY:
3509
bd375685efd1 (svn r4360) - CodeChange: add shortcut to SlGetArrayLength of the gamma-function along the lines of the Write/Read functions
Darkvater
parents: 3431
diff changeset
   353
			SlWriteArrayLength(length + 1 + SlGetArrayLength(_sl.array_index)); // Also include length of sparse index.
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   354
			SlWriteSparseIndex(_sl.array_index);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   355
			break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   356
		default: NOT_REACHED();
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   357
		} break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   358
	case NL_CALCLENGTH:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   359
		_sl.obj_len += length;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   360
		break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   361
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   362
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   363
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   364
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   365
 * Save/Load bytes. These do not need to be converted to Little/Big Endian
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   366
 * so directly write them or read them to/from file
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   367
 * @param ptr The source or destination of the object being manipulated
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   368
 * @param length number of bytes this fast CopyBytes lasts
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   369
 */
410
0efd84450b01 (svn r607) -Patch: [ 985102 ] static cleanup
tron
parents: 222
diff changeset
   370
static void SlCopyBytes(void *ptr, size_t length)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   371
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   372
	byte *p = (byte*)ptr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   373
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   374
	if (_sl.save) {
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   375
		for (; length != 0; length--) {SlWriteByteInternal(*p++);}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   376
	} else {
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   377
		for (; length != 0; length--) {*p++ = SlReadByteInternal();}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   378
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   379
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   380
3117
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   381
/** Read in bytes from the file/data structure but don't do
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   382
 * anything with them, discarding them in effect
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   383
 * @param length The amount of bytes that is being treated this way
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   384
 */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   385
static inline void SlSkipBytes(size_t length)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   386
{
3117
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   387
	for (; length != 0; length--) SlReadByte();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   388
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   389
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   390
/* Get the length of the current object */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   391
uint SlGetFieldLength() {return _sl.obj_len;}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   392
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   393
/** Return a signed-long version of the value of a setting
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   394
 * @param ptr pointer to the variable
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   395
 * @param conv type of variable, can be a non-clean
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   396
 * type, eg one with other flags because it is parsed
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   397
 * @return returns the value of the pointer-setting */
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   398
int64 ReadValue(const void *ptr, VarType conv)
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   399
{
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   400
	switch (GetVarMemType(conv)) {
3109
68dd88833161 (svn r3712) - Change the boolean assignment/reading from == 1 to != 0 as suggested by Tron.
Darkvater
parents: 3108
diff changeset
   401
	case SLE_VAR_BL:  return (*(bool*)ptr != 0);
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   402
	case SLE_VAR_I8:  return *(int8*  )ptr;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   403
	case SLE_VAR_U8:  return *(byte*  )ptr;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   404
	case SLE_VAR_I16: return *(int16* )ptr;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   405
	case SLE_VAR_U16: return *(uint16*)ptr;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   406
	case SLE_VAR_I32: return *(int32* )ptr;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   407
	case SLE_VAR_U32: return *(uint32*)ptr;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   408
	case SLE_VAR_I64: return *(int64* )ptr;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   409
	case SLE_VAR_U64: return *(uint64*)ptr;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   410
	case SLE_VAR_NULL:return 0;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   411
	default: NOT_REACHED();
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   412
	}
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   413
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   414
	/* useless, but avoids compiler warning this way */
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   415
	return 0;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   416
}
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   417
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   418
/** Write the value of a setting
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   419
 * @param ptr pointer to the variable
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   420
 * @param conv type of variable, can be a non-clean type, eg
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6333
diff changeset
   421
 *             with other flags. It is parsed upon read
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6333
diff changeset
   422
 * @param val the new value being given to the variable */
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   423
void WriteValue(void *ptr, VarType conv, int64 val)
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   424
{
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   425
	switch (GetVarMemType(conv)) {
3109
68dd88833161 (svn r3712) - Change the boolean assignment/reading from == 1 to != 0 as suggested by Tron.
Darkvater
parents: 3108
diff changeset
   426
	case SLE_VAR_BL:  *(bool  *)ptr = (val != 0);  break;
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   427
	case SLE_VAR_I8:  *(int8  *)ptr = val; break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   428
	case SLE_VAR_U8:  *(byte  *)ptr = val; break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   429
	case SLE_VAR_I16: *(int16 *)ptr = val; break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   430
	case SLE_VAR_U16: *(uint16*)ptr = val; break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   431
	case SLE_VAR_I32: *(int32 *)ptr = val; break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   432
	case SLE_VAR_U32: *(uint32*)ptr = val; break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   433
	case SLE_VAR_I64: *(int64 *)ptr = val; break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   434
	case SLE_VAR_U64: *(uint64*)ptr = val; break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   435
	case SLE_VAR_NULL: break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   436
	default: NOT_REACHED();
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   437
	}
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   438
}
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   439
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   440
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   441
 * Handle all conversion and typechecking of variables here.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   442
 * In the case of saving, read in the actual value from the struct
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   443
 * and then write them to file, endian safely. Loading a value
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   444
 * goes exactly the opposite way
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   445
 * @param ptr The object being filled/read
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   446
 * @param conv VarType type of the current element of the struct
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   447
 */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   448
static void SlSaveLoadConv(void *ptr, VarType conv)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   449
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   450
	int64 x = 0;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
   451
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   452
	if (_sl.save) { // SAVE values
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   453
		/* Read a value from the struct. These ARE endian safe. */
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   454
		x = ReadValue(ptr, conv);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   455
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   456
		/* Write the value to the file and check if its value is in the desired range */
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   457
		switch (GetVarFileType(conv)) {
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   458
		case SLE_FILE_I8: assert(x >= -128 && x <= 127);     SlWriteByte(x);break;
2026
567e3bc9af72 (svn r2535) Tabs
tron
parents: 1993
diff changeset
   459
		case SLE_FILE_U8: assert(x >= 0 && x <= 255);        SlWriteByte(x);break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   460
		case SLE_FILE_I16:assert(x >= -32768 && x <= 32767); SlWriteUint16(x);break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   461
		case SLE_FILE_STRINGID:
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   462
		case SLE_FILE_U16:assert(x >= 0 && x <= 65535);      SlWriteUint16(x);break;
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   463
		case SLE_FILE_I32:
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   464
		case SLE_FILE_U32:                                   SlWriteUint32((uint32)x);break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   465
		case SLE_FILE_I64:
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   466
		case SLE_FILE_U64:                                   SlWriteUint64(x);break;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   467
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   468
		}
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   469
	} else { // LOAD values
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
   470
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   471
		/* Read a value from the file */
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   472
		switch (GetVarFileType(conv)) {
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   473
		case SLE_FILE_I8:  x = (int8  )SlReadByte();   break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   474
		case SLE_FILE_U8:  x = (byte  )SlReadByte();   break;
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   475
		case SLE_FILE_I16: x = (int16 )SlReadUint16(); break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   476
		case SLE_FILE_U16: x = (uint16)SlReadUint16(); break;
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   477
		case SLE_FILE_I32: x = (int32 )SlReadUint32(); break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   478
		case SLE_FILE_U32: x = (uint32)SlReadUint32(); break;
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   479
		case SLE_FILE_I64: x = (int64 )SlReadUint64(); break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   480
		case SLE_FILE_U64: x = (uint64)SlReadUint64(); break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   481
		case SLE_FILE_STRINGID: x = RemapOldStringID((uint16)SlReadUint16()); break;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   482
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   483
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   484
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   485
		/* Write The value to the struct. These ARE endian safe. */
3108
797699723806 (svn r3711) - Extract the WriteValue() and ReadValue() parts of the saveload code to assign/read to/from a variable. Preparatory work to make this the general function type for such assignments
Darkvater
parents: 3073
diff changeset
   486
		WriteValue(ptr, conv, x);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   487
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   488
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   489
3510
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   490
/** Calculate the net length of a string. This is in almost all cases
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   491
 * just strlen(), but if the string is not properly terminated, we'll
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   492
 * resort to the maximum length of the buffer.
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   493
 * @param ptr pointer to the stringbuffer
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   494
 * @param length maximum length of the string (buffer). If -1 we don't care
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   495
 * about a maximum length, but take string length as it is.
3510
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   496
 * @return return the net length of the string */
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   497
static inline size_t SlCalcNetStringLen(const char *ptr, size_t length)
3510
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   498
{
7179
7f456e0f628a (svn r10453) -Codechange: Allow save/load of empty (unallocated) strings
peter1138
parents: 7138
diff changeset
   499
	if (ptr == NULL) return 0;
3510
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   500
	return minu(strlen(ptr), length - 1);
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   501
}
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   502
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   503
/** Calculate the gross length of the string that it
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   504
 * will occupy in the savegame. This includes the real length, returned
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   505
 * by SlCalcNetStringLen and the length that the index will occupy.
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   506
 * @param ptr pointer to the stringbuffer
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   507
 * @param length maximum length of the string (buffer size, etc.)
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6333
diff changeset
   508
 * @param conv type of data been used
3510
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   509
 * @return return the gross length of the string */
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   510
static inline size_t SlCalcStringLen(const void *ptr, size_t length, VarType conv)
3048
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   511
{
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   512
	size_t len;
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   513
	const char *str;
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   514
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   515
	switch (GetVarMemType(conv)) {
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   516
		default: NOT_REACHED();
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   517
		case SLE_VAR_STR:
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   518
		case SLE_VAR_STRQ:
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   519
			str = *(const char**)ptr;
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   520
			len = SIZE_MAX;
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   521
			break;
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   522
		case SLE_VAR_STRB:
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   523
		case SLE_VAR_STRBQ:
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   524
			str = (const char*)ptr;
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   525
			len = length;
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   526
			break;
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   527
	}
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   528
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   529
	len = SlCalcNetStringLen(str, len);
3510
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   530
	return len + SlGetArrayLength(len); // also include the length of the index
3048
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   531
}
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   532
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   533
/**
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   534
 * Save/Load a string.
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   535
 * @param ptr the string being manipulated
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6333
diff changeset
   536
 * @param length of the string (full length)
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   537
 * @param conv must be SLE_FILE_STRING */
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   538
static void SlString(void *ptr, size_t length, VarType conv)
3048
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   539
{
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   540
	size_t len;
3048
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   541
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   542
	if (_sl.save) { // SAVE string
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   543
		switch (GetVarMemType(conv)) {
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   544
			default: NOT_REACHED();
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   545
			case SLE_VAR_STRB:
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   546
			case SLE_VAR_STRBQ:
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   547
				len = SlCalcNetStringLen((char*)ptr, length);
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   548
				break;
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   549
			case SLE_VAR_STR:
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   550
			case SLE_VAR_STRQ:
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   551
				ptr = *(char**)ptr;
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
   552
				len = SlCalcNetStringLen((char*)ptr, SIZE_MAX);
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   553
				break;
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   554
		}
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   555
3510
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   556
		SlWriteArrayLength(len);
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   557
		SlCopyBytes(ptr, len);
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   558
	} else { // LOAD string
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   559
		len = SlReadArrayLength();
3510
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   560
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   561
		switch (GetVarMemType(conv)) {
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   562
			default: NOT_REACHED();
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   563
			case SLE_VAR_STRB:
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   564
			case SLE_VAR_STRBQ:
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   565
				if (len >= length) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5296
diff changeset
   566
					DEBUG(sl, 1, "String length in savegame is bigger than buffer, truncating");
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   567
					SlCopyBytes(ptr, length);
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   568
					SlSkipBytes(len - length);
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   569
					len = length - 1;
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   570
				} else {
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   571
					SlCopyBytes(ptr, len);
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   572
				}
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   573
				break;
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   574
			case SLE_VAR_STR:
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   575
			case SLE_VAR_STRQ: // Malloc'd string, free previous incarnation, and allocate
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   576
				free(*(char**)ptr);
7179
7f456e0f628a (svn r10453) -Codechange: Allow save/load of empty (unallocated) strings
peter1138
parents: 7138
diff changeset
   577
				if (len == 0) {
7f456e0f628a (svn r10453) -Codechange: Allow save/load of empty (unallocated) strings
peter1138
parents: 7138
diff changeset
   578
					*(char**)ptr = NULL;
7f456e0f628a (svn r10453) -Codechange: Allow save/load of empty (unallocated) strings
peter1138
parents: 7138
diff changeset
   579
				} else {
7f456e0f628a (svn r10453) -Codechange: Allow save/load of empty (unallocated) strings
peter1138
parents: 7138
diff changeset
   580
					*(char**)ptr = (char*)malloc(len + 1); // terminating '\0'
7f456e0f628a (svn r10453) -Codechange: Allow save/load of empty (unallocated) strings
peter1138
parents: 7138
diff changeset
   581
					ptr = *(char**)ptr;
7f456e0f628a (svn r10453) -Codechange: Allow save/load of empty (unallocated) strings
peter1138
parents: 7138
diff changeset
   582
					SlCopyBytes(ptr, len);
7f456e0f628a (svn r10453) -Codechange: Allow save/load of empty (unallocated) strings
peter1138
parents: 7138
diff changeset
   583
				}
5140
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   584
				break;
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   585
		}
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   586
b1097c36a598 (svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents: 5116
diff changeset
   587
		((char*)ptr)[len] = '\0'; // properly terminate the string
3510
3b5a7d59a907 (svn r4361) - Fix: Write and Read the true length of a string-buffer into the savegame instead of the whole buffer.
Darkvater
parents: 3509
diff changeset
   588
	}
3048
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   589
}
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   590
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   591
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   592
 * Return the size in bytes of a certain type of atomic array
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   593
 * @param length The length of the array counted in elements
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   594
 * @param conv VarType type of the variable that is used in calculating the size
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   595
 */
2958
ac0a9673b522 (svn r3520) Remove unused parameters from some functions
tron
parents: 2952
diff changeset
   596
static inline size_t SlCalcArrayLen(uint length, VarType conv)
ac0a9673b522 (svn r3520) Remove unused parameters from some functions
tron
parents: 2952
diff changeset
   597
{
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   598
	return SlCalcConvFileLen(conv) * length;
2958
ac0a9673b522 (svn r3520) Remove unused parameters from some functions
tron
parents: 2952
diff changeset
   599
}
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   600
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   601
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   602
 * Save/Load an array.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   603
 * @param array The array being manipulated
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   604
 * @param length The length of the array in elements
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   605
 * @param conv VarType type of the atomic array (int, byte, uint64, etc.)
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   606
 */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   607
void SlArray(void *array, uint length, VarType conv)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   608
{
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   609
	/* Automatically calculate the length? */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   610
	if (_sl.need_length != NL_NONE) {
2958
ac0a9673b522 (svn r3520) Remove unused parameters from some functions
tron
parents: 2952
diff changeset
   611
		SlSetLength(SlCalcArrayLen(length, conv));
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   612
		/* Determine length only? */
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   613
		if (_sl.need_length == NL_CALCLENGTH) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   614
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   615
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   616
	/* NOTICE - handle some buggy stuff, in really old versions everything was saved
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   617
	 * as a byte-type. So detect this, and adjust array size accordingly */
2295
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
   618
	if (!_sl.save && _sl_version == 0) {
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   619
		if (conv == SLE_INT16 || conv == SLE_UINT16 || conv == SLE_STRINGID ||
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4059
diff changeset
   620
				conv == SLE_INT32 || conv == SLE_UINT32) {
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   621
			length *= SlCalcConvFileLen(conv);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   622
			conv = SLE_INT8;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   623
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   624
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   625
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   626
	/* If the size of elements is 1 byte both in file and memory, no special
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   627
	 * conversion is needed, use specialized copy-copy function to speed up things */
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   628
	if (conv == SLE_INT8 || conv == SLE_UINT8) {
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   629
		SlCopyBytes(array, length);
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   630
	} else {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   631
		byte *a = (byte*)array;
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   632
		byte mem_size = SlCalcConvMemLen(conv);
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   633
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   634
		for (; length != 0; length --) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   635
			SlSaveLoadConv(a, conv);
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   636
			a += mem_size; // get size
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   637
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   638
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   639
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   640
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   641
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   642
static uint ReferenceToInt(const void* obj, SLRefType rt);
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   643
static void* IntToReference(uint index, SLRefType rt);
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   644
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   645
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   646
/**
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   647
 * Return the size in bytes of a list
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   648
 * @param list The std::list to find the size of
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   649
 */
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   650
static inline size_t SlCalcListLen(const void *list)
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   651
{
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   652
	std::list<void *> *l = (std::list<void *> *) list;
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   653
7054
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   654
	int type_size = CheckSavegameVersion(69) ? 2 : 4;
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   655
	/* Each entry is saved as type_size bytes, plus type_size bytes are used for the length
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   656
	 * of the list */
7054
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   657
	return l->size() * type_size + type_size;
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   658
}
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   659
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   660
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   661
/**
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   662
 * Save/Load a list.
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   663
 * @param list The list being manipulated
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   664
 * @param conv SLRefType type of the list (Vehicle *, Station *, etc)
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   665
 */
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   666
void SlList(void *list, SLRefType conv)
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   667
{
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   668
	/* Automatically calculate the length? */
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   669
	if (_sl.need_length != NL_NONE) {
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   670
		SlSetLength(SlCalcListLen(list));
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   671
		/* Determine length only? */
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   672
		if (_sl.need_length == NL_CALCLENGTH) return;
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   673
	}
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   674
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   675
	std::list<void *> *l = (std::list<void *> *) list;
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   676
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   677
	if (_sl.save) {
7054
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   678
		SlWriteUint32(l->size());
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   679
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   680
		std::list<void *>::iterator iter;
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   681
		for (iter = l->begin(); iter != l->end(); ++iter) {
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   682
			void *ptr = *iter;
7054
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   683
			SlWriteUint32(ReferenceToInt(ptr, conv));
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   684
		}
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   685
	} else {
7054
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   686
		uint length = CheckSavegameVersion(69) ? SlReadUint16() : SlReadUint32();
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   687
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   688
		/* Load each reference and push to the end of the list */
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   689
		for (uint i = 0; i < length; i++) {
7054
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   690
			void *ptr = IntToReference(CheckSavegameVersion(69) ? SlReadUint16() : SlReadUint32(), conv);
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   691
			l->push_back(ptr);
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   692
		}
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   693
	}
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   694
}
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   695
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   696
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   697
/** Are we going to save this object or not? */
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   698
static inline bool SlIsObjectValidInSavegame(const SaveLoad *sld)
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   699
{
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   700
	if (_sl_version < sld->version_from || _sl_version > sld->version_to) return false;
3117
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   701
	if (sld->conv & SLF_SAVE_NO) return false;
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   702
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   703
	return true;
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   704
}
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   705
3117
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   706
/** Are we going to load this variable when loading a savegame or not?
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   707
 * @note If the variable is skipped it is skipped in the savegame
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   708
 * bytestream itself as well, so there is no need to skip it somewhere else */
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   709
static inline bool SlSkipVariableOnLoad(const SaveLoad *sld)
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   710
{
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   711
	if ((sld->conv & SLF_NETWORK_NO) && !_sl.save && _networking && !_network_server) {
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   712
		SlSkipBytes(SlCalcConvMemLen(sld->conv) * sld->length);
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   713
		return true;
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   714
	}
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   715
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   716
	return false;
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   717
}
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   718
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   719
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   720
 * Calculate the size of an object.
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6333
diff changeset
   721
 * @param object to be measured
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   722
 * @param sld The SaveLoad description of the object so we know how to manipulate it
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6333
diff changeset
   723
 * @return size of given objetc
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   724
 */
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   725
static size_t SlCalcObjLength(const void *object, const SaveLoad *sld)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   726
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   727
	size_t length = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   728
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   729
	/* Need to determine the length and write a length tag. */
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   730
	for (; sld->cmd != SL_END; sld++) {
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   731
		length += SlCalcObjMemberLength(object, sld);
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   732
	}
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   733
	return length;
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   734
}
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   735
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   736
size_t SlCalcObjMemberLength(const void *object, const SaveLoad *sld)
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   737
{
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   738
	assert(_sl.save);
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   739
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   740
	switch (sld->cmd) {
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   741
		case SL_VAR:
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   742
		case SL_REF:
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   743
		case SL_ARR:
3048
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   744
		case SL_STR:
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   745
		case SL_LST:
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   746
			/* CONDITIONAL saveload types depend on the savegame version */
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   747
			if (!SlIsObjectValidInSavegame(sld)) break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   748
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   749
			switch (sld->cmd) {
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   750
			case SL_VAR: return SlCalcConvFileLen(sld->conv);
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   751
			case SL_REF: return SlCalcRefLen();
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   752
			case SL_ARR: return SlCalcArrayLen(sld->length, sld->conv);
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   753
			case SL_STR: return SlCalcStringLen(GetVariableAddress(object, sld), sld->length, sld->conv);
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   754
			case SL_LST: return SlCalcListLen(GetVariableAddress(object, sld));
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   755
			default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   756
			}
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   757
			break;
6817
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   758
		case SL_WRITEBYTE: return 1; // a byte is logically of size 1
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   759
		case SL_INCLUDE: return SlCalcObjLength(object, _sl.includes[sld->version_from]);
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   760
		default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   761
	}
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   762
	return 0;
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   763
}
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   764
4039
c4dcd5834f6b (svn r5307) Remove two unnecessary indirections which used function pointers instead of directly calling the functions
tron
parents: 4016
diff changeset
   765
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   766
bool SlObjectMember(void *ptr, const SaveLoad *sld)
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   767
{
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   768
	VarType conv = GB(sld->conv, 0, 8);
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   769
	switch (sld->cmd) {
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   770
	case SL_VAR:
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   771
	case SL_REF:
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   772
	case SL_ARR:
3048
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   773
	case SL_STR:
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   774
	case SL_LST:
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   775
		/* CONDITIONAL saveload types depend on the savegame version */
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   776
		if (!SlIsObjectValidInSavegame(sld)) return false;
3117
4c9e8842598e (svn r3721) - [3/4] Present the game with a unified structure for the configuration-ini, saveload, console and gui representations of the settings. From part 3 on, OpenTTD is once again compilable.
Darkvater
parents: 3112
diff changeset
   777
		if (SlSkipVariableOnLoad(sld)) return false;
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   778
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   779
		switch (sld->cmd) {
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   780
		case SL_VAR: SlSaveLoadConv(ptr, conv); break;
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   781
		case SL_REF: // Reference variable, translate
7054
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   782
			if (_sl.save) {
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   783
				SlWriteUint32(ReferenceToInt(*(void**)ptr, (SLRefType)conv));
4039
c4dcd5834f6b (svn r5307) Remove two unnecessary indirections which used function pointers instead of directly calling the functions
tron
parents: 4016
diff changeset
   784
			} else {
7054
780add6d508b (svn r10319) -Fix (r10266): the limit of 65535 references was not enough for cargo packets. Increase this limit to approximately 2^32, which noone should ever be able to reach on any normal system ;)
rubidium
parents: 7036
diff changeset
   785
				*(void**)ptr = IntToReference(CheckSavegameVersion(69) ? SlReadUint16() : SlReadUint32(), (SLRefType)conv);
4039
c4dcd5834f6b (svn r5307) Remove two unnecessary indirections which used function pointers instead of directly calling the functions
tron
parents: 4016
diff changeset
   786
			}
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   787
			break;
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   788
		case SL_ARR: SlArray(ptr, sld->length, conv); break;
3048
adf46229d390 (svn r3628) - Add BOOL and STRING types to saveload capabilities. String is unused up till now and it saves the full-buffer, regardless of how many characters the string actually has. So give a warning for that and figure it out later.
Darkvater
parents: 3046
diff changeset
   789
		case SL_STR: SlString(ptr, sld->length, conv); break;
6499
e46cf40d8743 (svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents: 6491
diff changeset
   790
		case SL_LST: SlList(ptr, (SLRefType)conv); break;
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   791
		default: NOT_REACHED();
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   792
		}
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   793
		break;
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   794
6817
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   795
	/* SL_WRITEBYTE translates a value of a variable to another one upon
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   796
	 * saving or loading.
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   797
	 * XXX - variable renaming abuse
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   798
	 * game_value: the value of the variable ingame is abused by sld->version_from
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   799
	 * file_value: the value of the variable in the savegame is abused by sld->version_to */
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   800
	case SL_WRITEBYTE:
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   801
		if (_sl.save) {
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   802
			SlWriteByte(sld->version_to);
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   803
		} else {
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   804
			*(byte*)ptr = sld->version_from;
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   805
		}
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   806
		break;
ca1cc2fd4cfa (svn r10056) -Revert (r10049): removing SLE_WRITEBYTE didn't work as expected :(. Somehow SlIterateArray and SlObject depend on eachother and adding a some arbitrary data before the SlObject makes it go crazy.
rubidium
parents: 6810
diff changeset
   807
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   808
	/* SL_INCLUDE loads common code for a type
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   809
	 * XXX - variable renaming abuse
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   810
	 * include_index: common code to include from _desc_includes[], abused by sld->version_from */
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   811
	case SL_INCLUDE:
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   812
		SlObject(ptr, _sl.includes[sld->version_from]);
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   813
		break;
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   814
	default: NOT_REACHED();
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   815
	}
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   816
	return true;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   817
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   818
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   819
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   820
 * Main SaveLoad function.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   821
 * @param object The object that is being saved or loaded
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   822
 * @param sld The SaveLoad description of the object so we know how to manipulate it
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   823
 */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   824
void SlObject(void *object, const SaveLoad *sld)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   825
{
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   826
	/* Automatically calculate the length? */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   827
	if (_sl.need_length != NL_NONE) {
5142
ee34e9968a62 (svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents: 5141
diff changeset
   828
		SlSetLength(SlCalcObjLength(object, sld));
3044
fbaef2401476 (svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents: 3043
diff changeset
   829
		if (_sl.need_length == NL_CALCLENGTH) return;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   830
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   831
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   832
	for (; sld->cmd != SL_END; sld++) {
7010
6f0d9f03180d (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 6980
diff changeset
   833
		void *ptr = sld->global ? sld->address : GetVariableAddress(object, sld);
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   834
		SlObjectMember(ptr, sld);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   835
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   836
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   837
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   838
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   839
 * Save or Load (a list of) global variables
6420
456c275f3313 (svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents: 6333
diff changeset
   840
 * @param sldg The global variable that is being loaded or saved
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   841
 */
3046
baa216f9911a (svn r3626) - Merge the SlGlobVarList (global variables) and SaveLoad (offset in struct, variable determined runtime) structs. The only difference between these two is the last element that either holds the address or the offset in the struct. Which one to take is determined by which function is called; SlObject or SlGlobList.
Darkvater
parents: 3044
diff changeset
   842
void SlGlobList(const SaveLoadGlobVarList *sldg)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   843
{
7010
6f0d9f03180d (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 6980
diff changeset
   844
	SlObject(NULL, (const SaveLoad*)sldg);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   845
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   846
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   847
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   848
 * Do something of which I have no idea what it is :P
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   849
 * @param proc The callback procedure that is called
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   850
 * @param arg The variable that will be used for the callback procedure
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   851
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   852
void SlAutolength(AutolengthProc *proc, void *arg)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   853
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   854
	uint32 offs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   855
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   856
	assert(_sl.save);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   857
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   858
	/* Tell it to calculate the length */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   859
	_sl.need_length = NL_CALCLENGTH;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   860
	_sl.obj_len = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   861
	proc(arg);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   862
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   863
	/* Setup length */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   864
	_sl.need_length = NL_WANTLENGTH;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   865
	SlSetLength(_sl.obj_len);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   866
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   867
	offs = SlGetOffs() + _sl.obj_len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   868
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   869
	/* And write the stuff */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   870
	proc(arg);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   871
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
   872
	if (offs != SlGetOffs()) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Invalid chunk size");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   873
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   874
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   875
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   876
 * Load a chunk of data (eg vehicles, stations, etc.)
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   877
 * @param ch The chunkhandler that will be used for the operation
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   878
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   879
static void SlLoadChunk(const ChunkHandler *ch)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   880
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   881
	byte m = SlReadByte();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   882
	size_t len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   883
	uint32 endoffs;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   884
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   885
	_sl.block_mode = m;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   886
	_sl.obj_len = 0;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
   887
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   888
	switch (m) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   889
	case CH_ARRAY:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   890
		_sl.array_index = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   891
		ch->load_proc();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   892
		break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   893
	case CH_SPARSE_ARRAY:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   894
		ch->load_proc();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   895
		break;
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   896
	default:
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   897
		if ((m & 0xF) == CH_RIFF) {
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   898
			/* Read length */
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   899
			len = (SlReadByte() << 16) | ((m >> 4) << 24);
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   900
			len += SlReadUint16();
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   901
			_sl.obj_len = len;
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   902
			endoffs = SlGetOffs() + len;
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   903
			ch->load_proc();
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
   904
			if (SlGetOffs() != endoffs) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Invalid chunk size");
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   905
		} else {
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
   906
			SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Invalid chunk type");
2041
2210f5c42cc8 (svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents: 2026
diff changeset
   907
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   908
		break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   909
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   910
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   911
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   912
/* Stub Chunk handlers to only calculate length and do nothing else */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   913
static ChunkSaveLoadProc *_tmp_proc_1;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   914
static inline void SlStubSaveProc2(void *arg) {_tmp_proc_1();}
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   915
static void SlStubSaveProc() {SlAutolength(SlStubSaveProc2, NULL);}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   916
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   917
/** Save a chunk of data (eg. vehicles, stations, etc.). Each chunk is
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   918
 * prefixed by an ID identifying it, followed by data, and terminator where appropiate
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   919
 * @param ch The chunkhandler that will be used for the operation
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   920
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   921
static void SlSaveChunk(const ChunkHandler *ch)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   922
{
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   923
	ChunkSaveLoadProc *proc = ch->save_proc;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   924
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   925
	SlWriteUint32(ch->id);
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5296
diff changeset
   926
	DEBUG(sl, 2, "Saving chunk %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   927
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   928
	if (ch->flags & CH_AUTO_LENGTH) {
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   929
		/* Need to calculate the length. Solve that by calling SlAutoLength in the save_proc. */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   930
		_tmp_proc_1 = proc;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   931
		proc = SlStubSaveProc;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   932
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
   933
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   934
	_sl.block_mode = ch->flags & CH_TYPE_MASK;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   935
	switch (ch->flags & CH_TYPE_MASK) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   936
	case CH_RIFF:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   937
		_sl.need_length = NL_WANTLENGTH;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   938
		proc();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   939
		break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   940
	case CH_ARRAY:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   941
		_sl.last_array_index = 0;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   942
		SlWriteByte(CH_ARRAY);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   943
		proc();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   944
		SlWriteArrayLength(0); // Terminate arrays
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   945
		break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   946
	case CH_SPARSE_ARRAY:
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   947
		SlWriteByte(CH_SPARSE_ARRAY);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   948
		proc();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   949
		SlWriteArrayLength(0); // Terminate arrays
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   950
		break;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   951
	default: NOT_REACHED();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   952
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   953
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   954
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   955
/** Save all chunks */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   956
static void SlSaveChunks()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   957
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   958
	const ChunkHandler *ch;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   959
	const ChunkHandler* const *chsc;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   960
	uint p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   961
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   962
	for (p = 0; p != CH_NUM_PRI_LEVELS; p++) {
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   963
		for (chsc = _sl.chs; (ch = *chsc++) != NULL;) {
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   964
			while (true) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   965
				if (((ch->flags >> CH_PRI_SHL) & (CH_NUM_PRI_LEVELS - 1)) == p)
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
   966
					SlSaveChunk(ch);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   967
				if (ch->flags & CH_LAST)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   968
					break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   969
				ch++;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   970
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   971
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   972
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   973
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
   974
	/* Terminator */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   975
	SlWriteUint32(0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   976
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   977
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   978
/** Find the ChunkHandler that will be used for processing the found
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   979
 * chunk in the savegame or in memory
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   980
 * @param id the chunk in question
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   981
 * @return returns the appropiate chunkhandler
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   982
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   983
static const ChunkHandler *SlFindChunkHandler(uint32 id)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   984
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   985
	const ChunkHandler *ch;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   986
	const ChunkHandler *const *chsc;
6491
00dc414c909d (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6486
diff changeset
   987
	for (chsc = _sl.chs; (ch = *chsc++) != NULL;) {
2952
58522ed8f0f1 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2927
diff changeset
   988
		for (;;) {
58522ed8f0f1 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2927
diff changeset
   989
			if (ch->id == id) return ch;
58522ed8f0f1 (svn r3511) More whitespace ([FS#46] by Rubidium)
tron
parents: 2927
diff changeset
   990
			if (ch->flags & CH_LAST) break;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   991
			ch++;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   992
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   993
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   994
	return NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   995
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   996
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
   997
/** Load all chunks */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
   998
static void SlLoadChunks()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
   999
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1000
	uint32 id;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1001
	const ChunkHandler *ch;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1002
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1003
	for (id = SlReadUint32(); id != 0; id = SlReadUint32()) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5296
diff changeset
  1004
		DEBUG(sl, 2, "Loading chunk %c%c%c%c", id >> 24, id >> 16, id >> 8, id);
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1005
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1006
		ch = SlFindChunkHandler(id);
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1007
		if (ch == NULL) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Unknown chunk type");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1008
		SlLoadChunk(ch);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1009
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1010
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1011
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1012
/*******************************************
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1013
 ********** START OF LZO CODE **************
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1014
 *******************************************/
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1015
#define LZO_SIZE 8192
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1016
781
4c9177888196 (svn r1248) -Add: initial OS/2 support (read docs/ReadMe_OS2.txt) (orudge)
truelight
parents: 762
diff changeset
  1017
#include "minilzo.h"
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1018
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1019
static uint ReadLZO()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1020
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1021
	byte out[LZO_SIZE + LZO_SIZE / 64 + 16 + 3 + 8];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1022
	uint32 tmp[2];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1023
	uint32 size;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1024
	uint len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1025
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1026
	/* Read header*/
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1027
	if (fread(tmp, sizeof(tmp), 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE, "File read failed");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1028
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1029
	/* Check if size is bad */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1030
	((uint32*)out)[0] = size = tmp[1];
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1031
2295
95e8858e9938 (svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents: 2293
diff changeset
  1032
	if (_sl_version != 0) {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1033
		tmp[0] = TO_BE32(tmp[0]);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1034
		size = TO_BE32(size);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1035
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1036
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1037
	if (size >= sizeof(out)) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Inconsistent size");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1038
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1039
	/* Read block */
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1040
	if (fread(out + sizeof(uint32), size, 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1041
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1042
	/* Verify checksum */
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1043
	if (tmp[0] != lzo_adler32(0, out, size + sizeof(uint32))) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME, "Bad checksum");
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1044
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1045
	/* Decompress */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1046
	lzo1x_decompress(out + sizeof(uint32)*1, size, _sl.buf, &len, NULL);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1047
	return len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1048
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1049
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1050
/* p contains the pointer to the buffer, len contains the pointer to the length.
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1051
 * len bytes will be written, p and l will be updated to reflect the next buffer. */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1052
static void WriteLZO(uint size)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1053
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1054
	byte out[LZO_SIZE + LZO_SIZE / 64 + 16 + 3 + 8];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1055
	byte wrkmem[sizeof(byte*)*4096];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1056
	uint outlen;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1057
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1058
	lzo1x_1_compress(_sl.buf, size, out + sizeof(uint32)*2, &outlen, wrkmem);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1059
	((uint32*)out)[1] = TO_BE32(outlen);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1060
	((uint32*)out)[0] = TO_BE32(lzo_adler32(0, out + sizeof(uint32), outlen + sizeof(uint32)));
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1061
	if (fwrite(out, outlen + sizeof(uint32)*2, 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1062
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1063
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1064
static bool InitLZO()
1093
4fdc46eaf423 (svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents: 1024
diff changeset
  1065
{
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1066
	_sl.bufsize = LZO_SIZE;
2414
cc0904ef2d0d (svn r2940) (Internal) Remove the need for the 'tmp' variable for _sl.buf, instead operate on _sl.buf_ori which is not changed for init/deinit.
Darkvater
parents: 2413
diff changeset
  1067
	_sl.buf = _sl.buf_ori = (byte*)malloc(LZO_SIZE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1068
	return true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1069
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1070
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1071
static void UninitLZO()
1093
4fdc46eaf423 (svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents: 1024
diff changeset
  1072
{
2414
cc0904ef2d0d (svn r2940) (Internal) Remove the need for the 'tmp' variable for _sl.buf, instead operate on _sl.buf_ori which is not changed for init/deinit.
Darkvater
parents: 2413
diff changeset
  1073
	free(_sl.buf_ori);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1074
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1075
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1076
/*********************************************
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1077
 ******** START OF NOCOMP CODE (uncompressed)*
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1078
 *********************************************/
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1079
static uint ReadNoComp()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1080
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1081
	return fread(_sl.buf, 1, LZO_SIZE, _sl.fh);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1082
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1083
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1084
static void WriteNoComp(uint size)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1085
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1086
	fwrite(_sl.buf, 1, size, _sl.fh);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1087
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1088
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1089
static bool InitNoComp()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1090
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1091
	_sl.bufsize = LZO_SIZE;
6491
00dc414c909d (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6486
diff changeset
  1092
	_sl.buf = _sl.buf_ori = (byte*)malloc(LZO_SIZE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1093
	return true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1094
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1095
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1096
static void UninitNoComp()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1097
{
2414
cc0904ef2d0d (svn r2940) (Internal) Remove the need for the 'tmp' variable for _sl.buf, instead operate on _sl.buf_ori which is not changed for init/deinit.
Darkvater
parents: 2413
diff changeset
  1098
	free(_sl.buf_ori);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1099
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1100
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1101
/********************************************
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1102
 ********** START OF MEMORY CODE (in ram)****
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1103
 ********************************************/
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1104
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1105
#include "table/sprites.h"
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1106
#include "gfx.h"
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1107
#include "gui.h"
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1108
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
  1109
struct ThreadedSave {
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1110
	uint count;
5719
2bb88fe71d01 (svn r8214) -Fix (r8038): The fast forward flag stores 2 bits, not 1. Remember the
peter1138
parents: 5705
diff changeset
  1111
	byte ff_state;
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1112
	bool saveinprogress;
1914
2b4b3c3a95b4 (svn r2420) - Codechange: magic number elminitation of cursorsprites.
Darkvater
parents: 1913
diff changeset
  1113
	CursorID cursor;
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
  1114
};
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1115
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1116
/* A maximum size of of 128K * 500 = 64.000KB savegames */
5216
8bd14ee39af2 (svn r7331) - Codechange: Rename all memory pool macro's and types to "old pool", so the new pool implementation can be committed alongside it.
matthijs
parents: 5211
diff changeset
  1117
STATIC_OLD_POOL(Savegame, byte, 17, 500, NULL, NULL)
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1118
static ThreadedSave _ts;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1119
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1120
static bool InitMem()
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1121
{
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1122
	_ts.count = 0;
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1123
4985
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1124
	CleanPool(&_Savegame_pool);
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1125
	AddBlockToPool(&_Savegame_pool);
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1126
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1127
	/* A block from the pool is a contigious area of memory, so it is safe to write to it sequentially */
4985
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1128
	_sl.bufsize = GetSavegamePoolSize();
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1129
	_sl.buf = GetSavegame(_ts.count);
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1130
	return true;
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1131
}
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1132
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1133
static void UnInitMem()
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1134
{
4985
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1135
	CleanPool(&_Savegame_pool);
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1136
}
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1137
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1138
static void WriteMem(uint size)
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1139
{
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1140
	_ts.count += size;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1141
	/* Allocate new block and new buffer-pointer */
4985
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1142
	AddBlockIfNeeded(&_Savegame_pool, _ts.count);
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1143
	_sl.buf = GetSavegame(_ts.count);
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1144
}
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1145
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1146
/********************************************
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1147
 ********** START OF ZLIB CODE **************
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1148
 ********************************************/
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1149
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1150
#if defined(WITH_ZLIB)
2694
9b5f6f369ab3 (svn r3236) - Fix: warnings about 'CDECL must be used with ...' on VS6
Darkvater
parents: 2685
diff changeset
  1151
#include <zlib.h>
2138
44ab9e23c669 (svn r2648) Only use _stdcall calling convention for zlib on win32/msvc.
ludde
parents: 2126
diff changeset
  1152
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1153
static z_stream _z;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1154
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1155
static bool InitReadZlib()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1156
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1157
	memset(&_z, 0, sizeof(_z));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1158
	if (inflateInit(&_z) != Z_OK) return false;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1159
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1160
	_sl.bufsize = 4096;
2414
cc0904ef2d0d (svn r2940) (Internal) Remove the need for the 'tmp' variable for _sl.buf, instead operate on _sl.buf_ori which is not changed for init/deinit.
Darkvater
parents: 2413
diff changeset
  1161
	_sl.buf = _sl.buf_ori = (byte*)malloc(4096 + 4096); // also contains fread buffer
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1162
	return true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1163
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1164
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1165
static uint ReadZlib()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1166
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1167
	int r;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1168
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1169
	_z.next_out = _sl.buf;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1170
	_z.avail_out = 4096;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1171
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1172
	do {
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1173
		/* read more bytes from the file?*/
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1174
		if (_z.avail_in == 0) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1175
			_z.avail_in = fread(_z.next_in = _sl.buf + 4096, 1, 4096, _sl.fh);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1176
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1177
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1178
		/* inflate the data */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1179
		r = inflate(&_z, 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1180
		if (r == Z_STREAM_END)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1181
			break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1182
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1183
		if (r != Z_OK) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "inflate() failed");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1184
	} while (_z.avail_out);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1185
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1186
	return 4096 - _z.avail_out;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1187
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1188
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1189
static void UninitReadZlib()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1190
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1191
	inflateEnd(&_z);
2414
cc0904ef2d0d (svn r2940) (Internal) Remove the need for the 'tmp' variable for _sl.buf, instead operate on _sl.buf_ori which is not changed for init/deinit.
Darkvater
parents: 2413
diff changeset
  1192
	free(_sl.buf_ori);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1193
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1194
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1195
static bool InitWriteZlib()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1196
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1197
	memset(&_z, 0, sizeof(_z));
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1198
	if (deflateInit(&_z, 6) != Z_OK) return false;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1199
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1200
	_sl.bufsize = 4096;
2414
cc0904ef2d0d (svn r2940) (Internal) Remove the need for the 'tmp' variable for _sl.buf, instead operate on _sl.buf_ori which is not changed for init/deinit.
Darkvater
parents: 2413
diff changeset
  1201
	_sl.buf = _sl.buf_ori = (byte*)malloc(4096); // also contains fread buffer
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1202
	return true;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1203
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1204
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1205
static void WriteZlibLoop(z_streamp z, byte *p, uint len, int mode)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1206
{
1884
804ff5f94ed0 (svn r2390) - Codechange: Fix some warnings on GCC 4.0.0
hackykid
parents: 1881
diff changeset
  1207
	byte buf[1024]; // output buffer
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1208
	int r;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1209
	uint n;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1210
	z->next_in = p;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1211
	z->avail_in = len;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1212
	do {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1213
		z->next_out = buf;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1214
		z->avail_out = sizeof(buf);
2026
567e3bc9af72 (svn r2535) Tabs
tron
parents: 1993
diff changeset
  1215
		r = deflate(z, mode);
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1216
			/* bytes were emitted? */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1217
		if ((n=sizeof(buf) - z->avail_out) != 0) {
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1218
			if (fwrite(buf, n, 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1219
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1220
		if (r == Z_STREAM_END)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1221
			break;
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1222
		if (r != Z_OK) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "zlib returned error code");
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1223
	} while (z->avail_in || !z->avail_out);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1224
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1225
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1226
static void WriteZlib(uint len)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1227
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1228
	WriteZlibLoop(&_z, _sl.buf, len, 0);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1229
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1230
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1231
static void UninitWriteZlib()
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1232
{
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1233
	/* flush any pending output. */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1234
	if (_sl.fh) WriteZlibLoop(&_z, NULL, 0, Z_FINISH);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1235
	deflateEnd(&_z);
2414
cc0904ef2d0d (svn r2940) (Internal) Remove the need for the 'tmp' variable for _sl.buf, instead operate on _sl.buf_ori which is not changed for init/deinit.
Darkvater
parents: 2413
diff changeset
  1236
	free(_sl.buf_ori);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1237
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1238
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1239
#endif /* WITH_ZLIB */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1240
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1241
/*******************************************
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1242
 ************* END OF CODE *****************
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1243
 *******************************************/
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1244
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1245
/* these define the chunks */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1246
extern const ChunkHandler _misc_chunk_handlers[];
3112
a6fda4d4c7ca (svn r3716) - Move the option settings (_game_opt_desc) from misc.c into settings.c. This will be merged with SettingDesc misc_settings above as they are actually the same. No functionality has changed beside the fact that the settings are now in a different Chunkhandler.
Darkvater
parents: 3109
diff changeset
  1247
extern const ChunkHandler _setting_chunk_handlers[];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1248
extern const ChunkHandler _player_chunk_handlers[];
2848
8f57563f8ddf (svn r3396) - Autoreplace changes:
peter1138
parents: 2828
diff changeset
  1249
extern const ChunkHandler _engine_chunk_handlers[];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1250
extern const ChunkHandler _veh_chunk_handlers[];
1542
62a03537ad0b (svn r2046) -Codechange: moved all waypoint code to waypoint.c/waypoint.h
truelight
parents: 1537
diff changeset
  1251
extern const ChunkHandler _waypoint_chunk_handlers[];
1313
f1013ec3d318 (svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents: 1299
diff changeset
  1252
extern const ChunkHandler _depot_chunk_handlers[];
1024
5e446b5b3ec5 (svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents: 950
diff changeset
  1253
extern const ChunkHandler _order_chunk_handlers[];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1254
extern const ChunkHandler _town_chunk_handlers[];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1255
extern const ChunkHandler _sign_chunk_handlers[];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1256
extern const ChunkHandler _station_chunk_handlers[];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1257
extern const ChunkHandler _industry_chunk_handlers[];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1258
extern const ChunkHandler _economy_chunk_handlers[];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1259
extern const ChunkHandler _animated_tile_chunk_handlers[];
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5216
diff changeset
  1260
extern const ChunkHandler _newgrf_chunk_handlers[];
6643
f81bee57bc09 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6571
diff changeset
  1261
extern const ChunkHandler _group_chunk_handlers[];
7010
6f0d9f03180d (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 6980
diff changeset
  1262
extern const ChunkHandler _cargopacket_chunk_handlers[];
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1263
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1264
static const ChunkHandler * const _chunk_handlers[] = {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1265
	_misc_chunk_handlers,
3112
a6fda4d4c7ca (svn r3716) - Move the option settings (_game_opt_desc) from misc.c into settings.c. This will be merged with SettingDesc misc_settings above as they are actually the same. No functionality has changed beside the fact that the settings are now in a different Chunkhandler.
Darkvater
parents: 3109
diff changeset
  1266
	_setting_chunk_handlers,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1267
	_veh_chunk_handlers,
1542
62a03537ad0b (svn r2046) -Codechange: moved all waypoint code to waypoint.c/waypoint.h
truelight
parents: 1537
diff changeset
  1268
	_waypoint_chunk_handlers,
1313
f1013ec3d318 (svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents: 1299
diff changeset
  1269
	_depot_chunk_handlers,
1024
5e446b5b3ec5 (svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents: 950
diff changeset
  1270
	_order_chunk_handlers,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1271
	_industry_chunk_handlers,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1272
	_economy_chunk_handlers,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1273
	_engine_chunk_handlers,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1274
	_town_chunk_handlers,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1275
	_sign_chunk_handlers,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1276
	_station_chunk_handlers,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1277
	_player_chunk_handlers,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1278
	_animated_tile_chunk_handlers,
5228
26dc9acf7d94 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5216
diff changeset
  1279
	_newgrf_chunk_handlers,
6643
f81bee57bc09 (svn r9874) -Feature: advanced vehicle lists a.k.a. group interface. Now you can make groups of vehicles and perform all kinds of tasks on that given group. Original code by nycom and graphics by skidd13.
rubidium
parents: 6571
diff changeset
  1280
	_group_chunk_handlers,
7010
6f0d9f03180d (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 6980
diff changeset
  1281
	_cargopacket_chunk_handlers,
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1282
	NULL,
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1283
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1284
6118
e7d7787afb9b (svn r8854) -Fix(r8853): Ctrl+s (save) without Ctrl does not produce desired result...
belugas
parents: 6117
diff changeset
  1285
/* used to include a vehicle desc in another desc. */
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1286
extern const SaveLoad _common_veh_desc[];
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1287
static const SaveLoad* const _desc_includes[] = {
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1288
	_common_veh_desc
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1289
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1290
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1291
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1292
 * Pointers cannot be saved to a savegame, so this functions gets
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1293
 * the index of the item, and if not available, it hussles with
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1294
 * pointers (looks really bad :()
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1295
 * Remember that a NULL item has value 0, and all
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1296
 * indeces have +1, so vehicle 0 is saved as index 1.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1297
 * @param obj The object that we want to get the index of
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1298
 * @param rt SLRefType type of the object the index is being sought of
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1299
 * @return Return the pointer converted to an index of the type pointed to
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1300
 */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1301
static uint ReferenceToInt(const void *obj, SLRefType rt)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1302
{
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1303
	if (obj == NULL) return 0;
938
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1304
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1305
	switch (rt) {
938
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1306
		case REF_VEHICLE_OLD: // Old vehicles we save as new onces
2548
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2482
diff changeset
  1307
		case REF_VEHICLE:   return ((const  Vehicle*)obj)->index + 1;
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2482
diff changeset
  1308
		case REF_STATION:   return ((const  Station*)obj)->index + 1;
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2482
diff changeset
  1309
		case REF_TOWN:      return ((const     Town*)obj)->index + 1;
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2482
diff changeset
  1310
		case REF_ORDER:     return ((const    Order*)obj)->index + 1;
49c8a096033f (svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents: 2482
diff changeset
  1311
		case REF_ROADSTOPS: return ((const RoadStop*)obj)->index + 1;
2848
8f57563f8ddf (svn r3396) - Autoreplace changes:
peter1138
parents: 2828
diff changeset
  1312
		case REF_ENGINE_RENEWS: return ((const EngineRenew*)obj)->index + 1;
7010
6f0d9f03180d (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 6980
diff changeset
  1313
		case REF_CARGO_PACKET:  return ((const CargoPacket*)obj)->index + 1;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1314
		default: NOT_REACHED();
938
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1315
	}
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1316
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1317
	return 0; // avoid compiler warning
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1318
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1319
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1320
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1321
 * Pointers cannot be loaded from a savegame, so this function
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1322
 * gets the index from the savegame and returns the appropiate
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1323
 * pointer from the already loaded base.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1324
 * Remember that an index of 0 is a NULL pointer so all indeces
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1325
 * are +1 so vehicle 0 is saved as 1.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1326
 * @param index The index that is being converted to a pointer
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1327
 * @param rt SLRefType type of the object the pointer is sought of
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1328
 * @return Return the index converted to a pointer of any type
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1329
 */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1330
static void *IntToReference(uint index, SLRefType rt)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1331
{
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1332
	/* After version 4.3 REF_VEHICLE_OLD is saved as REF_VEHICLE,
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1333
	 * and should be loaded like that */
2685
805a28b7c3b7 (svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents: 2676
diff changeset
  1334
	if (rt == REF_VEHICLE_OLD && !CheckSavegameVersionOldStyle(4, 4))
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1335
		rt = REF_VEHICLE;
938
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1336
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1337
	/* No need to look up NULL pointers, just return immediately */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1338
	if (rt != REF_VEHICLE_OLD && index == 0)
938
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1339
		return NULL;
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1340
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1341
	index--; // correct for the NULL index
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1342
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1343
	switch (rt) {
1314
10c3417e9c22 (svn r1818) -Add: Dynamic orders (up to 64k orders)
truelight
parents: 1313
diff changeset
  1344
		case REF_ORDER: {
4977
c5dd04c706bc (svn r6980) Use the pool macros for the Order pool
tron
parents: 4974
diff changeset
  1345
			if (!AddBlockIfNeeded(&_Order_pool, index))
1314
10c3417e9c22 (svn r1818) -Add: Dynamic orders (up to 64k orders)
truelight
parents: 1313
diff changeset
  1346
				error("Orders: failed loading savegame: too many orders");
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1347
			return GetOrder(index);
1314
10c3417e9c22 (svn r1818) -Add: Dynamic orders (up to 64k orders)
truelight
parents: 1313
diff changeset
  1348
		}
1279
bc761aad52b3 (svn r1783) -Add: Dynamic vehicles (now up to 64k of vehicles)
truelight
parents: 1272
diff changeset
  1349
		case REF_VEHICLE: {
4972
c7f92c6b74e4 (svn r6975) Use the pool macros for the Vehicle pool
tron
parents: 4712
diff changeset
  1350
			if (!AddBlockIfNeeded(&_Vehicle_pool, index))
1279
bc761aad52b3 (svn r1783) -Add: Dynamic vehicles (now up to 64k of vehicles)
truelight
parents: 1272
diff changeset
  1351
				error("Vehicles: failed loading savegame: too many vehicles");
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1352
			return GetVehicle(index);
1279
bc761aad52b3 (svn r1783) -Add: Dynamic vehicles (now up to 64k of vehicles)
truelight
parents: 1272
diff changeset
  1353
		}
1272
9aa073c64fc7 (svn r1776) -Add: Dynamic stations. You can now have up to 64k of stations
truelight
parents: 1266
diff changeset
  1354
		case REF_STATION: {
4980
1e1cb22b3d27 (svn r6983) Use the pool macros for the Station pool
tron
parents: 4978
diff changeset
  1355
			if (!AddBlockIfNeeded(&_Station_pool, index))
1272
9aa073c64fc7 (svn r1776) -Add: Dynamic stations. You can now have up to 64k of stations
truelight
parents: 1266
diff changeset
  1356
				error("Stations: failed loading savegame: too many stations");
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1357
			return GetStation(index);
1272
9aa073c64fc7 (svn r1776) -Add: Dynamic stations. You can now have up to 64k of stations
truelight
parents: 1266
diff changeset
  1358
		}
1260
632f63689178 (svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents: 1218
diff changeset
  1359
		case REF_TOWN: {
4983
b261a5850aa1 (svn r6986) Use the pool macros for the Town pool
tron
parents: 4981
diff changeset
  1360
			if (!AddBlockIfNeeded(&_Town_pool, index))
1260
632f63689178 (svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents: 1218
diff changeset
  1361
				error("Towns: failed loading savegame: too many towns");
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1362
			return GetTown(index);
1260
632f63689178 (svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents: 1218
diff changeset
  1363
		}
1284
e1969eb0227b (svn r1788) -Add: Made RoadStops dynamic. You can now create up to 64k roadstops.
truelight
parents: 1282
diff changeset
  1364
		case REF_ROADSTOPS: {
4981
44eeee2407f4 (svn r6984) Use the pool macros for the RoadStop pool
tron
parents: 4980
diff changeset
  1365
			if (!AddBlockIfNeeded(&_RoadStop_pool, index))
1314
10c3417e9c22 (svn r1818) -Add: Dynamic orders (up to 64k orders)
truelight
parents: 1313
diff changeset
  1366
				error("RoadStops: failed loading savegame: too many RoadStops");
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1367
			return GetRoadStop(index);
1284
e1969eb0227b (svn r1788) -Add: Made RoadStops dynamic. You can now create up to 64k roadstops.
truelight
parents: 1282
diff changeset
  1368
		}
2848
8f57563f8ddf (svn r3396) - Autoreplace changes:
peter1138
parents: 2828
diff changeset
  1369
		case REF_ENGINE_RENEWS: {
4974
2b7c9ba5604c (svn r6977) Use the pool macros for the EngineRenew pool
tron
parents: 4972
diff changeset
  1370
			if (!AddBlockIfNeeded(&_EngineRenew_pool, index))
2848
8f57563f8ddf (svn r3396) - Autoreplace changes:
peter1138
parents: 2828
diff changeset
  1371
				error("EngineRenews: failed loading savegame: too many EngineRenews");
8f57563f8ddf (svn r3396) - Autoreplace changes:
peter1138
parents: 2828
diff changeset
  1372
			return GetEngineRenew(index);
8f57563f8ddf (svn r3396) - Autoreplace changes:
peter1138
parents: 2828
diff changeset
  1373
		}
7010
6f0d9f03180d (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 6980
diff changeset
  1374
		case REF_CARGO_PACKET: {
6f0d9f03180d (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 6980
diff changeset
  1375
			if (!AddBlockIfNeeded(&_CargoPacket_pool, index))
6f0d9f03180d (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 6980
diff changeset
  1376
				error("CargoPackets: failed loading savegame: too many Cargo packets");
6f0d9f03180d (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 6980
diff changeset
  1377
			return GetCargoPacket(index);
6f0d9f03180d (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 6980
diff changeset
  1378
		}
938
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1379
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1380
		case REF_VEHICLE_OLD: {
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1381
			/* Old vehicles were saved differently:
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1382
			 * invalid vehicle was 0xFFFF,
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1383
			 * and the index was not - 1.. correct for this */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1384
			index++;
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1385
			if (index == INVALID_VEHICLE)
938
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1386
				return NULL;
1279
bc761aad52b3 (svn r1783) -Add: Dynamic vehicles (now up to 64k of vehicles)
truelight
parents: 1272
diff changeset
  1387
4972
c7f92c6b74e4 (svn r6975) Use the pool macros for the Vehicle pool
tron
parents: 4712
diff changeset
  1388
			if (!AddBlockIfNeeded(&_Vehicle_pool, index))
1279
bc761aad52b3 (svn r1783) -Add: Dynamic vehicles (now up to 64k of vehicles)
truelight
parents: 1272
diff changeset
  1389
				error("Vehicles: failed loading savegame: too many vehicles");
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1390
			return GetVehicle(index);
938
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1391
		}
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1392
		default: NOT_REACHED();
938
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1393
	}
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1394
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1395
	return NULL;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1396
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1397
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1398
/** The format for a reader/writer type of a savegame */
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
  1399
struct SaveLoadFormat {
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1400
	const char *name;           ///< name of the compressor/decompressor (debug-only)
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1401
	uint32 tag;                 ///< the 4-letter tag by which it is identified in the savegame
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1402
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1403
	bool (*init_read)();        ///< function executed upon initalization of the loader
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1404
	ReaderProc *reader;         ///< function that loads the data from the file
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1405
	void (*uninit_read)();      ///< function executed when reading is finished
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1406
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1407
	bool (*init_write)();       ///< function executed upon intialization of the saver
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1408
	WriterProc *writer;         ///< function that saves the data to the file
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1409
	void (*uninit_write)();     ///< function executed when writing is done
6248
e4a2ed7e5613 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6247
diff changeset
  1410
};
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1411
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1412
static const SaveLoadFormat _saveload_formats[] = {
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1413
	{"memory", 0,                NULL,         NULL,       NULL,           InitMem,       WriteMem,    UnInitMem},
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1414
	{"lzo",    TO_BE32X('OTTD'), InitLZO,      ReadLZO,    UninitLZO,      InitLZO,       WriteLZO,    UninitLZO},
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1415
	{"none",   TO_BE32X('OTTN'), InitNoComp,   ReadNoComp, UninitNoComp,   InitNoComp,    WriteNoComp, UninitNoComp},
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1416
#if defined(WITH_ZLIB)
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1417
	{"zlib",   TO_BE32X('OTTZ'), InitReadZlib, ReadZlib,   UninitReadZlib, InitWriteZlib, WriteZlib,   UninitWriteZlib},
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1418
#else
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1419
	{"zlib",   TO_BE32X('OTTZ'), NULL,         NULL,       NULL,           NULL,          NULL,        NULL},
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1420
#endif
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1421
};
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1422
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1423
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1424
 * Return the savegameformat of the game. Whether it was create with ZLIB compression
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1425
 * uncompressed, or another type
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1426
 * @param s Name of the savegame format. If NULL it picks the first available one
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1427
 * @return Pointer to SaveLoadFormat struct giving all characteristics of this type of savegame
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1428
 */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1429
static const SaveLoadFormat *GetSavegameFormat(const char *s)
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1430
{
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1431
	const SaveLoadFormat *def = endof(_saveload_formats) - 1;
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1432
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1433
	/* find default savegame format, the highest one with which files can be written */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1434
	while (!def->init_write) def--;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1435
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1436
	if (s != NULL && s[0] != '\0') {
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1437
		const SaveLoadFormat *slf;
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1438
		for (slf = &_saveload_formats[0]; slf != endof(_saveload_formats); slf++) {
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1439
			if (slf->init_write != NULL && strcmp(s, slf->name) == 0)
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1440
				return slf;
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1441
		}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1442
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1443
		ShowInfoF("Savegame format '%s' is not available. Reverting to '%s'.", s, def->name);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1444
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1445
	return def;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1446
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1447
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1448
/* actual loader/saver function */
2828
342f02f7c0d4 (svn r3376) -Codechange: made enums for GenerateWorld and InitializeGame 'mode'
truelight
parents: 2808
diff changeset
  1449
void InitializeGame(int mode, uint size_x, uint size_y);
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1450
extern bool AfterLoadGame();
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1451
extern void BeforeSaveGame();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1452
extern bool LoadOldSaveGame(const char *file);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1453
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1454
/** Small helper function to close the to be loaded savegame an signal error */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1455
static inline SaveOrLoadResult AbortSaveLoad()
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1456
{
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1457
	if (_sl.fh != NULL) fclose(_sl.fh);
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1458
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1459
	_sl.fh = NULL;
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1460
	return SL_ERROR;
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1461
}
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1462
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1463
/** Update the gui accordingly when starting saving
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1464
 * and set locks on saveload. Also turn off fast-forward cause with that
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1465
 * saving takes Aaaaages */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1466
void SaveFileStart()
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1467
{
5719
2bb88fe71d01 (svn r8214) -Fix (r8038): The fast forward flag stores 2 bits, not 1. Remember the
peter1138
parents: 5705
diff changeset
  1468
	_ts.ff_state = _fast_forward;
2bb88fe71d01 (svn r8214) -Fix (r8038): The fast forward flag stores 2 bits, not 1. Remember the
peter1138
parents: 5705
diff changeset
  1469
	_fast_forward = 0;
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5587
diff changeset
  1470
	if (_cursor.sprite == SPR_CURSOR_MOUSE) SetMouseCursor(SPR_CURSOR_ZZZ, PAL_NONE);
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1471
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1472
	SendWindowMessage(WC_STATUS_BAR, 0, true, 0, 0);
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1473
	_ts.saveinprogress = true;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1474
}
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1475
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1476
/** Update the gui accordingly when saving is done and release locks
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1477
 * on saveload */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1478
void SaveFileDone()
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1479
{
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1480
	_fast_forward = _ts.ff_state;
5668
36b39f4a9032 (svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents: 5587
diff changeset
  1481
	if (_cursor.sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE, PAL_NONE);
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1482
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1483
	SendWindowMessage(WC_STATUS_BAR, 0, false, 0, 0);
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1484
	_ts.saveinprogress = false;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1485
}
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1486
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1487
/** Set the error message from outside of the actual loading/saving of the game (AfterLoadGame and friends) */
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1488
void SetSaveLoadError(StringID str)
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1489
{
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1490
	_sl.error_str = str;
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1491
}
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1492
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1493
/** Get the string representation of the error message */
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1494
const char *GetSaveLoadErrorString()
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1495
{
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1496
	SetDParam(0, _sl.error_str);
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1497
	SetDParamStr(1, _sl.extra_msg);
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1498
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1499
	static char err_str[512];
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1500
	GetString(err_str, _sl.save ? STR_4007_GAME_SAVE_FAILED : STR_4009_GAME_LOAD_FAILED, lastof(err_str));
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1501
	return err_str;
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1502
}
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1503
2380
392bba57462d (svn r2906) Fix some threaded saving problems. Now the thread only interfaces with the main program through a sort of mutex. Communication uses the function OTTD_SendThreadMessage() with the approiate message which is handled in ProcessSentMessage() during the main loop.
Darkvater
parents: 2337
diff changeset
  1504
/** Show a gui message when saving has failed */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1505
void SaveFileError()
2380
392bba57462d (svn r2906) Fix some threaded saving problems. Now the thread only interfaces with the main program through a sort of mutex. Communication uses the function OTTD_SendThreadMessage() with the approiate message which is handled in ProcessSentMessage() during the main loop.
Darkvater
parents: 2337
diff changeset
  1506
{
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1507
	SetDParamStr(0, GetSaveLoadErrorString());
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1508
	ShowErrorMessage(STR_012D, STR_NULL, 0, 0);
2380
392bba57462d (svn r2906) Fix some threaded saving problems. Now the thread only interfaces with the main program through a sort of mutex. Communication uses the function OTTD_SendThreadMessage() with the approiate message which is handled in ProcessSentMessage() during the main loop.
Darkvater
parents: 2337
diff changeset
  1509
	SaveFileDone();
392bba57462d (svn r2906) Fix some threaded saving problems. Now the thread only interfaces with the main program through a sort of mutex. Communication uses the function OTTD_SendThreadMessage() with the approiate message which is handled in ProcessSentMessage() during the main loop.
Darkvater
parents: 2337
diff changeset
  1510
}
392bba57462d (svn r2906) Fix some threaded saving problems. Now the thread only interfaces with the main program through a sort of mutex. Communication uses the function OTTD_SendThreadMessage() with the approiate message which is handled in ProcessSentMessage() during the main loop.
Darkvater
parents: 2337
diff changeset
  1511
4298
b926a6eaaa70 (svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents: 4257
diff changeset
  1512
static OTTDThread* save_thread;
2382
a66af7211f95 (svn r2908) If threaded saving fails or does not happen, sending subsequent messages might hang ottd. So don't send them :)
Darkvater
parents: 2380
diff changeset
  1513
4978
a5d2e71f2e2c (svn r6981) Use the pool macros for the Savegame pool
tron
parents: 4977
diff changeset
  1514
/** We have written the whole game into memory, _Savegame_pool, now find
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1515
 * and appropiate compressor and start writing to file.
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1516
 */
5705
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1517
static SaveOrLoadResult SaveFileToDisk(bool threaded)
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1518
{
2927
b59e88328e03 (svn r3483) -Fix: fixed warning about setjmp (tnx Bjarni for testing, and tnx for
truelight
parents: 2916
diff changeset
  1519
	const SaveLoadFormat *fmt;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1520
	uint32 hdr[2];
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1521
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1522
	_sl.excpt_uninit = NULL;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1523
	/* XXX - Setup setjmp error handler if an error occurs anywhere deep during
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1524
	 * loading/saving execute a longjmp() and continue execution here */
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1525
	if (setjmp(_sl.excpt)) {
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1526
		AbortSaveLoad();
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1527
		if (_sl.excpt_uninit != NULL) _sl.excpt_uninit();
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1528
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1529
		ShowInfo(GetSaveLoadErrorString());
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1530
		fprintf(stderr, GetSaveLoadErrorString());
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1531
5705
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1532
		if (threaded) {
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4059
diff changeset
  1533
			OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_ERROR);
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4059
diff changeset
  1534
		} else {
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4059
diff changeset
  1535
			SaveFileError();
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4059
diff changeset
  1536
		}
5705
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1537
		return SL_ERROR;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1538
	}
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1539
2927
b59e88328e03 (svn r3483) -Fix: fixed warning about setjmp (tnx Bjarni for testing, and tnx for
truelight
parents: 2916
diff changeset
  1540
	fmt = GetSavegameFormat(_savegame_format);
b59e88328e03 (svn r3483) -Fix: fixed warning about setjmp (tnx Bjarni for testing, and tnx for
truelight
parents: 2916
diff changeset
  1541
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1542
	/* We have written our stuff to memory, now write it to file! */
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1543
	hdr[0] = fmt->tag;
2685
805a28b7c3b7 (svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents: 2676
diff changeset
  1544
	hdr[1] = TO_BE32(SAVEGAME_VERSION << 16);
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1545
	if (fwrite(hdr, sizeof(hdr), 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE);
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1546
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1547
	if (!fmt->init_write()) SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, "cannot initialize compressor");
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1548
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1549
	{
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1550
		uint i;
4985
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1551
		uint count = 1 << Savegame_POOL_BLOCK_SIZE_BITS;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1552
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1553
		assert(_ts.count == _sl.offs_base);
4985
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1554
		for (i = 0; i != _Savegame_pool.current_blocks - 1; i++) {
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1555
			_sl.buf = _Savegame_pool.blocks[i];
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1556
			fmt->writer(count);
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1557
		}
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1558
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1559
		/* The last block is (almost) always not fully filled, so only write away
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1560
		 * as much data as it is in there */
4985
045fa9806635 (svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents: 4983
diff changeset
  1561
		_sl.buf = _Savegame_pool.blocks[i];
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1562
		fmt->writer(_ts.count - (i * count));
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1563
	}
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1564
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1565
	fmt->uninit_write();
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1566
	assert(_ts.count == _sl.offs_base);
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1567
	GetSavegameFormat("memory")->uninit_write(); // clean the memorypool
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1568
	fclose(_sl.fh);
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1569
5705
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1570
	if (threaded) OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_DONE);
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1571
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1572
	return SL_OK;
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1573
}
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1574
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1575
static void* SaveFileToDiskThread(void *arg)
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1576
{
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1577
	SaveFileToDisk(true);
2286
733dbf6b4545 (svn r2810) Threads may now return information when they terminate using a void*.
tron
parents: 2285
diff changeset
  1578
	return NULL;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1579
}
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1580
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1581
void WaitTillSaved()
2285
410dedcf46d1 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents: 2283
diff changeset
  1582
{
410dedcf46d1 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents: 2283
diff changeset
  1583
	OTTDJoinThread(save_thread);
410dedcf46d1 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents: 2283
diff changeset
  1584
	save_thread = NULL;
410dedcf46d1 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents: 2283
diff changeset
  1585
}
410dedcf46d1 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents: 2283
diff changeset
  1586
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1587
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1588
 * Main Save or Load function where the high-level saveload functions are
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1589
 * handled. It opens the savegame, selects format and checks versions
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1590
 * @param filename The name of the savegame being created/loaded
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1591
 * @param mode Save or load. Load can also be a TTD(Patch) game. Use SL_LOAD, SL_OLD_LOAD or SL_SAVE
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1592
 * @return Return the results of the action. SL_OK, SL_ERROR or SL_REINIT ("unload" the game)
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1593
 */
6929
56470c1b8a66 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 6817
diff changeset
  1594
SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1595
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1596
	uint32 hdr[2];
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1597
	const SaveLoadFormat *fmt;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1598
2413
b7bc7bb733ae (svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents: 2382
diff changeset
  1599
	/* An instance of saving is already active, so don't go saving again */
b7bc7bb733ae (svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents: 2382
diff changeset
  1600
	if (_ts.saveinprogress && mode == SL_SAVE) {
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1601
		/* if not an autosave, but a user action, show error message */
2749
c9312a4a1efe (svn r3294) - Fix: use INVALID_STRING_ID instead of -1.
Darkvater
parents: 2694
diff changeset
  1602
		if (!_do_autosave) ShowErrorMessage(INVALID_STRING_ID, STR_SAVE_STILL_IN_PROGRESS, 0, 0);
2413
b7bc7bb733ae (svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents: 2382
diff changeset
  1603
		return SL_OK;
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1604
	}
2413
b7bc7bb733ae (svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents: 2382
diff changeset
  1605
	WaitTillSaved();
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1606
7100
a4dd8e1b9f6e (svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
rubidium
parents: 7054
diff changeset
  1607
	_next_offs = 0;
a4dd8e1b9f6e (svn r10367) -Fix: do not crash horribly when the file you are trying to load is too short or decompressing it fails.
rubidium
parents: 7054
diff changeset
  1608
2413
b7bc7bb733ae (svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents: 2382
diff changeset
  1609
	/* Load a TTDLX or TTDPatch game */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1610
	if (mode == SL_OLD_LOAD) {
2828
342f02f7c0d4 (svn r3376) -Codechange: made enums for GenerateWorld and InitializeGame 'mode'
truelight
parents: 2808
diff changeset
  1611
		InitializeGame(IG_DATE_RESET, 256, 256); // set a mapsize of 256x256 for TTDPatch games or it might get confused
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1612
		if (!LoadOldSaveGame(filename)) return SL_REINIT;
2808
8ece7af41664 (svn r3356) - Remove unused parameter of AfterLoadGame().
peter1138
parents: 2749
diff changeset
  1613
		_sl_version = 0;
8ece7af41664 (svn r3356) - Remove unused parameter of AfterLoadGame().
peter1138
parents: 2749
diff changeset
  1614
		AfterLoadGame();
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1615
		return SL_OK;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1616
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1617
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1618
	/* XXX - Setup setjmp error handler if an error occurs anywhere deep during
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1619
	 * loading/saving execute a longjmp() and continue execution here */
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1620
	_sl.excpt_uninit = NULL;
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1621
	if (setjmp(_sl.excpt)) {
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1622
		AbortSaveLoad();
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1623
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1624
		/* deinitialize compressor. */
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1625
		if (_sl.excpt_uninit != NULL) _sl.excpt_uninit();
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1626
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1627
		/* Skip the "color" character */
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1628
		ShowInfoF(GetSaveLoadErrorString() + 3);
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1629
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1630
		/* A saver/loader exception!! reinitialize all variables to prevent crash! */
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1631
		return (mode == SL_LOAD) ? SL_REINIT : SL_ERROR;
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1632
	}
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1633
6929
56470c1b8a66 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 6817
diff changeset
  1634
	_sl.fh = (mode == SL_SAVE) ? FioFOpenFile(filename, "wb", sb) : FioFOpenFile(filename, "rb", sb);
6935
0a2a174d3f6a (svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents: 6929
diff changeset
  1635
0a2a174d3f6a (svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents: 6929
diff changeset
  1636
	/* Make it a little easier to load savegames from the console */
0a2a174d3f6a (svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents: 6929
diff changeset
  1637
	if (_sl.fh == NULL && mode == SL_LOAD) _sl.fh = FioFOpenFile(filename, "rb", SAVE_DIR);
0a2a174d3f6a (svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents: 6929
diff changeset
  1638
	if (_sl.fh == NULL && mode == SL_LOAD) _sl.fh = FioFOpenFile(filename, "rb", BASE_DIR);
0a2a174d3f6a (svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents: 6929
diff changeset
  1639
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1640
	if (_sl.fh == NULL) {
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1641
		SlError(mode == SL_SAVE ? STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE : STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE);
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1642
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1643
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1644
	_sl.bufe = _sl.bufp = NULL;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1645
	_sl.offs_base = 0;
5587
167d9a91ef02 (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5584
diff changeset
  1646
	_sl.save = (mode != 0);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1647
	_sl.includes = _desc_includes;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1648
	_sl.chs = _chunk_handlers;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1649
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1650
	/* General tactic is to first save the game to memory, then use an available writer
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1651
	 * to write it to file, either in threaded mode if possible, or single-threaded */
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1652
	if (mode == SL_SAVE) { /* SAVE game */
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1653
		fmt = GetSavegameFormat("memory"); // write to memory
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1654
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1655
		_sl.write_bytes = fmt->writer;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1656
		_sl.excpt_uninit = fmt->uninit_write;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1657
		if (!fmt->init_write()) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5296
diff changeset
  1658
			DEBUG(sl, 0, "Initializing writer '%s' failed.", fmt->name);
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1659
			return AbortSaveLoad();
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1660
		}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1661
2685
805a28b7c3b7 (svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents: 2676
diff changeset
  1662
		_sl_version = SAVEGAME_VERSION;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1663
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1664
		BeforeSaveGame();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1665
		SlSaveChunks();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1666
		SlWriteFill(); // flush the save buffer
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1667
4323
ae32c5fab67b (svn r5977) -Fix [FS#78]: never set I-am-a-thread bool to true IN the thread. Machines with
truelight
parents: 4300
diff changeset
  1668
		SaveFileStart();
2285
410dedcf46d1 (svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents: 2283
diff changeset
  1669
		if (_network_server ||
5705
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1670
					(save_thread = OTTDCreateThread(&SaveFileToDiskThread, NULL)) == NULL) {
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1671
			if (!_network_server) DEBUG(sl, 1, "Cannot create savegame thread, reverting to single-threaded mode...");
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1672
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1673
			SaveOrLoadResult result = SaveFileToDisk(false);
4323
ae32c5fab67b (svn r5977) -Fix [FS#78]: never set I-am-a-thread bool to true IN the thread. Machines with
truelight
parents: 4300
diff changeset
  1674
			SaveFileDone();
5705
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1675
7509e8810d5a (svn r8171) -Fix (FS#556): return SL_ERROR when unthreaded saves failed, to make sure we do not try to send zero-byte savegames.
rubidium
parents: 5683
diff changeset
  1676
			return result;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1677
		}
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1678
	} else { /* LOAD game */
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1679
		assert(mode == SL_LOAD);
7187
7c9bf9e10d8b (svn r10462) -Add: a command dumper/loader that could be enabled compile-time and server side only to aid debugging some desyncs, i.e. dump the stream of commands so it could be replayed in exactly the same way later. This should primarily be used to make desyncs more easily reproducable, so it can be properly debugged.
rubidium
parents: 7179
diff changeset
  1680
#ifdef DEBUG_DUMP_COMMANDS
7c9bf9e10d8b (svn r10462) -Add: a command dumper/loader that could be enabled compile-time and server side only to aid debugging some desyncs, i.e. dump the stream of commands so it could be replayed in exactly the same way later. This should primarily be used to make desyncs more easily reproducable, so it can be properly debugged.
rubidium
parents: 7179
diff changeset
  1681
		debug_dump_commands("ddc:load:%s\n", filename);
7c9bf9e10d8b (svn r10462) -Add: a command dumper/loader that could be enabled compile-time and server side only to aid debugging some desyncs, i.e. dump the stream of commands so it could be replayed in exactly the same way later. This should primarily be used to make desyncs more easily reproducable, so it can be properly debugged.
rubidium
parents: 7179
diff changeset
  1682
#endif /* DUMP_COMMANDS */
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1683
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1684
		if (fread(hdr, sizeof(hdr), 1, _sl.fh) != 1) SlError(STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1685
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1686
		/* see if we have any loader for this type. */
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1687
		for (fmt = _saveload_formats; ; fmt++) {
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1688
			/* No loader found, treat as version 0 and use LZO format */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1689
			if (fmt == endof(_saveload_formats)) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5296
diff changeset
  1690
				DEBUG(sl, 0, "Unknown savegame type, trying to load it as the buggy format");
6164
5c074184856f (svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents: 6163
diff changeset
  1691
#if defined(WINCE)
5c074184856f (svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents: 6163
diff changeset
  1692
				/* Of course some system had not to support rewind ;) */
5c074184856f (svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents: 6163
diff changeset
  1693
				fseek(_sl.fh, 0L, SEEK_SET);
5c074184856f (svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents: 6163
diff changeset
  1694
				clearerr(_sl.fh);
5c074184856f (svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents: 6163
diff changeset
  1695
#else
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1696
				rewind(_sl.fh);
6164
5c074184856f (svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents: 6163
diff changeset
  1697
#endif
4016
e3c8f26fb798 (svn r5229) Remove a write-only variable
glx
parents: 3977
diff changeset
  1698
				_sl_version = 0;
2685
805a28b7c3b7 (svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents: 2676
diff changeset
  1699
				_sl_minor_version = 0;
1913
0798d6f1d682 (svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents: 1891
diff changeset
  1700
				fmt = _saveload_formats + 1; // LZO
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1701
				break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1702
			}
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1703
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1704
			if (fmt->tag == hdr[0]) {
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1705
				/* check version number */
4016
e3c8f26fb798 (svn r5229) Remove a write-only variable
glx
parents: 3977
diff changeset
  1706
				_sl_version = TO_BE32(hdr[1]) >> 16;
2685
805a28b7c3b7 (svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents: 2676
diff changeset
  1707
				/* Minor is not used anymore from version 18.0, but it is still needed
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1708
				 * in versions before that (4 cases) which can't be removed easy.
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1709
				 * Therefor it is loaded, but never saved (or, it saves a 0 in any scenario).
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1710
				 * So never EVER use this minor version again. -- TrueLight -- 22-11-2005 */
2685
805a28b7c3b7 (svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents: 2676
diff changeset
  1711
				_sl_minor_version = (TO_BE32(hdr[1]) >> 8) & 0xFF;
805a28b7c3b7 (svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents: 2676
diff changeset
  1712
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5296
diff changeset
  1713
				DEBUG(sl, 1, "Loading savegame version %d", _sl_version);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 121
diff changeset
  1714
938
23cc832ac8a2 (svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents: 929
diff changeset
  1715
				/* Is the version higher than the current? */
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1716
				if (_sl_version > SAVEGAME_VERSION) SlError(STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1717
				break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1718
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1719
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1720
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1721
		_sl.read_bytes = fmt->reader;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1722
		_sl.excpt_uninit = fmt->uninit_read;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1723
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1724
		/* loader for this savegame type is not implemented? */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1725
		if (fmt->init_read == NULL) {
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1726
			char err_str[64];
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1727
			snprintf(err_str, lengthof(err_str), "Loader for '%s' is not available.", fmt->name);
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1728
			SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, err_str);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1729
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1730
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1731
		if (!fmt->init_read()) {
7036
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1732
			char err_str[64];
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1733
			snprintf(err_str, lengthof(err_str), "Initializing loader '%s' failed", fmt->name);
f1e26f21aa08 (svn r10300) -Fix [FS#917]: give a better explanation why the loading of a savegame failed and do not crash on loading savegames that were altered by patches or branches.
rubidium
parents: 7010
diff changeset
  1734
			SlError(STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR, err_str);
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1735
		}
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1736
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1737
		/* Old maps were hardcoded to 256x256 and thus did not contain
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1738
		 * any mapsize information. Pre-initialize to 256x256 to not to
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1739
		 * confuse old games */
2828
342f02f7c0d4 (svn r3376) -Codechange: made enums for GenerateWorld and InitializeGame 'mode'
truelight
parents: 2808
diff changeset
  1740
		InitializeGame(IG_DATE_RESET, 256, 256);
1218
c6a624956ac6 (svn r1722) -Feature: Bigger maps - anyone?
tron
parents: 1217
diff changeset
  1741
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1742
		SlLoadChunks();
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1743
		fmt->uninit_read();
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1744
		fclose(_sl.fh);
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1745
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1746
		/* After loading fix up savegame for any internal changes that
4549
106ed18a7675 (svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents: 4328
diff changeset
  1747
		 * might've occured since then. If it fails, load back the old game */
2808
8ece7af41664 (svn r3356) - Remove unused parameter of AfterLoadGame().
peter1138
parents: 2749
diff changeset
  1748
		if (!AfterLoadGame()) return SL_REINIT;
1885
aef601001f5e (svn r2391) - Feature: saving games happen in a seperate thread so you no longer will have to wait such a long time (especially handy on bigger maps and multiplayer games). The mouse also changes into the 'ZZZ' state :P. The thread on windows is currently given a little-bit-less-than-normal priority so it should not interfere that much with the gameplay; it will take a bit longer though. Upon the exit of the game any pending saves are waited upon.
Darkvater
parents: 1884
diff changeset
  1749
	}
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1750
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1751
	return SL_OK;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1752
}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1753
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1754
/** Do a save when exiting the game (patch option) _patches.autosave_on_exit */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 6198
diff changeset
  1755
void DoExitSave()
643
a9c84d04eacb (svn r1076) Feature: Patch setting to autosave the game on exit
dominik
parents: 617
diff changeset
  1756
{
6929
56470c1b8a66 (svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents: 6817
diff changeset
  1757
	SaveOrLoad("exit.sav", SL_SAVE, AUTOSAVE_DIR);
643
a9c84d04eacb (svn r1076) Feature: Patch setting to autosave the game on exit
dominik
parents: 617
diff changeset
  1758
}
a9c84d04eacb (svn r1076) Feature: Patch setting to autosave the game on exit
dominik
parents: 617
diff changeset
  1759
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1760
#if 0
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1761
/**
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1762
 * Function to get the type of the savegame by looking at the file header.
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1763
 * NOTICE: Not used right now, but could be used if extensions of savegames are garbled
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1764
 * @param file Savegame to be checked
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1765
 * @return SL_OLD_LOAD or SL_LOAD of the file
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1766
 */
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1767
int GetSavegameType(char *file)
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1768
{
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1769
	const SaveLoadFormat *fmt;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1770
	uint32 hdr;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1771
	FILE *f;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1772
	int mode = SL_OLD_LOAD;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1773
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1774
	f = fopen(file, "rb");
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1775
	if (fread(&hdr, sizeof(hdr), 1, f) != 1) {
5380
8ea58542b6e0 (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5296
diff changeset
  1776
		DEBUG(sl, 0, "Savegame is obsolete or invalid format");
2026
567e3bc9af72 (svn r2535) Tabs
tron
parents: 1993
diff changeset
  1777
		mode = SL_LOAD; // don't try to get filename, just show name as it is written
4077
d4d440dd8925 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4059
diff changeset
  1778
	} else {
6117
6507b2a7e71d (svn r8853) -Cleanup: doxygen changes. Correct forgotten c files to cpp files with the @file tag as well as a few general comments style
belugas
parents: 6012
diff changeset
  1779
		/* see if we have any loader for this type. */
0
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1780
		for (fmt = _saveload_formats; fmt != endof(_saveload_formats); fmt++) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1781
			if (fmt->tag == hdr) {
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1782
				mode = SL_LOAD; // new type of savegame
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1783
				break;
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1784
			}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1785
		}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1786
	}
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1787
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1788
	fclose(f);
29654efe3188 (svn r1) Import of revision 975 of old (crashed) SVN
truelight
parents:
diff changeset
  1789
	return mode;
1881
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1790
}
435d39bd6ee0 (svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents: 1614
diff changeset
  1791
#endif