DEADSOFTWARE

Main: Epic encoding and other bugs megafix!
authorbinarymaster <x86corez@gmail.com>
Fri, 29 Sep 2017 15:42:45 +0000 (18:42 +0300)
committerbinarymaster <x86corez@gmail.com>
Fri, 29 Sep 2017 15:44:17 +0000 (18:44 +0300)
14 files changed:
src/editor/f_addresource.pas
src/editor/f_addresource_sky.pas
src/editor/f_addresource_sound.pas
src/editor/f_addresource_texture.pas
src/editor/f_main.lfm
src/editor/f_main.pas
src/editor/f_mapoptimization.pas
src/editor/f_mapoptions.pas
src/editor/f_options.pas
src/editor/f_packmap.pas
src/editor/f_savemap.pas
src/editor/f_selectmap.pas
src/editor/g_map.pas
src/editor/g_textures.pas

index edca4ed817570b631ebabe9260132922159974da..815fb1f38a8961a25fff67b9e211aa7d567a51a2 100644 (file)
@@ -160,12 +160,12 @@ begin
   WAD.ReadFile(FileName);
 
   if cbSectionsList.Text <> '..' then
-    SectionName := utf2win(cbSectionsList.Text)
+    SectionName := cbSectionsList.Text
   else
     SectionName := '';
 
 // Читаем ресурсы выбранной секции:
-  ResourceList := WAD.GetResourcesList(SectionName);
+  ResourceList := WAD.GetResourcesList(utf2win(SectionName));
 
   WAD.Free();
 
@@ -194,14 +194,14 @@ begin
   if cbSectionsList.Text = '..' then
     SectionName := ''
   else
-    SectionName := utf2win(cbSectionsList.Text);
+    SectionName := cbSectionsList.Text;
 
   if cbWADList.Text[1] <> '<' then
     FileName := cbWADList.Text
   else
     FileName := '';
 
-  FResourceName := FileName+':'+SectionName+'\'+utf2win(lbResourcesList.Items[lbResourcesList.ItemIndex]);
+  FResourceName := FileName+':'+SectionName+'\'+lbResourcesList.Items[lbResourcesList.ItemIndex];
 
   if FileName <> '' then
     FFullResourceName := EditorDir+'wads/'+FResourceName
index 9eea7180818843a5581e452b2be08036792ea845..98a8026ac10961fb13f3f1fe8fb493d1af1dcd05 100644 (file)
@@ -62,7 +62,7 @@ begin
   WAD := TWADEditor_1.Create();
   WAD.ReadFile(WADName);
 
-  WAD.GetResource(SectionName, ResourceName, TextureData, ImageSize);
+  WAD.GetResource(utf2win(SectionName), utf2win(ResourceName), TextureData, ImageSize);
 
   WAD.Free();
 
@@ -152,7 +152,7 @@ begin
       SectionName := '..';
 
   // WAD файл:
-    a := cbWADList.Items.IndexOf(win2utf(FileName));
+    a := cbWADList.Items.IndexOf(FileName);
     if a <> -1 then
     begin
       cbWADList.ItemIndex := a;
@@ -160,7 +160,7 @@ begin
     end;
 
   // Секция:
-    a := cbSectionsList.Items.IndexOf(win2utf(SectionName));
+    a := cbSectionsList.Items.IndexOf(SectionName);
     if a <> -1 then
     begin
       cbSectionsList.ItemIndex := a;
@@ -168,7 +168,7 @@ begin
     end;
 
   // Ресурс:
-    a := lbResourcesList.Items.IndexOf(win2utf(ResourceName));
+    a := lbResourcesList.Items.IndexOf(ResourceName);
     if a <> -1 then
     begin
       lbResourcesList.ItemIndex := a;
index 55508f0b724985ba0f52b0527e7fe51a81685d1d..c6406d0769f032f19fa96621a193538f9106a6a0 100644 (file)
@@ -136,7 +136,7 @@ begin
   WAD := TWADEditor_1.Create;
   WAD.ReadFile(FileName);
 
-  if WAD.GetResource(SectionName, ResourceName, SoundData, ResLength) then
+  if WAD.GetResource(utf2win(SectionName), utf2win(ResourceName), SoundData, ResLength) then
     begin
       sz := SizeOf(FMOD_CREATESOUNDEXINFO);
       FillMemory(@soundExInfo, sz, 0);
@@ -311,7 +311,7 @@ begin
       SectionName := '..';
 
   // WAD файл:
-    a := cbWADList.Items.IndexOf(win2utf(FileName));
+    a := cbWADList.Items.IndexOf(FileName);
     if a <> -1 then
     begin
       cbWADList.ItemIndex := a;
@@ -319,7 +319,7 @@ begin
     end;
 
   // Секция:
-    a := cbSectionsList.Items.IndexOf(win2utf(SectionName));
+    a := cbSectionsList.Items.IndexOf(SectionName);
     if a <> -1 then
     begin
       cbSectionsList.ItemIndex := a;
@@ -327,7 +327,7 @@ begin
     end;
 
   // Ресурс:
-    a := lbResourcesList.Items.IndexOf(win2utf(ResourceName));
+    a := lbResourcesList.Items.IndexOf(ResourceName);
     if a <> -1 then
     begin
       lbResourcesList.ItemIndex := a;
index 6c3840d627d290c4dd44f1261a09c24a7f377031..0ab28a5586e623ebc0580fdfca4cff372e36e060 100644 (file)
@@ -5,7 +5,7 @@ unit f_addresource_texture;
 interface
 
 uses
-  LCLIntf, LCLType, LMessages, SysUtils, Variants, Classes,
+  LCLIntf, LCLType, SysUtils, Variants, Classes,
   Graphics, Controls, Forms, Dialogs, f_addresource,
   StdCtrls, ExtCtrls, utils, Imaging, ImagingTypes, ImagingUtility;
 
