Subversion Repositories spacemission

Rev

Rev 17 | Rev 27 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1 daniel-mar 1
unit LevSpeicherung;
2
 
3
interface
4
 
5
uses
6
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
6 daniel-mar 7
  StdCtrls, ExtCtrls, Spin, ComCtrls{$IF CompilerVersion >= 23.0}, System.UITypes{$IFEND};
1 daniel-mar 8
 
9
type
10
  TSpeicherungForm = class(TForm)
11
    Bevel1: TBevel;
12
    LadenBtn: TButton;                      
13
    LoeschenBtn: TButton;
14
    AktualisierenBtn: TButton;
15
    SpeichernBtn: TButton;
16
    AbbrechenBtn: TButton;
17
    LevelListBox: TListBox;
18
    Label2: TLabel;
19
    Label3: TLabel;
20
    Label1: TLabel;
21
    ElPanel1: TPanel;
22
    li3a: TLabel;
23
    li1b: TLabel;
24
    li1a: TLabel;
25
    li2b: TLabel;
26
    li2a: TLabel;
27
    li3b: TLabel;
28
    liu: TLabel;
29
    liw: TLabel;
24 daniel-mar 30
    LevelNumber: TSpinEdit;
1 daniel-mar 31
    procedure LoeschenBtnClick(Sender: TObject);
32
    procedure LadenBtnClick(Sender: TObject);
33
    procedure SpeichernBtnClick(Sender: TObject);
34
    procedure LevelListBoxClick(Sender: TObject);
35
    procedure Button4Click(Sender: TObject);
36
    procedure FormShow(Sender: TObject);
37
    procedure DsFancyButton2Click(Sender: TObject);
38
    procedure AbbrechenBtnClick(Sender: TObject);
39
    procedure LevelNameChange(Sender: TObject);
40
    procedure LevelListBoxDblClick(Sender: TObject);
41
    procedure FormHide(Sender: TObject);
42
  public
43
    procedure SearchLevels;
44
    function RightStr(str: string; count: integer): string;
45
    function Filter(n: integer; s: string): string;
46
  end;
47
 
48
var
49
  SpeicherungForm: TSpeicherungForm;
50
 
51
implementation
52
 
53
uses
14 daniel-mar 54
  Global, LevMain, ComLevelReader;
1 daniel-mar 55
 
56
{$R *.DFM}
57
 
58
procedure TSpeicherungForm.SearchLevels;
59
var
60
  i: integer;
61
begin
62
  //SpinEdit.Value := 1;
63
  LevelListBox.items.clear;
64
  li1a.visible := false;
65
  li2a.visible := false;
66
  li3a.visible := false;
67
  li1b.visible := false;
68
  li2b.visible := false;
69
  li3b.visible := false;
70
  liw.visible := true;
71
  LadenBtn.enabled := false;
72
  LoeschenBtn.enabled := false;
73
  for i := 1 to 9999 do
74
  begin
17 daniel-mar 75
    if fileexists(GetLevelFileName(i)) then
24 daniel-mar 76
      LevelListBox.items.Add(ChangeFileExt(ExtractFileName(GetLevelFileName(i)),''));
1 daniel-mar 77
  end;
78
end;
79
 
80
procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject);
81
var
82
  Markiert: boolean;
83
  i: integer;
84
begin
85
  Markiert := false;
86
  for i := 0 to LevelListBox.items.Count-1 do
87
  begin
88
    if LevelListBox.Selected[i] then Markiert := true;
89
  end;
90
  if not Markiert then exit;
