DEADSOFTWARE

get rid of "kastet" and "pulemet" in symbols
[d2df-editor.git] / src / editor / g_map.pas
index 0c35d481384f5164798248af97a007c9244106b7..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
@@ -233,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();
@@ -246,7 +246,7 @@ implementation
 
 uses
   BinEditor, g_textures, Dialogs, SysUtils, CONFIG, f_main,
-  Forms, Math, f_addresource_texture, WADEDITOR, g_language, g_resources, g_options;
+  Forms, Math, f_addresource_texture, WADEDITOR, g_language, g_options;
 
 const
   OLD_ITEM_MEDKIT_SMALL          = 1;
@@ -262,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;
@@ -294,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),
@@ -330,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
@@ -1051,8 +1051,9 @@ begin
         Result := TEXTURE_SPECIAL_ACID2;
 end;
 
-function SaveMap(Res: String): Pointer;
+function SaveMap(Res, ArchiveFormat: String): Pointer;
 var
+  WAD: TWADEditor;
   MapWriter: TMapWriter_1;
   textures: TTexturesRec1Array;
   panels: TPanelsRec1Array;
@@ -1070,6 +1071,7 @@ var
   Len: LongWord;
 
 begin
+  WAD := nil;
   textures := nil;
   panels := nil;
   items := nil;
@@ -1081,6 +1083,28 @@ begin
   Data := nil;
   Len := 0;
 
+// Открываем WAD, если надо:
+  if Res <> '' then
+  begin
+    g_ProcessResourceStr(Res, FileName, SectionName, ResName);
+
+    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;
+
   MapWriter := TMapWriter_1.Create();
 
 // Сохраняем заголовок:
@@ -1337,17 +1361,19 @@ begin
 
 // Записываем в WAD, если надо:
   if Res <> '' then
-  begin
-    g_ProcessResourceStr(Res, FileName, SectionName, ResName);
-    g_AddResource(FileName, SectionName, ResName, Data, Len, a);
-    ASSERT(a = 0);
-    FreeMem(Data);
-    Result := nil
-  end
+    begin
+      s := utf2win(ResName);
+      WAD.RemoveResource('', s);
+      WAD.AddResource(Data, Len, s, '');
+      WAD.SaveTo(FileName);
+
+      FreeMem(Data);
+      WAD.Free();
+
+      Result := nil;
+    end
   else
-  begin
-    Result := Data
-  end
+    Result := Data;
 end;
 
 procedure AddTexture(res: String; Error: Boolean);
@@ -1366,8 +1392,27 @@ 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;
   MapReader: TMapReader_1;
   Header: TMapHeaderRec_1;
   textures: TTexturesRec1Array;
@@ -1382,23 +1427,18 @@ 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;
@@ -1407,10 +1447,24 @@ begin
   MainForm.lLoad.Caption := MsgLoadWad;
   Application.ProcessMessages();
 
-// Читаем ресурс карты
+// Открываем WAD:
+  WAD := TWADEditor_1.Create();
   g_ProcessResourceStr(Res, FileName, SectionName, ResName);
-  g_ReadResource(FileName, SectionName, ResName, pData, Len);
-  if pData = nil then Exit;
+
+  if not WAD.ReadFile(FileName) then
+  begin
+    WAD.Free();
+    Exit;
+  end;
+
+// Читаем ресурс карты:
+  if not WAD.GetResource('', utf2win(ResName), pData, Len) then
+  begin
+    WAD.Free();
+    Exit;
+  end;
+
+  WAD.Free();
 
   MapReader := TMapReader_1.Create();
 
@@ -1434,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);
-
-      if _fn = '' then
-        TextureRes := FileName + ustr
-      else
-        TextureRes := WadsDir + DirectorySeparator + ustr;
+        g_ProcessResourceStr(ustr, @_fn, nil, nil);
 
-      Error := False;
+        if _fn = ''
+          then TextureRes := FileName + ustr
+          else TextureRes := WadsDir + DirectorySeparator + ustr;
 
-      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;
 
@@ -2174,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);
@@ -2568,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);
@@ -2866,14 +2913,14 @@ begin
  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_KASTET', GameWad + ':TEXTURES\KASTET');
+ 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_SUPERPULEMET', GameWad + ':TEXTURES\SPULEMET');
+ 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');
@@ -2945,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');