OSDN Git Service

無駄なobject_is_weapon_armour_ammo()呼び出しの削除.
[hengband/hengband.git] / src / main-mac.c
index 8e1c52f..03c12a1 100644 (file)
 
 #include "angband.h"
 
+#ifdef MACH_O_CARBON
+
+#include <Carbon/Carbon.h>
+#include <QuickTime/QuickTime.h>
+#include <CoreServices/CoreServices.h>
+#include <CoreFoundation/CoreFoundation.h>
+
+#define TARGET_API_MAC_CARBON 1
+
+#else /* MACH_O_CARBON */
+
 #include <Types.h>
 #include <Gestalt.h>
 #include <QuickDraw.h>
 #include <Memory.h>
 #include <QDOffscreen.h>
 #include <Sound.h>
+#if TARGET_API_MAC_CARBON
+#include <Navigation.h>
+#include <CFPreferences.h>
+#include <CFNumber.h>
+# ifdef MAC_MPW
+# include <CarbonStdCLib.h>
+# endif
+#endif
 
 #ifdef JP
 
 
 #endif
 
+#endif /* MACH_O_CARBON */
+
+/*
+ * Use rewritten asynchronous sound player
+ */
+#define USE_ASYNC_SOUND
+
 /*
  * Cleaning up a couple of things to make these easier to change --AR
  */
 #ifdef JP
 #define PREF_FILE_NAME "Hengband Preferences"
 #else
-#define PREF_FILE_NAME "Angband Preferences"
+#define PREF_FILE_NAME "Hengband-E Preferences"
 #endif
 
 /*
 /* #define USE_MALLOC */
 
 
+/* Default creator signature */
+#ifndef ANGBAND_CREATOR
+# define ANGBAND_CREATOR 'Heng'
+#endif
+
+
 #if defined(powerc) || defined(__powerc)
 
 /*
 
 
 
+#ifndef MACH_O_CARBON
 #ifdef USE_SFL_CODE
 
 /*
 #include <Folders.h>
 
 #endif
-
+#endif /* !MACH_O_CARBON */
 
 /*
  * Globals for MPW compilation
  */
-#ifdef MAC_MPW
+#if defined(MACH_O_CARBON) || defined(MAC_MPW)
        /* Globals needed */
+#if !TARGET_API_MAC_CARBON
        QDGlobals qd;
-       u32b _ftype;
-       u32b _fcreator;
+#endif
+       OSType _ftype;
+       OSType _fcreator;
 #endif
 
 
@@ -306,12 +341,6 @@ struct term_data
 
 #endif /* ANGBAND_LITE_MAC */
 
-#ifdef JP
-       GWorldPtr               bufferPort;
-       PixMapHandle    bufferPixHndl;
-       PixMapPtr               bufferPix;
-#endif
-
        Str15           title;
 
        s16b            oops;
@@ -357,6 +386,7 @@ struct term_data
  */
 static bool CheckEvents(bool wait);
 
+#ifndef MACH_O_CARBON
 
 /*
  * Hack -- location of the main directory
@@ -364,6 +394,7 @@ static bool CheckEvents(bool wait);
 static short app_vol;
 static long  app_dir;
 
+#endif /* !MACH_O_CARBON */
 
 /*
  * Delay handling of double-clicked savefiles
@@ -401,13 +432,20 @@ static term_data data[MAX_TERM_DATA];
  */
 static bool initialized = FALSE;
 
+/*
+ * Version of Mac OS - for version specific bug workarounds (; ;)
+ */
+static long mac_os_version;
 
 
+#if defined(__MWERKS__)
 /*
  * CodeWarrior uses Universal Procedure Pointers
  */
 static ModalFilterUPP ynfilterUPP;
 
+#endif /* __MWERKS__ */
+
 #ifdef USE_SFL_CODE
 
 /*
@@ -420,10 +458,511 @@ AEEventHandlerUPP AEH_Open_UPP;
 
 #endif
 
+# ifdef USE_ASYNC_SOUND
+
+/*
+ * Asynchronous sound player revised
+ */
+#if defined(USE_QT_SOUND) && !defined(MACH_O_CARBON)
+# undef USE_QT_SOUND
+#endif /* USE_QT_SOUND && !MACH_O_CARBON */
+
+
+/*
+ * Number of channels in the channel pool
+ */
+#if TARGET_API_MAC_CARBON
+#define MAX_CHANNELS           8
+#else
+#define MAX_CHANNELS           4
+#endif
+
+/*
+ * A pool of sound channels
+ */
+static SndChannelPtr channels[MAX_CHANNELS];
+
+/*
+ * Status of the channel pool
+ */
+static Boolean channel_initialised = FALSE;
+
+/*
+ * Data handles containing sound samples
+ */
+static SndListHandle samples[SOUND_MAX];
+
+/*
+ * Reference counts of sound samples
+ */
+static SInt16 sample_refs[SOUND_MAX];
+
+
+/*
+ * Sound effects
+ *
+ * These constants aren't used by the program at the moment.
+ */
+#define SOUND_VOLUME_MIN       0       /* Default minimum sound volume */
+#define SOUND_VOLUME_MAX       255     /* Default maximum sound volume */
+#define VOLUME_MIN                     0       /* Minimum sound volume in % */
+#define VOLUME_MAX                     100     /* Maximum sound volume in % */
+#define VOLUME_INC                     5       /* Increment sound volume in % */
+
+/* I'm just too lazy to write a panel for this XXX XXX */
+static SInt16 sound_volume = SOUND_VOLUME_MAX;
+
+#ifdef USE_QT_SOUND
+
+/*
+ * Moving graphics resources into data fork -- pelpel
+ *
+ * (Carbon, Bundle)
+ * Given base and type names of a resource, find a file in the
+ * current application bundle and return its FSSpec in the third argument.
+ * Returns true on success, false otherwise.
+ * e.g. get_resource_spec(CFSTR("8x8"), CFSTR("png"), &spec);
+ */
+static Boolean get_resource_spec(
+       CFStringRef base_name, CFStringRef type_name, FSSpec *spec)
+{
+       CFURLRef res_url;
+       FSRef ref;
+
+       /* Find resource (=file) in the current bundle */
+       res_url = CFBundleCopyResourceURL(
+               CFBundleGetMainBundle(), base_name, type_name, NULL);
+
+       /* Oops */
+       if (res_url == NULL) return (false);
+
+       /* Convert CFURL to FSRef */
+       (void)CFURLGetFSRef(res_url, &ref);
+
+       /* Convert FSRef to FSSpec */
+       (void)FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, spec, NULL);
+
+       /* Free allocated CF data */
+       CFRelease(res_url);
+
+       /* Success */
+       return (true);
+}
+
+/*
+ * QuickTime sound, by Ron Anderson
+ *
+ * I didn't choose to use Windows-style .ini files (Ron wrote a parser
+ * for it, but...), nor did I use lib/xtra directory, hoping someone
+ * would code plist-based configuration code in the future -- pelpel
+ */
+
+/*
+ * (QuickTime)
+ * Load sound effects from data-fork resources.  They are wav files
+ * with the same names as angband_sound_name[] (variable.c)
+ *
+ * Globals referenced: angband_sound_name[]
+ * Globals updated: samples[] (they can be *huge*)
+ */
+static void load_sounds(void)
+{
+       OSErr err;
+       int i;
+
+       /* Start QuickTime */
+       err = EnterMovies();
+
+       /* Error */
+       if (err != noErr) return;
+
+       /*
+        * This loop may take a while depending on the count and size of samples
+        * to load.
+        *
+        * We should use a progress dialog for this.
+        */
+       for (i = 1; i < SOUND_MAX; i++)
+       {
+               /* Apple APIs always give me headacke :( */
+               CFStringRef name;
+               FSSpec spec;
+               SInt16 file_id;
+               SInt16 res_id;
+               Str255 movie_name;
+               Movie movie;
+               Track track;
+               Handle h;
+               Boolean res;
+
+               /* Allocate CFString with the name of sound event to be processed */
+               name = CFStringCreateWithCString(NULL, angband_sound_name[i],
+                       kTextEncodingUS_ASCII);
+
+               /* Error */
+               if (name == NULL) continue;
+
+               /* Find sound sample resource with the same name */
+               res = get_resource_spec(name, CFSTR("wav"), &spec);
+
+               /* Free the reference to CFString */
+               CFRelease(name);
+
+               /* Error */
+               if (!res) continue;
+
+               /* Open the sound file */
+               err = OpenMovieFile(&spec, &file_id, fsRdPerm);
+
+               /* Error */
+               if (err != noErr) continue;
+
+               /* Create Movie from the file */
+               err = NewMovieFromFile(&movie, file_id, &res_id, movie_name,
+                       newMovieActive, NULL);
+
+               /* Error */
+               if (err != noErr) goto close_file;
+
+               /* Get the first track of the movie */
+               track = GetMovieIndTrackType(movie, 1, AudioMediaCharacteristic,
+                       movieTrackCharacteristic | movieTrackEnabledOnly );
+
+               /* Error */
+               if (track == NULL) goto close_movie;
+
+               /* Allocate a handle to store sample */
+               h = NewHandle(0);
+
+               /* Error */
+               if (h == NULL) goto close_track;
+
+               /* Dump the sample into the handle */
+               err = PutMovieIntoTypedHandle(movie, track, soundListRsrc, h, 0,
+                       GetTrackDuration(track), 0L, NULL);
+
+               /* Success */
+               if (err == noErr)
+               {
+                       /* Store the handle in the sample list */
+                       samples[i] = (SndListHandle)h;
+               }
+
+               /* Failure */
+               else
+               {
+                       /* Free unused handle */
+                       DisposeHandle(h);
+               }
+
+               /* Free the track */
+               close_track: DisposeMovieTrack(track);
+
+               /* Free the movie */
+               close_movie: DisposeMovie(movie);
+
+               /* Close the movie file */
+               close_file: CloseMovieFile(file_id);
+       }
+
+       /* Stop QuickTime */
+       ExitMovies();
+}
+
+#else /* USE_QT_SOUND */
+
+/*
+ * Return a handle of 'snd ' resource given Angband sound event number,
+ * or NULL if it isn't found.
+ *
+ * Globals referenced: angband_sound_name[] (variable.c)
+ */
+static SndListHandle find_sound(int num)
+{
+       Str255 sound;
+
+       /* Get the proper sound name */
+       strnfmt((char*)sound + 1, 255, "%.16s.wav", angband_sound_name[num]);
+       sound[0] = strlen((char*)sound + 1);
+
+       /* Obtain resource XXX XXX XXX */
+       return ((SndListHandle)GetNamedResource('snd ', sound));
+}
+
+#endif /* USE_QT_SOUND */
+
+
+/*
+ * Clean up sound support - to be called when the game exits.
+ *
+ * Globals referenced: channels[], samples[], sample_refs[].
+ */
+static void cleanup_sound(void)
+{
+       int i;
+
+       /* No need to clean it up */
+       if (!channel_initialised) return;
+
+       /* Dispose channels */
+       for (i = 0; i < MAX_CHANNELS; i++)
+       {
+               /* Drain sound commands and free the channel */
+               SndDisposeChannel(channels[i], TRUE);
+       }
+
+       /* Free sound data */
+       for (i = 1; i < SOUND_MAX; i++)
+       {
+               /* Still locked */
+               if ((sample_refs[i] > 0) && (samples[i] != NULL))
+               {
+                       /* Unlock it */
+                       HUnlock((Handle)samples[i]);
+               }
+
+#ifndef USE_QT_SOUND
+
+               /* Release it */
+               if (samples[i]) ReleaseResource((Handle)samples[i]);
+#else
+
+               /* Free handle */
+               if (samples[i]) DisposeHandle((Handle)samples[i]);
+#endif /* !USE_QT_SOUND */
+       }
+}
+
+
+/*
+ * Play sound effects asynchronously -- pelpel
+ *
+ * I don't believe those who first started using the previous implementations
+ * imagined this is *much* more complicated as it may seem.  Anyway, 
+ * introduced round-robin scheduling of channels and made it much more
+ * paranoid about HLock/HUnlock.
+ *
+ * XXX XXX de-refcounting, HUnlock and ReleaseResource should be done
+ * using channel's callback procedures, which set global flags, and
+ * a procedure hooked into CheckEvents does housekeeping.  On the other
+ * hand, this lazy reclaiming strategy keeps things simple (no interrupt
+ * time code) and provides a sort of cache for sound data.
+ *
+ * Globals referenced: channel_initialised, channels[], samples[],
+ *   sample_refs[].
+ * Globals updated: ditto.
+ */
+static void play_sound(int num, SInt16 vol)
+{
+       OSErr err;
+       int i;
+       int prev_num;
+       SndListHandle h;
+       SndChannelPtr chan;
+       SCStatus status;
+
+       static int next_chan;
+       static SInt16 channel_occupants[MAX_CHANNELS];
+       static SndCommand volume_cmd, quiet_cmd;
+
+
+       /* Initialise sound channels */
+       if (!channel_initialised)
+       {
+               for (i = 0; i < MAX_CHANNELS; i++)
+               {
+                       /* Paranoia - Clear occupant table */
+                       /* channel_occupants[i] = 0; */
+
+                       /* Create sound channel for all sounds to play from */
+                       err = SndNewChannel(&channels[i], sampledSynth, initMono, 0L);
+
+                       /* Error */
+                       if (err != noErr)
+                       {
+                               /* Free channels */
+                               while (--i >= 0)
+                               {
+                                       SndDisposeChannel(channels[i], TRUE);
+                               }
+
+                               /* Notify error */
+#ifdef JP
+                               plog("¥µ¥¦¥ó¥É¥Á¥ã¥ó¥Í¥ë¤ò½é´ü²½½ÐÍè¤Þ¤»¤ó!");
+#else
+                               plog("Cannot initialise sound channels!");
+#endif
+
+                               /* Cancel request */
+                               use_sound = arg_sound = FALSE;
+
+                               /* Failure */
+                               return;
+                       }
+               }
+
+               /* First channel to use */
+               next_chan = 0;
+
+               /* Prepare volume command */
+               volume_cmd.cmd = volumeCmd;
+               volume_cmd.param1 = 0;
+               volume_cmd.param2 = 0;
+
+               /* Prepare quiet command */
+               quiet_cmd.cmd = quietCmd;
+               quiet_cmd.param1 = 0;
+               quiet_cmd.param2 = 0;
+
+               /* Initialisation complete */
+               channel_initialised = TRUE;
+       }
+
+       /* Paranoia */
+       if ((num <= 0) || (num >= SOUND_MAX)) return;
+
+       /* Prepare volume command */
+       volume_cmd.param2 = ((SInt32)vol << 16) | vol;
+
+       /* Channel to use (round robin) */
+       chan = channels[next_chan];
+
+       /* See if the resource is already in use */
+       if (sample_refs[num] > 0)
+       {
+               /* Resource in use */
+               h = samples[num];
+
+               /* Increase the refcount */
+               sample_refs[num]++;
+       }
+
+       /* Sound is not currently in use */
+       else
+       {
+               /* Get handle for the sound */
+#ifdef USE_QT_SOUND
+               h = samples[num];
+#else
+               h = find_sound(num);
+#endif /* USE_QT_SOUND */
+
+               /* Sample not available */
+               if (h == NULL) return;
+
+#ifndef USE_QT_SOUND
+
+               /* Load resource */
+               LoadResource((Handle)h);
+
+               /* Remember it */
+               samples[num] = h;
+
+#endif /* !USE_QT_SOUND */
+
+               /* Lock the handle */
+               HLockHi((Handle)h);
+
+               /* Initialise refcount */
+               sample_refs[num] = 1;
+       }
+
+       /* Poll the channel */
+       err = SndChannelStatus(chan, sizeof(SCStatus), &status);
+
+       /* It isn't available */
+       if ((err != noErr) || status.scChannelBusy)
+       {
+               /* Shut it down */
+               SndDoImmediate(chan, &quiet_cmd);
+       }
+
+       /* Previously played sound on this channel */
+       prev_num = channel_occupants[next_chan];
+
+       /* Process previously played sound */
+       if (prev_num != 0)
+       {
+               /* Decrease refcount */
+               sample_refs[prev_num]--;
+
+               /* We can free it now */
+               if (sample_refs[prev_num] <= 0)
+               {
+                       /* Unlock */
+                       HUnlock((Handle)samples[prev_num]);
+
+#ifndef USE_QT_SOUND
+
+                       /* Release */
+                       ReleaseResource((Handle)samples[prev_num]);
+
+                       /* Forget handle */
+                       samples[prev_num] = NULL;
+
+#endif /* !USE_QT_SOUND */
+
+                       /* Paranoia */
+                       sample_refs[prev_num] = 0;
+               }
+       }
+
+       /* Remember this sound as the current occupant of the channel */
+       channel_occupants[next_chan] = num;
+
+       /* Set up volume for channel */
+       SndDoImmediate(chan, &volume_cmd);
+
+       /* Play new sound asynchronously */
+       SndPlay(chan, h, TRUE);
+
+       /* Schedule next channel (round robin) */
+       next_chan++;
+       if (next_chan >= MAX_CHANNELS) next_chan = 0;
+}
+
+# else /* USE_ASYNC_SOUND */
+
+/*
+ * Play sound synchronously
+ *
+ * This may not be your choice, but much safer and much less resource hungry.
+ */
+static void play_sound(int num, SInt16 vol)
+{
+       Handle handle;
+       Str255 sound;
+
+       /* Get the proper sound name */
+       strnfmt((char*)sound + 1, 255, "%.16s.wav", angband_sound_name[num]);
+       sound[0] = strlen((char*)sound + 1);
+
+       /* Obtain resource XXX XXX XXX */
+       handle = GetNamedResource('snd ', sound);
+
+       /* Oops */
+       if (handle == NULL) return;
+
+       /* Load and Lock */
+       LoadResource(handle);
+       HLockHi(handle);
+
+       /* Play sound (wait for completion) */
+       SndPlay(NULL, (SndListHandle)handle, FALSE);
+
+       /* Unlock and release */
+       HUnlock(handle);
+       ReleaseResource(handle);
+}
+
+# endif /* USE_ASYNC_SOUND */
+
+#ifndef MACH_O_CARBON
+
 /*
        Extra Sound Mode
 */