@@ -64,6 +64,8 @@ var
 
 begin
   Result := False;
+  Data := nil;
+  Size := 0;
 
 // Читаем файл и ресурс в нем:
   g_ProcessResourceStr(Res, WADName, SectionName, ResourceName);
@@ -71,7 +73,7 @@ begin
   WAD := TWADEditor_1.Create();
 
   if (not WAD.ReadFile(WADName)) or
-     (not WAD.GetResource(SectionName, ResourceName, Data, Size)) then
+     (not WAD.GetResource(utf2win(SectionName), utf2win(ResourceName), Data, Size)) then
   begin
     WAD.Free();
     Exit;
@@ -169,6 +171,9 @@ var
 
 begin
   Result := False;
+  AnimWAD := nil;
+  Len := 0;
+  TextData := nil;
 
 // Читаем WAD:
   g_ProcessResourceStr(Res, WADName, SectionName, ResourceName);
@@ -182,7 +187,7 @@ begin
   end;
 
 // Читаем WAD-ресурс из WAD:
-  if not WAD.GetResource(SectionName, ResourceName, AnimWAD, Len) then
+  if not WAD.GetResource(utf2win(SectionName), utf2win(ResourceName), AnimWAD, Len) then
   begin
     WAD.Free();
     Exit;
@@ -273,9 +278,9 @@ begin
         bgc := 255
       else
         bgc := 200;
-      clr.r := ClampToByte(((255 - clr.a) * bgc + clr.a * clr.r) div 255);
-      clr.g := ClampToByte(((255 - clr.a) * bgc + clr.a * clr.g) div 255);
-      clr.b := ClampToByte(((255 - clr.a) * bgc + clr.a * clr.b) div 255);
+      clr.r := ClampToByte((Byte(255 - clr.a) * bgc + clr.a * clr.r) div 255);
+      clr.g := ClampToByte((Byte(255 - clr.a) * bgc + clr.a * clr.g) div 255);
+      clr.b := ClampToByte((Byte(255 - clr.a) * bgc + clr.a * clr.b) div 255);
       // TODO: check for RGB/BGR somehow?
       ii^ := clr.b; Inc(ii);
       ii^ := clr.g; Inc(ii);
@@ -300,13 +305,17 @@ var
   
 begin
   Result := nil;
+  AnimWAD := nil;
+  Len := 0;
+  TextData := nil;
+  TextureData := nil;
 
 // Читаем WAD файл и ресурс в нем:
   g_ProcessResourceStr(Res, WADName, SectionName, ResourceName);
 
   WAD := TWADEditor_1.Create();
   WAD.ReadFile(WADName);
-  WAD.GetResource(SectionName, ResourceName, AnimWAD, Len);
+  WAD.GetResource(utf2win(SectionName), utf2win(ResourceName), AnimWAD, Len);
   WAD.FreeWAD();
 
 // Читаем описание анимации:
@@ -348,6 +357,8 @@ var
 
 begin
   Result := nil;
+  TextureData := nil;
+  Len := 0;
 
 // Читаем WAD:
   g_ProcessResourceStr(ResourceStr, WADName, SectionName, ResourceName);
@@ -360,7 +371,7 @@ begin
   end;
 
 // Читаем ресурс текстуры в нем:
-  WAD.GetResource(SectionName, ResourceName, TextureData, Len);
+  WAD.GetResource(utf2win(SectionName), utf2win(ResourceName), TextureData, Len);
 
   WAD.Free();
 
@@ -488,8 +499,8 @@ begin
   for i := 0 to lbResourcesList.Count-1 do
     if lbResourcesList.Selected[i] then
     begin
-      AddTexture(cbWADlist.Text, utf2win(cbSectionsList.Text),
-                 utf2win(lbResourcesList.Items[i]), False);
+      AddTexture(cbWADlist.Text, cbSectionsList.Text,
+                 lbResourcesList.Items[i], False);
       lbResourcesList.Selected[i] := False;
     end;
 end;
index c51c295fb089769750f5b0966f5231032e4b88db..ade3a7fc534c7949a6752a2e0096dca0e2879810 100644 (file)
@@ -31,6 +31,7 @@ object MainForm: TMainForm
     Beveled = True
     MinSize = 64
     OnCanResize = Splitter1CanResize
+    OnMoved = Splitter1Moved
     ResizeAnchor = akRight
   end
   object Splitter2: TSplitter
@@ -42,6 +43,7 @@ object MainForm: TMainForm
     Align = alBottom
     MinSize = 64
     OnCanResize = Splitter2CanResize
+    OnMoved = Splitter1Moved
     ResizeAnchor = akBottom
   end
   object PanelProps: TPanel
index ef9e19d2ee9c59c7ffd0bdeae5e12aedfa9221cc..2b9ddee5a2a3f6a26c8311f6984b84d4655e3836 100644 (file)
@@ -5,9 +5,9 @@ unit f_main;
 interface
 
 uses
-  LCLIntf, LCLType, LMessages, SysUtils, Variants, Classes, Graphics,
-  Controls, Forms, Dialogs, ImgList, StdCtrls, Buttons,
-  ComCtrls, ValEdit, Types, ToolWin, Menus, ExtCtrls,
+  LCLIntf, LCLType, SysUtils, Variants, Classes, Graphics,
+  Controls, Forms, Dialogs, StdCtrls, Buttons,
+  ComCtrls, ValEdit, Types, Menus, ExtCtrls,
   CheckLst, Grids, OpenGLContext, utils, UTF8Process;
 
 type
@@ -214,7 +214,9 @@ type
     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 vleObjectPropertyApply(Sender: TObject);
     procedure vleObjectPropertyGetPickList(Sender: TObject; const KeyName: String; Values: TStrings);
     procedure vleObjectPropertyKeyDown(Sender: TObject; var Key: Word;
                                        Shift: TShiftState);
