# oldloader.h

Go to the documentation of this file.

    00001 /* $Id$ */
    00002
    00003 /*
    00004  * This file is part of OpenTTD.
    00005  * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
    00006  * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    00007  * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
    00008  */
    00009
    00012 #ifndef OLDLOADER_H
    00013 #define OLDLOADER_H
    00014
    00015 #include "saveload.h"
    00016
    00017 enum {
    00018   BUFFER_SIZE = 4096,
    00019   OLD_MAP_SIZE = 256 * 256,
    00020 };
    00021
    00022 struct LoadgameState {
    00023   FILE *file;
    00024
    00025   uint chunk_size;
    00026
    00027   bool decoding;
    00028   byte decode_char;
    00029
    00030   uint buffer_count;
    00031   uint buffer_cur;
    00032   byte buffer[BUFFER_SIZE];
    00033
    00034   uint total_read;
    00035   bool failed;
    00036 };
    00037
    00038 /* OldChunk-Type */
    00039 enum OldChunkType {
    00040   OC_SIMPLE    = 0,
    00041   OC_NULL      = 1,
    00042   OC_CHUNK     = 2,
    00043   OC_ASSERT    = 3,
    00044   /* 4 bits allocated (16 max) */
    00045
    00046   OC_TTD       = 1 << 4,
    00047   OC_TTO       = 1 << 5,
    00048   /* 4 bits allocated */
    00049
    00050   OC_VAR_I8    = 1 << 8,
    00051   OC_VAR_U8    = 2 << 8,
    00052   OC_VAR_I16   = 3 << 8,
    00053   OC_VAR_U16   = 4 << 8,
    00054   OC_VAR_I32   = 5 << 8,
    00055   OC_VAR_U32   = 6 << 8,
    00056   OC_VAR_I64   = 7 << 8,
    00057   OC_VAR_U64   = 8 << 8,
    00058   /* 8 bits allocated (256 max) */
    00059
    00060   OC_FILE_I8   = 1 << 16,
    00061   OC_FILE_U8   = 2 << 16,
    00062   OC_FILE_I16  = 3 << 16,
    00063   OC_FILE_U16  = 4 << 16,
    00064   OC_FILE_I32  = 5 << 16,
    00065   OC_FILE_U32  = 6 << 16,
    00066   /* 8 bits allocated (256 max) */
    00067
    00068   OC_INT8      = OC_VAR_I8   | OC_FILE_I8,
    00069   OC_UINT8     = OC_VAR_U8   | OC_FILE_U8,
    00070   OC_INT16     = OC_VAR_I16  | OC_FILE_I16,
    00071   OC_UINT16    = OC_VAR_U16  | OC_FILE_U16,
    00072   OC_INT32     = OC_VAR_I32  | OC_FILE_I32,
    00073   OC_UINT32    = OC_VAR_U32  | OC_FILE_U32,
    00074
    00075   OC_TILE      = OC_VAR_U32  | OC_FILE_U16,
    00076
    00081   OC_DEREFERENCE_POINTER = 1 << 31,
    00082
    00083   OC_END       = 0
    00084 };
    00085
    00086 DECLARE_ENUM_AS_BIT_SET(OldChunkType);
    00087
    00088 typedef bool OldChunkProc(LoadgameState *ls, int num);
    00089
    00090 struct OldChunks {
    00091   OldChunkType type;
    00092   uint32 amount;
    00093
    00094   void *ptr;
    00095   uint offset;
    00096   OldChunkProc *proc;
    00097 };
    00098
    00099 /* If it fails, check lines above.. */
    00100 assert_compile(sizeof(TileIndex) == 4);
    00101
    00102 extern uint _bump_assert_value;
    00103 byte ReadByte(LoadgameState *ls);
    00104 bool LoadChunk(LoadgameState *ls, void *base, const OldChunks *chunks);
    00105
    00106 bool LoadTTDMain(LoadgameState *ls);
    00107 bool LoadTTOMain(LoadgameState *ls);
    00108
    00109 static inline uint16 ReadUint16(LoadgameState *ls)
    00110 {
    00111   byte x = ReadByte(ls);
    00112   return x | ReadByte(ls) << 8;
    00113 }
    00114
    00115 static inline uint32 ReadUint32(LoadgameState *ls)
    00116 {
    00117   uint16 x = ReadUint16(ls);
    00118   return x | ReadUint16(ls) << 16;
    00119 }
    00120
    00121 /* Help:
    00122  *  - OCL_SVAR: load 'type' to offset 'offset' in a struct of type 'base', which must also
    00123  *       be given via base in LoadChunk() as real pointer
    00124  *  - OCL_VAR: load 'type' to a global var
    00125  *  - OCL_END: every struct must end with this
    00126  *  - OCL_NULL: read 'amount' of bytes and send them to /dev/null or something
    00127  *  - OCL_CHUNK: load an other proc to load a part of the savegame, 'amount' times
    00128  *  - OCL_ASSERT: to check if we are really at the place we expect to be.. because old savegames are too binary to be sure ;)
    00129  */
    00130 #define OCL_SVAR(type, base, offset)         { type,                 1,    NULL, (uint)cpp_offsetof(base, offset), NULL }
    00131 #define OCL_VAR(type, amount, pointer)       { type,            amount, pointer,    0,                             NULL }
    00132 #define OCL_END()                            { OC_END,               0,    NULL,    0,                             NULL }
    00133 #define OCL_CNULL(type, amount)              { OC_NULL | type,  amount,    NULL,    0,                             NULL }
    00134 #define OCL_CCHUNK(type, amount, proc)       { OC_CHUNK | type, amount,    NULL,    0,                             proc }
    00135 #define OCL_ASSERT(type, size)               { OC_ASSERT | type,     1,    NULL, size,                             NULL }
    00136 #define OCL_NULL(amount)        OCL_CNULL((OldChunkType)0, amount)
    00137 #define OCL_CHUNK(amount, proc) OCL_CCHUNK((OldChunkType)0, amount, proc)
    00138
    00139 #endif /* OLDLOADER_H */