-#ifdef JP
+
 static int ext_sound = 0;
 
 #define                SND_NON         0
@@ -502,10 +1041,11 @@ static int soundchoice[] = {
        SND_TRAP,
 };
 
-static int                     soundmode[8];
+static int ext_graf = 0;
 
+#endif /* !MACH_O_CARBON */
 
-#endif
+static short                   soundmode[8];
 
 
 /*
@@ -513,15 +1053,19 @@ static int                       soundmode[8];
  * Store this filename in 'buf' (make sure it is long enough)
  * Note that 'fname' looks to be a "pascal" string
  */
+#if TARGET_API_MAC_CARBON
 static void refnum_to_name(char *buf, long refnum, short vrefnum, char *fname)
 {
-       DirInfo pb;
-       Str255 name;
+       CInfoPBRec pb;
        int err;
        int i, j;
 
        char res[1000];
-
+       
+       FSSpec spec;
+       short   vref;
+    long       dirID;
+    
        i=999;
 
        res[i]=0; i--;
@@ -531,18 +1075,62 @@ static void refnum_to_name(char *buf, long refnum, short vrefnum, char *fname)
        }
        i-=fname[0];
 
-       pb.ioCompletion=NULL;
-       pb.ioNamePtr=name;
-       pb.ioVRefNum=vrefnum;
-       pb.ioDrParID=refnum;
-       pb.ioFDirIndex=-1;
+       vref = vrefnum;
+       dirID = refnum;
 
        while (1)
        {
-               pb.ioDrDirID=pb.ioDrParID;
-               err = PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
+               pb.dirInfo.ioDrDirID=pb.dirInfo.ioDrParID;
+               err = FSMakeFSSpec( vref, dirID, "\p", &spec );
+               
+               if( err != noErr )
+                   break;
+               
                res[i] = ':'; i--;
-               for (j=1; j<=name[0]; j++)
+               for (j=1; j<=spec.name[0]; j++)
+               {
+                       res[i-spec.name[0]+j] = spec.name[j];
+               }
+               i -= spec.name[0];
+               
+               dirID = spec.parID;
+       }
+
+       /* Extract the result */
+       for (j = 0, i++; res[i]; j++, i++) buf[j] = res[i];
+       buf[j] = 0;
+}
+#else
+static void refnum_to_name(char *buf, long refnum, short vrefnum, char *fname)
+{
+       DirInfo pb;
+       Str255 name;
+       int err;
+       int i, j;
+
+       char res[1000];
+
+       i=999;
+
+       res[i]=0; i--;
+       for (j=1; j<=fname[0]; j++)
+       {
+               res[i-fname[0]+j] = fname[j];
+       }
+       i-=fname[0];
+
+       pb.ioCompletion=NULL;
+       pb.ioNamePtr=name;
+       pb.ioVRefNum=vrefnum;
+       pb.ioDrParID=refnum;
+       pb.ioFDirIndex=-1;
+
+       while (1)
+       {
+               pb.ioDrDirID=pb.ioDrParID;
+               err = PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
+               res[i] = ':'; i--;
+               for (j=1; j<=name[0]; j++)
                {
                        res[i-name[0]+j] = name[j];
                }
@@ -555,7 +1143,39 @@ static void refnum_to_name(char *buf, long refnum, short vrefnum, char *fname)
        for (j = 0, i++; res[i]; j++, i++) buf[j] = res[i];
        buf[j] = 0;
 }
+#endif
 
+#if TARGET_API_MAC_CARBON
+pascal OSErr FSpLocationFromFullPath(short fullPathLength,
+                                                                        const void *fullPath,
+                                                                        FSSpec *spec)
+{
+       AliasHandle     alias;
+       OSErr           result;
+       Boolean         wasChanged;
+       Str32           nullString;
+       
+       /* Create a minimal alias from the full pathname */
+       nullString[0] = 0;      /* null string to indicate no zone or server name */
+       result = NewAliasMinimalFromFullPath(fullPathLength, fullPath, nullString, nullString, &alias);
+       if ( result == noErr )
+       {
+               /* Let the Alias Manager resolve the alias. */
+               result = ResolveAlias(NULL, alias, spec, &wasChanged);
+               
+               /* work around Alias Mgr sloppy volume matching bug */
+               if ( spec->vRefNum == 0 )
+               {
+                       /* invalidate wrong FSSpec */
+                       spec->parID = 0;
+                       spec->name[0] =  0;
+                       result = nsvErr;
+               }
+               DisposeHandle((Handle)alias);   /* Free up memory used */
+       }
+       return ( result );
+}
+#endif
 
 #if 0
 
@@ -601,7 +1221,166 @@ static bool askfor_file(char *buf, int len)
 
 #endif
 
+#if !TARGET_API_MAC_CARBON
+static void local_to_global( Rect *r )
+{
+       Point           temp;
+       
+       temp.h = r->left;
+       temp.v = r->top;
+       
+       LocalToGlobal( &temp );
+       
+       r->left = temp.h;
+       r->top = temp.v;
+       
+       temp.h = r->right;
+       temp.v = r->bottom;
+       
+       LocalToGlobal( &temp );
+       
+       r->right = temp.h;
+       r->bottom = temp.v;
+}
+#endif /* !TARGET_API_MAC_CARBON */
+
+static void global_to_local( Rect *r )
+{
+       Point           temp;
+       
+       temp.h = r->left;
+       temp.v = r->top;
+       
+       GlobalToLocal( &temp );
+       
+       r->left = temp.h;
+       r->top = temp.v;
+       
+       temp.h = r->right;
+       temp.v = r->bottom;
+       
+       GlobalToLocal( &temp );
+       
+       r->right = temp.h;
+       r->bottom = temp.v;
+}
+
+
+#ifdef MAC_MPW
+
+/*
+ * Convert pathname to an appropriate format, because MPW's
+ * CarbonStdCLib chose to use system's native path format,
+ * making our lives harder to create binaries that run on
+ * OS 8/9 and OS X :( -- pelpel
+ */
+void convert_pathname(char* path)
+{
+       char buf[1024];
+
+       /* Nothing has to be done for CarbonLib on Classic */
+       if (mac_os_version >= 0x1000)
+       {
+               /* Convert to POSIX style */
+               ConvertHFSPathToUnixPath(path, buf);
+
+               /* Copy the result back */
+               strcpy(path, buf);
+       }
+
+       /* Done. */
+       return;
+}
+
+# ifdef CHECK_MODIFICATION_TIME
+
+/*
+ * Although there is no easy way to emulate fstat in the old interface,
+ * we still can do stat-like things, because Mac OS is an OS.
+ */
+static int get_modification_time(cptr path, u32b *mod_time)
+{
+       CInfoPBRec pb;
+       Str255 pathname;
+       int i;
+
+       /* Paranoia - make sure the pathname fits in Str255 */
+       i = strlen(path);
+       if (i > 255) return (-1);
+
+       /* Convert pathname to a Pascal string */
+       strncpy((char *)pathname + 1, path, 255);
+       pathname[0] = i;
+
+       /* Set up parameter block */
+       pb.hFileInfo.ioNamePtr = pathname;
+       pb.hFileInfo.ioFDirIndex = 0;
+       pb.hFileInfo.ioVRefNum = app_vol;
+       pb.hFileInfo.ioDirID = 0;
+
+       /* Get catalog information of the file */
+       if (PBGetCatInfoSync(&pb) != noErr) return (-1);
+
+       /* Set modification date and time */
+       *mod_time = pb.hFileInfo.ioFlMdDat;
+
+       /* Success */
+       return (0);
+}
+
 
+/*
+ * A (non-Mach-O) Mac OS version of check_modification_time, for those
+ * compilers without good enough POSIX-compatibility libraries XXX XXX
+ */
+errr check_modification_date(int fd, cptr template_file)
+{
+#pragma unused(fd)
+       u32b txt_stat, raw_stat;
+       char *p;
+       char fname[32];
+       char buf[1024];
+
+       /* Build the file name */
+       path_build(buf, sizeof(buf), ANGBAND_DIR_EDIT, template_file);
+
+       /* XXX XXX XXX */
+       convert_pathname(buf);
+
+       /* Obtain modification time */
+       if (get_modification_time(buf, &txt_stat)) return (-1);
+
+       /* XXX Build filename of the corresponding *.raw file */
+       strnfmt(fname, sizeof(fname), "%s", template_file);
+
+       /* Find last '.' */
+       p = strrchr(fname, '.');
+
+       /* Can't happen */
+       if (p == NULL) return (-1);
+
+       /* Substitute ".raw" for ".txt" */
+       strcpy(p, ".raw");
+
+       /* Build the file name of the raw file */
+       path_build(buf, sizeof(buf), ANGBAND_DIR_DATA, fname);
+
+       /* XXX XXX XXX */
+       convert_pathname(buf);
+
+       /* Obtain modification time */
+       if (get_modification_time(buf, &raw_stat)) return (-1);
+
+       /* Ensure the text file is not newer than the raw file */
+       if (txt_stat > raw_stat) return (-1);
+
+       /* Keep using the current .raw file */
+       return (0);
+}
+
+# endif /* CHECK_MODIFICATION_TIME */
+
+#endif /* MAC_MPW */
 
 /*
  * Center a rectangle inside another rectangle
@@ -619,6 +1398,84 @@ static void center_rect(Rect *r, Rect *s)
 }
 
 
+#ifdef MACH_O_CARBON
+
+/* Carbon File Manager utilities by pelpel */
+
+/*
+ * (Carbon)
+ * Convert a pathname to a corresponding FSSpec.
+ * Returns noErr on success.
+ */
+static OSErr path_to_spec(const char *path, FSSpec *spec)
+{
+       OSErr err;
+       FSRef ref;
+
+       /* Convert pathname to FSRef ... */
+       err = FSPathMakeRef(path, &ref, NULL);
+       if (err != noErr) return (err);
+
+       /* ... then FSRef to FSSpec */
+       err = FSGetCatalogInfo(&ref, kFSCatInfoNone, NULL, NULL, spec, NULL);
+       
+       /* Inform caller of success or failure */
+       return (err);
+}
+
+
+/*
+ * (Carbon)
+ * Convert a FSSpec to a corresponding pathname.
+ * Returns noErr on success.
+ */
+static OSErr spec_to_path(const FSSpec *spec, char *buf, size_t size)
+{
+       OSErr err;
+       FSRef ref;
+
+       /* Convert FSSpec to FSRef ... */
+       err = FSpMakeFSRef(spec, &ref);
+       if (err != noErr) return (err);
+
+       /* ... then FSRef to pathname */
+       err = FSRefMakePath(&ref, buf, size);
+
+       /* Inform caller of success or failure */
+       return (err);
+}
+
+
+/*
+ * (Carbon) [via path_to_spec]
+ * Set creator and filetype of a file specified by POSIX-style pathname.
+ * Returns 0 on success, -1 in case of errors.
+ */
+void fsetfileinfo(cptr pathname, OSType fcreator, OSType ftype)
+{
+       OSErr err;
+       FSSpec spec;
+       FInfo info;
+
+       /* Convert pathname to FSSpec */
+       if (path_to_spec(pathname, &spec) != noErr) return;
+
+       /* Obtain current finder info of the file */
+       if (FSpGetFInfo(&spec, &info) != noErr) return;
+
+       /* Overwrite creator and type */
+       info.fdCreator = fcreator;
+       info.fdType = ftype;
+       err = FSpSetFInfo(&spec, &info);
+
+       /* Done */
+       return;
+}
+
+
+#else /* MACH_O_CARBON */
+
+
 /*
  * Convert a pascal string in place
  *
@@ -702,8 +1559,7 @@ static void PathNameFromDirID(long dirID, short vRefNum, StringPtr fullPathName)
 }
 
 #endif
-
-
+#endif /* MACH_O_CARBON */
 
 /*
  * Activate a given window, if necessary
@@ -714,7 +1570,11 @@ static void activate(WindowPtr w)
        if (active != w)
        {
                /* Activate */
+#if TARGET_API_MAC_CARBON
+               if (w) SetPortWindowPort(w);
+#else
                if (w) SetPort(w);
+#endif
 
                /* Remember */
                active = w;
@@ -764,7 +1624,6 @@ static void mac_warning(cptr warning)
  */
 static void term_data_color(term_data *td, int a)
 {
-#ifdef JP
        u16b rv, gv, bv;
 
        RGBColor color;
@@ -784,31 +1643,6 @@ static void term_data_color(term_data *td, int a)
 
        /* Memorize color */
        td->last = a;
-#else
-       /* Activate the color */
-       if (td->last != a)
-       {
-               u16b rv, gv, bv;
-
-               RGBColor color;
-
-               /* Extract the R,G,B data */
-               rv = angband_color_table[a][1];
-               gv = angband_color_table[a][2];
-               bv = angband_color_table[a][3];
-
-               /* Set the color */
-               color.red = (rv | (rv << 8));
-               color.green = (gv | (gv << 8));
-               color.blue = (bv | (bv << 8));
-       
-               /* Activate the color */
-               RGBForeColor(&color);
-
-               /* Memorize color */
-               td->last = a;
-       }
-#endif
 }
 
 #endif /* ANGBAND_LITE_MAC */
@@ -863,15 +1697,10 @@ static void term_data_check_font(term_data *td)
        td->tile_o_y = td->font_o_y;
 
        /* Set default tile size */
-#ifdef JP
        if( td->tile_wid == 0 && td->tile_hgt == 0 ){
                td->tile_wid = td->font_wid;
                td->tile_hgt = td->font_hgt;
        }
-#else
-       td->tile_wid = td->font_wid;
-       td->tile_hgt = td->font_hgt;
-#endif
 
        /* Re-activate the old window */
        activate(old);
@@ -883,9 +1712,27 @@ static void term_data_check_font(term_data *td)
  */
 static void term_data_check_size(term_data *td)
 {
+       BitMap          screen;
+       
+#if TARGET_API_MAC_CARBON
+       GetQDGlobalsScreenBits( &screen );
+#else
+       screen = qd.screenBits;
+#endif
        /* Minimal window size */
-       if (td->cols < 1) td->cols = 1;
-       if (td->rows < 1) td->rows = 1;
+       if (td == &data[0])
+       {
+               /* Enforce minimal size */
+               if (td->cols < 80) td->cols = 80;
+               if (td->rows < 24) td->rows = 24;
+       }
+
+       /* Allow small windows for the rest */
+       else
+       {
+               if (td->cols < 1) td->cols = 1;
+               if (td->rows < 1) td->rows = 1;
+       }
 
        /* Minimal tile size */
        if (td->tile_wid < 4) td->tile_wid = 4;
@@ -908,27 +1755,27 @@ static void term_data_check_size(term_data *td)
        td->size_hgt = td->rows * td->tile_hgt + td->size_oh1 + td->size_oh2;
 
        /* Verify the top */
-       if (td->r.top > qd.screenBits.bounds.bottom - td->size_hgt)
+       if (td->r.top > screen.bounds.bottom - td->size_hgt)
        {
-               td->r.top = qd.screenBits.bounds.bottom - td->size_hgt;
+               td->r.top = screen.bounds.bottom - td->size_hgt;
        }
 
        /* Verify the top */
-       if (td->r.top < qd.screenBits.bounds.top + 30)
+       if (td->r.top < screen.bounds.top + 30)
        {
-               td->r.top = qd.screenBits.bounds.top + 30;
+               td->r.top = screen.bounds.top + 30;
        }
 
        /* Verify the left */
-       if (td->r.left > qd.screenBits.bounds.right - td->size_wid)
+       if (td->r.left > screen.bounds.right - td->size_wid)
        {
-               td->r.left = qd.screenBits.bounds.right - td->size_wid;
+               td->r.left = screen.bounds.right - td->size_wid;
        }
 
        /* Verify the left */
-       if (td->r.left < qd.screenBits.bounds.left)
+       if (td->r.left < screen.bounds.left)
        {
-               td->r.left = qd.screenBits.bounds.left;
+               td->r.left = screen.bounds.left;
        }
 
        /* Calculate bottom right corner */
@@ -936,6 +1783,7 @@ static void term_data_check_size(term_data *td)
        td->r.bottom = td->r.top + td->size_hgt;
 
        /* Assume no graphics */
+       td->t->higher_pict = FALSE;
        td->t->always_pict = FALSE;
 
 #ifdef ANGBAND_LITE_MAC
@@ -945,9 +1793,13 @@ static void term_data_check_size(term_data *td)
 #else /* ANGBAND_LITE_MAC */
 
        /* Handle graphics */
-       if (use_graphics && (td == &data[0]))
+       if (use_graphics)
        {
-               td->t->always_pict = TRUE;
+               /* Use higher_pict whenever possible */
+               if (td->font_mono) td->t->higher_pict = TRUE;
+
+               /* Use always_pict only when necessary */
+               else td->t->always_pict = TRUE;
        }
 
 #endif /* ANGBAND_LITE_MAC */
@@ -955,14 +1807,14 @@ static void term_data_check_size(term_data *td)
        /* Fake mono-space */
        if (!td->font_mono ||
            (td->font_wid != td->tile_wid) ||
-           (td->font_hgt != td->tile_hgt))
+               (td->font_hgt != td->tile_hgt))
        {
-               /* Handle fake monospace */
+               /* Handle fake monospace -- this is SLOW */
+               if (td->t->higher_pict) td->t->higher_pict = FALSE;
                td->t->always_pict = TRUE;
        }
 }
 
-static OSErr XDDSWUpDateGWorldFromPict( term_data *td );
 /*
  * Hack -- resize a term_data
  *
@@ -972,10 +1824,6 @@ static void term_data_resize(term_data *td)
 {
        /* Actually resize the window */
        SizeWindow(td->w, td->size_wid, td->size_hgt, 0);
-       
-#ifdef JP
-               XDDSWUpDateGWorldFromPict( td );
-#endif
 }
 
 
@@ -1000,9 +1848,19 @@ static void term_data_redraw(term_data *td)
 
        /* Restore the old term */
        Term_activate(old);
-
+       
        /* No need to redraw */
+#if TARGET_API_MAC_CARBON
+       {
+               RgnHandle               theRgn = NewRgn();
+               GetWindowRegion( td->w, kWindowContentRgn, theRgn );
+               ValidWindowRgn( (WindowRef)(td->w), theRgn );
+               DisposeRgn( theRgn );
+       }
+#else
        ValidRect(&td->w->portRect);
