diff --git a/src/editor/f_main.pas b/src/editor/f_main.pas
index 9167af7bd3a34d88085e7006fc671d0d9ac12ec7..e470131554b89011bafbc09e76c5936672eb5130 100644 (file)
--- a/src/editor/f_main.pas
+++ b/src/editor/f_main.pas
unit f_main;
-{$MODE Delphi}
+{$INCLUDE ../shared/a_modes.inc}
interface
LCLIntf, LCLType, LMessages, SysUtils, Variants, Classes, Graphics,
Controls, Forms, Dialogs, ImgList, StdCtrls, Buttons,
ComCtrls, ValEdit, Types, ToolWin, Menus, ExtCtrls,
- CheckLst, Grids, OpenGLContext;
+ CheckLst, Grids, OpenGLContext, utils, UTF8Process;
type
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormResize(Sender: TObject);
procedure lbTextureListClick(Sender: TObject);
+ procedure lbTextureListDrawItem(Control: TWinControl; Index: Integer;
+ ARect: TRect; State: TOwnerDrawState);
procedure RenderPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure RenderPanelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure RenderPanelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
procedure OnIdle(Sender: TObject; var Done: Boolean);
public
procedure RefreshRecentMenu();
- { procedure lbTextureListDrawItem(Control: TWinControl; Index: Integer;
- Rect: TRect; State: TOwnerDrawState); }
end;
const
MaxLength := 3;
end;
- with ItemProps[InsertRow(_lc[I_PROP_TR_SHOT_ALLMAP], BoolNames[Data.ShotAllMap], True)] do
+ case Data.ShotAim of
+ 1: str := _lc[I_PROP_TR_SHOT_AIM_1];
+ 2: str := _lc[I_PROP_TR_SHOT_AIM_2];
+ 3: str := _lc[I_PROP_TR_SHOT_AIM_3];
+ else str := _lc[I_PROP_TR_SHOT_AIM_0];
+ end;
+ with ItemProps[InsertRow(_lc[I_PROP_TR_SHOT_AIM], str, True)-1] do
begin
EditStyle := esPickList;
ReadOnly := True;
begin
RemoveSelectFromObjects();
ClearMap();
+ LoadSky(gMapInfo.SkyName);
UndoBuffer := nil;
slInvalidTextures.Clear();
MapCheckForm.lbErrorList.Clear();
ok: Boolean;
FileName: String;
ResourceName: String;
+ UResourceName: String;
FullResourceName: String;
SectionName: String;
Data: Pointer;
end
else
begin // Внешний WAD
- FileName := EditorDir+'wads\'+aWAD;
+ FileName := EditorDir+'wads/'+aWAD;
ResourceName := aWAD+':'+SectionName+'\'+aTex;
end;
ok := True;
+ UResourceName := win2utf(ResourceName);
// Есть ли уже такая текстура:
for a := 0 to MainForm.lbTextureList.Items.Count-1 do
- if ResourceName = MainForm.lbTextureList.Items[a] then
+ if UResourceName = MainForm.lbTextureList.Items[a] then
begin
if not silent then
ErrorMessageBox(Format(_lc[I_MSG_TEXTURE_ALREADY],
- [ResourceName]));
+ [UResourceName]));
ok := False;
end;
begin
if not silent then
ErrorMessageBox(Format(_lc[I_MSG_RES_NAME_64],
- [ResourceName]));
+ [UResourceName]));
ok := False;
end;
a := -1;
if aWAD = _lc[I_WAD_SPECIAL_TEXS] then
begin
- a := MainForm.lbTextureList.Items.Add(ResourceName);
+ a := MainForm.lbTextureList.Items.Add(UResourceName);
if not silent then
SelectTexture(a);
Result := True;
GetFrame(FullResourceName, Data, FrameLen, Width, Height);
if g_CreateTextureMemorySize(Data, FrameLen, ResourceName, 0, 0, Width, Height, 1) then
- a := MainForm.lbTextureList.Items.Add(ResourceName);
+ a := MainForm.lbTextureList.Items.Add(UResourceName);
end
else // Обычная текстура
begin
if g_CreateTextureWAD(ResourceName, FullResourceName) then
- a := MainForm.lbTextureList.Items.Add(ResourceName);
+ a := MainForm.lbTextureList.Items.Add(UResourceName);
end;
if (a > -1) and (not silent) then
SelectTexture(a);
function SelectedTexture(): String;
begin
if MainForm.lbTextureList.ItemIndex <> -1 then
- Result := MainForm.lbTextureList.Items[MainForm.lbTextureList.ItemIndex]
+ Result := utf2win(MainForm.lbTextureList.Items[MainForm.lbTextureList.ItemIndex])
else
Result := '';
end;
function IsSpecialTextureSel(): Boolean;
begin
Result := (MainForm.lbTextureList.ItemIndex <> -1) and
- IsSpecialTexture(MainForm.lbTextureList.Items[MainForm.lbTextureList.ItemIndex]);
+ IsSpecialTexture(utf2win(MainForm.lbTextureList.Items[MainForm.lbTextureList.ItemIndex]));
end;
function CopyBufferToString(var CopyBuf: TCopyRecArray): String;
cfglen := 0;
wad := TWADEditor_1.Create;
- if wad.ReadFile(EditorDir+'data\Game.wad') then
+ if wad.ReadFile(EditorDir+'data/Game.wad') then
wad.GetResource('FONTS', cfgres, cfgdata, cfglen);
wad.Free();
if cfglen <> 0 then
begin
- if not g_CreateTextureWAD('FONT_STD', EditorDir+'data\Game.wad:FONTS\'+texture) then
+ if not g_CreateTextureWAD('FONT_STD', EditorDir+'data/Game.wad:FONTS\'+texture) then
e_WriteLog('ERROR ERROR ERROR', MSG_WARNING);
config := TConfig.CreateMem(cfgdata, cfglen);
OpenedMap := '';
OpenedWAD := '';
- config := TConfig.CreateFile(EditorDir+'\Editor.cfg');
+ config := TConfig.CreateFile(EditorDir+'Editor.cfg');
+ if config.ReadInt('Editor', 'XPos', -1) = -1 then
+ Position := poDesktopCenter
+ else begin
+ Left := config.ReadInt('Editor', 'XPos', Left);
+ Top := config.ReadInt('Editor', 'YPos', Top);
+ Width := config.ReadInt('Editor', 'Width', Width);
+ Height := config.ReadInt('Editor', 'Height', Height);
+ end;
if config.ReadBool('Editor', 'Maximize', False) then
WindowState := wsMaximized;
ShowMap := config.ReadBool('Editor', 'Minimap', False);
var
x, y: Integer;
a, b: Integer;
- ID: DWORD;
+ ID, PID: DWORD;
Width, Height: Word;
Rect: TRectWH;
ObjCount: Word;
if not g_GetTexture(SelectedTexture(), ID) then
g_GetTexture('NOTEXTURE', ID);
g_GetTextureSizeByID(ID, Width, Height);
- e_DrawFillQuad(RenderPanel.Width-Width-2, RenderPanel.Height-Height-2,
- RenderPanel.Width-1, RenderPanel.Height-1,
- GetRValue(PreviewColor), GetGValue(PreviewColor), GetBValue(PreviewColor), 0);
- e_Draw(ID, RenderPanel.Width-Width-1, RenderPanel.Height-Height-1, 0, True, False);
+ if g_GetTexture('PREVIEW', PID) then
+ e_DrawFill(PID, RenderPanel.Width-Width, RenderPanel.Height-Height, Width div 16 + 1, Height div 16 + 1, 0, True, False);
+ e_Draw(ID, RenderPanel.Width-Width, RenderPanel.Height-Height, 0, True, False);
end;
// Подсказка при выборе точки Телепорта:
trigger.Data.ShotPanelID := -1;
trigger.Data.ShotTarget := 0;
trigger.Data.ShotIntSight := 0;
- trigger.Data.ShotAllMap := False;
+ trigger.Data.ShotAim := TRIGGER_SHOT_AIM_DEFAULT;
trigger.Data.ShotPos.X := trigger.X-64;
trigger.Data.ShotPos.Y := trigger.Y-64;
trigger.Data.ShotAngle := 0;
config: TConfig;
i: Integer;
begin
- config := TConfig.CreateFile(EditorDir+'\Editor.cfg');
+ config := TConfig.CreateFile(EditorDir+'Editor.cfg');
+ if WindowState <> wsMaximized then
+ begin
+ config.WriteInt('Editor', 'XPos', Left);
+ config.WriteInt('Editor', 'YPos', Top);
+ config.WriteInt('Editor', 'Width', Width);
+ config.WriteInt('Editor', 'Height', Height);
+ end
+ else
+ begin
+ config.WriteInt('Editor', 'XPos', RestoredLeft);
+ config.WriteInt('Editor', 'YPos', RestoredTop);
+ config.WriteInt('Editor', 'Width', RestoredWidth);
+ config.WriteInt('Editor', 'Height', RestoredHeight);
+ end;
config.WriteBool('Editor', 'Maximize', WindowState = wsMaximized);
config.WriteBool('Editor', 'Minimap', ShowMap);
config.WriteInt('Editor', 'PanelProps', PanelProps.ClientWidth);
config.WriteStr('RecentFiles', IntToStr(i+1), '');
RecentFiles.Free();
- config.SaveFile(EditorDir+'\Editor.cfg');
+ config.SaveFile(EditorDir+'Editor.cfg');
config.Free();
slInvalidTextures.Free;
begin
AddSoundForm.OKFunction := nil;
AddSoundForm.lbResourcesList.MultiSelect := False;
- AddSoundForm.SetResource := vleObjectProperty.Cells[1, i];
+ AddSoundForm.SetResource := utf2win(vleObjectProperty.Cells[1, i]);
if (AddSoundForm.ShowModal() = mrOk) then
begin
- vleObjectProperty.Cells[1, i] := AddSoundForm.ResourceName;
+ vleObjectProperty.Cells[1, i] := win2utf(AddSoundForm.ResourceName);
bApplyProperty.Click();
end;
Exit;
end;
end;
+procedure TMainForm.lbTextureListDrawItem(Control: TWinControl; Index: Integer;
+ ARect: TRect; State: TOwnerDrawState);
+begin
+ with Control as TListBox do
+ begin
+ if LCLType.odSelected in State then
+ begin
+ Canvas.Brush.Color := clHighlight;
+ Canvas.Font.Color := clHighlightText;
+ end else
+ if (Items <> nil) and (Index >= 0) then
+ if slInvalidTextures.IndexOf(Items[Index]) > -1 then
+ begin
+ Canvas.Brush.Color := clRed;
+ Canvas.Font.Color := clWhite;
+ end;
+ Canvas.FillRect(ARect);
+ Canvas.TextRect(ARect, ARect.Left, ARect.Top, Items[Index]);
+ end;
+end;
+
procedure TMainForm.vleObjectPropertyGetPickList(Sender: TObject;
const KeyName: String; Values: TStrings);
begin
Values.Add(_lc[I_PROP_TR_SHOT_TO_5]);
Values.Add(_lc[I_PROP_TR_SHOT_TO_6]);
end
+ else if KeyName = _lc[I_PROP_TR_SHOT_AIM] then
+ begin
+ Values.Add(_lc[I_PROP_TR_SHOT_AIM_0]);
+ Values.Add(_lc[I_PROP_TR_SHOT_AIM_1]);
+ Values.Add(_lc[I_PROP_TR_SHOT_AIM_2]);
+ Values.Add(_lc[I_PROP_TR_SHOT_AIM_3]);
+ end
else if (KeyName = _lc[I_PROP_PANEL_BLEND]) or
(KeyName = _lc[I_PROP_DM_ONLY]) or
(KeyName = _lc[I_PROP_ITEM_FALLS]) or
(KeyName = _lc[I_PROP_TR_SCORE_CON]) or
(KeyName = _lc[I_PROP_TR_SCORE_MSG]) or
(KeyName = _lc[I_PROP_TR_HEALTH_MAX]) or
- (KeyName = _lc[I_PROP_TR_SHOT_ALLMAP]) or
(KeyName = _lc[I_PROP_TR_SHOT_SOUND]) or
(KeyName = _lc[I_PROP_TR_EFFECT_CENTER]) then
begin
Data.ShotTarget := 6;
Data.ShotIntSight := Min(Max(
StrToIntDef(vleObjectProperty.Values[_lc[I_PROP_TR_SHOT_SIGHT]], 0), 0), 65535);
- Data.ShotAllMap := NameToBool(vleObjectProperty.Values[_lc[I_PROP_TR_SHOT_ALLMAP]]);
+ Data.ShotAim := 0;
+ if vleObjectProperty.Values[_lc[I_PROP_TR_SHOT_AIM]] = _lc[I_PROP_TR_SHOT_AIM_1] then
+ Data.ShotAim := 1
+ else if vleObjectProperty.Values[_lc[I_PROP_TR_SHOT_AIM]] = _lc[I_PROP_TR_SHOT_AIM_2] then
+ Data.ShotAim := 2
+ else if vleObjectProperty.Values[_lc[I_PROP_TR_SHOT_AIM]] = _lc[I_PROP_TR_SHOT_AIM_3] then
+ Data.ShotAim := 3;
Data.ShotAngle := Min(
StrToIntDef(vleObjectProperty.Values[_lc[I_PROP_TR_SHOT_ANGLE]], 0), 360);
Data.ShotWait := Min(Max(
begin
Panel^.TextureID := SpecialTextureID(Panel^.TextureName);
with MainForm.lbTextureList.Items do
- if IndexOf(Panel^.TextureName) = -1 then
- Add(Panel^.TextureName);
+ if IndexOf(win2utf(Panel^.TextureName)) = -1 then
+ Add(win2utf(Panel^.TextureName));
end;
end;
begin // Выбор файла звука/музыки:
AddSoundForm.OKFunction := nil;
AddSoundForm.lbResourcesList.MultiSelect := False;
- AddSoundForm.SetResource := vleObjectProperty.Values[Key];
+ AddSoundForm.SetResource := utf2win(vleObjectProperty.Values[Key]);
if (AddSoundForm.ShowModal() = mrOk) then
begin
- vleObjectProperty.Values[Key] := AddSoundForm.ResourceName;
+ vleObjectProperty.Values[Key] := utf2win(AddSoundForm.ResourceName);
bApplyProperty.Click();
end;
end
lbTypeSelect.Items.Add(ItemToStr(ITEM_HELMET));
lbTypeSelect.Items.Add(ItemToStr(ITEM_JETPACK));
lbTypeSelect.Items.Add(ItemToStr(ITEM_INVIS));
+ lbTypeSelect.Items.Add(ItemToStr(ITEM_WEAPON_FLAMETHROWER));
+ lbTypeSelect.Items.Add(ItemToStr(ITEM_AMMO_FUELCAN));
b := StrToItem(Values[Key]);
if b >= ITEM_BOTTLE then
else gLanguage := LANGUAGE_RUSSIAN;
end;
- config := TConfig.CreateFile(EditorDir+'\Editor.cfg');
+ config := TConfig.CreateFile(EditorDir+'Editor.cfg');
config.WriteStr('Editor', 'Language', gLanguage);
- config.SaveFile(EditorDir+'\Editor.cfg');
+ config.SaveFile(EditorDir+'Editor.cfg');
config.Free();
end;
e_InitGL();
e_WriteLog('Loading data', MSG_NOTIFY);
LoadStdFont('STDTXT', 'STDFONT', gEditorFont);
+ e_WriteLog('Loading more data', MSG_NOTIFY);
LoadData();
+ e_WriteLog('Loading even more data', MSG_NOTIFY);
gDataLoaded := True;
MainForm.FormResize(nil);
end;
PreviewMode := not PreviewMode;
(Sender as TMenuItem).Checked := PreviewMode;
+
+ FormResize(Self);
end;
procedure TMainForm.miLayer1Click(Sender: TObject);
cmd, mapWAD, mapToRun: String;
opt: LongWord;
time: Integer;
- lpMsgBuf: PChar;
+ proc: TProcessUTF8;
+ res: Boolean;
begin
// Сохраняем временную карту:
time := 0;
repeat
- mapWAD := ExtractFilePath(TestD2dExe) + Format('maps\temp%.4d.wad', [time]);
+ mapWAD := ExtractFilePath(TestD2dExe) + Format('maps/temp%.4d.wad', [time]);
Inc(time);
until not FileExists(mapWAD);
mapToRun := mapWAD + ':\' + TEST_MAP_NAME;
SaveMap(mapToRun);
- mapToRun := ExtractRelativePath(ExtractFilePath(TestD2dExe) + 'maps\', mapToRun);
+ mapToRun := ExtractRelativePath(ExtractFilePath(TestD2dExe) + 'maps/', mapToRun);
// Опции игры:
opt := 32 + 64;
cmd := cmd + ' --tempdelete';
// Запускаем:
- Application.Minimize();
- if ExecuteProcess(TestD2dExe, cmd) < 0 then
+ proc := TProcessUTF8.Create(nil);
+ proc.Executable := TestD2dExe;
+ proc.Parameters.Add(cmd);
+ res := True;
+ try
+ proc.Execute();
+ except
+ res := False;
+ end;
+ if res then
+ begin
+ Application.Minimize();
+ proc.WaitOnExit();
+ end;
+ if (not res) or (proc.ExitCode < 0) then
begin
MessageBox(0, 'FIXME',
PChar(_lc[I_MSG_EXEC_ERROR]),
MB_OK or MB_ICONERROR);
end;
+ proc.Free();
SysUtils.DeleteFile(mapWAD);
Application.Restore();
end;
end;
-{
-procedure TMainForm.lbTextureListDrawItem(Control: TWinControl; Index: Integer;
- Rect: TRect; State: LCLType.TOwnerDrawState);
-begin
- with Control as TListBox do
- begin
- if LCLType.odSelected in State then
- begin
- Canvas.Brush.Color := clHighlight;
- Canvas.Font.Color := clHighlightText;
- end else
- if (Items <> nil) and (Index >= 0) then
- if slInvalidTextures.IndexOf(Items[Index]) > -1 then
- begin
- Canvas.Brush.Color := clRed;
- Canvas.Font.Color := clWhite;
- end;
- Canvas.FillRect(Rect);
- Canvas.TextRect(Rect, Rect.Left, Rect.Top, Items[Index]);
- end;
-end;
-}
end.