home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Games / Abalone 1.4.2 / src / File.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-09-21  |  5.9 KB  |  275 lines  |  [TEXT/MPS ]

  1. #define FILE_C
  2. #include "File.h"
  3. #undef FILE_C
  4.  
  5.  
  6. #if defined(__MWERKS__)
  7. #pragma segment __%Main
  8. #else
  9. #pragma segment Main
  10. #endif
  11.  
  12.  
  13. static StandardFileReply lastReply;
  14. static Boolean    savedBefore = false;
  15.  
  16.  
  17. OSErr
  18. OpenGameFile (GamePtr game)
  19. {
  20.     StandardFileReply reply;
  21.     SFTypeList typeList;
  22.     
  23.     typeList[0] = '•••o';
  24.     StandardGetFile (nil, 1, typeList, & reply);
  25.     
  26.     if (! reply.sfGood)
  27.         return brainNotPresentErr;
  28.         
  29.     savedBefore = false;
  30.     return ReadGameFile (& reply.sfFile, game);
  31. }
  32.  
  33.  
  34.  
  35. OSErr
  36. ReadGameFile (FSSpec *gameSpec, GamePtr game)
  37. {
  38.     Board        board;
  39.     long        length;
  40.     OSErr        error;
  41.     short        gameRef;
  42.     BoardPtr    bp = game->Board;    // save pointer to board struct somewhere
  43.         
  44.     if ((error = FSpOpenDF (gameSpec, fsRdPerm, & gameRef)) != noErr)
  45.         return error;
  46.     
  47.     error = SetFPos (gameRef, fsFromStart, 0L);
  48.     length = sizeof (Game);
  49.     error |= FSRead (gameRef, & length, (Ptr) game);
  50.     length = sizeof (Board);
  51.     error |= FSRead (gameRef, & length, (Ptr) & board);
  52.     game->Board = bp;
  53.     CopyBoard (& board, game->Board);
  54.         
  55.     return error;
  56. }
  57.  
  58.  
  59.  
  60. OSErr
  61. SaveGameFile (GamePtr game)
  62. {
  63.     if (! savedBefore)
  64.     
  65.         return SaveAsGameFile (game);
  66.     
  67.     lastReply.sfReplacing = true;
  68.     return SaveSaveAs (& lastReply, game);
  69. }
  70.  
  71.  
  72.  
  73. OSErr
  74. SaveAsGameFile (GamePtr game)
  75. {
  76.     StandardFileReply reply;
  77.  
  78.     StandardPutFile ("\pSave this game as…", "\pVictory!", & reply);
  79.     if (! reply.sfGood)
  80.         return brainNotPresentErr;
  81.         
  82.     return SaveSaveAs (& reply, game);
  83. }
  84.  
  85.  
  86.  
  87. OSErr
  88. SaveSaveAs (StandardFileReply *reply, GamePtr game)
  89. {
  90.     short gameRefNum;
  91.     OSErr error;
  92.         
  93.     if (reply->sfReplacing)
  94.     {    
  95.         unsigned long seconds;
  96.         Str255 tempName;
  97.         short tempRefNum;
  98.         long tempDirID;
  99.         FSSpec tempSpec;
  100.         
  101.         GetDateTime (& seconds);
  102.         NumToString (seconds, tempName);
  103.         FindFolder (reply->sfFile.vRefNum, kTemporaryFolderType, kCreateFolder, & tempRefNum, & tempDirID);
  104.         FSMakeFSSpec (tempRefNum, tempDirID, tempName, & tempSpec);
  105.         FSpCreate (& tempSpec, 'trsh', 'trsh', reply->sfScript);
  106.         
  107.         FSpOpenDF (& tempSpec, fsRdWrPerm, & gameRefNum);
  108.         WriteGame (gameRefNum, game);
  109.         
  110.         FlushVol (nil, reply->sfFile.vRefNum);
  111.         FSClose (gameRefNum);
  112.         FSpExchangeFiles (& tempSpec, & reply->sfFile);
  113.         FSpDelete (& tempSpec);
  114.     }
  115.     else
  116.     {
  117.         error = FSpCreate (& reply->sfFile, 'A•1e', '•••o', reply->sfScript);
  118.         if (error != noErr) { Warning (FILE_NOT_SAVED); return error; }
  119.         
  120.         error = FSpOpenDF (& reply->sfFile, fsWrPerm, & gameRefNum);
  121.         if (error != noErr) { Warning (FILE_NOT_SAVED); return error; }
  122.         
  123.         error = WriteGame (gameRefNum, game);
  124.         if (error != noErr) { Warning (FILE_NOT_SAVED); return error; }
  125.     
  126.         error = FlushVol (nil, reply->sfFile.vRefNum);
  127.         error = FSClose (gameRefNum);
  128.         if (error != noErr) { Warning (FILE_NOT_SAVED); return error; }
  129.     }
  130.     savedBefore = true;
  131.     lastReply = *reply;
  132.     
  133.     return noErr;
  134. }
  135.  
  136.  
  137.  
  138. void
  139. GetSettings (void)
  140. {
  141.     FSSpec prefSpec;
  142.     short prefVolRef, prefFileRef;
  143.     long prefDirRef;
  144.     OSErr result;
  145.     
  146.     GetResSettings();    // get settings stored in resources
  147.     
  148.     result = FindFolder (kOnSystemDisk, kPreferencesFolderType, kCreateFolder, & prefVolRef, & prefDirRef);
  149.     Assert (result == noErr, PREFERENCES_GET_ERROR);
  150.     
  151.     result = FSMakeFSSpec (prefVolRef, prefDirRef, "\pAbalone Preferences", & prefSpec);
  152.     Assert (result == noErr || result == fnfErr, PREFERENCES_GET_ERROR);
  153.     
  154.     if ((result = FSpOpenDF (& prefSpec, fsRdWrPerm, & prefFileRef)) != noErr)
  155.     {
  156.         result = FSpCreate (& prefSpec, 'A•1e', '••oo', smSystemScript);
  157.         Assert (result == noErr, PREFERENCES_GET_ERROR);
  158.         
  159.         result = FSpOpenDF (& prefSpec, fsRdWrPerm, & prefFileRef);
  160.         Assert (result == noErr, PREFERENCES_GET_ERROR);
  161.     }
  162.     else
  163.         ReadSettings (prefFileRef);
  164.     
  165.     result = FSClose (prefFileRef);
  166.     Assert (result == noErr, PREFERENCES_GET_ERROR);
  167. }
  168.  
  169.  
  170.  
  171. void
  172. PutSettings (void)
  173. {
  174.     FSSpec prefSpec;
  175.     short prefVolRef, prefFileRef;
  176.     long prefDirRef;
  177.     OSErr result;
  178.     
  179.     PutResSettings();    ///    put settings to be stored in resources
  180.     
  181.     result = FindFolder (kOnSystemDisk, kPreferencesFolderType, kCreateFolder, & prefVolRef, & prefDirRef);
  182.     Assert (result == noErr, PREFERENCES_PUT_ERROR);
  183.     
  184.     result = FSMakeFSSpec (prefVolRef, prefDirRef, "\pAbalone Preferences", & prefSpec);
  185.     Assert (result == noErr || result == fnfErr, PREFERENCES_PUT_ERROR);
  186.     
  187.     result = FSpOpenDF (& prefSpec, fsRdWrPerm, & prefFileRef);
  188.     
  189.     Assert (result == noErr, PREFERENCES_PUT_ERROR);
  190.  
  191.     WriteSettings (prefFileRef);
  192.     
  193.     result = FSClose (prefFileRef);
  194.     Assert (result == noErr, PREFERENCES_PUT_ERROR);
  195. }
  196.  
  197.  
  198.  
  199. OSErr
  200. WriteGame (short gameRef, GamePtr game)
  201. {
  202.     long    length;
  203.     OSErr    error;
  204.     
  205.     SetFPos (gameRef, fsFromStart, 0L);
  206.     length = sizeof (Game);
  207.     error = FSWrite (gameRef, & length, (Ptr) game);
  208.     if (error || length != sizeof (Game)) { Warning (FILE_NOT_SAVED); return error; }
  209.         
  210.     length = sizeof (Board);
  211.     error = FSWrite (gameRef, & length, (Ptr) game->Board);
  212.     if (error || length != sizeof (Board)) { Warning (FILE_NOT_SAVED); return error; }
  213.         
  214.     return noErr;
  215. }
  216.  
  217.  
  218.  
  219. void
  220. GetResSettings (void)
  221. {
  222.     //    Nothing to do yet: all settings are stored in the preferences file,
  223.     //    and PutResSettings will make sure the resources (so far only one dctb)
  224.     //    will contain the same information as found in the preferences file.
  225. }
  226.  
  227.  
  228.  
  229. void
  230. PutResSettings (void)
  231. {
  232.     WCTabHandle        colorTable = (WCTabHandle) GetResource ('dctb', rWindow);
  233.     
  234.     if (ResError() != noErr)
  235.         return;        // without mentioning this minor problem
  236.     
  237.     (*colorTable)->ctTable[0].rgb = gSet.Color[0];
  238.         
  239.     ChangedResource ((Handle) colorTable);
  240.     WriteResource ((Handle) colorTable);
  241. }
  242.  
  243.  
  244.  
  245. void
  246. ReadSettings (short prefRef)
  247. {
  248.     Settings savedSet;
  249.     long length;
  250.     
  251.     length = sizeof (Settings);
  252.     SetFPos (prefRef, fsFromStart, 0L);
  253.     FSRead (prefRef, & length, (Ptr) & savedSet);
  254.     if (length != sizeof (Settings) || savedSet.Version != kSettingsVersion)
  255.         Warning (PREFERENCES_INVALID);
  256.     else
  257.     {
  258.         gSet = savedSet;
  259.         gTheGame.Players = savedSet.Players;
  260.     }
  261. }
  262.  
  263.  
  264.  
  265. void
  266. WriteSettings (short prefRef)
  267. {
  268.     long length = sizeof (Settings);
  269.     
  270.     SetFPos (prefRef, fsFromStart, 0L);
  271.     FSWrite (prefRef, & length, (Ptr) & gSet);
  272.     if (length != sizeof (Settings))
  273.         Warning (PREFERENCES_NOT_SAVED);
  274. }
  275.