home *** CD-ROM | disk | FTP | other *** search
- #define FILE_C
- #include "File.h"
- #undef FILE_C
-
-
- #if defined(__MWERKS__)
- #pragma segment __%Main
- #else
- #pragma segment Main
- #endif
-
-
- static StandardFileReply lastReply;
- static Boolean savedBefore = false;
-
-
- OSErr
- OpenGameFile (GamePtr game)
- {
- StandardFileReply reply;
- SFTypeList typeList;
-
- typeList[0] = '•••o';
- StandardGetFile (nil, 1, typeList, & reply);
-
- if (! reply.sfGood)
- return brainNotPresentErr;
-
- savedBefore = false;
- return ReadGameFile (& reply.sfFile, game);
- }
-
-
-
- OSErr
- ReadGameFile (FSSpec *gameSpec, GamePtr game)
- {
- Board board;
- long length;
- OSErr error;
- short gameRef;
- BoardPtr bp = game->Board; // save pointer to board struct somewhere
-
- if ((error = FSpOpenDF (gameSpec, fsRdPerm, & gameRef)) != noErr)
- return error;
-
- error = SetFPos (gameRef, fsFromStart, 0L);
- length = sizeof (Game);
- error |= FSRead (gameRef, & length, (Ptr) game);
- length = sizeof (Board);
- error |= FSRead (gameRef, & length, (Ptr) & board);
- game->Board = bp;
- CopyBoard (& board, game->Board);
-
- return error;
- }
-
-
-
- OSErr
- SaveGameFile (GamePtr game)
- {
- if (! savedBefore)
-
- return SaveAsGameFile (game);
-
- lastReply.sfReplacing = true;
- return SaveSaveAs (& lastReply, game);
- }
-
-
-
- OSErr
- SaveAsGameFile (GamePtr game)
- {
- StandardFileReply reply;
-
- StandardPutFile ("\pSave this game as…", "\pVictory!", & reply);
- if (! reply.sfGood)
- return brainNotPresentErr;
-
- return SaveSaveAs (& reply, game);
- }
-
-
-
- OSErr
- SaveSaveAs (StandardFileReply *reply, GamePtr game)
- {
- short gameRefNum;
- OSErr error;
-
- if (reply->sfReplacing)
- {
- unsigned long seconds;
- Str255 tempName;
- short tempRefNum;
- long tempDirID;
- FSSpec tempSpec;
-
- GetDateTime (& seconds);
- NumToString (seconds, tempName);
- FindFolder (reply->sfFile.vRefNum, kTemporaryFolderType, kCreateFolder, & tempRefNum, & tempDirID);
- FSMakeFSSpec (tempRefNum, tempDirID, tempName, & tempSpec);
- FSpCreate (& tempSpec, 'trsh', 'trsh', reply->sfScript);
-
- FSpOpenDF (& tempSpec, fsRdWrPerm, & gameRefNum);
- WriteGame (gameRefNum, game);
-
- FlushVol (nil, reply->sfFile.vRefNum);
- FSClose (gameRefNum);
- FSpExchangeFiles (& tempSpec, & reply->sfFile);
- FSpDelete (& tempSpec);
- }
- else
- {
- error = FSpCreate (& reply->sfFile, 'A•1e', '•••o', reply->sfScript);
- if (error != noErr) { Warning (FILE_NOT_SAVED); return error; }
-
- error = FSpOpenDF (& reply->sfFile, fsWrPerm, & gameRefNum);
- if (error != noErr) { Warning (FILE_NOT_SAVED); return error; }
-
- error = WriteGame (gameRefNum, game);
- if (error != noErr) { Warning (FILE_NOT_SAVED); return error; }
-
- error = FlushVol (nil, reply->sfFile.vRefNum);
- error = FSClose (gameRefNum);
- if (error != noErr) { Warning (FILE_NOT_SAVED); return error; }
- }
- savedBefore = true;
- lastReply = *reply;
-
- return noErr;
- }
-
-
-
- void
- GetSettings (void)
- {
- FSSpec prefSpec;
- short prefVolRef, prefFileRef;
- long prefDirRef;
- OSErr result;
-
- GetResSettings(); // get settings stored in resources
-
- result = FindFolder (kOnSystemDisk, kPreferencesFolderType, kCreateFolder, & prefVolRef, & prefDirRef);
- Assert (result == noErr, PREFERENCES_GET_ERROR);
-
- result = FSMakeFSSpec (prefVolRef, prefDirRef, "\pAbalone Preferences", & prefSpec);
- Assert (result == noErr || result == fnfErr, PREFERENCES_GET_ERROR);
-
- if ((result = FSpOpenDF (& prefSpec, fsRdWrPerm, & prefFileRef)) != noErr)
- {
- result = FSpCreate (& prefSpec, 'A•1e', '••oo', smSystemScript);
- Assert (result == noErr, PREFERENCES_GET_ERROR);
-
- result = FSpOpenDF (& prefSpec, fsRdWrPerm, & prefFileRef);
- Assert (result == noErr, PREFERENCES_GET_ERROR);
- }
- else
- ReadSettings (prefFileRef);
-
- result = FSClose (prefFileRef);
- Assert (result == noErr, PREFERENCES_GET_ERROR);
- }
-
-
-
- void
- PutSettings (void)
- {
- FSSpec prefSpec;
- short prefVolRef, prefFileRef;
- long prefDirRef;
- OSErr result;
-
- PutResSettings(); /// put settings to be stored in resources
-
- result = FindFolder (kOnSystemDisk, kPreferencesFolderType, kCreateFolder, & prefVolRef, & prefDirRef);
- Assert (result == noErr, PREFERENCES_PUT_ERROR);
-
- result = FSMakeFSSpec (prefVolRef, prefDirRef, "\pAbalone Preferences", & prefSpec);
- Assert (result == noErr || result == fnfErr, PREFERENCES_PUT_ERROR);
-
- result = FSpOpenDF (& prefSpec, fsRdWrPerm, & prefFileRef);
-
- Assert (result == noErr, PREFERENCES_PUT_ERROR);
-
- WriteSettings (prefFileRef);
-
- result = FSClose (prefFileRef);
- Assert (result == noErr, PREFERENCES_PUT_ERROR);
- }
-
-
-
- OSErr
- WriteGame (short gameRef, GamePtr game)
- {
- long length;
- OSErr error;
-
- SetFPos (gameRef, fsFromStart, 0L);
- length = sizeof (Game);
- error = FSWrite (gameRef, & length, (Ptr) game);
- if (error || length != sizeof (Game)) { Warning (FILE_NOT_SAVED); return error; }
-
- length = sizeof (Board);
- error = FSWrite (gameRef, & length, (Ptr) game->Board);
- if (error || length != sizeof (Board)) { Warning (FILE_NOT_SAVED); return error; }
-
- return noErr;
- }
-
-
-
- void
- GetResSettings (void)
- {
- // Nothing to do yet: all settings are stored in the preferences file,
- // and PutResSettings will make sure the resources (so far only one dctb)
- // will contain the same information as found in the preferences file.
- }
-
-
-
- void
- PutResSettings (void)
- {
- WCTabHandle colorTable = (WCTabHandle) GetResource ('dctb', rWindow);
-
- if (ResError() != noErr)
- return; // without mentioning this minor problem
-
- (*colorTable)->ctTable[0].rgb = gSet.Color[0];
-
- ChangedResource ((Handle) colorTable);
- WriteResource ((Handle) colorTable);
- }
-
-
-
- void
- ReadSettings (short prefRef)
- {
- Settings savedSet;
- long length;
-
- length = sizeof (Settings);
- SetFPos (prefRef, fsFromStart, 0L);
- FSRead (prefRef, & length, (Ptr) & savedSet);
- if (length != sizeof (Settings) || savedSet.Version != kSettingsVersion)
- Warning (PREFERENCES_INVALID);
- else
- {
- gSet = savedSet;
- gTheGame.Players = savedSet.Players;
- }
- }
-
-
-
- void
- WriteSettings (short prefRef)
- {
- long length = sizeof (Settings);
-
- SetFPos (prefRef, fsFromStart, 0L);
- FSWrite (prefRef, & length, (Ptr) & gSet);
- if (length != sizeof (Settings))
- Warning (PREFERENCES_NOT_SAVED);
- }
-