@@ -323,10 +325,10 @@ procedure ChangeShownProperty(Name: String; NewValue: String);
 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_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,
@@ -951,7 +953,8 @@ 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;
@@ -1105,7 +1108,8 @@ 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;
@@ -1268,7 +1272,8 @@ 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;
@@ -1370,7 +1375,8 @@ begin
                   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;
@@ -1881,13 +1887,17 @@ var
   ok: Boolean;
   FileName: String;
   ResourceName: String;
-  UResourceName: String;
   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
@@ -1909,19 +1919,18 @@ begin
     else
       begin // Внешний WAD
         FileName := EditorDir+'wads/'+aWAD;
-        ResourceName := utf2win(aWAD)+':'+SectionName+'\'+aTex;
+        ResourceName := aWAD+':'+SectionName+'\'+aTex;
       end;
 
   ok := True;
-  UResourceName := win2utf(ResourceName);
 
 // Есть ли уже такая текстура:
   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],
-                               [UResourceName]));
+                               [ResourceName]));
       ok := False;
     end;
 
@@ -1930,7 +1939,7 @@ begin
   begin
     if not silent then
       ErrorMessageBox(Format(_lc[I_MSG_RES_NAME_64],
-                             [UResourceName]));
+                             [ResourceName]));
     ok := False;
   end;
 
@@ -1939,7 +1948,7 @@ 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;
@@ -1953,12 +1962,12 @@ 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);
+          a := MainForm.lbTextureList.Items.Add(ResourceName);
       end
     else // Обычная текстура
       begin
         if g_CreateTextureWAD(ResourceName, FullResourceName) then
-          a := MainForm.lbTextureList.Items.Add(UResourceName);
+          a := MainForm.lbTextureList.Items.Add(ResourceName);
       end;
     if (a > -1) and (not silent) then
       SelectTexture(a);
@@ -2047,7 +2056,7 @@ begin
     lbTextureList.Sorted := True;
     lbTextureList.Sorted := False;
 
-    UpdateCaption(win2utf(gMapInfo.Name), ExtractFileName(FileName), MapName);
+    UpdateCaption(gMapInfo.Name, ExtractFileName(FileName), MapName);
   end;
 end;
 
@@ -2213,7 +2222,7 @@ end;
 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;
@@ -2221,7 +2230,7 @@ end;
 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;
@@ -2555,7 +2564,9 @@ var
   cfglen: Integer;
   config: TConfig;
 begin
+  cfgdata := nil;
   cfglen := 0;
+  ID := 0;
 
   wad := TWADEditor_1.Create;
   if wad.ReadFile(EditorDir+'data/Game.wad') then
@@ -2712,6 +2723,11 @@ var
   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,
@@ -4095,6 +4111,11 @@ begin
     MainForm.Resize();
 end;
 
+procedure TMainForm.Splitter1Moved(Sender: TObject);
+begin
+  FormResize(Sender);
+end;
+
 procedure TMainForm.aMapOptionsExecute(Sender: TObject);
 var
   ResName: String;
@@ -4105,7 +4126,7 @@ begin
   while (Pos(':\', ResName) > 0) do
     Delete(ResName, 1, Pos(':\', ResName) + 1);
 
-  UpdateCaption(win2utf(gMapInfo.Name), ExtractFileName(OpenedWAD), ResName);
+  UpdateCaption(gMapInfo.Name, ExtractFileName(OpenedWAD), ResName);
 end;
 
 procedure TMainForm.aAboutExecute(Sender: TObject);
@@ -4270,6 +4291,7 @@ begin
         DrawPressRect := False;
         Exit;
       end;
+      i := -1;
 
     // Выбор области воздействия, в зависимости от типа триггера
       vleObjectProperty.FindRow(_lc[I_PROP_TR_EX_AREA], i);
@@ -4326,11 +4348,11 @@ begin
       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
-          vleObjectProperty.Cells[1, i] := win2utf(AddSoundForm.ResourceName);
+          vleObjectProperty.Cells[1, i] := AddSoundForm.ResourceName;
           bApplyProperty.Click();
         end;
         Exit;
@@ -4370,6 +4392,9 @@ var
   TextureID: DWORD;
   TextureWidth, TextureHeight: Word;
 begin
+  TextureID := 0;
+  TextureWidth := 0;
+  TextureHeight := 0;
   if (lbTextureList.ItemIndex <> -1) and
      (not IsSpecialTextureSel()) then
     begin
@@ -4523,6 +4548,10 @@ var
   NoTextureID: DWORD;
   NW, NH: Word;
 begin
+  NoTextureID := 0;
+  NW := 0;
+  NH := 0;
+
   if SelectedObjectCount() <> 1 then
     Exit;
   if not SelectedObjects[GetFirstSelected()].Live then
@@ -4720,10 +4749,10 @@ 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
-                  Move(Data.MapName[0], s[1], Min(Length(s), 16));
+                  Move(s[1], Data.MapName[0], Min(Length(s), 16));
               end;
 
             TRIGGER_TEXTURE:
@@ -4759,10 +4788,10 @@ 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
-                  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);
@@ -4813,10 +4842,10 @@ 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
-                  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
@@ -4873,10 +4902,10 @@ begin
                 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
-                  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);
@@ -5342,8 +5371,8 @@ begin
                   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;
 
@@ -5461,7 +5490,7 @@ begin
         begin
           b := lbTypeSelect.ItemIndex;
           Values[Key] := PANELNAMES[b];
-          bApplyProperty.Click();
+          vleObjectPropertyApply(Sender);
         end;
       end
     end
@@ -5496,7 +5525,7 @@ begin
       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
@@ -5504,12 +5533,12 @@ begin
     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
-        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
@@ -5539,7 +5568,7 @@ begin
           b := b or ACTIVATE_NOMONSTER;
 
         Values[Key] := ActivateToStr(b);
-        bApplyProperty.Click();
+        vleObjectPropertyApply(Sender);
       end;
     end
   else if Key = _lc[I_PROP_TR_KEYS] then
@@ -5566,7 +5595,7 @@ begin
           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
@@ -5584,7 +5613,7 @@ begin
       begin
         b := lbTypeSelect.ItemIndex;
         Values[Key] := EffectToStr(b);
-        bApplyProperty.Click();
+        vleObjectPropertyApply(Sender);
       end;
     end
   else if Key = _lc[I_PROP_TR_MONSTER_TYPE] then
@@ -5602,7 +5631,7 @@ begin
       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
@@ -5631,7 +5660,7 @@ begin
         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
@@ -5649,7 +5678,7 @@ begin
       begin
         b := lbTypeSelect.ItemIndex;
         Values[Key] := ShotToStr(b);
-        bApplyProperty.Click();
+        vleObjectPropertyApply(Sender);
       end;
     end
   else if Key = _lc[I_PROP_TR_EFFECT_TYPE] then
@@ -5672,7 +5701,7 @@ begin
           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
@@ -5728,7 +5757,7 @@ begin
             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
@@ -5738,16 +5767,24 @@ begin
       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();
-      bApplyProperty.Click();
+      vleObjectPropertyApply(Sender);
     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;
@@ -5852,13 +5889,13 @@ begin
 
   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 := '';
-    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])),
@@ -5867,7 +5904,7 @@ begin
                   MB_DEFBUTTON2) <> mrYes then
       Exit;
 
