X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Feditor%2Ff_main.pas;h=8e7636043b89a072bdfdfa1cd2d85ae889c16f4f;hb=1478a411d9959a016392bb83b6e2260360159758;hp=1d1d2ce5da316808b4db68c1e3fb168ed1ac12f8;hpb=53ee9bbf75ec69253d01f1b073ab2a82476cea7e;p=d2df-editor.git diff --git a/src/editor/f_main.pas b/src/editor/f_main.pas index 1d1d2ce..8e76360 100644 --- a/src/editor/f_main.pas +++ b/src/editor/f_main.pas @@ -124,6 +124,7 @@ type // Панель применения свойств: PanelPropApply: TPanel; bApplyProperty: TButton; + MapTestTimer: TTimer; // Редактор свойств объектов: vleObjectProperty: TValueListEditor; @@ -218,6 +219,7 @@ type procedure RenderPanelPaint(Sender: TObject); procedure RenderPanelResize(Sender: TObject); procedure Splitter1Moved(Sender: TObject); + procedure MapTestCheck(Sender: TObject); procedure vleObjectPropertyEditButtonClick(Sender: TObject); procedure vleObjectPropertyApply(Sender: TObject); procedure vleObjectPropertyGetPickList(Sender: TObject; const KeyName: String; Values: TStrings); @@ -286,7 +288,7 @@ const var MainForm: TMainForm; - EditorDir: String; + StartMap: String; OpenedMap: String; OpenedWAD: String; @@ -341,7 +343,7 @@ uses MAPREADER, f_selectmap, f_savemap, WADEDITOR, MAPDEF, g_map, f_saveminimap, f_addresource, CONFIG, f_packmap, f_addresource_sound, f_maptest, f_choosetype, - g_language, f_selectlang, ClipBrd, g_resources; + g_language, f_selectlang, ClipBrd, g_resources, g_options; const UNDO_DELETE_PANEL = 1; @@ -457,6 +459,8 @@ var UndoBuffer: Array of Array of TUndoRec = nil; + MapTestProcess: TProcessUTF8; + MapTestFile: String; {$R *.lfm} @@ -1839,7 +1843,7 @@ end; procedure ErrorMessageBox(str: String); begin - MessageBox(0, PChar(str), PChar(_lc[I_MSG_ERROR]), + Application.MessageBox(PChar(str), PChar(_lc[I_MSG_ERROR]), MB_ICONINFORMATION or MB_OK or MB_DEFBUTTON1); end; @@ -1930,7 +1934,6 @@ begin if aWAD = _lc[I_WAD_SPECIAL_MAP] then begin // Файл карты g_ProcessResourceStr(OpenedMap, @fn, nil, nil); - //FileName := EditorDir+'maps\'+ExtractFileName(fn); FileName := fn; ResourceName := ':'+SectionName+'\'+aTex; end @@ -1942,7 +1945,7 @@ begin end else begin // Внешний WAD - FileName := EditorDir+'wads/'+aWAD; + FileName := WadsDir + DirectorySeparator + aWAD; ResourceName := aWAD+':'+SectionName+'\'+aTex; end; @@ -2594,7 +2597,7 @@ begin s := g_ExtractFilePathName(RecentFiles[n]); OpenMap(fn, s) end - else if MessageBox(0, PChar(_lc[I_MSG_DEL_RECENT_PROMT]), PChar(_lc[I_MSG_DEL_RECENT]), MB_ICONQUESTION or MB_YESNO) = idYes then + else if Application.MessageBox(PChar(_lc[I_MSG_DEL_RECENT_PROMT]), PChar(_lc[I_MSG_DEL_RECENT]), MB_ICONQUESTION or MB_YESNO) = idYes then begin RecentFiles.Delete(n); RefreshRecentMenu(); @@ -2617,10 +2620,10 @@ var config: TConfig; begin ID := 0; - g_ReadResource(EditorDir + 'data/game.wad', 'FONTS', cfgres, cfgdata, cfglen); + g_ReadResource(GameWad, 'FONTS', cfgres, cfgdata, cfglen); if cfgdata <> nil then begin - if not g_CreateTextureWAD('FONT_STD', EditorDir + 'data/game.wad:FONTS\' + texture) then + if not g_CreateTextureWAD('FONT_STD', GameWad + ':FONTS\' + texture) then e_WriteLog('ERROR ERROR ERROR', MSG_WARNING); config := TConfig.CreateMem(cfgdata, cfglen); @@ -2648,9 +2651,6 @@ var begin Randomize(); - EditorDir := ExtractFilePath(Application.ExeName); - - e_InitLog(EditorDir+'Editor.log', WM_NEWFILE); e_WriteLog('Doom 2D: Forever Editor version ' + EDITOR_VERSION, MSG_NOTIFY); e_WriteLog('Build date: ' + EDITOR_BUILDDATE + ' ' + EDITOR_BUILDTIME, MSG_NOTIFY); e_WriteLog('Build hash: ' + g_GetBuildHash(), MSG_NOTIFY); @@ -2674,7 +2674,7 @@ begin OpenedMap := ''; OpenedWAD := ''; - config := TConfig.CreateFile(EditorDir+'Editor.cfg'); + config := TConfig.CreateFile(CfgFileName); if config.ReadInt('Editor', 'XPos', -1) = -1 then Position := poDesktopCenter @@ -2729,8 +2729,8 @@ begin DotSize := 2 else DotSize := 1; - OpenDialog.InitialDir := config.ReadStr('Editor', 'LastOpenDir', EditorDir); - SaveDialog.InitialDir := config.ReadStr('Editor', 'LastSaveDir', EditorDir); + OpenDialog.InitialDir := config.ReadStr('Editor', 'LastOpenDir', MapsDir); + SaveDialog.InitialDir := config.ReadStr('Editor', 'LastSaveDir', MapsDir); s := config.ReadStr('Editor', 'Language', ''); gLanguage := s; @@ -4223,7 +4223,7 @@ end; procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin - CanClose := MessageBox(0, PChar(_lc[I_MSG_EXIT_PROMT]), + CanClose := Application.MessageBox(PChar(_lc[I_MSG_EXIT_PROMT]), PChar(_lc[I_MSG_EXIT]), MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON1) = idYes; @@ -4239,7 +4239,7 @@ var config: TConfig; i: Integer; begin - config := TConfig.CreateFile(EditorDir+'Editor.cfg'); + config := TConfig.CreateFile(CfgFileName); if WindowState <> wsMaximized then begin @@ -4278,7 +4278,7 @@ begin config.WriteStr('RecentFiles', IntToStr(i+1), ''); RecentFiles.Free(); - config.SaveFile(EditorDir+'Editor.cfg'); + config.SaveFile(CfgFileName); config.Free(); slInvalidTextures.Free; @@ -4304,6 +4304,22 @@ begin FormResize(Sender); end; +procedure TMainForm.MapTestCheck(Sender: TObject); +begin + if MapTestProcess <> nil then + begin + if MapTestProcess.Running = false then + begin + if MapTestProcess.ExitCode <> 0 then + Application.MessageBox(PChar(_lc[I_MSG_EXEC_ERROR]), 'FIXME', MB_OK or MB_ICONERROR); + SysUtils.DeleteFile(MapTestFile); + MapTestFile := ''; + FreeAndNil(MapTestProcess); + tbTestMap.Enabled := True; + end; + end; +end; + procedure TMainForm.aMapOptionsExecute(Sender: TObject); var ResName: String; @@ -4725,7 +4741,7 @@ begin if OpenedMap = '' then Exit; - if MessageBox(0, PChar(_lc[I_MSG_REOPEN_MAP_PROMT]), + if Application.MessageBox(PChar(_lc[I_MSG_REOPEN_MAP_PROMT]), PChar(_lc[I_MENU_FILE_REOPEN]), MB_ICONQUESTION or MB_YESNO) <> idYes then Exit; @@ -5355,7 +5371,7 @@ begin if i = -1 then Exit; - if MessageBox(0, PChar(Format(_lc[I_MSG_DEL_TEXTURE_PROMT], + if Application.MessageBox(PChar(Format(_lc[I_MSG_DEL_TEXTURE_PROMT], [SelectedTexture()])), PChar(_lc[I_MSG_DEL_TEXTURE]), MB_ICONQUESTION or MB_YESNO or @@ -5381,10 +5397,7 @@ end; procedure TMainForm.aNewMapExecute(Sender: TObject); begin - if (MessageBox(0, PChar(_lc[I_MSG_CLEAR_MAP_PROMT]), - PChar(_lc[I_MSG_CLEAR_MAP]), - MB_ICONQUESTION or MB_YESNO or - MB_DEFBUTTON1) = mrYes) then + if Application.MessageBox(PChar(_lc[I_MSG_CLEAR_MAP_PROMT]), PChar(_lc[I_MSG_CLEAR_MAP]), MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON1) = mrYes then FullClear(); end; @@ -6228,17 +6241,18 @@ begin MainForm.ActiveControl := RenderPanel; // Язык: - if gLanguage = '' then + if (gLanguage = '') and not (fsModal in SelectLanguageForm.FormState) then begin lang := SelectLanguageForm.ShowModal(); case lang of 1: gLanguage := LANGUAGE_ENGLISH; - else gLanguage := LANGUAGE_RUSSIAN; + 2: gLanguage := LANGUAGE_RUSSIAN; + else gLanguage := LANGUAGE_ENGLISH; end; - config := TConfig.CreateFile(EditorDir+'Editor.cfg'); + config := TConfig.CreateFile(CfgFileName); config.WriteStr('Editor', 'Language', gLanguage); - config.SaveFile(EditorDir+'Editor.cfg'); + config.SaveFile(CfgFileName); config.Free(); end; @@ -6267,18 +6281,17 @@ begin Exit; MapName := SelectMapForm.lbMapList.Items[SelectMapForm.lbMapList.ItemIndex]; - if MessageBox(0, PChar(Format(_lc[I_MSG_DELETE_MAP_PROMT], [MapName, OpenDialog.FileName])), PChar(_lc[I_MSG_DELETE_MAP]), MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) <> mrYes then + if Application.MessageBox(PChar(Format(_lc[I_MSG_DELETE_MAP_PROMT], [MapName, OpenDialog.FileName])), PChar(_lc[I_MSG_DELETE_MAP]), MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) <> mrYes then Exit; g_DeleteResource(FileName, '', MapName, res); if res <> 0 then begin - MessageBox(0, PChar('Cant delete map res=' + IntToStr(res)), PChar('Map not deleted!'), MB_ICONINFORMATION or MB_OK or MB_DEFBUTTON1); + Application.MessageBox(PChar('Cant delete map res=' + IntToStr(res)), PChar('Map not deleted!'), MB_ICONINFORMATION or MB_OK or MB_DEFBUTTON1); Exit end; - MessageBox( - 0, + Application.MessageBox( PChar(Format(_lc[I_MSG_MAP_DELETED_PROMT], [MapName])), PChar(_lc[I_MSG_MAP_DELETED]), MB_ICONINFORMATION or MB_OK or MB_DEFBUTTON1 @@ -6516,6 +6529,7 @@ begin end; procedure TMainForm.OnIdle(Sender: TObject; var Done: Boolean); + var f: AnsiString; begin // FIXME: this is a shitty hack if not gDataLoaded then @@ -6531,6 +6545,12 @@ begin MainForm.FormResize(nil); end; Draw(); + if StartMap <> '' then + begin + f := StartMap; + StartMap := ''; + OpenMap(f, ''); + end; end; procedure TMainForm.miMapPreviewClick(Sender: TObject); @@ -6739,10 +6759,14 @@ var proc: TProcessUTF8; res: Boolean; begin + // Ignore while map testing in progress + if MapTestProcess <> nil then + Exit; + // Сохраняем временную карту: time := 0; repeat - newWAD := ExtractFilePath(TestD2dExe) + Format('maps/temp%.4d', [time]); + newWAD := Format('%s/temp%.4d', [MapsDir, time]); Inc(time); until not FileExists(newWAD); if OpenedMap <> '' then @@ -6758,7 +6782,6 @@ begin end; tempMap := newWAD + ':\' + TEST_MAP_NAME; SaveMap(tempMap); - tempMap := ExtractRelativePath(ExtractFilePath(TestD2dExe) + 'maps/', tempMap); // Опции игры: opt := 32 + 64; @@ -6776,6 +6799,11 @@ begin // Запускаем: proc := TProcessUTF8.Create(nil); proc.Executable := TestD2dExe; + {$IFDEF DARWIN} + // TODO: get real executable name from Info.plist + if LowerCase(ExtractFileExt(TestD2dExe)) = '.app' then + proc.Executable := TestD2dExe + DirectorySeparator + 'Contents' + DirectorySeparator + 'MacOS' + DirectorySeparator + 'Doom2DF'; + {$ENDIF} proc.Parameters.Add('-map'); proc.Parameters.Add(tempMap); proc.Parameters.Add('-gm'); @@ -6802,19 +6830,16 @@ begin end; if res then begin - Application.Minimize(); - proc.WaitOnExit(); - end; - if (not res) or (proc.ExitCode < 0) then + tbTestMap.Enabled := False; + MapTestFile := newWAD; + MapTestProcess := proc; + end + else begin - MessageBox(0, 'FIXME', - PChar(_lc[I_MSG_EXEC_ERROR]), - MB_OK or MB_ICONERROR); + Application.MessageBox(PChar(_lc[I_MSG_EXEC_ERROR]), 'FIXME', MB_OK or MB_ICONERROR); + SysUtils.DeleteFile(newWAD); + proc.Free(); end; - proc.Free(); - - SysUtils.DeleteFile(newWAD); - Application.Restore(); end; procedure TMainForm.sbVerticalScroll(Sender: TObject;