DEADSOFTWARE

get rid of "kastet" and "pulemet" in symbols
[d2df-editor.git] / src / editor / g_map.pas
index caa6b57d1a53a099ef97d4da799342b4d88ac9f1..9901af6e635ad3e3419f2ba6fe3009ae6ee0cd02 100644 (file)
@@ -113,7 +113,7 @@ const
      ((62), (16)), // WEAPON_ROCKETLAUNCHER
      ((54), (16)), // WEAPON_PLASMA
      ((61), (36)), // WEAPON_BFG
-     ((54), (16)), // WEAPON_SUPERPULEMET
+     ((54), (16)), // WEAPON_SUPERCHAINGUN
      (( 9), (11)), // AMMO_BULLETS
      ((28), (16)), // AMMO_BULLETS_BOX
      ((15), ( 7)), // AMMO_SHELLS
@@ -126,7 +126,7 @@ const
      ((16), (16)), // KEY_RED
      ((16), (16)), // KEY_GREEN
      ((16), (16)), // KEY_BLUE
-     (( 1), ( 1)), // WEAPON_KASTET
+     (( 1), ( 1)), // WEAPON_IRONFIST
      ((43), (16)), // WEAPON_PISTOL
      ((14), (18)), // BOTTLE
      ((16), (15)), // HELMET
@@ -194,6 +194,8 @@ var
   gAlphaEdge: Byte;
   gAlphaTriggerLine: Byte;
   gAlphaTriggerArea: Byte;
+  gAlphaMonsterRect: Byte;
+  gAlphaAreaRect: Byte;
   drEdge: Array[0..3] of Byte;
   gPanels: Array of TPanel;
   gItems: Array of TItem;
@@ -219,7 +221,7 @@ function  ObjectCollideLevel(fID: DWORD; ObjectType: Byte; dX, dY: Integer): Boo
 function  ObjectCollide(ObjectType: Byte; ID: DWORD; fX, fY: Integer; fWidth, fHeight: Word): Boolean;
 function  ObjectGetRect(ObjectType: Byte; ID: DWORD): TRectWH;
 procedure MoveObject(ObjectType: Byte; ID: DWORD; dX, dY: Integer);
-procedure ResizeObject(ObjectType: Byte; ID: DWORD; dWidth, dHeight: Integer; ResizeDir: Byte);
+function ResizeObject(ObjectType: Byte; ID: DWORD; dWidth, dHeight: Integer; ResizeDir: Byte): Boolean;
 function  ObjectSelected(ObjectType: Byte; ID: DWORD): Boolean;
 
 function  GetPanelName(PanelType: Word): String;
@@ -231,7 +233,7 @@ function  IsSpecialTexture(TextureName: String): Boolean;
 function  SpecialTextureID(TextureName: String): DWORD;
 
 procedure ClearMap();
-function  SaveMap(Res: String): Pointer;
+function  SaveMap(Res, ArchiveFormat: String): Pointer;
 function  LoadMap(Res: String): Boolean;
 function  LoadMapOld(_FileName: String): Boolean;
 procedure DrawMap();
@@ -244,7 +246,7 @@ implementation
 
 uses
   BinEditor, g_textures, Dialogs, SysUtils, CONFIG, f_main,
-  Forms, Math, f_addresource_texture, WADEDITOR, g_language;
+  Forms, Math, f_addresource_texture, WADEDITOR, g_language, g_options;
 
 const
   OLD_ITEM_MEDKIT_SMALL          = 1;
@@ -260,7 +262,7 @@ const
   OLD_ITEM_WEAPON_ROCKETLAUNCHER = 11;
   OLD_ITEM_WEAPON_PLASMA         = 12;
   OLD_ITEM_WEAPON_BFG            = 13;
-  OLD_ITEM_WEAPON_SUPERPULEMET   = 14;
+  OLD_ITEM_WEAPON_SUPERCHAINGUN  = 14;
   OLD_ITEM_AMMO_BULLETS          = 15;
   OLD_ITEM_AMMO_BULLETS_BOX      = 16;
   OLD_ITEM_AMMO_SHELLS           = 17;
@@ -292,7 +294,7 @@ const
                  (ITEM_WEAPON_ROCKETLAUNCHER),
                  (ITEM_WEAPON_PLASMA),
                  (ITEM_WEAPON_BFG),
-                 (ITEM_WEAPON_SUPERPULEMET),
+                 (ITEM_WEAPON_SUPERCHAINGUN),
                  (ITEM_AMMO_BULLETS),
                  (ITEM_AMMO_BULLETS_BOX),
                  (ITEM_AMMO_SHELLS),
@@ -328,7 +330,7 @@ const
      ((61), (15)), // WEAPON_ROCKETLAUNCHER
      ((53), (14)), // WEAPON_PLASMA
      ((61), (34)), // WEAPON_BFG
-     ((53), (16)), // WEAPON_SUPERPULEMET
+     ((53), (16)), // WEAPON_SUPERCHAINGUN
      (( 9), (10)), // AMMO_BULLETS
      ((28), (16)), // AMMO_BULLETS_BOX
      ((15), ( 7)), // AMMO_SHELLS
@@ -364,7 +366,7 @@ begin
       fn := fn + Res;
     end
   else
-    fn := EditorDir + 'wads/' + Res;
+    fn := WadsDir + DirectorySeparator + Res;
 
   g_CreateTextureWAD(SKY_TEXTURE, fn);
 end;
@@ -862,8 +864,9 @@ begin
   end;
 end;
 
-procedure ResizeObject(ObjectType: Byte; ID: DWORD; dWidth, dHeight: Integer; ResizeDir: Byte);
+function ResizeObject(ObjectType: Byte; ID: DWORD; dWidth, dHeight: Integer; ResizeDir: Byte): Boolean;
 begin
+  Result := True;
   case ObjectType of
     OBJECT_PANEL:
       with gPanels[ID] do
@@ -873,6 +876,7 @@ begin
         else
           begin
             Width := 0;
+            Result := False;
             Exit;
           end;
    
@@ -881,6 +885,7 @@ begin
         else
           begin
             Height := 0;
+            Result := False;
             Exit;
           end;
 
@@ -901,6 +906,7 @@ begin
         else
           begin
             Width := 0;
+            Result := False;
             Exit;
           end;
 
@@ -909,6 +915,7 @@ begin
         else
           begin
             Height := 0;
+            Result := False;
             Exit;
           end;
 
@@ -1044,9 +1051,9 @@ begin
         Result := TEXTURE_SPECIAL_ACID2;
 end;
 
-function SaveMap(Res: String): Pointer;
+function SaveMap(Res, ArchiveFormat: String): Pointer;
 var
-  WAD: TWADEditor_1;
+  WAD: TWADEditor;
   MapWriter: TMapWriter_1;
   textures: TTexturesRec1Array;
   panels: TPanelsRec1Array;
@@ -1079,11 +1086,22 @@ begin
 // Открываем WAD, если надо:
   if Res <> '' then
   begin
-    WAD := TWADEditor_1.Create();
     g_ProcessResourceStr(Res, FileName, SectionName, ResName);
-    if not WAD.ReadFile(FileName) then
-      WAD.FreeWAD();
 
+    if ArchiveFormat = '' then
+    begin
+      // format not specified -> try open automatically and append to it (or create new default)
+      WAD := gWADEditorFactory.OpenFile(FileName);
+      if WAD = nil then
+        WAD := gWADEditorFactory.CreateDefaultEditor();
+    end
+    else
+    begin
+      // format specified -> append using exactly this format (overwrite if not compatible)
+      WAD := gWADEditorFactory.CreateEditor(ArchiveFormat);
+      if WAD.ReadFile(FileName) = False then
+        WAD.FreeWAD();
+    end;
     WAD.CreateImage();
   end;
 
@@ -1374,6 +1392,24 @@ begin
   end;
 end;
 