-    WAD.RemoveResource('', MapName);
+    WAD.RemoveResource('', utf2win(MapName));
     
     MessageBox(0, PChar(Format(_lc[I_MSG_MAP_DELETED_PROMT],
                                [MapName])),
@@ -5893,7 +5930,7 @@ procedure TMainForm.vleObjectPropertyKeyDown(Sender: TObject;
             var Key: Word; Shift: TShiftState);
 begin
   if Key = VK_RETURN then
-    bApplyProperty.Click();
+    vleObjectPropertyApply(Sender);
 end;
 
 procedure MovePanel(var ID: DWORD; MoveType: Byte);
@@ -6065,7 +6102,7 @@ begin
 
   gMapInfo.FileName := SaveDialog.FileName;
   gMapInfo.MapName := SaveMapForm.eMapName.Text;
-  UpdateCaption(win2utf(gMapInfo.Name), ExtractFileName(gMapInfo.FileName), gMapInfo.MapName);
+  UpdateCaption(gMapInfo.Name, ExtractFileName(gMapInfo.FileName), gMapInfo.MapName);
 end;
 
 procedure TMainForm.aSelectAllExecute(Sender: TObject);
index e7aad24b53f9c31dd9a4d1f5b54eeea616eae1ee..efeac7d6dab3c7668fe0d5fd06613cf08495f87c 100644 (file)
@@ -105,7 +105,7 @@ begin
 
     for i := 0 to High(gPanels) do
       if (gPanels[i].PanelType <> 0) and
-         (gPanels[i].TextureName = utf2win(MainForm.lbTextureList.Items[a])) then
+         (gPanels[i].TextureName = MainForm.lbTextureList.Items[a]) then
       begin
         ok := False;
         Break;
@@ -114,7 +114,7 @@ begin
   // Нашли неиспользуемую текстуру:
     if ok then
       begin
-        g_DeleteTexture(utf2win(MainForm.lbTextureList.Items[a]));
+        g_DeleteTexture(MainForm.lbTextureList.Items[a]);
         if not b then
         begin
           mOptimizationResult.Lines.Add(_lc[I_OPT_DELETED_TEXTURES]);
index 9d3a20ce1e6b619ffa359802745d2d5068a584bd..d86ff0e3542b508c132588a588f188d4a0e0bfb9 100644 (file)
@@ -112,13 +112,13 @@ uses
 // Callbacks to receive results from resource choosing dialogs
 function SetSky: Boolean;
 begin
-  MapOptionsForm.eBack.Text := win2utf(AddSkyForm.ResourceName);
+  MapOptionsForm.eBack.Text := AddSkyForm.ResourceName;
   Result := True;
 end;
 
 function SetMusic: Boolean;
 begin
-  MapOptionsForm.eMusic.Text := win2utf(AddSoundForm.ResourceName);
+  MapOptionsForm.eMusic.Text := AddSoundForm.ResourceName;
   Result := True;
 end;
 
@@ -128,12 +128,12 @@ var
   a, b: Integer;
 begin
   // General map options
-  eMapName.Text := win2utf(gMapInfo.Name);
-  eMapDescription.Text := win2utf(gMapInfo.Description);
-  eAuthor.Text := win2utf(gMapInfo.Author);
+  eMapName.Text := gMapInfo.Name;
+  eMapDescription.Text := gMapInfo.Description;
+  eAuthor.Text := gMapInfo.Author;
 
-  eBack.Text := win2utf(gMapInfo.SkyName);
-  eMusic.Text := win2utf(gMapInfo.MusicName);
+  eBack.Text := gMapInfo.SkyName;
+  eMusic.Text := gMapInfo.MusicName;
 
   eMapWidth.Text := IntToStr(gMapInfo.Width);
   eMapHeight.Text := IntToStr(gMapInfo.Height);
@@ -191,11 +191,11 @@ begin
               
   with gMapInfo do
   begin
-    Name := utf2win(eMapName.Text);
-    Description := utf2win(eMapDescription.Text);
-    Author := utf2win(eAuthor.Text);
-    SkyName := utf2win(eBack.Text);
-    MusicName := utf2win(eMusic.Text);
+    Name := eMapName.Text;
+    Description := eMapDescription.Text;
+    Author := eAuthor.Text;
+    SkyName := eBack.Text;
+    MusicName := eMusic.Text;
 
     if Width > newWidth then
       MapOffset.X := 0;
@@ -236,7 +236,7 @@ procedure TMapOptionsForm.bSelectBackClick(Sender: TObject);
 begin
   AddSkyForm.OKFunction := SetSky;
   AddSkyForm.lbResourcesList.MultiSelect := False;
-  AddSkyForm.SetResource := utf2win(eBack.Text);
+  AddSkyForm.SetResource := eBack.Text;
   AddSkyForm.ShowModal();
 end;
 
@@ -244,7 +244,7 @@ procedure TMapOptionsForm.bSelectMusicClick(Sender: TObject);
 begin
   AddSoundForm.OKFunction := SetMusic;
   AddSoundForm.lbResourcesList.MultiSelect := False;
-  AddSoundForm.SetResource := utf2win(eMusic.Text);
+  AddSoundForm.SetResource := eMusic.Text;
   AddSoundForm.ShowModal();
 end;
 
index 28debba765666f781e334d94807db7cdd40e0cdd..926479ebc984fce733836e7dcf4efe914178050b 100644 (file)
@@ -5,7 +5,7 @@ unit f_options;
 interface
 
 uses
-  LCLIntf, LCLType, LMessages, Messages, SysUtils, Variants, Classes,
+  LCLIntf, LCLType, SysUtils, Variants, Classes,
   Graphics, Controls, Forms, Dialogs, StdCtrls,
   ExtCtrls, ComCtrls, Registry;
 
index 0999e54c3758e074d1d3901ad5d0ea6153b205b7..428d9d355a0735a0805f02038ab128ddea81a41b 100644 (file)
@@ -6,7 +6,7 @@ interface
 
 uses
   LCLIntf, LCLType, LMessages, SysUtils, Variants, Classes,
-  Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
+  Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, utils;
 
 type
   TPackMapForm = class (TForm)
@@ -98,7 +98,7 @@ begin
     Exit;
   end;
 
-  if not wad2.GetResource(section, resource, data, reslen) then
+  if not wad2.GetResource(utf2win(section), utf2win(resource), data, reslen) then
   begin
     MessageBox(0, PChar(Format(_lc[I_MSG_RES_ERROR],
                                    [filename, section, resource])),
@@ -109,22 +109,22 @@ begin
 
   wad2.Free();
 
- {if wad_to.HaveResource(section_to, resource) then
+ {if wad_to.HaveResource(utf2win(section_to), utf2win(resource)) then
  begin
   for a := 2 to 256 do
   begin
    s := IntToStr(a);
-   if not wad_to.HaveResource(section_to, resource+s) then Break;
+   if not wad_to.HaveResource(utf2win(section_to), utf2win(resource+s)) then Break;
   end;
   resource := resource+s;
  end;}
 
 // Если такого ресурса нет в WAD-файле-назначении, то копируем:
-  if not wad_to.HaveResource(section_to, resource) then
+  if not wad_to.HaveResource(utf2win(section_to), utf2win(resource)) then
   begin
-    if not wad_to.HaveSection(section_to) then
-      wad_to.AddSection(section_to);
-    wad_to.AddResource(data, reslen, resource, section_to);
+    if not wad_to.HaveSection(utf2win(section_to)) then
+      wad_to.AddSection(utf2win(section_to));
+    wad_to.AddResource(data, reslen, utf2win(resource), utf2win(section_to));
   end;
 
   FreeMem(data);
@@ -178,7 +178,7 @@ begin
   if cbTextrures.Checked and (textures <> nil) then
     for a := 0 to High(textures) do
     begin
-      res := textures[a].Resource;
+      res := win2utf(textures[a].Resource);
       if IsSpecialTexture(res) then
         Continue;
 
@@ -198,7 +198,7 @@ begin
         end;
 
       // Переименовываем ресурс текстуры:
-        res := Format(':%s\%s', [tsection, resource]);
+        res := utf2win(Format(':%s\%s', [tsection, resource]));
         ZeroMemory(@textures[a].Resource[0], 64);
         CopyMemory(@textures[a].Resource[0], @res[1], Min(Length(res), 64));
       end;
@@ -210,7 +210,7 @@ begin
 // Нужно копировать небо:
   if cbSky.Checked then
   begin
-    res := header.SkyName;
+    res := win2utf(header.SkyName);
     g_ProcessResourceStr(res, @filename, @section, @resource);
 
   // Не записывать стандартное небо:
@@ -227,7 +227,7 @@ begin
       end;
 
     // Переименовываем ресурс неба:
-      res := Format(':%s\%s', [ssection, resource]);
+      res := utf2win(Format(':%s\%s', [ssection, resource]));
       ZeroMemory(@header.SkyName[0], 64);
       CopyMemory(@header.SkyName[0], @res[1], Min(Length(res), 64));
     end;
@@ -236,7 +236,7 @@ begin
 // Нужно копировать музыку:
   if cbMusic.Checked then
   begin
-    res := header.MusicName;
+    res := win2utf(header.MusicName);
     g_ProcessResourceStr(res, @filename, @section, @resource);
 
   // Не записывать стандартную музыку:
@@ -253,7 +253,7 @@ begin
       end;
 
     // Переименовываем ресурс музыки:
-      res := Format(':%s\%s', [msection, resource]);
+      res := utf2win(Format(':%s\%s', [msection, resource]));
       ZeroMemory(@header.MusicName[0], 64);
       CopyMemory(@header.MusicName[0], @res[1], Min(Length(res), 64));
     end;
@@ -311,7 +311,7 @@ begin
 
               Нужно проверять есть такая текстура textures и есть ли она вообще?
             // Переименовываем ресурс текстуры:
-              res := Format(':%s\%s', [tsection, resource]);
+              res := utf2win(Format(':%s\%s', [tsection, resource]));
               ZeroMemory(@textures[a].Resource[0], 64);
               CopyMemory(@textures[a].Resource[0], @res[1], Min(Length(res), 64));
 
index f89ee7366f2a7105e6502bc93f37ecb91463a608..f5feee313ce5291af9041bcdb5c43ba9646c6ebe 100644 (file)
@@ -6,7 +6,7 @@ interface
 
 uses
   LCLIntf, LCLType, LMessages, SysUtils, Variants, Classes,
-  Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
+  Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, utils;
 
 type
   TSaveMapForm = class (TForm)
@@ -113,7 +113,7 @@ begin
    
       if Sign = MAP_SIGNATURE then
       begin
-        nm := ResList[a];
+        nm := win2utf(ResList[a]);
         lbMapList.Items.Add(nm);
 
         if placeName then
index a83e3e03b140d0c76fcdbc0dcb8d9a628fa9d03b..46f365c7f6cfe4c9bf0a50ebc6046f559d8c9f69 100644 (file)
@@ -6,7 +6,7 @@ interface
 
 uses
   LCLIntf, LCLType, LMessages, SysUtils, Variants, Classes, Graphics,
-  Controls, Forms, Dialogs, StdCtrls, ExtCtrls;
+  Controls, Forms, Dialogs, StdCtrls, ExtCtrls, utils;
 
 type
   TSelectMapForm = class (TForm)
@@ -84,7 +84,7 @@ begin
       FreeMem(Data);
 
       if Sign = MAP_SIGNATURE then
-        lbMapList.Items.Add(ResList[a]);
+        lbMapList.Items.Add(win2utf(ResList[a]));
       Sign := '';
     end;
 
index 0a97da7d911e29672ea2b28cc708ee8070da762a..caa6b57d1a53a099ef97d4da799342b4d88ac9f1 100644 (file)
@@ -5,7 +5,7 @@ Unit g_map;
 Interface
 
 Uses
-  LCLIntf, LCLType, LMessages, g_basic, e_graphics, MAPREADER, MAPSTRUCT,
+  LCLIntf, LCLType, g_basic, e_graphics, MAPREADER, MAPSTRUCT,
   MAPWRITER, e_log, MAPDEF, utils;
 
 Type
@@ -240,12 +240,11 @@ procedure FreeData();
 
 procedure ShiftMapObjects(dx, dy: Integer);
 
-Implementation
+implementation
 
-Uses
+uses
   BinEditor, g_textures, Dialogs, SysUtils, CONFIG, f_main,
-  Forms, Math, f_addresource_texture, WADEDITOR,
-  Masks, g_Language;
+  Forms, Math, f_addresource_texture, WADEDITOR, g_language;
 
 const
   OLD_ITEM_MEDKIT_SMALL          = 1;
@@ -1074,6 +1073,8 @@ begin
   triggers := nil;
   PanelTable := nil;
   MonsterTable := nil;
+  Data := nil;
+  Len := 0;
 
 // Открываем WAD, если надо:
   if Res <> '' then
@@ -1093,20 +1094,25 @@ begin
   begin
     ZeroMemory(@header, SizeOf(TMapHeaderRec_1));
 
-    if gMapInfo.Name <> '' then
-      CopyMemory(@MapName[0], @gMapInfo.Name[1], Min(32, Length(gMapInfo.Name)));
+    s := utf2win(gMapInfo.Name);
+    if s <> '' then
+      CopyMemory(@MapName[0], @s[1], Min(32, Length(s)));
 
-    if gMapInfo.Description <> '' then
-      CopyMemory(@MapDescription[0], @gMapInfo.Description[1], Min(256, Length(gMapInfo.Description)));
+    s := utf2win(gMapInfo.Description);
+    if s <> '' then
+      CopyMemory(@MapDescription[0], @s[1], Min(256, Length(s)));
 
-    if gMapInfo.Author <> '' then
-      CopyMemory(@MapAuthor[0], @gMapInfo.Author[1], Min(32, Length(gMapInfo.Author)));
+    s := utf2win(gMapInfo.Author);
+    if s <> '' then
+      CopyMemory(@MapAuthor[0], @s[1], Min(32, Length(s)));
 
-    if gMapInfo.MusicName <> '' then
-      CopyMemory(@MusicName[0], @gMapInfo.MusicName[1], Min(64, Length(gMapInfo.MusicName)));
+    s := utf2win(gMapInfo.MusicName);
+    if s <> '' then
+      CopyMemory(@MusicName[0], @s[1], Min(64, Length(s)));
 
-    if gMapInfo.SkyName <> '' then
-      CopyMemory(@SkyName[0], @gMapInfo.SkyName[1], Min(64, Length(gMapInfo.SkyName)));
+    s := utf2win(gMapInfo.SkyName);
+    if s <> '' then
+      CopyMemory(@SkyName[0], @s[1], Min(64, Length(s)));
 
     Width := gMapInfo.Width;
     Height := gMapInfo.Height;
@@ -1122,7 +1128,7 @@ begin
       SetLength(textures, Length(textures)+1);
       s := utf2win(MainForm.lbTextureList.Items[a]);
       CopyMemory(@textures[High(textures)].Resource[0], @s[1], Min(64, Length(s)));
-      if g_GetTextureFlagByName(s) = 1 then
+      if g_GetTextureFlagByName(MainForm.lbTextureList.Items[a]) = 1 then
         textures[High(textures)].Anim := 1
       else
         textures[High(textures)].Anim := 0;
@@ -1174,7 +1180,7 @@ begin
           // Номер текстуры в списке текстур:
             if gPanels[a].TextureID <> TEXTURE_SPECIAL_NONE then
               for b := 0 to High(textures) do
-                if gPanels[a].TextureName = textures[b].Resource then
+                if utf2win(gPanels[a].TextureName) = textures[b].Resource then
                 begin
                   TextureNum := b;
                   Break;
@@ -1338,9 +1344,9 @@ begin
 // Записываем в WAD, если надо:
   if Res <> '' then
     begin
-      e_WriteLog('Fuck me (A) ' + ResName, MSG_NOTIFY);
-      WAD.RemoveResource('', ResName);
-      WAD.AddResource(Data, Len, ResName, '');
+      s := utf2win(ResName);
+      WAD.RemoveResource('', s);
+      WAD.AddResource(Data, Len, s, '');
       WAD.SaveTo(FileName);
 
       FreeMem(Data);
@@ -1355,18 +1361,16 @@ end;
 procedure AddTexture(res: String; Error: Boolean);
 var
   a: Integer;
-  ures: String;
 begin
-  ures := win2utf(res);
   with MainForm.lbTextureList do
   begin
     for a := 0 to Count-1 do
-      if Items[a] = ures then
+      if Items[a] = res then
         Exit;
 
-    if Error and (slInvalidTextures.IndexOf(ures) = -1) then
-      slInvalidTextures.Add(ures);
-    Items.Add(ures);
+    if Error and (slInvalidTextures.IndexOf(res) = -1) then
+      slInvalidTextures.Add(res);
+    Items.Add(res);
   end;
 end;
 
@@ -1390,7 +1394,7 @@ var
   Data: Pointer;
   Width, Height, m: Word;
   FileName, SectionName, ResName, _fn: String;
-  TextureRes: String;
+  TextureRes, ustr: String;
   pData: Pointer;
   Len, FrameLen: Integer;
   Error: Boolean;
@@ -1398,6 +1402,15 @@ var
   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];
@@ -1414,7 +1427,7 @@ begin
   end;
 
 // Читаем ресурс карты:
-  if not WAD.GetResource('', ResName, pData, Len) then
+  if not WAD.GetResource('', utf2win(ResName), pData, Len) then
   begin
     WAD.Free();
     Exit;
@@ -1442,50 +1455,51 @@ begin
     begin
       MainForm.pbLoad.StepIt();
       Application.ProcessMessages();
+      ustr := win2utf(textures[a].Resource);
 
-      if IsSpecialTexture(textures[a].Resource) then
+      if IsSpecialTexture(ustr) then
       begin
-        AddTexture(textures[a].Resource, False);
+        AddTexture(ustr, False);
         Continue;
       end;
 
-      g_ProcessResourceStr(textures[a].Resource, @_fn, nil, nil);
+      g_ProcessResourceStr(ustr, @_fn, nil, nil);
 
       if _fn = '' then
-        TextureRes := FileName + textures[a].Resource
+        TextureRes := FileName + ustr
       else
-        TextureRes := EditorDir+'wads/'+textures[a].Resource;
+        TextureRes := EditorDir+'wads/'+ustr;
 
       Error := False;
 
       if not ByteBool(textures[a].Anim) then
         begin // Обычная текстура
-          if not g_CreateTextureWAD(textures[a].Resource, TextureRes) then
+          if not g_CreateTextureWAD(ustr, TextureRes) then
           begin
             e_WriteLog(Format('g_CreateTextureWAD() error, res=%s',
-                              [textures[a].Resource]), MSG_WARNING);
+                              [ustr]), MSG_WARNING);
             Error := True;
           end;
 
