Subversion Repositories spacemission

Rev

Rev 14 | Rev 17 | 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;
30
    SpinEditEdt: TEdit;
31
    SpinEdit: TUpDown;
32
    procedure LoeschenBtnClick(Sender: TObject);
33
    procedure LadenBtnClick(Sender: TObject);
34
    procedure SpeichernBtnClick(Sender: TObject);
35
    procedure LevelListBoxClick(Sender: TObject);
36
    procedure Button4Click(Sender: TObject);
37
    procedure FormShow(Sender: TObject);
38
    procedure DsFancyButton2Click(Sender: TObject);
39
    procedure AbbrechenBtnClick(Sender: TObject);
40
    procedure LevelNameChange(Sender: TObject);
41
    procedure LevelListBoxDblClick(Sender: TObject);
42
    procedure FormHide(Sender: TObject);
43
    procedure SpinEditClick(Sender: TObject; Button: TUDBtnType);
44
    procedure SpinEditEdtKeyPress(Sender: TObject; var Key: Char);
45
    procedure SpinEditEdtChange(Sender: TObject);
46
  public
47
    procedure SearchLevels;
48
    function RightStr(str: string; count: integer): string;
49
    function Filter(n: integer; s: string): string;
50
  end;
51
 
52
var
53
  SpeicherungForm: TSpeicherungForm;
54
 
55
implementation
56
 
57
uses
14 daniel-mar 58
  Global, LevMain, ComLevelReader;
1 daniel-mar 59
 
60
{$R *.DFM}
61
 
62
procedure TSpeicherungForm.SearchLevels;
63
var
64
  {sr: TSearchRec;
65
  res: integer;}
66
  i: integer;
67
begin
68
  //SpinEdit.Value := 1;
69
  LevelListBox.items.clear;
70
  li1a.visible := false;
71
  li2a.visible := false;
72
  li3a.visible := false;
73
  li1b.visible := false;
74
  li2b.visible := false;
75
  li3b.visible := false;
76
  liw.visible := true;
77
  LadenBtn.enabled := false;
78
  LoeschenBtn.enabled := false;
79
  {res := FindFirst(mainform.fdirectory+'Levels\*.lev', 0, sr);
80
  try
81
    while (res = 0) do
82
    begin
83
      if (sr.name <> '.') and (sr.name <> '..') then
84
        LevelListBox.items.Add(copy(sr.Name, 0, length(sr.name)-4));
85
      res := FindNext(sr);
86
    end;
87
  finally
88
    FindClose(sr);
89
  end;}
90
  for i := 1 to 9999 do
91
  begin
2 daniel-mar 92
    if fileexists(fdirectory+'Levels\Level '+inttostr(i)+'.lev') then
1 daniel-mar 93
      LevelListBox.items.Add('Level ' + inttostr(i));
94
  end;
95
end;
96
 
97
procedure TSpeicherungForm.LoeschenBtnClick(Sender: TObject);
98
var
99
  Markiert: boolean;
100
  i: integer;
101
begin
102
  Markiert := false;
103
  for i := 0 to LevelListBox.items.Count-1 do
104
  begin
105
    if LevelListBox.Selected[i] then Markiert := true;
106
  end;
107
  if not Markiert then exit;