+function map_CreateAnimTexture(TextureName, Resource: String): Boolean;
+var
+  Data: Pointer = nil;
+  FrameLen: Integer = 0;
+  Width: Word = 0;
+  Height: Word = 0;
+begin
+  Result := GetFrame(Resource, Data, FrameLen, Width, Height);
+  if not Result then // Кадры
+    e_WriteLog(Format('GetFrame() error, res=%s', [TextureName]), MSG_WARNING)
+  else
+  begin
+    Result := g_CreateTextureMemorySize(Data, FrameLen, TextureName, 0, 0, Width, Height, 1);
+    if not Result then // Сама текстура
+      e_WriteLog(Format('g_CreateTextureMemorySize() error, res=%s', [TextureName]), MSG_WARNING);
+  end;
+end;
+
 function LoadMap(Res: String): Boolean;
 var
   WAD: TWADEditor_1;
@@ -1391,29 +1427,24 @@ var
   area: TArea;
   trigger: TTrigger;
   a: Integer;
-  Data: Pointer;
-  Width, Height, m: Word;
+  m: Word;
   FileName, SectionName, ResName, _fn: String;
   TextureRes, ustr: String;
   pData: Pointer;
-  Len, FrameLen: Integer;
-  Error: Boolean;
+  Len: Integer;
+  Success: Boolean;
   NoTextureID: DWORD;
   NW, NH: Word;
 begin
   Result := False;
   pData := nil;
   Len := 0;
-  Data := nil;
-  FrameLen := 0;
-  Width := 0;
-  Height := 0;
   NoTextureID := 0;
   NW := 0;
   NH := 0;
 
   MainForm.pbLoad.Position := 0;
-  MainForm.lLoad.Caption := _lc[I_LOAD_WAD];
+  MainForm.lLoad.Caption := MsgLoadWad;
   Application.ProcessMessages();
 
 // Открываем WAD:
@@ -1437,7 +1468,7 @@ begin
 
   MapReader := TMapReader_1.Create();
 
-  MainForm.lLoad.Caption := _lc[I_LOAD_MAP];
+  MainForm.lLoad.Caption := MsgLoadMap;
   Application.ProcessMessages();
 
   MapReader.LoadMap(pData);
@@ -1449,7 +1480,7 @@ begin
   begin
     MainForm.pbLoad.Position := 0;
     MainForm.pbLoad.Max := Length(textures);
-    MainForm.lLoad.Caption := _lc[I_LOAD_TEXTURES];
+    MainForm.lLoad.Caption := MsgLoadTextures;
 
     for a := 0 to High(textures) do
     begin
@@ -1457,50 +1488,43 @@ begin
       Application.ProcessMessages();
       ustr := win2utf(textures[a].Resource);
 
-      if IsSpecialTexture(ustr) then
+      Success := True;
+      if not IsSpecialTexture(ustr) then
       begin
-        AddTexture(ustr, False);
-        Continue;
-      end;
+        g_ProcessResourceStr(ustr, @_fn, nil, nil);
 
-      g_ProcessResourceStr(ustr, @_fn, nil, nil);
+        if _fn = ''
+          then TextureRes := FileName + ustr
+          else TextureRes := WadsDir + DirectorySeparator + ustr;
 
-      if _fn = '' then
-        TextureRes := FileName + ustr
-      else
-        TextureRes := EditorDir+'wads/'+ustr;
-
-      Error := False;
-
-      if not ByteBool(textures[a].Anim) then
+        if not Boolean(textures[a].Anim) then
         begin // Обычная текстура
           if not g_CreateTextureWAD(ustr, TextureRes) then
           begin
-            e_WriteLog(Format('g_CreateTextureWAD() error, res=%s',
-                              [ustr]), MSG_WARNING);
-            Error := True;
+            e_WriteLog(Format('g_CreateTextureWAD() error, res=%s', [ustr]), MSG_WARNING);
+            Success := map_CreateAnimTexture(ustr, TextureRes);
+            if Success then
+            begin
+              textures[a].Anim := Byte(ByteBool(True));
+              e_WriteLog(Format('    wrong (outdated?) anim flag hint - texture #%d is actually animated: %s', [a, ustr]), MSG_WARNING);
+            end;
           end;
-
-          AddTexture(ustr, Error);
         end
-      else // Anim
+        else
         begin // Анимированная текстура
-          if not GetFrame(TextureRes, Data, FrameLen, Width, Height) then
-          begin // Кадры
-            e_WriteLog(Format('GetFrame() error, res=%s',
-                              [ustr]), MSG_WARNING);
-            Error := True;
-          end;
-
-          if not g_CreateTextureMemorySize(Data, FrameLen, ustr, 0, 0, Width, Height, 1) then
-          begin // Сама текстура
-            e_WriteLog(Format('g_CreateTextureMemorySize() error, res=%s',
-                              [ustr]), MSG_WARNING);
-            Error := True;
+          if not map_CreateAnimTexture(ustr, TextureRes) then
+          begin
+            Success := g_CreateTextureWAD(ustr, TextureRes);
+            if Success then
+            begin
+              textures[a].Anim := Byte(ByteBool(False));
+              e_WriteLog(Format('    wrong (outdated?) anim flag hint - texture #%d is actually static: %s', [a, ustr]), MSG_WARNING);
+            end;
           end;
-
-          AddTexture(ustr, Error);
         end;
+      end;
+
+      AddTexture(ustr, not Success);
     end;
   end;
 
@@ -1511,7 +1535,7 @@ begin
   begin
     MainForm.pbLoad.Position := 0;
     MainForm.pbLoad.Max := Length(panels);
-    MainForm.lLoad.Caption := _lc[I_LOAD_PANELS];
+    MainForm.lLoad.Caption := MsgLoadPanels;
 
     for a := 0 to High(panels) do
     begin
@@ -1590,7 +1614,7 @@ begin
   begin
     MainForm.pbLoad.Position := 0;
     MainForm.pbLoad.Max := Length(items);
-    MainForm.lLoad.Caption := _lc[I_LOAD_ITEMS];
+    MainForm.lLoad.Caption := MsgLoadItems;
 
     for a := 0 to High(items) do
     begin
@@ -1614,7 +1638,7 @@ begin
   begin
     MainForm.pbLoad.Position := 0;
     MainForm.pbLoad.Max := Length(monsters);
-    MainForm.lLoad.Caption := _lc[I_LOAD_MONSTERS];
+    MainForm.lLoad.Caption := MsgLoadMonsters;
 
     for a := 0 to High(monsters) do
     begin
@@ -1637,7 +1661,7 @@ begin
   begin
     MainForm.pbLoad.Position := 0;
     MainForm.pbLoad.Max := Length(areas);
-    MainForm.lLoad.Caption := _lc[I_LOAD_AREAS];
+    MainForm.lLoad.Caption := MsgLoadAreas;
 
     for a := 0 to High(areas) do
     begin
@@ -1660,7 +1684,7 @@ begin
   begin
     MainForm.pbLoad.Position := 0;
     MainForm.pbLoad.Max := Length(triggers);
-    MainForm.lLoad.Caption := _lc[I_LOAD_TRIGGERS];
+    MainForm.lLoad.Caption := MsgLoadTriggers;
 
     for a := 0 to High(triggers) do
     begin
@@ -1716,9 +1740,9 @@ end;
 
 function LoadMapOld(_FileName: String): Boolean;
 const
-  TexturePrefix = 'Standart.wad:STDTEXTURES\';
-  DefaultMusRes = 'Standart.wad:STDMUS\MUS1';
-  DefaultSkyRes = 'Standart.wad:STDSKY\SKY0';
+  TexturePrefix = 'standart.wad:STDTEXTURES\';
+  DefaultMusRes = 'standart.wad:STDMUS\MUS1';
+  DefaultSkyRes = 'standart.wad:STDSKY\SKY0';
 
 var
   map: TConfig;
@@ -1736,7 +1760,7 @@ begin
 
 // Открытие карты:
   MainForm.pbLoad.Position := 0;