-          AddTexture(textures[a].Resource, Error);
+          AddTexture(ustr, Error);
         end
       else // Anim
         begin // Анимированная текстура
           if not GetFrame(TextureRes, Data, FrameLen, Width, Height) then
           begin // Кадры
             e_WriteLog(Format('GetFrame() error, res=%s',
-                              [textures[a].Resource]), MSG_WARNING);
+                              [ustr]), MSG_WARNING);
             Error := True;
           end;
 
-          if not g_CreateTextureMemorySize(Data, FrameLen, textures[a].Resource, 0, 0, Width, Height, 1) then
+          if not g_CreateTextureMemorySize(Data, FrameLen, ustr, 0, 0, Width, Height, 1) then
           begin // Сама текстура
             e_WriteLog(Format('g_CreateTextureMemorySize() error, res=%s',
-                              [textures[a].Resource]), MSG_WARNING);
+                              [ustr]), MSG_WARNING);
             Error := True;
           end;
 
-          AddTexture(textures[a].Resource, Error);
+          AddTexture(ustr, Error);
         end;
     end;
   end;
@@ -1528,9 +1542,10 @@ begin
       if WordBool(panel.PanelType and m) and
          (not (ByteBool(panels[a].Flags and PANEL_FLAG_HIDE))) then
       begin