+#endif
+
 }
 
 
@@ -1019,11 +1877,13 @@ static void term_data_redraw(term_data *td)
  * Constants
  */
 
-#define kPictID                                        1001                    /* Graf 'pict' resource */
+static int pictID = 1001;      /* 8x8 tiles; 16x16 tiles are 1002 */
 
-#define kGrafWidth                             8                               /* Graf Size (X) */
-#define kGrafHeight                            8                               /* Graf Size (Y) */
+static int grafWidth = 8;      /* Always equal to grafHeight */
+static int grafHeight = 8;     /* Either 8 or 16 */
 
+static bool arg_newstyle_graphics;
+static bool use_newstyle_graphics;
 
 /*
  * Forward Declare
@@ -1063,26 +1923,14 @@ static void BenSWLockFrame(FrameRec *srcFrameP)
        (void)LockPixels(pixMapH);
        HLockHi((Handle)pixMapH);
        srcFrameP->framePixHndl = pixMapH;
+#if TARGET_API_MAC_CARBON
+       srcFrameP->framePix = (PixMapPtr)*(Handle)pixMapH;
+#else
        srcFrameP->framePix = (PixMapPtr)StripAddress(*(Handle)pixMapH);
+#endif
        
 }
 
-#ifdef JP
-/*
- * Lock a frame
- */
-static void XDDSWLockFrame( term_data *td )
-{
-       PixMapHandle            pixMapH;
-
-       pixMapH = GetGWorldPixMap(td->bufferPort);
-       (void)LockPixels(pixMapH);
-       HLockHi((Handle)pixMapH);
-       td->bufferPixHndl = pixMapH;
-       td->bufferPix = (PixMapPtr)*(Handle)pixMapH;
-}
-#endif
-
 
 /*
  * Unlock a frame
@@ -1099,22 +1947,6 @@ static void BenSWUnlockFrame(FrameRec *srcFrameP)
        
 }
 
-#ifdef JP
-/*
- * Unlock a frame
- */
-static void XDDSWUnlockFrame( term_data *td )
-{
-       if (td->bufferPort != NULL)
-       {
-               HUnlock((Handle)td->bufferPixHndl);
-               UnlockPixels(td->bufferPixHndl);
-       }
-
-       td->bufferPix = NULL;
-}
-#endif
-
 static OSErr BenSWCreateGWorldFromPict(
        GWorldPtr *pictGWorld,
        PicHandle pictH)
@@ -1172,139 +2004,31 @@ static OSErr BenSWCreateGWorldFromPict(
        return (0);
 }
 
-#ifdef JP
 
-static OSErr XDDSWCreateGWorldFromPict(
-       GWorldPtr *pictGWorld,
-       term_data *td )
+
+
+/*
+ * Init the global "frameP"
+ */
+
+static errr globe_init(void)
 {
        OSErr err;
-/*     GWorldPtr saveGWorld;
-       GDHandle saveGDevice;*/
-       GWorldPtr tempGWorld;
-       Rect pictRect;
-/*     short depth; */
-/*     GDHandle theGDH; */
-       
-       tempGWorld = NULL;
        
-       /* Reset */
-       *pictGWorld = NULL;
+       GWorldPtr tempPictGWorldP;
 
-       /* Get depth */
-/*     depth = td->pixelDepth; */
+       PicHandle newPictH;
 
-       /* Get GDH */
-/*     theGDH = td->theGDH; */
+       /* Use window XXX XXX XXX */
+#if TARGET_API_MAC_CARBON
+       SetPortWindowPort(data[0].w);
+#else
+       SetPort(data[0].w);
+#endif
 
-       /* Obtain size rectangle */
-       pictRect.left = 0;
-       pictRect.right = td->size_wid;
-       pictRect.top = 0;
-       pictRect.bottom = td->tile_hgt;
-       
-       /* Create a GWorld */
-       err = NewGWorld(&tempGWorld, 0, &pictRect, 0, 0, 0);
-       
-       /* Success */
-       if (err != noErr)
-       {
-               return (err);
-       }
-       
-       /* Save pointer */
-       *pictGWorld = tempGWorld;
-       
-       /* Save GWorld */
-/*     GetGWorld(&saveGWorld, &saveGDevice); */
 
-       /* Activate */
-/*     SetGWorld(tempGWorld, nil); */
-
-       /* Dump the pict into the GWorld */
-/*     (void)LockPixels(GetGWorldPixMap(tempGWorld)); */
-/*     EraseRect(&pictRect); */
-/*     DrawPicture(pictH, &pictRect); */
-/*     UnlockPixels(GetGWorldPixMap(tempGWorld)); */
-
-       /* Restore GWorld */
-/*     SetGWorld(saveGWorld, saveGDevice); */
-       
-       return (0);
-}
-
-
-static OSErr XDDSWUpDateGWorldFromPict( term_data *td )
-{
-/*     GWorldPtr saveGWorld; */
-/*     GDHandle saveGDevice; */
-       Rect pictRect;
-/*     short depth; */
-/*     GDHandle theGDH; */
-       
-       GWorldFlags     errflag;
-       
-       /*  */
-       
-       if( td->bufferPort == NULL )
-               return;
-       /* Get depth */
-/*     depth = td->pixelDepth; */
-
-       /* Get GDH */
-/*     theGDH = td->theGDH; */
-       
-       /* Obtain size rectangle */
-       pictRect.top = 0;
-       pictRect.left = 0;
-       pictRect.right = td->size_wid;
-       pictRect.bottom = td->tile_hgt;
-       
-       XDDSWUnlockFrame(td);
-       
-       errflag = UpdateGWorld( &td->bufferPort, 0, &pictRect, 0, 0, 0);
-       XDDSWLockFrame(td);
-       if( errflag & gwFlagErr ){
-               //SysBeep(0);
-               return;
-       }
-       
-       /* Save GWorld */
-/*     GetGWorld(&saveGWorld, &saveGDevice); */
-
-       /* Activate */
-/*     SetGWorld(td->bufferPort, nil); */
-
-       /* Dump the pict into the GWorld */
-/*     (void)LockPixels(GetGWorldPixMap(td->bufferPort)); */
-/*     EraseRect(&td->bufferPort->portRect); */
-       
-/*     UnlockPixels(GetGWorldPixMap(td->bufferPort)); */
-
-       /* Restore GWorld */
-/*     SetGWorld(saveGWorld, saveGDevice); */
-       
-}
-#endif
-
-/*
- * Init the global "frameP"
- */
-
-static errr globe_init(void)
-{
-       OSErr err;
-       
-       GWorldPtr tempPictGWorldP;
-
-       PicHandle newPictH;
-
-       /* Use window XXX XXX XXX */
-       SetPort(data[0].w);
-
-
-       /* Get the pict resource */
-       newPictH = GetPicture(kPictID);
+       /* Get the pict resource */
+       newPictH = GetPicture(pictID);
 
        /* Analyze result */
        err = (newPictH ? 0 : -1);
@@ -1435,7 +2159,6 @@ static void Term_init_mac(term *t)
 
        /* Block */
        {
-               Rect tempRect;
                Rect globalRect;
                GDHandle mainGDH;
                GDHandle currentGDH;
@@ -1443,12 +2166,13 @@ static void Term_init_mac(term *t)
                PixMapHandle basePixMap;
 
                /* Obtain the rect */
-               tempRect = td->w->portRect;
-
-               /* Obtain the global rect */    
-               globalRect = tempRect;
+#if TARGET_API_MAC_CARBON
+               GetWindowBounds( (WindowRef)td->w, kWindowContentRgn, &globalRect );
+#else
+               globalRect = td->w->portRect;
                LocalToGlobal((Point*)&globalRect.top);
                LocalToGlobal((Point*)&globalRect.bottom);
+#endif
 
                /* Obtain the proper GDH */
                mainGDH = GetMaxDevice(&globalRect);
@@ -1474,33 +2198,42 @@ static void Term_init_mac(term *t)
 
 #endif /* ANGBAND_LITE_MAC */
 
-       /* Clip to the window */
-       ClipRect(&td->w->portRect);
+       {
+               Rect            portRect;
 
-       /* Erase the window */
-       EraseRect(&td->w->portRect);
+#if TARGET_API_MAC_CARBON
+               GetWindowBounds( (WindowRef)td->w, kWindowContentRgn, &portRect );
+               global_to_local( &portRect );
+#else
+               portRect = td->w->portRect;
+#endif
+               /* Clip to the window */
+               ClipRect(&portRect);
 
-       /* Invalidate the window */
-       InvalRect(&td->w->portRect);
+               /* Erase the window */
+               EraseRect(&portRect);
 
-       /* Display the window if needed */
-       if (td->mapped) ShowWindow(td->w);
+               /* Invalidate the window */
+#if TARGET_API_MAC_CARBON
+               InvalWindowRect((WindowRef)(td->w), (const Rect *)(&portRect));
+#else
+               InvalRect(&portRect);
+#endif
 
-       /* Hack -- set "mapped" flag */
-       t->mapped_flag = td->mapped;
+               /* Display the window if needed */
+               if (td->mapped) ShowWindow(td->w);
 
-       /* Forget color */
-       td->last = -1;
-#ifdef JP
-       XDDSWCreateGWorldFromPict( &td->bufferPort, td );
-       
-       XDDSWLockFrame( td );
+               /* Hack -- set "mapped" flag */
+               t->mapped_flag = td->mapped;
+
+               /* Forget color */
+               td->last = -1;
+       }
        /* Oops */
 /*     if (err == noErr)
        {
                
        }*/
-#endif
 }
 
 
@@ -1556,18 +2289,44 @@ static errr Term_xtra_mac_react(void)
                use_sound = arg_sound;
        }
 
+       
+       /* Handle transparency */
+       if (use_newstyle_graphics != arg_newstyle_graphics)
+       {
+               globe_nuke();
+
+               if (globe_init() != 0)
+               {
+                       plog("Cannot initialize graphics!");
+                       arg_graphics = FALSE;
+                       arg_newstyle_graphics = FALSE;
+               }
+
+               /* Apply request */
+               use_newstyle_graphics = arg_newstyle_graphics;
+
+               /* Apply and Verify */
+               term_data_check_size(td);
+
+               /* Resize the window */
+               term_data_resize(td);
+               /* Reset visuals */
+               reset_visuals();
+       }
+       
        /* Handle graphics */
