Subversion Repositories spacemission

Rev

Rev 6 | Rev 15 | 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
253
  SavGame: textfile;
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;
285
  // Öffnen oder erstellen
2 daniel-mar 286
  AssignFile(SavGame, FDirectory+'Levels\Level '+inttostr(SpinEdit.Position)+'.lev');
1 daniel-mar 287
  Rewrite(SavGame);
288
  // Sortierung
289
  for j := 0 to mainform.enemys.Count - 2 do
290
  begin
291
    for i := 0 to mainform.enemys.Count - 2 do
292
    begin
293
      if strtoint(filter(1, mainform.enemys.Strings[i])) > strtoint(filter(1, mainform.enemys.Strings[i + 1])) then
294
      begin
295
        puffer := mainform.enemys.Strings[i];
296
        mainform.enemys.Strings[i] := mainform.enemys.Strings[i + 1];
297
        mainform.enemys.Strings[i + 1] := puffer;
298
      end;
299
    end;
300
  end;
301
  // Speichern
302
  WriteLN(SavGame, '; SpaceMission ' + FCompVersion);
303
  WriteLN(SavGame, '; LEV-File');
304
  WriteLN(SavGame, inttostr(MainForm.ScrollBar.Max)); // --> Länge der Karte
305
  for i := 0 to mainform.enemys.count-1 do
306
  begin
307
    WriteLN(SavGame, filter(3, mainform.enemys.Strings[i]));
308
    WriteLN(SavGame, filter(1, mainform.enemys.Strings[i]));
309
    WriteLN(SavGame, filter(2, mainform.enemys.Strings[i]));
310
    WriteLN(SavGame, filter(4, mainform.enemys.Strings[i]));
311
  end;
312
  // Schließen
313
  CloseFile(SavGame);
314
  // Nacharbeiten
315
  MainForm.LevChanged := false;
316
  MainForm.AnzeigeAct;
317
  SearchLevels;
318
end;
319
 
320
procedure TSpeicherungForm.LevelListBoxClick(Sender: TObject);
321
var
14 daniel-mar 322
  LevelData: TLevelData;
323
  boss: boolean;
324
  i: Integer;
325
  temp: string;
326
  anzahlEinheiten: integer;
1 daniel-mar 327
begin
328
  li1a.visible := false;
329
  li2a.visible := false;
330
  li3a.visible := false;
331
  li1b.visible := false;
332
  li2b.visible := false;
333
  li3b.visible := false;
334
  liu.visible := false;
335
  liw.visible := false;
336
  if (LevelListBox.items.count=0) or (LevelListBox.itemindex = -1) then
337
  begin
338
    ladenbtn.enabled := false;
339
    loeschenbtn.enabled := false;
340
    liw.visible := true;
341
    exit;
342
  end;
343
  temp := LevelListBox.Items.strings[LevelListBox.itemindex];
344
  SpinEdit.Position := strtoint(RightStr(temp, length(temp)-6));
14 daniel-mar 345
 
346
  LevelData := TLevelData.Create;
347
  try
348
    try
349
      LevelData.Load(FDirectory+'Levels\'+LevelListBox.Items.strings[LevelListBox.itemindex]+'.lev');
350
    except
351
      liu.visible := true;
352
      LadenBtn.enabled := false;
353
    end;
354
 
355
    boss := false;
356
    anzahlEinheiten := Length(LevelData.EnemyAdventTable);
357
    for i := 0 to anzahlEinheiten - 1 do
358
    begin
359
      if LevelData.EnemyAdventTable[i].enemyType = etEnemyBoss then
360
      begin
361
        boss := true;
362
      end;
363
    end;
364
 
1 daniel-mar 365
    li1a.visible := true;
366
    li2a.visible := true;
367
    li3a.visible := true;
368
    li1b.visible := true;
369
    li2b.visible := true;
370
    li3b.visible := true;
371
    LadenBtn.enabled := true;
372
    LoeschenBtn.enabled := true;
14 daniel-mar 373
    li1b.caption := inttostr(anzahlEinheiten);
374
    if boss then
375
      li2b.caption := 'Ja'
376
    else
377
      li2b.caption := 'Nein';
378
    li3b.caption := IntToStr(LevelData.LevelEditorLength) + ' Felder';
379
  finally
380
    FreeAndNil(LevelData);
1 daniel-mar 381
  end;
382
end;
383
 
384
procedure TSpeicherungForm.Button4Click(Sender: TObject);
385
begin
386
  close;
387
end;
388
 
389
procedure TSpeicherungForm.FormShow(Sender: TObject);
390
begin
391
  mainform.dxtimer.enabled := false;
392
  SearchLevels;
393
end;
394
 
395
procedure TSpeicherungForm.DsFancyButton2Click(Sender: TObject);
396
begin
397
  SearchLevels;
398
end;
399
 
400
procedure TSpeicherungForm.AbbrechenBtnClick(Sender: TObject);
401
begin
402
  close;
403
end;
404
 
405
procedure TSpeicherungForm.LevelNameChange(Sender: TObject);
406
begin
407
  {...}
408
end;
409
 
410
procedure TSpeicherungForm.LevelListBoxDblClick(Sender: TObject);
411
begin
412
  LadenBtn.click;
413
end;
414
 
415
procedure TSpeicherungForm.FormHide(Sender: TObject);
416
begin
417
  mainform.dxtimer.enabled := true;
418
end;
419
 
420
procedure TSpeicherungForm.SpinEditClick(Sender: TObject;
421
  Button: TUDBtnType);
422
begin
423
  SpinEditEdt.Text := inttostr(SpinEdit.position);
424
end;
425
 
426
procedure TSpeicherungForm.SpinEditEdtKeyPress(Sender: TObject;
427
  var Key: Char);
428
begin
429
  if not (Key in [#13, #08, '0'..'9']) then
430
    Key := #0;
431
end;
432
 
433
procedure TSpeicherungForm.SpinEditEdtChange(Sender: TObject);
434
begin
435
  SpinEdit.Position := strtoint(SpinEditEdt.text);
436
end;
437
 
438
end.
439