-        if not IsSpecialTexture(textures[panels[a].TextureNum].Resource) then
+        ustr := win2utf(textures[panels[a].TextureNum].Resource);
+        if not IsSpecialTexture(ustr) then
           begin // Текстура
-            if g_GetTexture(textures[panels[a].TextureNum].Resource, panel.TextureID) then
+            if g_GetTexture(ustr, panel.TextureID) then
               g_GetTextureSizeByID(panel.TextureID, panel.TextureWidth, panel.TextureHeight)
             else begin
               panel.TextureWidth := 1;
@@ -1545,9 +1560,9 @@ begin
             end;
           end
         else // Спец. текстура
-          panel.TextureID := SpecialTextureID(textures[panels[a].TextureNum].Resource);
+          panel.TextureID := SpecialTextureID(ustr);
 
-        panel.TextureName := textures[panels[a].TextureNum].Resource;
+        panel.TextureName := ustr;
       end;
 
     // Жидкость без текстуры:
@@ -1676,11 +1691,11 @@ begin
   with gMapInfo do
   begin
     MapName := ResName;
-    Name := Header.MapName;
-    Description := Header.MapDescription;
-    Author := Header.MapAuthor;
-    MusicName := Header.MusicName;
-    SkyName := Header.SkyName;
+    Name := win2utf(Header.MapName);
+    Description := win2utf(Header.MapDescription);
+    Author := win2utf(Header.MapAuthor);
+    MusicName := win2utf(Header.MusicName);
+    SkyName := win2utf(Header.SkyName);
     Height := Header.Height;
     Width := Header.Width;
   end;
