DEADSOFTWARE

add paths for osx
[d2df-sdl.git] / src / game / g_main.pas
index 16085cead25ca40398edda2a2a43bb8a4b6f51e6..165a116c0446e72a44817b3abc61e9e116174fa9 100644 (file)
@@ -61,6 +61,9 @@ uses
 {$IFDEF LINUX}
   BaseUnix,
 {$ENDIF}
+{$IFDEF DARWIN}
+  MacOSAll, CocoaAll,
+{$ENDIF}
 {$IFDEF USE_SDL2}
   SDL2,
 {$ENDIF}
@@ -109,6 +112,27 @@ begin
     e_LogWriteln('  ' + dir);
 end;
 
+{$IFDEF DARWIN}
+  function NSStringToAnsiString (s: NSString): AnsiString;
+    var i: Integer;
+  begin
+    result := '';
+    for i := 0 to s.length - 1 do
+      result := result + AnsiChar(s.characterAtIndex(i));
+  end;
+
+  function GetBundlePath (): AnsiString;
+    var pathRef: CFURLRef; pathCFStr: CFStringRef; pathStr: ShortString;
+  begin
+    pathRef := CFBundleCopyBundleURL(CFBundleGetMainBundle());
+    pathCFStr := CFURLCopyFileSystemPath(pathRef, kCFURLPOSIXPathStyle);
+    CFStringGetPascalString(pathCFStr, @pathStr, 255, CFStringGetSystemEncoding());
+    CFRelease(pathRef);
+    CFRelease(pathCFStr);
+    Result := pathStr;
+  end;
+{$ENDIF}
+
 procedure InitPath;
   var i: Integer; rwdir, rodir: AnsiString; rwdirs, rodirs: SSArray;
   //first: Boolean = true;
@@ -189,47 +213,112 @@ procedure InitPath;
   end;
 
   function GetDefaultRODirs (): SSArray;
-    {$IFDEF UNIX}
+    {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN) AND NOT DEFINED(ANDROID)}
       var home: AnsiString;
     {$ENDIF}
-  begin
-    {$IFDEF USE_SDL2}
-      AddDir(result, SDL_GetBasePath());
-      AddDir(result, SDL_GetPrefPath('', 'doom2df'));
+    {$IFDEF WINDOWS}
+      var appdata: AnsiString;
     {$ENDIF}
-    {$IFDEF UNIX}
-      AddDir(result, '/usr/share/doom2df');
-      AddDir(result, '/usr/local/share/doom2df');
-      home := GetEnvironmentVariable('HOME');
-      if home <> '' then
-        AddDir(result, e_CatPath(home, '.doom2df'));
+    {$IFDEF DARWIN}
+      var bundle, s: AnsiString; dirArr: NSArray; i: Integer;
     {$ENDIF}
-    {$IF DEFINED(ANDROID) AND DEFINED(USE_SDL2)}
-      AddDir(result, SDL_AndroidGetInternalStoragePath());
-      if SDL_AndroidGetExternalStorageState() <> 0 then
-        AddDir(result, SDL_AndroidGetExternalStoragePath());
+  begin
+    result := nil;
+    if forceCurrentDir = false then
+    begin
+      {$IFDEF USE_SDL2}
+        AddDir(result, SDL_GetBasePath());
+        AddDir(result, SDL_GetPrefPath('', 'doom2df'));
+      {$ENDIF}
+      {$IFDEF WINDOWS}
+        appdata := GetEnvironmentVariable('APPDATA') + '\doom2df';
+        if appdata <> '' then
+          AddDir(result, appdata);
+      {$ENDIF}
+      {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN) AND NOT DEFINED(ANDROID)}
+        AddDir(result, '/usr/share/doom2df');
+        AddDir(result, '/usr/local/share/doom2df');
+        home := GetEnvironmentVariable('HOME');
+        if home <> '' then
+          AddDir(result, e_CatPath(home, '.doom2df'));
+      {$ENDIF}
+      {$IFDEF DARWIN}
+        bundle := GetBundlePath();
+        if bundle <> '' then
+          AddDir(result, e_CatPath(bundle, 'Contents/Resources'));
+        dirArr := NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, true);
+        for i := 0 to dirArr.count - 1 do
+        begin
+          s := NSStringToAnsiString(dirArr.objectAtIndex(i));
+          AddDir(result, e_CatPath(s, 'Doom 2D Forever'))
+        end;
+      {$ENDIF}
+      {$IF DEFINED(ANDROID) AND DEFINED(USE_SDL2)}
+        AddDir(result, SDL_AndroidGetInternalStoragePath());
+        if SDL_AndroidGetExternalStorageState() <> 0 then
+          AddDir(result, SDL_AndroidGetExternalStoragePath());
+      {$ENDIF}
+    end;
+    {$IFNDEF ANDROID}
+      {$IFDEF DARWIN}
+        if ExtractFileExt(bundle) <> '.app' then
+          AddDir(result, '');
+      {$ELSE}
+        AddDir(result, '');
+      {$ENDIF}
     {$ENDIF}
