diff --git a/src/editor/f_main.pas b/src/editor/f_main.pas
index a63b81e0b75abf83576ca7c4b60416b2253ef72b..2b9ddee5a2a3f6a26c8311f6984b84d4655e3836 100644 (file)
--- a/src/editor/f_main.pas
+++ b/src/editor/f_main.pas
unit f_main;
unit f_main;
-{$MODE Delphi}
+{$INCLUDE ../shared/a_modes.inc}
interface
uses
interface
uses
- LCLIntf, LCLType, LMessages, SysUtils, Variants, Classes, Graphics,
- Controls, Forms, Dialogs, ImgList, StdCtrls, Buttons,
- ComCtrls, ValEdit, Types, ToolWin, Menus, ExtCtrls,
- CheckLst, Grids, OpenGLContext;
+ LCLIntf, LCLType, SysUtils, Variants, Classes, Graphics,
+ Controls, Forms, Dialogs, StdCtrls, Buttons,
+ ComCtrls, ValEdit, Types, Menus, ExtCtrls,
+ CheckLst, Grids, OpenGLContext, utils, UTF8Process;
type
type
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormResize(Sender: TObject);
procedure lbTextureListClick(Sender: TObject);
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 RenderPanelPaint(Sender: TObject);
procedure RenderPanelResize(Sender: TObject);
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 RenderPanelPaint(Sender: TObject);
procedure RenderPanelResize(Sender: TObject);
+ procedure Splitter1Moved(Sender: TObject);
procedure vleObjectPropertyEditButtonClick(Sender: TObject);
procedure vleObjectPropertyEditButtonClick(Sender: TObject);
+ procedure vleObjectPropertyApply(Sender: TObject);
procedure vleObjectPropertyGetPickList(Sender: TObject; const KeyName: String; Values: TStrings);
procedure vleObjectPropertyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure vleObjectPropertyGetPickList(Sender: TObject; const KeyName: String; Values: TStrings);
procedure vleObjectPropertyKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure OnIdle(Sender: TObject; var Done: Boolean);
public
procedure RefreshRecentMenu();
procedure OnIdle(Sender: TObject; var Done: Boolean);
public
procedure RefreshRecentMenu();
- { procedure lbTextureListDrawItem(Control: TWinControl; Index: Integer;
- Rect: TRect; State: TOwnerDrawState); }
end;
const
end;
const
implementation
uses
implementation
uses
- f_options, e_graphics, e_log, GL, GLExt, Math,
+ f_options, e_graphics, e_log, GL, Math,
f_mapoptions, g_basic, f_about, f_mapoptimization,
f_mapcheck, f_addresource_texture, g_textures,
f_mapoptions, g_basic, f_about, f_mapoptimization,
f_mapcheck, f_addresource_texture, g_textures,
- f_activationtype, f_keys, MAPWRITER, MAPSTRUCT,
+ f_activationtype, f_keys,
MAPREADER, f_selectmap, f_savemap, WADEDITOR, WADSTRUCT, MAPDEF,
g_map, f_saveminimap, f_addresource, CONFIG, f_packmap,
f_addresource_sound, f_maptest, f_choosetype,
MAPREADER, f_selectmap, f_savemap, WADEDITOR, WADSTRUCT, MAPDEF,
g_map, f_saveminimap, f_addresource, CONFIG, f_packmap,
f_addresource_sound, f_maptest, f_choosetype,
case TriggerType of
TRIGGER_EXIT:
begin
case TriggerType of
TRIGGER_EXIT:
begin
- with ItemProps[InsertRow(_lc[I_PROP_TR_NEXT_MAP], Data.MapName, True)] do
+ str := win2utf(Data.MapName);
+ with ItemProps[InsertRow(_lc[I_PROP_TR_NEXT_MAP], str, True)] do
begin
EditStyle := esEllipsis;
ReadOnly := True;
begin
EditStyle := esEllipsis;
ReadOnly := True;
TRIGGER_SOUND:
begin
TRIGGER_SOUND:
begin
- with ItemProps[InsertRow(_lc[I_PROP_TR_SOUND_NAME], Data.SoundName, True)] do
+ str := win2utf(Data.SoundName);
+ with ItemProps[InsertRow(_lc[I_PROP_TR_SOUND_NAME], str, True)] do
begin
EditStyle := esEllipsis;
ReadOnly := True;
begin
EditStyle := esEllipsis;
ReadOnly := True;
TRIGGER_MUSIC:
begin
TRIGGER_MUSIC:
begin
- with ItemProps[InsertRow(_lc[I_PROP_TR_MUSIC_NAME], Data.MusicName, True)] do
+ str := win2utf(Data.MusicName);
+ with ItemProps[InsertRow(_lc[I_PROP_TR_MUSIC_NAME], str, True)] do
begin
EditStyle := esEllipsis;
ReadOnly := True;
begin
EditStyle := esEllipsis;
ReadOnly := True;
EditStyle := esPickList;
ReadOnly := True;
end;
EditStyle := esPickList;
ReadOnly := True;
end;
- with ItemProps[InsertRow(_lc[I_PROP_TR_MESSAGE_TEXT], Data.MessageText, True)] do
+ str := win2utf(Data.MessageText);
+ with ItemProps[InsertRow(_lc[I_PROP_TR_MESSAGE_TEXT], str, True)] do
begin
EditStyle := esSimple;
MaxLength := 100;
begin
EditStyle := esSimple;
MaxLength := 100;
MaxLength := 3;
end;
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
EditStyle := esPickList;
ReadOnly := True;
begin
RemoveSelectFromObjects();
ClearMap();
begin
RemoveSelectFromObjects();
ClearMap();
+ LoadSky(gMapInfo.SkyName);
UndoBuffer := nil;
slInvalidTextures.Clear();
MapCheckForm.lbErrorList.Clear();
UndoBuffer := nil;
slInvalidTextures.Clear();
MapCheckForm.lbErrorList.Clear();
Width, Height: Word;
fn: String;
begin
Width, Height: Word;
fn: String;
begin
+ Data := nil;
+ FrameLen := 0;
+ Width := 0;
+ Height := 0;
+
if aSection = '..' then
SectionName := ''
else
if aSection = '..' then
SectionName := ''
else
end
else
begin // Внешний WAD
end
else
begin // Внешний WAD
- FileName := EditorDir+'wads\'+aWAD;
+ FileName := EditorDir+'wads/'+aWAD;
ResourceName := aWAD+':'+SectionName+'\'+aTex;
end;
ResourceName := aWAD+':'+SectionName+'\'+aTex;
end;
var
n, pw: Integer;
s, fn: String;
var
n, pw: Integer;
s, fn: String;
+ b: Boolean;
begin
s := LowerCase((Sender as TMenuItem).Caption);
Delete(s, Pos('&', s), 1);
begin
s := LowerCase((Sender as TMenuItem).Caption);
Delete(s, Pos('&', s), 1);
s := RecentFiles[n];
pw := Pos('.wad:\', LowerCase(s));
s := RecentFiles[n];
pw := Pos('.wad:\', LowerCase(s));
+ b := False;
if pw > 0 then
begin // Map name included
fn := Copy(s, 1, pw + 3);
Delete(s, 1, pw + 5);
if (FileExists(fn)) then
if pw > 0 then
begin // Map name included
fn := Copy(s, 1, pw + 3);
Delete(s, 1, pw + 5);
if (FileExists(fn)) then
+ begin
OpenMap(fn, s);
OpenMap(fn, s);
+ b := True;
+ end;
end
else // Only wad name
if (FileExists(s)) then
end
else // Only wad name
if (FileExists(s)) then
+ begin
OpenMap(s, '');
OpenMap(s, '');
+ b := True;
+ end;
+
+ if (not b) and (MessageBox(0, 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();
+ end;
end;
procedure TMainForm.aEditorOptionsExecute(Sender: TObject);
end;
procedure TMainForm.aEditorOptionsExecute(Sender: TObject);
cfglen: Integer;
config: TConfig;
begin
cfglen: Integer;
config: TConfig;
begin
+ cfgdata := nil;
cfglen := 0;
cfglen := 0;
+ ID := 0;
wad := TWADEditor_1.Create;
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
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);
e_WriteLog('ERROR ERROR ERROR', MSG_WARNING);
config := TConfig.CreateMem(cfgdata, cfglen);
OpenedMap := '';
OpenedWAD := '';
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);
if config.ReadBool('Editor', 'Maximize', False) then
WindowState := wsMaximized;
ShowMap := config.ReadBool('Editor', 'Minimap', False);
ObjCount: Word;
aX, aY, aX2, aY2, XX, ScaleSz: Integer;
begin
ObjCount: Word;
aX, aY, aX2, aY2, XX, ScaleSz: Integer;
begin
+ ID := 0;
+ PID := 0;
+ Width := 0;
+ Height := 0;
+
e_BeginRender();
e_Clear(GL_COLOR_BUFFER_BIT,
e_BeginRender();
e_Clear(GL_COLOR_BUFFER_BIT,
trigger.Data.ShotPanelID := -1;
trigger.Data.ShotTarget := 0;
trigger.Data.ShotIntSight := 0;
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;
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;
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.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.WriteStr('RecentFiles', IntToStr(i+1), '');
RecentFiles.Free();
- config.SaveFile(EditorDir+'\Editor.cfg');
+ config.SaveFile(EditorDir+'Editor.cfg');
config.Free();
slInvalidTextures.Free;
config.Free();
slInvalidTextures.Free;
MainForm.Resize();
end;
MainForm.Resize();
end;
+procedure TMainForm.Splitter1Moved(Sender: TObject);
+begin
+ FormResize(Sender);
+end;
+
procedure TMainForm.aMapOptionsExecute(Sender: TObject);
var
ResName: String;
procedure TMainForm.aMapOptionsExecute(Sender: TObject);
var
ResName: String;
DrawPressRect := False;
Exit;
end;
DrawPressRect := False;
Exit;
end;
+ i := -1;
// Выбор области воздействия, в зависимости от типа триггера
vleObjectProperty.FindRow(_lc[I_PROP_TR_EX_AREA], i);
// Выбор области воздействия, в зависимости от типа триггера
vleObjectProperty.FindRow(_lc[I_PROP_TR_EX_AREA], i);
TextureID: DWORD;
TextureWidth, TextureHeight: Word;
begin
TextureID: DWORD;
TextureWidth, TextureHeight: Word;
begin
+ TextureID := 0;
+ TextureWidth := 0;
+ TextureHeight := 0;
if (lbTextureList.ItemIndex <> -1) and
(not IsSpecialTextureSel()) then
begin
if (lbTextureList.ItemIndex <> -1) and
(not IsSpecialTextureSel()) then
begin
end;
end;
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
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
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
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_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
(KeyName = _lc[I_PROP_TR_SHOT_SOUND]) or
(KeyName = _lc[I_PROP_TR_EFFECT_CENTER]) then
begin
NoTextureID: DWORD;
NW, NH: Word;
begin
NoTextureID: DWORD;
NW, NH: Word;
begin
+ NoTextureID := 0;
+ NW := 0;
+ NH := 0;
+
if SelectedObjectCount() <> 1 then
Exit;
if not SelectedObjects[GetFirstSelected()].Live then
if SelectedObjectCount() <> 1 then
Exit;
if not SelectedObjects[GetFirstSelected()].Live then
case TriggerType of
TRIGGER_EXIT:
begin
case TriggerType of
TRIGGER_EXIT:
begin
- s := vleObjectProperty.Values[_lc[I_PROP_TR_NEXT_MAP]];
+ s := utf2win(vleObjectProperty.Values[_lc[I_PROP_TR_NEXT_MAP]]);
FillByte(Data.MapName[0], 16, 0);
if s <> '' then
FillByte(Data.MapName[0], 16, 0);
if s <> '' then
- Move(Data.MapName[0], s[1], Min(Length(s), 16));
+ Move(s[1], Data.MapName[0], Min(Length(s), 16));
end;
TRIGGER_TEXTURE:
end;
TRIGGER_TEXTURE:
TRIGGER_SOUND:
begin
TRIGGER_SOUND:
begin
- s := vleObjectProperty.Values[_lc[I_PROP_TR_SOUND_NAME]];
+ s := utf2win(vleObjectProperty.Values[_lc[I_PROP_TR_SOUND_NAME]]);
FillByte(Data.SoundName[0], 64, 0);
if s <> '' then
FillByte(Data.SoundName[0], 64, 0);
if s <> '' then
- Move(Data.SoundName[0], s[1], Min(Length(s), 64));
+ Move(s[1], Data.SoundName[0], Min(Length(s), 64));
Data.Volume := Min(StrToIntDef(vleObjectProperty.Values[_lc[I_PROP_TR_SOUND_VOLUME]], 0), 255);
Data.Pan := Min(StrToIntDef(vleObjectProperty.Values[_lc[I_PROP_TR_SOUND_PAN]], 0), 255);
Data.Volume := Min(StrToIntDef(vleObjectProperty.Values[_lc[I_PROP_TR_SOUND_VOLUME]], 0), 255);
Data.Pan := Min(StrToIntDef(vleObjectProperty.Values[_lc[I_PROP_TR_SOUND_PAN]], 0), 255);
TRIGGER_MUSIC:
begin
TRIGGER_MUSIC:
begin
- s := vleObjectProperty.Values[_lc[I_PROP_TR_MUSIC_NAME]];
+ s := utf2win(vleObjectProperty.Values[_lc[I_PROP_TR_MUSIC_NAME]]);
FillByte(Data.MusicName[0], 64, 0);
if s <> '' then
FillByte(Data.MusicName[0], 64, 0);
if s <> '' then
- Move(Data.MusicName[0], s[1], Min(Length(s), 64));
+ Move(s[1], Data.MusicName[0], Min(Length(s), 64));
if vleObjectProperty.Values[_lc[I_PROP_TR_MUSIC_ACT]] = _lc[I_PROP_TR_MUSIC_ON] then
Data.MusicAction := 1
if vleObjectProperty.Values[_lc[I_PROP_TR_MUSIC_ACT]] = _lc[I_PROP_TR_MUSIC_ON] then
Data.MusicAction := 1
else if vleObjectProperty.Values[_lc[I_PROP_TR_MESSAGE_TO]] = _lc[I_PROP_TR_MESSAGE_TO_5] then
Data.MessageSendTo := 5;
else if vleObjectProperty.Values[_lc[I_PROP_TR_MESSAGE_TO]] = _lc[I_PROP_TR_MESSAGE_TO_5] then
Data.MessageSendTo := 5;
- s := vleObjectProperty.Values[_lc[I_PROP_TR_MESSAGE_TEXT]];
+ s := utf2win(vleObjectProperty.Values[_lc[I_PROP_TR_MESSAGE_TEXT]]);
FillByte(Data.MessageText[0], 100, 0);
if s <> '' then
FillByte(Data.MessageText[0], 100, 0);
if s <> '' then
- Move(Data.MessageText[0], s[1], Min(Length(s), 100));
+ Move(s[1], Data.MessageText[0], Min(Length(s), 100));
Data.MessageTime := Min(Max(
StrToIntDef(vleObjectProperty.Values[_lc[I_PROP_TR_MESSAGE_TIME]], 0), 0), 65535);
Data.MessageTime := Min(Max(
StrToIntDef(vleObjectProperty.Values[_lc[I_PROP_TR_MESSAGE_TIME]], 0), 0), 65535);
Data.ShotTarget := 6;
Data.ShotIntSight := Min(Max(
StrToIntDef(vleObjectProperty.Values[_lc[I_PROP_TR_SHOT_SIGHT]], 0), 0), 65535);
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(
Data.ShotAngle := Min(
StrToIntDef(vleObjectProperty.Values[_lc[I_PROP_TR_SHOT_ANGLE]], 0), 360);
Data.ShotWait := Min(Max(
begin
b := lbTypeSelect.ItemIndex;
Values[Key] := PANELNAMES[b];
begin
b := lbTypeSelect.ItemIndex;
Values[Key] := PANELNAMES[b];
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
end
end;
end
end
if SelectMapForm.ShowModal() = mrOK then
begin
vleObjectProperty.Values[Key] := SelectMapForm.lbMapList.Items[SelectMapForm.lbMapList.ItemIndex];
if SelectMapForm.ShowModal() = mrOK then
begin
vleObjectProperty.Values[Key] := SelectMapForm.lbMapList.Items[SelectMapForm.lbMapList.ItemIndex];
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if (Key = _lc[I_PROP_TR_SOUND_NAME]) or
end;
end
else if (Key = _lc[I_PROP_TR_SOUND_NAME]) or
if (AddSoundForm.ShowModal() = mrOk) then
begin
vleObjectProperty.Values[Key] := AddSoundForm.ResourceName;
if (AddSoundForm.ShowModal() = mrOk) then
begin
vleObjectProperty.Values[Key] := AddSoundForm.ResourceName;
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if Key = _lc[I_PROP_TR_ACTIVATION] then
end;
end
else if Key = _lc[I_PROP_TR_ACTIVATION] then
b := b or ACTIVATE_NOMONSTER;
Values[Key] := ActivateToStr(b);
b := b or ACTIVATE_NOMONSTER;
Values[Key] := ActivateToStr(b);
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if Key = _lc[I_PROP_TR_KEYS] then
end;
end
else if Key = _lc[I_PROP_TR_KEYS] then
b := b or KEY_BLUETEAM;
Values[Key] := KeyToStr(b);
b := b or KEY_BLUETEAM;
Values[Key] := KeyToStr(b);
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if Key = _lc[I_PROP_TR_FX_TYPE] then
end;
end
else if Key = _lc[I_PROP_TR_FX_TYPE] then
begin
b := lbTypeSelect.ItemIndex;
Values[Key] := EffectToStr(b);
begin
b := lbTypeSelect.ItemIndex;
Values[Key] := EffectToStr(b);
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if Key = _lc[I_PROP_TR_MONSTER_TYPE] then
end;
end
else if Key = _lc[I_PROP_TR_MONSTER_TYPE] then
begin
b := lbTypeSelect.ItemIndex + MONSTER_DEMON;
Values[Key] := MonsterToStr(b);
begin
b := lbTypeSelect.ItemIndex + MONSTER_DEMON;
Values[Key] := MonsterToStr(b);
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if Key = _lc[I_PROP_TR_ITEM_TYPE] then
end;
end
else if Key = _lc[I_PROP_TR_ITEM_TYPE] then
lbTypeSelect.Items.Add(ItemToStr(ITEM_HELMET));
lbTypeSelect.Items.Add(ItemToStr(ITEM_JETPACK));
lbTypeSelect.Items.Add(ItemToStr(ITEM_INVIS));
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
b := StrToItem(Values[Key]);
if b >= ITEM_BOTTLE then
if b >= ITEM_WEAPON_KASTET then
b := b + 2;
Values[Key] := ItemToStr(b);
if b >= ITEM_WEAPON_KASTET then
b := b + 2;
Values[Key] := ItemToStr(b);
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if Key = _lc[I_PROP_TR_SHOT_TYPE] then
end;
end
else if Key = _lc[I_PROP_TR_SHOT_TYPE] then
begin
b := lbTypeSelect.ItemIndex;
Values[Key] := ShotToStr(b);
begin
b := lbTypeSelect.ItemIndex;
Values[Key] := ShotToStr(b);
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if Key = _lc[I_PROP_TR_EFFECT_TYPE] then
end;
end
else if Key = _lc[I_PROP_TR_EFFECT_TYPE] then
Values[Key] := _lc[I_PROP_TR_EFFECT_PARTICLE]
else
Values[Key] := _lc[I_PROP_TR_EFFECT_ANIMATION];
Values[Key] := _lc[I_PROP_TR_EFFECT_PARTICLE]
else
Values[Key] := _lc[I_PROP_TR_EFFECT_ANIMATION];
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if Key = _lc[I_PROP_TR_EFFECT_SUBTYPE] then
end;
end
else if Key = _lc[I_PROP_TR_EFFECT_SUBTYPE] then
Values[Key] := _lc[I_PROP_TR_EFFECT_BUBBLE];
end;
Values[Key] := _lc[I_PROP_TR_EFFECT_BUBBLE];
end;
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if Key = _lc[I_PROP_TR_EFFECT_COLOR] then
end;
end
else if Key = _lc[I_PROP_TR_EFFECT_COLOR] then
if ColorDialog.Execute then
begin
Values[Key] := IntToStr(ColorDialog.Color);
if ColorDialog.Execute then
begin
Values[Key] := IntToStr(ColorDialog.Color);
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end
else if Key = _lc[I_PROP_PANEL_TEX] then
begin // Смена текстуры:
vleObjectProperty.Values[Key] := SelectedTexture();
end;
end
else if Key = _lc[I_PROP_PANEL_TEX] then
begin // Смена текстуры:
vleObjectProperty.Values[Key] := SelectedTexture();
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
end;
end;
end;
+procedure TMainForm.vleObjectPropertyApply(Sender: TObject);
+begin
+ // hack to prevent empty ID in list
+ RenderPanel.SetFocus();
+ bApplyProperty.Click();
+ vleObjectProperty.SetFocus();
+end;
+
procedure TMainForm.aSaveMapExecute(Sender: TObject);
var
FileName, Section, Res: String;
procedure TMainForm.aSaveMapExecute(Sender: TObject);
var
FileName, Section, Res: String;
else gLanguage := LANGUAGE_RUSSIAN;
end;
else gLanguage := LANGUAGE_RUSSIAN;
end;
- config := TConfig.CreateFile(EditorDir+'\Editor.cfg');
+ config := TConfig.CreateFile(EditorDir+'Editor.cfg');
config.WriteStr('Editor', 'Language', gLanguage);
config.WriteStr('Editor', 'Language', gLanguage);
- config.SaveFile(EditorDir+'\Editor.cfg');
+ config.SaveFile(EditorDir+'Editor.cfg');
config.Free();
end;
config.Free();
end;
if MapList <> nil then
for a := 0 to High(MapList) do
if MapList <> nil then
for a := 0 to High(MapList) do
- SelectMapForm.lbMapList.Items.Add(MapList[a]);
+ SelectMapForm.lbMapList.Items.Add(win2utf(MapList[a]));
if (SelectMapForm.ShowModal() = mrOK) then
begin
str := SelectMapForm.lbMapList.Items[SelectMapForm.lbMapList.ItemIndex];
MapName := '';
if (SelectMapForm.ShowModal() = mrOK) then
begin
str := SelectMapForm.lbMapList.Items[SelectMapForm.lbMapList.ItemIndex];
MapName := '';
- Move(MapName[0], str[1], Min(16, Length(str)));
+ Move(str[1], MapName[0], Min(16, Length(str)));
if MessageBox(0, PChar(Format(_lc[I_MSG_DELETE_MAP_PROMT],
[MapName, OpenDialog.FileName])),
if MessageBox(0, PChar(Format(_lc[I_MSG_DELETE_MAP_PROMT],
[MapName, OpenDialog.FileName])),
MB_DEFBUTTON2) <> mrYes then
Exit;
MB_DEFBUTTON2) <> mrYes then
Exit;
- WAD.RemoveResource('', MapName);
+ WAD.RemoveResource('', utf2win(MapName));
MessageBox(0, PChar(Format(_lc[I_MSG_MAP_DELETED_PROMT],
[MapName])),
MessageBox(0, PChar(Format(_lc[I_MSG_MAP_DELETED_PROMT],
[MapName])),
var Key: Word; Shift: TShiftState);
begin
if Key = VK_RETURN then
var Key: Word; Shift: TShiftState);
begin
if Key = VK_RETURN then
- bApplyProperty.Click();
+ vleObjectPropertyApply(Sender);
end;
procedure MovePanel(var ID: DWORD; MoveType: Byte);
end;
procedure MovePanel(var ID: DWORD; MoveType: Byte);
e_InitGL();
e_WriteLog('Loading data', MSG_NOTIFY);
LoadStdFont('STDTXT', 'STDFONT', gEditorFont);
e_InitGL();
e_WriteLog('Loading data', MSG_NOTIFY);
LoadStdFont('STDTXT', 'STDFONT', gEditorFont);
+ e_WriteLog('Loading more data', MSG_NOTIFY);
LoadData();
LoadData();
+ e_WriteLog('Loading even more data', MSG_NOTIFY);
gDataLoaded := True;
MainForm.FormResize(nil);
end;
gDataLoaded := True;
MainForm.FormResize(nil);
end;
PreviewMode := not PreviewMode;
(Sender as TMenuItem).Checked := PreviewMode;
PreviewMode := not PreviewMode;
(Sender as TMenuItem).Checked := PreviewMode;
+
+ FormResize(Self);
end;
procedure TMainForm.miLayer1Click(Sender: TObject);
end;
procedure TMainForm.miLayer1Click(Sender: TObject);
procedure TMainForm.miTestMapClick(Sender: TObject);
var
procedure TMainForm.miTestMapClick(Sender: TObject);
var
- cmd, mapWAD, mapToRun: String;
+ cmd, mapWAD, mapToRun, tempWAD: String;
opt: LongWord;
time: Integer;
opt: LongWord;
time: Integer;
- lpMsgBuf: PChar;
+ proc: TProcessUTF8;
+ res: Boolean;
begin
begin
+ mapToRun := '';
+ if OpenedMap <> '' then
+ begin
+ // Указываем текущую карту для теста:
+ g_ProcessResourceStr(OpenedMap, @mapWAD, nil, @mapToRun);
+ mapToRun := mapWAD + ':\' + mapToRun;
+ mapToRun := ExtractRelativePath(ExtractFilePath(TestD2dExe) + 'maps/', mapToRun);
+ end;
// Сохраняем временную карту:
time := 0;
repeat
// Сохраняем временную карту:
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);
Inc(time);
until not FileExists(mapWAD);
- mapToRun := mapWAD + ':\' + TEST_MAP_NAME;
- SaveMap(mapToRun);
+ tempWAD := mapWAD + ':\' + TEST_MAP_NAME;
+ SaveMap(tempWAD);
- mapToRun := ExtractRelativePath(ExtractFilePath(TestD2dExe) + 'maps\', mapToRun);
+ tempWAD := ExtractRelativePath(ExtractFilePath(TestD2dExe) + 'maps/', tempWAD);
+// Если карта не была открыта, указываем временную в качестве текущей:
+ if mapToRun = '' then
+ mapToRun := tempWAD;
// Опции игры:
opt := 32 + 64;
// Опции игры:
opt := 32 + 64;
opt := opt + 16;
// Составляем командную строку:
opt := opt + 16;
// Составляем командную строку:
- cmd := ' -map "' + mapToRun + '"';
+ cmd := '-map "' + mapToRun + '"';
+ cmd := cmd + ' -testmap "' + tempWAD + '"';
cmd := cmd + ' -gm ' + TestGameMode;
cmd := cmd + ' -limt ' + TestLimTime;
cmd := cmd + ' -lims ' + TestLimScore;
cmd := cmd + ' -gm ' + TestGameMode;
cmd := cmd + ' -limt ' + TestLimTime;
cmd := cmd + ' -lims ' + TestLimScore;
cmd := cmd + ' --close';
cmd := cmd + ' --debug';
cmd := cmd + ' --close';
cmd := cmd + ' --debug';
- 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;
begin
MessageBox(0, 'FIXME',
PChar(_lc[I_MSG_EXEC_ERROR]),
MB_OK or MB_ICONERROR);
end;
+ proc.Free();
SysUtils.DeleteFile(mapWAD);
Application.Restore();
SysUtils.DeleteFile(mapWAD);
Application.Restore();
end;
end;
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.
end.