@@ -1708,7 +1723,7 @@ const
 var
   map: TConfig;
   i, a: Integer;
-  s, us, section: String;
+  s, section: String;
   panel: TPanel;
   item: TItem;
   area: TArea;
@@ -1747,13 +1762,13 @@ begin
     begin
       s := ExtractFileName(_FileName);
       Delete(s, Length(s)-3, 4);
-      s := UpperCase(s) + '.WAD:TEXTURES\'+ UpperCase(map.ReadStr('Textures', 'TextureName'+IntToStr(a), ''));
+      s := UpperCase(s) + '.WAD:TEXTURES\'+ UpperCase(win2utf(map.ReadStr('Textures', 'TextureName'+IntToStr(a), '')));
 
       if not g_CreateTextureWAD(s, EditorDir+'wads/'+s) then
         Continue;
     end;
 
-    MainForm.lbTextureList.Items.Add(win2utf(s));
+    MainForm.lbTextureList.Items.Add(s);
   end;
 
 // Чтение панелей:
@@ -1803,7 +1818,7 @@ begin
           begin
             s := ExtractFileName(_FileName);
             Delete(s, Length(s)-3, 4);
-            s := UpperCase(s) + '.WAD:TEXTURES\' + UpperCase(map.ReadStr(section, 'TextureName', ''));
+            s := UpperCase(s) + '.WAD:TEXTURES\' + UpperCase(win2utf(map.ReadStr(section, 'TextureName', '')));
 
             if g_GetTexture(s, panel.TextureID) then
               begin