-       if ((td == &data[0]) && (use_graphics != arg_graphics))
+       if (use_graphics != arg_graphics)
        {
                /* Initialize graphics */
 
                if (!use_graphics && !frameP && (globe_init() != 0))
                {
-                       #ifdef JP
+#ifdef JP
                        plog("¥°¥é¥Õ¥£¥Ã¥¯¤Î½é´ü²½¤Ï½ÐÍè¤Þ¤»¤ó¤Ç¤·¤¿.");
-                       #else
+#else
                        plog("Cannot initialize graphics!");
-                       #endif
+#endif
                        arg_graphics = FALSE;
                }
 
@@ -1622,65 +2381,9 @@ static errr Term_xtra_mac(int n, int v)
                /* Make a sound */
                case TERM_XTRA_SOUND:
                {
-                       Handle handle;
-
-                       Str255 sound;
-
-#if 0
-                       short oldResFile;
-                       short newResFile;
-
-                       /* Open the resource file */
-                       oldResFile = CurResFile();
-                       newResFile = OpenResFile(sound);
-
-                       /* Close the resource file */
-                       CloseResFile(newResFile);
-                       UseResFile(oldResFile);
-#endif
-
-                       /* Get the proper sound name */
-                       sprintf((char*)sound + 1, "%.16s.wav", angband_sound_name[v]);
-                       sound[0] = strlen((char*)sound + 1);
-
-                       /* Obtain resource XXX XXX XXX */
-#ifdef JP
-                       handle = Get1NamedResource('snd ', sound);
-                       if( handle == NULL || ext_sound )
-                               handle = GetNamedResource('snd ', sound);
-                       
-                       /* Oops */
-                       if (handle && soundmode[soundchoice[v]] == true)
-                       {
-                               /* Load and Lock */
-                               LoadResource(handle);
-                               HLock(handle);
+                       /* Play sound */
+                       play_sound(v, sound_volume);
 
-                               /* Play sound (wait for completion) */
-                               SndPlay(nil, (SndListHandle)handle, true);
-
-                               /* Unlock and release */
-                               HUnlock(handle);
-                               ReleaseResource(handle);
-                       }
-#else
-                       handle = GetNamedResource('snd ', sound);
-
-                       /* Oops */
-                       if (handle)
-                       {
-                               /* Load and Lock */
-                               LoadResource(handle);
-                               HLock(handle);
-
-                               /* Play sound (wait for completion) */
-                               SndPlay(nil, (SndListHandle)handle, true);
-
-                               /* Unlock and release */
-                               HUnlock(handle);
-                               ReleaseResource(handle);
-                       }
-#endif
                        /* Success */
                        return (0);
                }
@@ -1691,7 +2394,7 @@ static errr Term_xtra_mac(int n, int v)
                case TERM_XTRA_BORED:
                {
                        /* Process an event */
-                       (void)CheckEvents(0);
+                       (void)CheckEvents(FALSE);
 
                        /* Success */
                        return (0);
@@ -1730,11 +2433,20 @@ static errr Term_xtra_mac(int n, int v)
                /* Clear the screen */
                case TERM_XTRA_CLEAR:
                {
+                       Rect            portRect;
+                       
+#if TARGET_API_MAC_CARBON
+                       GetWindowBounds( (WindowRef)td->w, kWindowContentRgn, &portRect );
+                       global_to_local( &portRect );
+#else
+                       portRect = td->w->portRect;
+#endif
+
                        /* No clipping XXX XXX XXX */
-                       ClipRect(&td->w->portRect);
+                       ClipRect(&portRect);
 
                        /* Erase the window */
-                       EraseRect(&td->w->portRect);
+                       EraseRect(&portRect);
 
                        /* Set the color */
                        term_data_color(td, TERM_WHITE);
@@ -1746,10 +2458,10 @@ static errr Term_xtra_mac(int n, int v)
                        LineTo(td->size_wid-1, 0);
 
                        /* Clip to the new size */
-                       r.left = td->w->portRect.left + td->size_ow1;
-                       r.top = td->w->portRect.top + td->size_oh1;
-                       r.right = td->w->portRect.right - td->size_ow2;
-                       r.bottom = td->w->portRect.bottom - td->size_oh2;
+                       r.left = portRect.left + td->size_ow1;
+                       r.top = portRect.top + td->size_oh1;
+                       r.right = portRect.right - td->size_ow2;
+                       r.bottom = portRect.bottom - td->size_oh2;
                        ClipRect(&r);
 
                        /* Success */
@@ -1769,10 +2481,27 @@ static errr Term_xtra_mac(int n, int v)
                        /* If needed */
                        if (v > 0)
                        {
+#if TARGET_API_MAC_CARBON
+                               EventRecord tmp;
+                               UInt32 ticks;
+
+                               /* Convert millisecs to ticks */
+                               ticks = (v * 60L) / 1000;
+
+                               /*
+                                * Hack? - Put the programme into sleep.
+                                * No events match ~everyEvent, so nothing
+                                * should be lost in Angband's event queue.
+                                * Even if ticks are 0, it's worth calling for
+                                * the above mentioned reasons.
+                                */
+                               WaitNextEvent((EventMask)~everyEvent, &tmp, ticks, nil);
+#else
                                long m = TickCount() + (v * 60L) / 1000;
 
                                /* Wait for it */
                                while (TickCount() < m) /* loop */;
+#endif
                        }
 
                        /* Success */
@@ -1806,6 +2535,35 @@ static errr Term_curs_mac(int x, int y)
        r.right = r.left + td->tile_wid;
        r.top = y * td->tile_hgt + td->size_oh1;
        r.bottom = r.top + td->tile_hgt;
+
+       FrameRect(&r);
+
+       /* Success */
+       return (0);
+}
+
+
+/*
+ * Low level graphics (Assumes valid input).
+ * Draw a "big cursor" at (x,y), using a "yellow box".
+ * We are allowed to use "Term_grab()" to determine
+ * the current screen contents (for inverting, etc).
+ */
+static errr Term_bigcurs_mac(int x, int y)
+{
+       Rect r;
+
+       term_data *td = (term_data*)(Term->data);
+
+       /* Set the color */
+       term_data_color(td, TERM_YELLOW);
+
+       /* Frame the grid */
+       r.left = x * td->tile_wid + td->size_ow1;
+       r.right = r.left + 2 * td->tile_wid;
+       r.top = y * td->tile_hgt + td->size_oh1;
+       r.bottom = r.top + td->tile_hgt;
+
        FrameRect(&r);
 
        /* Success */
@@ -1873,37 +2631,25 @@ static errr Term_text_mac(int x, int y, int n, byte a, const char *cp)
  *
  * Erase "n" characters starting at (x,y)
  */
-static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
+static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp,
+                         const byte *tap, const char *tcp)
 {
        int i;
        Rect r2;
-       bool use_buffer = false;
        term_data *td = (term_data*)(Term->data);
        GDHandle saveGDevice;
        GWorldPtr saveGWorld;
        
-#ifdef JP
-       PixMapHandle PortPix;
-       
-#endif
-
        /* Save GWorld */
        GetGWorld(&saveGWorld, &saveGDevice);
        
-       if( n > 0 )
-       {
-               /* Destination rectangle */
-               r2.left = x * td->tile_wid + td->size_ow1;
-               r2.right = r2.left + td->tile_wid;
-               r2.top = 0;
-               r2.bottom = r2.top + td->tile_hgt;
+       r2.left = x * td->tile_wid + td->size_ow1;
+       r2.right = r2.left + td->tile_wid;
+       r2.top = y * td->tile_hgt + td->size_oh1;
+       r2.bottom = r2.top + td->tile_hgt;
        
-               /* Activate */
-               SetGWorld(td->bufferPort, nil);
-#ifdef JP
-               PortPix = GetGWorldPixMap(td->bufferPort );
-               LockPixels( PortPix );
-#endif
+       if( n > 1 )
+       {
                /* Instantiate font */
                TextFont(td->font_id);
                TextSize(td->font_size);
@@ -1912,25 +2658,14 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
                /* Restore colors */
                BackColor(blackColor);
                ForeColor(whiteColor);
-
-#ifdef JP
-               /* Erase */
-               EraseRect(&td->bufferPort->portRect);
-#endif
-
-               use_buffer = true;
        }
        else
        {
                /* Destination rectangle */
-               r2.left = x * td->tile_wid + td->size_ow1;
-               r2.right = r2.left + td->tile_wid;
+/*             r2.left = x * td->tile_wid + td->size_ow1;
                r2.top = y * td->tile_hgt + td->size_oh1;
-               r2.bottom = r2.top + td->tile_hgt;
-               
-               /* no buffering, so we use the normal current port */
+               r2.bottom = r2.top + td->tile_hgt;*/
                
-               use_buffer = false;
        }
                
        /* Scan the input */
@@ -1941,52 +2676,120 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
                byte a = ap[i];
                char c = cp[i];
 
+               /* Second byte of bigtile */
+               if (use_bigtile && a == 255)
+               {
+                       /* Advance */
+                       r2.left += td->tile_wid;
+
+                       continue;
+               }
+
+               /* Prepare right of rectangle now */
+               r2.right = r2.left + td->tile_wid;
+
 #ifdef ANGBAND_LITE_MAC
 
-               /* Nothing */
+               /* No graphics */
 
 #else /* ANGBAND_LITE_MAC */
 
                /* Graphics -- if Available and Needed */
-               if (use_graphics && ((td == &data[0]) || (td == &data[6])) &&
-                   ((byte)a & 0x80) && ((byte)c & 0x80))
+               if (use_graphics && ((byte)a & 0x80) && ((byte)c & 0x80))
                {
+#if TARGET_API_MAC_CARBON
+                       PixMapHandle    srcBitMap = GetGWorldPixMap(frameP->framePort);
+                       PixMapHandle    destBitMap;
+#else
+                       BitMapPtr srcBitMap = (BitMapPtr)(frameP->framePix);
+                       BitMapPtr destBitMap;
+#endif
+                               
                        int col, row;
                        Rect r1;
 
+                       Rect terrain_r;
+                       bool terrain_flag = FALSE;
+                       byte ta = tap[i];
+                       char tc = tcp[i];
+
+                       if ((a != ta || c != tc) &&
+                           ((byte)ta & 0x80) && ((byte)tc & 0x80))
+                       {
+                               /* Row and Col */
+                               row = ((byte)ta & 0x7F);
+                               col = ((byte)tc & 0x7F);
+
+                               /* Terrain Source rectangle */
+                               terrain_r.left = col * grafWidth;
+                               terrain_r.top = row * grafHeight;
+                               terrain_r.right = terrain_r.left + grafWidth;
+                               terrain_r.bottom = terrain_r.top + grafHeight;
+
+                               terrain_flag = TRUE;
+                       }
+
                        /* Row and Col */
                        row = ((byte)a & 0x7F);
                        col = ((byte)c & 0x7F);
                        
                        /* Source rectangle */
-                       r1.left = col * kGrafWidth;
-                       r1.top = row * kGrafHeight;
-                       r1.right = r1.left + kGrafWidth;
-                       r1.bottom = r1.top + kGrafHeight;
+                       r1.left = col * grafWidth;
+                       r1.top = row * grafHeight;
+                       r1.right = r1.left + grafWidth;
+                       r1.bottom = r1.top + grafHeight;
 
                        /* Hardwire CopyBits */
                        BackColor(whiteColor);
                        ForeColor(blackColor);
 
                        /* Draw the picture */
+#if TARGET_API_MAC_CARBON
+                       destBitMap = GetPortPixMap(GetWindowPort( td->w ));
+#else
+                       destBitMap = (BitMapPtr)&(td->w->portBits);
+#endif
+                       if (use_bigtile) r2.right += td->tile_wid;
+
+                       if (terrain_flag)
                        {
-                               BitMapPtr       srcBitMap = (BitMapPtr)(frameP->framePix);
-                               BitMapPtr       destBitMap;
-                               
-                               if( use_buffer )
-                               {
-                                       destBitMap = (BitMapPtr)(td->bufferPix);
-                               }
-                               else
-                               {
-                                       destBitMap = (BitMapPtr)&(td->w->portBits);
-                               }
-                               
-                               /* draw transparent tile */
-                               /* BackColor is ignored and the destination is left untouched */
+                               /*
+                                * Source mode const = srcCopy:
+                                *
+                                * determine how close the color of the source
+                                * pixel is to black, and assign this relative
+                                * amount of foreground color to the
+                                * destination pixel; determine how close the
+                                * color of the source pixel is to white, and
+                                * assign this relative amount of background
+                                * color to the destination pixel
+                                */
+#if TARGET_API_MAC_CARBON
+                               CopyBits( (BitMap *) *srcBitMap, (BitMap *) *destBitMap, &terrain_r, &r2, srcCopy, NULL);
+#else
+                               CopyBits( srcBitMap, destBitMap, &terrain_r, &r2, srcCopy, NULL );
+#endif
+                               /*
+                                * Draw transparent tile
+                                * BackColor is ignored and the destination is
+                                * left untouched
+                                */
                                BackColor(blackColor);
+#if TARGET_API_MAC_CARBON
+                               CopyBits( (BitMap *) *srcBitMap, (BitMap *) *destBitMap, &r1, &r2, transparent, NULL);
+#else
                                CopyBits( srcBitMap, destBitMap, &r1, &r2, transparent, NULL );
+#endif
+                       }
+                       else
+                       {
+#if TARGET_API_MAC_CARBON
+                               CopyBits( (BitMap *) *srcBitMap, (BitMap *) *destBitMap, &r1, &r2, srcCopy, NULL);
+#else
+                               CopyBits( srcBitMap, destBitMap, &r1, &r2, srcCopy, NULL );
+#endif
                        }
+
                        /* Restore colors */
                        BackColor(blackColor);
                        ForeColor(whiteColor);
@@ -2004,102 +2807,53 @@ static errr Term_pict_mac(int x, int y, int n, const byte *ap, const char *cp)
                if (!done)
                {
                        int xp, yp;
-#ifndef JP
-                       /* Erase */
-                       EraseRect(&r2);
 
                        /* Set the color */
                        term_data_color(td, (a & 0x0F));
-
-                       /* Starting pixel */
-                       xp = r2.left + td->tile_o_x;
-                       yp = r2.top + td->tile_o_y;
-
-                       /* Move to the correct location */
-                       MoveTo(xp, yp);
-                       
-                       /* Draw the character */
-                       DrawChar(c);
-#else
-                       /* Set the color */
-                       term_data_color(td, (a & 0x0F));
                        
                        /* Starting pixel */
                        xp = r2.left + td->tile_o_x;
-                       yp = td->tile_o_y;
+                       yp = r2.top + td->tile_o_y;
                        
                        /* Move to the correct location */
                        MoveTo(xp, yp);
 
-                       if(iskanji(c)){
+#ifdef JP
+                       if (iskanji(c))
+                       {
+                               /* Double width rectangle */
+                               r2.right += td->tile_wid;
+
+                               /* Erase */
+                               EraseRect(&r2);
+
                                /* Draw the character */
                                DrawText(cp, i, 2);
                                
                                i++;
                                
                                r2.left += td->tile_wid;
-                               r2.right += td->tile_wid;
-                       } else {
+                       }
+                       else
+#endif
+                       {
+                               /* Erase */
+                               EraseRect(&r2);
+
                                /* Draw the character */
                                DrawChar(c);
                        }
-#endif
                }
 
                /* Advance */
                r2.left += td->tile_wid;
-               r2.right += td->tile_wid;
        }
-       
-       if( use_buffer )
-       {
-               /* Now we blast the buffer pixmap onto the screen in the right place */
-               BitMapPtr       srcBitMap = (BitMapPtr)(td->bufferPix);
-
-               BitMapPtr       destBitMap = (BitMapPtr)&(td->w->portBits);
-
-               Rect            srcRect;
-               Rect            destRect;
                
-               
-               srcRect.left = x * td->tile_wid + td->size_ow1;
-               srcRect.top = 0;
-               srcRect.right = srcRect.left + (td->tile_wid * n);
-               srcRect.bottom = td->tile_hgt;
-               
-               destRect.left = x * td->tile_wid + td->size_ow1;
-               destRect.right = destRect.left + (td->tile_wid * n);
-               destRect.top = y * td->tile_hgt + td->size_oh1;
-               destRect.bottom = destRect.top + td->tile_hgt;
-
-#ifdef JP
-               UnlockPixels( PortPix );
-#endif
-               /* Restore GWorld */
-               SetGWorld(saveGWorld, saveGDevice);
-               
-               /* Hardwire CopyBits */
-               BackColor(whiteColor);
-               ForeColor(blackColor);
-               
-               //CopyBits( srcBitMap, destBitMap, &srcRect, &destRect, srcCopy, NULL );
-               CopyBits( (BitMapPtr)(td->bufferPix) 
-                       , &(td->w->portBits), &srcRect, &destRect, srcCopy, NULL );
-               
-               /* Restore colors */
-               BackColor(blackColor);
-               ForeColor(whiteColor);
-       }
-       
        /* Success */
        return (0);
 }
 
 
-
-
-
-
 /*
  * Create and initialize window number "i"
  */
@@ -2137,6 +2891,7 @@ static void term_data_link(int i)
        td->t->xtra_hook = Term_xtra_mac;
        td->t->wipe_hook = Term_wipe_mac;
        td->t->curs_hook = Term_curs_mac;
+       td->t->bigcurs_hook = Term_bigcurs_mac;
        td->t->text_hook = Term_text_mac;
        td->t->pict_hook = Term_pict_mac;
 
@@ -2155,6 +2910,74 @@ static void term_data_link(int i)
 
 
 
+#ifdef MACH_O_CARBON
+
+/*
+ * (Carbon, Bundle)
+ * Return a POSIX pathname of the lib directory, or NULL if it can't be
+ * located.  Caller must supply a buffer along with its size in bytes,
+ * where returned pathname will be stored.
+ * I prefer use of goto's to several nested if's, if they involve error
+ * handling.  Sorry if you are offended by their presence.  Modern
+ * languages have neater constructs for this kind of jobs -- pelpel
+ */
+static char *locate_lib(char *buf, size_t size)
+{
+       CFURLRef main_url = NULL;
+       CFStringRef main_str = NULL;
+       char *p;
+       char *res = NULL;
+
+       /* Obtain the URL of the main bundle */
+       main_url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
+
+       /* Oops */
+       if (main_url == NULL) goto ret;
+
+       /* Convert it to POSIX pathname */
+       main_str = CFURLCopyFileSystemPath(main_url, kCFURLPOSIXPathStyle);
+
+       /* Oops */
+       if (main_str == NULL) goto ret;
+
+       /* Convert it again from darn unisomething encoding to ASCII */
+       if (CFStringGetCString(main_str, buf, size, kTextEncodingUS_ASCII) == FALSE)
+               goto ret;
+
+       /* Find the last '/' in the pathname */
+       p = strrchr(buf, '/');
+
+       /* Paranoia - cannot happen */
+       if (p == NULL) goto ret;
+
+       /* Remove the trailing path */
+       *p = '\0';
+
+       /*
+        * Paranoia - bounds check, with 5 being the length of "/lib/"
+        * and 1 for terminating '\0'.
+        */
+       if (strlen(buf) + 5 + 1 > size) goto ret;
+
+       /* Append "/lib/" */
+       strcat(buf, "/lib/");
+
+       /* Set result */
+       res = buf;
+
+ret:
+
+       /* Release objects allocated and implicitly retained by the program */
+       if (main_str) CFRelease(main_str);
+       if (main_url) CFRelease(main_url);
+
+       /* pathname of the lib folder or NULL */
+       return (res);
+}
+
+
+#else /* MACH_O_CARBON */
+
 
 /*
  * Set the "current working directory" (also known as the "default"
@@ -2196,19 +3019,322 @@ static void SetupAppDir(void)
        err = HSetVol(NULL, app_vol, app_dir);
        if (err != noErr)
        {
-#ifdef JP
-               sprintf(errString, "HSetVol ¥¨¥é¡¼ #%d.\r ½ªÎ»¤·¤Þ¤¹.", err);
-#else
-               sprintf(errString, "Fatal HSetVol Error #%d.\r Exiting.", err);
-#endif
-               mac_warning(errString);
-               ExitToShell();
-       }
-}
+#ifdef JP
+               sprintf(errString, "HSetVol ¥¨¥é¡¼ #%d.\r ½ªÎ»¤·¤Þ¤¹.", err);
+#else
+               sprintf(errString, "Fatal HSetVol Error #%d.\r Exiting.", err);
+#endif
+               mac_warning(errString);
+               ExitToShell();
+       }
+}
+
+#endif
+
+
+
+#if TARGET_API_MAC_CARBON
+/*
+ * Using Core Foundation's Preferences services -- pelpel
+ *
+ * Requires OS 8.6 or greater with CarbonLib 1.1 or greater. Or OS X,
+ * of course.
+ *
+ * Without this, we can support older versions of OS 8 as well
+ * (with CarbonLib 1.0.4).
+ *
+ * Frequent allocation/deallocation of small chunks of data is
+ * far from my liking, but since this is only called at the
+ * beginning and the end of a session, I hope this hardly matters.
+ */
+
+
+/*
+ * Store "value" as the value for preferences item name
+ * pointed by key
+ */
+static void save_pref_short(const char *key, short value)
+{
+       CFStringRef cf_key;
+       CFNumberRef cf_value;
+
+       /* allocate and initialise the key */
+       cf_key = CFStringCreateWithCString(NULL, key, kTextEncodingUS_ASCII);
+
+       /* allocate and initialise the value */
+       cf_value = CFNumberCreate(NULL, kCFNumberShortType, &value);
+
+       if ((cf_key != NULL) && (cf_value != NULL))
+       {
+               /* Store the key-value pair in the applications preferences */
+               CFPreferencesSetAppValue(
+                       cf_key,
+                       cf_value,
+                       kCFPreferencesCurrentApplication);
+       }
+
+       /*
+        * Free CF data - the reverse order is a vain attempt to
+        * minimise memory fragmentation.
+        */
+       if (cf_value) CFRelease(cf_value);
+       if (cf_key) CFRelease(cf_key);
+}
+
+
+/*
+ * Load preference value for key, returns TRUE if it succeeds with
+ * vptr updated appropriately, FALSE otherwise.
+ */
+static bool query_load_pref_short(const char *key, short *vptr)
+{
+       CFStringRef cf_key;
+       CFNumberRef cf_value;
+
+       /* allocate and initialise the key */
+       cf_key = CFStringCreateWithCString(NULL, key, kTextEncodingUS_ASCII);
+
+       /* Oops */
+       if (cf_key == NULL) return (FALSE);
+
+       /* Retrieve value for the key */
+       cf_value = CFPreferencesCopyAppValue(
+               cf_key,
+               kCFPreferencesCurrentApplication);
+
+       /* Value not found */
+       if (cf_value == NULL)
+       {
+               CFRelease(cf_key);
+               return (FALSE);
+       }
+
+       /* Convert the value to short */
+       CFNumberGetValue(
+               cf_value,
+               kCFNumberShortType,
+               vptr);
+
+       /* Free CF data */
+       CFRelease(cf_value);
+       CFRelease(cf_key);
+
+       /* Success */
+       return (TRUE);
+}
+
+
+/*
+ * Update short data pointed by vptr only if preferences
+ * value for key is located.
+ */
+static void load_pref_short(const char *key, short *vptr)
+{
+       short tmp;
+
+       if (query_load_pref_short(key, &tmp)) *vptr = tmp;
+       return;
+}
+
+
+/*
+ * Save preferences to preferences file for current host+current user+
+ * current application.
+ */
+static void cf_save_prefs()
+{
+       int i;
+
+       /* Version stamp */
+       save_pref_short("version.major", FAKE_VERSION);
+       save_pref_short("version.minor", FAKE_VER_MAJOR);
+       save_pref_short("version.patch", FAKE_VER_MINOR);
+       save_pref_short("version.extra", FAKE_VER_PATCH);
+
+       /* Gfx settings */
+       save_pref_short("arg.arg_sound", arg_sound);
+       save_pref_short("arg.arg_graphics", arg_graphics);
+       save_pref_short("arg.arg_newstyle_graphics", arg_newstyle_graphics);
+       save_pref_short("arg.arg_bigtile", arg_bigtile);
+
+#ifndef MACH_O_CARBON
+
+       /* SoundMode */
+       for( i = 0 ; i < 7 ; i++ )
+               save_pref_short(format("sound%d.on", i), soundmode[i]);
+
+#endif /* MACH_O_CARBON */
+       
+       /* Windows */
+       for (i = 0; i < MAX_TERM_DATA; i++)
+       {
+               term_data *td = &data[i];
+
+               save_pref_short(format("term%d.mapped", i), td->mapped);
+
+               save_pref_short(format("term%d.font_id", i), td->font_id);
+               save_pref_short(format("term%d.font_size", i), td->font_size);
+               save_pref_short(format("term%d.font_face", i), td->font_face);
+
+               save_pref_short(format("term%d.tile_wid", i), td->tile_wid);
+               save_pref_short(format("term%d.tile_hgt", i), td->tile_hgt);
+
+               save_pref_short(format("term%d.cols", i), td->cols);
+               save_pref_short(format("term%d.rows", i), td->rows);
+               save_pref_short(format("term%d.left", i), td->r.left);
+               save_pref_short(format("term%d.top", i), td->r.top);
+       }
+
+       /*
+        * Make sure preferences are persistent
+        */
+       CFPreferencesAppSynchronize(
+               kCFPreferencesCurrentApplication);
+}
+
+
+/*
+ * Load preferences from preferences file for current host+current user+
+ * current application.
+ */
+static void cf_load_prefs()
+{
+       bool ok;
+       short pref_major, pref_minor, pref_patch, pref_extra;
+       int i;
+
+       MenuHandle m;
+
+       /* Assume nothing is wrong, yet */
+       ok = TRUE;
+
+       /* Load version information */
+       ok &= query_load_pref_short("version.major", &pref_major);
+       ok &= query_load_pref_short("version.minor", &pref_minor);
+       ok &= query_load_pref_short("version.patch", &pref_patch);
+       ok &= query_load_pref_short("version.extra", &pref_extra);
+
+       /* Any of the above failed */
+       if (!ok)
+       {
+               /* This may be the first run */
+#ifdef JP
+               mac_warning("½é´üÀßÄê¥Õ¥¡¥¤¥ë¤¬¸«¤Ä¤«¤ê¤Þ¤»¤ó¡£");
+#else
+               mac_warning("Preferences are not found.");
+#endif
+
+               /* Ignore the rest */
+               return;
+       }
+
+#if 0
+
+       /* Check version */
+       if ((pref_major != PREF_VER_MAJOR) ||
+               (pref_minor != PREF_VER_MINOR) ||
+               (pref_patch != PREF_VER_PATCH) ||
+               (pref_extra != PREF_VER_EXTRA))
+       {
+               /* Message */
+               mac_warning(
+                       format("Ignoring %d.%d.%d.%d preferences.",
+                               pref_major, pref_minor, pref_patch, pref_extra));
+
+               /* Ignore */
+               return;
+       }
+
+#endif
+
+       /* Gfx settings */
+       {
+               short pref_tmp;
+
+               /* sound */
+               if (query_load_pref_short("arg.arg_sound", &pref_tmp))
+                       arg_sound = pref_tmp;
+
+               /* graphics */
+               if (query_load_pref_short("arg.arg_graphics", &pref_tmp))
+                       arg_graphics = pref_tmp;
+
+               /*newstyle graphics*/
+               if (query_load_pref_short("arg.arg_newstyle_graphics", &pref_tmp))
+               {
+                       use_newstyle_graphics = pref_tmp;
+               }
+
+               if (use_newstyle_graphics == true)
+               {
+                       ANGBAND_GRAF = "new";
+                       arg_newstyle_graphics = true;
+                       grafWidth = grafHeight = 16;
+                       pictID = 1002;
+               }
+               else
+               {
+                       ANGBAND_GRAF = "old";
+                       arg_newstyle_graphics = false;
+                       grafWidth = grafHeight = 8;
+                       pictID = 1001;
+               }
+
+               /* double-width tiles */
+               if (query_load_pref_short("arg.arg_bigtile", &pref_tmp))
+               {
+                       use_bigtile = pref_tmp;
+               }
+
+       }
+
+#ifndef MACH_O_CARBON
+
+       /* SoundMode */
+       for( i = 0 ; i < 7 ; i++ )
+       {
+               query_load_pref_short(format("sound%d.on", i), &soundmode[i]);
+       }
+
+#endif /* MACH_O_CARBON */
+
+       /* Special menu */
+       m = GetMenuHandle(134);
+
+       /* Item "arg_sound" */
+       CheckMenuItem(m, 1, arg_sound);
+
+       /* Item "arg_graphics" */
+       CheckMenuItem(m, 2, arg_graphics);
+       
+       /* Item "arg_newstyle_graphics"*/
+       CheckMenuItem(m, 8, arg_newstyle_graphics);
+
+       /* Item "arg_bigtile"*/
+       CheckMenuItem(m, 9, arg_bigtile);
+
+       /* Windows */
+       for (i = 0; i < MAX_TERM_DATA; i++)
+       {
+               term_data *td = &data[i];
 
+               load_pref_short(format("term%d.mapped", i), &td->mapped);
 
+               load_pref_short(format("term%d.font_id", i), &td->font_id);
+               load_pref_short(format("term%d.font_size", i), &td->font_size);
+               load_pref_short(format("term%d.font_face", i), &td->font_face);
 
+               load_pref_short(format("term%d.tile_wid", i), &td->tile_wid);
+               load_pref_short(format("term%d.tile_hgt", i), &td->tile_hgt);
+
+               load_pref_short(format("term%d.cols", i), &td->cols);
+               load_pref_short(format("term%d.rows", i), &td->rows);
+               load_pref_short(format("term%d.left", i), &td->r.left);
+               load_pref_short(format("term%d.top", i), &td->r.top);
+       }
+}
 
+#else
 /*
  * Global "preference" file pointer
  */
@@ -2221,7 +3347,7 @@ static int getshort(void)
 {
        int x = 0;
        char buf[256];
-       if (0 == my_fgets(fff, buf, 256)) x = atoi(buf);
+       if (0 == my_fgets(fff, buf, sizeof(buf))) x = atoi(buf);
        return (x);
 }
 
@@ -2247,13 +3373,15 @@ static void save_prefs(void)
 
        /*** The current version ***/
 
-       putshort(VERSION_MAJOR);
-       putshort(VERSION_MINOR);
-       putshort(VERSION_PATCH);
-       putshort(VERSION_EXTRA);
+       putshort(FAKE_VERSION);
+       putshort(FAKE_VER_MAJOR);
+       putshort(FAKE_VER_MINOR);
+       putshort(FAKE_VER_PATCH);
 
        putshort(arg_sound);
        putshort(arg_graphics);
+       putshort(arg_newstyle_graphics);
+       putshort(arg_bigtile);
        
        /* SoundMode */
        for( i = 0 ; i < 7 ; i++ )
@@ -2271,10 +3399,8 @@ static void save_prefs(void)
                putshort(td->font_size);
                putshort(td->font_face);
 
-#ifdef JP
                putshort(td->tile_wid);
                putshort(td->tile_hgt);
-#endif
 
                putshort(td->cols);
                putshort(td->rows);
@@ -2295,7 +3421,7 @@ static void load_prefs(void)
 {
        int i;
 
-       int old_major, old_minor, old_patch, old_extra;
+       int old_version, old_major, old_minor, old_patch;
 
        term_data *td;
        MenuHandle m;
@@ -2303,16 +3429,16 @@ static void load_prefs(void)
        /*** Version information ***/
 
        /* Preferences version */
+       old_version = getshort();
        old_major = getshort();
        old_minor = getshort();
        old_patch = getshort();
-       old_extra = getshort();
 
        /* Hack -- Verify or ignore */
-       if ((old_major != VERSION_MAJOR) ||
-           (old_minor != VERSION_MINOR) ||
-           (old_patch != VERSION_PATCH) ||
-           (old_extra != VERSION_EXTRA))
+       if ((old_version != FAKE_VERSION) ||
+           (old_major != FAKE_VER_MAJOR) ||
+           (old_minor != FAKE_VER_MINOR) ||
+           (old_patch != FAKE_VER_PATCH))
        {
                /* Message */
                #ifdef JP
@@ -2326,19 +3452,45 @@ static void load_prefs(void)
 
        arg_sound = getshort();
        arg_graphics = getshort();
+       arg_newstyle_graphics = getshort();
+       use_newstyle_graphics = arg_newstyle_graphics;
+       
+       if (use_newstyle_graphics == true)
+       {
+               ANGBAND_GRAF = "new";
+               arg_newstyle_graphics = true;
+               grafWidth = grafHeight = 16;
+               pictID = 1002;
+       }
+       else
+       {
+               ANGBAND_GRAF = "old";
+               arg_newstyle_graphics = false;
+               grafWidth = grafHeight = 8;
+               pictID = 1001;
+       }
+
+       arg_bigtile = getshort();
+       use_bigtile = arg_bigtile;
        
        /* SoundMode */
        for( i = 0 ; i < 7 ; i++ )
                soundmode[i] = getshort();
        
        /* Special menu */
-       m = GetMenuHandle(134); //m = GetMHandle(134);
-       
+       m = GetMenuHandle(134);
+
        /* Item "arg_sound" */
        CheckItem(m, 1, arg_sound);
 
        /* Item "arg_graphics" */
        CheckItem(m, 2, arg_graphics);
+       
+       /* Item "arg_newstyle_graphics"*/
+       CheckItem(m, 8, arg_newstyle_graphics);
+
+       /* Item "arg_bigtile"*/
+       CheckItem(m, 9, arg_bigtile);
 
        /* Windows */
        for (i = 0; i < MAX_TERM_DATA; i++)
@@ -2352,10 +3504,8 @@ static void load_prefs(void)
                td->font_size = getshort();
                td->font_face = getshort();
 
-#ifdef JP
                td->tile_wid = getshort();
                td->tile_hgt = getshort();
-#endif
 
                td->cols = getshort();
                td->rows = getshort();
@@ -2367,7 +3517,7 @@ static void load_prefs(void)
                if (feof(fff)) break;
        }
 }
-
+#endif /* TARGET_API_MAC_CARBON */
 
 
 
@@ -2378,13 +3528,25 @@ static void term_data_hack(term_data *td)
 {
        short fid;
 
-       #ifdef JP
-       GetFNum( "\pÅùÉýÌÀÄ«", &fid);     /* ¥Õ¥©¥ó¥È̾¤«¤éIDÈÖ¹æ¤òÄ´¤Ù¤ë  */
+#if TARGET_API_MAC_CARBON
+#ifdef JP
+       /* Default to Osaka font (Japanese) */
+       fid = FMGetFontFamilyFromName( "\pOsaka¡ÝÅùÉý" );
+#else
+       /* Default to Monaco font */
+       fid = FMGetFontFamilyFromName("\pmonaco");
+#endif
+#else
+#ifdef JP
+       /* Default to ÅùÉýÌÀÄ« font (Japanese) */
+       GetFNum( "\pÅùÉýÌÀÄ«", &fid);
        SetFScaleDisable( true );
-       #else
+#else
        /* Default to Monaco font */
        GetFNum("\pmonaco", &fid);
-       #endif
+#endif
+#endif
+
        /* Wipe it */
        WIPE(td, term_data);
 
@@ -2434,12 +3596,16 @@ static void init_windows(void)
 
        term_data *td;
 
+#if !TARGET_API_MAC_CARBON
+
        SysEnvRec env;
        short savev;
        long saved;
 
        bool oops;
 
+#endif /* !TARGET_API_MAC_CARBON */
+
 
        /*** Default values ***/
 
@@ -2481,7 +3647,10 @@ static void init_windows(void)
 
 
        /*** Load preferences ***/
-
+       
+#if TARGET_API_MAC_CARBON
+       cf_load_prefs();
+#else
        /* Assume failure */
        oops = TRUE;
 
@@ -2500,7 +3669,7 @@ static void init_windows(void)
 
                /* Find the folder */
                err = FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
-                                &vref, &dirID);
+                                &vref, &dirID);
 
                /* Success */
                if (!err)
@@ -2550,6 +3719,7 @@ static void init_windows(void)
                /* Close the file */
                my_fclose(fff);
        }
+#endif /* TARGET_API_MAC_CARBON */
 
 
        /*** Instantiate ***/
@@ -2576,11 +3746,12 @@ static void init_windows(void)
        Term_activate(td->t);
 }
 
-#ifdef JP
+#ifndef MACH_O_CARBON
+
 static void init_sound( void )
 {
        int err, i;
-       DirInfo pb;
+       CInfoPBRec pb;
        SignedByte              permission = fsRdPerm;
        pascal short    ret;
        
@@ -2588,45 +3759,45 @@ static void init_sound( void )
        Str255 sound;
 
        /* Descend into "lib" folder */
-       pb.ioCompletion = NULL;
-       pb.ioNamePtr = "\plib";
-       pb.ioVRefNum = app_vol;
-       pb.ioDrDirID = app_dir;
-       pb.ioFDirIndex = 0;
+       pb.dirInfo.ioCompletion = NULL;
+       pb.dirInfo.ioNamePtr = "\plib";
+       pb.dirInfo.ioVRefNum = app_vol;
+       pb.dirInfo.ioDrDirID = app_dir;
+       pb.dirInfo.ioFDirIndex = 0;
 
        /* Check for errors */
        err = PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
 
        /* Success */
-       if ((err == noErr) && (pb.ioFlAttrib & 0x10))
+       if ((err == noErr) && (pb.dirInfo.ioFlAttrib & 0x10))
        {
                /* Descend into "lib/save" folder */
-               pb.ioCompletion = NULL;
-               pb.ioNamePtr = "\pxtra";
-               pb.ioVRefNum = app_vol;
-               pb.ioDrDirID = pb.ioDrDirID;
-               pb.ioFDirIndex = 0;
+               pb.dirInfo.ioCompletion = NULL;
+               pb.dirInfo.ioNamePtr = "\pxtra";
+               pb.dirInfo.ioVRefNum = app_vol;
+               pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrDirID;
+               pb.dirInfo.ioFDirIndex = 0;
 
                /* Check for errors */
                err = PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
                        
                        /* Success */
-               if ((err == noErr) && (pb.ioFlAttrib & 0x10))
+               if ((err == noErr) && (pb.dirInfo.ioFlAttrib & 0x10))
                {
                        /* Descend into "lib/save" folder */
-                       pb.ioCompletion = NULL;
-                       pb.ioNamePtr = "\psound";
-                       pb.ioVRefNum = app_vol;
-                       pb.ioDrDirID = pb.ioDrDirID;
-                       pb.ioFDirIndex = 0;
+                       pb.dirInfo.ioCompletion = NULL;
+                       pb.dirInfo.ioNamePtr = "\psound";
+                       pb.dirInfo.ioVRefNum = app_vol;
+                       pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrDirID;
+                       pb.dirInfo.ioFDirIndex = 0;
 
                        /* Check for errors */
                        err = PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
 
                        /* Success */
-                       if ((err == noErr) && (pb.ioFlAttrib & 0x10))
+                       if ((err == noErr) && (pb.dirInfo.ioFlAttrib & 0x10))
                        {
-                               ret = HOpenResFile( app_vol , pb.ioDrDirID , "\psound.rsrc" , permission );
+                               ret = HOpenResFile( app_vol , pb.dirInfo.ioDrDirID , "\psound.rsrc" , permission );
                                if( ret != -1 ){
                                        ext_sound = 1;
                                        
@@ -2653,6 +3824,72 @@ static void init_sound( void )
        }
 }
 
+static void init_graf( void )
+{
+       int err, i;
+       CInfoPBRec pb;
+       SignedByte              permission = fsRdPerm;
+       pascal short    ret;
+       
+       Handle handle;
+       Str255 graf;
+
+       /* Descend into "lib" folder */
+       pb.dirInfo.ioCompletion = NULL;
+       pb.dirInfo.ioNamePtr = "\plib";
+       pb.dirInfo.ioVRefNum = app_vol;
+       pb.dirInfo.ioDrDirID = app_dir;
+       pb.dirInfo.ioFDirIndex = 0;
+
+       /* Check for errors */
+       err = PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
+
+       /* Success */
+       if ((err == noErr) && (pb.dirInfo.ioFlAttrib & 0x10))
+       {
+               /* Descend into "lib/xtra" folder */
+               pb.dirInfo.ioCompletion = NULL;
+               pb.dirInfo.ioNamePtr = "\pxtra";
+               pb.dirInfo.ioVRefNum = app_vol;
+               pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrDirID;
+               pb.dirInfo.ioFDirIndex = 0;
+
+               /* Check for errors */
+               err = PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
+                       
+               /* Success */
+               if ((err == noErr) && (pb.dirInfo.ioFlAttrib & 0x10))
+               {
+                       /* Descend into "lib/xtra/graf" folder */
+                       pb.dirInfo.ioCompletion = NULL;
+                       pb.dirInfo.ioNamePtr = "\pgraf";
+                       pb.dirInfo.ioVRefNum = app_vol;
+                       pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrDirID;
+                       pb.dirInfo.ioFDirIndex = 0;
+
+                       /* Check for errors */
+                       err = PBGetCatInfo((CInfoPBPtr)&pb, FALSE);
+
+                       /* Success */
+                       if ((err == noErr) && (pb.dirInfo.ioFlAttrib & 0x10))
+                       {
+                               ret = HOpenResFile( app_vol , pb.dirInfo.ioDrDirID , "\pgraf.rsrc" , permission );
+                               if (ret != -1)
+                               {
+                                       ext_graf = 1;
+
+                                       /* Obtain resource XXX XXX XXX */
+                                       handle = Get1NamedResource('PICT', graf);
+                                       if ( handle == NULL || ext_graf )
+                                               handle = GetNamedResource('PICT', "\pgraf.rsrc");
+                               }
+                       }
+               }
+       }
+}
+
+#endif /* MACH_O_CARBON */
+
 #ifdef CHUUKEI
 /*
 
@@ -2663,7 +3900,7 @@ static void init_chuukei( void )
        char tmp[1024];
        FILE *fp;
        
-       path_build(path, 1024, ANGBAND_DIR_XTRA, "chuukei.txt");
+       path_build(path, sizeof(path), ANGBAND_DIR_XTRA, "chuukei.txt");
 
        fp = fopen(path, "r");
        if(!fp)
@@ -2755,7 +3992,6 @@ short GetCheck( DialogPtr targetDlg, short check )
 void SoundConfigDLog(void)
 {
        DialogPtr dialog;
-       Rect r;
        short item_hit;
        int     i;
 
@@ -2765,7 +4001,7 @@ void SoundConfigDLog(void)
        for( i = 1 ; i < 7 ; i++ )
                SetCheck( dialog, i+2 , soundmode[i] );
        
-       ShowWindow(dialog);
+       /* ShowWindow(dialog); */ 
        for( item_hit = 100 ; cancel < item_hit ; ){
                ModalDialog(0, &item_hit);
                
@@ -2784,11 +4020,16 @@ void SoundConfigDLog(void)
 
 }
 
-#endif
 
 /*
  * Exit the program
  */
+#if TARGET_API_MAC_CARBON
+static void save_pref_file(void)
+{
+       cf_save_prefs();
+}
+#else
 static void save_pref_file(void)
 {
        bool oops;
@@ -2820,7 +4061,7 @@ static void save_pref_file(void)
 
                /* Find the folder */
                err = FindFolder(kOnSystemDisk, kPreferencesFolderType, kCreateFolder,
-                                &vref, &dirID);
+                                &vref, &dirID);
 
                /* Success */
                if (!err)
@@ -2873,8 +4114,11 @@ static void save_pref_file(void)
                my_fclose(fff);
        }
 }
+#endif
+
 
 
+#if defined(__MWERKS__)
 
 /*
  * A simple "Yes/No" filter to parse "key press" events in dialog windows
@@ -2904,7 +4148,7 @@ static pascal Boolean ynfilter(DialogPtr dialog, EventRecord *event, short *ip)
                        Rect r;
 
                        /* Get the button */
-                       GetDialogItem(dialog, i, &type, (Handle*)&control, &r); //GetDItem(dialog, i, &type, (Handle*)&control, &r);
+                       GetDialogItem(dialog, i, &type, (Handle*)&control, &r);
 
                        /* Blink button for 1/10 second */
                        HiliteControl(control, 1);
@@ -2921,6 +4165,139 @@ static pascal Boolean ynfilter(DialogPtr dialog, EventRecord *event, short *ip)
        return (0);
 }
 
+#endif /* __MWERKS__ */
+
+
+#if TARGET_API_MAC_CARBON
+
+/*
+ * Prepare savefile dialogue and set the variable
+ * savefile accordingly. Returns true if it succeeds, false (or
+ * aborts) otherwise. If all is false, only allow files whose type
+ * is 'SAVE'.
+ * Originally written by Peter Ammon
+ */
+static bool select_savefile(bool all)
+{
+       OSErr err;
+       FSSpec theFolderSpec;
+       FSSpec savedGameSpec;
+       NavDialogOptions dialogOptions;
+       NavReplyRecord reply;
+       /* Used only when 'all' is true */
+       NavTypeList types = {ANGBAND_CREATOR, 1, 1, {'SAVE'}};
+       NavTypeListHandle myTypeList;
+       AEDesc defaultLocation;
+
+#ifdef MACH_O_CARBON
+
+       /* Find the save folder */
+       err = path_to_spec(ANGBAND_DIR_SAVE, &theFolderSpec);
+
+#else
+
+       /* Find :lib:save: folder */
+       err = FSMakeFSSpec(app_vol, app_dir, "\p:lib:save:", &theFolderSpec);
+
+#endif
+
+       /* Oops */
+       if (err != noErr) quit("Unable to find the folder :lib:save:");
+
+       /* Get default Navigator dialog options */
+       err = NavGetDefaultDialogOptions(&dialogOptions);
+
+       /* Clear preview option */
+       dialogOptions.dialogOptionFlags &= ~kNavAllowPreviews;
+
+       /* Disable multiple file selection */
+       dialogOptions.dialogOptionFlags &= ~kNavAllowMultipleFiles;
+
+       /* Make descriptor for default location */
+       err = AECreateDesc(typeFSS, &theFolderSpec, sizeof(FSSpec),
+               &defaultLocation);
+
+       /* Oops */
+       if (err != noErr) quit("Unable to allocate descriptor");
+
+       /* We are indifferent to signature and file types */
+       if (all)
+       {
+               myTypeList = (NavTypeListHandle)nil;
+       }
+
+       /* Set up type handle */
+       else
+       {
+               err = PtrToHand(&types, (Handle *)&myTypeList, sizeof(NavTypeList));
+
+               /* Oops */
+               if (err != noErr) quit("Error in PtrToHand. Try enlarging heap");
+
+       }
+
+       /* Call NavGetFile() with the types list */
+       err = NavChooseFile(&defaultLocation, &reply, &dialogOptions, NULL,
+               NULL, NULL, myTypeList, NULL);
+
+       /* Free type list */
+       if (!all) DisposeHandle((Handle)myTypeList);
+
+       /* Error */
+       if (err != noErr)
+       {
+               /* Nothing */
+       }
+
+       /* Invalid response -- allow the user to cancel */
+       else if (!reply.validRecord)
+       {
+               /* Hack -- Fake error */
+               err = -1;
+       }
+
+       /* Retrieve FSSpec from the reply */
+       else
+       {
+               AEKeyword theKeyword;
+               DescType actualType;
+               Size actualSize;
+
+               /* Get a pointer to selected file */
+               (void)AEGetNthPtr(&reply.selection, 1, typeFSS, &theKeyword,
+                       &actualType, &savedGameSpec, sizeof(FSSpec), &actualSize);
+
+               /* Dispose NavReplyRecord, resources and descriptors */
+               (void)NavDisposeReply(&reply);
+       }
+
+       /* Dispose location info */
+       AEDisposeDesc(&defaultLocation);
+
+       /* Error */
+       if (err != noErr) return (FALSE);
+
+#ifdef MACH_O_CARBON
+
+       /* Convert FSSpec to pathname and store it in variable savefile */
+       (void)spec_to_path(&savedGameSpec, savefile, sizeof(savefile));
+
+#else
+
+       /* Convert FSSpec to pathname and store it in variable savefile */
+       refnum_to_name(
+               savefile,
+               savedGameSpec.parID,
+               savedGameSpec.vRefNum,
+               (char *)savedGameSpec.name);
+
+#endif
+
+       /* Success */
+       return (TRUE);
+}
+#endif
+
 
 /*
  * Handle menu: "File" + "New"
@@ -2947,6 +4324,28 @@ static void do_menu_file_new(void)
 /*
  * Handle menu: "File" + "Open"
  */
+#if TARGET_API_MAC_CARBON
+static void do_menu_file_open(bool all)
+{
+       /* Let the player to choose savefile */
+       if (!select_savefile(all)) return;
+
+       /* Hack */
+       HiliteMenu(0);
+
+       /* Game is in progress */
+       game_in_progress = TRUE;
+
+       /* Flush input */
+       flush();
+
+       /* Play a game */
+       play_game(FALSE);
+
+       /* Hack -- quit */
+       quit(NULL);
+}
+#else
 static void do_menu_file_open(bool all)
 {
        int err;
@@ -3041,6 +4440,7 @@ static void do_menu_file_open(bool all)
        /* Hack -- quit */
        quit(NULL);
 }
+#endif
 
 
 /*
@@ -3100,7 +4500,8 @@ static void init_menubar(void)
        WindowPtr tmpw;
 
        MenuHandle m;
-
+       OSErr           err;
+       long            response;
 
        /* Get the "apple" menu */
        m = GetMenu(128);
@@ -3109,11 +4510,22 @@ static void init_menubar(void)
        InsertMenu(m, 0);
 
        /* Add the DA's to the "apple" menu */
-       AppendResMenu   (m, 'DRVR');    //AddResMenu(m, 'DRVR');
-
+#if TARGET_API_MAC_CARBON
+#else
+       AppendResMenu   (m, 'DRVR');
+#endif
 
        /* Get the "File" menu */
+#if TARGET_API_MAC_CARBON
+       m = GetMenu(129);
+       err = Gestalt( gestaltSystemVersion, &response );
+       if ( (err == noErr) && (response >= 0x00000A00) )
+       {
+               DeleteMenuItem( m, 7 );
+       }
+#else
        m = GetMenu(129);
+#endif
 
        /* Insert the menu */
        InsertMenu(m, 0);
@@ -3152,7 +4564,11 @@ static void init_menubar(void)
        tmpw = NewWindow(0, &r, "\p", false, documentProc, 0, 0, 0);
 
        /* Activate the "fake" window */
+#if TARGET_API_MAC_CARBON
+       SetPortWindowPort(tmpw);
+#else
        SetPort(tmpw);
+#endif
 
        /* Default mode */
        TextMode(0);
@@ -3161,10 +4577,14 @@ static void init_menubar(void)
        TextSize(12);
 
        /* Add the fonts to the menu */
-       AppendResMenu(m, 'FONT');       //AddResMenu(m, 'FONT');
+       AppendResMenu(m, 'FONT');
 
        /* Size of menu */
+#if TARGET_API_MAC_CARBON
+       n = CountMenuItems(m);
+#else
        n = CountMItems(m);
+#endif
 
        /* Scan the menu */
        for (i = n; i >= 4; i--)
@@ -3173,11 +4593,14 @@ static void init_menubar(void)
                short fontNum;
 
                /* Acquire the font name */
-               /* GetMenuItemText(m, i, tmpName); */
-               GetMenuItemText(m, i, tmpName); //GetItem(m, i, tmpName);
+               GetMenuItemText(m, i, tmpName);
 
                /* Acquire the font index */
+#if TARGET_API_MAC_CARBON
+               fontNum = FMGetFontFamilyFromName( tmpName );
+#else
                GetFNum(tmpName, &fontNum);
+#endif
 
                /* Apply the font index */
                TextFont(fontNum);
@@ -3186,8 +4609,7 @@ static void init_menubar(void)
                if ((CharWidth('i') != CharWidth('W')) || (CharWidth('W') == 0))
                {
                        /* Delete the menu item XXX XXX XXX */
-                       /* DeleteMenuItem(m, i); */
-                       DeleteMenuItem  (m, i); //DelMenuItem(m, i);
+                       DeleteMenuItem  (m, i);
                }
        }
 
