X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_main.pas;h=165a116c0446e72a44817b3abc61e9e116174fa9;hb=82d89552dd0e3241987ce363b71e83c22be306e1;hp=94606737be95baed9247cbfe82d29f4ca792af2a;hpb=c8c9b94f0283f1d1ad80d06ef358b72de1cdc607;p=d2df-sdl.git diff --git a/src/game/g_main.pas b/src/game/g_main.pas index 9460673..165a116 100644 --- a/src/game/g_main.pas +++ b/src/game/g_main.pas @@ -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; @@ -368,8 +458,10 @@ begin begin e_WriteLog('GAME.WAD not installed?', TMsgType.Fatal); {$IF DEFINED(USE_SDL2) AND NOT DEFINED(HEADLESS)} - SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 'Doom 2D Forever', 'GAME.WAD not installed?', nil); + if forceCurrentDir = false then + SDL_ShowSimpleMessageBox(SDL_MESSAGEBOX_ERROR, 'Doom 2D Forever', 'GAME.WAD not installed?', nil); {$ENDIF} + e_DeinitLog; Halt(1); end;