diff --git a/src/editor/f_main.pas b/src/editor/f_main.pas
index ab72ebed255b1f37ebdc343f7d1b789e295fd384..d217b30d0864c21869dcc3981be725bf741ed740 100644 (file)
--- a/src/editor/f_main.pas
+++ b/src/editor/f_main.pas
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, utils;
+ LCLIntf, LCLType, SysUtils, Variants, Classes, Graphics,
+ Controls, Forms, Dialogs, StdCtrls, Buttons,
+ ComCtrls, ValEdit, Types, Menus, ExtCtrls,
+ CheckLst, Grids, OpenGLContext, utils, UTF8Process;
type
type
miSaveMapAs: TMenuItem;
miOpenWadMap: TMenuItem;
miLine1: TMenuItem;
miSaveMapAs: TMenuItem;
miOpenWadMap: TMenuItem;
miLine1: TMenuItem;
+ miReopenMap: TMenuItem;
miSaveMiniMap: TMenuItem;
miDeleteMap: TMenuItem;
miPackMap: TMenuItem;
miSaveMiniMap: TMenuItem;
miDeleteMap: TMenuItem;
miPackMap: TMenuItem;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
+ procedure FormDropFiles(Sender: TObject; const FileNames: array of String);
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 miReopenMapClick(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 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); }
+ procedure OpenMapFile(FileName: String);
+ function RenderMousePos(): TPoint;
end;
const
end;
const
DrawPanelSize: Boolean;
BackColor: TColor;
PreviewColor: TColor;
DrawPanelSize: Boolean;
BackColor: TColor;
PreviewColor: TColor;
+ UseCheckerboard: Boolean;
Scale: Byte;
RecentCount: Integer;
RecentFiles: TStringList;
Scale: Byte;
RecentCount: Integer;
RecentFiles: TStringList;
LayerEnabled: Array [LAYER_BACK..LAYER_TRIGGERS] of Boolean =
(True, True, True, True, True, True, True, True, True);
LayerEnabled: Array [LAYER_BACK..LAYER_TRIGGERS] of Boolean =
(True, True, True, True, True, True, True, True, True);
- PreviewMode: Boolean = False;
+ PreviewMode: Byte = 0;
gLanguage: String;
FormCaption: String;
gLanguage: String;
FormCaption: String;
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,
SELECTFLAG_SHOTPANEL = 7;
SELECTFLAG_SELECTED = 8;
SELECTFLAG_SHOTPANEL = 7;
SELECTFLAG_SELECTED = 8;
- RECENT_FILES_MENU_START = 11;
+ RECENT_FILES_MENU_START = 12;
CLIPBOARD_SIG = 'DF:ED';
CLIPBOARD_SIG = 'DF:ED';
MouseRDown: Boolean;
MouseLDownPos: Types.TPoint;
MouseRDownPos: Types.TPoint;
MouseRDown: Boolean;
MouseLDownPos: Types.TPoint;
MouseRDownPos: Types.TPoint;
+ WASDOffset: TPoint;
SelectFlag: Byte = SELECTFLAG_NONE;
MouseAction: Byte = MOUSEACTION_NONE;
SelectFlag: Byte = SELECTFLAG_NONE;
MouseAction: Byte = MOUSEACTION_NONE;
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;
ok: Boolean;
FileName: String;
ResourceName: String;
ok: Boolean;
FileName: String;
ResourceName: String;
- UResourceName: String;
FullResourceName: String;
SectionName: String;
Data: Pointer;
Width, Height: Word;
fn: String;
begin
FullResourceName: String;
SectionName: String;
Data: Pointer;
Width, Height: Word;
fn: String;
begin
+ Data := nil;
+ FrameLen := 0;
+ Width := 0;
+ Height := 0;
+
if aSection = '..' then
SectionName := ''
else
SectionName := aSection;
if aSection = '..' then
SectionName := ''
else
SectionName := aSection;
+ if aWAD = '' then
+ aWAD := _lc[I_WAD_SPECIAL_MAP];
+
if aWAD = _lc[I_WAD_SPECIAL_MAP] then
begin // Файл карты
g_ProcessResourceStr(OpenedMap, @fn, nil, nil);
if aWAD = _lc[I_WAD_SPECIAL_MAP] then
begin // Файл карты
g_ProcessResourceStr(OpenedMap, @fn, nil, nil);
end;
ok := True;
end;
ok := True;
- UResourceName := win2utf(ResourceName);
// Есть ли уже такая текстура:
for a := 0 to MainForm.lbTextureList.Items.Count-1 do
// Есть ли уже такая текстура:
for a := 0 to MainForm.lbTextureList.Items.Count-1 do
- if UResourceName = MainForm.lbTextureList.Items[a] then
+ if ResourceName = MainForm.lbTextureList.Items[a] then
begin
if not silent then
ErrorMessageBox(Format(_lc[I_MSG_TEXTURE_ALREADY],
begin
if not silent then
ErrorMessageBox(Format(_lc[I_MSG_TEXTURE_ALREADY],
- [UResourceName]));
+ [ResourceName]));
ok := False;
end;
ok := False;
end;
begin
if not silent then
ErrorMessageBox(Format(_lc[I_MSG_RES_NAME_64],
begin
if not silent then
ErrorMessageBox(Format(_lc[I_MSG_RES_NAME_64],
- [UResourceName]));
+ [ResourceName]));
ok := False;
end;
ok := False;
end;
a := -1;
if aWAD = _lc[I_WAD_SPECIAL_TEXS] then
begin
a := -1;
if aWAD = _lc[I_WAD_SPECIAL_TEXS] then
begin
- a := MainForm.lbTextureList.Items.Add(UResourceName);
+ a := MainForm.lbTextureList.Items.Add(ResourceName);
if not silent then
SelectTexture(a);
Result := True;
if not silent then
SelectTexture(a);
Result := True;
begin // Аним. текстура
GetFrame(FullResourceName, Data, FrameLen, Width, Height);
begin // Аним. текстура
GetFrame(FullResourceName, Data, FrameLen, Width, Height);
- if g_CreateTextureMemorySize(Data, FrameLen, ResourceName, 0, 0, Width, Height, 1) then
- a := MainForm.lbTextureList.Items.Add(UResourceName);
+ if not g_CreateTextureMemorySize(Data, FrameLen, ResourceName, 0, 0, Width, Height, 1) then
+ ok := False;
+ a := MainForm.lbTextureList.Items.Add(ResourceName);
end
else // Обычная текстура
begin
end
else // Обычная текстура
begin
- if g_CreateTextureWAD(ResourceName, FullResourceName) then
- a := MainForm.lbTextureList.Items.Add(UResourceName);
+ if not g_CreateTextureWAD(ResourceName, FullResourceName) then
+ ok := False;
+ a := MainForm.lbTextureList.Items.Add(ResourceName);
end;
end;
+ if (not ok) and (slInvalidTextures.IndexOf(ResourceName) = -1) then
+ begin
+ slInvalidTextures.Add(ResourceName);
+ ok := True;
+ end;
if (a > -1) and (not silent) then
SelectTexture(a);
end;
if (a > -1) and (not silent) then
SelectTexture(a);
end;
MapName: String;
idx: Integer;
begin
MapName: String;
idx: Integer;
begin
+ SelectMapForm.Caption := _lc[I_CAP_OPEN];
SelectMapForm.GetMaps(FileName);
if (FileName = OpenedWAD) and
SelectMapForm.GetMaps(FileName);
if (FileName = OpenedWAD) and
function SelectedTexture(): String;
begin
if MainForm.lbTextureList.ItemIndex <> -1 then
function SelectedTexture(): String;
begin
if MainForm.lbTextureList.ItemIndex <> -1 then
- Result := utf2win(MainForm.lbTextureList.Items[MainForm.lbTextureList.ItemIndex])
+ Result := MainForm.lbTextureList.Items[MainForm.lbTextureList.ItemIndex]
else
Result := '';
end;
else
Result := '';
end;
function IsSpecialTextureSel(): Boolean;
begin
Result := (MainForm.lbTextureList.ItemIndex <> -1) and
function IsSpecialTextureSel(): Boolean;
begin
Result := (MainForm.lbTextureList.ItemIndex <> -1) and
- IsSpecialTexture(utf2win(MainForm.lbTextureList.Items[MainForm.lbTextureList.ItemIndex]));
+ IsSpecialTexture(MainForm.lbTextureList.Items[MainForm.lbTextureList.ItemIndex]);
end;
function CopyBufferToString(var CopyBuf: TCopyRecArray): String;
end;
function CopyBufferToString(var CopyBuf: TCopyRecArray): String;
Result := Res;
end;
Result := Res;
end;
-procedure StringToCopyBuffer(Str: String; var CopyBuf: TCopyRecArray);
+procedure StringToCopyBuffer(Str: String; var CopyBuf: TCopyRecArray;
+ var pmin: TPoint);
var
i, j, t: Integer;
var
i, j, t: Integer;
PanelType := StrToIntDef(GetNext(), PANEL_WALL);
X := StrToIntDef(GetNext(), 0);
Y := StrToIntDef(GetNext(), 0);
PanelType := StrToIntDef(GetNext(), PANEL_WALL);
X := StrToIntDef(GetNext(), 0);
Y := StrToIntDef(GetNext(), 0);
+ pmin.X := Min(X, pmin.X);
+ pmin.Y := Min(Y, pmin.Y);
Width := StrToIntDef(GetNext(), 16);
Height := StrToIntDef(GetNext(), 16);
TextureName := GetNext();
Width := StrToIntDef(GetNext(), 16);
Height := StrToIntDef(GetNext(), 16);
TextureName := GetNext();
ItemType := StrToIntDef(GetNext(), ITEM_MEDKIT_SMALL);
X := StrToIntDef(GetNext(), 0);
Y := StrToIntDef(GetNext(), 0);
ItemType := StrToIntDef(GetNext(), ITEM_MEDKIT_SMALL);
X := StrToIntDef(GetNext(), 0);
Y := StrToIntDef(GetNext(), 0);
+ pmin.X := Min(X, pmin.X);
+ pmin.Y := Min(Y, pmin.Y);
OnlyDM := (GetNext() = '1');
Fall := (GetNext() = '1');
end;
OnlyDM := (GetNext() = '1');
Fall := (GetNext() = '1');
end;
MonsterType := StrToIntDef(GetNext(), MONSTER_DEMON);
X := StrToIntDef(GetNext(), 0);
Y := StrToIntDef(GetNext(), 0);
MonsterType := StrToIntDef(GetNext(), MONSTER_DEMON);
X := StrToIntDef(GetNext(), 0);
Y := StrToIntDef(GetNext(), 0);
+ pmin.X := Min(X, pmin.X);
+ pmin.Y := Min(Y, pmin.Y);
if GetNext() = '1' then
Direction := D_LEFT
if GetNext() = '1' then
Direction := D_LEFT
AreaType := StrToIntDef(GetNext(), AREA_PLAYERPOINT1);
X := StrToIntDef(GetNext(), 0);
Y := StrToIntDef(GetNext(), 0);
AreaType := StrToIntDef(GetNext(), AREA_PLAYERPOINT1);
X := StrToIntDef(GetNext(), 0);
Y := StrToIntDef(GetNext(), 0);
+ pmin.X := Min(X, pmin.X);
+ pmin.Y := Min(Y, pmin.Y);
if GetNext() = '1' then
Direction := D_LEFT
else
if GetNext() = '1' then
Direction := D_LEFT
else
TriggerType := StrToIntDef(GetNext(), TRIGGER_EXIT);
X := StrToIntDef(GetNext(), 0);
Y := StrToIntDef(GetNext(), 0);
TriggerType := StrToIntDef(GetNext(), TRIGGER_EXIT);
X := StrToIntDef(GetNext(), 0);
Y := StrToIntDef(GetNext(), 0);
+ pmin.X := Min(X, pmin.X);
+ pmin.Y := Min(Y, pmin.Y);
Width := StrToIntDef(GetNext(), 16);
Height := StrToIntDef(GetNext(), 16);
ActivateType := StrToIntDef(GetNext(), 0);
Width := StrToIntDef(GetNext(), 16);
Height := StrToIntDef(GetNext(), 16);
ActivateType := StrToIntDef(GetNext(), 0);
for j := 0 to 127 do
Data.Default[j] := StrToIntDef(GetNext(), 0);
for j := 0 to 127 do
Data.Default[j] := StrToIntDef(GetNext(), 0);
+
+ case TriggerType of
+ TRIGGER_TELEPORT:
+ begin
+ pmin.X := Min(Data.TargetPoint.X, pmin.X);
+ pmin.Y := Min(Data.TargetPoint.Y, pmin.Y);
+ end;
+ TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF:
+ begin
+ pmin.X := Min(Data.tX, pmin.X);
+ pmin.Y := Min(Data.tY, pmin.Y);
+ end;
+ TRIGGER_SPAWNMONSTER:
+ begin
+ pmin.X := Min(Data.MonPos.X, pmin.X);
+ pmin.Y := Min(Data.MonPos.Y, pmin.Y);
+ end;
+ TRIGGER_SPAWNITEM:
+ begin
+ pmin.X := Min(Data.ItemPos.X, pmin.X);
+ pmin.Y := Min(Data.ItemPos.Y, pmin.Y);
+ end;
+ TRIGGER_SHOT:
+ begin
+ pmin.X := Min(Data.ShotPos.X, pmin.X);
+ pmin.Y := Min(Data.ShotPos.Y, pmin.Y);
+ end;
+ end;
end;
end;
end;
end;
end;
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;
if wad.ReadFile(EditorDir+'data/Game.wad') then
wad := TWADEditor_1.Create;
if wad.ReadFile(EditorDir+'data/Game.wad') then
DrawPanelSize := config.ReadBool('Editor', 'DrawPanelSize', True);
BackColor := config.ReadInt('Editor', 'BackColor', $7F6040);
PreviewColor := config.ReadInt('Editor', 'PreviewColor', $00FF00);
DrawPanelSize := config.ReadBool('Editor', 'DrawPanelSize', True);
BackColor := config.ReadInt('Editor', 'BackColor', $7F6040);
PreviewColor := config.ReadInt('Editor', 'PreviewColor', $00FF00);
+ UseCheckerboard := config.ReadBool('Editor', 'UseCheckerboard', True);
gColorEdge := config.ReadInt('Editor', 'EdgeColor', COLOR_EDGE);
gAlphaEdge := config.ReadInt('Editor', 'EdgeAlpha', ALPHA_EDGE);
if gAlphaEdge = 255 then
gColorEdge := config.ReadInt('Editor', 'EdgeColor', COLOR_EDGE);
gAlphaEdge := config.ReadInt('Editor', 'EdgeAlpha', ALPHA_EDGE);
if gAlphaEdge = 255 then
gAlphaTriggerArea := config.ReadInt('Editor', 'TriggerAlpha', ALPHA_AREA);
if gAlphaTriggerArea = 255 then
gAlphaTriggerArea := ALPHA_AREA;
gAlphaTriggerArea := config.ReadInt('Editor', 'TriggerAlpha', ALPHA_AREA);
if gAlphaTriggerArea = 255 then
gAlphaTriggerArea := ALPHA_AREA;
+ gAlphaMonsterRect := config.ReadInt('Editor', 'MonsterRectAlpha', 0);
+ gAlphaAreaRect := config.ReadInt('Editor', 'AreaRectAlpha', 0);
if config.ReadInt('Editor', 'Scale', 0) = 1 then
Scale := 2
else
if config.ReadInt('Editor', 'Scale', 0) = 1 then
Scale := 2
else
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,
end;
// Рисуем сетку:
end;
// Рисуем сетку:
- if DotEnable and (not PreviewMode) then
+ if DotEnable and (PreviewMode = 0) then
begin
if DotSize = 2 then
a := -1
begin
if DotSize = 2 then
a := -1
// Превью текстуры:
if (lbTextureList.ItemIndex <> -1) and (cbPreview.Checked) and
// Превью текстуры:
if (lbTextureList.ItemIndex <> -1) and (cbPreview.Checked) and
- (not IsSpecialTextureSel()) and (not PreviewMode) then
+ (not IsSpecialTextureSel()) and (PreviewMode = 0) then
begin
if not g_GetTexture(SelectedTexture(), ID) then
g_GetTexture('NOTEXTURE', ID);
g_GetTextureSizeByID(ID, Width, Height);
begin
if not g_GetTexture(SelectedTexture(), ID) then
g_GetTexture('NOTEXTURE', ID);
g_GetTextureSizeByID(ID, Width, Height);
- 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);
+ if UseCheckerboard then
+ begin
+ 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);
+ end else
+ 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, RenderPanel.Height-Height, 0, True, False);
end;
e_Draw(ID, RenderPanel.Width-Width, RenderPanel.Height-Height, 0, True, False);
end;
g_GetTexture('NOTEXTURE', ID);
g_GetTextureSizeByID(ID, Width, Height);
with DrawRect^ do
g_GetTexture('NOTEXTURE', ID);
g_GetTextureSizeByID(ID, Width, Height);
with DrawRect^ do
- e_DrawFill(ID, Min(Left, Right), Min(Top, Bottom), Abs(Right-Left) div Width,
- Abs(Bottom-Top) div Height, 0, True, False);
+ if (Abs(Right-Left) >= Width) and (Abs(Bottom-Top) >= Height) then
+ e_DrawFill(ID, Min(Left, Right), Min(Top, Bottom), Abs(Right-Left) div Width,
+ Abs(Bottom-Top) div Height, 64, True, False);
end;
// Прямоугольник выделения:
end;
// Прямоугольник выделения:
e_DrawQuad(Left, Top, Right-1, Bottom-1, 255, 255, 255);
// Чертим мышью панель/триггер или меняем мышью их размер:
e_DrawQuad(Left, Top, Right-1, Bottom-1, 255, 255, 255);
// Чертим мышью панель/триггер или меняем мышью их размер:
- if (MouseAction in [MOUSEACTION_DRAWPANEL, MOUSEACTION_DRAWTRIGGER, MOUSEACTION_RESIZE]) and
+ if (((MouseAction in [MOUSEACTION_DRAWPANEL, MOUSEACTION_DRAWTRIGGER]) and
+ not(ssCtrl in GetKeyShiftState())) or (MouseAction = MOUSEACTION_RESIZE)) and
(DrawPanelSize) then
begin
e_DrawFillQuad(MousePos.X, MousePos.Y, MousePos.X+88, MousePos.Y+33, 192, 192, 192, 127);
(DrawPanelSize) then
begin
e_DrawFillQuad(MousePos.X, MousePos.Y, MousePos.X+88, MousePos.Y+33, 192, 192, 192, 127);
begin // Чертим новый
PrintBlack(MousePos.X+2, MousePos.Y+2, Format(_glc[I_HINT_WIDTH],
[Abs(MousePos.X-MouseLDownPos.X)]), gEditorFont);
begin // Чертим новый
PrintBlack(MousePos.X+2, MousePos.Y+2, Format(_glc[I_HINT_WIDTH],
[Abs(MousePos.X-MouseLDownPos.X)]), gEditorFont);
- PrintBlack(MousePos.X+2, MousePos.Y+14, Format(_glc[I_HINT_HEIGHT],
+ PrintBlack(MousePos.X+2, MousePos.Y+16, Format(_glc[I_HINT_HEIGHT],
[Abs(MousePos.Y-MouseLDownPos.Y)]), gEditorFont);
end
else // Растягиваем существующий
[Abs(MousePos.Y-MouseLDownPos.Y)]), gEditorFont);
end
else // Растягиваем существующий
PrintBlack(MousePos.X+2, MousePos.Y+2, Format(_glc[I_HINT_WIDTH], [Width]),
gEditorFont);
PrintBlack(MousePos.X+2, MousePos.Y+2, Format(_glc[I_HINT_WIDTH], [Width]),
gEditorFont);
- PrintBlack(MousePos.X+2, MousePos.Y+14, Format(_glc[I_HINT_HEIGHT], [Height]),
+ PrintBlack(MousePos.X+2, MousePos.Y+16, Format(_glc[I_HINT_HEIGHT], [Height]),
gEditorFont);
end;
end;
gEditorFont);
end;
end;
var
panel: TPanel;
trigger: TTrigger;
var
panel: TPanel;
trigger: TTrigger;
- i: Integer;
- IDArray: DWArray;
rRect: TRectWH;
rSelectRect: Boolean;
rRect: TRectWH;
rSelectRect: Boolean;
+ wWidth, wHeight: Word;
+ TextureID: DWORD;
+
+ procedure SelectObjects(ObjectType: Byte);
+ var
+ i: Integer;
+ IDArray: DWArray;
+ begin
+ IDArray := ObjectInRect(rRect.X, rRect.Y,
+ rRect.Width, rRect.Height,
+ ObjectType, rSelectRect);
+
+ if IDArray <> nil then
+ for i := 0 to High(IDArray) do
+ SelectObject(ObjectType, IDArray[i], (ssCtrl in Shift) or rSelectRect);
+ end;
begin
if Button = mbLeft then
MouseLDown := False;
begin
if Button = mbLeft then
MouseLDown := False;
DrawRect := nil;
ResizeType := RESIZETYPE_NONE;
DrawRect := nil;
ResizeType := RESIZETYPE_NONE;
+ TextureID := 0;
if Button = mbLeft then // Left Mouse Button
begin
if MouseAction <> MOUSEACTION_NONE then
begin // Было действие мышью
if Button = mbLeft then // Left Mouse Button
begin
if MouseAction <> MOUSEACTION_NONE then
begin // Было действие мышью
- // Мышь сдвинулась во время удержания клавиши:
- if (MousePos.X <> MouseLDownPos.X) and
- (MousePos.Y <> MouseLDownPos.Y) then
+ // Мышь сдвинулась во время удержания клавиши,
+ // либо активирован режим быстрого рисования:
+ if ((MousePos.X <> MouseLDownPos.X) and
+ (MousePos.Y <> MouseLDownPos.Y)) or
+ ((MouseAction in [MOUSEACTION_DRAWPANEL, MOUSEACTION_DRAWTRIGGER]) and
+ (ssCtrl in Shift)) then
case MouseAction of
// Рисовали панель:
MOUSEACTION_DRAWPANEL:
case MouseAction of
// Рисовали панель:
MOUSEACTION_DRAWPANEL:
Panel.X := Min(MousePos.X-MapOffset.X, MouseLDownPos.X-MapOffset.X);
Panel.Y := Min(MousePos.Y-MapOffset.Y, MouseLDownPos.Y-MapOffset.Y);
Panel.X := Min(MousePos.X-MapOffset.X, MouseLDownPos.X-MapOffset.X);
Panel.Y := Min(MousePos.Y-MapOffset.Y, MouseLDownPos.Y-MapOffset.Y);
- Panel.Width := Abs(MousePos.X-MouseLDownPos.X);
- Panel.Height := Abs(MousePos.Y-MouseLDownPos.Y);
+ if ssCtrl in Shift then
+ begin
+ wWidth := DotStep;
+ wHeight := DotStep;
+ if (lbTextureList.ItemIndex <> -1) and
+ (not IsSpecialTextureSel()) then
+ begin
+ if not g_GetTexture(SelectedTexture(), TextureID) then
+ g_GetTexture('NOTEXTURE', TextureID);
+ g_GetTextureSizeByID(TextureID, wWidth, wHeight);
+ end;
+ Panel.Width := wWidth;
+ Panel.Height := wHeight;
+ end
+ else
+ begin
+ Panel.Width := Abs(MousePos.X-MouseLDownPos.X);
+ Panel.Height := Abs(MousePos.Y-MouseLDownPos.Y);
+ end;
// Лифты, блокМон или отсутствие текстуры - пустая текстура:
if (lbPanelType.ItemIndex in [9, 10, 11, 12, 13]) or
// Лифты, блокМон или отсутствие текстуры - пустая текстура:
if (lbPanelType.ItemIndex in [9, 10, 11, 12, 13]) or
begin
trigger.X := Min(MousePos.X-MapOffset.X, MouseLDownPos.X-MapOffset.X);
trigger.Y := Min(MousePos.Y-MapOffset.Y, MouseLDownPos.Y-MapOffset.Y);
begin
trigger.X := Min(MousePos.X-MapOffset.X, MouseLDownPos.X-MapOffset.X);
trigger.Y := Min(MousePos.Y-MapOffset.Y, MouseLDownPos.Y-MapOffset.Y);
- trigger.Width := Abs(MousePos.X-MouseLDownPos.X);
- trigger.Height := Abs(MousePos.Y-MouseLDownPos.Y);
+ if ssCtrl in Shift then
+ begin
+ wWidth := DotStep;
+ wHeight := DotStep;
+ trigger.Width := wWidth;
+ trigger.Height := wHeight;
+ end
+ else
+ begin
+ trigger.Width := Abs(MousePos.X-MouseLDownPos.X);
+ trigger.Height := Abs(MousePos.Y-MouseLDownPos.Y);
+ end;
trigger.Enabled := True;
trigger.TriggerType := lbTriggersList.ItemIndex+1;
trigger.Enabled := True;
trigger.TriggerType := lbTriggersList.ItemIndex+1;
RemoveSelectFromObjects();
// Выделяем всё в выбранном прямоугольнике:
RemoveSelectFromObjects();
// Выделяем всё в выбранном прямоугольнике:
- IDArray := ObjectInRect(rRect.X, rRect.Y,
- rRect.Width, rRect.Height,
- pcObjects.ActivePageIndex+1, rSelectRect);
-
- if IDArray <> nil then
- for i := 0 to High(IDArray) do
- SelectObject(pcObjects.ActivePageIndex+1, IDArray[i],
- (ssCtrl in Shift) or rSelectRect);
+ if (ssCtrl in Shift) and (ssAlt in Shift) then
+ begin
+ SelectObjects(OBJECT_PANEL);
+ SelectObjects(OBJECT_ITEM);
+ SelectObjects(OBJECT_MONSTER);
+ SelectObjects(OBJECT_AREA);
+ SelectObjects(OBJECT_TRIGGER);
+ end
+ else
+ SelectObjects(pcObjects.ActivePageIndex+1);
FillProperty();
end;
FillProperty();
end;
Draw();
end;
Draw();
end;
+function TMainForm.RenderMousePos(): Types.TPoint;
+begin
+ Result := RenderPanel.ScreenToClient(Mouse.CursorPos);
+end;
+
procedure TMainForm.RenderPanelMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
sX, sY: Integer;
dWidth, dHeight: Integer;
_id: Integer;
procedure TMainForm.RenderPanelMouseMove(Sender: TObject;
Shift: TShiftState; X, Y: Integer);
var
sX, sY: Integer;
dWidth, dHeight: Integer;
_id: Integer;
+ TextureID: DWORD;
+ wWidth, wHeight: Word;
begin
_id := GetFirstSelected();
begin
_id := GetFirstSelected();
+ TextureID := 0;
// Рисуем панель с текстурой, сетка - размеры текстуры:
if (MouseAction = MOUSEACTION_DRAWPANEL) and
// Рисуем панель с текстурой, сетка - размеры текстуры:
if (MouseAction = MOUSEACTION_DRAWPANEL) and
if MouseAction = MOUSEACTION_MOVEOBJ then
begin
MoveSelectedObjects(ssShift in Shift, ssCtrl in Shift,
if MouseAction = MOUSEACTION_MOVEOBJ then
begin
MoveSelectedObjects(ssShift in Shift, ssCtrl in Shift,
- MousePos.X-LastMovePoint.X,
- MousePos.Y-LastMovePoint.Y);
+ MousePos.X-LastMovePoint.X+WASDOffset.X,
+ MousePos.Y-LastMovePoint.Y+WASDOffset.Y);
+ WASDOffset.X := 0;
+ WASDOffset.Y := 0;
end
else
// Меняем размер выделенного объекта:
end
else
// Меняем размер выделенного объекта:
if (SelectedObjectCount = 1) and
(SelectedObjects[GetFirstSelected].Live) then
begin
if (SelectedObjectCount = 1) and
(SelectedObjects[GetFirstSelected].Live) then
begin
- dWidth := MousePos.X-LastMovePoint.X;
- dHeight := MousePos.Y-LastMovePoint.Y;
+ dWidth := MousePos.X-LastMovePoint.X+WASDOffset.X;
+ dHeight := MousePos.Y-LastMovePoint.Y+WASDOffset.Y;
+ WASDOffset.X := 0;
+ WASDOffset.Y := 0;
case ResizeType of
RESIZETYPE_VERTICAL: dWidth := 0;
case ResizeType of
RESIZETYPE_VERTICAL: dWidth := 0;
begin
if DrawRect = nil then
New(DrawRect);
begin
if DrawRect = nil then
New(DrawRect);
- DrawRect.Top := MouseLDownPos.y;
- DrawRect.Left := MouseLDownPos.x;
- DrawRect.Bottom := MousePos.y;
- DrawRect.Right := MousePos.x;
+ if ssCtrl in Shift then
+ begin
+ wWidth := DotStep;
+ wHeight := DotStep;
+ if (lbTextureList.ItemIndex <> -1) and (not IsSpecialTextureSel()) and
+ (MouseAction = MOUSEACTION_DRAWPANEL) then
+ begin
+ if not g_GetTexture(SelectedTexture(), TextureID) then
+ g_GetTexture('NOTEXTURE', TextureID);
+ g_GetTextureSizeByID(TextureID, wWidth, wHeight);
+ end;
+ DrawRect.Top := MouseLDownPos.y;
+ DrawRect.Left := MouseLDownPos.x;
+ DrawRect.Bottom := DrawRect.Top + wHeight;
+ DrawRect.Right := DrawRect.Left + wWidth;
+ end
+ else
+ begin
+ DrawRect.Top := MouseLDownPos.y;
+ DrawRect.Left := MouseLDownPos.x;
+ DrawRect.Bottom := MousePos.y;
+ DrawRect.Right := MousePos.x;
+ end;
end
else // Двигаем карту:
if MouseAction = MOUSEACTION_MOVEMAP then
end
else // Двигаем карту:
if MouseAction = MOUSEACTION_MOVEMAP then
config.WriteInt('Editor', 'YPos', Top);
config.WriteInt('Editor', 'Width', Width);
config.WriteInt('Editor', 'Height', Height);
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);
end;
config.WriteBool('Editor', 'Maximize', WindowState = wsMaximized);
config.WriteBool('Editor', 'Minimap', ShowMap);
config.WriteInt('Editor', 'EdgeAlpha', gAlphaEdge);
config.WriteInt('Editor', 'LineAlpha', gAlphaTriggerLine);
config.WriteInt('Editor', 'TriggerAlpha', gAlphaTriggerArea);
config.WriteInt('Editor', 'EdgeAlpha', gAlphaEdge);
config.WriteInt('Editor', 'LineAlpha', gAlphaTriggerLine);
config.WriteInt('Editor', 'TriggerAlpha', gAlphaTriggerArea);
+ config.WriteInt('Editor', 'MonsterRectAlpha', gAlphaMonsterRect);
+ config.WriteInt('Editor', 'AreaRectAlpha', gAlphaAreaRect);
for i := 0 to RecentCount-1 do
if i < RecentFiles.Count then
for i := 0 to RecentCount-1 do
if i < RecentFiles.Count then
slInvalidTextures.Free;
end;
slInvalidTextures.Free;
end;
+procedure TMainForm.FormDropFiles(Sender: TObject;
+ const FileNames: array of String);
+begin
+ if Length(FileNames) <> 1 then
+ Exit;
+
+ OpenMapFile(FileNames[0]);
+end;
+
procedure TMainForm.RenderPanelResize(Sender: TObject);
begin
if MainForm.Visible then
MainForm.Resize();
end;
procedure TMainForm.RenderPanelResize(Sender: TObject);
begin
if MainForm.Visible then
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;
if not (ssCtrl in Shift) then
begin
if not (ssCtrl in Shift) then
begin
+ // Быстрое превью карты:
+ if Key = Ord('E') then
+ begin
+ if PreviewMode = 0 then
+ PreviewMode := 2;
+ end;
+
// Вертикальный скролл карты:
with sbVertical do
begin
if Key = Ord('W') then
begin
// Вертикальный скролл карты:
with sbVertical do
begin
if Key = Ord('W') then
begin
+ if (MouseLDown or MouseRDown) and (Position >= DotStep) then
+ begin
+ Dec(WASDOffset.Y, DotStep);
+ RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y);
+ end;
Position := IfThen(Position > DotStep, Position-DotStep, 0);
MapOffset.Y := -Round(Position/16) * 16;
end;
if Key = Ord('S') then
begin
Position := IfThen(Position > DotStep, Position-DotStep, 0);
MapOffset.Y := -Round(Position/16) * 16;
end;
if Key = Ord('S') then
begin
+ if (MouseLDown or MouseRDown) and (Position+DotStep <= Max) then
+ begin
+ Inc(WASDOffset.Y, DotStep);
+ RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y);
+ end;
Position := IfThen(Position+DotStep < Max, Position+DotStep, Max);
MapOffset.Y := -Round(Position/16) * 16;
end;
Position := IfThen(Position+DotStep < Max, Position+DotStep, Max);
MapOffset.Y := -Round(Position/16) * 16;
end;
begin
if Key = Ord('A') then
begin
begin
if Key = Ord('A') then
begin
+ if (MouseLDown or MouseRDown) and (Position >= DotStep) then
+ begin
+ Dec(WASDOffset.X, DotStep);
+ RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y);
+ end;
Position := IfThen(Position > DotStep, Position-DotStep, 0);
MapOffset.X := -Round(Position/16) * 16;
end;
if Key = Ord('D') then
begin
Position := IfThen(Position > DotStep, Position-DotStep, 0);
MapOffset.X := -Round(Position/16) * 16;
end;
if Key = Ord('D') then
begin
+ if (MouseLDown or MouseRDown) and (Position+DotStep <= Max) then
+ begin
+ Inc(WASDOffset.X, DotStep);
+ RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y);
+ end;
Position := IfThen(Position+DotStep < Max, Position+DotStep, Max);
MapOffset.X := -Round(Position/16) * 16;
end;
end;
Position := IfThen(Position+DotStep < Max, Position+DotStep, Max);
MapOffset.X := -Round(Position/16) * 16;
end;
end;
+ end
+ else // ssCtrl in Shift
+ begin
+ if ssShift in Shift then
+ begin
+ // Вставка по абсолютному смещению:
+ if Key = Ord('V') then
+ aPasteObjectExecute(Sender);
+ end;
+ RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y);
end;
end;
end;
end;
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);
if i > 0 then
begin
g_ProcessResourceStr(OpenedMap, @FileName, nil, nil);
if i > 0 then
begin
g_ProcessResourceStr(OpenedMap, @FileName, nil, nil);
+ SelectMapForm.Caption := _lc[I_CAP_SELECT];
SelectMapForm.GetMaps(FileName);
if SelectMapForm.ShowModal() = mrOK then
SelectMapForm.GetMaps(FileName);
if SelectMapForm.ShowModal() = mrOK then
begin
AddSoundForm.OKFunction := nil;
AddSoundForm.lbResourcesList.MultiSelect := False;
begin
AddSoundForm.OKFunction := nil;
AddSoundForm.lbResourcesList.MultiSelect := False;
- AddSoundForm.SetResource := utf2win(vleObjectProperty.Cells[1, i]);
+ AddSoundForm.SetResource := vleObjectProperty.Cells[1, i];
if (AddSoundForm.ShowModal() = mrOk) then
begin
if (AddSoundForm.ShowModal() = mrOk) then
begin
- vleObjectProperty.Cells[1, i] := win2utf(AddSoundForm.ResourceName);
+ vleObjectProperty.Cells[1, i] := AddSoundForm.ResourceName;
bApplyProperty.Click();
end;
Exit;
bApplyProperty.Click();
end;
Exit;
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.miReopenMapClick(Sender: TObject);
+var
+ FileName, Resource: String;
+begin
+ if OpenedMap = '' then
+ Exit;
+
+ if MessageBox(0, PChar(_lc[I_MSG_REOPEN_MAP_PROMT]),
+ PChar(_lc[I_MENU_FILE_REOPEN]), MB_ICONQUESTION or MB_YESNO) <> idYes then
+ Exit;
+
+ g_ProcessResourceStr(OpenedMap, @FileName, nil, @Resource);
+ OpenMap(FileName, Resource);
+end;
+
procedure TMainForm.vleObjectPropertyGetPickList(Sender: TObject;
const KeyName: String; Values: TStrings);
begin
procedure TMainForm.vleObjectPropertyGetPickList(Sender: TObject;
const KeyName: String; Values: TStrings);
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);
var
a, h: Integer;
CopyBuffer: TCopyRecArray;
var
a, h: Integer;
CopyBuffer: TCopyRecArray;
- res: Boolean;
+ res, rel: Boolean;
swad, ssec, sres: String;
swad, ssec, sres: String;
+ NoTextureID: DWORD;
+ pmin: TPoint;
begin
CopyBuffer := nil;
begin
CopyBuffer := nil;
+ NoTextureID := 0;
+ pmin.X := High(pmin.X);
+ pmin.Y := High(pmin.Y);
- StringToCopyBuffer(ClipBoard.AsText, CopyBuffer);
+ StringToCopyBuffer(ClipBoard.AsText, CopyBuffer, pmin);
+ rel := not(ssShift in GetKeyShiftState());
if CopyBuffer = nil then
Exit;
if CopyBuffer = nil then
Exit;
OBJECT_PANEL:
if Panel <> nil then
begin
OBJECT_PANEL:
if Panel <> nil then
begin
- Panel^.X := Panel^.X + 16;
- Panel^.Y := Panel^.Y + 16;
+ if rel then
+ begin
+ Panel^.X := Panel^.X - pmin.X - MapOffset.X + 32;
+ Panel^.Y := Panel^.Y - pmin.Y - MapOffset.Y + 32;
+ end;
Panel^.TextureID := TEXTURE_SPECIAL_NONE;
Panel^.TextureWidth := 1;
Panel^.TextureID := TEXTURE_SPECIAL_NONE;
Panel^.TextureWidth := 1;
g_GetTextureSizeByName(Panel^.TextureName,
Panel^.TextureWidth, Panel^.TextureHeight)
else
g_GetTextureSizeByName(Panel^.TextureName,
Panel^.TextureWidth, Panel^.TextureHeight)
else
- Panel^.TextureName := '';
+ if g_GetTexture('NOTEXTURE', NoTextureID) then
+ begin
+ Panel^.TextureID := TEXTURE_SPECIAL_NOTEXTURE;
+ g_GetTextureSizeByID(NoTextureID, Panel^.TextureWidth, Panel^.TextureHeight);
+ end;
end
else // Спец.текстура:
begin
Panel^.TextureID := SpecialTextureID(Panel^.TextureName);
with MainForm.lbTextureList.Items do
end
else // Спец.текстура:
begin
Panel^.TextureID := SpecialTextureID(Panel^.TextureName);
with MainForm.lbTextureList.Items do
- if IndexOf(win2utf(Panel^.TextureName)) = -1 then
- Add(win2utf(Panel^.TextureName));
+ if IndexOf(Panel^.TextureName) = -1 then
+ Add(Panel^.TextureName);
end;
end;
end;
end;
OBJECT_ITEM:
begin
OBJECT_ITEM:
begin
- Item.X := Item.X + 16;
- Item.Y := Item.Y + 16;
+ if rel then
+ begin
+ Item.X := Item.X - pmin.X - MapOffset.X + 32;
+ Item.Y := Item.Y - pmin.Y - MapOffset.Y + 32;
+ end;
ID := AddItem(Item);
Undo_Add(OBJECT_ITEM, ID, a > 0);
ID := AddItem(Item);
Undo_Add(OBJECT_ITEM, ID, a > 0);
OBJECT_MONSTER:
begin
OBJECT_MONSTER:
begin
- Monster.X := Monster.X + 16;
- Monster.Y := Monster.Y + 16;
+ if rel then
+ begin
+ Monster.X := Monster.X - pmin.X - MapOffset.X + 32;
+ Monster.Y := Monster.Y - pmin.Y - MapOffset.Y + 32;
+ end;
ID := AddMonster(Monster);
Undo_Add(OBJECT_MONSTER, ID, a > 0);
ID := AddMonster(Monster);
Undo_Add(OBJECT_MONSTER, ID, a > 0);
OBJECT_AREA:
begin
OBJECT_AREA:
begin
- Area.X := Area.X + 16;
- Area.Y := Area.Y + 16;
+ if rel then
+ begin
+ Area.X := Area.X - pmin.X - MapOffset.X + 32;
+ Area.Y := Area.Y - pmin.Y - MapOffset.Y + 32;
+ end;
ID := AddArea(Area);
Undo_Add(OBJECT_AREA, ID, a > 0);
ID := AddArea(Area);
Undo_Add(OBJECT_AREA, ID, a > 0);
OBJECT_TRIGGER:
begin
OBJECT_TRIGGER:
begin
- Trigger.X := Trigger.X + 16;
- Trigger.Y := Trigger.Y + 16;
+ if rel then
+ with Trigger do
+ begin
+ X := X - pmin.X - MapOffset.X + 32;
+ Y := Y - pmin.Y - MapOffset.Y + 32;
+
+ case TriggerType of
+ TRIGGER_TELEPORT:
+ begin
+ Data.TargetPoint.X :=
+ Data.TargetPoint.X - pmin.X - MapOffset.X + 32;
+ Data.TargetPoint.Y :=
+ Data.TargetPoint.Y - pmin.Y - MapOffset.Y + 32;
+ end;
+ TRIGGER_PRESS, TRIGGER_ON, TRIGGER_OFF, TRIGGER_ONOFF:
+ begin
+ Data.tX := Data.tX - pmin.X - MapOffset.X + 32;
+ Data.tY := Data.tY - pmin.Y - MapOffset.Y + 32;
+ end;
+ TRIGGER_SPAWNMONSTER:
+ begin
+ Data.MonPos.X :=
+ Data.MonPos.X - pmin.X - MapOffset.X + 32;
+ Data.MonPos.Y :=
+ Data.MonPos.Y - pmin.Y - MapOffset.Y + 32;
+ end;
+ TRIGGER_SPAWNITEM:
+ begin
+ Data.ItemPos.X :=
+ Data.ItemPos.X - pmin.X - MapOffset.X + 32;
+ Data.ItemPos.Y :=
+ Data.ItemPos.Y - pmin.Y - MapOffset.Y + 32;
+ end;
+ TRIGGER_SHOT:
+ begin
+ Data.ShotPos.X :=
+ Data.ShotPos.X - pmin.X - MapOffset.X + 32;
+ Data.ShotPos.Y :=
+ Data.ShotPos.Y - pmin.Y - MapOffset.Y + 32;
+ end;
+ end;
+ end;
ID := AddTrigger(Trigger);
Undo_Add(OBJECT_TRIGGER, ID, a > 0);
ID := AddTrigger(Trigger);
Undo_Add(OBJECT_TRIGGER, ID, a > 0);
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
else if Key = _lc[I_PROP_TR_NEXT_MAP] then
begin // Выбор следующей карты:
g_ProcessResourceStr(OpenedMap, @FileName, nil, nil);
else if Key = _lc[I_PROP_TR_NEXT_MAP] then
begin // Выбор следующей карты:
g_ProcessResourceStr(OpenedMap, @FileName, nil, nil);
+ SelectMapForm.Caption := _lc[I_CAP_SELECT];
SelectMapForm.GetMaps(FileName);
if SelectMapForm.ShowModal() = mrOK then
begin
vleObjectProperty.Values[Key] := SelectMapForm.lbMapList.Items[SelectMapForm.lbMapList.ItemIndex];
SelectMapForm.GetMaps(FileName);
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
begin // Выбор файла звука/музыки:
AddSoundForm.OKFunction := nil;
AddSoundForm.lbResourcesList.MultiSelect := False;
begin // Выбор файла звука/музыки:
AddSoundForm.OKFunction := nil;
AddSoundForm.lbResourcesList.MultiSelect := False;
- AddSoundForm.SetResource := utf2win(vleObjectProperty.Values[Key]);
+ AddSoundForm.SetResource := vleObjectProperty.Values[Key];
if (AddSoundForm.ShowModal() = mrOk) then
begin
if (AddSoundForm.ShowModal() = mrOk) then
begin
- vleObjectProperty.Values[Key] := utf2win(AddSoundForm.ResourceName);
- bApplyProperty.Click();
+ vleObjectProperty.Values[Key] := AddSoundForm.ResourceName;
+ 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
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;
if OpenDialog.Execute() then
begin
if OpenDialog.Execute() then
begin
- if (Pos('.ini', LowerCase(ExtractFileName(OpenDialog.FileName))) > 0) then
- begin // INI карты:
- FullClear();
+ OpenMapFile(OpenDialog.FileName);
+ OpenDialog.InitialDir := ExtractFileDir(OpenDialog.FileName);
+ end;
+end;
- pLoadProgress.Left := (RenderPanel.Width div 2)-(pLoadProgress.Width div 2);
- pLoadProgress.Top := (RenderPanel.Height div 2)-(pLoadProgress.Height div 2);
- pLoadProgress.Show();
+procedure TMainForm.OpenMapFile(FileName: String);
+begin
+ if (Pos('.ini', LowerCase(ExtractFileName(FileName))) > 0) then
+ begin // INI карты:
+ FullClear();
- OpenedMap := '';
- OpenedWAD := '';
+ pLoadProgress.Left := (RenderPanel.Width div 2)-(pLoadProgress.Width div 2);
+ pLoadProgress.Top := (RenderPanel.Height div 2)-(pLoadProgress.Height div 2);
+ pLoadProgress.Show();
- LoadMapOld(OpenDialog.FileName);
+ OpenedMap := '';
+ OpenedWAD := '';
- MainForm.Caption := Format('%s - %s', [FormCaption, ExtractFileName(OpenDialog.FileName)]);
+ LoadMapOld(FileName);
- pLoadProgress.Hide();
- MainForm.FormResize(Self);
- end
- else // Карты из WAD:
- begin
- OpenMap(OpenDialog.FileName, '');
- end;
+ MainForm.Caption := Format('%s - %s', [FormCaption, ExtractFileName(FileName)]);
- OpenDialog.InitialDir := ExtractFileDir(OpenDialog.FileName);
- end;
+ pLoadProgress.Hide();
+ MainForm.FormResize(Self);
+ end
+ else // Карты из WAD:
+ begin
+ OpenMap(FileName, '');
+ end;
end;
procedure TMainForm.FormActivate(Sender: TObject);
end;
procedure TMainForm.FormActivate(Sender: TObject);
MapList := WAD.GetResourcesList('');
MapList := WAD.GetResourcesList('');
+ SelectMapForm.Caption := _lc[I_CAP_REMOVE];
SelectMapForm.lbMapList.Items.Clear();
if MapList <> nil then
for a := 0 to High(MapList) do
SelectMapForm.lbMapList.Items.Clear();
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);
procedure TMainForm.miMapPreviewClick(Sender: TObject);
begin
procedure TMainForm.miMapPreviewClick(Sender: TObject);
begin
- if not PreviewMode then
+ if PreviewMode = 2 then
+ Exit;
+
+ if PreviewMode = 0 then
begin
Splitter2.Visible := False;
Splitter1.Visible := False;
begin
Splitter2.Visible := False;
Splitter1.Visible := False;
sbVertical.Visible := True;
end;
sbVertical.Visible := True;
end;
- PreviewMode := not PreviewMode;
- (Sender as TMenuItem).Checked := PreviewMode;
+ PreviewMode := PreviewMode xor 1;
+ (Sender as TMenuItem).Checked := PreviewMode > 0;
FormResize(Self);
end;
FormResize(Self);
end;
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
mapWAD := ExtractFilePath(TestD2dExe) + Format('maps/temp%.4d.wad', [time]);
Inc(time);
until not FileExists(mapWAD);
// Сохраняем временную карту:
time := 0;
repeat
mapWAD := ExtractFilePath(TestD2dExe) + Format('maps/temp%.4d.wad', [time]);
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();
(Key = Ord('V')) then
FillProperty();
end;
(Key = Ord('V')) then
FillProperty();
end;
-end;
-
-{
-procedure TMainForm.lbTextureListDrawItem(Control: TWinControl; Index: Integer;
- Rect: TRect; State: LCLType.TOwnerDrawState);
-begin
- with Control as TListBox do
+// Быстрое превью карты:
+ if Key = Ord('E') then
begin
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]);
+ if PreviewMode = 2 then
+ PreviewMode := 0;
end;
end;
+ RenderPanelMouseMove(Sender, Shift, RenderMousePos().X, RenderMousePos().Y);
end;
end;
-}
+
end.
end.