@@ -3198,7 +4620,7 @@ static void init_menubar(void)
        AppendMenu(m, "\p-");
 
        /* Add the fonts to the menu */
-       AppendResMenu   (m, 'FONT');    //AddResMenu(m, 'FONT');
+       AppendResMenu   (m, 'FONT');
 
 
        /* Make the "Size" menu */
@@ -3271,12 +4693,18 @@ static void init_menubar(void)
        AppendMenu(m, "\parg_wizard");
        AppendMenu(m, "\p-");
        AppendMenu(m, "\p¥µ¥¦¥ó¥ÉÀßÄê...");
+       AppendMenu(m, "\p16X16¥°¥é¥Õ¥£¥Ã¥¯");
+       AppendMenu(m, "\p£²ÇÜÉý¥¿¥¤¥ëɽ¼¨");
        #else
        AppendMenu(m, "\parg_sound");
        AppendMenu(m, "\parg_graphics");
        AppendMenu(m, "\p-");
        AppendMenu(m, "\parg_fiddle");
        AppendMenu(m, "\parg_wizard");
+       AppendMenu(m, "\p-");
+       AppendMenu(m, "\pSound config");
+       AppendMenu(m, "\pAdam Bolt tile");
+       AppendMenu(m, "\pBigtile Mode");
        #endif
 
        /* Make the "TileWidth" menu */
