DEADSOFTWARE

system: implement zip support again
[d2df-editor.git] / src / editor / g_map.pas
index 792f258c43bb41a22a472eaf166e062391ddde1e..d2067915aede48ffc8beed0fd5633a89a9d0cbdd 100644 (file)
@@ -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;
@@ -366,7 +366,7 @@ begin
       fn := fn + Res;
     end
   else
-    fn := EditorDir + 'wads/' + Res;
+    fn := WadsDir + DirectorySeparator + Res;
 
   g_CreateTextureWAD(SKY_TEXTURE, fn);
 end;
@@ -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 -> appned 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);
@@ -1368,6 +1394,7 @@ end;
 
 function LoadMap(Res: String): Boolean;
 var
+  WAD: TWADEditor_1;
   MapReader: TMapReader_1;
   Header: TMapHeaderRec_1;
   textures: TTexturesRec1Array;
@@ -1404,17 +1431,31 @@ begin
   NH := 0;
 
   MainForm.pbLoad.Position := 0;
-  MainForm.lLoad.Caption := _lc[I_LOAD_WAD];
+  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();
 
-  MainForm.lLoad.Caption := _lc[I_LOAD_MAP];
+  MainForm.lLoad.Caption := MsgLoadMap;
   Application.ProcessMessages();
 
   MapReader.LoadMap(pData);
@@ -1426,7 +1467,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
@@ -1445,7 +1486,7 @@ begin
       if _fn = '' then
         TextureRes := FileName + ustr
       else
-        TextureRes := EditorDir+'wads/'+ustr;
+        TextureRes := WadsDir + DirectorySeparator + ustr;
 
       Error := False;
 
@@ -1488,7 +1529,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
@@ -1567,7 +1608,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
@@ -1591,7 +1632,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
@@ -1614,7 +1655,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
@@ -1637,7 +1678,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
@@ -1713,7 +1754,7 @@ begin
 
 // Открытие карты:
   MainForm.pbLoad.Position := 0;
-  MainForm.lLoad.Caption := _lc[I_LOAD_MAP];;
+  MainForm.lLoad.Caption := MsgLoadMap;;
   Application.ProcessMessages();
 
   map := TConfig.CreateFile(_FileName);
@@ -1723,25 +1764,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;
 
@@ -1753,7 +1794,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
@@ -1764,6 +1805,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);
@@ -1780,11 +1822,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
@@ -1842,7 +1885,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
@@ -1853,6 +1896,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)];
@@ -1871,7 +1915,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
@@ -1882,6 +1926,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);
@@ -1895,10 +1940,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;
@@ -1912,6 +1958,8 @@ begin
       SetLength(Description, 256);
   end;
 
+  LoadSky(gMapInfo.SkyName);
+
   map.Free();
 
   Result := True;
@@ -1938,17 +1986,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