Subversion Repositories spacemission

Rev

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