@@ -1834,10 +1849,9 @@ begin
             end;
         end;
 
-        us := win2utf(s);
         with MainForm.lbTextureList.Items do
-          if IndexOf(us) = -1 then
-            Add(us);
+          if IndexOf(s) = -1 then
+            Add(s);
         panel.TextureName := s;
         panel.TextureWidth := 1;
         panel.TextureHeight := 1;
@@ -1963,8 +1977,8 @@ begin
   begin
     if Items.Count > 0 then
       for a := Items.Count-1 downto 0 do
-        if not IsSpecialTexture(utf2win(Items[a])) then
-          g_DeleteTexture(utf2win(Items[a]));
+        if not IsSpecialTexture(Items[a]) then
+          g_DeleteTexture(Items[a]);
 
     Clear();
   end;
@@ -1980,6 +1994,9 @@ procedure DrawPanels(fPanelType: Word);
     NoTextureID: DWORD;
     NW, NH: Word;
   begin
+    NoTextureID := 0;
+    NW := 0;
+    NH := 0;
     with gPanels[a] do
     begin
       case TextureID of
@@ -2091,6 +2108,7 @@ var
   r: TRectWH;
 
 begin
+  ID := 0;
 // В режиме Превью рисуем небо:
   if PreviewMode then
   begin
index 0ef0a81e0dae27a743e1469443b63cad4d351650..786229a847ef6dd5777801191e59647400c89950 100644 (file)
@@ -4,7 +4,7 @@ unit g_textures;
 
 interface
 
-uses LCLIntf, LCLType, LMessages, e_graphics;
+uses LCLIntf, LCLType, LMessages, e_graphics, utils;
 
 function g_SimpleCreateTextureWAD(var ID: DWORD; Resource: string): Boolean;
 function g_SimpleCreateTextureWADSize(var ID: DWORD; Resource: string;
@@ -80,7 +80,7 @@ begin
  WAD := TWADEditor_1.Create;
  WAD.ReadFile(FileName);
 
- if WAD.GetResource(SectionName, ResourceName, TextureData, ResourceLength) then
+ if WAD.GetResource(utf2win(SectionName), utf2win(ResourceName), TextureData, ResourceLength) then
  begin
   if e_CreateTextureMem(TextureData, ResourceLength, ID) then Result := True;
   FreeMem(TextureData);
@@ -137,7 +137,7 @@ begin
  WAD := TWADEditor_1.Create;
  WAD.ReadFile(FileName);
 
- if WAD.GetResource(SectionName, ResourceName, TextureData, ResourceLength) then
+ if WAD.GetResource(utf2win(SectionName), utf2win(ResourceName), TextureData, ResourceLength) then
  begin
   Result := e_CreateTextureMem(TextureData, ResourceLength, TexturesArray[find_id].ID);
   FreeMem(TextureData);
@@ -174,7 +174,7 @@ begin
  WAD := TWADEditor_1.Create;
  WAD.ReadFile(FileName);
 
- if WAD.GetResource(SectionName, ResourceName, TextureData, ResourceLength) then
+ if WAD.GetResource(utf2win(SectionName), utf2win(ResourceName), TextureData, ResourceLength) then
  begin
   if e_CreateTextureMemEx(TextureData, ResourceLength, ID, X, Y, Width, Height) then Result := True;
   FreeMem(TextureData);
@@ -205,7 +205,7 @@ begin
  WAD := TWADEditor_1.Create;
  WAD.ReadFile(FileName);
 
- if WAD.GetResource(SectionName, ResourceName, TextureData, ResourceLength) then
+ if WAD.GetResource(utf2win(SectionName), utf2win(ResourceName), TextureData, ResourceLength) then
  begin
   Result := e_CreateTextureMemEx(TextureData, ResourceLength, TexturesArray[find_id].ID, X, Y, Width, Height);
   FreeMem(TextureData);