X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Feditor%2FEditor.lpr;h=6075985572aae62daca44d25c619d72710d335e5;hb=952e5c9c629e44e260c55f2756d72a199d8d9052;hp=647bfae8129308cbab1781174315cc8acacfec16;hpb=c3be56f2a3849cd22be39ce594498c7990e05606;p=d2df-editor.git diff --git a/src/editor/Editor.lpr b/src/editor/Editor.lpr index 647bfae..6075985 100644 --- a/src/editor/Editor.lpr +++ b/src/editor/Editor.lpr @@ -1,10 +1,13 @@ program Editor; -{$MODE Delphi} +{$INCLUDE ../shared/a_modes.inc} uses - Forms, Interfaces, - GL, GLExt, + {$IFDEF DARWIN} + MacOSAll, CocoaAll, + {$ENDIF} + Forms, Interfaces, Dialogs, + GL, GLExt, SysUtils, e_graphics in '../engine/e_graphics.pas', e_log in '../engine/e_log.pas', e_textures in '../engine/e_textures.pas', @@ -13,6 +16,8 @@ uses MAPWRITER in '../shared/MAPWRITER.pas', MAPDEF in '../shared/MAPDEF.pas', WADEDITOR in '../shared/WADEDITOR.pas', + WADEDITOR_dfwad in '../shared/WADEDITOR_dfwad.pas', + WADEDITOR_dfzip in '../shared/WADEDITOR_dfzip.pas', WADSTRUCT in '../shared/WADSTRUCT.pas', CONFIG in '../shared/CONFIG.pas', f_about in 'f_about.pas' {AboutForm}, @@ -35,22 +40,208 @@ uses spectrum in 'spectrum.pas', f_saveminimap in 'f_saveminimap.pas' {SaveMiniMapForm}, f_packmap in 'f_packmap.pas' {PackMapForm}, - f_maptest in 'f_maptest.pas' {MapTestForm}, f_choosetype in 'f_choosetype.pas' {ChooseTypeForm}, +{$IFNDEF NOSOUND} fmod, fmoderrors, fmodpresets, fmodtypes, +{$ENDIF} ImagingTypes, Imaging, ImagingUtility, - g_language in 'g_language.pas', - f_selectlang in 'f_selectlang.pas' {SelectLanguageForm}; + g_options in 'g_options.pas', + g_language in 'g_language.pas'; -{$R *.res} +{$IFDEF WINDOWS} + {$R *.res} +{$ENDIF} + + type + THandlerObject = class (TObject) + procedure ExceptionHandler (Sender: TObject; e: Exception); + end; + + var + LogFileName: AnsiString = ''; + ParamFileIndex: Integer = 1; + +{$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 THandlerObject.ExceptionHandler (Sender: TObject; e: Exception); + begin + e_WriteStackTrace(e.message); + MessageDlg('Unhandled exception: ' + e.message + ' (see Editor.log for more information)', mtError, [mbOK], 0); + end; + + procedure CheckParamOptions; + var i: Integer; p: AnsiString; + begin + i := 1; + while (i <= ParamCount) and (Length(ParamStr(i)) > 0) and (ParamStr(i)[1] = '-') do + begin + p := ParamStr(i); + if p = '--log-file' then + begin + if i + 1 <= ParamCount then + begin + Inc(i); + LogFileName := ParamStr(i); + end; + end + else if p = '--config' then + begin + if i + 1 <= ParamCount then + begin + Inc(i); + CfgFileName := ParamStr(i); + end; + end + else if p = '--game-wad' then + begin + if i + 1 <= ParamCount then + begin + Inc(i); + GameWad := ParamStr(i); + end; + end + else if p = '--editor-wad' then + begin + if i + 1 <= ParamCount then + begin + Inc(i); + EditorWad := ParamStr(i); + end; + end + else if p = '--wads-dir' then + begin + if i + 1 <= ParamCount then + begin + Inc(i); + WadsDir := ParamStr(i); + end; + end + else if p = '--lang-dir' then + begin + if i + 1 <= ParamCount then + begin + Inc(i); + LangDir := ParamStr(i); + end; + end; + Inc(i); + end; + ParamFileIndex := i; + end; + + procedure CheckParamFiles; + var i: Integer; + begin + i := ParamFileIndex; + if i <= ParamCount then + StartMap := ParamStr(i); + end; + + procedure InitPathes; + {$IFDEF DARWIN} + var BundlePath, DFPath, DocPath: AnsiString; ns: NSString; + var ApplicationSupportDirs, DocumentDirs: NSArray; + var count: Integer; + {$ELSE} + var EditorDir: AnsiString; + {$ENDIF} + begin + {$IFDEF DARWIN} + BundlePath := GetBundlePath(); + ApplicationSupportDirs := NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, true); + count := ApplicationSupportDirs.count; + ns := ApplicationSupportDirs.objectAtIndex(count - 1); + DFPath := NSStringToAnsiString(ns) + DirectorySeparator + 'Doom 2D Forever'; + DocumentDirs := NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, true); + count := DocumentDirs.count; + ns := DocumentDirs.objectAtIndex(count - 1); + DocPath := NSStringToAnsiString(ns) + DirectorySeparator + 'Doom 2D Forever'; + GameExeFile := 'Doom 2D Forever.app'; + CfgFileName := DFPath + DirectorySeparator + 'Editor.cfg'; + LogFileName := DFPath + DirectorySeparator + 'Editor.log'; + MapsDir := DocPath + DirectorySeparator + 'Maps'; + WadsDir := BundlePath + DirectorySeparator + 'Contents' + DirectorySeparator + 'Resources' + DirectorySeparator + 'wads'; + LangDIr := BundlePath + DirectorySeparator + 'Contents' + DirectorySeparator + 'Resources' + DirectorySeparator + 'data' + DirectorySeparator + 'lang'; + GameWad := BundlePath + DirectorySeparator + 'Contents' + DirectorySeparator + 'Resources' + DirectorySeparator + 'data' + DirectorySeparator + 'game.wad'; + EditorWad := BundlePath + DirectorySeparator + 'Contents' + DirectorySeparator + 'Resources' + DirectorySeparator + 'data' + DirectorySeparator + 'editor.wad'; + {$ELSE} + EditorDir := ExtractFilePath(Application.ExeName); + {$IFDEF WINDOWS} + GameExeFile := 'Doom2DF.exe'; + {$ELSE} + GameExeFile := 'Doom2DF'; + {$ENDIF} + CfgFileName := EditorDir + DirectorySeparator + 'Editor.cfg'; + LogFileName := EditorDir + DirectorySeparator + 'Editor.log'; + MapsDir := EditorDir + DirectorySeparator + 'maps'; + WadsDir := EditorDir + DirectorySeparator + 'wads'; + LangDir := EditorDir + DirectorySeparator + 'data' + DirectorySeparator + 'lang'; + GameWad := EditorDir + DirectorySeparator + 'data' + DirectorySeparator + 'game.wad'; + EditorWad := EditorDir + DirectorySeparator + 'data' + DirectorySeparator + 'editor.wad'; + {$ENDIF} + ForceDirectories(MapsDir); + ForceDirectories(WadsDir); + end; + + procedure InitLogs; + begin + e_InitLog(LogFileName, WM_NEWFILE); + + {$IF DECLARED(UseHeapTrace)} + (* http://wiki.freepascal.org/heaptrc *) + GlobalSkipIfNoLeaks := True; + //SetHeapTraceOutput('EditorLeaks.log'); + //HaltOnError := False; + {$ENDIF} + + e_WriteLog('Used file pathes:', MSG_NOTIFY); + e_WriteLog(' GameExeFile = ' + GameExeFile, MSG_NOTIFY); + e_WriteLog(' CfgFileName = ' + CfgFileName, MSG_NOTIFY); + e_WriteLog(' LogFileName = ' + LogFileName, MSG_NOTIFY); + e_WriteLog(' MapsDir = ' + MapsDir, MSG_NOTIFY); + e_WriteLog(' WadsDir = ' + WadsDir, MSG_NOTIFY); + e_WriteLog(' LangDir = ' + LangDir, MSG_NOTIFY); + e_WriteLog(' GameWad = ' + GameWad, MSG_NOTIFY); + e_WriteLog(' EditorWad = ' + EditorWad, MSG_NOTIFY); + end; begin - Application.Initialize; + Application.ExceptionDialog := aedOkMessageBox; + Application.AddOnExceptionHandler(THandlerObject.ExceptionHandler, True); + Application.Initialize(); + {$IFDEF DARWIN} + // Disable icons in menu on OSX by default + Application.ShowMenuGlyphs := sbgNever; + {$ENDIF} + + InitPathes; + CheckParamOptions; + InitLogs; + Application.CreateForm(TMainForm, MainForm); Application.CreateForm(TOptionsForm, OptionsForm); Application.CreateForm(TAboutForm, AboutForm); @@ -67,10 +258,11 @@ begin Application.CreateForm(TAddSoundForm, AddSoundForm); Application.CreateForm(TSaveMiniMapForm, SaveMiniMapForm); Application.CreateForm(TPackMapForm, PackMapForm); - Application.CreateForm(TMapTestForm, MapTestForm); Application.CreateForm(TChooseTypeForm, ChooseTypeForm); - Application.CreateForm(TSelectLanguageForm, SelectLanguageForm); - if ParamStr(1) <> '' then OpenMap(ParamStr(1), ''); - Application.Run; + g_Language_Set(gLanguage); + + CheckParamFiles; + + Application.Run(); end.