-  MainForm.lLoad.Caption := _lc[I_LOAD_MAP];;
+  MainForm.lLoad.Caption := MsgLoadMap;;
   Application.ProcessMessages();
 
   map := TConfig.CreateFile(_FileName);
@@ -1746,25 +1770,25 @@ begin
 
   MainForm.pbLoad.Max := i;
   MainForm.pbLoad.Position := 0;
-  MainForm.lLoad.Caption := _lc[I_LOAD_TEXTURES];
+  MainForm.lLoad.Caption := MsgLoadTextures;
 
   for a := 1 to i do
   begin
     MainForm.pbLoad.StepIt();
     Application.ProcessMessages();
 
-    s := TexturePrefix + UpperCase(map.ReadStr('Textures', 'TextureName'+IntToStr(a), ''));
+    s := TexturePrefix + UpperCase(win2utf(map.ReadStr('Textures', 'TextureName'+IntToStr(a), '')));
     if s = TexturePrefix then
       Continue;
 
   // Нет такой текстуры - ищем в WAD карты:
-    if not g_CreateTextureWAD(s, EditorDir+'wads/'+s) then
+    if not g_CreateTextureWAD(s, WadsDir + DirectorySeparator + s) then
     begin
       s := ExtractFileName(_FileName);
       Delete(s, Length(s)-3, 4);
       s := UpperCase(s) + '.WAD:TEXTURES\'+ UpperCase(win2utf(map.ReadStr('Textures', 'TextureName'+IntToStr(a), '')));
 
-      if not g_CreateTextureWAD(s, EditorDir+'wads/'+s) then
+      if not g_CreateTextureWAD(s, WadsDir + DirectorySeparator + s) then
         Continue;
     end;
 
@@ -1776,7 +1800,7 @@ begin
 
   MainForm.pbLoad.Max := i;
   MainForm.pbLoad.Position := 0;
-  MainForm.lLoad.Caption := _lc[I_LOAD_PANELS];
+  MainForm.lLoad.Caption := MsgLoadPanels;
 
   for a := 1 to i do
   begin
@@ -1787,6 +1811,7 @@ begin
     if not map.SectionExists(section) then
       Continue;
 
+    panel := Default(TPanel);
     panel.X := map.ReadInt(section, 'X1', 0);
     panel.Y := map.ReadInt(section, 'Y1', 0);
     panel.Height := map.ReadInt(section, 'Height', 16);
@@ -1803,11 +1828,12 @@ begin
     end;
 
     panel.Alpha := map.ReadInt(section, 'Alpha', 0);
+    panel.Blending := false;
 
   // Текстура панели:
     if panel.PanelType in [PANEL_WALL, PANEL_BACK, PANEL_FORE, PANEL_STEP] then
       begin
-        s := TexturePrefix + UpperCase(map.ReadStr(section, 'TextureName', ''));
+        s := TexturePrefix + UpperCase(win2utf(map.ReadStr(section, 'TextureName', '')));
 
         if g_GetTexture(s, panel.TextureID) then
           begin
@@ -1865,7 +1891,7 @@ begin
 
   MainForm.pbLoad.Max := i;
   MainForm.pbLoad.Position := 0;
-  MainForm.lLoad.Caption := _lc[I_LOAD_ITEMS];
+  MainForm.lLoad.Caption := MsgLoadItems;
 
   for a := 1 to i do
   begin
@@ -1876,6 +1902,7 @@ begin
     if not map.SectionExists(section) then
       Continue;
 
+    item := Default(TItem);
     item.X := map.ReadInt(section, 'X', 0);
     item.Y := map.ReadInt(section, 'Y', 0);
     item.ItemType := ITEMSCONVERT[map.ReadInt(section, 'Type', 0)];
@@ -1894,7 +1921,7 @@ begin
 
   MainForm.pbLoad.Max := i;
   MainForm.pbLoad.Position := 0;
-  MainForm.lLoad.Caption := _lc[I_LOAD_AREAS];
+  MainForm.lLoad.Caption := MsgLoadAreas;
 
   for a := 1 to i do
   begin
@@ -1905,6 +1932,7 @@ begin
     if not map.SectionExists(section) then
       Continue;
 
+    area := Default(TArea);
     area.X := map.ReadInt(section, 'X', 0);
     area.Y := map.ReadInt(section, 'Y', 0);
     area.AreaType := map.ReadInt(section, 'Type', 0);
@@ -1918,10 +1946,11 @@ begin
   end;
 
 // Чтение параметров карты:
+  gMapInfo := Default(TMapInfo);
   with gMapInfo do
   begin
-    Name := map.ReadStr('MapOptions', 'MapName', '');
-    Description := map.ReadStr('MapOptions', 'MapDescription', '');
+    Name := win2utf(map.ReadStr('MapOptions', 'MapName', ''));
+    Description := win2utf(map.ReadStr('MapOptions', 'MapDescription', ''));
     Author := '';
     MusicName := DefaultMusRes;
     SkyName := DefaultSkyRes;
@@ -1935,6 +1964,8 @@ begin
       SetLength(Description, 256);
   end;
 
+  LoadSky(gMapInfo.SkyName);
+
   map.Free();
 
   Result := True;
@@ -1961,17 +1992,9 @@ begin
   SetLength(gTriggers, 0);
   gTriggers := nil;
 
-  with gMapInfo do
-  begin
-    Name := '';
-    Description := '';
-    Author := '';
-    MusicName := '';
-    SkyName := '';
-    FileName := '';
-    Height := 1600;
-    Width := 1600;
-  end;
+  gMapInfo := Default(TMapInfo);
+  gMapInfo.Width := 1600;
+  gMapInfo.Height := 1600;
 
   with MainForm.lbTextureList do
   begin
@@ -2001,7 +2024,7 @@ procedure DrawPanels(fPanelType: Word);
     begin
       case TextureID of
         TEXTURE_SPECIAL_NONE:
-          if not PreviewMode then
+          if PreviewMode = 0 then
             e_DrawFillQuad(X+MapOffset.X, Y+MapOffset.Y,
                            X+MapOffset.X+Width-1, Y+MapOffset.Y+Height-1,
                            64, 64, 64, 127);
@@ -2015,7 +2038,7 @@ procedure DrawPanels(fPanelType: Word);
           end;
 
         TEXTURE_SPECIAL_WATER:
-          if PreviewMode then
+          if PreviewMode > 0 then
             e_DrawFillQuad(X+MapOffset.X, Y+MapOffset.Y,
                            X+MapOffset.X+Width-1, Y+MapOffset.Y+Height-1,
                            0, 0, 255, 0, B_FILTER)
@@ -2025,7 +2048,7 @@ procedure DrawPanels(fPanelType: Word);
                            0, 0, 255, 127);
 
         TEXTURE_SPECIAL_ACID1:
-          if PreviewMode then
+          if PreviewMode > 0 then
             e_DrawFillQuad(X+MapOffset.X, Y+MapOffset.Y,
                            X+MapOffset.X+Width-1, Y+MapOffset.Y+Height-1,
                            0, 127, 0, 0, B_FILTER)
@@ -2035,7 +2058,7 @@ procedure DrawPanels(fPanelType: Word);
                            0, 255, 0, 127);
 
         TEXTURE_SPECIAL_ACID2:
-          if PreviewMode then
+          if PreviewMode > 0 then
             e_DrawFillQuad(X+MapOffset.X, Y+MapOffset.Y,
                            X+MapOffset.X+Width-1, Y+MapOffset.Y+Height-1,
                            127, 0, 0, 0, B_FILTER)
@@ -2070,27 +2093,27 @@ begin
               DrawTexture(a);
 
             PANEL_LIFTUP:
-              if not PreviewMode then
+              if PreviewMode = 0 then
                 e_DrawFillQuad(X+MapOffset.X, Y+MapOffset.Y,
                                X+MapOffset.X+Width-1, Y+MapOffset.Y+Height-1,
                                128, 64, 0, 0);
             PANEL_LIFTDOWN:
