DEADSOFTWARE

00e3dc0372b3984515df0b1068ee1fb9d6de1763
[d2df-editor.git] / src / editor / f_packmap.pas
1 unit f_packmap;
3 {$INCLUDE ../shared/a_modes.inc}
5 interface
7 uses
8 LCLIntf, LCLType, LMessages, SysUtils, Variants, Classes,
9 Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, utils;
11 type
12 TPackMapForm = class (TForm)
13 bPack: TButton;
14 SaveDialog: TSaveDialog;
15 Panel1: TPanel;
16 // Сохранить в:
17 LabelSaveTo: TLabel;
18 eWAD: TEdit;
19 bSelectWAD: TButton;
20 // Имя карты:
21 LabelMapName: TLabel;
22 eResource: TEdit;
23 // Текстуры:
24 cbTextrures: TCheckBox;
25 LabelTextures: TLabel;
26 eTSection: TEdit;
27 // Небо:
28 cbSky: TCheckBox;
29 LabelSky: TLabel;
30 eSSection: TEdit;
31 // Музыка:
32 cbMusic: TCheckBox;
33 LabelMusic: TLabel;
34 eMSection: TEdit;
35 // Дополнительно:
36 cbAdd: TCheckBox;
37 cbNonStandart: TCheckBox;
39 procedure bSelectWADClick(Sender: TObject);
40 procedure bPackClick(Sender: TObject);
41 procedure FormCreate(Sender: TObject);
43 private
44 { Private declarations }
45 public
46 { Public declarations }
47 end;
49 var
50 PackMapForm: TPackMapForm;
52 implementation
54 uses
55 BinEditor, WADEDITOR, g_map, MAPREADER, MAPWRITER, MAPSTRUCT,
56 f_main, math, g_language, g_resources, e_log;
58 {$R *.lfm}
60 const
61 STANDART_WAD = 'standart.wad';
62 SHRSHADE_WAD = 'shrshade.wad';
65 procedure TPackMapForm.bSelectWADClick(Sender: TObject);
66 begin
67 SaveDialog.Filter := _lc[I_FILE_FILTER_WAD];
69 if SaveDialog.Execute() then
70 eWAD.Text := SaveDialog.FileName;
71 end;
73 function ProcessResource(wad_to, section_to, filename, section, resource: String): Boolean;
74 var
75 data: Pointer;
76 res, len: Integer;
77 us, un: String;
78 begin
79 Result := True;
80 if filename = '' then
81 g_GetResourceSection(OpenedMap, filename, us, un)
82 else
83 filename := EditorDir + 'wads/' + filename;
84 e_WriteLog('ProcessResource: "' + wad_to + '" "' + section_to + '" "' + filename + '" "' + section + '" "' + resource + '"', MSG_NOTIFY);
86 if resource = '' then Exit;
88 g_ReadResource(filename, section, resource, data, len);
89 if data <> nil then
90 begin
91 (* Write resource only if it does not exists *)
92 g_ExistsResource(wad_to, section_to, resource, res);
93 if res <> 0 then
94 begin
95 g_AddResource(wad_to, section_to, resource, data, len, res);
96 ASSERT(res = 0)
97 end;
98 FreeMem(data);
99 end
100 else
101 begin
102 //MessageBox(0, PChar(Format(_lc[I_MSG_WAD_ERROR], [ExtractFileName(filename)])), PChar(_lc[I_MSG_ERROR]), MB_OK + MB_ICONERROR);
103 MessageBox(0, PChar(Format(_lc[I_MSG_RES_ERROR], [filename, section, resource])), PChar(_lc[I_MSG_ERROR]), MB_OK + MB_ICONERROR);
104 Result := False
105 end
106 end;
108 procedure TPackMapForm.bPackClick(Sender: TObject);
109 var
110 WadFile: String;
111 mr: TMapReader_1;
112 mw: TMapWriter_1;
113 data: Pointer;
114 len: LongWord;
115 textures: TTexturesRec1Array;
116 header: TMapHeaderRec_1;
117 a: Integer;
118 res, tsection, ssection, msection, filename, section, resource: String;
120 begin
121 if eWAD.Text = '' then
122 Exit;
123 if eResource.Text = '' then
124 Exit;
126 tsection := eTSection.Text;
127 ssection := eSSection.Text;
128 msection := eMSection.Text;
130 // Сохраняем карту в память:
131 data := SaveMap('');
132 if data = nil then
133 Exit;
135 if not cbAdd.Checked then
136 g_DeleteFile(eWAD.Text, '.bak0');
138 // Читаем карту из памяти:
139 mr := TMapReader_1.Create();
140 mr.LoadMap(data);
141 FreeMem(data);
143 // Получаем текстуры:
144 textures := mr.GetTextures();
146 // Нужно копировать текстуры:
147 if cbTextrures.Checked and (textures <> nil) then
148 for a := 0 to High(textures) do
149 begin
150 res := win2utf(textures[a].Resource);
151 if IsSpecialTexture(res) then
152 Continue;
154 g_GetResourceSection(res, filename, section, resource);
156 // Не записывать стандартные текстуры:
157 if (not cbNonStandart.Checked) or
158 ( (AnsiLowerCase(filename) <> STANDART_WAD) and
159 (AnsiLowerCase(filename) <> SHRSHADE_WAD) ) then
160 begin
161 // Копируем ресурс текстуры:
162 if not f_packmap.ProcessResource(eWAD.Text, tsection, filename, section, resource) then
163 begin
164 mr.Free();
165 Exit;
166 end;
168 // Переименовываем ресурс текстуры:
169 res := utf2win(Format(':%s\%s', [tsection, resource]));
170 ZeroMemory(@textures[a].Resource[0], 64);
171 CopyMemory(@textures[a].Resource[0], @res[1], Min(Length(res), 64));
172 end;
173 end;
175 // Получаем заголовок карты:
176 header := mr.GetMapHeader();
178 // Нужно копировать небо:
179 if cbSky.Checked then
180 begin
181 res := win2utf(header.SkyName);
182 g_GetResourceSection(res, filename, section, resource);
184 // Не записывать стандартное небо:
185 if (not cbNonStandart.Checked) or
186 ( (AnsiLowerCase(filename) <> STANDART_WAD) and
187 (AnsiLowerCase(filename) <> SHRSHADE_WAD) ) then
188 begin
189 // Копируем ресурс неба:
190 if not f_packmap.ProcessResource(eWAD.Text, ssection, filename, section, resource) then
191 begin
192 mr.Free();
193 Exit;
194 end;
196 // Переименовываем ресурс неба:
197 res := utf2win(Format(':%s\%s', [ssection, resource]));
198 ZeroMemory(@header.SkyName[0], 64);
199 CopyMemory(@header.SkyName[0], @res[1], Min(Length(res), 64));
200 end;
201 end;
203 // Нужно копировать музыку:
204 if cbMusic.Checked then
205 begin
206 res := win2utf(header.MusicName);
207 g_GetResourceSection(res, filename, section, resource);
209 // Не записывать стандартную музыку:
210 if (not cbNonStandart.Checked) or
211 ( (AnsiLowerCase(filename) <> STANDART_WAD) and
212 (AnsiLowerCase(filename) <> SHRSHADE_WAD) ) then
213 begin
214 // Копируем ресурс музыки:
215 if not f_packmap.ProcessResource(eWAD.Text, msection, filename, section, resource) then
216 begin
217 mr.Free();
218 Exit;
219 end;
221 // Переименовываем ресурс музыки:
222 res := utf2win(Format(':%s\%s', [msection, resource]));
223 ZeroMemory(@header.MusicName[0], 64);
224 CopyMemory(@header.MusicName[0], @res[1], Min(Length(res), 64));
225 end;
226 end;
229 // Нужно копировать дополнительные текстуры:
230 if cbTextrures.Checked and (textures <> nil) and
231 (gPanels <> nil) and (gTriggers <> nil) then
232 begin
233 for a := 0 to High(gPanels) do
234 begin
235 ok := False;
237 // Ссылаются ли на эту панель триггеры:
238 for b := 0 to High(gTriggers) do
239 if ( (gTriggers[b].TriggerType in [TRIGGER_OPENDOOR,
240 TRIGGER_CLOSEDOOR, TRIGGER_DOOR, TRIGGER_DOOR5,
241 TRIGGER_CLOSETRAP, TRIGGER_TRAP, TRIGGER_LIFTUP,
242 TRIGGER_LIFTDOWN, TRIGGER_LIFT]) and
243 (gTriggers[b].Data.PanelID = a) ) or
244 (gTriggers[b].TexturePanel = a) then
245 begin
246 ok := True;
247 Break;
248 end;
250 // Есть триггеры на эту панель:
251 if ok and (gPanels[a].TextureName <> '') and
252 (not IsSpecialTexture(gPanels[a].TextureName) and
253 g_Texture_NumNameFindStart(gPanels[a].TextureName) then
254 begin
255 while True do
256 begin
257 r := g_Texture_NumNameFindNext(res);
258 case r of
259 NNF_NAME_FOUND: ;
260 NNF_NAME_EQUALS: Continue;
261 else Break;
262 end;
264 if res = '' then
265 Break;
267 g_GetResourceSection(res, @filename, @section, @resource);
269 // Не записывать стандартные дополнительные текстуры:
270 if (not cbNonStandart.Checked) or
271 ( (AnsiLowerCase(filename) <> STANDART_WAD) and
272 (AnsiLowerCase(filename) <> SHRSHADE_WAD) ) then
273 begin
274 // Копируем ресурс дополнительной текстуры:
275 if f_packmap.ProcessResource(eWAD.Text, tsection, filename, section, resource) then
276 begin
278 Нужно проверять есть такая текстура textures и есть ли она вообще?
279 // Переименовываем ресурс текстуры:
280 res := utf2win(Format(':%s\%s', [tsection, resource]));
281 ZeroMemory(@textures[a].Resource[0], 64);
282 CopyMemory(@textures[a].Resource[0], @res[1], Min(Length(res), 64));
286 end;
287 end;
288 end; // while True
289 end;
290 end;
291 end;
294 // Записываем изменения карты:
295 mw := TMapWriter_1.Create();
297 mw.AddHeader(header);
298 mw.AddTextures(textures);
299 mw.AddPanels(mr.GetPanels());
300 mw.AddItems(mr.GetItems());
301 mw.AddAreas(mr.GetAreas());
302 mw.AddMonsters(mr.GetMonsters());
303 mw.AddTriggers(mr.GetTriggers());
305 // Сохраняем карту из памяти под новым именем в WAD-файл:
306 len := mw.SaveMap(data);
307 g_AddResource(eWAD.Text, '', eResource.Text, data, len, a);
308 mw.Free();
309 mr.Free();
310 Close();
312 ASSERT(a = 0); (* saved *)
313 MessageDlg(Format(_lc[I_MSG_PACKED], [eResource.Text, ExtractFileName(eWAD.Text)]), mtInformation, [mbOK], 0);
314 end;
316 procedure TPackMapForm.FormCreate(Sender: TObject);
317 begin
318 SaveDialog.InitialDir := EditorDir;
319 end;
321 end.