108
  if MessageDlg('Dieses Level wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
109
  begin
110
    li1a.visible := false;
111
    li2a.visible := false;
112
    li3a.visible := false;
113
    li1b.visible := false;
114
    li2b.visible := false;
115
    li3b.visible := false;
116
    liu.visible := false;
117
    liw.visible := true;
118
    LadenBtn.enabled := false;
119
    LoeschenBtn.enabled := false;
2 daniel-mar 120
    deletefile(FDirectory+'Levels\'+
1 daniel-mar 121
      LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
122
    SearchLevels;
123
  end;
124
end;
125
 
126
procedure TSpeicherungForm.LadenBtnClick(Sender: TObject);
127
var
128
  Markiert: boolean;
129
  i, TempArtMain, TempLiveMain: integer;
14 daniel-mar 130
  LevelData: TLevelData;
1 daniel-mar 131
begin
132
  Markiert := false;
133
  for i := 0 to LevelListBox.items.Count-1 do
134
  begin
135
    if LevelListBox.Selected[i] then Markiert := true;
136
  end;
137
  if not Markiert then exit;
138
  if LevelListBox.items.count = 0 then
139
  begin
140
    li1a.visible := false;
141
    li2a.visible := false;
142
    li3a.visible := false;
143
    li1b.visible := false;
144
    li2b.visible := false;
145
    li3b.visible := false;
146
    liw.visible := true;
147
    LadenBtn.enabled := false;
148
    LoeschenBtn.enabled := false;
149
  end;
150
  // Da Button bei ungültigen Level deaktiviert wird, ist das nicht mehr nötig.
151
  {if liu.visible or (LevelListBox.items.count=0) then
152
    exit;}
153
  // Vorbereiten
154
  MainForm.DestroyLevel;
155
  MainForm.LevChanged := false;
14 daniel-mar 156
 
157
  LevelData := TLevelData.Create;
158
  try
159
    LevelData.Load(FDirectory+'Levels\'+LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
160
    MainForm.ScrollBar.Max := LevelData.LevelEditorLength;
161
    MainForm.Enemys.Clear;
162
    TempArtMain := MainForm.ArtChecked;
163
    TempLiveMain := MainForm.LiveEdit;
164
    MainForm.NumEnemys := Length(LevelData.EnemyAdventTable);
165
    for i := 0 to MainForm.NumEnemys-1 do
166
    begin
167
      MainForm.EnemyAdd(
168
        LevelData.EnemyAdventTable[i].x,
169
        LevelData.EnemyAdventTable[i].y,
170
        Ord(LevelData.EnemyAdventTable[i].enemyType),
171
        LevelData.EnemyAdventTable[i].lifes
172
      );
173
      MainForm.ArtChecked := Ord(LevelData.EnemyAdventTable[i].enemyType);
174
      MainForm.LiveEdit := LevelData.EnemyAdventTable[i].lifes;
175
      MainForm.EnemyCreate(
176
        LevelData.EnemyAdventTable[i].x,
177
        LevelData.EnemyAdventTable[i].y
178
      );
179
      if LevelData.EnemyAdventTable[i].enemyType = etEnemyBoss then MainForm.Boss := true;
180
    end;
181
  finally
182
    FreeAndNil(LevelData);
1 daniel-mar 183
  end;
184
  MainForm.LiveEdit := TempLiveMain;
185
  MainForm.ArtChecked := TempArtMain;
186
  // Nacharbeiten
187
  MainForm.AnzeigeAct;
188
  close;
189
end;
190
 
191
function TSpeicherungForm.RightStr(str: string; count: integer): string;
192
begin
193
  result := copy(str, length(str)-(count-1), count);
194
end;
195
 
196
function TSpeicherungForm.Filter(n: integer; s: string): string;
197
var
198
  i, last: integer;
199
  start, start2: boolean;
200
  temp: string;
201
begin
202
  last := 0;
203
  start := false;
204
  start2 := false;
205
  temp := '';
206
  if n = 1 then
207
  begin
208
    for i := 1 to length(s)+1 do
209
    begin
210
      if copy(s, i, 1) = '-' then
211
      begin
212
        last := i;
213
        break;
214
      end;
215
    end;
216
    temp := copy(s, 1, last-1);
217
  end;
218
  if n = 2 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
  if n = 3 then
229
  begin
230
    for i := 1 to length(s)+1 do
231
    begin
232
      if start2 then start := true;
233
      if copy(s, i, 1) = ':' then start2 := true;
234
      if (copy(s, i, 1) = '(') and start then break;
235
      if start then temp := temp + copy(s, i, 1)
236
    end;
237
  end;
238
  if n = 4 then
239
  begin
240
    for i := 1 to length(s)+1 do
241
    begin
242
      if start2 then start := true;
243
      if copy(s, i, 1) = '(' then start2 := true;
244
      if (copy(s, i, 1) = ')') and start then break;
245
      if start then temp := temp + copy(s, i, 1)
246
    end;
247
  end;
248
  result := temp;
249
end;
250
 
251
procedure TSpeicherungForm.SpeichernBtnClick(Sender: TObject);
252
var
15 daniel-mar 253
  LevelData: TLevelData;
1 daniel-mar 254
  i, j: integer;
255
  puffer: string;
256
begin
257
  if mainform.Enemys.count = 0 then
258
  begin
259
    MessageDlg('Das Level ist leer!', mtError, [mbOK], 0);
260
    SpinEdit.SetFocus;
261
    exit;
262
  end;
263
  {for i := 0 to length(LevelName.text) do
264
  begin
265
    if (copy(LevelName.text, i, 1) = '\') or
266
      (copy(LevelName.text, i, 1) = '/') or
267
      (copy(LevelName.text, i, 1) = ':') or
268
      (copy(LevelName.text, i, 1) = '*') or
269
      (copy(LevelName.text, i, 1) = '?') or
270
      (copy(LevelName.text, i, 1) = '"') or
271
      (copy(LevelName.text, i, 1) = '<') or
272
      (copy(LevelName.text, i, 1) = '>') or
273
      (copy(LevelName.text, i, 1) = '|') then
274
    begin
275
      MessageDlg('Dies ist kein gültiger Levelname!', mtError, [mbOK], 0);
276
      LevelName.SetFocus;
277
      exit;
278
    end;
279
  end;}
280
  if LevelListBox.items.IndexOf('Level ' + inttostr(SpinEdit.Position)) > -1 then
281
  begin
282
    if MessageDlg('Level ist bereits vorhanden. Ersetzen?', mtConfirmation, [mbYes, mbNo], 0) = mrNo then
283
      exit;
284
  end;
15 daniel-mar 285
 
286
  // Sortierung (wichtig)
1 daniel-mar 287
  for j := 0 to mainform.enemys.Count - 2 do
288
  begin
289
    for i := 0 to mainform.enemys.Count - 2 do
290
    begin
291
      if strtoint(filter(1, mainform.enemys.Strings[i])) > strtoint(filter(1, mainform.enemys.Strings[i + 1])) then
292
      begin
293
        puffer := mainform.enemys.Strings[i];
294
        mainform.enemys.Strings[i] := mainform.enemys.Strings[i + 1];
295
        mainform.enemys.Strings[i + 1] := puffer;
296
      end;
297
    end;
298
  end;
15 daniel-mar 299
 
1 daniel-mar 300
  // Speichern
15 daniel-mar 301
  LevelData := TLevelData.Create;
302
  try
303
    LevelData.LevelEditorLength := MainForm.ScrollBar.Max;
304
    SetLength(LevelData.EnemyAdventTable, mainform.enemys.count);
305
    for i := 0 to mainform.enemys.count-1 do
306
    begin
307
      LevelData.EnemyAdventTable[i].enemyType := TEnemyType(StrToInt(filter(3, mainform.enemys.Strings[i])));
308
      LevelData.EnemyAdventTable[i].x := StrToInt(filter(1, mainform.enemys.Strings[i]));
309
      LevelData.EnemyAdventTable[i].y := StrToInt(filter(2, mainform.enemys.Strings[i]));
310
      LevelData.EnemyAdventTable[i].lifes := StrToInt(filter(4, mainform.enemys.Strings[i]));
311
    end;
312
    LevelData.Save(FDirectory+'Levels\Level '+inttostr(SpinEdit.Position)+'.lev');
313
  finally
314
    FreeAndNil(LevelData);
1 daniel-mar 315
  end;
15 daniel-mar 316
 
1 daniel-mar 317
  // Nacharbeiten
318
  MainForm.LevChanged := false;
319
  MainForm.AnzeigeAct;
320
  SearchLevels;
321
end;
322
 
323
procedure TSpeicherungForm.LevelListBoxClick(Sender: TObject);
324
var
14 daniel-mar 325
  LevelData: TLevelData;
326
  boss: boolean;
327
  i: Integer;
328
  temp: string;
329
  anzahlEinheiten: integer;
1 daniel-mar 330
begin
331
  li1a.visible := false;
332
  li2a.visible := false;
333
  li3a.visible := false;
334
  li1b.visible := false;
335
  li2b.visible := false;
336
  li3b.visible := false;
337
  liu.visible := false;
338
  liw.visible := false;
339
  if (LevelListBox.items.count=0) or (LevelListBox.itemindex = -1) then
340
  begin
341
    ladenbtn.enabled := false;
342
    loeschenbtn.enabled := false;
343
    liw.visible := true;
344
    exit;
345
  end;
346
  temp := LevelListBox.Items.strings[LevelListBox.itemindex];
347
  SpinEdit.Position := strtoint(RightStr(temp, length(temp)-6));
14 daniel-mar 348
 
349
  LevelData := TLevelData.Create;
350
  try
351
    try
352
      LevelData.Load(FDirectory+'Levels\'+LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
353
    except
354
      liu.visible := true;
355
      LadenBtn.enabled := false;
356
    end;
357
 
358
    boss := false;
359
    anzahlEinheiten := Length(LevelData.EnemyAdventTable);
360
    for i := 0 to anzahlEinheiten - 1 do
361
    begin
362
      if LevelData.EnemyAdventTable[i].enemyType = etEnemyBoss then
363
      begin
364
        boss := true;
365
      end;
366
    end;
367
 
1 daniel-mar 368
    li1a.visible := true;
369
    li2a.visible := true;
370
    li3a.visible := true;
371
    li1b.visible := true;
372
    li2b.visible := true;
373
    li3b.visible := true;
374
    LadenBtn.enabled := true;
375
    LoeschenBtn.enabled := true;
14 daniel-mar 376
    li1b.caption := inttostr(anzahlEinheiten);
377
    if boss then
378
      li2b.caption := 'Ja'
379
    else
380
      li2b.caption := 'Nein';
381
    li3b.caption := IntToStr(LevelData.LevelEditorLength) + ' Felder';
382
  finally
383
    FreeAndNil(LevelData);
1 daniel-mar 384
  end;
385
end;
386
 
387
procedure TSpeicherungForm.Button4Click(Sender: TObject);
388
begin
389
  close;
390
end;
391
 
392
procedure TSpeicherungForm.FormShow(Sender: TObject);
393
begin
394
  mainform.dxtimer.enabled := false;
395
  SearchLevels;
396
end;
397
 
398
procedure TSpeicherungForm.DsFancyButton2Click(Sender: TObject);
399
begin
400
  SearchLevels;
401
end;
402
 
403
procedure TSpeicherungForm.AbbrechenBtnClick(Sender: TObject);
404
begin
405
  close;
406
end;
407
 
408
procedure TSpeicherungForm.LevelNameChange(Sender: TObject);
409
begin
410
  {...}
411
end;
412
 
413
procedure TSpeicherungForm.LevelListBoxDblClick(Sender: TObject);
414
begin
415
  LadenBtn.click;
416
end;
417
 
418
procedure TSpeicherungForm.FormHide(Sender: TObject);
419
begin
420
  mainform.dxtimer.enabled := true;
421
end;
422
 
423
procedure TSpeicherungForm.SpinEditClick(Sender: TObject;
424
  Button: TUDBtnType);
425
begin
426
  SpinEditEdt.Text := inttostr(SpinEdit.position);
427
end;
428
 
429
procedure TSpeicherungForm.SpinEditEdtKeyPress(Sender: TObject;
430
  var Key: Char);
431
begin
15 daniel-mar 432
  {$IFDEF UNICODE}
433
  if not CharInSet(Key, [#13, #08, '0'..'9']) then
434
  {$ELSE}
1 daniel-mar 435
  if not (Key in [#13, #08, '0'..'9']) then
15 daniel-mar 436
  {$ENDIF}
1 daniel-mar 437
    Key := #0;
438
end;
439
 
440
procedure TSpeicherungForm.SpinEditEdtChange(Sender: TObject);
441
begin
442
  SpinEdit.Position := strtoint(SpinEditEdt.text);
443
end;
444
 
445
end.
446