-    AddDir(result, '.');
   end;
 
   function GetDefaultRWDirs (): SSArray;
-    {$IFDEF UNIX}
+    {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN) AND NOT DEFINED(ANDROID)}
       var home: AnsiString;
     {$ENDIF}
-  begin
-    {$IF DEFINED(USE_SDL2)}
-      AddDir(result, SDL_GetPrefPath('', 'doom2df'));
+    {$IFDEF WINDOWS}
+      var appdata: AnsiString;
     {$ENDIF}
-    {$IFDEF UNIX}
-      home := GetEnvironmentVariable('HOME');
-      if home <> '' then
-        AddDir(result, e_CatPath(home, '.doom2df'));
+    {$IFDEF DARWIN}
+      var bundle, s: AnsiString; dirArr: NSArray; i: Integer;
     {$ENDIF}
-    {$IF DEFINED(ANDROID) AND DEFINED(USE_SDL2)}
-      if SDL_AndroidGetExternalStorageState() <> 0 then
-        AddDir(result, SDL_AndroidGetExternalStoragePath());
+  begin
+    result := nil;
+    if forceCurrentDir = false then
+    begin
+      {$IFDEF USE_SDL2}
+        AddDir(result, SDL_GetPrefPath('', 'doom2df'));
+      {$ENDIF}
+      {$IFDEF WINDOWS}
+        appdata := GetEnvironmentVariable('APPDATA') + '\doom2df';
+        if appdata <> '' then
+          AddDir(result, appdata);
+      {$ENDIF}
+      {$IF DEFINED(UNIX) AND NOT DEFINED(DARWIN) AND NOT DEFINED(ANDROID)}
+        home := GetEnvironmentVariable('HOME');
+        if home <> '' then
+          AddDir(result, e_CatPath(home, '.doom2df'));
+      {$ENDIF}
+      {$IFDEF DARWIN}
+        dirArr := NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, true);
+        for i := 0 to dirArr.count - 1 do
+        begin
+          s := NSStringToAnsiString(dirArr.objectAtIndex(i));
+          AddDir(result, e_CatPath(s, 'Doom 2D Forever'))
+        end;
+      {$ENDIF}
+      {$IF DEFINED(ANDROID) AND DEFINED(USE_SDL2)}
+        if SDL_AndroidGetExternalStorageState() <> 0 then
+          AddDir(result, SDL_AndroidGetExternalStoragePath());
+      {$ENDIF}
+    end;
+    {$IFNDEF ANDROID}
+      {$IFDEF DARWIN}
+        bundle := GetBundlePath();
+        if ExtractFileExt(bundle) <> '.app' then
+        if bundle = '' then
+          AddDir(result, '');
+      {$ELSE}
+        AddDir(result, '');
+      {$ENDIF}
     {$ENDIF}
-    AddDir(result, '.');
   end;
 
 begin
@@ -239,6 +328,7 @@ begin
 
   for i := 1 to ParamCount do
   begin
+    // use it only if you ketmar
     if (ParamStr(i) = '--cwd') then
     begin
       forceCurrentDir := true;
@@ -367,9 +457,11 @@ begin
   if GameWad = '' then
   begin
     e_WriteLog('GAME.WAD not installed?', TMsgType.Fatal);
-    {$IFDEF USE_SDL2}
-      SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 'Doom 2D Forever', 'GAME.WAD not installed?', nil);
+    {$IF DEFINED(USE_SDL2) AND NOT DEFINED(HEADLESS)}
+      if forceCurrentDir = false then
+        SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 'Doom 2D Forever', 'GAME.WAD not installed?', nil);
     {$ENDIF}
+    e_DeinitLog;
     Halt(1);
   end;