author | rubidium |
Mon, 18 Jun 2007 22:49:55 +0000 | |
changeset 7451 | 82101e591f90 |
parent 7431 | f340111a55ec |
child 7452 | f6fd23727af0 |
permissions | -rw-r--r-- |
2186 | 1 |
/* $Id$ */ |
2 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
3 |
/** @file saveload.cpp |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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): |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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> |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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) |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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) |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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> |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 | 16 |
#include "stdafx.h" |
1891
92a3b0aa0946
(svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents:
1886
diff
changeset
|
17 |
#include "openttd.h" |
1299
0a6510cc889b
(svn r1803) Move debugging stuff into files of it's own
tron
parents:
1284
diff
changeset
|
18 |
#include "debug.h" |
2163
637ec3c361f5
(svn r2673) Include functions.h directly, not globally via openttd.h
tron
parents:
2162
diff
changeset
|
19 |
#include "functions.h" |
3329
992d1f7cb747
(svn r4105) - Feature: Add proper ISO-8859-15 <> LOCALCODE conversion. As the mess that is makefile can't properly support it at the moment, it is only available for MACOSX. Windows doesn't need FS conversion and I have no idea about OS/2 so it's disabled for them.
Darkvater
parents:
3294
diff
changeset
|
20 |
#include "hal.h" |
0 | 21 |
#include "vehicle.h" |
22 |
#include "station.h" |
|
2285
3193cbd1ba88
(svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
2283
diff
changeset
|
23 |
#include "thread.h" |
0 | 24 |
#include "town.h" |
25 |
#include "player.h" |
|
26 |
#include "saveload.h" |
|
5720
cc0ceeafaa55
(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:
5687
diff
changeset
|
27 |
#include "network/network.h" |
2159
3b634157c3b2
(svn r2669) Shuffle some more stuff around to reduce dependencies
tron
parents:
2150
diff
changeset
|
28 |
#include "variables.h" |
2335
1222aa57deb7
(svn r2861) Move inclusion of setjmp.h into saveload.c, should've been part of r2819
tron
parents:
2295
diff
changeset
|
29 |
#include <setjmp.h> |
6995
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
30 |
#include <list> |
0 | 31 |
|
7451
82101e591f90
(svn r10210) -Codechange: make all money related variables 64 bits, so overflowing them should become a little harder.
rubidium
parents:
7431
diff
changeset
|
32 |
extern const uint16 SAVEGAME_VERSION = 65; |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
33 |
uint16 _sl_version; ///< the major savegame version identifier |
b8f06d8eb7be
(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:
6338
diff
changeset
|
34 |
byte _sl_minor_version; ///< the minor savegame version, DO NOT USE! |
2295
af67e1ea8687
(svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents:
2293
diff
changeset
|
35 |
|
2337
a4587769d43a
(svn r2863) Move some type declarations into saveload.c, should've been part of r2819
tron
parents:
2335
diff
changeset
|
36 |
typedef void WriterProc(uint len); |
6573 | 37 |
typedef uint ReaderProc(); |
2337
a4587769d43a
(svn r2863) Move some type declarations into saveload.c, should've been part of r2819
tron
parents:
2335
diff
changeset
|
38 |
|
2295
af67e1ea8687
(svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents:
2293
diff
changeset
|
39 |
/** The saveload struct, containing reader-writer functions, bufffer, version, etc. */ |
af67e1ea8687
(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 |
static struct { |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
41 |
bool save; ///< are we doing a save or a load atm. True when saving |
b8f06d8eb7be
(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:
6338
diff
changeset
|
42 |
byte need_length; ///< ??? |
b8f06d8eb7be
(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:
6338
diff
changeset
|
43 |
byte block_mode; ///< ??? |
b8f06d8eb7be
(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:
6338
diff
changeset
|
44 |
bool error; ///< did an error occur or not |
2295
af67e1ea8687
(svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents:
2293
diff
changeset
|
45 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
46 |
int obj_len; ///< the length of the current object we are busy with |
b8f06d8eb7be
(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:
6338
diff
changeset
|
47 |
int array_index, last_array_index; ///< in the case of an array, the current and last positions |
2295
af67e1ea8687
(svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents:
2293
diff
changeset
|
48 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
49 |
uint32 offs_base; ///< the offset in number of bytes since we started writing data (eg uncompressed savegame size) |
2295
af67e1ea8687
(svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents:
2293
diff
changeset
|
50 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
51 |
WriterProc *write_bytes; ///< savegame writer function |
b8f06d8eb7be
(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:
6338
diff
changeset
|
52 |
ReaderProc *read_bytes; ///< savegame loader function |
b8f06d8eb7be
(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:
6338
diff
changeset
|
53 |
|
b8f06d8eb7be
(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:
6338
diff
changeset
|
54 |
const ChunkHandler* const *chs; ///< the chunk of data that is being processed atm (vehicles, signs, etc.) |
b8f06d8eb7be
(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:
6338
diff
changeset
|
55 |
const SaveLoad* const *includes; ///< the internal layouf of the given chunk |
b8f06d8eb7be
(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:
6338
diff
changeset
|
56 |
|
b8f06d8eb7be
(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:
6338
diff
changeset
|
57 |
/* When saving/loading savegames, they are always saved to a temporary memory-place |
b8f06d8eb7be
(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:
6338
diff
changeset
|
58 |
* to be flushed to file (save) or to final place (load) when full. */ |
b8f06d8eb7be
(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:
6338
diff
changeset
|
59 |
byte *bufp, *bufe; ///< bufp(ointer) gives the current position in the buffer bufe(nd) gives the end of the buffer |
b8f06d8eb7be
(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:
6338
diff
changeset
|
60 |
|
b8f06d8eb7be
(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:
6338
diff
changeset
|
61 |
/* these 3 may be used by compressor/decompressors. */ |
b8f06d8eb7be
(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:
6338
diff
changeset
|
62 |
byte *buf; ///< pointer to temporary memory to read/write, initialized by SaveLoadFormat->initread/write |
b8f06d8eb7be
(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:
6338
diff
changeset
|
63 |
byte *buf_ori; ///< pointer to the original memory location of buf, used to free it afterwards |
b8f06d8eb7be
(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:
6338
diff
changeset
|
64 |
uint bufsize; ///< the size of the temporary memory *buf |
b8f06d8eb7be
(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:
6338
diff
changeset
|
65 |
FILE *fh; ///< the file from which is read or written to |
b8f06d8eb7be
(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:
6338
diff
changeset
|
66 |
|
6573 | 67 |
void (*excpt_uninit)(); ///< the function to execute on any encountered error |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
68 |
const char *excpt_msg; ///< the error message |
b8f06d8eb7be
(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:
6338
diff
changeset
|
69 |
jmp_buf excpt; ///< @todo used to jump to "exception handler"; really ugly |
2295
af67e1ea8687
(svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents:
2293
diff
changeset
|
70 |
} _sl; |
af67e1ea8687
(svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents:
2293
diff
changeset
|
71 |
|
af67e1ea8687
(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 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
73 |
enum NeedLengthValues {NL_NONE = 0, NL_WANTLENGTH = 1, NL_CALCLENGTH = 2}; |
0 | 74 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
76 |
* Fill the input buffer by reading from the file with the given reader |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
6573 | 78 |
static void SlReadFill() |
0 | 79 |
{ |
80 |
uint len = _sl.read_bytes(); |
|
81 |
assert(len != 0); |
|
82 |
||
83 |
_sl.bufp = _sl.buf; |
|
84 |
_sl.bufe = _sl.buf + len; |
|
85 |
_sl.offs_base += len; |
|
86 |
} |
|
87 |
||
6573 | 88 |
static inline uint32 SlGetOffs() {return _sl.offs_base - (_sl.bufe - _sl.bufp);} |
0 | 89 |
|
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
90 |
/** Return the size in bytes of a certain type of normal/atomic variable |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
91 |
* as it appears in memory. See VarTypes |
b8f06d8eb7be
(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:
6338
diff
changeset
|
92 |
* @param conv VarType type of variable that is used for calculating the size |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
93 |
* @return Return the size of this type in bytes */ |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
94 |
static inline byte SlCalcConvMemLen(VarType conv) |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
95 |
{ |
3048
9dd3128a6358
(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
|
96 |
static const byte conv_mem_size[] = {1, 1, 1, 2, 2, 4, 4, 8, 8, 0}; |
3625
5112d9999b6a
(svn r4524) - Codechange: Use GB() macros for getting the saveload file/memory types
Darkvater
parents:
3585
diff
changeset
|
97 |
byte length = GB(conv, 4, 4); |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
98 |
assert(length < lengthof(conv_mem_size)); |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
99 |
return conv_mem_size[length]; |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
100 |
} |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
101 |
|
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
102 |
/** Return the size in bytes of a certain type of normal/atomic variable |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
103 |
* as it appears in a saved game. See VarTypes |
b8f06d8eb7be
(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:
6338
diff
changeset
|
104 |
* @param conv VarType type of variable that is used for calculating the size |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
105 |
* @return Return the size of this type in bytes */ |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
106 |
static inline byte SlCalcConvFileLen(VarType conv) |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
107 |
{ |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
108 |
static const byte conv_file_size[] = {1, 1, 2, 2, 4, 4, 8, 8, 2}; |
3625
5112d9999b6a
(svn r4524) - Codechange: Use GB() macros for getting the saveload file/memory types
Darkvater
parents:
3585
diff
changeset
|
109 |
byte length = GB(conv, 0, 4); |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
110 |
assert(length < lengthof(conv_file_size)); |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
111 |
return conv_file_size[length]; |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
112 |
} |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
113 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
114 |
/** Return the size in bytes of a reference (pointer) */ |
6573 | 115 |
static inline size_t SlCalcRefLen() {return 2;} |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
116 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
117 |
/** Flush the output buffer by writing to disk with the given reader. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
118 |
* If the buffer pointer has not yet been set up, set it up now. Usually |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* only called when the buffer is full, or there is no more data to be processed |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
6573 | 121 |
static void SlWriteFill() |
0 | 122 |
{ |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
123 |
/* flush the buffer to disk (the writer) */ |
0 | 124 |
if (_sl.bufp != NULL) { |
125 |
uint len = _sl.bufp - _sl.buf; |
|
126 |
_sl.offs_base += len; |
|
127 |
if (len) _sl.write_bytes(len); |
|
128 |
} |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
129 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
130 |
/* All the data from the buffer has been written away, rewind to the beginning |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
131 |
* to start reading in more data */ |
0 | 132 |
_sl.bufp = _sl.buf; |
133 |
_sl.bufe = _sl.buf + _sl.bufsize; |
|
134 |
} |
|
135 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
136 |
/** Error handler, calls longjmp to simulate an exception. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
137 |
* @todo this was used to have a central place to handle errors, but it is |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* pretty ugly, and seriously interferes with any multithreaded approaches */ |
0 | 139 |
static void NORETURN SlError(const char *msg) |
140 |
{ |
|
141 |
_sl.excpt_msg = msg; |
|
142 |
longjmp(_sl.excpt, 0); |
|
143 |
} |
|
144 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
145 |
/** Read in a single byte from file. If the temporary buffer is full, |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
146 |
* flush it to its final destination |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
147 |
* @return return the read byte from file |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
148 |
*/ |
6573 | 149 |
static inline byte SlReadByteInternal() |
0 | 150 |
{ |
151 |
if (_sl.bufp == _sl.bufe) SlReadFill(); |
|
152 |
return *_sl.bufp++; |
|
153 |
} |
|
154 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
155 |
/** Wrapper for SlReadByteInternal */ |
6573 | 156 |
byte SlReadByte() {return SlReadByteInternal();} |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
157 |
|
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
158 |
/** Write away a single byte from memory. If the temporary buffer is full, |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* flush it to its destination (file) |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
160 |
* @param b the byte that is currently written |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
static inline void SlWriteByteInternal(byte b) |
1514 | 163 |
{ |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
if (_sl.bufp == _sl.bufe) SlWriteFill(); |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*_sl.bufp++ = b; |
1514 | 166 |
} |
167 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/** Wrapper for SlWriteByteInternal */ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
void SlWriteByte(byte b) {SlWriteByteInternal(b);} |
0 | 170 |
|
6573 | 171 |
static inline int SlReadUint16() |
0 | 172 |
{ |
173 |
int x = SlReadByte() << 8; |
|
174 |
return x | SlReadByte(); |
|
175 |
} |
|
176 |
||
6573 | 177 |
static inline uint32 SlReadUint32() |
0 | 178 |
{ |
179 |
uint32 x = SlReadUint16() << 16; |
|
180 |
return x | SlReadUint16(); |
|
181 |
} |
|
182 |
||
6573 | 183 |
static inline uint64 SlReadUint64() |
0 | 184 |
{ |
185 |
uint32 x = SlReadUint32(); |
|
186 |
uint32 y = SlReadUint32(); |
|
187 |
return (uint64)x << 32 | y; |
|
188 |
} |
|
189 |
||
2144
011a8b5ddcaa
(svn r2654) SlWriteUint16() should have a uint16 as parameter, not some arbitrary enum
tron
parents:
2141
diff
changeset
|
190 |
static inline void SlWriteUint16(uint16 v) |
0 | 191 |
{ |
2150
010d923a81a9
(svn r2660) Get rid of some more shifting/anding/casting
tron
parents:
2144
diff
changeset
|
192 |
SlWriteByte(GB(v, 8, 8)); |
010d923a81a9
(svn r2660) Get rid of some more shifting/anding/casting
tron
parents:
2144
diff
changeset
|
193 |
SlWriteByte(GB(v, 0, 8)); |
0 | 194 |
} |
195 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
196 |
static inline void SlWriteUint32(uint32 v) |
0 | 197 |
{ |
2150
010d923a81a9
(svn r2660) Get rid of some more shifting/anding/casting
tron
parents:
2144
diff
changeset
|
198 |
SlWriteUint16(GB(v, 16, 16)); |
010d923a81a9
(svn r2660) Get rid of some more shifting/anding/casting
tron
parents:
2144
diff
changeset
|
199 |
SlWriteUint16(GB(v, 0, 16)); |
0 | 200 |
} |
201 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
202 |
static inline void SlWriteUint64(uint64 x) |
0 | 203 |
{ |
204 |
SlWriteUint32((uint32)(x >> 32)); |
|
205 |
SlWriteUint32((uint32)x); |
|
206 |
} |
|
207 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
208 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
209 |
* Read in the header descriptor of an object or an array. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
210 |
* If the highest bit is set (7), then the index is bigger than 127 |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
211 |
* elements, so use the next byte to read in the real value. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* The actual value is then both bytes added with the first shifted |
1886 | 213 |
* 8 bits to the left, and dropping the highest bit (which only indicated a big index). |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* x = ((x & 0x7F) << 8) + SlReadByte(); |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* @return Return the value of the index |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
6573 | 217 |
static uint SlReadSimpleGamma() |
0 | 218 |
{ |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
uint i = SlReadByte(); |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
if (HASBIT(i, 7)) { |
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
221 |
i &= ~0x80; |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
222 |
if (HASBIT(i, 6)) { |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
223 |
i &= ~0x40; |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
224 |
if (HASBIT(i, 5)) { |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
225 |
i &= ~0x20; |
8b8899617403
(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, 4)) |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
227 |
SlError("Unsupported gamma"); |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
228 |
i = (i << 8) | SlReadByte(); |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
229 |
} |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
230 |
i = (i << 8) | SlReadByte(); |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
231 |
} |
8b8899617403
(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(); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
233 |
} |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
234 |
return i; |
0 | 235 |
} |
236 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* Write the header descriptor of an object or an array. |
1886 | 239 |
* If the element is bigger than 127, use 2 bytes for saving |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
240 |
* and use the highest byte of the first written one as a notice |
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
241 |
* that the length consists of 2 bytes, etc.. like this: |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
242 |
* 0xxxxxxx |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
243 |
* 10xxxxxx xxxxxxxx |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
244 |
* 110xxxxx xxxxxxxx xxxxxxxx |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
245 |
* 1110xxxx xxxxxxxx xxxxxxxx xxxxxxxx |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
246 |
* @param i Index being written |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
247 |
*/ |
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
248 |
|
0 | 249 |
static void SlWriteSimpleGamma(uint i) |
250 |
{ |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
if (i >= (1 << 7)) { |
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
252 |
if (i >= (1 << 14)) { |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
253 |
if (i >= (1 << 21)) { |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
254 |
assert(i < (1 << 28)); |
6987
b0f13039bda2
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6982
diff
changeset
|
255 |
SlWriteByte((byte)0xE0 | (i >> 24)); |
b0f13039bda2
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6982
diff
changeset
|
256 |
SlWriteByte((byte)(i >> 16)); |
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
257 |
} else { |
6987
b0f13039bda2
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6982
diff
changeset
|
258 |
SlWriteByte((byte)0xC0 | (i >> 16)); |
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
259 |
} |
6987
b0f13039bda2
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6982
diff
changeset
|
260 |
SlWriteByte((byte)(i >> 8)); |
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
261 |
} else { |
6987
b0f13039bda2
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6982
diff
changeset
|
262 |
SlWriteByte((byte)(0x80 | (i >> 8))); |
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
263 |
} |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
264 |
} |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
265 |
SlWriteByte(i); |
0 | 266 |
} |
267 |
||
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
268 |
/** Return how many bytes used to encode a gamma value */ |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
269 |
static inline uint SlGetGammaLength(uint i) { |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
270 |
return 1 + (i >= (1 << 7)) + (i >= (1 << 14)) + (i >= (1 << 21)); |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
271 |
} |
0 | 272 |
|
6573 | 273 |
static inline uint SlReadSparseIndex() {return SlReadSimpleGamma();} |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
274 |
static inline void SlWriteSparseIndex(uint index) {SlWriteSimpleGamma(index);} |
0 | 275 |
|
6573 | 276 |
static inline uint SlReadArrayLength() {return SlReadSimpleGamma();} |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
277 |
static inline void SlWriteArrayLength(uint length) {SlWriteSimpleGamma(length);} |
3509
5304adc9b471
(svn r4360) - CodeChange: add shortcut to SlGetArrayLength of the gamma-function along the lines of the Write/Read functions
Darkvater
parents:
3431
diff
changeset
|
278 |
static inline uint SlGetArrayLength(uint length) {return SlGetGammaLength(length);} |
0 | 279 |
|
280 |
void SlSetArrayIndex(uint index) |
|
281 |
{ |
|
282 |
_sl.need_length = NL_WANTLENGTH; |
|
283 |
_sl.array_index = index; |
|
284 |
} |
|
285 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
286 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
287 |
* Iterate through the elements of an array and read the whole thing |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
288 |
* @return The index of the object, or -1 if we have reached the end of current block |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
289 |
*/ |
6573 | 290 |
int SlIterateArray() |
0 | 291 |
{ |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
int index; |
0 | 293 |
static uint32 next_offs; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
294 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/* After reading in the whole array inside the loop |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
296 |
* we must have read in all the data, so we must be at end of current block. */ |
0 | 297 |
assert(next_offs == 0 || SlGetOffs() == next_offs); |
298 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
299 |
while (true) { |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
uint length = SlReadArrayLength(); |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
if (length == 0) { |
0 | 302 |
next_offs = 0; |
303 |
return -1; |
|
304 |
} |
|
305 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
_sl.obj_len = --length; |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
307 |
next_offs = SlGetOffs() + length; |
0 | 308 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
309 |
switch (_sl.block_mode) { |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
310 |
case CH_SPARSE_ARRAY: index = (int)SlReadSparseIndex(); break; |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
case CH_ARRAY: index = _sl.array_index++; break; |
0 | 312 |
default: |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
313 |
DEBUG(sl, 0, "SlIterateArray error"); |
0 | 314 |
return -1; // error |
315 |
} |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
316 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
317 |
if (length != 0) return index; |
0 | 318 |
} |
319 |
} |
|
320 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
321 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* Sets the length of either a RIFF object or the number of items in an array. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
323 |
* This lets us load an object or an array of arbitrary size |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
324 |
* @param length The length of the sought object/array |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
325 |
*/ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
void SlSetLength(size_t length) |
0 | 327 |
{ |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
328 |
assert(_sl.save); |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
329 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
switch (_sl.need_length) { |
0 | 331 |
case NL_WANTLENGTH: |
332 |
_sl.need_length = NL_NONE; |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
333 |
switch (_sl.block_mode) { |
0 | 334 |
case CH_RIFF: |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
335 |
/* Ugly encoding of >16M RIFF chunks |
b8f06d8eb7be
(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:
6338
diff
changeset
|
336 |
* The lower 24 bits are normal |
b8f06d8eb7be
(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:
6338
diff
changeset
|
337 |
* The uppermost 4 bits are bits 24:27 */ |
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
338 |
assert(length < (1<<28)); |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
339 |
SlWriteUint32((length & 0xFFFFFF) | ((length >> 24) << 28)); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
340 |
break; |
0 | 341 |
case CH_ARRAY: |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
342 |
assert(_sl.last_array_index <= _sl.array_index); |
0 | 343 |
while (++_sl.last_array_index <= _sl.array_index) |
344 |
SlWriteArrayLength(1); |
|
345 |
SlWriteArrayLength(length + 1); |
|
346 |
break; |
|
347 |
case CH_SPARSE_ARRAY: |
|
3509
5304adc9b471
(svn r4360) - CodeChange: add shortcut to SlGetArrayLength of the gamma-function along the lines of the Write/Read functions
Darkvater
parents:
3431
diff
changeset
|
348 |
SlWriteArrayLength(length + 1 + SlGetArrayLength(_sl.array_index)); // Also include length of sparse index. |
0 | 349 |
SlWriteSparseIndex(_sl.array_index); |
350 |
break; |
|
351 |
default: NOT_REACHED(); |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
352 |
} break; |
0 | 353 |
case NL_CALCLENGTH: |
354 |
_sl.obj_len += length; |
|
355 |
break; |
|
356 |
} |
|
357 |
} |
|
358 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
359 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
360 |
* Save/Load bytes. These do not need to be converted to Little/Big Endian |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
361 |
* so directly write them or read them to/from file |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
362 |
* @param ptr The source or destination of the object being manipulated |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
363 |
* @param length number of bytes this fast CopyBytes lasts |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
410 | 365 |
static void SlCopyBytes(void *ptr, size_t length) |
0 | 366 |
{ |
367 |
byte *p = (byte*)ptr; |
|
368 |
||
369 |
if (_sl.save) { |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
370 |
for (; length != 0; length--) {SlWriteByteInternal(*p++);} |
0 | 371 |
} else { |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
372 |
for (; length != 0; length--) {*p++ = SlReadByteInternal();} |
0 | 373 |
} |
374 |
} |
|
375 |
||
3117
8066b8d0802b
(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
|
376 |
/** Read in bytes from the file/data structure but don't do |
8066b8d0802b
(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
|
377 |
* anything with them, discarding them in effect |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
378 |
* @param length The amount of bytes that is being treated this way |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
379 |
*/ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
380 |
static inline void SlSkipBytes(size_t length) |
0 | 381 |
{ |
3117
8066b8d0802b
(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 |
for (; length != 0; length--) SlReadByte(); |
0 | 383 |
} |
384 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/* Get the length of the current object */ |
6573 | 386 |
uint SlGetFieldLength() {return _sl.obj_len;} |
0 | 387 |
|
3108
de4252bcae08
(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
|
388 |
/** Return a signed-long version of the value of a setting |
de4252bcae08
(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
|
389 |
* @param ptr pointer to the variable |
de4252bcae08
(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
|
390 |
* @param conv type of variable, can be a non-clean |
de4252bcae08
(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
|
391 |
* type, eg one with other flags because it is parsed |
de4252bcae08
(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
|
392 |
* @return returns the value of the pointer-setting */ |
de4252bcae08
(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 |
int64 ReadValue(const void *ptr, VarType conv) |
de4252bcae08
(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 |
{ |
de4252bcae08
(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 |
switch (GetVarMemType(conv)) { |
3109
13db09ee3039
(svn r3712) - Change the boolean assignment/reading from == 1 to != 0 as suggested by Tron.
Darkvater
parents:
3108
diff
changeset
|
396 |
case SLE_VAR_BL: return (*(bool*)ptr != 0); |
3108
de4252bcae08
(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 |
case SLE_VAR_I8: return *(int8* )ptr; |
de4252bcae08
(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 |
case SLE_VAR_U8: return *(byte* )ptr; |
de4252bcae08
(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 |
case SLE_VAR_I16: return *(int16* )ptr; |
de4252bcae08
(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 |
case SLE_VAR_U16: return *(uint16*)ptr; |
de4252bcae08
(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
|
401 |
case SLE_VAR_I32: return *(int32* )ptr; |
de4252bcae08
(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_U32: return *(uint32*)ptr; |
de4252bcae08
(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_I64: return *(int64* )ptr; |
de4252bcae08
(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_U64: return *(uint64*)ptr; |
de4252bcae08
(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_NULL:return 0; |
de4252bcae08
(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 |
default: NOT_REACHED(); |
de4252bcae08
(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 |
} |
de4252bcae08
(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 |
|
de4252bcae08
(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 |
/* useless, but avoids compiler warning this way */ |
de4252bcae08
(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 |
return 0; |
de4252bcae08
(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 |
} |
de4252bcae08
(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 |
|
de4252bcae08
(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 |
/** Write the value of a setting |
de4252bcae08
(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 |
* @param ptr pointer to the variable |
de4252bcae08
(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 |
* @param conv type of variable, can be a non-clean type, eg |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6659
diff
changeset
|
416 |
* with other flags. It is parsed upon read |
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6659
diff
changeset
|
417 |
* @param val the new value being given to the variable */ |
3108
de4252bcae08
(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 |
void WriteValue(void *ptr, VarType conv, int64 val) |
de4252bcae08
(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 |
{ |
de4252bcae08
(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 |
switch (GetVarMemType(conv)) { |
3109
13db09ee3039
(svn r3712) - Change the boolean assignment/reading from == 1 to != 0 as suggested by Tron.
Darkvater
parents:
3108
diff
changeset
|
421 |
case SLE_VAR_BL: *(bool *)ptr = (val != 0); break; |
3108
de4252bcae08
(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
|
422 |
case SLE_VAR_I8: *(int8 *)ptr = val; break; |
de4252bcae08
(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 |
case SLE_VAR_U8: *(byte *)ptr = val; break; |
de4252bcae08
(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 |
case SLE_VAR_I16: *(int16 *)ptr = val; break; |
de4252bcae08
(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 |
case SLE_VAR_U16: *(uint16*)ptr = val; break; |
de4252bcae08
(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
|
426 |
case SLE_VAR_I32: *(int32 *)ptr = val; break; |
de4252bcae08
(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_U32: *(uint32*)ptr = val; break; |
de4252bcae08
(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_I64: *(int64 *)ptr = val; break; |
de4252bcae08
(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_U64: *(uint64*)ptr = val; break; |
de4252bcae08
(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_NULL: break; |
de4252bcae08
(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 |
default: NOT_REACHED(); |
de4252bcae08
(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 |
} |
de4252bcae08
(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 |
} |
de4252bcae08
(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 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
435 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
436 |
* Handle all conversion and typechecking of variables here. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
437 |
* In the case of saving, read in the actual value from the struct |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
438 |
* and then write them to file, endian safely. Loading a value |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
439 |
* goes exactly the opposite way |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* @param ptr The object being filled/read |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
441 |
* @param conv VarType type of the current element of the struct |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
static void SlSaveLoadConv(void *ptr, VarType conv) |
0 | 444 |
{ |
445 |
int64 x = 0; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
446 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
447 |
if (_sl.save) { // SAVE values |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/* Read a value from the struct. These ARE endian safe. */ |
3108
de4252bcae08
(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
|
449 |
x = ReadValue(ptr, conv); |
0 | 450 |
|
3108
de4252bcae08
(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
|
451 |
/* Write the value to the file and check if its value is in the desired range */ |
de4252bcae08
(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
|
452 |
switch (GetVarFileType(conv)) { |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
case SLE_FILE_I8: assert(x >= -128 && x <= 127); SlWriteByte(x);break; |
2026 | 454 |
case SLE_FILE_U8: assert(x >= 0 && x <= 255); SlWriteByte(x);break; |
0 | 455 |
case SLE_FILE_I16:assert(x >= -32768 && x <= 32767); SlWriteUint16(x);break; |
456 |
case SLE_FILE_STRINGID: |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
457 |
case SLE_FILE_U16:assert(x >= 0 && x <= 65535); SlWriteUint16(x);break; |
3108
de4252bcae08
(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
|
458 |
case SLE_FILE_I32: |
de4252bcae08
(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
|
459 |
case SLE_FILE_U32: SlWriteUint32((uint32)x);break; |
de4252bcae08
(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
|
460 |
case SLE_FILE_I64: |
de4252bcae08
(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
|
461 |
case SLE_FILE_U64: SlWriteUint64(x);break; |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
default: NOT_REACHED(); |
0 | 463 |
} |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
464 |
} else { // LOAD values |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
465 |
|
3108
de4252bcae08
(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 |
/* Read a value from the file */ |
de4252bcae08
(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
|
467 |
switch (GetVarFileType(conv)) { |
de4252bcae08
(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
|
468 |
case SLE_FILE_I8: x = (int8 )SlReadByte(); break; |
de4252bcae08
(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
|
469 |
case SLE_FILE_U8: x = (byte )SlReadByte(); break; |
de4252bcae08
(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
|
470 |
case SLE_FILE_I16: x = (int16 )SlReadUint16(); break; |
0 | 471 |
case SLE_FILE_U16: x = (uint16)SlReadUint16(); break; |
3108
de4252bcae08
(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 |
case SLE_FILE_I32: x = (int32 )SlReadUint32(); break; |
0 | 473 |
case SLE_FILE_U32: x = (uint32)SlReadUint32(); break; |
3108
de4252bcae08
(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_I64: x = (int64 )SlReadUint64(); break; |
0 | 475 |
case SLE_FILE_U64: x = (uint64)SlReadUint64(); break; |
476 |
case SLE_FILE_STRINGID: x = RemapOldStringID((uint16)SlReadUint16()); break; |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
477 |
default: NOT_REACHED(); |
0 | 478 |
} |
479 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
480 |
/* Write The value to the struct. These ARE endian safe. */ |
3108
de4252bcae08
(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
|
481 |
WriteValue(ptr, conv, x); |
0 | 482 |
} |
483 |
} |
|
484 |
||
3510
26ef8131b359
(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
|
485 |
/** Calculate the net length of a string. This is in almost all cases |
26ef8131b359
(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
|
486 |
* just strlen(), but if the string is not properly terminated, we'll |
26ef8131b359
(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
|
487 |
* resort to the maximum length of the buffer. |
26ef8131b359
(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
|
488 |
* @param ptr pointer to the stringbuffer |
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
489 |
* @param length maximum length of the string (buffer). If -1 we don't care |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
490 |
* about a maximum length, but take string length as it is. |
3510
26ef8131b359
(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 |
* @return return the net length of the string */ |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
492 |
static inline size_t SlCalcNetStringLen(const char *ptr, size_t length) |
3510
26ef8131b359
(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 |
{ |
26ef8131b359
(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
|
494 |
return minu(strlen(ptr), length - 1); |
26ef8131b359
(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
|
495 |
} |
26ef8131b359
(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 |
|
26ef8131b359
(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
|
497 |
/** Calculate the gross length of the string that it |
26ef8131b359
(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 |
* will occupy in the savegame. This includes the real length, returned |
26ef8131b359
(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
|
499 |
* by SlCalcNetStringLen and the length that the index will occupy. |
26ef8131b359
(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 |
* @param ptr pointer to the stringbuffer |
26ef8131b359
(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 |
* @param length maximum length of the string (buffer size, etc.) |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6659
diff
changeset
|
502 |
* @param conv type of data been used |
3510
26ef8131b359
(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 |
* @return return the gross length of the string */ |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
504 |
static inline size_t SlCalcStringLen(const void *ptr, size_t length, VarType conv) |
3048
9dd3128a6358
(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
|
505 |
{ |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
506 |
size_t len; |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
507 |
const char *str; |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
508 |
|
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
509 |
switch (GetVarMemType(conv)) { |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
510 |
default: NOT_REACHED(); |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
511 |
case SLE_VAR_STR: |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
512 |
case SLE_VAR_STRQ: |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
513 |
str = *(const char**)ptr; |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
514 |
len = SIZE_MAX; |
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
515 |
break; |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
516 |
case SLE_VAR_STRB: |
d423c895a5b4
(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_STRBQ: |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
518 |
str = (const char*)ptr; |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
519 |
len = length; |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
520 |
break; |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
521 |
} |
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
522 |
|
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
523 |
len = SlCalcNetStringLen(str, len); |
3510
26ef8131b359
(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
|
524 |
return len + SlGetArrayLength(len); // also include the length of the index |
3048
9dd3128a6358
(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
|
525 |
} |
9dd3128a6358
(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
|
526 |
|
9dd3128a6358
(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
|
527 |
/** |
9dd3128a6358
(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
|
528 |
* Save/Load a string. |
9dd3128a6358
(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
|
529 |
* @param ptr the string being manipulated |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6659
diff
changeset
|
530 |
* @param length of the string (full length) |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
531 |
* @param conv must be SLE_FILE_STRING */ |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
532 |
static void SlString(void *ptr, size_t length, VarType conv) |
3048
9dd3128a6358
(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 |
{ |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
534 |
size_t len; |
3048
9dd3128a6358
(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 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
536 |
if (_sl.save) { // SAVE string |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
537 |
switch (GetVarMemType(conv)) { |
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
538 |
default: NOT_REACHED(); |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
539 |
case SLE_VAR_STRB: |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
540 |
case SLE_VAR_STRBQ: |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
541 |
len = SlCalcNetStringLen((char*)ptr, length); |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
542 |
break; |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
543 |
case SLE_VAR_STR: |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
544 |
case SLE_VAR_STRQ: |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
545 |
ptr = *(char**)ptr; |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
546 |
len = SlCalcNetStringLen((char*)ptr, SIZE_MAX); |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
547 |
break; |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
548 |
} |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
549 |
|
3510
26ef8131b359
(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
|
550 |
SlWriteArrayLength(len); |
26ef8131b359
(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
|
551 |
SlCopyBytes(ptr, len); |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
552 |
} else { // LOAD string |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
553 |
len = SlReadArrayLength(); |
3510
26ef8131b359
(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
|
554 |
|
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
555 |
switch (GetVarMemType(conv)) { |
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
556 |
default: NOT_REACHED(); |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
557 |
case SLE_VAR_STRB: |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
558 |
case SLE_VAR_STRBQ: |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
559 |
if (len >= length) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
560 |
DEBUG(sl, 1, "String length in savegame is bigger than buffer, truncating"); |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
561 |
SlCopyBytes(ptr, length); |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
562 |
SlSkipBytes(len - length); |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
563 |
len = length - 1; |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
564 |
} else { |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
565 |
SlCopyBytes(ptr, len); |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
566 |
} |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
567 |
break; |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
568 |
case SLE_VAR_STR: |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
569 |
case SLE_VAR_STRQ: // Malloc'd string, free previous incarnation, and allocate |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
570 |
free(*(char**)ptr); |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
571 |
*(char**)ptr = (char*)malloc(len + 1); // terminating '\0' |
5140
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
572 |
ptr = *(char**)ptr; |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
573 |
SlCopyBytes(ptr, len); |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
574 |
break; |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
575 |
} |
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
576 |
|
3d58647a202a
(svn r7228) -Codechange: [internal] Add the possibility to save/load string-pointers which do not
Darkvater
parents:
5116
diff
changeset
|
577 |
((char*)ptr)[len] = '\0'; // properly terminate the string |
3510
26ef8131b359
(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
|
578 |
} |
3048
9dd3128a6358
(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
|
579 |
} |
9dd3128a6358
(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
|
580 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
581 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
582 |
* Return the size in bytes of a certain type of atomic array |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
583 |
* @param length The length of the array counted in elements |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
584 |
* @param conv VarType type of the variable that is used in calculating the size |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
585 |
*/ |
2958
3f8946daf55f
(svn r3520) Remove unused parameters from some functions
tron
parents:
2952
diff
changeset
|
586 |
static inline size_t SlCalcArrayLen(uint length, VarType conv) |
3f8946daf55f
(svn r3520) Remove unused parameters from some functions
tron
parents:
2952
diff
changeset
|
587 |
{ |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
588 |
return SlCalcConvFileLen(conv) * length; |
2958
3f8946daf55f
(svn r3520) Remove unused parameters from some functions
tron
parents:
2952
diff
changeset
|
589 |
} |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
590 |
|
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* Save/Load an array. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 array The array being manipulated |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
594 |
* @param length The length of the array in elements |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
595 |
* @param conv VarType type of the atomic array (int, byte, uint64, etc.) |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
596 |
*/ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
597 |
void SlArray(void *array, uint length, VarType conv) |
0 | 598 |
{ |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
599 |
/* Automatically calculate the length? */ |
0 | 600 |
if (_sl.need_length != NL_NONE) { |
2958
3f8946daf55f
(svn r3520) Remove unused parameters from some functions
tron
parents:
2952
diff
changeset
|
601 |
SlSetLength(SlCalcArrayLen(length, conv)); |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
602 |
/* Determine length only? */ |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
603 |
if (_sl.need_length == NL_CALCLENGTH) return; |
0 | 604 |
} |
605 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/* NOTICE - handle some buggy stuff, in really old versions everything was saved |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* as a byte-type. So detect this, and adjust array size accordingly */ |
2295
af67e1ea8687
(svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents:
2293
diff
changeset
|
608 |
if (!_sl.save && _sl_version == 0) { |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
609 |
if (conv == SLE_INT16 || conv == SLE_UINT16 || conv == SLE_STRINGID || |
4077
d3022f976946
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
4059
diff
changeset
|
610 |
conv == SLE_INT32 || conv == SLE_UINT32) { |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
611 |
length *= SlCalcConvFileLen(conv); |
0 | 612 |
conv = SLE_INT8; |
613 |
} |
|
614 |
} |
|
615 |
||
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
616 |
/* If the size of elements is 1 byte both in file and memory, no special |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
617 |
* conversion is needed, use specialized copy-copy function to speed up things */ |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
618 |
if (conv == SLE_INT8 || conv == SLE_UINT8) { |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
619 |
SlCopyBytes(array, length); |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
620 |
} else { |
0 | 621 |
byte *a = (byte*)array; |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
622 |
byte mem_size = SlCalcConvMemLen(conv); |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
623 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
624 |
for (; length != 0; length --) { |
0 | 625 |
SlSaveLoadConv(a, conv); |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
626 |
a += mem_size; // get size |
0 | 627 |
} |
628 |
} |
|
629 |
} |
|
630 |
||
6995
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
631 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
632 |
static uint ReferenceToInt(const void* obj, SLRefType rt); |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
633 |
static void* IntToReference(uint index, SLRefType rt); |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
634 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
635 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
636 |
/** |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
637 |
* Return the size in bytes of a list |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
638 |
* @param list The std::list to find the size of |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
639 |
*/ |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
640 |
static inline size_t SlCalcListLen(const void *list) |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
641 |
{ |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
642 |
std::list<void *> *l = (std::list<void *> *) list; |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
643 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
644 |
/* Each entry is saved as 2 bytes, plus 2 bytes are used for the length |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
645 |
* of the list */ |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
646 |
return l->size() * 2 + 2; |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
647 |
} |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
648 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
649 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
650 |
/** |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
651 |
* Save/Load a list. |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
652 |
* @param list The list being manipulated |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
653 |
* @param conv SLRefType type of the list (Vehicle *, Station *, etc) |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
654 |
*/ |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
655 |
void SlList(void *list, SLRefType conv) |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
656 |
{ |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
657 |
/* Automatically calculate the length? */ |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
658 |
if (_sl.need_length != NL_NONE) { |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
659 |
SlSetLength(SlCalcListLen(list)); |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
660 |
/* Determine length only? */ |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
661 |
if (_sl.need_length == NL_CALCLENGTH) return; |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
662 |
} |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
663 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
664 |
std::list<void *> *l = (std::list<void *> *) list; |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
665 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
666 |
if (_sl.save) { |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
667 |
SlWriteUint16(l->size()); |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
668 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
669 |
std::list<void *>::iterator iter; |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
670 |
for (iter = l->begin(); iter != l->end(); ++iter) { |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
671 |
void *ptr = *iter; |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
672 |
SlWriteUint16(ReferenceToInt(ptr, conv)); |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
673 |
} |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
674 |
} else { |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
675 |
uint length = SlReadUint16(); |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
676 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
677 |
/* Load each reference and push to the end of the list */ |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
678 |
for (uint i = 0; i < length; i++) { |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
679 |
void *ptr = IntToReference(SlReadUint16(), conv); |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
680 |
l->push_back(ptr); |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
681 |
} |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
682 |
} |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
683 |
} |
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
684 |
|
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
685 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
686 |
/** Are we going to save this object or not? */ |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
687 |
static inline bool SlIsObjectValidInSavegame(const SaveLoad *sld) |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
688 |
{ |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
689 |
if (_sl_version < sld->version_from || _sl_version > sld->version_to) return false; |
3117
8066b8d0802b
(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
|
690 |
if (sld->conv & SLF_SAVE_NO) return false; |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
691 |
|
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
692 |
return true; |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
693 |
} |
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
694 |
|
3117
8066b8d0802b
(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
|
695 |
/** Are we going to load this variable when loading a savegame or not? |
8066b8d0802b
(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
|
696 |
* @note If the variable is skipped it is skipped in the savegame |
8066b8d0802b
(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
|
697 |
* bytestream itself as well, so there is no need to skip it somewhere else */ |
8066b8d0802b
(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
|
698 |
static inline bool SlSkipVariableOnLoad(const SaveLoad *sld) |
8066b8d0802b
(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
|
699 |
{ |
8066b8d0802b
(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
|
700 |
if ((sld->conv & SLF_NETWORK_NO) && !_sl.save && _networking && !_network_server) { |
8066b8d0802b
(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 |
SlSkipBytes(SlCalcConvMemLen(sld->conv) * sld->length); |
8066b8d0802b
(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
|
702 |
return true; |
8066b8d0802b
(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
|
703 |
} |
8066b8d0802b
(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
|
704 |
|
8066b8d0802b
(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
|
705 |
return false; |
8066b8d0802b
(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 |
} |
8066b8d0802b
(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 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
708 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
709 |
* Calculate the size of an object. |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6659
diff
changeset
|
710 |
* @param object to be measured |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
711 |
* @param sld The SaveLoad description of the object so we know how to manipulate it |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6659
diff
changeset
|
712 |
* @return size of given objetc |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
713 |
*/ |
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
714 |
static size_t SlCalcObjLength(const void *object, const SaveLoad *sld) |
0 | 715 |
{ |
716 |
size_t length = 0; |
|
717 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
718 |
/* Need to determine the length and write a length tag. */ |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
for (; sld->cmd != SL_END; sld++) { |
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
720 |
length += SlCalcObjMemberLength(object, sld); |
3046
f81bee40701f
(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
|
721 |
} |
f81bee40701f
(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
|
722 |
return length; |
f81bee40701f
(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
|
723 |
} |
f81bee40701f
(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
|
724 |
|
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
725 |
size_t SlCalcObjMemberLength(const void *object, const SaveLoad *sld) |
3046
f81bee40701f
(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
|
726 |
{ |
f81bee40701f
(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
|
727 |
assert(_sl.save); |
f81bee40701f
(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
|
728 |
|
f81bee40701f
(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
|
729 |
switch (sld->cmd) { |
f81bee40701f
(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
|
730 |
case SL_VAR: |
f81bee40701f
(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
|
731 |
case SL_REF: |
f81bee40701f
(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 |
case SL_ARR: |
3048
9dd3128a6358
(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
|
733 |
case SL_STR: |
6995
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
734 |
case SL_LST: |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
735 |
/* CONDITIONAL saveload types depend on the savegame version */ |
3046
f81bee40701f
(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
|
736 |
if (!SlIsObjectValidInSavegame(sld)) break; |
0 | 737 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
738 |
switch (sld->cmd) { |
3046
f81bee40701f
(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 |
case SL_VAR: return SlCalcConvFileLen(sld->conv); |
f81bee40701f
(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 |
case SL_REF: return SlCalcRefLen(); |
f81bee40701f
(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_ARR: return SlCalcArrayLen(sld->length, sld->conv); |
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
742 |
case SL_STR: return SlCalcStringLen(GetVariableAddress(object, sld), sld->length, sld->conv); |
6995
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
743 |
case SL_LST: return SlCalcListLen(GetVariableAddress(object, sld)); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
744 |
default: NOT_REACHED(); |
0 | 745 |
} |
3046
f81bee40701f
(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
|
746 |
break; |
7313
921f236ba638
(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:
7306
diff
changeset
|
747 |
case SL_WRITEBYTE: return 1; // a byte is logically of size 1 |
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
748 |
case SL_INCLUDE: return SlCalcObjLength(object, _sl.includes[sld->version_from]); |
3046
f81bee40701f
(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
|
749 |
default: NOT_REACHED(); |
0 | 750 |
} |
3046
f81bee40701f
(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 |
return 0; |
f81bee40701f
(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 |
} |
f81bee40701f
(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
|
753 |
|
4039
eacd29ce18d9
(svn r5307) Remove two unnecessary indirections which used function pointers instead of directly calling the functions
tron
parents:
4016
diff
changeset
|
754 |
|
3046
f81bee40701f
(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
|
755 |
bool SlObjectMember(void *ptr, const SaveLoad *sld) |
f81bee40701f
(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
|
756 |
{ |
f81bee40701f
(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 |
VarType conv = GB(sld->conv, 0, 8); |
f81bee40701f
(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
|
758 |
switch (sld->cmd) { |
f81bee40701f
(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
|
759 |
case SL_VAR: |
f81bee40701f
(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 |
case SL_REF: |
f81bee40701f
(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
|
761 |
case SL_ARR: |
3048
9dd3128a6358
(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
|
762 |
case SL_STR: |
6995
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
763 |
case SL_LST: |
3046
f81bee40701f
(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 |
/* CONDITIONAL saveload types depend on the savegame version */ |
f81bee40701f
(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
|
765 |
if (!SlIsObjectValidInSavegame(sld)) return false; |
3117
8066b8d0802b
(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
|
766 |
if (SlSkipVariableOnLoad(sld)) return false; |
3046
f81bee40701f
(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 |
|
f81bee40701f
(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 |
switch (sld->cmd) { |
f81bee40701f
(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 |
case SL_VAR: SlSaveLoadConv(ptr, conv); break; |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
770 |
case SL_REF: // Reference variable, translate |
b8f06d8eb7be
(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:
6338
diff
changeset
|
771 |
/* @todo XXX - another artificial limitof 65K elements of pointers? */ |
3046
f81bee40701f
(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 |
if (_sl.save) { // XXX - read/write pointer as uint16? What is with higher indeces? |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
773 |
SlWriteUint16(ReferenceToInt(*(void**)ptr, (SLRefType)conv)); |
4039
eacd29ce18d9
(svn r5307) Remove two unnecessary indirections which used function pointers instead of directly calling the functions
tron
parents:
4016
diff
changeset
|
774 |
} else { |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
775 |
*(void**)ptr = IntToReference(SlReadUint16(), (SLRefType)conv); |
4039
eacd29ce18d9
(svn r5307) Remove two unnecessary indirections which used function pointers instead of directly calling the functions
tron
parents:
4016
diff
changeset
|
776 |
} |
3046
f81bee40701f
(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
|
777 |
break; |
f81bee40701f
(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 |
case SL_ARR: SlArray(ptr, sld->length, conv); break; |
3048
9dd3128a6358
(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
|
779 |
case SL_STR: SlString(ptr, sld->length, conv); break; |
6995
0b1b26cc01b7
(svn r9682) -Codechange: Add support for saving/loading std::lists containing object references (REF_*)
peter1138
parents:
6987
diff
changeset
|
780 |
case SL_LST: SlList(ptr, (SLRefType)conv); break; |
3046
f81bee40701f
(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
|
781 |
default: NOT_REACHED(); |
f81bee40701f
(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
|
782 |
} |
f81bee40701f
(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
|
783 |
break; |
f81bee40701f
(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
|
784 |
|
7313
921f236ba638
(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:
7306
diff
changeset
|
785 |
/* SL_WRITEBYTE translates a value of a variable to another one upon |
921f236ba638
(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:
7306
diff
changeset
|
786 |
* saving or loading. |
921f236ba638
(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:
7306
diff
changeset
|
787 |
* XXX - variable renaming abuse |
921f236ba638
(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:
7306
diff
changeset
|
788 |
* game_value: the value of the variable ingame is abused by sld->version_from |
921f236ba638
(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:
7306
diff
changeset
|
789 |
* file_value: the value of the variable in the savegame is abused by sld->version_to */ |
921f236ba638
(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:
7306
diff
changeset
|
790 |
case SL_WRITEBYTE: |
921f236ba638
(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:
7306
diff
changeset
|
791 |
if (_sl.save) { |
921f236ba638
(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:
7306
diff
changeset
|
792 |
SlWriteByte(sld->version_to); |
921f236ba638
(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:
7306
diff
changeset
|
793 |
} else { |
921f236ba638
(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:
7306
diff
changeset
|
794 |
*(byte*)ptr = sld->version_from; |
921f236ba638
(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:
7306
diff
changeset
|
795 |
} |
921f236ba638
(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:
7306
diff
changeset
|
796 |
break; |
921f236ba638
(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:
7306
diff
changeset
|
797 |
|
3046
f81bee40701f
(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
|
798 |
/* SL_INCLUDE loads common code for a type |
f81bee40701f
(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
|
799 |
* XXX - variable renaming abuse |
f81bee40701f
(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
|
800 |
* include_index: common code to include from _desc_includes[], abused by sld->version_from */ |
f81bee40701f
(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
|
801 |
case SL_INCLUDE: |
f81bee40701f
(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
|
802 |
SlObject(ptr, _sl.includes[sld->version_from]); |
f81bee40701f
(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
|
803 |
break; |
f81bee40701f
(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
|
804 |
default: NOT_REACHED(); |
f81bee40701f
(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
|
805 |
} |
f81bee40701f
(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
|
806 |
return true; |
0 | 807 |
} |
808 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
809 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
810 |
* Main SaveLoad function. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
811 |
* @param object The object that is being saved or loaded |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
812 |
* @param sld The SaveLoad description of the object so we know how to manipulate it |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
813 |
*/ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
814 |
void SlObject(void *object, const SaveLoad *sld) |
0 | 815 |
{ |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
816 |
/* Automatically calculate the length? */ |
0 | 817 |
if (_sl.need_length != NL_NONE) { |
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
818 |
SlSetLength(SlCalcObjLength(object, sld)); |
3044
631d21c289e2
(svn r3624) - CodeChange: Some cosmetic changes in the saveload code;
Darkvater
parents:
3043
diff
changeset
|
819 |
if (_sl.need_length == NL_CALCLENGTH) return; |
0 | 820 |
} |
821 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
822 |
for (; sld->cmd != SL_END; sld++) { |
5141
05a806850445
(svn r7231) -Codechange: rename ini_get_variable to GetVariableAddress for use both in settings.c
Darkvater
parents:
5140
diff
changeset
|
823 |
void *ptr = GetVariableAddress(object, sld); |
3046
f81bee40701f
(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
|
824 |
SlObjectMember(ptr, sld); |
0 | 825 |
} |
826 |
} |
|
827 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
828 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
829 |
* Save or Load (a list of) global variables |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6659
diff
changeset
|
830 |
* @param sldg The global variable that is being loaded or saved |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
831 |
*/ |
3046
f81bee40701f
(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
|
832 |
void SlGlobList(const SaveLoadGlobVarList *sldg) |
0 | 833 |
{ |
834 |
if (_sl.need_length != NL_NONE) { |
|
5142
d423c895a5b4
(svn r7232) -Codechange: Also allow for the save/load of non pre-allocated strings inside structs.
Darkvater
parents:
5141
diff
changeset
|
835 |
SlSetLength(SlCalcObjLength(NULL, (const SaveLoad*)sldg)); |
3046
f81bee40701f
(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
|
836 |
if (_sl.need_length == NL_CALCLENGTH) return; |
0 | 837 |
} |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
|
3046
f81bee40701f
(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
|
839 |
for (; sldg->cmd != SL_END; sldg++) { |
3073
eb443625edae
(svn r3662) Fix regression FS#58 with union, endiannes and static decleration problems. Removed the union.
Darkvater
parents:
3048
diff
changeset
|
840 |
SlObjectMember(sldg->address, (const SaveLoad*)sldg); |
0 | 841 |
} |
842 |
} |
|
843 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
844 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
845 |
* Do something of which I have no idea what it is :P |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
846 |
* @param proc The callback procedure that is called |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* @param arg The variable that will be used for the callback procedure |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
0 | 849 |
void SlAutolength(AutolengthProc *proc, void *arg) |
850 |
{ |
|
851 |
uint32 offs; |
|
852 |
||
853 |
assert(_sl.save); |
|
854 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
855 |
/* Tell it to calculate the length */ |
0 | 856 |
_sl.need_length = NL_CALCLENGTH; |
857 |
_sl.obj_len = 0; |
|
858 |
proc(arg); |
|
859 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
860 |
/* Setup length */ |
0 | 861 |
_sl.need_length = NL_WANTLENGTH; |
862 |
SlSetLength(_sl.obj_len); |
|
863 |
||
864 |
offs = SlGetOffs() + _sl.obj_len; |
|
865 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
866 |
/* And write the stuff */ |
0 | 867 |
proc(arg); |
868 |
||
869 |
assert(offs == SlGetOffs()); |
|
870 |
} |
|
871 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
872 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
873 |
* Load a chunk of data (eg vehicles, stations, etc.) |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
874 |
* @param ch The chunkhandler that will be used for the operation |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
0 | 876 |
static void SlLoadChunk(const ChunkHandler *ch) |
877 |
{ |
|
878 |
byte m = SlReadByte(); |
|
879 |
size_t len; |
|
880 |
uint32 endoffs; |
|
881 |
||
882 |
_sl.block_mode = m; |
|
883 |
_sl.obj_len = 0; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
884 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
885 |
switch (m) { |
0 | 886 |
case CH_ARRAY: |
887 |
_sl.array_index = 0; |
|
888 |
ch->load_proc(); |
|
889 |
break; |
|
890 |
case CH_SPARSE_ARRAY: |
|
891 |
ch->load_proc(); |
|
892 |
break; |
|
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
893 |
default: |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
894 |
if ((m & 0xF) == CH_RIFF) { |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
895 |
/* Read length */ |
2041
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
896 |
len = (SlReadByte() << 16) | ((m >> 4) << 24); |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
897 |
len += SlReadUint16(); |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
898 |
_sl.obj_len = len; |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
899 |
endoffs = SlGetOffs() + len; |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
900 |
ch->load_proc(); |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
901 |
assert(SlGetOffs() == endoffs); |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
902 |
} else { |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
903 |
SlError("Invalid chunk type"); |
8b8899617403
(svn r2550) raise 32767 limit of gamma values, and 16MB limit of RIFF chunks in saveload code.
ludde
parents:
2026
diff
changeset
|
904 |
} |
0 | 905 |
break; |
906 |
} |
|
907 |
} |
|
908 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
909 |
/* Stub Chunk handlers to only calculate length and do nothing else */ |
0 | 910 |
static ChunkSaveLoadProc *_tmp_proc_1; |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
911 |
static inline void SlStubSaveProc2(void *arg) {_tmp_proc_1();} |
6573 | 912 |
static void SlStubSaveProc() {SlAutolength(SlStubSaveProc2, NULL);} |
0 | 913 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/** Save a chunk of data (eg. vehicles, stations, etc.). Each chunk is |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
915 |
* prefixed by an ID identifying it, followed by data, and terminator where appropiate |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
916 |
* @param ch The chunkhandler that will be used for the operation |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
0 | 918 |
static void SlSaveChunk(const ChunkHandler *ch) |
919 |
{ |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
ChunkSaveLoadProc *proc = ch->save_proc; |
0 | 921 |
|
922 |
SlWriteUint32(ch->id); |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
923 |
DEBUG(sl, 2, "Saving chunk %c%c%c%c", ch->id >> 24, ch->id >> 16, ch->id >> 8, ch->id); |
0 | 924 |
|
925 |
if (ch->flags & CH_AUTO_LENGTH) { |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
926 |
/* Need to calculate the length. Solve that by calling SlAutoLength in the save_proc. */ |
0 | 927 |
_tmp_proc_1 = proc; |
928 |
proc = SlStubSaveProc; |
|
929 |
} |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
930 |
|
0 | 931 |
_sl.block_mode = ch->flags & CH_TYPE_MASK; |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
932 |
switch (ch->flags & CH_TYPE_MASK) { |
0 | 933 |
case CH_RIFF: |
934 |
_sl.need_length = NL_WANTLENGTH; |
|
935 |
proc(); |
|
936 |
break; |
|
937 |
case CH_ARRAY: |
|
938 |
_sl.last_array_index = 0; |
|
939 |
SlWriteByte(CH_ARRAY); |
|
940 |
proc(); |
|
941 |
SlWriteArrayLength(0); // Terminate arrays |
|
942 |
break; |
|
943 |
case CH_SPARSE_ARRAY: |
|
944 |
SlWriteByte(CH_SPARSE_ARRAY); |
|
945 |
proc(); |
|
946 |
SlWriteArrayLength(0); // Terminate arrays |
|
947 |
break; |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
948 |
default: NOT_REACHED(); |
0 | 949 |
} |
950 |
} |
|
951 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
952 |
/** Save all chunks */ |
6573 | 953 |
static void SlSaveChunks() |
0 | 954 |
{ |
955 |
const ChunkHandler *ch; |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
956 |
const ChunkHandler* const *chsc; |
0 | 957 |
uint p; |
958 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
for (p = 0; p != CH_NUM_PRI_LEVELS; p++) { |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
960 |
for (chsc = _sl.chs; (ch = *chsc++) != NULL;) { |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
961 |
while (true) { |
0 | 962 |
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
|
963 |
SlSaveChunk(ch); |
0 | 964 |
if (ch->flags & CH_LAST) |
965 |
break; |
|
966 |
ch++; |
|
967 |
} |
|
968 |
} |
|
969 |
} |
|
970 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
971 |
/* Terminator */ |
0 | 972 |
SlWriteUint32(0); |
973 |
} |
|
974 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
975 |
/** Find the ChunkHandler that will be used for processing the found |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
976 |
* chunk in the savegame or in memory |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
977 |
* @param id the chunk in question |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* @return returns the appropiate chunkhandler |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
0 | 980 |
static const ChunkHandler *SlFindChunkHandler(uint32 id) |
981 |
{ |
|
982 |
const ChunkHandler *ch; |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
983 |
const ChunkHandler *const *chsc; |
6987
b0f13039bda2
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6982
diff
changeset
|
984 |
for (chsc = _sl.chs; (ch = *chsc++) != NULL;) { |
2952 | 985 |
for (;;) { |
986 |
if (ch->id == id) return ch; |
|
987 |
if (ch->flags & CH_LAST) break; |
|
0 | 988 |
ch++; |
989 |
} |
|
990 |
} |
|
991 |
return NULL; |
|
992 |
} |
|
993 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
994 |
/** Load all chunks */ |
6573 | 995 |
static void SlLoadChunks() |
0 | 996 |
{ |
997 |
uint32 id; |
|
998 |
const ChunkHandler *ch; |
|
999 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1000 |
for (id = SlReadUint32(); id != 0; id = SlReadUint32()) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
1001 |
DEBUG(sl, 2, "Loading chunk %c%c%c%c", id >> 24, id >> 16, id >> 8, id); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1002 |
|
0 | 1003 |
ch = SlFindChunkHandler(id); |
1004 |
if (ch == NULL) SlError("found unknown tag in savegame (sync error)"); |
|
1005 |
SlLoadChunk(ch); |
|
1006 |
} |
|
1007 |
} |
|
1008 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1009 |
/******************************************* |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1010 |
********** START OF LZO CODE ************** |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1011 |
*******************************************/ |
0 | 1012 |
#define LZO_SIZE 8192 |
1013 |
||
781
9717ff353c17
(svn r1248) -Add: initial OS/2 support (read docs/ReadMe_OS2.txt) (orudge)
truelight
parents:
762
diff
changeset
|
1014 |
#include "minilzo.h" |
0 | 1015 |
|
6573 | 1016 |
static uint ReadLZO() |
0 | 1017 |
{ |
1018 |
byte out[LZO_SIZE + LZO_SIZE / 64 + 16 + 3 + 8]; |
|
1019 |
uint32 tmp[2]; |
|
1020 |
uint32 size; |
|
1021 |
uint len; |
|
1022 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1023 |
/* Read header*/ |
0 | 1024 |
if (fread(tmp, sizeof(tmp), 1, _sl.fh) != 1) SlError("file read failed"); |
1025 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1026 |
/* Check if size is bad */ |
0 | 1027 |
((uint32*)out)[0] = size = tmp[1]; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
1028 |
|
2295
af67e1ea8687
(svn r2819) Make variables, which are exclusive for internal use of the save/load code, static in saveload.c
tron
parents:
2293
diff
changeset
|
1029 |
if (_sl_version != 0) { |
0 | 1030 |
tmp[0] = TO_BE32(tmp[0]); |
1031 |
size = TO_BE32(size); |
|
1032 |
} |
|
1033 |
||
1034 |
if (size >= sizeof(out)) SlError("inconsistent size"); |
|
1035 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1036 |
/* Read block */ |
0 | 1037 |
if (fread(out + sizeof(uint32), size, 1, _sl.fh) != 1) SlError("file read failed"); |
1038 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1039 |
/* Verify checksum */ |
0 | 1040 |
if (tmp[0] != lzo_adler32(0, out, size + sizeof(uint32))) SlError("bad checksum"); |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
1041 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1042 |
/* Decompress */ |
0 | 1043 |
lzo1x_decompress(out + sizeof(uint32)*1, size, _sl.buf, &len, NULL); |
1044 |
return len; |
|
1045 |
} |
|
1046 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1047 |
/* p contains the pointer to the buffer, len contains the pointer to the length. |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1048 |
* len bytes will be written, p and l will be updated to reflect the next buffer. */ |
0 | 1049 |
static void WriteLZO(uint size) |
1050 |
{ |
|
1051 |
byte out[LZO_SIZE + LZO_SIZE / 64 + 16 + 3 + 8]; |
|
1052 |
byte wrkmem[sizeof(byte*)*4096]; |
|
1053 |
uint outlen; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
1054 |
|
0 | 1055 |
lzo1x_1_compress(_sl.buf, size, out + sizeof(uint32)*2, &outlen, wrkmem); |
1056 |
((uint32*)out)[1] = TO_BE32(outlen); |
|
1057 |
((uint32*)out)[0] = TO_BE32(lzo_adler32(0, out + sizeof(uint32), outlen + sizeof(uint32))); |
|
1058 |
if (fwrite(out, outlen + sizeof(uint32)*2, 1, _sl.fh) != 1) SlError("file write failed"); |
|
1059 |
} |
|
1060 |
||
6573 | 1061 |
static bool InitLZO() |
1093
e8d26c7dc42f
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1024
diff
changeset
|
1062 |
{ |
0 | 1063 |
_sl.bufsize = LZO_SIZE; |
2414
53ecd2131592
(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
|
1064 |
_sl.buf = _sl.buf_ori = (byte*)malloc(LZO_SIZE); |
0 | 1065 |
return true; |
1066 |
} |
|
1067 |
||
6573 | 1068 |
static void UninitLZO() |
1093
e8d26c7dc42f
(svn r1594) Convert all undefined parameter lists to (void) and add the appropriate warning flags in the Makefile
tron
parents:
1024
diff
changeset
|
1069 |
{ |
2414
53ecd2131592
(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
|
1070 |
free(_sl.buf_ori); |
0 | 1071 |
} |
1072 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1073 |
/********************************************* |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1074 |
******** START OF NOCOMP CODE (uncompressed)* |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1075 |
*********************************************/ |
6573 | 1076 |
static uint ReadNoComp() |
0 | 1077 |
{ |
1078 |
return fread(_sl.buf, 1, LZO_SIZE, _sl.fh); |
|
1079 |
} |
|
1080 |
||
1081 |
static void WriteNoComp(uint size) |
|
1082 |
{ |
|
1083 |
fwrite(_sl.buf, 1, size, _sl.fh); |
|
1084 |
} |
|
1085 |
||
6573 | 1086 |
static bool InitNoComp() |
0 | 1087 |
{ |
1088 |
_sl.bufsize = LZO_SIZE; |
|
6987
b0f13039bda2
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6982
diff
changeset
|
1089 |
_sl.buf = _sl.buf_ori = (byte*)malloc(LZO_SIZE); |
0 | 1090 |
return true; |
1091 |
} |
|
1092 |
||
6573 | 1093 |
static void UninitNoComp() |
0 | 1094 |
{ |
2414
53ecd2131592
(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
|
1095 |
free(_sl.buf_ori); |
0 | 1096 |
} |
1097 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1098 |
/******************************************** |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1099 |
********** START OF MEMORY CODE (in ram)**** |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1100 |
********************************************/ |
1885
4ce583a5275b
(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
|
1101 |
|
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1102 |
#include "table/strings.h" |
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1103 |
#include "table/sprites.h" |
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1104 |
#include "gfx.h" |
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1105 |
#include "gui.h" |
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1106 |
|
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
1107 |
struct ThreadedSave { |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1108 |
uint count; |
5970
6830bcc04ea6
(svn r8214) -Fix (r8038): The fast forward flag stores 2 bits, not 1. Remember the
peter1138
parents:
5956
diff
changeset
|
1109 |
byte ff_state; |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1110 |
bool saveinprogress; |
1914
5ede46fd496f
(svn r2420) - Codechange: magic number elminitation of cursorsprites.
Darkvater
parents:
1913
diff
changeset
|
1111 |
CursorID cursor; |
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
1112 |
}; |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1113 |
|
1885
4ce583a5275b
(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
|
1114 |
/* A maximum size of of 128K * 500 = 64.000KB savegames */ |
5216
d581e4db95b6
(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
|
1115 |
STATIC_OLD_POOL(Savegame, byte, 17, 500, NULL, NULL) |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1116 |
static ThreadedSave _ts; |
1885
4ce583a5275b
(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
|
1117 |
|
6573 | 1118 |
static bool InitMem() |
1885
4ce583a5275b
(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 |
{ |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1120 |
_ts.count = 0; |
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1121 |
|
4985
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1122 |
CleanPool(&_Savegame_pool); |
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1123 |
AddBlockToPool(&_Savegame_pool); |
1885
4ce583a5275b
(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
|
1124 |
|
4ce583a5275b
(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
|
1125 |
/* A block from the pool is a contigious area of memory, so it is safe to write to it sequentially */ |
4985
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1126 |
_sl.bufsize = GetSavegamePoolSize(); |
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1127 |
_sl.buf = GetSavegame(_ts.count); |
1885
4ce583a5275b
(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
|
1128 |
return true; |
4ce583a5275b
(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
|
1129 |
} |
4ce583a5275b
(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 |
|
6573 | 1131 |
static void UnInitMem() |
1885
4ce583a5275b
(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 |
{ |
4985
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1133 |
CleanPool(&_Savegame_pool); |
1885
4ce583a5275b
(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 |
} |
4ce583a5275b
(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
|
1135 |
|
4ce583a5275b
(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 |
static void WriteMem(uint size) |
4ce583a5275b
(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 |
{ |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1138 |
_ts.count += size; |
1885
4ce583a5275b
(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 |
/* Allocate new block and new buffer-pointer */ |
4985
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1140 |
AddBlockIfNeeded(&_Savegame_pool, _ts.count); |
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1141 |
_sl.buf = GetSavegame(_ts.count); |
1885
4ce583a5275b
(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
|
1142 |
} |
4ce583a5275b
(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
|
1143 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1144 |
/******************************************** |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1145 |
********** START OF ZLIB CODE ************** |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1146 |
********************************************/ |
0 | 1147 |
|
1148 |
#if defined(WITH_ZLIB) |
|
2694
99d88a9d5337
(svn r3236) - Fix: warnings about 'CDECL must be used with ...' on VS6
Darkvater
parents:
2685
diff
changeset
|
1149 |
#include <zlib.h> |
2138
20c2cf0fb452
(svn r2648) Only use _stdcall calling convention for zlib on win32/msvc.
ludde
parents:
2126
diff
changeset
|
1150 |
|
0 | 1151 |
static z_stream _z; |
1152 |
||
6573 | 1153 |
static bool InitReadZlib() |
0 | 1154 |
{ |
1155 |
memset(&_z, 0, sizeof(_z)); |
|
1156 |
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
|
1157 |
|
0 | 1158 |
_sl.bufsize = 4096; |
2414
53ecd2131592
(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
|
1159 |
_sl.buf = _sl.buf_ori = (byte*)malloc(4096 + 4096); // also contains fread buffer |
0 | 1160 |
return true; |
1161 |
} |
|
1162 |
||
6573 | 1163 |
static uint ReadZlib() |
0 | 1164 |
{ |
1165 |
int r; |
|
1166 |
||
1167 |
_z.next_out = _sl.buf; |
|
1168 |
_z.avail_out = 4096; |
|
1169 |
||
1170 |
do { |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1171 |
/* read more bytes from the file?*/ |
0 | 1172 |
if (_z.avail_in == 0) { |
1173 |
_z.avail_in = fread(_z.next_in = _sl.buf + 4096, 1, 4096, _sl.fh); |
|
1174 |
} |
|
1175 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1176 |
/* inflate the data */ |
0 | 1177 |
r = inflate(&_z, 0); |
1178 |
if (r == Z_STREAM_END) |
|
1179 |
break; |
|
1180 |
||
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
1181 |
if (r != Z_OK) |
0 | 1182 |
SlError("inflate() failed"); |
1183 |
} while (_z.avail_out); |
|
1184 |
||
1185 |
return 4096 - _z.avail_out; |
|
1186 |
} |
|
1187 |
||
6573 | 1188 |
static void UninitReadZlib() |
0 | 1189 |
{ |
1190 |
inflateEnd(&_z); |
|
2414
53ecd2131592
(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
|
1191 |
free(_sl.buf_ori); |
0 | 1192 |
} |
1193 |
||
6573 | 1194 |
static bool InitWriteZlib() |
0 | 1195 |
{ |
1196 |
memset(&_z, 0, sizeof(_z)); |
|
1197 |
if (deflateInit(&_z, 6) != Z_OK) return false; |
|
1198 |
||
1199 |
_sl.bufsize = 4096; |
|
2414
53ecd2131592
(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
|
1200 |
_sl.buf = _sl.buf_ori = (byte*)malloc(4096); // also contains fread buffer |
0 | 1201 |
return true; |
1202 |
} |
|
1203 |
||
1204 |
static void WriteZlibLoop(z_streamp z, byte *p, uint len, int mode) |
|
1205 |
{ |
|
1884
ae1d6213c6dd
(svn r2390) - Codechange: Fix some warnings on GCC 4.0.0
hackykid
parents:
1881
diff
changeset
|
1206 |
byte buf[1024]; // output buffer |
0 | 1207 |
int r; |
1208 |
uint n; |
|
1209 |
z->next_in = p; |
|
1210 |
z->avail_in = len; |
|
1211 |
do { |
|
1212 |
z->next_out = buf; |
|
1213 |
z->avail_out = sizeof(buf); |
|
2026 | 1214 |
r = deflate(z, mode); |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1215 |
/* bytes were emitted? */ |
0 | 1216 |
if ((n=sizeof(buf) - z->avail_out) != 0) { |
1217 |
if (fwrite(buf, n, 1, _sl.fh) != 1) SlError("file write error"); |
|
1218 |
} |
|
1219 |
if (r == Z_STREAM_END) |
|
1220 |
break; |
|
1221 |
if (r != Z_OK) SlError("zlib returned error code"); |
|
1222 |
} while (z->avail_in || !z->avail_out); |
|
1223 |
} |
|
1224 |
||
1225 |
static void WriteZlib(uint len) |
|
1226 |
{ |
|
1227 |
WriteZlibLoop(&_z, _sl.buf, len, 0); |
|
1228 |
} |
|
1229 |
||
6573 | 1230 |
static void UninitWriteZlib() |
0 | 1231 |
{ |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1232 |
/* flush any pending output. */ |
0 | 1233 |
if (_sl.fh) WriteZlibLoop(&_z, NULL, 0, Z_FINISH); |
1234 |
deflateEnd(&_z); |
|
2414
53ecd2131592
(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
|
1235 |
free(_sl.buf_ori); |
0 | 1236 |
} |
1237 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1238 |
#endif /* WITH_ZLIB */ |
0 | 1239 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1240 |
/******************************************* |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1241 |
************* END OF CODE ***************** |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1242 |
*******************************************/ |
0 | 1243 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1244 |
/* these define the chunks */ |
0 | 1245 |
extern const ChunkHandler _misc_chunk_handlers[]; |
3112
05a599216d83
(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
|
1246 |
extern const ChunkHandler _setting_chunk_handlers[]; |
0 | 1247 |
extern const ChunkHandler _player_chunk_handlers[]; |
2848 | 1248 |
extern const ChunkHandler _engine_chunk_handlers[]; |
0 | 1249 |
extern const ChunkHandler _veh_chunk_handlers[]; |
1542
2ca6d1624e6d
(svn r2046) -Codechange: moved all waypoint code to waypoint.c/waypoint.h
truelight
parents:
1537
diff
changeset
|
1250 |
extern const ChunkHandler _waypoint_chunk_handlers[]; |
1313
bba6afb8a995
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1299
diff
changeset
|
1251 |
extern const ChunkHandler _depot_chunk_handlers[]; |
1024
9b06b01490a4
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
950
diff
changeset
|
1252 |
extern const ChunkHandler _order_chunk_handlers[]; |
0 | 1253 |
extern const ChunkHandler _town_chunk_handlers[]; |
1254 |
extern const ChunkHandler _sign_chunk_handlers[]; |
|
1255 |
extern const ChunkHandler _station_chunk_handlers[]; |
|
1256 |
extern const ChunkHandler _industry_chunk_handlers[]; |
|
1257 |
extern const ChunkHandler _economy_chunk_handlers[]; |
|
1258 |
extern const ChunkHandler _animated_tile_chunk_handlers[]; |
|
5228
c4a780348f66
(svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents:
5216
diff
changeset
|
1259 |
extern const ChunkHandler _newgrf_chunk_handlers[]; |
7139
4ae3ab180d05
(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:
7067
diff
changeset
|
1260 |
extern const ChunkHandler _group_chunk_handlers[]; |
0 | 1261 |
|
1262 |
static const ChunkHandler * const _chunk_handlers[] = { |
|
1263 |
_misc_chunk_handlers, |
|
3112
05a599216d83
(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
|
1264 |
_setting_chunk_handlers, |
0 | 1265 |
_veh_chunk_handlers, |
1542
2ca6d1624e6d
(svn r2046) -Codechange: moved all waypoint code to waypoint.c/waypoint.h
truelight
parents:
1537
diff
changeset
|
1266 |
_waypoint_chunk_handlers, |
1313
bba6afb8a995
(svn r1817) -Codechange: Moved depot-functions to depot.c
truelight
parents:
1299
diff
changeset
|
1267 |
_depot_chunk_handlers, |
1024
9b06b01490a4
(svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents:
950
diff
changeset
|
1268 |
_order_chunk_handlers, |
0 | 1269 |
_industry_chunk_handlers, |
1270 |
_economy_chunk_handlers, |
|
1271 |
_engine_chunk_handlers, |
|
1272 |
_town_chunk_handlers, |
|
1273 |
_sign_chunk_handlers, |
|
1274 |
_station_chunk_handlers, |
|
1275 |
_player_chunk_handlers, |
|
1276 |
_animated_tile_chunk_handlers, |
|
5228
c4a780348f66
(svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents:
5216
diff
changeset
|
1277 |
_newgrf_chunk_handlers, |
7139
4ae3ab180d05
(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:
7067
diff
changeset
|
1278 |
_group_chunk_handlers, |
0 | 1279 |
NULL, |
1280 |
}; |
|
1281 |
||
6444
4c24b0b57fe7
(svn r8854) -Fix(r8853): Ctrl+s (save) without Ctrl does not produce desired result...
belugas
parents:
6443
diff
changeset
|
1282 |
/* used to include a vehicle desc in another desc. */ |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1283 |
extern const SaveLoad _common_veh_desc[]; |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1284 |
static const SaveLoad* const _desc_includes[] = { |
0 | 1285 |
_common_veh_desc |
1286 |
}; |
|
1287 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1288 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1289 |
* Pointers cannot be saved to a savegame, so this functions gets |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1290 |
* the index of the item, and if not available, it hussles with |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* pointers (looks really bad :() |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* Remember that a NULL item has value 0, and all |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* indeces have +1, so vehicle 0 is saved as index 1. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* @param obj The object that we want to get the index of |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1295 |
* @param rt SLRefType type of the object the index is being sought of |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* @return Return the pointer converted to an index of the type pointed to |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1298 |
static uint ReferenceToInt(const void *obj, SLRefType rt) |
0 | 1299 |
{ |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
if (obj == NULL) return 0; |
938
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1301 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1302 |
switch (rt) { |
938
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1303 |
case REF_VEHICLE_OLD: // Old vehicles we save as new onces |
2548
97ada3bd2702
(svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents:
2482
diff
changeset
|
1304 |
case REF_VEHICLE: return ((const Vehicle*)obj)->index + 1; |
97ada3bd2702
(svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents:
2482
diff
changeset
|
1305 |
case REF_STATION: return ((const Station*)obj)->index + 1; |
97ada3bd2702
(svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents:
2482
diff
changeset
|
1306 |
case REF_TOWN: return ((const Town*)obj)->index + 1; |
97ada3bd2702
(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_ORDER: return ((const Order*)obj)->index + 1; |
97ada3bd2702
(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_ROADSTOPS: return ((const RoadStop*)obj)->index + 1; |
2848 | 1309 |
case REF_ENGINE_RENEWS: return ((const EngineRenew*)obj)->index + 1; |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1310 |
default: NOT_REACHED(); |
938
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1311 |
} |
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1312 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1313 |
return 0; // avoid compiler warning |
0 | 1314 |
} |
1315 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1316 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* Pointers cannot be loaded from a savegame, so this function |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1318 |
* gets the index from the savegame and returns the appropiate |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1319 |
* pointer from the already loaded base. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* Remember that an index of 0 is a NULL pointer so all indeces |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* are +1 so vehicle 0 is saved as 1. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* @param index The index that is being converted to a pointer |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1323 |
* @param rt SLRefType type of the object the pointer is sought of |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* @return Return the index converted to a pointer of any type |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
*/ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
static void *IntToReference(uint index, SLRefType rt) |
0 | 1327 |
{ |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/* After version 4.3 REF_VEHICLE_OLD is saved as REF_VEHICLE, |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* and should be loaded like that */ |
2685
00111d5ca47f
(svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents:
2676
diff
changeset
|
1330 |
if (rt == REF_VEHICLE_OLD && !CheckSavegameVersionOldStyle(4, 4)) |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1331 |
rt = REF_VEHICLE; |
938
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1332 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/* No need to look up NULL pointers, just return immediately */ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1334 |
if (rt != REF_VEHICLE_OLD && index == 0) |
938
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1335 |
return NULL; |
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1336 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
index--; // correct for the NULL index |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
|
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1339 |
switch (rt) { |
1314
d6a253cf92c3
(svn r1818) -Add: Dynamic orders (up to 64k orders)
truelight
parents:
1313
diff
changeset
|
1340 |
case REF_ORDER: { |
4977 | 1341 |
if (!AddBlockIfNeeded(&_Order_pool, index)) |
1314
d6a253cf92c3
(svn r1818) -Add: Dynamic orders (up to 64k orders)
truelight
parents:
1313
diff
changeset
|
1342 |
error("Orders: failed loading savegame: too many orders"); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
return GetOrder(index); |
1314
d6a253cf92c3
(svn r1818) -Add: Dynamic orders (up to 64k orders)
truelight
parents:
1313
diff
changeset
|
1344 |
} |
1279
4f83fbde72de
(svn r1783) -Add: Dynamic vehicles (now up to 64k of vehicles)
truelight
parents:
1272
diff
changeset
|
1345 |
case REF_VEHICLE: { |
4972 | 1346 |
if (!AddBlockIfNeeded(&_Vehicle_pool, index)) |
1279
4f83fbde72de
(svn r1783) -Add: Dynamic vehicles (now up to 64k of vehicles)
truelight
parents:
1272
diff
changeset
|
1347 |
error("Vehicles: failed loading savegame: too many vehicles"); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1348 |
return GetVehicle(index); |
1279
4f83fbde72de
(svn r1783) -Add: Dynamic vehicles (now up to 64k of vehicles)
truelight
parents:
1272
diff
changeset
|
1349 |
} |
1272
d3e09adb7736
(svn r1776) -Add: Dynamic stations. You can now have up to 64k of stations
truelight
parents:
1266
diff
changeset
|
1350 |
case REF_STATION: { |
4980 | 1351 |
if (!AddBlockIfNeeded(&_Station_pool, index)) |
1272
d3e09adb7736
(svn r1776) -Add: Dynamic stations. You can now have up to 64k of stations
truelight
parents:
1266
diff
changeset
|
1352 |
error("Stations: failed loading savegame: too many stations"); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1353 |
return GetStation(index); |
1272
d3e09adb7736
(svn r1776) -Add: Dynamic stations. You can now have up to 64k of stations
truelight
parents:
1266
diff
changeset
|
1354 |
} |
1260
c60e76928e5c
(svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents:
1218
diff
changeset
|
1355 |
case REF_TOWN: { |
4983 | 1356 |
if (!AddBlockIfNeeded(&_Town_pool, index)) |
1260
c60e76928e5c
(svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents:
1218
diff
changeset
|
1357 |
error("Towns: failed loading savegame: too many towns"); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1358 |
return GetTown(index); |
1260
c60e76928e5c
(svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents:
1218
diff
changeset
|
1359 |
} |
1284
06a52178bf46
(svn r1788) -Add: Made RoadStops dynamic. You can now create up to 64k roadstops.
truelight
parents:
1282
diff
changeset
|
1360 |
case REF_ROADSTOPS: { |
4981
f19132348a43
(svn r6984) Use the pool macros for the RoadStop pool
tron
parents:
4980
diff
changeset
|
1361 |
if (!AddBlockIfNeeded(&_RoadStop_pool, index)) |
1314
d6a253cf92c3
(svn r1818) -Add: Dynamic orders (up to 64k orders)
truelight
parents:
1313
diff
changeset
|
1362 |
error("RoadStops: failed loading savegame: too many RoadStops"); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1363 |
return GetRoadStop(index); |
1284
06a52178bf46
(svn r1788) -Add: Made RoadStops dynamic. You can now create up to 64k roadstops.
truelight
parents:
1282
diff
changeset
|
1364 |
} |
2848 | 1365 |
case REF_ENGINE_RENEWS: { |
4974
c962d0622bc1
(svn r6977) Use the pool macros for the EngineRenew pool
tron
parents:
4972
diff
changeset
|
1366 |
if (!AddBlockIfNeeded(&_EngineRenew_pool, index)) |
2848 | 1367 |
error("EngineRenews: failed loading savegame: too many EngineRenews"); |
1368 |
return GetEngineRenew(index); |
|
1369 |
} |
|
938
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1370 |
|
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1371 |
case REF_VEHICLE_OLD: { |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1372 |
/* Old vehicles were saved differently: |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1373 |
* invalid vehicle was 0xFFFF, |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1374 |
* and the index was not - 1.. correct for this */ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1375 |
index++; |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1376 |
if (index == INVALID_VEHICLE) |
938
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1377 |
return NULL; |
1279
4f83fbde72de
(svn r1783) -Add: Dynamic vehicles (now up to 64k of vehicles)
truelight
parents:
1272
diff
changeset
|
1378 |
|
4972 | 1379 |
if (!AddBlockIfNeeded(&_Vehicle_pool, index)) |
1279
4f83fbde72de
(svn r1783) -Add: Dynamic vehicles (now up to 64k of vehicles)
truelight
parents:
1272
diff
changeset
|
1380 |
error("Vehicles: failed loading savegame: too many vehicles"); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
return GetVehicle(index); |
938
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1382 |
} |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
default: NOT_REACHED(); |
938
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1384 |
} |
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1385 |
|
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1386 |
return NULL; |
0 | 1387 |
} |
1388 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1389 |
/** The format for a reader/writer type of a savegame */ |
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
1390 |
struct SaveLoadFormat { |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1391 |
const char *name; ///< name of the compressor/decompressor (debug-only) |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1392 |
uint32 tag; ///< the 4-letter tag by which it is identified in the savegame |
0 | 1393 |
|
6573 | 1394 |
bool (*init_read)(); ///< function executed upon initalization of the loader |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1395 |
ReaderProc *reader; ///< function that loads the data from the file |
6573 | 1396 |
void (*uninit_read)(); ///< function executed when reading is finished |
0 | 1397 |
|
6573 | 1398 |
bool (*init_write)(); ///< function executed upon intialization of the saver |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1399 |
WriterProc *writer; ///< function that saves the data to the file |
6573 | 1400 |
void (*uninit_write)(); ///< function executed when writing is done |
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
1401 |
}; |
0 | 1402 |
|
1403 |
static const SaveLoadFormat _saveload_formats[] = { |
|
1885
4ce583a5275b
(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
|
1404 |
{"memory", 0, NULL, NULL, NULL, InitMem, WriteMem, UnInitMem}, |
4ce583a5275b
(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
|
1405 |
{"lzo", TO_BE32X('OTTD'), InitLZO, ReadLZO, UninitLZO, InitLZO, WriteLZO, UninitLZO}, |
4ce583a5275b
(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
|
1406 |
{"none", TO_BE32X('OTTN'), InitNoComp, ReadNoComp, UninitNoComp, InitNoComp, WriteNoComp, UninitNoComp}, |
0 | 1407 |
#if defined(WITH_ZLIB) |
1885
4ce583a5275b
(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
|
1408 |
{"zlib", TO_BE32X('OTTZ'), InitReadZlib, ReadZlib, UninitReadZlib, InitWriteZlib, WriteZlib, UninitWriteZlib}, |
0 | 1409 |
#else |
1885
4ce583a5275b
(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
|
1410 |
{"zlib", TO_BE32X('OTTZ'), NULL, NULL, NULL, NULL, NULL, NULL}, |
0 | 1411 |
#endif |
1412 |
}; |
|
1413 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1414 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1415 |
* Return the savegameformat of the game. Whether it was create with ZLIB compression |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1416 |
* uncompressed, or another type |
1885
4ce583a5275b
(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 |
* @param s Name of the savegame format. If NULL it picks the first available one |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1418 |
* @return Pointer to SaveLoadFormat struct giving all characteristics of this type of savegame |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1419 |
*/ |
0 | 1420 |
static const SaveLoadFormat *GetSavegameFormat(const char *s) |
1421 |
{ |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1422 |
const SaveLoadFormat *def = endof(_saveload_formats) - 1; |
0 | 1423 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1424 |
/* find default savegame format, the highest one with which files can be written */ |
0 | 1425 |
while (!def->init_write) def--; |
1426 |
||
1885
4ce583a5275b
(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
|
1427 |
if (s != NULL && s[0] != '\0') { |
4ce583a5275b
(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
|
1428 |
const SaveLoadFormat *slf; |
4ce583a5275b
(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
|
1429 |
for (slf = &_saveload_formats[0]; slf != endof(_saveload_formats); slf++) { |
4ce583a5275b
(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
|
1430 |
if (slf->init_write != NULL && strcmp(s, slf->name) == 0) |
4ce583a5275b
(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
|
1431 |
return slf; |
4ce583a5275b
(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
|
1432 |
} |
0 | 1433 |
|
1434 |
ShowInfoF("Savegame format '%s' is not available. Reverting to '%s'.", s, def->name); |
|
1435 |
} |
|
1436 |
return def; |
|
1437 |
} |
|
1438 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1439 |
/* actual loader/saver function */ |
2828
996de8e891c7
(svn r3376) -Codechange: made enums for GenerateWorld and InitializeGame 'mode'
truelight
parents:
2808
diff
changeset
|
1440 |
void InitializeGame(int mode, uint size_x, uint size_y); |
6573 | 1441 |
extern bool AfterLoadGame(); |
1442 |
extern void BeforeSaveGame(); |
|
0 | 1443 |
extern bool LoadOldSaveGame(const char *file); |
1444 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1445 |
/** Small helper function to close the to be loaded savegame an signal error */ |
6573 | 1446 |
static inline SaveOrLoadResult AbortSaveLoad() |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1447 |
{ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1448 |
if (_sl.fh != NULL) fclose(_sl.fh); |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1449 |
|
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1450 |
_sl.fh = NULL; |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1451 |
return SL_ERROR; |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1452 |
} |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1453 |
|
1885
4ce583a5275b
(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
|
1454 |
/** Update the gui accordingly when starting saving |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1455 |
* and set locks on saveload. Also turn off fast-forward cause with that |
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1456 |
* saving takes Aaaaages */ |
6573 | 1457 |
void SaveFileStart() |
1885
4ce583a5275b
(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
|
1458 |
{ |
5970
6830bcc04ea6
(svn r8214) -Fix (r8038): The fast forward flag stores 2 bits, not 1. Remember the
peter1138
parents:
5956
diff
changeset
|
1459 |
_ts.ff_state = _fast_forward; |
6830bcc04ea6
(svn r8214) -Fix (r8038): The fast forward flag stores 2 bits, not 1. Remember the
peter1138
parents:
5956
diff
changeset
|
1460 |
_fast_forward = 0; |
5919
2b58160d667d
(svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents:
5838
diff
changeset
|
1461 |
if (_cursor.sprite == SPR_CURSOR_MOUSE) SetMouseCursor(SPR_CURSOR_ZZZ, PAL_NONE); |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1462 |
|
1885
4ce583a5275b
(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 |
SendWindowMessage(WC_STATUS_BAR, 0, true, 0, 0); |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1464 |
_ts.saveinprogress = true; |
1885
4ce583a5275b
(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
|
1465 |
} |
4ce583a5275b
(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
|
1466 |
|
4ce583a5275b
(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 |
/** Update the gui accordingly when saving is done and release locks |
4ce583a5275b
(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
|
1468 |
* on saveload */ |
6573 | 1469 |
void SaveFileDone() |
1885
4ce583a5275b
(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
|
1470 |
{ |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1471 |
_fast_forward = _ts.ff_state; |
5919
2b58160d667d
(svn r8128) -Codechange: Split sprite and palette remap into separate 32 bit values.
peter1138
parents:
5838
diff
changeset
|
1472 |
if (_cursor.sprite == SPR_CURSOR_ZZZ) SetMouseCursor(SPR_CURSOR_MOUSE, PAL_NONE); |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1473 |
|
1885
4ce583a5275b
(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 |
SendWindowMessage(WC_STATUS_BAR, 0, false, 0, 0); |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1475 |
_ts.saveinprogress = false; |
1885
4ce583a5275b
(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 |
} |
4ce583a5275b
(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 |
|
2380
3b26659b4a9a
(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
|
1478 |
/** Show a gui message when saving has failed */ |
6573 | 1479 |
void SaveFileError() |
2380
3b26659b4a9a
(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
|
1480 |
{ |
3b26659b4a9a
(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
|
1481 |
ShowErrorMessage(STR_4007_GAME_SAVE_FAILED, STR_NULL, 0, 0); |
3b26659b4a9a
(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
|
1482 |
SaveFileDone(); |
3b26659b4a9a
(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
|
1483 |
} |
3b26659b4a9a
(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
|
1484 |
|
4298
3417f80deca1
(svn r5943) -Merge TGP (part r5725): -Codechange: renamed Thread to OTTDThread, as Windows
truelight
parents:
4257
diff
changeset
|
1485 |
static OTTDThread* save_thread; |
2382
5af5004feae4
(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
|
1486 |
|
4978
c25cbe937318
(svn r6981) Use the pool macros for the Savegame pool
tron
parents:
4977
diff
changeset
|
1487 |
/** We have written the whole game into memory, _Savegame_pool, now find |
1885
4ce583a5275b
(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
|
1488 |
* and appropiate compressor and start writing to file. |
4ce583a5275b
(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
|
1489 |
*/ |
5956
04e89c320747
(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:
5934
diff
changeset
|
1490 |
static SaveOrLoadResult SaveFileToDisk(bool threaded) |
1885
4ce583a5275b
(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
|
1491 |
{ |
2927
15690f1a9bb8
(svn r3483) -Fix: fixed warning about setjmp (tnx Bjarni for testing, and tnx for
truelight
parents:
2916
diff
changeset
|
1492 |
const SaveLoadFormat *fmt; |
1885
4ce583a5275b
(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
|
1493 |
uint32 hdr[2]; |
4ce583a5275b
(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
|
1494 |
|
4ce583a5275b
(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
|
1495 |
/* XXX - Setup setjmp error handler if an error occurs anywhere deep during |
4ce583a5275b
(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
|
1496 |
* loading/saving execute a longjmp() and continue execution here */ |
4ce583a5275b
(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
|
1497 |
if (setjmp(_sl.excpt)) { |
4ce583a5275b
(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
|
1498 |
AbortSaveLoad(); |
4ce583a5275b
(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
|
1499 |
_sl.excpt_uninit(); |
4ce583a5275b
(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
|
1500 |
|
2413
4ba8f2b0da2e
(svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents:
2382
diff
changeset
|
1501 |
fprintf(stderr, "Save game failed: %s.", _sl.excpt_msg); |
5956
04e89c320747
(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:
5934
diff
changeset
|
1502 |
if (threaded) { |
4077
d3022f976946
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
4059
diff
changeset
|
1503 |
OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_ERROR); |
d3022f976946
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
4059
diff
changeset
|
1504 |
} else { |
d3022f976946
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
4059
diff
changeset
|
1505 |
SaveFileError(); |
d3022f976946
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
4059
diff
changeset
|
1506 |
} |
5956
04e89c320747
(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:
5934
diff
changeset
|
1507 |
return SL_ERROR; |
1885
4ce583a5275b
(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
|
1508 |
} |
4ce583a5275b
(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
|
1509 |
|
2927
15690f1a9bb8
(svn r3483) -Fix: fixed warning about setjmp (tnx Bjarni for testing, and tnx for
truelight
parents:
2916
diff
changeset
|
1510 |
fmt = GetSavegameFormat(_savegame_format); |
15690f1a9bb8
(svn r3483) -Fix: fixed warning about setjmp (tnx Bjarni for testing, and tnx for
truelight
parents:
2916
diff
changeset
|
1511 |
|
1885
4ce583a5275b
(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
|
1512 |
/* We have written our stuff to memory, now write it to file! */ |
4ce583a5275b
(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
|
1513 |
hdr[0] = fmt->tag; |
2685
00111d5ca47f
(svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents:
2676
diff
changeset
|
1514 |
hdr[1] = TO_BE32(SAVEGAME_VERSION << 16); |
1885
4ce583a5275b
(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 |
if (fwrite(hdr, sizeof(hdr), 1, _sl.fh) != 1) SlError("file write failed"); |
4ce583a5275b
(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 |
|
4ce583a5275b
(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
|
1517 |
if (!fmt->init_write()) SlError("cannot initialize compressor"); |
4ce583a5275b
(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 |
|
4ce583a5275b
(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
|
1519 |
{ |
4ce583a5275b
(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 |
uint i; |
4985
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1521 |
uint count = 1 << Savegame_POOL_BLOCK_SIZE_BITS; |
1885
4ce583a5275b
(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
|
1522 |
|
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1523 |
assert(_ts.count == _sl.offs_base); |
4985
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1524 |
for (i = 0; i != _Savegame_pool.current_blocks - 1; i++) { |
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1525 |
_sl.buf = _Savegame_pool.blocks[i]; |
1885
4ce583a5275b
(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 |
fmt->writer(count); |
4ce583a5275b
(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
|
1527 |
} |
4ce583a5275b
(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 |
|
4ce583a5275b
(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
|
1529 |
/* The last block is (almost) always not fully filled, so only write away |
4ce583a5275b
(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
|
1530 |
* as much data as it is in there */ |
4985
5eabae0d9108
(svn r6988) Remove a layer of indirection when using the Savegame pool
tron
parents:
4983
diff
changeset
|
1531 |
_sl.buf = _Savegame_pool.blocks[i]; |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1532 |
fmt->writer(_ts.count - (i * count)); |
1885
4ce583a5275b
(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
|
1533 |
} |
4ce583a5275b
(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
|
1534 |
|
4ce583a5275b
(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
|
1535 |
fmt->uninit_write(); |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1536 |
assert(_ts.count == _sl.offs_base); |
1885
4ce583a5275b
(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
|
1537 |
GetSavegameFormat("memory")->uninit_write(); // clean the memorypool |
4ce583a5275b
(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 |
fclose(_sl.fh); |
4ce583a5275b
(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 |
|
5956
04e89c320747
(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:
5934
diff
changeset
|
1540 |
if (threaded) OTTD_SendThreadMessage(MSG_OTTD_SAVETHREAD_DONE); |
04e89c320747
(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:
5934
diff
changeset
|
1541 |
|
04e89c320747
(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:
5934
diff
changeset
|
1542 |
return SL_OK; |
04e89c320747
(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:
5934
diff
changeset
|
1543 |
} |
04e89c320747
(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:
5934
diff
changeset
|
1544 |
|
04e89c320747
(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:
5934
diff
changeset
|
1545 |
static void* SaveFileToDiskThread(void *arg) |
04e89c320747
(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:
5934
diff
changeset
|
1546 |
{ |
04e89c320747
(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:
5934
diff
changeset
|
1547 |
SaveFileToDisk(true); |
2286
acb76b379e72
(svn r2810) Threads may now return information when they terminate using a void*.
tron
parents:
2285
diff
changeset
|
1548 |
return NULL; |
1885
4ce583a5275b
(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 |
} |
4ce583a5275b
(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 |
|
6573 | 1551 |
void WaitTillSaved() |
2285
3193cbd1ba88
(svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
2283
diff
changeset
|
1552 |
{ |
3193cbd1ba88
(svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
2283
diff
changeset
|
1553 |
OTTDJoinThread(save_thread); |
3193cbd1ba88
(svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
2283
diff
changeset
|
1554 |
save_thread = NULL; |
3193cbd1ba88
(svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
2283
diff
changeset
|
1555 |
} |
3193cbd1ba88
(svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
2283
diff
changeset
|
1556 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1557 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1558 |
* Main Save or Load function where the high-level saveload functions are |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1559 |
* handled. It opens the savegame, selects format and checks versions |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1560 |
* @param filename The name of the savegame being created/loaded |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1561 |
* @param mode Save or load. Load can also be a TTD(Patch) game. Use SL_LOAD, SL_OLD_LOAD or SL_SAVE |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1562 |
* @return Return the results of the action. SL_OK, SL_ERROR or SL_REINIT ("unload" the game) |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1563 |
*/ |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7313
diff
changeset
|
1564 |
SaveOrLoadResult SaveOrLoad(const char *filename, int mode, Subdirectory sb) |
0 | 1565 |
{ |
1566 |
uint32 hdr[2]; |
|
1567 |
const SaveLoadFormat *fmt; |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
1568 |
|
2413
4ba8f2b0da2e
(svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents:
2382
diff
changeset
|
1569 |
/* An instance of saving is already active, so don't go saving again */ |
4ba8f2b0da2e
(svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents:
2382
diff
changeset
|
1570 |
if (_ts.saveinprogress && mode == SL_SAVE) { |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1571 |
/* if not an autosave, but a user action, show error message */ |
2749
46aba09ca365
(svn r3294) - Fix: use INVALID_STRING_ID instead of -1.
Darkvater
parents:
2694
diff
changeset
|
1572 |
if (!_do_autosave) ShowErrorMessage(INVALID_STRING_ID, STR_SAVE_STILL_IN_PROGRESS, 0, 0); |
2413
4ba8f2b0da2e
(svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents:
2382
diff
changeset
|
1573 |
return SL_OK; |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1574 |
} |
2413
4ba8f2b0da2e
(svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents:
2382
diff
changeset
|
1575 |
WaitTillSaved(); |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1576 |
|
2413
4ba8f2b0da2e
(svn r2939) Fix racing condition when using threaded saving (last one I hope).
Darkvater
parents:
2382
diff
changeset
|
1577 |
/* Load a TTDLX or TTDPatch game */ |
0 | 1578 |
if (mode == SL_OLD_LOAD) { |
2828
996de8e891c7
(svn r3376) -Codechange: made enums for GenerateWorld and InitializeGame 'mode'
truelight
parents:
2808
diff
changeset
|
1579 |
InitializeGame(IG_DATE_RESET, 256, 256); // set a mapsize of 256x256 for TTDPatch games or it might get confused |
0 | 1580 |
if (!LoadOldSaveGame(filename)) return SL_REINIT; |
2808
35e0e9c6c227
(svn r3356) - Remove unused parameter of AfterLoadGame().
peter1138
parents:
2749
diff
changeset
|
1581 |
_sl_version = 0; |
35e0e9c6c227
(svn r3356) - Remove unused parameter of AfterLoadGame().
peter1138
parents:
2749
diff
changeset
|
1582 |
AfterLoadGame(); |
0 | 1583 |
return SL_OK; |
1584 |
} |
|
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
1585 |
|
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7313
diff
changeset
|
1586 |
_sl.fh = (mode == SL_SAVE) ? FioFOpenFile(filename, "wb", sb) : FioFOpenFile(filename, "rb", sb); |
7431
f340111a55ec
(svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents:
7425
diff
changeset
|
1587 |
|
f340111a55ec
(svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents:
7425
diff
changeset
|
1588 |
/* Make it a little easier to load savegames from the console */ |
f340111a55ec
(svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents:
7425
diff
changeset
|
1589 |
if (_sl.fh == NULL && mode == SL_LOAD) _sl.fh = FioFOpenFile(filename, "rb", SAVE_DIR); |
f340111a55ec
(svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents:
7425
diff
changeset
|
1590 |
if (_sl.fh == NULL && mode == SL_LOAD) _sl.fh = FioFOpenFile(filename, "rb", BASE_DIR); |
f340111a55ec
(svn r10188) -Codechange: make it a little easier to load a savegame from the console:
rubidium
parents:
7425
diff
changeset
|
1591 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
if (_sl.fh == NULL) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
1593 |
DEBUG(sl, 0, "Cannot open savegame '%s' for saving/loading.", filename); |
0 | 1594 |
return SL_ERROR; |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1595 |
} |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
1596 |
|
0 | 1597 |
_sl.bufe = _sl.bufp = NULL; |
1598 |
_sl.offs_base = 0; |
|
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
1599 |
_sl.save = (mode != 0); |
0 | 1600 |
_sl.includes = _desc_includes; |
1601 |
_sl.chs = _chunk_handlers; |
|
1602 |
||
1885
4ce583a5275b
(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
|
1603 |
/* XXX - Setup setjmp error handler if an error occurs anywhere deep during |
4ce583a5275b
(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
|
1604 |
* loading/saving execute a longjmp() and continue execution here */ |
0 | 1605 |
if (setjmp(_sl.excpt)) { |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1606 |
AbortSaveLoad(); |
0 | 1607 |
|
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1608 |
/* deinitialize compressor. */ |
0 | 1609 |
_sl.excpt_uninit(); |
1610 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1611 |
/* A saver/loader exception!! reinitialize all variables to prevent crash! */ |
0 | 1612 |
if (mode == SL_LOAD) { |
1613 |
ShowInfoF("Load game failed: %s.", _sl.excpt_msg); |
|
1614 |
return SL_REINIT; |
|
1615 |
} |
|
2382
5af5004feae4
(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
|
1616 |
|
2380
3b26659b4a9a
(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
|
1617 |
ShowInfoF("Save game failed: %s.", _sl.excpt_msg); |
3b26659b4a9a
(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
|
1618 |
return SL_ERROR; |
0 | 1619 |
} |
1620 |
||
1885
4ce583a5275b
(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
|
1621 |
/* General tactic is to first save the game to memory, then use an available writer |
4ce583a5275b
(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
|
1622 |
* to write it to file, either in threaded mode if possible, or single-threaded */ |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1623 |
if (mode == SL_SAVE) { /* SAVE game */ |
1885
4ce583a5275b
(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
|
1624 |
fmt = GetSavegameFormat("memory"); // write to memory |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
1625 |
|
0 | 1626 |
_sl.write_bytes = fmt->writer; |
1627 |
_sl.excpt_uninit = fmt->uninit_write; |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1628 |
if (!fmt->init_write()) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
1629 |
DEBUG(sl, 0, "Initializing writer '%s' failed.", fmt->name); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1630 |
return AbortSaveLoad(); |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1631 |
} |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
1632 |
|
2685
00111d5ca47f
(svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents:
2676
diff
changeset
|
1633 |
_sl_version = SAVEGAME_VERSION; |
193
0a7025304867
(svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents:
121
diff
changeset
|
1634 |
|
0 | 1635 |
BeforeSaveGame(); |
1636 |
SlSaveChunks(); |
|
1637 |
SlWriteFill(); // flush the save buffer |
|
1885
4ce583a5275b
(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
|
1638 |
|
4323
78204e7c3100
(svn r5977) -Fix [FS#78]: never set I-am-a-thread bool to true IN the thread. Machines with
truelight
parents:
4300
diff
changeset
|
1639 |
SaveFileStart(); |
2285
3193cbd1ba88
(svn r2809) Implement more generic threading functions, which allow more than one thread
tron
parents:
2283
diff
changeset
|
1640 |
if (_network_server || |
5956
04e89c320747
(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:
5934
diff
changeset
|
1641 |
(save_thread = OTTDCreateThread(&SaveFileToDiskThread, NULL)) == NULL) { |
04e89c320747
(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:
5934
diff
changeset
|
1642 |
if (!_network_server) DEBUG(sl, 1, "Cannot create savegame thread, reverting to single-threaded mode..."); |
04e89c320747
(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:
5934
diff
changeset
|
1643 |
|
04e89c320747
(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:
5934
diff
changeset
|
1644 |
SaveOrLoadResult result = SaveFileToDisk(false); |
4323
78204e7c3100
(svn r5977) -Fix [FS#78]: never set I-am-a-thread bool to true IN the thread. Machines with
truelight
parents:
4300
diff
changeset
|
1645 |
SaveFileDone(); |
5956
04e89c320747
(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:
5934
diff
changeset
|
1646 |
|
04e89c320747
(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:
5934
diff
changeset
|
1647 |
return result; |
1885
4ce583a5275b
(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
|
1648 |
} |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1649 |
} else { /* LOAD game */ |
1885
4ce583a5275b
(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 |
assert(mode == SL_LOAD); |
4ce583a5275b
(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 |
|
0 | 1652 |
if (fread(hdr, sizeof(hdr), 1, _sl.fh) != 1) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
1653 |
DEBUG(sl, 0, "Cannot read savegame header, aborting"); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1654 |
return AbortSaveLoad(); |
0 | 1655 |
} |
1656 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1657 |
/* see if we have any loader for this type. */ |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1658 |
for (fmt = _saveload_formats; ; fmt++) { |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
/* No loader found, treat as version 0 and use LZO format */ |
0 | 1660 |
if (fmt == endof(_saveload_formats)) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
1661 |
DEBUG(sl, 0, "Unknown savegame type, trying to load it as the buggy format"); |
6490
558c0c7b6fd4
(svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents:
6489
diff
changeset
|
1662 |
#if defined(WINCE) |
558c0c7b6fd4
(svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents:
6489
diff
changeset
|
1663 |
/* Of course some system had not to support rewind ;) */ |
558c0c7b6fd4
(svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents:
6489
diff
changeset
|
1664 |
fseek(_sl.fh, 0L, SEEK_SET); |
558c0c7b6fd4
(svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents:
6489
diff
changeset
|
1665 |
clearerr(_sl.fh); |
558c0c7b6fd4
(svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents:
6489
diff
changeset
|
1666 |
#else |
0 | 1667 |
rewind(_sl.fh); |
6490
558c0c7b6fd4
(svn r8918) -Revert r8914 as the inverted files have been committed not the correct one.
Darkvater
parents:
6489
diff
changeset
|
1668 |
#endif |
4016 | 1669 |
_sl_version = 0; |
2685
00111d5ca47f
(svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents:
2676
diff
changeset
|
1670 |
_sl_minor_version = 0; |
1913
57f516fa418c
(svn r2419) - Fix: saving no longer changes your cursor if it is in a non-mouse state.
Darkvater
parents:
1891
diff
changeset
|
1671 |
fmt = _saveload_formats + 1; // LZO |
0 | 1672 |
break; |
1673 |
} |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1674 |
|
0 | 1675 |
if (fmt->tag == hdr[0]) { |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1676 |
/* check version number */ |
4016 | 1677 |
_sl_version = TO_BE32(hdr[1]) >> 16; |
2685
00111d5ca47f
(svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents:
2676
diff
changeset
|
1678 |
/* Minor is not used anymore from version 18.0, but it is still needed |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1679 |
* in versions before that (4 cases) which can't be removed easy. |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1680 |
* Therefor it is loaded, but never saved (or, it saves a 0 in any scenario). |
b8f06d8eb7be
(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:
6338
diff
changeset
|
1681 |
* So never EVER use this minor version again. -- TrueLight -- 22-11-2005 */ |
2685
00111d5ca47f
(svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents:
2676
diff
changeset
|
1682 |
_sl_minor_version = (TO_BE32(hdr[1]) >> 8) & 0xFF; |
00111d5ca47f
(svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents:
2676
diff
changeset
|
1683 |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
1684 |
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
|
1685 |
|
938
4f84a0530758
(svn r1426) -Codechange: cleaned up the reference code in the saveload routines
truelight
parents:
929
diff
changeset
|
1686 |
/* Is the version higher than the current? */ |
2685
00111d5ca47f
(svn r3227) -Codechange: [Savegame] removed 'minor' version, and renamed 'major' version to just: version.
truelight
parents:
2676
diff
changeset
|
1687 |
if (_sl_version > SAVEGAME_VERSION) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
1688 |
DEBUG(sl, 0, "Savegame version invalid"); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1689 |
return AbortSaveLoad(); |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1690 |
} |
0 | 1691 |
break; |
1692 |
} |
|
1693 |
} |
|
1694 |
||
1695 |
_sl.read_bytes = fmt->reader; |
|
1696 |
_sl.excpt_uninit = fmt->uninit_read; |
|
1697 |
||
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1698 |
/* loader for this savegame type is not implemented? */ |
0 | 1699 |
if (fmt->init_read == NULL) { |
1700 |
ShowInfoF("Loader for '%s' is not available.", fmt->name); |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1701 |
return AbortSaveLoad(); |
0 | 1702 |
} |
1703 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1704 |
if (!fmt->init_read()) { |
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
1705 |
DEBUG(sl, 0, "Initializing loader '%s' failed", fmt->name); |
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1706 |
return AbortSaveLoad(); |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1707 |
} |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1708 |
|
1885
4ce583a5275b
(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
|
1709 |
/* Old maps were hardcoded to 256x256 and thus did not contain |
4ce583a5275b
(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
|
1710 |
* any mapsize information. Pre-initialize to 256x256 to not to |
4ce583a5275b
(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
|
1711 |
* confuse old games */ |
2828
996de8e891c7
(svn r3376) -Codechange: made enums for GenerateWorld and InitializeGame 'mode'
truelight
parents:
2808
diff
changeset
|
1712 |
InitializeGame(IG_DATE_RESET, 256, 256); |
1218 | 1713 |
|
0 | 1714 |
SlLoadChunks(); |
1715 |
fmt->uninit_read(); |
|
1885
4ce583a5275b
(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
|
1716 |
fclose(_sl.fh); |
0 | 1717 |
|
1885
4ce583a5275b
(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
|
1718 |
/* After loading fix up savegame for any internal changes that |
4549
60410aa1aa88
(svn r6381) -Cleanup: make the '/* */' comments that span multiple lines more uniform.
rubidium
parents:
4328
diff
changeset
|
1719 |
* might've occured since then. If it fails, load back the old game */ |
2808
35e0e9c6c227
(svn r3356) - Remove unused parameter of AfterLoadGame().
peter1138
parents:
2749
diff
changeset
|
1720 |
if (!AfterLoadGame()) return SL_REINIT; |
1885
4ce583a5275b
(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
|
1721 |
} |
0 | 1722 |
|
1723 |
return SL_OK; |
|
1724 |
} |
|
1725 |
||
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1726 |
/** Do a save when exiting the game (patch option) _patches.autosave_on_exit */ |
6573 | 1727 |
void DoExitSave() |
643
6f04156241bd
(svn r1076) Feature: Patch setting to autosave the game on exit
dominik
parents:
617
diff
changeset
|
1728 |
{ |
7425
350b9265b7a2
(svn r10182) -Codechange: rewrite most part of the file loading/searching to be more flexible.
rubidium
parents:
7313
diff
changeset
|
1729 |
SaveOrLoad("exit.sav", SL_SAVE, AUTOSAVE_DIR); |
643
6f04156241bd
(svn r1076) Feature: Patch setting to autosave the game on exit
dominik
parents:
617
diff
changeset
|
1730 |
} |
6f04156241bd
(svn r1076) Feature: Patch setting to autosave the game on exit
dominik
parents:
617
diff
changeset
|
1731 |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1732 |
#if 0 |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1733 |
/** |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1734 |
* Function to get the type of the savegame by looking at the file header. |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* NOTICE: Not used right now, but could be used if extensions of savegames are garbled |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
* @param file Savegame to be checked |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1737 |
* @return SL_OLD_LOAD or SL_LOAD of the file |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1738 |
*/ |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 255 bytes. This doesn't yet solve the problem that a chunk can be a maximum of 16384 big.
Darkvater
parents:
1614
diff
changeset
|
1739 |
int GetSavegameType(char *file) |
0 | 1740 |
{ |
1741 |
const SaveLoadFormat *fmt; |
|
1742 |
uint32 hdr; |
|
1743 |
FILE *f; |
|
1744 |
int mode = SL_OLD_LOAD; |
|
1745 |
||
1746 |
f = fopen(file, "rb"); |
|
1747 |
if (fread(&hdr, sizeof(hdr), 1, f) != 1) { |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5296
diff
changeset
|
1748 |
DEBUG(sl, 0, "Savegame is obsolete or invalid format"); |
2026 | 1749 |
mode = SL_LOAD; // don't try to get filename, just show name as it is written |
4077
d3022f976946
(svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents:
4059
diff
changeset
|
1750 |
} else { |
6443
b8f06d8eb7be
(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:
6338
diff
changeset
|
1751 |
/* see if we have any loader for this type. */ |
0 | 1752 |
for (fmt = _saveload_formats; fmt != endof(_saveload_formats); fmt++) { |
1753 |
if (fmt->tag == hdr) { |
|
1754 |
mode = SL_LOAD; // new type of savegame |
|
1755 |
break; |
|
1756 |
} |
|
1757 |
} |
|
1758 |
} |
|
1759 |
||
1760 |
fclose(f); |
|
1761 |
return mode; |
|
1881
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
} |
023a134a4b12
(svn r2387) - CodeChange: made the saveload code more readable and also removed the 'byte' saveload arrays which means you can save an array of more than 255 elements, or bigger structs than 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 |
#endif |