@@ -3360,84 +4788,136 @@ static void setup_menus(void)
 
 
        /* File menu */
-       m = GetMenuHandle(129); //m = GetMHandle(129);
+       m = GetMenuHandle(129);
 
        /* Get menu size */
+#if TARGET_API_MAC_CARBON
+       n = CountMenuItems(m);
+#else
        n = CountMItems(m);
+#endif
 
        /* Reset menu */
        for (i = 1; i <= n; i++)
        {
                /* Reset */
+#if TARGET_API_MAC_CARBON
+               DisableMenuItem(m, i);
+               CheckMenuItem(m, i, FALSE);
+#else
                DisableItem(m, i);
                CheckItem(m, i, FALSE);
+#endif
        }
 
        /* Enable "new"/"open..."/"import..." */
        if (initialized && !game_in_progress)
        {
+#if TARGET_API_MAC_CARBON
+               EnableMenuItem(m, 1);
+               EnableMenuItem(m, 2);
+               EnableMenuItem(m, 3);
+#else
                EnableItem(m, 1);
                EnableItem(m, 2);
                EnableItem(m, 3);
+#endif
        }
 
        /* Enable "close" */
        if (initialized)
        {
+#if TARGET_API_MAC_CARBON
+               EnableMenuItem(m, 4);
+#else
                EnableItem(m, 4);
+#endif
        }
 
        /* Enable "save" */
        if (initialized && character_generated)
        {
+#if TARGET_API_MAC_CARBON
+               EnableMenuItem(m, 5);
+#else
                EnableItem(m, 5);
+#endif
        }
 
        /* Enable "quit" */
        if (TRUE)
        {
+#if TARGET_API_MAC_CARBON
+               EnableMenuItem(m, 7);
+#else
                EnableItem(m, 7);
-/*             EnableItem(m, 8); */
+#endif
        }
 
 
        /* Edit menu */
-       m = GetMenuHandle(130); //m = GetMHandle(130);
+       m = GetMenuHandle(130);
 
        /* Get menu size */
+#if TARGET_API_MAC_CARBON
+       n = CountMenuItems(m);
+#else
        n = CountMItems(m);
+#endif
 
        /* Reset menu */
        for (i = 1; i <= n; i++)
        {
                /* Reset */
+#if TARGET_API_MAC_CARBON
+               DisableMenuItem(m, i);
+               CheckMenuItem(m, i, FALSE);
+#else
                DisableItem(m, i);
                CheckItem(m, i, FALSE);
+#endif
        }
 
        /* Enable "edit" options if "needed" */
        if (!td)
        {
+#if TARGET_API_MAC_CARBON
+               EnableMenuItem(m, 1);
+               EnableMenuItem(m, 3);
+               EnableMenuItem(m, 4);
+               EnableMenuItem(m, 5);
+               EnableMenuItem(m, 6);
+#else
                EnableItem(m, 1);
                EnableItem(m, 3);
                EnableItem(m, 4);
                EnableItem(m, 5);
                EnableItem(m, 6);
+#endif
        }
 
 
        /* Font menu */
-       m = GetMenuHandle(131); //m = GetMHandle(131);
+       m = GetMenuHandle(131);
 
        /* Get menu size */
+#if TARGET_API_MAC_CARBON
+       n = CountMenuItems(m);
+#else
        n = CountMItems(m);
+#endif
 
        /* Reset menu */
        for (i = 1; i <= n; i++)
        {
                /* Reset */
+#if TARGET_API_MAC_CARBON
+               DisableMenuItem(m, i);
+               CheckMenuItem(m, i, FALSE);
+#else
                DisableItem(m, i);
                CheckItem(m, i, FALSE);
+#endif
        }
 
        /* Hack -- look cute XXX XXX */
@@ -3449,6 +4929,33 @@ static void setup_menus(void)
        /* Active window */
        if (td)
        {
+#if TARGET_API_MAC_CARBON
+               /* Enable "bold" */
+               EnableMenuItem(m, 1);
+
+               /* Enable "extend" */
+               EnableMenuItem(m, 2);
+
+               /* Check the appropriate "bold-ness" */
+               if (td->font_face & bold) CheckMenuItem(m, 1, TRUE);
+
+               /* Check the appropriate "wide-ness" */
+               if (td->font_face & extend) CheckMenuItem(m, 2, TRUE);
+
+               /* Analyze fonts */
+               for (i = 4; i <= n; i++)
+               {
+                       /* Enable it */
+                       EnableMenuItem(m, i);
+
+                       /* Analyze font */
+                       GetMenuItemText(m, i, s);
+                       GetFNum(s, &value);
+
+                       /* Check active font */
+                       if (td->font_id == value) CheckMenuItem(m, i, TRUE);
+               }
+#else
                /* Enable "bold" */
                EnableItem(m, 1);
 
@@ -3468,28 +4975,37 @@ static void setup_menus(void)
                        EnableItem(m, i);
 
                        /* Analyze font */
-                       /* GetMenuItemText(m,i,s); */
-                       GetMenuItemText(m, i, s);       //GetItem(m, i, s);
+                       GetMenuItemText(m, i, s);
                        GetFNum(s, &value);
 
                        /* Check active font */
                        if (td->font_id == value) CheckItem(m, i, TRUE);
                }
+#endif
        }
 
 
        /* Size menu */
-       m = GetMenuHandle(132); //m = GetMHandle(132);
+       m = GetMenuHandle(132);
 
        /* Get menu size */
+#if TARGET_API_MAC_CARBON
+       n = CountMenuItems(m);
+#else
        n = CountMItems(m);
+#endif
 
        /* Reset menu */
        for (i = 1; i <= n; i++)
        {
                /* Reset */
+#if TARGET_API_MAC_CARBON
+               DisableMenuItem(m, i);
+               CheckMenuItem(m, i, FALSE);
+#else
                DisableItem(m, i);
                CheckItem(m, i, FALSE);
+#endif
        }
        
        /* Active window */
@@ -3498,9 +5014,20 @@ static void setup_menus(void)
                /* Analyze sizes */
                for (i = 1; i <= n; i++)
                {
+#if TARGET_API_MAC_CARBON
+                       /* Analyze size */
+                       GetMenuItemText(m, i, s);
+                       s[s[0]+1] = '\0';
+                       value = atoi((char*)(s+1));
+
+                       /* Enable the "real" sizes */
+                       if (RealFont(td->font_id, value)) EnableMenuItem(m, i);
+
+                       /* Check the current size */
+                       if (td->font_size == value) CheckMenuItem(m, i, TRUE);
+#else
                        /* Analyze size */
-                       /* GetMenuItemText(m,i,s); */
-                       GetMenuItemText(m, i, s);       //GetItem(m, i, s);
+                       GetMenuItemText(m, i, s);
                        s[s[0]+1] = '\0';
                        value = atoi((char*)(s+1));
 
@@ -3509,38 +5036,84 @@ static void setup_menus(void)
 
                        /* Check the current size */
                        if (td->font_size == value) CheckItem(m, i, TRUE);
+#endif
                }
        }
 
 
        /* Windows menu */
-       m = GetMenuHandle(133); //m = GetMHandle(133);
+       m = GetMenuHandle(133);
 
        /* Get menu size */
+#if TARGET_API_MAC_CARBON
+       n = CountMenuItems(m);
+#else
        n = CountMItems(m);
+#endif
 
        /* Check active windows */
        for (i = 1; i <= n; i++)
        {
                /* Check if needed */
+#if TARGET_API_MAC_CARBON
+               CheckMenuItem(m, i, data[i-1].mapped);
+#else
                CheckItem(m, i, data[i-1].mapped);
+#endif
        }
 
 
        /* Special menu */
-       m = GetMenuHandle(134); //m = GetMHandle(134);
+       m = GetMenuHandle(134);
 
        /* Get menu size */
+#if TARGET_API_MAC_CARBON
+       n = CountMenuItems(m);
+#else
        n = CountMItems(m);
+#endif
 
        /* Reset menu */
        for (i = 1; i <= n; i++)
        {
                /* Reset */
+#if TARGET_API_MAC_CARBON
+               DisableMenuItem(m, i);
+               CheckMenuItem(m, i, FALSE);
+#else
                DisableItem(m, i);
                CheckItem(m, i, FALSE);
+#endif
        }
 