-              if not PreviewMode then
+              if PreviewMode = 0 then
                 e_DrawFillQuad(X+MapOffset.X, Y+MapOffset.Y,
                                X+MapOffset.X+Width-1, Y+MapOffset.Y+Height-1,
                                90, 154, 138, 0);
             PANEL_LIFTLEFT:
-              if not PreviewMode then
+              if PreviewMode = 0 then
                 e_DrawFillQuad(X+MapOffset.X, Y+MapOffset.Y,
                                X+MapOffset.X+Width-1, Y+MapOffset.Y+Height-1,
                                200, 80,  4, 0);
             PANEL_LIFTRIGHT:
-              if not PreviewMode then
+              if PreviewMode = 0 then
                 e_DrawFillQuad(X+MapOffset.X, Y+MapOffset.Y,
                                X+MapOffset.X+Width-1, Y+MapOffset.Y+Height-1,
                                252, 140, 56, 0);
             PANEL_BLOCKMON:
-              if not PreviewMode then
+              if PreviewMode = 0 then
                 e_DrawFillQuad(X+MapOffset.X, Y+MapOffset.Y,
                                X+MapOffset.X+Width-1, Y+MapOffset.Y+Height-1,
                                192, 0, 192, 0);
@@ -2098,6 +2121,39 @@ begin
         end;
 end;
 
+procedure DrawContours (fPanelType: Word);
+  var i, xx, yy, ww, hh: Integer;
+begin
+  if gPanels <> nil then
+    for i := 0 to High(gPanels) do
+      if (gPanels[i].PanelType <> 0) and WordBool(gPanels[i].PanelType and fPanelType) then
+      begin
+        xx := gPanels[i].X + MapOffset.X;
+        yy := gPanels[i].Y + MapOffset.Y;
+        ww := gPanels[i].X + MapOffset.X + gPanels[i].Width - 1;
+        hh := gPanels[i].Y + MapOffset.Y + gPanels[i].Height - 1;        
+        case gPanels[i].PanelType of
+          PANEL_NONE: ;
+          PANEL_WALL:      e_DrawQuad(xx, yy, ww, hh, 208, 208, 208, 0);
+          PANEL_BACK:      e_DrawQuad(xx, yy, ww, hh,   64, 64,  64, 0);
+          PANEL_FORE:      e_DrawQuad(xx, yy, ww, hh, 128, 128, 128, 0);
+          PANEL_WATER:     e_DrawQuad(xx, yy, ww, hh,   0,   0, 192, 0);
+          PANEL_ACID1:     e_DrawQuad(xx, yy, ww, hh,   0, 176,   0, 0);
+          PANEL_ACID2:     e_DrawQuad(xx, yy, ww, hh, 176,   0,   0, 0);
+          PANEL_STEP:      e_DrawQuad(xx, yy, ww, hh, 128, 128, 128, 0);
+          PANEL_LIFTUP:    e_DrawQuad(xx, yy, ww, hh, 116,  72,  36, 0);
+          PANEL_LIFTDOWN:  e_DrawQuad(xx, yy, ww, hh, 116, 124,  96, 0);
+          PANEL_OPENDOOR:  e_DrawQuad(xx, yy, ww, hh, 100, 220,  92, 0);
+          PANEL_CLOSEDOOR: e_DrawQuad(xx, yy, ww, hh, 212, 184,  64, 0);
+          PANEL_BLOCKMON:  e_DrawQuad(xx, yy, ww, hh, 192,   0, 192, 0);
+          PANEL_LIFTLEFT:  e_DrawQuad(xx, yy, ww, hh, 200,  80,   4, 0);
+          PANEL_LIFTRIGHT: e_DrawQuad(xx, yy, ww, hh, 252, 140,  56, 0);
+        else
+          assert(false)
+        end;
+      end;
+end;
+
 procedure DrawMap();
 var
   a, w, h: Integer;
@@ -2106,11 +2162,11 @@ var
   ww, hh: Word;
   sel: Boolean;
   r: TRectWH;
-
+  mask: Word;
 begin
   ID := 0;
 // В режиме Превью рисуем небо:
-  if PreviewMode then
+  if PreviewMode > 0 then
   begin
     w := Max(MainForm.RenderPanel.Width, MainForm.RenderPanel.Height);
     if MainForm.RenderPanel.Height > MainForm.RenderPanel.Width*3/4 then
@@ -2124,21 +2180,21 @@ begin
   end;
 
 // Рисуем панели (если Превью или если включен слой):
-  if LayerEnabled[LAYER_BACK] or PreviewMode then
+  if LayerEnabled[LAYER_BACK] or (PreviewMode = 1) then
     DrawPanels(PANEL_BACK);
-  if PreviewMode then
+  if PreviewMode > 0 then
     DrawPanels(PANEL_LIFTUP or PANEL_LIFTDOWN or PANEL_LIFTLEFT or PANEL_LIFTRIGHT)
   else
     if LayerEnabled[LAYER_WATER] then
       DrawPanels(PANEL_LIFTUP or PANEL_LIFTDOWN or PANEL_LIFTLEFT or PANEL_LIFTRIGHT or
                  PANEL_OPENDOOR or PANEL_CLOSEDOOR or PANEL_BLOCKMON);
-  if LayerEnabled[LAYER_WALLS] or PreviewMode then
+  if LayerEnabled[LAYER_WALLS] or (PreviewMode = 1) then
     DrawPanels(PANEL_WALL);
-  if LayerEnabled[LAYER_STEPS] or PreviewMode then
+  if LayerEnabled[LAYER_STEPS] or (PreviewMode = 1) then
     DrawPanels(PANEL_STEP);
 
 // Рисуем предметы:
-  if (LayerEnabled[LAYER_ITEMS] or PreviewMode) and
+  if (LayerEnabled[LAYER_ITEMS] or (PreviewMode = 1)) and
      (gItems <> nil) then
     for a := 0 to High(gItems) do
       if gItems[a].ItemType <> ITEM_NONE then
@@ -2165,7 +2221,7 @@ begin
             ITEM_WEAPON_ROCKETLAUNCHER: g_GetTexture('ITEM_WEAPON_ROCKETLAUNCHER', ID);
             ITEM_WEAPON_PLASMA: g_GetTexture('ITEM_WEAPON_PLASMA', ID);
             ITEM_WEAPON_BFG: g_GetTexture('ITEM_WEAPON_BFG', ID);
-            ITEM_WEAPON_SUPERPULEMET: g_GetTexture('ITEM_WEAPON_SUPERPULEMET', ID);
+            ITEM_WEAPON_SUPERCHAINGUN: g_GetTexture('ITEM_WEAPON_SUPERCHAINGUN', ID);
             ITEM_AMMO_BULLETS: g_GetTexture('ITEM_AMMO_BULLETS', ID);
             ITEM_AMMO_BULLETS_BOX: g_GetTexture('ITEM_AMMO_BULLETS_BOX', ID);
             ITEM_AMMO_SHELLS: g_GetTexture('ITEM_AMMO_SHELLS', ID);
@@ -2191,13 +2247,14 @@ begin
         end;
 
 // Рисуем монстров:
-  if (LayerEnabled[LAYER_MONSTERS] or PreviewMode) and
+  if (LayerEnabled[LAYER_MONSTERS] or (PreviewMode = 1)) and
      (gMonsters <> nil) then
     for a := 0 to High(gMonsters) do
       if gMonsters[a].MonsterType <> MONSTER_NONE then
         with MonsterSize[gMonsters[a].MonsterType] do
         begin
           ID := DWORD(-1);
+          sel := ObjectSelected(OBJECT_MONSTER, a);
 
           case gMonsters[a].MonsterType of
             0: Continue;
@@ -2252,26 +2309,28 @@ begin
               end;
 
         // Рамка:
