diff --git a/sys/mac/macmain.c b/sys/mac/macmain.c new file mode 100644 index 000000000..15d71d66e --- /dev/null +++ b/sys/mac/macmain.c @@ -0,0 +1,290 @@ +/* SCCS Id: @(#)macmain.c 3.1 97/01/22 */ +/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ +/* NetHack may be freely redistributed. See license for details. */ + +/* main.c - Mac NetHack */ + +#include "hack.h" +#include "dlb.h" +#include "macwin.h" +#include "mactty.h" + +#include +#include +#include +#ifdef MAC_MPW32 +#include +#include +#endif +#include +#include +#include +#include +#ifdef applec +#include +#endif +#include + +#ifndef O_RDONLY +#include +#endif + +static void +finder_file_request(void); + +int NDECL(main); + +int +main (void) +{ + register int fd = -1; + int argc = 1; + + windowprocs = mac_procs; + InitMac (); + + hname = "Mac Hack"; + hackpid = getpid(); + + /* + * Initialisation of the boundaries of the mazes + * Both boundaries have to be even. + */ + + x_maze_max = COLNO-1; + if (x_maze_max % 2) + x_maze_max--; + y_maze_max = ROWNO-1; + if (y_maze_max % 2) + y_maze_max--; + + setrandom(); + initoptions(); + init_nhwindows(&argc, (char **)&hname); + + /* + * It seems you really want to play. + */ + u.uhp = 1; /* prevent RIP on early quits */ + + finder_file_request (); + + dlb_init(); /* must be before newgame() */ + + /* + * Initialize the vision system. This must be before mklev() on a + * new game or before a level restore on a saved game. + */ + vision_init(); + + display_gamewindows(); + +#ifdef WIZARD + if (wizard) + Strcpy(plname, "wizard"); + else +#endif + if(!*plname || !strncmp(plname, "player", 4) || !strncmp(plname, "games", 4)) + askname(); + plnamesuffix(); /* strip suffix from name; calls askname() */ + /* again if suffix was whole name */ + /* accepts any suffix */ + + Sprintf (lock, "%d%s", getuid (), plname); + getlock (); + + if ((fd = restore_saved_game()) >= 0) { +#ifdef WIZARD + /* Since wizard is actually flags.debug, restoring might + * overwrite it. + */ + boolean remember_wiz_mode = wizard; +#endif +#ifdef NEWS + if(iflags.news) { + display_file(NEWS, FALSE); + iflags.news = FALSE; /* in case dorecover() fails */ + } +#endif + pline("Restoring save file..."); + mark_synch(); /* flush output */ + game_active = 1; + if (dorecover(fd)) { +#ifdef WIZARD + if(!wizard && remember_wiz_mode) wizard = TRUE; +#endif + check_special_room(FALSE); + + if (discover || wizard) { + if(yn("Do you want to keep the save file?") == 'n') + (void) delete_savefile(); + else { + compress(fqname(SAVEF, SAVEPREFIX, 0)); + } + } + } + else { + fd = -1; /* set bad status */ + } + } + if (fd < 0) { + player_selection(); + game_active = 1; /* done with selection, draw active game window */ + newgame(); + set_wear(); + (void) pickup(1); + } + + if (discover) + You("are in non-scoring discovery mode."); + flags.move = 0; + + UndimMenuBar (); /* Yes, this is the place for it (!) */ + + moveloop(); + + exit(EXIT_SUCCESS); + /*NOTREACHED*/ + return 0; +} + + +static OSErr +copy_file(short src_vol, long src_dir, short dst_vol, long dst_dir, + Str255 fName, + pascal OSErr (*opener)(short vRefNum, long dirID, + ConstStr255Param fileName, + signed char permission, short *refNum)) { + short src_ref, dst_ref; + OSErr err = (*opener)(src_vol, src_dir, fName, fsRdPerm, &src_ref); + if (err == noErr) { + err = (*opener)(dst_vol, dst_dir, fName, fsWrPerm, &dst_ref); + if (err == noErr) { + + long file_len; + err = GetEOF(src_ref, &file_len); + if (err == noErr) { + Handle buf; + long count = MaxBlock(); + if (count > file_len) + count = file_len; + + buf = NewHandle(count); + err = MemError(); + if (err == noErr) { + + while (count > 0) { + OSErr rd_err = FSRead(src_ref, &count, *buf); + err = FSWrite(dst_ref, &count, *buf); + if (err == noErr) + err = rd_err; + file_len -= count; + } + if (file_len == 0) + err = noErr; + + DisposeHandle(buf); + + } + } + FSClose(dst_ref); + } + FSClose(src_ref); + } + + return err; +} + +static void +force_hdelete(short vol, long dir, Str255 fName) +{ + HRstFLock(vol, dir, fName); + HDelete (vol, dir, fName); +} + + +void +process_openfile (short src_vol, long src_dir, Str255 fName, OSType ftype) +{ + OSErr err = noErr; + + if (ftype != SAVE_TYPE) + return; /* only deal with save files */ + + if (src_vol != theDirs.dataRefNum || src_dir != theDirs.dataDirID && + CatMove(src_vol, src_dir, fName, theDirs.dataDirID, "\p:") != noErr) { + + HCreate(theDirs.dataRefNum, theDirs.dataDirID, fName, MAC_CREATOR, SAVE_TYPE); + err = copy_file(src_vol, src_dir, theDirs.dataRefNum, theDirs.dataDirID, + fName, &HOpen); /* HOpenDF is only there under 7.0 */ + if (err == noErr) + err = copy_file(src_vol, src_dir, theDirs.dataRefNum, theDirs.dataDirID, + fName, &HOpenRF); + if (err == noErr) + force_hdelete(src_vol, src_dir, fName); + else + HDelete(theDirs.dataRefNum, theDirs.dataDirID, fName); + } + + if (err == noErr) { + short ref; + + ref = HOpenResFile(theDirs.dataRefNum, theDirs.dataDirID, fName, fsRdPerm); + if (ref != -1) { + Handle name = Get1Resource('STR ', PLAYER_NAME_RES_ID); + if (name) { + Str255 save_f_p; + P2C(*(StringHandle)name, plname); + set_savefile_name(); + C2P(fqname(SAVEF, SAVEPREFIX, 0), save_f_p); + force_hdelete(theDirs.dataRefNum, theDirs.dataDirID, save_f_p); + + if (HRename(theDirs.dataRefNum, theDirs.dataDirID, fName, save_f_p) == noErr) + macFlags.gotOpen = 1; + } + CloseResFile(ref); + } + } +} + + +static void +finder_file_request(void) +{ + if (macFlags.hasAE) { + /* we're capable of handling Apple Events, so let's see if we have any */ + EventRecord event; + long toWhen = TickCount () + 20; /* wait a third of a second for all initial AE */ + + while (TickCount () < toWhen) { + if (WaitNextEvent (highLevelEventMask, &event, 3L, 0)) { + AEProcessAppleEvent(&event); + if (macFlags.gotOpen) + break; + } + } + } +#if 0 +#ifdef MAC68K + else { + short finder_msg, file_count; + CountAppFiles(&finder_msg, &file_count); + if (finder_msg == appOpen && file_count == 1) { + OSErr err; + AppFile src; + FSSpec filespec; + + GetAppFiles(1, &src); + err = FSMakeFSSpec(src.vRefNum, 0, src.fName, &filespec); + if (err == noErr && src.fType == SAVE_TYPE) { + process_openfile (filespec.vRefNum, filespec.parID, filespec.name, src.fType); + if (macFlags.gotOpen) + ClrAppFiles(1); + } + } + } +#endif /* MAC68K */ +#endif /* 0 */ +} + +/*macmain.c*/