+#if TARGET_API_MAC_CARBON
+       /* Item "arg_sound" */
+       EnableMenuItem(m, 1);
+       CheckMenuItem(m, 1, arg_sound);
+
+       /* Item "arg_graphics" */
+       EnableMenuItem(m, 2);
+       CheckMenuItem(m, 2, arg_graphics);
+
+       /* Item "arg_fiddle" */
+       EnableMenuItem(m, 4);
+       CheckMenuItem(m, 4, arg_fiddle);
+
+       /* Item "arg_wizard" */
+       EnableMenuItem(m, 5);
+       CheckMenuItem(m, 5, arg_wizard);
+
+       /* Item "SoundSetting" */
+       EnableMenuItem(m, 7);
+
+       /* Item NewStyle Graphics */
+       EnableMenuItem(m, 8);
+       CheckMenuItem(m, 8, use_newstyle_graphics);
+
+       /* Item Bigtile Mode */
+       EnableMenuItem(m, 9);
+       CheckMenuItem(m, 9, arg_bigtile);
+#else
        /* Item "arg_sound" */
        EnableItem(m, 1);
        CheckItem(m, 1, arg_sound);
@@ -3557,26 +5130,39 @@ static void setup_menus(void)
        EnableItem(m, 5);
        CheckItem(m, 5, arg_wizard);
 
-#ifdef JP
        /* Item "SoundSetting" */
        EnableItem(m, 7);
-#endif
-       /* Item "Hack" */
-       /* EnableItem(m, 9); */
 
+       /* Item NewStyle Graphics */
+       EnableItem(m, 8);
+       CheckItem(m, 8, use_newstyle_graphics);
+
+       /* Item Bigtile Mode */
+       EnableItem(m, 9);
+       CheckItem(m, 9, arg_bigtile);
+#endif
 
        /* TileWidth menu */
-       m = GetMenuHandle(135); //m = GetMHandle(135);
+       m = GetMenuHandle(135);
 
        /* Get menu size */
+#if TARGET_API_MAC_CARBON
+       n = CountMenuItems(m);
+#else
        n = CountMItems(m);
+#endif
 
        /* Reset menu */
        for (i = 1; i <= n; i++)
        {
                /* Reset */
+#if TARGET_API_MAC_CARBON
+               DisableMenuItem(m, i);
+               CheckMenuItem(m, i, FALSE);
+#else
                DisableItem(m, i);
                CheckItem(m, i, FALSE);
+#endif
        }
 
        /* Active window */
@@ -3587,31 +5173,48 @@ static void setup_menus(void)
                {
                        /* Analyze size */
                        /* GetMenuItemText(m,i,s); */
-                       GetMenuItemText(m, i, s);       //GetItem(m, i, s);
+                       GetMenuItemText(m, i, s);
                        s[s[0]+1] = '\0';
                        value = atoi((char*)(s+1));
 
+#if TARGET_API_MAC_CARBON
+                       /* Enable */
+                       EnableMenuItem(m, i);
+
+                       /* Check the current size */
+                       if (td->tile_wid == value) CheckMenuItem(m, i, TRUE);
+#else
                        /* Enable */
                        EnableItem(m, i);
 
                        /* Check the current size */
                        if (td->tile_wid == value) CheckItem(m, i, TRUE);
+#endif
                }
        }
 
 
        /* TileHeight menu */
-       m = GetMenuHandle(136); //m = GetMHandle(136);
+       m = GetMenuHandle(136);
 
        /* Get menu size */
+#if TARGET_API_MAC_CARBON
+       n = CountMenuItems(m);
+#else
        n = CountMItems(m);
+#endif
 
        /* Reset menu */
        for (i = 1; i <= n; i++)
        {
                /* Reset */
+#if TARGET_API_MAC_CARBON
+               DisableMenuItem(m, i);
+               CheckMenuItem(m, i, FALSE);
+#else
                DisableItem(m, i);
                CheckItem(m, i, FALSE);
+#endif
        }
 
        /* Active window */
@@ -3621,16 +5224,23 @@ static void setup_menus(void)
                for (i = 1; i <= n; i++)
                {
                        /* Analyze size */
-                       /* GetMenuItemText(m,i,s); */
-                       GetMenuItemText(m, i, s);       //GetItem(m, i, s);
+                       GetMenuItemText(m, i, s);
                        s[s[0]+1] = '\0';
                        value = atoi((char*)(s+1));
 
+#if TARGET_API_MAC_CARBON
+                       /* Enable */
+                       EnableMenuItem(m, i);
+
+                       /* Check the current size */
+                       if (td->tile_hgt == value) CheckMenuItem(m, i, TRUE);
+#else
                        /* Enable */
                        EnableItem(m, i);
 
                        /* Check the current size */
                        if (td->tile_hgt == value) CheckItem(m, i, TRUE);
+#endif
                }
        }
 }
@@ -3680,6 +5290,35 @@ static void menu(long mc)
                case 128:
                {
                        /* About Angband... */
+#if TARGET_API_MAC_CARBON
+                       if (selection == 1)
+                       {
+                               DialogPtr dialog;
+                               short item_hit;
+
+                               /* Get the about dialogue */
+                               dialog=GetNewDialog(128, 0, (WindowPtr)-1);
+
+                               /* Move it to the middle of the screen */
+                               RepositionWindow(
+                                       GetDialogWindow(dialog),
+                                       NULL,
+                                       kWindowCenterOnMainScreen);
+
+                               /* Show the dialog */
+                               TransitionWindow(GetDialogWindow(dialog),
+                                       kWindowZoomTransitionEffect,
+                                       kWindowShowTransitionAction,
+                                       NULL);
+
+                               /* Wait for user to click on it */
+                               ModalDialog(0, &item_hit);
+
+                               /* Free the dialogue */
+                               DisposeDialog(dialog);
+                               break;
+                       }
+#else
                        if (selection == 1)
                        {
                                DialogPtr dialog;
@@ -3688,20 +5327,21 @@ static void menu(long mc)
 
                                dialog=GetNewDialog(128, 0, (WindowPtr)-1);
 
-                       /*      r=dialog->portRect;
+                               r=dialog->portRect;
                                center_rect(&r, &qd.screenBits.bounds);
-                               MoveWindow(dialog, r.left, r.top, 1);*/
+                               MoveWindow(dialog, r.left, r.top, 1);
                                ShowWindow(dialog);
                                ModalDialog(0, &item_hit);
-                               DisposeDialog(dialog);          //DisposDialog(dialog);
+                               DisposeDialog(dialog);
                                break;
                        }
 
                        /* Desk accessory */
                        /* GetMenuItemText(GetMHandle(128),selection,s); */
-                       GetMenuItemText(GetMenuHandle(128), selection, s);      //GetItem(GetMHandle(128), selection, s);
+                       GetMenuItemText(GetMenuHandle(128), selection, s);
                        OpenDeskAcc(s);
                        break;
+#endif
                }
 
                /* File Menu */
@@ -3787,7 +5427,11 @@ static void menu(long mc)
                                                msg_flag = FALSE;
 
                                                /* Save the game */
+#if 0
                                                do_cmd_save_game(FALSE);
+#endif
+                                               Term_key_push(SPECIAL_KEY_QUIT);
+                                               break;
                                        }
 
                                        /* Quit */
@@ -3830,10 +5474,9 @@ static void menu(long mc)
                                        td->font_face |= bold;
                                }
 
-#ifdef JP
                                /* Tile Width Hight Init */
                                td->tile_wid = td->tile_hgt = 0;
-#endif
+
                                /* Apply and Verify */
                                term_data_check_font(td);
                                term_data_check_size(td);
@@ -3858,10 +5501,9 @@ static void menu(long mc)
                                        td->font_face |= extend;
                                }
 
-#ifdef JP
                                /* Tile Width Hight Init */
                                td->tile_wid = td->tile_hgt = 0;
-#endif
+
                                /* Apply and Verify */
                                term_data_check_font(td);
                                term_data_check_size(td);
@@ -3874,8 +5516,7 @@ static void menu(long mc)
                        }
 
                        /* Get a new font name */
-                       /* GetMenuItemText(GetMHandle(131), selection, s); */
-                       GetMenuItemText(GetMenuHandle(131), selection, s);              //GetItem(GetMHandle(131), selection, s);
+                       GetMenuItemText(GetMenuHandle(131), selection, s);
                        GetFNum(s, &fid);
 
                        /* Save the new font id */
@@ -3909,10 +5550,9 @@ static void menu(long mc)
                                }
                        }
 
-#ifdef JP
                        /* Tile Width Hight Init */
                        td->tile_wid = td->tile_hgt = 0;
-#endif
+
                        /* Apply and Verify */
                        term_data_check_font(td);
                        term_data_check_size(td);
@@ -3938,15 +5578,13 @@ static void menu(long mc)
                        /* Activate */
                        activate(td->w);
 
-                       /* GetMenuItemText(GetMHandle(132), selection, s); */
-                       GetMenuItemText(GetMenuHandle(132), selection, s);      //GetItem(GetMHandle(132), selection, s);
+                       GetMenuItemText(GetMenuHandle(132), selection, s);
                        s[s[0]+1]=0;
                        td->font_size = atoi((char*)(s+1));
 
-#ifdef JP
                        /* Tile Width Hight Init */
                        td->tile_wid = td->tile_hgt = 0;
-#endif
+
                        /* Apply and Verify */
                        term_data_check_font(td);
                        term_data_check_size(td);
@@ -4011,6 +5649,12 @@ static void menu(long mc)
                                {
                                        /* Toggle arg_graphics */
                                        arg_graphics = !arg_graphics;
+                                       if( arg_graphics == true ){
+                                               ANGBAND_GRAF = "old";
+                                               arg_newstyle_graphics = false;
+                                               grafWidth = grafHeight = 8;
+                                               pictID = 1001;
+                                       }
 
                                        /* Hack -- Force redraw */
                                        Term_key_push(KTRL('R'));
@@ -4029,12 +5673,59 @@ static void menu(long mc)
                                        arg_wizard = !arg_wizard;
                                        break;
                                }
-#ifdef JP
+
                                case 7:
                                {
                                        SoundConfigDLog();
+                                       break;
                                }
+                               case 8:
+                               {
+                                       if (streq(ANGBAND_GRAF, "old"))
+                                       {
+                                               ANGBAND_GRAF = "new";
+                                               arg_newstyle_graphics = true;
+                                               grafWidth = grafHeight = 16;
+                                               pictID = 1002;
+                                       }
+                                       else
+                                       {
+                                               ANGBAND_GRAF = "old";
+                                               arg_newstyle_graphics = false;
+                                               grafWidth = grafHeight = 8;
+                                               pictID = 1001;
+                                       }
+
+                                       /* Hack -- Force redraw */
+                                       Term_key_push(KTRL('R'));
+                                       break;
+                               }
+
+                               case 9: /* bigtile mode */
+                               {
+                                       term_data *td = &data[0];
+
+                                       if (!can_save){
+#ifdef JP
+                                               plog("º£¤ÏÊѹ¹½ÐÍè¤Þ¤»¤ó¡£");
+#else
+                                               plog("You may not do that right now.");
 #endif
+                                               break;
+                                       }
+
+                                       /* Toggle "arg_bigtile" */
+                                       arg_bigtile = !arg_bigtile;
+
+                                       /* Activate */
+                                       Term_activate(td->t);
+
+                                       /* Resize the term */
+                                       Term_resize(td->cols, td->rows);
+
+                                       break;
+                               }
+
                        }
 
                        break;
@@ -4051,8 +5742,7 @@ static void menu(long mc)
                        /* Activate */
                        activate(td->w);
 
-                       /* GetMenuItemText(GetMHandle(135), selection, s); */
-                       GetMenuItemText(GetMenuHandle(135), selection, s);      //GetItem(GetMHandle(135), selection, s);
+                       GetMenuItemText(GetMenuHandle(135), selection, s);
                        s[s[0]+1]=0;
                        td->tile_wid = atoi((char*)(s+1));
 
@@ -4080,8 +5770,7 @@ static void menu(long mc)
                        /* Activate */
                        activate(td->w);
 
-                       /* GetMenuItemText(GetMHandle(136), selection, s); */
-                       GetMenuItemText(GetMenuHandle(136), selection, s);      //GetItem(GetMHandle(136), selection, s);
+                       GetMenuItemText(GetMenuHandle(136), selection, s);
                        s[s[0]+1]=0;
                        td->tile_hgt = atoi((char*)(s+1));
 
@@ -4118,7 +5807,7 @@ static OSErr CheckRequiredAEParams(const AppleEvent *theAppleEvent)
        Size    actualSize;
 
        aeError = AEGetAttributePtr(theAppleEvent, keyMissedKeywordAttr, typeWildCard,
-                                   &returnedType, NULL, 0, &actualSize);
+                                   &returnedType, NULL, 0, &actualSize);
 
        if (aeError == errAEDescNotFound) return (noErr);
 