-          if not PreviewMode then
+          if PreviewMode = 0 then
           begin
             e_DrawQuad(MapOffset.X+gMonsters[a].X, MapOffset.Y+gMonsters[a].Y,
                        MapOffset.X+gMonsters[a].X+Width-1, MapOffset.Y+gMonsters[a].Y+Height-1,
-                       255, 255, 255);
+                       255, 255, 255, IfThen(sel, 0, gAlphaMonsterRect));
           end;
         end;
 
 // Рисуем закрытые двери после монстров:
-  if PreviewMode then
+  if ((PreviewMode = 2) and LayerEnabled[LAYER_WATER])
+  or (PreviewMode = 1) then
     DrawPanels(PANEL_CLOSEDOOR);
 
 // Рисуем области:
-  if (LayerEnabled[LAYER_AREAS] or PreviewMode) and
+  if (LayerEnabled[LAYER_AREAS] or (PreviewMode = 1)) and
      (gAreas <> nil) then
     for a := 0 to High(gAreas) do
       if gAreas[a].AreaType <> AREA_NONE then
         with AreaSize[gAreas[a].AreaType] do
         begin
           ID := DWORD(-1);
+          sel := ObjectSelected(OBJECT_AREA, a);
 
           case gAreas[a].AreaType of
             AREA_PLAYERPOINT1: g_GetTexture('AREA_PLAYERPOINT1', ID);
@@ -2284,7 +2343,7 @@ begin
             AREA_BLUETEAMPOINT: g_GetTexture('AREA_BLUEPOINT', ID);
           end;
 
-          if (not PreviewMode) or
+          if (PreviewMode = 0) or
              (gAreas[a].AreaType = AREA_REDFLAG) or
              (gAreas[a].AreaType = AREA_BLUEFLAG) or
              (gAreas[a].AreaType = AREA_DOMFLAG) then
@@ -2297,25 +2356,25 @@ begin
                        0, True, False);
 
         // Рамка:
-          if not PreviewMode then
+          if PreviewMode = 0 then
           begin
             e_DrawQuad(MapOffset.X+gAreas[a].X, MapOffset.Y+gAreas[a].Y,
                        MapOffset.X+gAreas[a].X+Width-1, MapOffset.Y+gAreas[a].Y+Height-1,
-                       255, 255, 255);
+                       255, 255, 255, IfThen(sel, 0, gAlphaAreaRect));
 
             e_DrawPoint(2, MapOffset.X+gAreas[a].X, MapOffset.Y+gAreas[a].Y, 255, 0, 0);
           end;
         end;
 
 // Рисуем жидкости и передний план после областей:
-  if LayerEnabled[LAYER_WATER] or PreviewMode then
+  if LayerEnabled[LAYER_WATER] or (PreviewMode = 1) then
     DrawPanels(PANEL_WATER or PANEL_ACID1 or PANEL_ACID2);
-  if LayerEnabled[LAYER_FOREGROUND] or PreviewMode then
+  if LayerEnabled[LAYER_FOREGROUND] or (PreviewMode = 1) then
     DrawPanels(PANEL_FORE);
 
 // Рисуем триггеры:
   if LayerEnabled[LAYER_TRIGGERS] and
-     (not PreviewMode) and (gTriggers <> nil) then
+     (PreviewMode = 0) and (gTriggers <> nil) then
     for a := 0 to High(gTriggers) do
       with gTriggers[a] do
         if TriggerType <> TRIGGER_NONE then
@@ -2556,7 +2615,7 @@ begin
                         ITEM_WEAPON_ROCKETLAUNCHER: g_GetTexture('ITEM_WEAPON_ROCKETLAUNCHER', ID);
                         ITEM_WEAPON_PLASMA: g_GetTexture('ITEM_WEAPON_PLASMA', ID);
                         ITEM_WEAPON_BFG: g_GetTexture('ITEM_WEAPON_BFG', ID);
-                        ITEM_WEAPON_SUPERPULEMET: g_GetTexture('ITEM_WEAPON_SUPERPULEMET', ID);
+                        ITEM_WEAPON_SUPERCHAINGUN: g_GetTexture('ITEM_WEAPON_SUPERCHAINGUN', ID);
                         ITEM_AMMO_BULLETS: g_GetTexture('ITEM_AMMO_BULLETS', ID);
                         ITEM_AMMO_BULLETS_BOX: g_GetTexture('ITEM_AMMO_BULLETS_BOX', ID);
                         ITEM_AMMO_SHELLS: g_GetTexture('ITEM_AMMO_SHELLS', ID);
@@ -2647,28 +2706,85 @@ begin
           end;
         end;
 
+// Draw panel contours
+  mask := 0;
+  if ContourEnabled[LAYER_BACK] then
+    mask := mask or PANEL_BACK;
+  if ContourEnabled[LAYER_WALLS] then
+    mask := mask or PANEL_WALL;
+  if ContourEnabled[LAYER_FOREGROUND] then
+    mask := mask or PANEL_FORE;
+  if ContourEnabled[LAYER_STEPS] then
+    mask := mask or PANEL_STEP;
+  if ContourEnabled[LAYER_WATER] then
+    mask := mask or PANEL_WATER or PANEL_ACID1 or PANEL_ACID2
+                 or PANEL_OPENDOOR or PANEL_CLOSEDOOR or PANEL_BLOCKMON
+                 or PANEL_LIFTUP or PANEL_LIFTDOWN or PANEL_LIFTLEFT or PANEL_LIFTRIGHT;
+  if mask <> 0 then
+    DrawContours(mask);
+  if ContourEnabled[LAYER_ITEMS] and (gItems <> nil) then
+    for a := 0 to High(gItems) do
+      if gItems[a].ItemType <> ITEM_NONE then
+        e_DrawQuad(
+          MapOffset.X + gItems[a].X,
+          MapOffset.Y + gItems[a].Y,
+          MapOffset.X + gItems[a].X + ItemSize[gItems[a].ItemType, 0] - 1,
+          MapOffset.Y + gItems[a].Y + ItemSize[gItems[a].ItemType, 1] - 1,
+          0, 255, 255
+        );
+  if ContourEnabled[LAYER_MONSTERS] and (gMonsters <> nil) then
+    for a := 0 to High(gMonsters) do
+      if gMonsters[a].MonsterType <> MONSTER_NONE then
+        e_DrawQuad(
+          MapOffset.X + gMonsters[a].X,
+          MapOffset.Y + gMonsters[a].Y,
+          MapOffset.X + gMonsters[a].X + MonsterSize[gMonsters[a].MonsterType].Width - 1,
+          MapOffset.Y + gMonsters[a].Y + MonsterSize[gMonsters[a].MonsterType].Height - 1,
+          200, 0, 0
+        );
+  if ContourEnabled[LAYER_AREAS] and (gAreas <> nil) then
+    for a := 0 to High(gAreas) do
+      if gAreas[a].AreaType <> AREA_NONE then
+        e_DrawQuad(
+          MapOffset.X + gAreas[a].X,
+          MapOffset.Y + gAreas[a].Y,
+          MapOffset.X + gAreas[a].X + AreaSize[gAreas[a].AreaType].Width - 1,
+          MapOffset.Y + gAreas[a].Y + AreaSize[gAreas[a].AreaType].Height - 1,
+          0, 255, 255
+        );
+  if ContourEnabled[LAYER_TRIGGERS] and (gTriggers <> nil) then
+    for a := 0 to High(gTriggers) do
+      if gTriggers[a].TriggerType <> TRIGGER_NONE then
+        e_DrawQuad(
+          MapOffset.X + gTriggers[a].X,
+          MapOffset.Y + gTriggers[a].Y,
+          MapOffset.X + gTriggers[a].X + gTriggers[a].Width - 1,
+          MapOffset.Y + gTriggers[a].Y + gTriggers[a].Height - 1,
+          255, 255, 0
+        );
+
 // Границы карты:
-  if not PreviewMode then
+  if PreviewMode = 0 then
   begin