91
  if MessageDlg('Dieses Level wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
92
  begin
93
    li1a.visible := false;
94
    li2a.visible := false;
95
    li3a.visible := false;
96
    li1b.visible := false;
97
    li2b.visible := false;
98
    li3b.visible := false;
99
    liu.visible := false;
100
    liw.visible := true;
101
    LadenBtn.enabled := false;
102
    LoeschenBtn.enabled := false;
17 daniel-mar 103
    deletefile(IncludeTrailingPathDelimiter(ExtractFilePath(GetLevelFileName(1)))+
1 daniel-mar 104
      LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
105
    SearchLevels;
106
  end;
107
end;
108
 
109
procedure TSpeicherungForm.LadenBtnClick(Sender: TObject);
110
var
111
  Markiert: boolean;
24 daniel-mar 112
  i: integer;
14 daniel-mar 113
  LevelData: TLevelData;
1 daniel-mar 114
begin
115
  Markiert := false;
116
  for i := 0 to LevelListBox.items.Count-1 do
117
  begin
118
    if LevelListBox.Selected[i] then Markiert := true;
119
  end;
120
  if not Markiert then exit;
121
  if LevelListBox.items.count = 0 then
122
  begin
123
    li1a.visible := false;
124
    li2a.visible := false;
125
    li3a.visible := false;
126
    li1b.visible := false;
127
    li2b.visible := false;
128
    li3b.visible := false;
129
    liw.visible := true;
130
    LadenBtn.enabled := false;
131
    LoeschenBtn.enabled := false;
132
  end;
133
  // Da Button bei ungültigen Level deaktiviert wird, ist das nicht mehr nötig.
134
  {if liu.visible or (LevelListBox.items.count=0) then
135
    exit;}
136
  // Vorbereiten
137
  MainForm.DestroyLevel;
138
  MainForm.LevChanged := false;
14 daniel-mar 139
 
140
  LevelData := TLevelData.Create;
141
  try
17 daniel-mar 142
    LevelData.Load(IncludeTrailingPathDelimiter(ExtractFilePath(GetLevelFileName(1)))+
143
      LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
14 daniel-mar 144
    MainForm.ScrollBar.Max := LevelData.LevelEditorLength;
145
    MainForm.Enemys.Clear;
146
    MainForm.NumEnemys := Length(LevelData.EnemyAdventTable);
147
    for i := 0 to MainForm.NumEnemys-1 do
148
    begin
149
      MainForm.EnemyAdd(
150
        LevelData.EnemyAdventTable[i].x,
151
        LevelData.EnemyAdventTable[i].y,
152
        Ord(LevelData.EnemyAdventTable[i].enemyType),
153
        LevelData.EnemyAdventTable[i].lifes
154
      );
155
      MainForm.EnemyCreate(
156
        LevelData.EnemyAdventTable[i].x,
24 daniel-mar 157
        LevelData.EnemyAdventTable[i].y,
158
        LevelData.EnemyAdventTable[i].enemyType,
159
        LevelData.EnemyAdventTable[i].lifes
14 daniel-mar 160
      );
161
      if LevelData.EnemyAdventTable[i].enemyType = etEnemyBoss then MainForm.Boss := true;
162
    end;
163
  finally
164
    FreeAndNil(LevelData);
1 daniel-mar 165
  end;
166
  // Nacharbeiten
167
  MainForm.AnzeigeAct;
168
  close;
169
end;
170
 
171
function TSpeicherungForm.RightStr(str: string; count: integer): string;
172
begin
173
  result := copy(str, length(str)-(count-1), count);
174
end;
175
 
176
function TSpeicherungForm.Filter(n: integer; s: string): string;
177
var
178
  i, last: integer;
179
  start, start2: boolean;
180
  temp: string;
181
begin
182
  last := 0;
183
  start := false;
184
  start2 := false;
185
  temp := '';
186
  if n = 1 then
187
  begin
188
    for i := 1 to length(s)+1 do
189
    begin
190
      if copy(s, i, 1) = '-' then
191
      begin
192
        last := i;
193
        break;
194
      end;
195
    end;
196
    temp := copy(s, 1, last-1);
197
  end;
198
  if n = 2 then
199
  begin
200
    for i := 1 to length(s)+1 do
201
    begin
202
      if start2 then start := true;
203
      if copy(s, i, 1) = '-' then start2 := true;
204
      if (copy(s, i, 1) = ':') and start then break;
205
      if start then temp := temp + copy(s, i, 1)
206
    end;
207
  end;
208
  if n = 3 then
209
  begin
210
    for i := 1 to length(s)+1 do
211
    begin
212
      if start2 then start := true;
213
      if copy(s, i, 1) = ':' then start2 := true;
214
      if (copy(s, i, 1) = '(') and start then break;
215
      if start then temp := temp + copy(s, i, 1)
216
    end;
217
  end;
218
  if n = 4 then
219
  begin
220
    for i := 1 to length(s)+1 do
221
    begin
222
      if start2 then start := true;
223
      if copy(s, i, 1) = '(' then start2 := true;
224
      if (copy(s, i, 1) = ')') and start then break;
225
      if start then temp := temp + copy(s, i, 1)
226
    end;
227
  end;
228
  result := temp;
229
end;
230
 
231
procedure TSpeicherungForm.SpeichernBtnClick(Sender: TObject);
232
var
15 daniel-mar 233
  LevelData: TLevelData;
1 daniel-mar 234
  i, j: integer;
235
  puffer: string;
236
begin
237
  if mainform.Enemys.count = 0 then
238
  begin
239
    MessageDlg('Das Level ist leer!', mtError, [mbOK], 0);
24 daniel-mar 240
    LevelNumber.SetFocus;
1 daniel-mar 241
    exit;
242
  end;
243
  {for i := 0 to length(LevelName.text) do
244
  begin
245
    if (copy(LevelName.text, i, 1) = '\') or
246
      (copy(LevelName.text, i, 1) = '/') or
247
      (copy(LevelName.text, i, 1) = ':') or
248
      (copy(LevelName.text, i, 1) = '*') or
249
      (copy(LevelName.text, i, 1) = '?') or
250
      (copy(LevelName.text, i, 1) = '"') or
251
      (copy(LevelName.text, i, 1) = '<') or
252
      (copy(LevelName.text, i, 1) = '>') or
253
      (copy(LevelName.text, i, 1) = '|') then
254
    begin
255
      MessageDlg('Dies ist kein gültiger Levelname!', mtError, [mbOK], 0);
256
      LevelName.SetFocus;
257
      exit;
258
    end;
259
  end;}
24 daniel-mar 260
  if LevelListBox.items.IndexOf('Level ' + inttostr(LevelNumber.Value)) > -1 then
1 daniel-mar 261
  begin
262
    if MessageDlg('Level ist bereits vorhanden. Ersetzen?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
263
      exit;
264
  end;
15 daniel-mar 265
 
266
  // Sortierung (wichtig)
1 daniel-mar 267
  for j := 0 to mainform.enemys.Count - 2 do
268
  begin
269
    for i := 0 to mainform.enemys.Count - 2 do
270
    begin
271
      if strtoint(filter(1, mainform.enemys.Strings[i])) > strtoint(filter(1, mainform.enemys.Strings[i + 1])) then
272
      begin
273
        puffer := mainform.enemys.Strings[i];
274
        mainform.enemys.Strings[i] := mainform.enemys.Strings[i + 1];
275
        mainform.enemys.Strings[i + 1] := puffer;
276
      end;
277
    end;
278
  end;
15 daniel-mar 279
 
1 daniel-mar 280
  // Speichern
15 daniel-mar 281
  LevelData := TLevelData.Create;
282
  try
283
    LevelData.LevelEditorLength := MainForm.ScrollBar.Max;
284
    SetLength(LevelData.EnemyAdventTable, mainform.enemys.count);
285
    for i := 0 to mainform.enemys.count-1 do
286
    begin
287
      LevelData.EnemyAdventTable[i].enemyType := TEnemyType(StrToInt(filter(3, mainform.enemys.Strings[i])));
288
      LevelData.EnemyAdventTable[i].x := StrToInt(filter(1, mainform.enemys.Strings[i]));
289
      LevelData.EnemyAdventTable[i].y := StrToInt(filter(2, mainform.enemys.Strings[i]));
290
      LevelData.EnemyAdventTable[i].lifes := StrToInt(filter(4, mainform.enemys.Strings[i]));
291
    end;
24 daniel-mar 292
    LevelData.Save(GetLevelFileName(LevelNumber.Value));
15 daniel-mar 293
  finally
294
    FreeAndNil(LevelData);
1 daniel-mar 295
  end;
15 daniel-mar 296
 
1 daniel-mar 297
  // Nacharbeiten
298
  MainForm.LevChanged := false;
299
  MainForm.AnzeigeAct;
300
  SearchLevels;
301
end;
302
 
303
procedure TSpeicherungForm.LevelListBoxClick(Sender: TObject);
304
var
14 daniel-mar 305
  LevelData: TLevelData;
306
  boss: boolean;
307
  i: Integer;
308
  temp: string;
309
  anzahlEinheiten: integer;
1 daniel-mar 310
begin
311
  li1a.visible := false;
312
  li2a.visible := false;
313
  li3a.visible := false;
314
  li1b.visible := false;
315
  li2b.visible := false;
316
  li3b.visible := false;
317
  liu.visible := false;
318
  liw.visible := false;
319
  if (LevelListBox.items.count=0) or (LevelListBox.itemindex = -1) then
320
  begin
321
    ladenbtn.enabled := false;
322
    loeschenbtn.enabled := false;
323
    liw.visible := true;
324
    exit;
325
  end;
326
  temp := LevelListBox.Items.strings[LevelListBox.itemindex];
24 daniel-mar 327
  LevelNumber.Value := strtoint(RightStr(temp, length(temp)-Length('Level ')));
14 daniel-mar 328
 
329
  LevelData := TLevelData.Create;
330
  try
331
    try
17 daniel-mar 332
      LevelData.Load(IncludeTrailingPathDelimiter(ExtractFilePath(GetLevelFileName(1)))+
333
        LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
14 daniel-mar 334
    except
335
      liu.visible := true;
336
      LadenBtn.enabled := false;
337
    end;
338
 
339
    boss := false;
340
    anzahlEinheiten := Length(LevelData.EnemyAdventTable);
341
    for i := 0 to anzahlEinheiten - 1 do
342
    begin
343
      if LevelData.EnemyAdventTable[i].enemyType = etEnemyBoss then
344
      begin
345
        boss := true;
346
      end;
347
    end;
348
 
1 daniel-mar 349
    li1a.visible := true;
350
    li2a.visible := true;
351
    li3a.visible := true;
352
    li1b.visible := true;
353
    li2b.visible := true;
354
    li3b.visible := true;
355
    LadenBtn.enabled := true;
356
    LoeschenBtn.enabled := true;
14 daniel-mar 357
    li1b.caption := inttostr(anzahlEinheiten);
358
    if boss then
359
      li2b.caption := 'Ja'
360
    else
361
      li2b.caption := 'Nein';
362
    li3b.caption := IntToStr(LevelData.LevelEditorLength) + ' Felder';
363
  finally
364
    FreeAndNil(LevelData);
1 daniel-mar 365
  end;
366
end;
367
 
368
procedure TSpeicherungForm.Button4Click(Sender: TObject);
369
begin
370
  close;
371
end;
372
 
373
procedure TSpeicherungForm.FormShow(Sender: TObject);
374
begin
375
  mainform.dxtimer.enabled := false;
376
  SearchLevels;
377
end;
378
 
379
procedure TSpeicherungForm.DsFancyButton2Click(Sender: TObject);
380
begin
381
  SearchLevels;
382
end;
383
 
384
procedure TSpeicherungForm.AbbrechenBtnClick(Sender: TObject);
385
begin
386
  close;
387
end;
388
 
389
procedure TSpeicherungForm.LevelNameChange(Sender: TObject);
390
begin
391
  {...}
392
end;
393
 
394
procedure TSpeicherungForm.LevelListBoxDblClick(Sender: TObject);
395
begin
396
  LadenBtn.click;
397
end;
398
 
399
procedure TSpeicherungForm.FormHide(Sender: TObject);
400
begin
401
  mainform.dxtimer.enabled := true;
402
end;
403
 
404
end.
405