@@ -4132,7 +5821,7 @@ static OSErr CheckRequiredAEParams(const AppleEvent *theAppleEvent)
  * Apple Event Handler -- Open Application
  */
 static pascal OSErr AEH_Start(const AppleEvent *theAppleEvent,
-                              const AppleEvent *reply, long handlerRefCon)
+                             AppleEvent *reply, long handlerRefCon)
 {
 #pragma unused(reply, handlerRefCon)
 
@@ -4144,15 +5833,42 @@ static pascal OSErr AEH_Start(const AppleEvent *theAppleEvent,
  * Apple Event Handler -- Quit Application
  */
 static pascal OSErr AEH_Quit(const AppleEvent *theAppleEvent,
-                             const AppleEvent *reply, long handlerRefCon)
+                            AppleEvent *reply, long handlerRefCon)
 {
 #pragma unused(reply, handlerRefCon)
+#if TARGET_API_MAC_CARBON
+
+       /* Save the game (if necessary) */
+       if (game_in_progress && character_generated)
+       {
+                       if (!can_save){
+#ifdef JP
+                               plog("º£¤Ï¥»¡¼¥Ö¤¹¤ë¤³¤È¤Ï½ÐÍè¤Þ¤»¤ó¡£");
+#else
+                               plog("You may not do that right now.");
+#endif
+                               return;
+                       }
+                       /* Hack -- Forget messages */
+                       msg_flag = FALSE;
+
+                       /* Save the game */
+#if 0
+                       do_cmd_save_game(FALSE);
+#endif
+                       Term_key_push(SPECIAL_KEY_QUIT);
+                       return;
+               }
 
+               /* Quit */
+               quit(NULL);
+#else
        /* Quit later */
        quit_when_ready = TRUE;
 
        /* Check arguments */
        return (CheckRequiredAEParams(theAppleEvent));
+#endif
 }
 
 
@@ -4160,7 +5876,7 @@ static pascal OSErr AEH_Quit(const AppleEvent *theAppleEvent,
  * Apple Event Handler -- Print Documents
  */
 static pascal OSErr AEH_Print(const AppleEvent *theAppleEvent,
-                              const AppleEvent *reply, long handlerRefCon)
+                             AppleEvent *reply, long handlerRefCon)
 {
 #pragma unused(theAppleEvent, reply, handlerRefCon)
 
@@ -4182,8 +5898,8 @@ static pascal OSErr AEH_Print(const AppleEvent *theAppleEvent,
  * snippet from Think Reference 2.0.  (The prior sentence could read
  * "shamelessly swiped & hacked")
  */
-static pascal OSErr AEH_Open(AppleEvent *theAppleEvent,
-                             AppleEvent* reply, long handlerRefCon)
+static pascal OSErr AEH_Open(const AppleEvent *theAppleEvent,
+                            AppleEvent* reply, long handlerRefCon)
 {
 #pragma unused(reply, handlerRefCon)
 
@@ -4206,7 +5922,7 @@ static pascal OSErr AEH_Open(AppleEvent *theAppleEvent,
         */
 
        err = AEGetNthPtr(&docList, 1L, typeFSS, &keywd,
-                         &returnedType, (Ptr) &myFSS, sizeof(myFSS), &actualSize);
+                         &returnedType, (Ptr) &myFSS, sizeof(myFSS), &actualSize);
        if (err) return err;
 
        /* Only needed to check savefile type below */
@@ -4221,6 +5937,13 @@ static pascal OSErr AEH_Open(AppleEvent *theAppleEvent,
        /* Ignore non 'SAVE' files */
        if (myFileInfo.fdType != 'SAVE') return noErr;
 
+#ifdef MACH_O_CARBON
+
+       /* Extract a file name */
+       (void)spec_to_path(&myFSS, savefile, sizeof(savefile));
+
+#else
+
        /* XXX XXX XXX Extract a file name */
        PathNameFromDirID(myFSS.parID, myFSS.vRefNum, (StringPtr)savefile);
        pstrcat((StringPtr)savefile, (StringPtr)&myFSS.name);
@@ -4228,6 +5951,8 @@ static pascal OSErr AEH_Open(AppleEvent *theAppleEvent,
        /* Convert the string */
        ptocstr((StringPtr)savefile);
 
+#endif /* MACH_O_CARBON */
+
        /* Delay actual open */
        open_when_ready = TRUE;
 
@@ -4269,11 +5994,11 @@ static pascal OSErr AEH_Open(AppleEvent *theAppleEvent,
  * F7: 98
  * F3:99
  * F8:100
- * F10:101
+ * F10:109
  * F11:103
  * F13:105
  * F14:107
- * F9:109
+ * F9:101
  * F12:111
  * F15:113
  * Help:114
@@ -4336,16 +6061,19 @@ static bool CheckEvents(bool wait)
        /* Timestamp last check */
        lastTicks = curTicks;
 
+#if TARGET_API_MAC_CARBON
+       WaitNextEvent( everyEvent, &event, 1L, nil );
+#else
        /* Let the "system" run */
        SystemTask();
 
        /* Get an event (or null) */
        GetNextEvent(everyEvent, &event);
+#endif
 
        /* Hack -- Nothing is ready yet */
        if (event.what == nullEvent) return (FALSE);
 
-
        /* Analyze the event */
        switch (event.what)
        {
@@ -4409,9 +6137,6 @@ static bool CheckEvents(bool wait)
                                /* Hack -- Prepare the menus */
                                setup_menus();
 
-                               /* Mega-Hack -- allow easy exit if nothing to save */
-/*                             if (!character_generated && (ch=='Q' || ch=='q')) ch = 'e'; */
-
                                /* Run the Menu-Handler */
                                menu(MenuKey(ch));
 
@@ -4433,19 +6158,6 @@ static bool CheckEvents(bool wait)
                                Term_keypress(ch);
                        }
 
-                       /* Hack -- normal "keypad keys" -> special keypress */
-                       else if (!mc && !ms && !mo && !mx && (ck < 96))
-                       {
-                               /* Hack -- "enter" is confused */
-                               if (ck == 76) ch = '\n';
-
-                               /* Send control-caret as a trigger */
-                               Term_keypress(30);
-
-                               /* Send the "ascii" keypress */
-                               Term_keypress(ch);
-                       }
-
                        /* Bizarre key -> encoded keypress */
                        else if (ck <= 127)
                        {
@@ -4498,20 +6210,27 @@ static bool CheckEvents(bool wait)
                                        HiliteMenu(0);
                                        break;
                                }
-
+#if !TARGET_API_MAC_CARBON
                                case inSysWindow:
                                {
                                        SystemClick(&event, w);
                                        break;
                                }
+#endif
 
                                case inDrag:
                                {
                                        Point p;
 
                                        WindowPtr old_win;
-
-                                       r = qd.screenBits.bounds;
+                                       BitMap screen;
+                                       Rect portRect;
+#if TARGET_API_MAC_CARBON                                              
+                                       GetQDGlobalsScreenBits( &screen );
+#else
+                                       screen = qd.screenBits;
+#endif 
+                                       r = screen.bounds;
                                        r.top += 20; /* GetMBarHeight() XXX XXX XXX */
                                        InsetRect(&r, 4, 4);
                                        DragWindow(w, event.where, &r);
@@ -4526,9 +6245,17 @@ static bool CheckEvents(bool wait)
                                        activate(td->w);
 
                                        /* Analyze */
-                                       p.h = td->w->portRect.left;
-                                       p.v = td->w->portRect.top;
+#if TARGET_API_MAC_CARBON
+                                       GetWindowBounds( (WindowRef)td->w, kWindowContentRgn, &portRect );
+#else
+                                       portRect = td->w->portRect;
+                                       local_to_global( &portRect );
+#endif
+                                       p.h = portRect.left;
+                                       p.v = portRect.top;
+#if !TARGET_API_MAC_CARBON
                                        LocalToGlobal(&p);
+#endif
                                        td->r.left = p.h;
                                        td->r.top = p.v;
 
@@ -4564,18 +6291,24 @@ static bool CheckEvents(bool wait)
 
                                case inGrow:
                                {
-                                       int x, y;
+                                       s16b x, y;
 
                                        term *old = Term;
-
+                                       BitMap          screen;
+       
+#if TARGET_API_MAC_CARBON
+                                       GetQDGlobalsScreenBits( &screen );
+#else
+                                       screen = qd.screenBits;
+#endif
                                        /* Oops */
                                        if (!td) break;
 
                                        /* Fake rectangle */
                                        r.left = 20 * td->tile_wid + td->size_ow1;
-                                       r.right = 80 * td->tile_wid + td->size_ow1 + td->size_ow2 + 1;
+                                       r.right = screen.bounds.right;
                                        r.top = 1 * td->tile_hgt + td->size_oh1;
-                                       r.bottom = 24 * td->tile_hgt + td->size_oh1 + td->size_oh2 + 1;
+                                       r.bottom = screen.bounds.bottom;
 
                                        /* Grow the rectangle */
                                        newsize = GrowWindow(w, event.where, &r);
@@ -4593,7 +6326,6 @@ static bool CheckEvents(bool wait)
 
                                        /* Apply and Verify */
                                        term_data_check_size(td);
-
                                        /* Activate */
                                        Term_activate(td->t);
 
@@ -4624,6 +6356,9 @@ static bool CheckEvents(bool wait)
                /* Disk Event -- From "Maarten Hazewinkel" */
                case diskEvt:
                {
+
+#if TARGET_API_MAC_CARBON
+#else
                        /* check for error when mounting the disk */
                        if (HiWord(event.message) != noErr)
                        {
@@ -4634,7 +6369,7 @@ static bool CheckEvents(bool wait)
                                DIBadMount(p, event.message);
                                DIUnload();
                        }
-
+#endif
                        break;
                }
 
@@ -4648,8 +6383,17 @@ static bool CheckEvents(bool wait)
                                /* Resuming: activate the front window */
                                if (event.message & resumeFlag)
                                {
+#if TARGET_API_MAC_CARBON
+                                       Cursor  arrow;
+                                               
+                                       SetPortWindowPort( FrontWindow() );
+                                       
+                                       GetQDGlobalsArrow( &arrow );
+                                       SetCursor(&arrow);
+#else
                                        SetPort(FrontWindow());
                                        SetCursor(&qd.arrow);
+#endif
                                }
 
                                /* Suspend: deactivate the front window */
@@ -4669,6 +6413,9 @@ static bool CheckEvents(bool wait)
                /* From "Steve Linberg" and "Maarten Hazewinkel" */
                case kHighLevelEvent:
                {
+#if TARGET_API_MAC_CARBON
+                       AEProcessAppleEvent(&event);
+#else
                        /* Process apple events */
                        if (AEProcessAppleEvent(&event) != noErr)
                        {
@@ -4694,6 +6441,7 @@ static bool CheckEvents(bool wait)
 
                        /* Handle "open_when_ready" */
                        handle_open_when_ready();
+#endif
 
                        break;
                }
@@ -4771,7 +6519,7 @@ static vptr hook_rpanic(huge size)
 
 #pragma unused (size)
 
-       vptr mem = NULL;
+       /* vptr mem = NULL; */
 
        /* Free the lifeboat */
        if (lifeboat)
@@ -4815,6 +6563,13 @@ static void hook_quit(cptr str)
        /* Warning if needed */
        if (str) mac_warning(str);
 
+#ifdef USE_ASYNC_SOUND
+
+       /* Clean up sound support */
+       cleanup_sound();
+
+#endif /* USE_ASYNC_SOUND */
+
        /* Write a preference file */
        save_pref_file();
 
@@ -4874,19 +6629,29 @@ static void init_stuff(void)
 {
        int i;
 
+#if !TARGET_API_MAC_CARBON
        short vrefnum;
        long drefnum;
        long junk;
 
        SFTypeList types;
        SFReply reply;
+#endif
 
        Rect r;
        Point topleft;
 
        char path[1024];
 
+       BitMap screen;
+       Rect screenRect;
 
+#if TARGET_API_MAC_CARBON
+       OSErr err = noErr;
+       NavDialogOptions dialogOptions;
+       FSSpec theFolderSpec;
+       NavReplyRecord theReply;
+#endif
        /* Fake rectangle */
        r.left = 0;
        r.top = 0;
@@ -4894,7 +6659,12 @@ static void init_stuff(void)
        r.bottom = 188;
 
        /* Center it */
-       center_rect(&r, &qd.screenBits.bounds);
+#if TARGET_API_MAC_CARBON
+       screenRect = GetQDGlobalsScreenBits(&screen)->bounds;
+#else
+       screenRect = qd.screenBits.bounds;
+#endif
+       center_rect(&r, &screenRect);
 
        /* Extract corner */
        topleft.v = r.top;
@@ -4902,7 +6672,11 @@ static void init_stuff(void)
 
 
        /* Default to the "lib" folder with the application */
+#ifdef MACH_O_CARBON
+       if (locate_lib(path, sizeof(path)) == NULL) quit(NULL);
+#else
        refnum_to_name(path, app_dir, app_vol, (char*)("\plib:"));
+#endif
 
 
        /* Check until done */
@@ -4912,32 +6686,104 @@ static void init_stuff(void)
                init_file_paths(path);
 
                /* Build the filename */
-               #ifdef JP
-                       path_build(path, 1024, ANGBAND_DIR_FILE, "news_j.txt");
-               #else
-                       path_build(path, 1024, ANGBAND_DIR_FILE, "news.txt");
-               #endif
+#ifdef JP
+               path_build(path, sizeof(path), ANGBAND_DIR_FILE, "news_j.txt");
+#else
+               path_build(path, sizeof(path), ANGBAND_DIR_FILE, "news.txt");
+#endif
 
                /* Attempt to open and close that file */
                if (0 == fd_close(fd_open(path, O_RDONLY))) break;
 
                /* Warning */
-               #ifdef JP
-                       plog_fmt("'%s' ¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó½ÐÍè¤Þ¤»¤ó.", path);
-               #else
-                       plog_fmt("Unable to open the '%s' file.", path);
-               #endif
+#ifdef JP
+               plog_fmt("'%s' ¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó½ÐÍè¤Þ¤»¤ó.", path);
+#else
+               plog_fmt("Unable to open the '%s' file.", path);
+#endif
 
                /* Warning */
-               #ifdef JP
-                       plog("Hengband¤Î'lib'¥Õ¥©¥ë¥À¤¬Â¸ºß¤·¤Ê¤¤¤«Àµ¤·¤¯Ìµ¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹.");
-               #else
-                       plog("The Angband 'lib' folder is probably missing or misplaced.");
-               #endif
+#ifdef JP
+               plog("Hengband¤Î'lib'¥Õ¥©¥ë¥À¤¬Â¸ºß¤·¤Ê¤¤¤«Àµ¤·¤¯Ìµ¤¤²ÄǽÀ­¤¬¤¢¤ê¤Þ¤¹.");
+#else
+               plog("The Angband 'lib' folder is probably missing or misplaced.");
+#endif
 
                /* Warning */
+#ifdef JP
+               plog("Please 'open' any file in any sub-folder of the 'lib' folder.");
+#else
                plog("Please 'open' any file in any sub-folder of the 'lib' folder.");
+#endif
+               
+#if TARGET_API_MAC_CARBON
+               /* Ask the user to choose the lib folder */
+               err = NavGetDefaultDialogOptions(&dialogOptions);
+
+               /* Paranoia */
+               if (err != noErr) quit(NULL);
+
+               /* Set default location option */
+               dialogOptions.dialogOptionFlags |= kNavSelectDefaultLocation;
+
+               /* Clear preview option */
+               dialogOptions.dialogOptionFlags &= ~(kNavAllowPreviews);
+
+               /* Forbit selection of multiple files */
+               dialogOptions.dialogOptionFlags &= ~(kNavAllowMultipleFiles);
+
+               /* Display location */
+               dialogOptions.location = topleft;
+
+               /* Load the message for the missing folder from the resource fork */
+               GetIndString(dialogOptions.message, 128, 1);
+
+               /* Wait for the user to choose a folder */
+               err = NavChooseFolder(
+                       nil,
+                       &theReply,
+                       &dialogOptions,
+                       nil,
+                       nil,
+                       nil);
 
+               /* Assume the player doesn't want to go on */
+               if ((err != noErr) || !theReply.validRecord) quit(NULL);
+
+               /* Retrieve FSSpec from the reply */
+               {
+                       AEKeyword theKeyword;
+                       DescType actualType;
+                       Size actualSize;
+
+                       /* Get a pointer to selected folder */
+                       err = AEGetNthPtr(
+                               &(theReply.selection),
+                               1,
+                               typeFSS,
+                               &theKeyword,
+                               &actualType,
+                               &theFolderSpec,
+                               sizeof(FSSpec),
+                               &actualSize);
+
+                       /* Paranoia */
+                       if (err != noErr) quit(NULL);
+               }
+
+               /* Free navitagor reply */
+               err = NavDisposeReply(&theReply);
+
+               /* Paranoia */
+               if (err != noErr) quit(NULL);
+
+               /* Extract textual file name for given file */
+               refnum_to_name(
+                       path,
+                       theFolderSpec.parID,
+                       theFolderSpec.vRefNum,
+                       (char *)theFolderSpec.name);
+#else
                /* Allow "text" files */
                types[0] = 'TEXT';
 
@@ -4956,6 +6802,7 @@ static void init_stuff(void)
                /* Extract textual file name for given file */
                GetWDInfo(reply.vRefNum, &vrefnum, &drefnum, &junk);
                refnum_to_name(path, drefnum, vrefnum, (char*)reply.fName);
+#endif
 
                /* Hack -- Remove the "filename" */
                i = strlen(path) - 1;
@@ -4976,20 +6823,23 @@ static void init_stuff(void)
 /*
  * Macintosh Main loop
  */
-void main(void)
+int main(void)
 {
        EventRecord tempEvent;
        int numberOfMasters = 10;
 
+#if !TARGET_API_MAC_CARBON
        /* Increase stack space by 64K */
        SetApplLimit(GetApplLimit() - 131072L);//65536L);
 
        /* Stretch out the heap to full size */
        MaxApplZone();
+#endif
 
        /* Get more Masters */
        while (numberOfMasters--) MoreMasters();
 
+#if !TARGET_API_MAC_CARBON
        /* Set up the Macintosh */
        InitGraf(&qd.thePort);
        InitFonts();
@@ -4997,6 +6847,7 @@ void main(void)
        InitMenus();
        /* TEInit(); */
        InitDialogs(NULL);
+#endif
        InitCursor();
 
 #ifdef JP
@@ -5026,6 +6877,19 @@ void main(void)
 
 # else
 
+#if TARGET_API_MAC_CARBON
+
+       {
+               OSErr err;
+               long response;
+
+               /* Check for existence of Carbon */
+               err = Gestalt(gestaltCarbonVersion, &response);
+
+               if (err != noErr) quit("This program requires Carbon API");
+       }
+
+#else
        /* Block */
        if (TRUE)
        {
@@ -5082,50 +6946,50 @@ void main(void)
                }
        }
 
-# endif
+#endif /* CARBON */
+#endif
 
 #endif /* ANGBAND_LITE_MAC */
 
+       /* 
+        * Remember Mac OS version, in case we have to cope with version-specific
+        * problems
+        */
+       (void)Gestalt(gestaltSystemVersion, &mac_os_version);
 
 #ifdef USE_SFL_CODE
-
        /* Obtain a "Universal Procedure Pointer" */
-       AEH_Start_UPP = NewAEEventHandlerProc(AEH_Start);
-
+       AEH_Start_UPP = NewAEEventHandlerUPP(AEH_Start);
        /* Install the hook (ignore error codes) */
        AEInstallEventHandler(kCoreEventClass, kAEOpenApplication, AEH_Start_UPP,
-                             0L, FALSE);
+                             0L, FALSE);
 
        /* Obtain a "Universal Procedure Pointer" */
-       AEH_Quit_UPP = NewAEEventHandlerProc(AEH_Quit);
-
+       AEH_Quit_UPP = NewAEEventHandlerUPP(AEH_Quit);
        /* Install the hook (ignore error codes) */
        AEInstallEventHandler(kCoreEventClass, kAEQuitApplication, AEH_Quit_UPP,
-                             0L, FALSE);
+                             0L, FALSE);
 
        /* Obtain a "Universal Procedure Pointer" */
-       AEH_Print_UPP = NewAEEventHandlerProc(AEH_Print);
-
+       AEH_Print_UPP = NewAEEventHandlerUPP(AEH_Print);
        /* Install the hook (ignore error codes) */
        AEInstallEventHandler(kCoreEventClass, kAEPrintDocuments, AEH_Print_UPP,
-                             0L, FALSE);
+                             0L, FALSE);
 
        /* Obtain a "Universal Procedure Pointer" */
-       AEH_Open_UPP = NewAEEventHandlerProc(AEH_Open);
-
+       AEH_Open_UPP = NewAEEventHandlerUPP(AEH_Open);
        /* Install the hook (ignore error codes) */
        AEInstallEventHandler(kCoreEventClass, kAEOpenDocuments, AEH_Open_UPP,
-                             0L, FALSE);
-
+                             0L, FALSE);
 #endif
 
-
+#ifndef MACH_O_CARBON
        /* Find the current application */
        SetupAppDir();
-
+#endif
 
        /* Mark ourself as the file creator */
-       _fcreator = 'Heng';
+       _fcreator = ANGBAND_CREATOR;
 
        /* Default to saving a "text" file */
        _ftype = 'TEXT';
@@ -5134,7 +6998,11 @@ void main(void)
 #if defined(__MWERKS__)
 
        /* Obtian a "Universal Procedure Pointer" */
+#if TARGET_API_MAC_CARBON
+       ynfilterUPP = NewModalFilterUPP(ynfilter);
+#else
        ynfilterUPP = NewModalFilterProc(ynfilter);
+#endif
 
 #endif
 
@@ -5149,8 +7017,8 @@ void main(void)
        quit_aux = hook_quit;
        core_aux = hook_core;
 
-BackColor(blackColor);
-               ForeColor(whiteColor);
+       BackColor(blackColor);
+       ForeColor(whiteColor);
 
        /* Show the "watch" cursor */
        SetCursor(*(GetCursor(watchCursor)));
@@ -5161,15 +7029,27 @@ BackColor(blackColor);
        /* Prepare the windows */
        init_windows();
 
-#ifdef JP
+#ifndef MACH_O_CARBON
+
        init_sound();
-#endif
 
+       init_graf();
+
+#endif
+       
        /* Hack -- process all events */
        while (CheckEvents(TRUE)) /* loop */;
 
        /* Reset the cursor */
-       SetCursor(&qd.arrow);
+#if TARGET_API_MAC_CARBON
+       {
+               Cursor  arrow;
+               GetQDGlobalsArrow( &arrow );
+               SetCursor(&arrow);
+       }
+#else
+       SetCursor( &qd.arrow );
+#endif
 
 
        /* Mega-Hack -- Allocate a "lifeboat" */
@@ -5177,15 +7057,13 @@ BackColor(blackColor);
 
        /* Note the "system" */
        ANGBAND_SYS = "mac";
-#if 0
-       ANGBAND_GRAF = "new";
-#else
-       ANGBAND_GRAF = "old";
-#endif
 
        /* Initialize */
        init_stuff();
 
+       /* Catch nasty signals */
+       signals_init();
+
        /* Initialize */
        init_angband();
 
@@ -5206,11 +7084,11 @@ BackColor(blackColor);
 #endif
 
        /* Prompt the user */
-       #ifdef JP
+#ifdef JP
        prt("'¥Õ¥¡¥¤¥ë'¥á¥Ë¥å¡¼¤è¤ê'¿·µ¬'¤Þ¤¿¤Ï'³«¤¯...'¤òÁªÂò¤·¤Æ¤¯¤À¤µ¤¤¡£", 23, 10);
-       #else
+#else
        prt("[Choose 'New' or 'Open' from the 'File' menu]", 23, 15);
-       #endif
+#endif
 
        /* Flush the prompt */
        Term_fresh();