-    e_DrawFillQuad(-32+MapOffset.X,
-                   -32+MapOffset.Y,
-                   gMapInfo.Width+31+MapOffset.X,
-                   -1+MapOffset.Y,
+    e_DrawFillQuad(0,
+                   0,
+                   MainForm.RenderPanel.Width,
+                   -1 + MapOffset.Y,
                    drEdge[0], drEdge[1], drEdge[2], drEdge[3], B_NONE); // Top
-    e_DrawFillQuad(-32+MapOffset.X,
-                   gMapInfo.Height+MapOffset.Y,
-                   gMapInfo.Width+31+MapOffset.X,
-                   gMapInfo.Height+31+MapOffset.Y,
+    e_DrawFillQuad(0,
+                   gMapInfo.Height + MapOffset.Y,
+                   MainForm.RenderPanel.Width,
+                   MainForm.RenderPanel.Height,
                    drEdge[0], drEdge[1], drEdge[2], drEdge[3], B_NONE); // Bottom
-    e_DrawFillQuad(-32+MapOffset.X,
+    e_DrawFillQuad(0,
                    MapOffset.Y,
-                   -1+MapOffset.X,
-                   gMapInfo.Height+MapOffset.Y-1,
+                   -1 + MapOffset.X,
+                   gMapInfo.Height + MapOffset.Y - 1,
                    drEdge[0], drEdge[1], drEdge[2], drEdge[3], B_NONE); // Left
-    e_DrawFillQuad(gMapInfo.Width+MapOffset.X,
+    e_DrawFillQuad(gMapInfo.Width + MapOffset.X,
                    MapOffset.Y,
-                   gMapInfo.Width+31+MapOffset.X,
-                   gMapInfo.Height+MapOffset.Y-1,
+                   MainForm.RenderPanel.Width,
+                   gMapInfo.Height + MapOffset.Y - 1,
                    drEdge[0], drEdge[1], drEdge[2], drEdge[3], B_NONE); // Right
   end;
 end;
@@ -2753,79 +2869,79 @@ end;
 
 procedure LoadData();
 begin
- g_CreateTextureWAD('PREVIEW', EditorDir+'data/Editor.wad:TEXTURES\CHECKERS');
- g_CreateTextureWAD('NOTEXTURE', EditorDir+'data/Game.wad:TEXTURES\NOTEXTURE');
-
- g_CreateTextureWADSize('AREA_REDFLAG', EditorDir+'data/Game.wad:TEXTURES\FLAGRED', 0, 0, 64, 64);
- g_CreateTextureWADSize('AREA_BLUEFLAG', EditorDir+'data/Game.wad:TEXTURES\FLAGBLUE', 0, 0, 64, 64);
- g_CreateTextureWADSize('AREA_DOMFLAG', EditorDir+'data/Game.wad:TEXTURES\FLAGDOM', 0, 0, 64, 64);
-
- g_CreateTextureWADSize('MONSTER_DEMON', EditorDir+'data/Game.wad:MTEXTURES\DEMON_SLEEP', 0, 0, 64, 64);
- g_CreateTextureWADSize('MONSTER_IMP', EditorDir+'data/Game.wad:MTEXTURES\IMP_SLEEP', 0, 0, 64, 64);
- g_CreateTextureWADSize('MONSTER_ZOMBY', EditorDir+'data/Game.wad:MTEXTURES\ZOMBY_SLEEP', 0, 0, 64, 64);
- g_CreateTextureWADSize('MONSTER_SERG', EditorDir+'data/Game.wad:MTEXTURES\SERG_SLEEP', 0, 0, 64, 64);
- g_CreateTextureWADSize('MONSTER_CYBER', EditorDir+'data/Game.wad:MTEXTURES\CYBER_SLEEP', 0, 0, 128, 128);
- g_CreateTextureWADSize('MONSTER_CGUN', EditorDir+'data/Game.wad:MTEXTURES\CGUN_SLEEP', 0, 0, 64, 64);
- g_CreateTextureWADSize('MONSTER_BARON', EditorDir+'data/Game.wad:MTEXTURES\BARON_SLEEP', 0, 0, 128, 128);
- g_CreateTextureWADSize('MONSTER_KNIGHT', EditorDir+'data/Game.wad:MTEXTURES\KNIGHT_SLEEP', 0, 0, 128, 128);
- g_CreateTextureWADSize('MONSTER_CACO', EditorDir+'data/Game.wad:MTEXTURES\CACO_SLEEP', 0, 0, 128, 128);
- g_CreateTextureWADSize('MONSTER_SOUL', EditorDir+'data/Game.wad:MTEXTURES\SOUL_SLEEP', 0, 0, 64, 64);
- g_CreateTextureWADSize('MONSTER_PAIN', EditorDir+'data/Game.wad:MTEXTURES\PAIN_SLEEP', 0, 0, 128, 128);
- g_CreateTextureWADSize('MONSTER_SPIDER', EditorDir+'data/Game.wad:MTEXTURES\SPIDER_SLEEP', 0, 0, 256, 128);
- g_CreateTextureWADSize('MONSTER_BSP', EditorDir+'data/Game.wad:MTEXTURES\BSP_SLEEP', 0, 0, 128, 64);
- g_CreateTextureWADSize('MONSTER_MANCUB', EditorDir+'data/Game.wad:MTEXTURES\MANCUB_SLEEP', 0, 0, 128, 128);
- g_CreateTextureWADSize('MONSTER_SKEL', EditorDir+'data/Game.wad:MTEXTURES\SKEL_SLEEP', 0, 0, 128, 128);
- g_CreateTextureWADSize('MONSTER_VILE', EditorDir+'data/Game.wad:MTEXTURES\VILE_SLEEP', 0, 0, 128, 128);
- g_CreateTextureWADSize('MONSTER_FISH', EditorDir+'data/Game.wad:MTEXTURES\FISH_SLEEP', 0, 0, 32, 32);
- g_CreateTextureWADSize('MONSTER_BARREL', EditorDir+'data/Game.wad:MTEXTURES\BARREL_SLEEP', 0, 0, 64, 64);
- g_CreateTextureWADSize('MONSTER_ROBO', EditorDir+'data/Game.wad:MTEXTURES\ROBO_SLEEP', 0, 0, 128, 128);
- g_CreateTextureWADSize('MONSTER_MAN', EditorDir+'data/Game.wad:MTEXTURES\MAN_SLEEP', 0, 0, 64, 64);
-
- g_CreateTextureWADSize('ITEM_BLUESPHERE', EditorDir+'data/Game.wad:TEXTURES\SBLUE', 0, 0, 32, 32);
- g_CreateTextureWADSize('ITEM_WHITESPHERE', EditorDir+'data/Game.wad:TEXTURES\SWHITE', 0, 0, 32, 32);
- g_CreateTextureWADSize('ITEM_ARMORGREEN', EditorDir+'data/Game.wad:TEXTURES\ARMORGREEN', 0, 0, 32, 16);
- g_CreateTextureWADSize('ITEM_ARMORBLUE', EditorDir+'data/Game.wad:TEXTURES\ARMORBLUE', 0, 0, 32, 16);
- g_CreateTextureWADSize('ITEM_INVUL', EditorDir+'data/Game.wad:TEXTURES\INVUL', 0, 0, 32, 32);
- g_CreateTextureWADSize('ITEM_BOTTLE', EditorDir+'data/Game.wad:TEXTURES\BOTTLE', 0, 0, 16, 32);
- g_CreateTextureWADSize('ITEM_HELMET', EditorDir+'data/Game.wad:TEXTURES\HELMET', 0, 0, 16, 16);
- g_CreateTextureWADSize('ITEM_INVIS', EditorDir+'data/Game.wad:TEXTURES\INVIS', 0, 0, 32, 32);
- g_CreateTextureWADSize('ITEM_WEAPON_FLAMETHROWER', EditorDir+'data/Game.wad:TEXTURES\FLAMETHROWER', 0, 0, 64, 32);
- g_CreateTextureWADSize('ITEM_AMMO_FUELCAN', EditorDir+'data/Game.wad:TEXTURES\FUELCAN', 0, 0, 16, 32);
-
- g_CreateTextureWAD('ITEM_MEDKIT_SMALL', EditorDir+'data/Game.wad:TEXTURES\MED1');
- g_CreateTextureWAD('ITEM_MEDKIT_LARGE', EditorDir+'data/Game.wad:TEXTURES\MED2');
- g_CreateTextureWAD('ITEM_WEAPON_SAW', EditorDir+'data/Game.wad:TEXTURES\SAW');
- g_CreateTextureWAD('ITEM_WEAPON_PISTOL', EditorDir+'data/Game.wad:TEXTURES\PISTOL');
- g_CreateTextureWAD('ITEM_WEAPON_KASTET', EditorDir+'data/Game.wad:TEXTURES\KASTET');
- g_CreateTextureWAD('ITEM_WEAPON_SHOTGUN1', EditorDir+'data/Game.wad:TEXTURES\SHOTGUN1');
- g_CreateTextureWAD('ITEM_WEAPON_SHOTGUN2', EditorDir+'data/Game.wad:TEXTURES\SHOTGUN2');
- g_CreateTextureWAD('ITEM_WEAPON_CHAINGUN', EditorDir+'data/Game.wad:TEXTURES\MGUN');
- g_CreateTextureWAD('ITEM_WEAPON_ROCKETLAUNCHER', EditorDir+'data/Game.wad:TEXTURES\RLAUNCHER');
- g_CreateTextureWAD('ITEM_WEAPON_PLASMA', EditorDir+'data/Game.wad:TEXTURES\PGUN');
- g_CreateTextureWAD('ITEM_WEAPON_BFG', EditorDir+'data/Game.wad:TEXTURES\BFG');
- g_CreateTextureWAD('ITEM_WEAPON_SUPERPULEMET', EditorDir+'data/Game.wad:TEXTURES\SPULEMET');
- g_CreateTextureWAD('ITEM_AMMO_BULLETS', EditorDir+'data/Game.wad:TEXTURES\CLIP');
- g_CreateTextureWAD('ITEM_AMMO_BULLETS_BOX', EditorDir+'data/Game.wad:TEXTURES\AMMO');
- g_CreateTextureWAD('ITEM_AMMO_SHELLS', EditorDir+'data/Game.wad:TEXTURES\SHELL1');
- g_CreateTextureWAD('ITEM_AMMO_SHELLS_BOX', EditorDir+'data/Game.wad:TEXTURES\SHELL2');
- g_CreateTextureWAD('ITEM_AMMO_ROCKET', EditorDir+'data/Game.wad:TEXTURES\ROCKET');
- g_CreateTextureWAD('ITEM_AMMO_ROCKET_BOX', EditorDir+'data/Game.wad:TEXTURES\ROCKETS');
- g_CreateTextureWAD('ITEM_AMMO_CELL', EditorDir+'data/Game.wad:TEXTURES\CELL');
- g_CreateTextureWAD('ITEM_AMMO_CELL_BIG', EditorDir+'data/Game.wad:TEXTURES\CELL2');
- g_CreateTextureWAD('ITEM_AMMO_BACKPACK', EditorDir+'data/Game.wad:TEXTURES\BPACK');
- g_CreateTextureWAD('ITEM_KEY_RED', EditorDir+'data/Game.wad:TEXTURES\KEYR');
- g_CreateTextureWAD('ITEM_KEY_GREEN', EditorDir+'data/Game.wad:TEXTURES\KEYG');
- g_CreateTextureWAD('ITEM_KEY_BLUE', EditorDir+'data/Game.wad:TEXTURES\KEYB');
- g_CreateTextureWAD('ITEM_OXYGEN', EditorDir+'data/Game.wad:TEXTURES\OXYGEN');
- g_CreateTextureWAD('ITEM_SUIT', EditorDir+'data/Game.wad:TEXTURES\SUIT');
- g_CreateTextureWAD('ITEM_MEDKIT_BLACK', EditorDir+'data/Game.wad:TEXTURES\BMED');
- g_CreateTextureWAD('ITEM_JETPACK', EditorDir+'data/Game.wad:TEXTURES\JETPACK');
-
- g_CreateTextureWAD('AREA_PLAYERPOINT1', EditorDir+'data/Editor.wad:TEXTURES\P1POINT');
- g_CreateTextureWAD('AREA_PLAYERPOINT2', EditorDir+'data/Editor.wad:TEXTURES\P2POINT');
- g_CreateTextureWAD('AREA_DMPOINT', EditorDir+'data/Editor.wad:TEXTURES\DMPOINT');
- g_CreateTextureWAD('AREA_REDPOINT', EditorDir+'data/Editor.wad:TEXTURES\REDPOINT');
- g_CreateTextureWAD('AREA_BLUEPOINT', EditorDir+'data/Editor.wad:TEXTURES\BLUEPOINT');
+ g_CreateTextureWAD('PREVIEW', EditorWad + ':TEXTURES\CHECKERS');
+ g_CreateTextureWAD('NOTEXTURE', GameWad + ':TEXTURES\NOTEXTURE');
+
+ g_CreateTextureWADSize('AREA_REDFLAG', GameWad + ':TEXTURES\FLAGRED', 0, 0, 64, 64);
+ g_CreateTextureWADSize('AREA_BLUEFLAG', GameWad + ':TEXTURES\FLAGBLUE', 0, 0, 64, 64);
+ g_CreateTextureWADSize('AREA_DOMFLAG', GameWad + ':TEXTURES\FLAGDOM', 0, 0, 64, 64);
+
+ g_CreateTextureWADSize('MONSTER_DEMON', GameWad + ':MTEXTURES\DEMON_SLEEP', 0, 0, 64, 64);
+ g_CreateTextureWADSize('MONSTER_IMP', GameWad + ':MTEXTURES\IMP_SLEEP', 0, 0, 64, 64);
+ g_CreateTextureWADSize('MONSTER_ZOMBY', GameWad + ':MTEXTURES\ZOMBY_SLEEP', 0, 0, 64, 64);
+ g_CreateTextureWADSize('MONSTER_SERG', GameWad + ':MTEXTURES\SERG_SLEEP', 0, 0, 64, 64);
+ g_CreateTextureWADSize('MONSTER_CYBER', GameWad + ':MTEXTURES\CYBER_SLEEP', 0, 0, 128, 128);
+ g_CreateTextureWADSize('MONSTER_CGUN', GameWad + ':MTEXTURES\CGUN_SLEEP', 0, 0, 64, 64);
+ g_CreateTextureWADSize('MONSTER_BARON', GameWad + ':MTEXTURES\BARON_SLEEP', 0, 0, 128, 128);
+ g_CreateTextureWADSize('MONSTER_KNIGHT', GameWad + ':MTEXTURES\KNIGHT_SLEEP', 0, 0, 128, 128);
+ g_CreateTextureWADSize('MONSTER_CACO', GameWad + ':MTEXTURES\CACO_SLEEP', 0, 0, 128, 128);
+ g_CreateTextureWADSize('MONSTER_SOUL', GameWad + ':MTEXTURES\SOUL_SLEEP', 0, 0, 64, 64);
+ g_CreateTextureWADSize('MONSTER_PAIN', GameWad + ':MTEXTURES\PAIN_SLEEP', 0, 0, 128, 128);
+ g_CreateTextureWADSize('MONSTER_SPIDER', GameWad + ':MTEXTURES\SPIDER_SLEEP', 0, 0, 256, 128);
+ g_CreateTextureWADSize('MONSTER_BSP', GameWad + ':MTEXTURES\BSP_SLEEP', 0, 0, 128, 64);
+ g_CreateTextureWADSize('MONSTER_MANCUB', GameWad + ':MTEXTURES\MANCUB_SLEEP', 0, 0, 128, 128);
+ g_CreateTextureWADSize('MONSTER_SKEL', GameWad + ':MTEXTURES\SKEL_SLEEP', 0, 0, 128, 128);
+ g_CreateTextureWADSize('MONSTER_VILE', GameWad + ':MTEXTURES\VILE_SLEEP', 0, 0, 128, 128);
+ g_CreateTextureWADSize('MONSTER_FISH', GameWad + ':MTEXTURES\FISH_SLEEP', 0, 0, 32, 32);
+ g_CreateTextureWADSize('MONSTER_BARREL', GameWad + ':MTEXTURES\BARREL_SLEEP', 0, 0, 64, 64);
+ g_CreateTextureWADSize('MONSTER_ROBO', GameWad + ':MTEXTURES\ROBO_SLEEP', 0, 0, 128, 128);
+ g_CreateTextureWADSize('MONSTER_MAN', GameWad + ':MTEXTURES\MAN_SLEEP', 0, 0, 64, 64);
+
+ g_CreateTextureWADSize('ITEM_BLUESPHERE', GameWad + ':TEXTURES\SBLUE', 0, 0, 32, 32);
+ g_CreateTextureWADSize('ITEM_WHITESPHERE', GameWad + ':TEXTURES\SWHITE', 0, 0, 32, 32);
+ g_CreateTextureWADSize('ITEM_ARMORGREEN', GameWad + ':TEXTURES\ARMORGREEN', 0, 0, 32, 16);
+ g_CreateTextureWADSize('ITEM_ARMORBLUE', GameWad + ':TEXTURES\ARMORBLUE', 0, 0, 32, 16);
+ g_CreateTextureWADSize('ITEM_INVUL', GameWad + ':TEXTURES\INVUL', 0, 0, 32, 32);
+ g_CreateTextureWADSize('ITEM_BOTTLE', GameWad + ':TEXTURES\BOTTLE', 0, 0, 16, 32);
+ g_CreateTextureWADSize('ITEM_HELMET', GameWad + ':TEXTURES\HELMET', 0, 0, 16, 16);
+ g_CreateTextureWADSize('ITEM_JETPACK', GameWad + ':TEXTURES\JETPACK', 0, 0, 32, 32);
+ g_CreateTextureWADSize('ITEM_INVIS', GameWad + ':TEXTURES\INVIS', 0, 0, 32, 32);
+ g_CreateTextureWADSize('ITEM_WEAPON_FLAMETHROWER', GameWad + ':TEXTURES\FLAMETHROWER', 0, 0, 64, 32);
+ g_CreateTextureWADSize('ITEM_AMMO_FUELCAN', GameWad + ':TEXTURES\FUELCAN', 0, 0, 16, 32);
+
+ g_CreateTextureWAD('ITEM_MEDKIT_SMALL', GameWad + ':TEXTURES\MED1');
+ g_CreateTextureWAD('ITEM_MEDKIT_LARGE', GameWad + ':TEXTURES\MED2');
+ g_CreateTextureWAD('ITEM_WEAPON_SAW', GameWad + ':TEXTURES\SAW');
+ g_CreateTextureWAD('ITEM_WEAPON_PISTOL', GameWad + ':TEXTURES\PISTOL');
+ g_CreateTextureWAD('ITEM_WEAPON_IRONFIST', GameWad + ':TEXTURES\IRONFIST');
+ g_CreateTextureWAD('ITEM_WEAPON_SHOTGUN1', GameWad + ':TEXTURES\SHOTGUN1');
+ g_CreateTextureWAD('ITEM_WEAPON_SHOTGUN2', GameWad + ':TEXTURES\SHOTGUN2');
+ g_CreateTextureWAD('ITEM_WEAPON_CHAINGUN', GameWad + ':TEXTURES\MGUN');
+ g_CreateTextureWAD('ITEM_WEAPON_ROCKETLAUNCHER', GameWad + ':TEXTURES\RLAUNCHER');
+ g_CreateTextureWAD('ITEM_WEAPON_PLASMA', GameWad + ':TEXTURES\PGUN');
+ g_CreateTextureWAD('ITEM_WEAPON_BFG', GameWad + ':TEXTURES\BFG');
+ g_CreateTextureWAD('ITEM_WEAPON_SUPERCHAINGUN', GameWad + ':TEXTURES\SCHAINGUN');
+ g_CreateTextureWAD('ITEM_AMMO_BULLETS', GameWad + ':TEXTURES\CLIP');
+ g_CreateTextureWAD('ITEM_AMMO_BULLETS_BOX', GameWad + ':TEXTURES\AMMO');
+ g_CreateTextureWAD('ITEM_AMMO_SHELLS', GameWad + ':TEXTURES\SHELL1');
+ g_CreateTextureWAD('ITEM_AMMO_SHELLS_BOX', GameWad + ':TEXTURES\SHELL2');
+ g_CreateTextureWAD('ITEM_AMMO_ROCKET', GameWad + ':TEXTURES\ROCKET');
+ g_CreateTextureWAD('ITEM_AMMO_ROCKET_BOX', GameWad + ':TEXTURES\ROCKETS');
+ g_CreateTextureWAD('ITEM_AMMO_CELL', GameWad + ':TEXTURES\CELL');
+ g_CreateTextureWAD('ITEM_AMMO_CELL_BIG', GameWad + ':TEXTURES\CELL2');
+ g_CreateTextureWAD('ITEM_AMMO_BACKPACK', GameWad + ':TEXTURES\BPACK');
+ g_CreateTextureWAD('ITEM_KEY_RED', GameWad + ':TEXTURES\KEYR');
+ g_CreateTextureWAD('ITEM_KEY_GREEN', GameWad + ':TEXTURES\KEYG');
+ g_CreateTextureWAD('ITEM_KEY_BLUE', GameWad + ':TEXTURES\KEYB');
+ g_CreateTextureWAD('ITEM_OXYGEN', GameWad + ':TEXTURES\OXYGEN');
+ g_CreateTextureWAD('ITEM_SUIT', GameWad + ':TEXTURES\SUIT');
+ g_CreateTextureWAD('ITEM_MEDKIT_BLACK', GameWad + ':TEXTURES\BMED');
+
+ g_CreateTextureWAD('AREA_PLAYERPOINT1', EditorWad + ':TEXTURES\P1POINT');
+ g_CreateTextureWAD('AREA_PLAYERPOINT2', EditorWad + ':TEXTURES\P2POINT');
+ g_CreateTextureWAD('AREA_DMPOINT', EditorWad + ':TEXTURES\DMPOINT');
+ g_CreateTextureWAD('AREA_REDPOINT', EditorWad + ':TEXTURES\REDPOINT');
+ g_CreateTextureWAD('AREA_BLUEPOINT', EditorWad + ':TEXTURES\BLUEPOINT');
 end;
 
 procedure FreeData();
@@ -2876,14 +2992,14 @@ begin
  g_DeleteTexture('ITEM_MEDKIT_LARGE');
  g_DeleteTexture('ITEM_WEAPON_SAW');
  g_DeleteTexture('ITEM_WEAPON_PISTOL');
- g_DeleteTexture('ITEM_WEAPON_KASTET');
+ g_DeleteTexture('ITEM_WEAPON_IRONFIST');
  g_DeleteTexture('ITEM_WEAPON_SHOTGUN1');
  g_DeleteTexture('ITEM_WEAPON_SHOTGUN2');
  g_DeleteTexture('ITEM_WEAPON_CHAINGUN');
  g_DeleteTexture('ITEM_WEAPON_ROCKETLAUNCHER');
  g_DeleteTexture('ITEM_WEAPON_PLASMA');
  g_DeleteTexture('ITEM_WEAPON_BFG');
- g_DeleteTexture('ITEM_WEAPON_SUPERPULEMET');
+ g_DeleteTexture('ITEM_WEAPON_SUPERCHAINGUN');
  g_DeleteTexture('ITEM_AMMO_BULLETS');
  g_DeleteTexture('ITEM_AMMO_BULLETS_BOX');
  g_DeleteTexture('ITEM_AMMO_SHELLS');