From 7f6002caba3f0a6749820c2772161caf55b8d267 Mon Sep 17 00:00:00 2001 From: neonloop Date: Fri, 7 May 2021 20:00:12 +0000 Subject: Initial commit (uqm-0.8.0) --- src/uqm/state.h | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 src/uqm/state.h (limited to 'src/uqm/state.h') diff --git a/src/uqm/state.h b/src/uqm/state.h new file mode 100644 index 0000000..e469cba --- /dev/null +++ b/src/uqm/state.h @@ -0,0 +1,166 @@ +//Copyright Paul Reiche, Fred Ford. 1992-2002 + +/* + * This program 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; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +#ifndef UQM_STATE_H_ +#define UQM_STATE_H_ + +#include "port.h" +#include "libs/compiler.h" +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +extern void InitPlanetInfo (void); +extern void UninitPlanetInfo (void); +extern void GetPlanetInfo (void); +extern void PutPlanetInfo (void); + +extern void InitGroupInfo (BOOLEAN FirstTime); +extern void UninitGroupInfo (void); +extern BOOLEAN GetGroupInfo (DWORD offset, BYTE which_group); +extern DWORD PutGroupInfo (DWORD offset, BYTE which_group); +#define GROUPS_RANDOM ((DWORD)(0L)) +#define GROUPS_ADD_NEW ((DWORD)(~0L)) +#define GROUP_LIST ((BYTE)0) +#define GROUP_INIT_IP ((BYTE)~0) + // Initialize IP group list (ip_group_q) from the actual groups + // (not GROUP_LIST) in one of the state files +#define GROUP_LOAD_IP GROUP_LIST + // Read IP group list into ip_group_q from the list entry + // (GROUP_LIST) in one of the state files +#define GROUP_SAVE_IP ((BYTE)~0) + // Write IP group list from ip_group_q to the list entry + // (GROUP_LIST) in one of the state files +extern void BuildGroups (void); + +typedef struct GAME_STATE_FILE GAME_STATE_FILE; + +#define STARINFO_FILE 0 + //"starinfo.dat" +#define STAR_BUFSIZE (NUM_SOLAR_SYSTEMS * sizeof (DWORD) \ + + 3800 * (3 * sizeof (DWORD))) +#define RANDGRPINFO_FILE 1 + //"randgrp.dat" +#define RAND_BUFSIZE (4 * 1024) +#define DEFGRPINFO_FILE 2 + //"defgrp.dat" +#define DEF_BUFSIZE (10 * 1024) + +typedef enum +{ + STARINFO, + RANDGRPINFO, + DEFGRPINFO +} INFO_TYPE; + +GAME_STATE_FILE* OpenStateFile (int stateFile, const char *mode); +void CloseStateFile (GAME_STATE_FILE *fp); +void DeleteStateFile (int stateFile); +DWORD LengthStateFile (GAME_STATE_FILE *fp); +int ReadStateFile (void *lpBuf, COUNT size, COUNT count, GAME_STATE_FILE *fp); +int WriteStateFile (const void *lpBuf, COUNT size, COUNT count, GAME_STATE_FILE *fp); +int SeekStateFile (GAME_STATE_FILE *fp, long offset, int whence); + +static inline COUNT +sread_8 (GAME_STATE_FILE *fp, BYTE *v) +{ + BYTE t; + if (!v) /* read value ignored */ + v = &t; + return ReadStateFile (v, 1, 1, fp); +} + +static inline COUNT +sread_16 (GAME_STATE_FILE *fp, UWORD *v) +{ + UWORD t; + if (!v) /* read value ignored */ + v = &t; + return ReadStateFile (v, 2, 1, fp); +} + +static inline COUNT +sread_16s (GAME_STATE_FILE *fp, SWORD *v) +{ + UWORD t; + COUNT ret; + ret = sread_16 (fp, &t); + // unsigned to signed conversion + if (v) + *v = t; + return ret; +} + +static inline COUNT +sread_32 (GAME_STATE_FILE *fp, DWORD *v) +{ + DWORD t; + if (!v) /* read value ignored */ + v = &t; + return ReadStateFile (v, 4, 1, fp); +} + +static inline COUNT +sread_a32 (GAME_STATE_FILE *fp, DWORD *ar, COUNT count) +{ + assert (ar != NULL); + + for ( ; count > 0; --count, ++ar) + { + if (sread_32 (fp, ar) != 1) + return 0; + } + return 1; +} + +static inline COUNT +swrite_8 (GAME_STATE_FILE *fp, BYTE v) +{ + return WriteStateFile (&v, 1, 1, fp); +} + +static inline COUNT +swrite_16 (GAME_STATE_FILE *fp, UWORD v) +{ + return WriteStateFile (&v, 2, 1, fp); +} + +static inline COUNT +swrite_32 (GAME_STATE_FILE *fp, DWORD v) +{ + return WriteStateFile (&v, 4, 1, fp); +} + +static inline COUNT +swrite_a32 (GAME_STATE_FILE *fp, const DWORD *ar, COUNT count) +{ + for ( ; count > 0; --count, ++ar) + { + if (swrite_32 (fp, *ar) != 1) + return 0; + } + return 1; +} + +#if defined(__cplusplus) +} +#endif + +#endif /* UQM_STATE_H_ */ -- cgit v1.2.3