diff --git a/sc2/src/sc2code/grpinfo.c b/sc2/src/sc2code/grpinfo.c index 3af3bd2eb..21934d4f2 100644 --- a/sc2/src/sc2code/grpinfo.c +++ b/sc2/src/sc2code/grpinfo.c @@ -45,7 +45,7 @@ InitGroupInfo (BOOLEAN FirstTime) { PVOID fp; - fp = res_OpenResFile (tempDir, RANDGRPINFO_FILE, "wb"); + fp = OpenStateFile (RANDGRPINFO_FILE, "wb"); if (fp) { GROUP_HEADER GH; @@ -53,24 +53,24 @@ InitGroupInfo (BOOLEAN FirstTime) GH.NumGroups = 0; GH.star_index = (COUNT)~0; GH.GroupOffset[0] = 0; - WriteResFile (&GH, sizeof (GH), 1, fp); + WriteStateFile (&GH, sizeof (GH), 1, fp); - res_CloseResFile (fp); + CloseStateFile (fp); } - if (FirstTime && (fp = res_OpenResFile (tempDir, DEFGRPINFO_FILE, "wb"))) + if (FirstTime && (fp = OpenStateFile (DEFGRPINFO_FILE, "wb"))) { - PutResFileChar (0, fp); + PutStateFileChar (0, fp); - res_CloseResFile (fp); + CloseStateFile (fp); } } void UninitGroupInfo (void) { - unlink (tempFilePath (DEFGRPINFO_FILE)); - unlink (tempFilePath (RANDGRPINFO_FILE)); + DeleteStateFile (DEFGRPINFO_FILE); + DeleteStateFile (RANDGRPINFO_FILE); } void @@ -249,7 +249,7 @@ FlushGroupInfo (GROUP_HEADER *pGH, DWORD offset, BYTE which_group, PVOID fp) if (which_group == 0) { if (pGH->GroupOffset[0] == 0) - pGH->GroupOffset[0] = LengthResFile (fp); + pGH->GroupOffset[0] = LengthStateFile (fp); { QUEUE temp_q; @@ -291,18 +291,18 @@ FlushGroupInfo (GROUP_HEADER *pGH, DWORD offset, BYTE which_group, PVOID fp) else if (which_group > pGH->NumGroups) { pGH->NumGroups = which_group; - pGH->GroupOffset[which_group] = LengthResFile (fp); + pGH->GroupOffset[which_group] = LengthStateFile (fp); hStarShip = GetHeadLink (&GLOBAL (npc_built_ship_q)); FragPtr = (SHIP_FRAGMENTPTR)LockStarShip ( &GLOBAL (npc_built_ship_q), hStarShip); RaceType = GET_RACE_ID (FragPtr); - SeekResFile (fp, pGH->GroupOffset[which_group], SEEK_SET); - WriteResFile ((PBYTE)&RaceType, sizeof (RaceType), 1, fp); + SeekStateFile (fp, pGH->GroupOffset[which_group], SEEK_SET); + WriteStateFile ((PBYTE)&RaceType, sizeof (RaceType), 1, fp); UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip); } - SeekResFile (fp, offset, SEEK_SET); - WriteResFile (pGH, sizeof (*pGH), 1, fp); + SeekStateFile (fp, offset, SEEK_SET); + WriteStateFile (pGH, sizeof (*pGH), 1, fp); #ifdef DEBUG_GROUPS fprintf (stderr, "1)FlushGroupInfo(%lu): WG = %u(%lu), NG = %u, " "SI = %u\n", offset, which_group, pGH->GroupOffset[which_group], @@ -312,15 +312,15 @@ FlushGroupInfo (GROUP_HEADER *pGH, DWORD offset, BYTE which_group, PVOID fp) NumShips = (BYTE)CountLinks (&GLOBAL (npc_built_ship_q)); if (which_group) - SeekResFile (fp, pGH->GroupOffset[which_group] + SeekStateFile (fp, pGH->GroupOffset[which_group] + sizeof (RaceType), SEEK_SET); else { RaceType = (BYTE)cur_player; - SeekResFile (fp, pGH->GroupOffset[0], SEEK_SET); - WriteResFile (&RaceType, sizeof (RaceType), 1, fp); + SeekStateFile (fp, pGH->GroupOffset[0], SEEK_SET); + WriteStateFile (&RaceType, sizeof (RaceType), 1, fp); } - WriteResFile (&NumShips, sizeof (NumShips), 1, fp); + WriteStateFile (&NumShips, sizeof (NumShips), 1, fp); hStarShip = GetHeadLink (&GLOBAL (npc_built_ship_q)); while (NumShips--) @@ -334,7 +334,7 @@ FlushGroupInfo (GROUP_HEADER *pGH, DWORD offset, BYTE which_group, PVOID fp) hNextShip = _GetSuccLink (FragPtr); RaceType = GET_RACE_ID (FragPtr); - WriteResFile ((PBYTE)&RaceType, sizeof (RaceType), 1, fp); + WriteStateFile ((PBYTE)&RaceType, sizeof (RaceType), 1, fp); #ifdef DEBUG_GROUPS if (which_group == 0) @@ -347,7 +347,7 @@ FlushGroupInfo (GROUP_HEADER *pGH, DWORD offset, BYTE which_group, PVOID fp) GET_GROUP_DEST (FragPtr)); #endif /* DEBUG_GROUPS */ Ptr = (PBYTE)&FragPtr->RaceDescPtr; - WriteResFile ((PBYTE)Ptr, + WriteStateFile ((PBYTE)Ptr, ((PBYTE)&FragPtr->ShipInfo.race_strings) - Ptr, 1, fp); UnlockStarShip (&GLOBAL (npc_built_ship_q), hStarShip); hStarShip = hNextShip; @@ -359,7 +359,7 @@ GetGroupInfo (DWORD offset, BYTE which_group) { PVOID fp; - fp = res_OpenResFile (tempDir, + fp = OpenStateFile ( offset && which_group ? DEFGRPINFO_FILE : RANDGRPINFO_FILE, "r+b"); if (fp) @@ -369,8 +369,8 @@ GetGroupInfo (DWORD offset, BYTE which_group) HSTARSHIP hStarShip; SHIP_FRAGMENTPTR FragPtr; - SeekResFile (fp, offset, SEEK_SET); - ReadResFile (&GH, sizeof (GH), 1, fp); + SeekStateFile (fp, offset, SEEK_SET); + ReadStateFile (&GH, sizeof (GH), 1, fp); #ifdef DEBUG_GROUPS fprintf (stderr, "GetGroupInfo(%lu): %u(%lu) out of %u\n", offset, which_group, GH.GroupOffset[which_group], GH.NumGroups); @@ -392,7 +392,7 @@ GetGroupInfo (DWORD offset, BYTE which_group) || !ValidateEvent (ABSOLUTE_EVENT, &month_index, &day_index, &year_index))) { - res_CloseResFile (fp); + CloseStateFile (fp); #ifdef DEBUG_GROUPS if (GH.star_index == (COUNT)(CurStarDescPtr - star_array)) @@ -400,11 +400,11 @@ GetGroupInfo (DWORD offset, BYTE which_group) "date %u/%u/%u!\n", month_index, day_index, year_index); #endif /* DEBUG_GROUPS */ - fp = res_OpenResFile (tempDir, RANDGRPINFO_FILE, "wb"); + fp = OpenStateFile (RANDGRPINFO_FILE, "wb"); GH.NumGroups = 0; GH.star_index = (COUNT)~0; GH.GroupOffset[0] = 0; - WriteResFile (&GH, sizeof (GH), 1, fp); + WriteStateFile (&GH, sizeof (GH), 1, fp); } else { @@ -414,9 +414,9 @@ GetGroupInfo (DWORD offset, BYTE which_group) if (GH.GroupOffset[which_group] == 0) continue; - SeekResFile (fp, GH.GroupOffset[which_group], SEEK_SET); - ReadResFile (&RaceType, sizeof (RaceType), 1, fp); - ReadResFile (&NumShips, sizeof (NumShips), 1, fp); + SeekStateFile (fp, GH.GroupOffset[which_group], SEEK_SET); + ReadStateFile (&RaceType, sizeof (RaceType), 1, fp); + ReadStateFile (&NumShips, sizeof (NumShips), 1, fp); if (NumShips) { @@ -502,7 +502,7 @@ GetGroupInfo (DWORD offset, BYTE which_group) else if (ValidateEvent (ABSOLUTE_EVENT, /* still fresh */ &month_index, &day_index, &year_index)) { - res_CloseResFile (fp); + CloseStateFile (fp); return (TRUE); } } @@ -515,8 +515,8 @@ GetGroupInfo (DWORD offset, BYTE which_group) ShipsLeft = CountLinks (&GLOBAL (npc_built_ship_q)); if (which_group == 0) { - SeekResFile (fp, GH.GroupOffset[0], SEEK_SET); - ReadResFile (&BaseGroup, sizeof (BaseGroup), 1, fp); + SeekStateFile (fp, GH.GroupOffset[0], SEEK_SET); + ReadStateFile (&BaseGroup, sizeof (BaseGroup), 1, fp); if (BaseGroup) { @@ -538,15 +538,15 @@ GetGroupInfo (DWORD offset, BYTE which_group) } ReinitQueue (&GLOBAL (npc_built_ship_q)); - SeekResFile (fp, GH.GroupOffset[which_group] + SeekStateFile (fp, GH.GroupOffset[which_group] + sizeof (BaseGroup), SEEK_SET); - ReadResFile (&NumShips, sizeof (NumShips), 1, fp); + ReadStateFile (&NumShips, sizeof (NumShips), 1, fp); while (NumShips--) { PBYTE Ptr; - ReadResFile ((PBYTE)&RaceType, sizeof (RaceType), 1, fp); + ReadStateFile ((PBYTE)&RaceType, sizeof (RaceType), 1, fp); hStarShip = CloneShipFragment (RaceType, &GLOBAL (npc_built_ship_q), 0); @@ -554,7 +554,7 @@ GetGroupInfo (DWORD offset, BYTE which_group) FragPtr = (SHIP_FRAGMENTPTR)LockStarShip ( &GLOBAL (npc_built_ship_q), hStarShip); Ptr = (PBYTE)&FragPtr->RaceDescPtr; - ReadResFile ((PBYTE)Ptr, + ReadStateFile ((PBYTE)Ptr, ((PBYTE)&FragPtr->ShipInfo.race_strings) - Ptr, 1, fp); @@ -606,7 +606,7 @@ GetGroupInfo (DWORD offset, BYTE which_group) } } - res_CloseResFile (fp); + CloseStateFile (fp); } return (GetHeadLink (&GLOBAL (npc_built_ship_q)) != 0); @@ -617,7 +617,7 @@ PutGroupInfo (DWORD offset, BYTE which_group) { PVOID fp; - fp = res_OpenResFile (tempDir, + fp = OpenStateFile ( offset && which_group ? DEFGRPINFO_FILE : RANDGRPINFO_FILE, "r+b"); if (fp) @@ -626,23 +626,23 @@ PutGroupInfo (DWORD offset, BYTE which_group) if (offset == (DWORD) ~0L) { - offset = LengthResFile (fp); + offset = LengthStateFile (fp); GH.NumGroups = 0; GH.GroupOffset[0] = 0; - SeekResFile (fp, offset, SEEK_SET); - WriteResFile (&GH, sizeof (GH), 1, fp); + SeekStateFile (fp, offset, SEEK_SET); + WriteStateFile (&GH, sizeof (GH), 1, fp); } if (which_group) { - SeekResFile (fp, offset, SEEK_SET); + SeekStateFile (fp, offset, SEEK_SET); if (which_group == (BYTE)~0) { cur_player = 0; which_group = 0; } } - ReadResFile (&GH, sizeof (GH), 1, fp); + ReadStateFile (&GH, sizeof (GH), 1, fp); #ifdef NEVER if (GetHeadLink (&GLOBAL (npc_built_ship_q)) @@ -669,7 +669,7 @@ PutGroupInfo (DWORD offset, BYTE which_group) FlushGroupInfo (&GH, offset, which_group, fp); - res_CloseResFile (fp); + CloseStateFile (fp); } return (offset); diff --git a/sc2/src/sc2code/load.c b/sc2/src/sc2code/load.c index 34c055cf3..41fd49364 100644 --- a/sc2/src/sc2code/load.c +++ b/sc2/src/sc2code/load.c @@ -105,7 +105,7 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc) in_fp = res_OpenResFile (saveDir, file, "rb"); if (in_fp) { - uio_Stream *fp; + GAME_STATE_FILE *fp; DECODE_REF fh; COUNT num_links; Semaphore clock_sem; @@ -238,7 +238,7 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc) } } - fp = res_OpenResFile (tempDir, STARINFO_FILE, "wb"); + fp = OpenStateFile (STARINFO_FILE, "wb"); if (fp) { DWORD flen; @@ -250,14 +250,14 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc) num_bytes = flen >= sizeof (buf) ? sizeof (buf) : (COUNT)flen; cread ((PBYTE)buf, num_bytes, 1, fh); - WriteResFile (buf, num_bytes, 1, fp); + WriteStateFile (buf, num_bytes, 1, fp); flen -= num_bytes; } - res_CloseResFile (fp); + CloseStateFile (fp); } - fp = res_OpenResFile (tempDir, DEFGRPINFO_FILE, "wb"); + fp = OpenStateFile (DEFGRPINFO_FILE, "wb"); if (fp) { DWORD flen; @@ -269,14 +269,14 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc) num_bytes = flen >= sizeof (buf) ? sizeof (buf) : (COUNT)flen; cread ((PBYTE)buf, num_bytes, 1, fh); - WriteResFile (buf, num_bytes, 1, fp); + WriteStateFile (buf, num_bytes, 1, fp); flen -= num_bytes; } - res_CloseResFile (fp); + CloseStateFile (fp); } - fp = res_OpenResFile (tempDir, RANDGRPINFO_FILE, "wb"); + fp = OpenStateFile (RANDGRPINFO_FILE, "wb"); if (fp) { DWORD flen; @@ -288,11 +288,11 @@ LoadGame (COUNT which_game, SUMMARY_DESC *summary_desc) num_bytes = flen >= sizeof (buf) ? sizeof (buf) : (COUNT)flen; cread ((PBYTE)buf, num_bytes, 1, fh); - WriteResFile (buf, num_bytes, 1, fp); + WriteStateFile (buf, num_bytes, 1, fp); flen -= num_bytes; } - res_CloseResFile (fp); + CloseStateFile (fp); } cread ((PBYTE)&SD, sizeof (SD), 1, fh); diff --git a/sc2/src/sc2code/save.c b/sc2/src/sc2code/save.c index 59f8f578d..3162f4c0b 100644 --- a/sc2/src/sc2code/save.c +++ b/sc2/src/sc2code/save.c @@ -273,7 +273,7 @@ RetrySave: } else { - uio_Stream *fp; + GAME_STATE_FILE *fp; DWORD flen; COUNT num_links; FRAME frame; @@ -354,58 +354,58 @@ RetrySave: } } - fp = res_OpenResFile (tempDir, STARINFO_FILE, "rb"); + fp = OpenStateFile (STARINFO_FILE, "rb"); if (fp) { - flen = LengthResFile (fp); + flen = LengthStateFile (fp); cwrite ((PBYTE)&flen, sizeof (flen), 1, fh); while (flen) { COUNT num_bytes; num_bytes = flen >= sizeof (buf) ? sizeof (buf) : (COUNT)flen; - ReadResFile (buf, num_bytes, 1, fp); + ReadStateFile (buf, num_bytes, 1, fp); cwrite ((PBYTE)buf, num_bytes, 1, fh); flen -= num_bytes; } - res_CloseResFile (fp); + CloseStateFile (fp); } - fp = res_OpenResFile (tempDir, DEFGRPINFO_FILE, "rb"); + fp = OpenStateFile (DEFGRPINFO_FILE, "rb"); if (fp) { - flen = LengthResFile (fp); + flen = LengthStateFile (fp); cwrite ((PBYTE)&flen, sizeof (flen), 1, fh); while (flen) { COUNT num_bytes; num_bytes = flen >= sizeof (buf) ? sizeof (buf) : (COUNT)flen; - ReadResFile (buf, num_bytes, 1, fp); + ReadStateFile (buf, num_bytes, 1, fp); cwrite ((PBYTE)buf, num_bytes, 1, fh); flen -= num_bytes; } - res_CloseResFile (fp); + CloseStateFile (fp); } - fp = res_OpenResFile (tempDir, RANDGRPINFO_FILE, "rb"); + fp = OpenStateFile (RANDGRPINFO_FILE, "rb"); if (fp) { - flen = LengthResFile (fp); + flen = LengthStateFile (fp); cwrite ((PBYTE)&flen, sizeof (flen), 1, fh); while (flen) { COUNT num_bytes; num_bytes = flen >= sizeof (buf) ? sizeof (buf) : (COUNT)flen; - ReadResFile (buf, num_bytes, 1, fp); + ReadStateFile (buf, num_bytes, 1, fp); cwrite ((PBYTE)buf, num_bytes, 1, fh); flen -= num_bytes; } - res_CloseResFile (fp); + CloseStateFile (fp); } cwrite ((PBYTE)&SD, sizeof (SD), 1, fh); diff --git a/sc2/src/sc2code/state.c b/sc2/src/sc2code/state.c index 0e393f3ad..9a205777c 100644 --- a/sc2/src/sc2code/state.c +++ b/sc2/src/sc2code/state.c @@ -19,17 +19,204 @@ #include "state.h" #include "encount.h" -#include "file.h" +#include "libs/misc.h" #ifdef HAVE_UNISTD_H #include #endif +// in-memory file i/o +struct GAME_STATE_FILE +{ + const char* symname; + DWORD size_hint; + int open_count; + BYTE* data; + DWORD used; + DWORD size; + DWORD ptr; +}; +#define STATE_FILE_ITRAILER 0, 0, 0, 0, 0 + +#define NUM_STATE_FILES 3 + +static GAME_STATE_FILE state_files[NUM_STATE_FILES] = +{ + {"STARINFO", STAR_BUFSIZE, STATE_FILE_ITRAILER}, + {"RANDGRPINFO", RAND_BUFSIZE, STATE_FILE_ITRAILER}, + {"DEFGRPINFO", DEF_BUFSIZE, STATE_FILE_ITRAILER} +}; + + +GAME_STATE_FILE* +OpenStateFile (int stateFile, const char* mode) +{ + GAME_STATE_FILE* fp; + + if (stateFile < 0 || stateFile >= NUM_STATE_FILES) + return NULL_PTR; + + fp = &state_files[stateFile]; + fp->open_count++; + if (fp->open_count > 1) + fprintf (stderr, "WARNING: " + "State file %s open count is %d after open()\n", + fp->open_count); + + if (!fp->data) + { + fp->data = HMalloc (fp->size_hint); + if (!fp->data) + return NULL_PTR; + fp->size = fp->size_hint; + } + + // we allow reading and writing for any open mode + // but the mode determines what happens to the file contents + if (mode[0] == 'w') + { // blow the file away + fp->used = 0; +#ifdef DEBUG + // paint buffer for tracking writes + memset (fp->data, 0xCC, fp->size); +#endif + } + else if (mode[0] == 'r') + { // nothing + } + else + { + fprintf (stderr, "WARNING: " + "State file %s opened with unsupported mode '%s'\n", + mode); + } + fp->ptr = 0; + + return fp; +} + +void +CloseStateFile (GAME_STATE_FILE* fp) +{ + fp->ptr = 0; + fp->open_count--; + if (fp->open_count < 0) + fprintf (stderr, "WARNING: " + "State file %s open count is %d after close()\n", + fp->open_count); + // Erm, Ok, it's closed! Honest! +} + +void +DeleteStateFile (int stateFile) +{ + GAME_STATE_FILE* fp; + + if (stateFile < 0 || stateFile >= NUM_STATE_FILES) + return; + + fp = &state_files[stateFile]; + if (fp->open_count != 0) + fprintf (stderr, "WARNING: " + "State file %s open count is %d during delete()\n", + fp->open_count); + + fp->used = 0; + fp->ptr = 0; +} + +DWORD +LengthStateFile (GAME_STATE_FILE* fp) +{ + return fp->used; +} + +int +ReadStateFile (PVOID lpBuf, COUNT size, COUNT count, GAME_STATE_FILE *fp) +{ + DWORD bytes = size * count; + + if (fp->ptr >= fp->size) + { // EOF + return 0; + } + else if (fp->ptr + bytes > fp->size) + { // dont have that much data + bytes = fp->size - fp->ptr; + bytes -= bytes % size; + } + + if (bytes > 0) + { + memcpy (lpBuf, fp->data + fp->ptr, bytes); + fp->ptr += bytes; + } + return (bytes / size); +} + +int +WriteStateFile (PVOID lpBuf, COUNT size, COUNT count, GAME_STATE_FILE *fp) +{ + DWORD bytes = size * count; + + if (fp->ptr + bytes > fp->size) + { // dont have that much space available + DWORD newsize = fp->ptr + bytes; + // grab more space in advance + if (newsize < fp->size * 3 / 2) + newsize = fp->size * 3 / 2; + + fp->data = HRealloc (fp->data, newsize); + if (!fp->data) + return 0; + + fp->size = newsize; + if (newsize > fp->size_hint) + fp->size_hint = newsize; + } + + if (bytes > 0) + { + memcpy (fp->data + fp->ptr, lpBuf, bytes); + fp->ptr += bytes; + if (fp->ptr > fp->used) + fp->used = fp->ptr; + } + return (bytes / size); +} + +int +PutStateFileChar (char ch, GAME_STATE_FILE *fp) +{ + if (1 == WriteStateFile (&ch, sizeof(ch), 1, fp)) + return ch; + else + return EOF; +} + +int +SeekStateFile (GAME_STATE_FILE *fp, long offset, int whence) +{ + if (whence == SEEK_CUR) + offset += fp->ptr; + else if (whence == SEEK_END) + offset += fp->used; + + if (offset < 0) + { + fp->ptr = 0; + return 0; + } + fp->ptr = offset; + return 1; +} + + void InitPlanetInfo (void) { - PVOID fp; + GAME_STATE_FILE* fp; - fp = res_OpenResFile (tempDir, STARINFO_FILE, "wb"); + fp = OpenStateFile (STARINFO_FILE, "wb"); if (fp) { DWORD offset; @@ -39,19 +226,19 @@ InitPlanetInfo (void) pSD = &star_array[0]; do { - WriteResFile (&offset, sizeof (offset), 1, fp); + WriteStateFile (&offset, sizeof (offset), 1, fp); ++pSD; } while (pSD->star_pt.x <= MAX_X_UNIVERSE && pSD->star_pt.y <= MAX_Y_UNIVERSE); - res_CloseResFile (fp); + CloseStateFile (fp); } } void UninitPlanetInfo (void) { - unlink (tempFilePath (STARINFO_FILE)); + DeleteStateFile (STARINFO_FILE); } void @@ -62,7 +249,7 @@ GetPlanetInfo (void) pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[BIOLOGICAL_SCAN] = pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[MINERAL_SCAN] = pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask[ENERGY_SCAN] = 0; - fp = res_OpenResFile (tempDir, STARINFO_FILE, "rb"); + fp = OpenStateFile (STARINFO_FILE, "rb"); if (fp) { COUNT star_index, planet_index, moon_index; @@ -77,8 +264,8 @@ GetPlanetInfo (void) moon_index = (COUNT)(pSolarSysState->pOrbitalDesc - pSolarSysState->MoonDesc + 1); - SeekResFile (fp, star_index * sizeof (offset), SEEK_SET); - ReadResFile (&offset, sizeof (offset), 1, fp); + SeekStateFile (fp, star_index * sizeof (offset), SEEK_SET); + ReadStateFile (&offset, sizeof (offset), 1, fp); if (offset) { @@ -93,14 +280,14 @@ GetPlanetInfo (void) pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask ) * moon_index; - SeekResFile (fp, offset, SEEK_SET); - ReadResFile (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask, + SeekStateFile (fp, offset, SEEK_SET); + ReadStateFile (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask, sizeof ( pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask ), 1, fp); } - res_CloseResFile (fp); + CloseStateFile (fp); } } @@ -109,7 +296,7 @@ PutPlanetInfo (void) { PVOID fp; - fp = res_OpenResFile (tempDir, STARINFO_FILE, "r+b"); + fp = OpenStateFile (STARINFO_FILE, "r+b"); if (fp) { COUNT i; @@ -125,8 +312,8 @@ PutPlanetInfo (void) moon_index = (COUNT)(pSolarSysState->pOrbitalDesc - pSolarSysState->MoonDesc + 1); - SeekResFile (fp, star_index * sizeof (offset), SEEK_SET); - ReadResFile (&offset, sizeof (offset), 1, fp); + SeekStateFile (fp, star_index * sizeof (offset), SEEK_SET); + ReadStateFile (&offset, sizeof (offset), 1, fp); if (offset == 0) { @@ -135,19 +322,19 @@ PutPlanetInfo (void) 0, 0, 0, }; - offset = LengthResFile (fp); + offset = LengthStateFile (fp); - SeekResFile (fp, star_index * sizeof (offset), SEEK_SET); - WriteResFile (&offset, sizeof (offset), 1, fp); + SeekStateFile (fp, star_index * sizeof (offset), SEEK_SET); + WriteStateFile (&offset, sizeof (offset), 1, fp); - SeekResFile (fp, offset, SEEK_SET); + SeekStateFile (fp, offset, SEEK_SET); for (i = 0; i < pSolarSysState->SunDesc[0].NumPlanets; ++i) { COUNT j; - WriteResFile (ScanRetrieveMask, sizeof (ScanRetrieveMask), 1, fp); + WriteStateFile (ScanRetrieveMask, sizeof (ScanRetrieveMask), 1, fp); for (j = 0; j < pSolarSysState->PlanetDesc[i].NumPlanets; ++j) - WriteResFile (ScanRetrieveMask, sizeof (ScanRetrieveMask), 1, fp); + WriteStateFile (ScanRetrieveMask, sizeof (ScanRetrieveMask), 1, fp); } } @@ -160,13 +347,13 @@ PutPlanetInfo (void) pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask ) * moon_index; - SeekResFile (fp, offset, SEEK_SET); - WriteResFile (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask, + SeekStateFile (fp, offset, SEEK_SET); + WriteStateFile (pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask, sizeof ( pSolarSysState->SysInfo.PlanetInfo.ScanRetrieveMask ), 1, fp); - res_CloseResFile (fp); + CloseStateFile (fp); } } diff --git a/sc2/src/sc2code/state.h b/sc2/src/sc2code/state.h index 02974d0fe..cf316df6e 100644 --- a/sc2/src/sc2code/state.h +++ b/sc2/src/sc2code/state.h @@ -35,12 +35,17 @@ extern void BuildGroups (void); #define MAX_DESC_CHARS 60 typedef UNICODE GAME_DESC[MAX_DESC_CHARS + 1]; -#define STARINFO_FILE "starinfo.dat" +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 "randgrp.dat" +#define RANDGRPINFO_FILE 1 + //"randgrp.dat" #define RAND_BUFSIZE (4 * 1024) -#define DEFGRPINFO_FILE "defgrp.dat" +#define DEFGRPINFO_FILE 2 + //"defgrp.dat" #define DEF_BUFSIZE (10 * 1024) typedef enum @@ -50,6 +55,14 @@ typedef enum 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 (PVOID lpBuf, COUNT size, COUNT count, GAME_STATE_FILE *fp); +int WriteStateFile (PVOID lpBuf, COUNT size, COUNT count, GAME_STATE_FILE *fp); +int PutStateFileChar (char ch, GAME_STATE_FILE *fp); +int SeekStateFile (GAME_STATE_FILE *fp, long offset, int whence); #endif /* _STATE_H */