Subversion Repositories spacemission

Rev

Rev 14 | 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 LevMain;
2
 
15 daniel-mar 3
// TODO 2024:
4
// - Wenn man ein Level "X" lädt, und dann Verwalten wieder öffnet, sollte diese Level-Nummer vorgeschlagen werden, sodass man direkt Speichern klicken kann
5
 
1 daniel-mar 6
interface
7
 
8
uses
9
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem,
10
  Dialogs, StdCtrls, ExtCtrls, Menus, DIB, DXClass, DXSprite, DXDraws,
6 daniel-mar 11
  DXSounds, Spin, ComCtrls{$IF CompilerVersion >= 23.0}, System.UITypes,
15 daniel-mar 12
  WinAPI.DirectDraw{$ENDIF}, DirectX;
1 daniel-mar 13
 
14
type
15
  TMainForm = class(TDXForm)
16
    MainMenu: TMainMenu;
17
    Spiel: TMenuItem;
18
    Beenden: TMenuItem;
19
    Hilfe: TMenuItem;
20
    Leer1: TMenuItem;
21
    Level: TMenuItem;
22
    Informationen: TMenuItem;
23
    Enemy1: TRadioButton;
24
    Enemy2: TRadioButton;
25
    Enemy3: TRadioButton;
26
    Enemy4: TRadioButton;
27
    Enemy5: TRadioButton;
28
    Enemy6: TRadioButton;
29
    Enemy7: TRadioButton;
30
    ScrollBar: TScrollBar;
31
    Bevel1: TBevel;
32
    Bevel2: TBevel;
33
    SelLabel: TLabel;
34
    SelPanel: TPanel;
35
    Bevel3: TBevel;
36
    SLabel1a: TLabel;
37
    SLabel2a: TLabel;
38
    SLabel1b: TLabel;
39
    SLabel2b: TLabel;
40
    SLabel0: TLabel;
41
    Neu: TMenuItem;
42
    Image1: TImage;
43
    SLabel3a: TLabel;
44
    SLabel3b: TLabel;
45
    SLabel4a: TLabel;
46
    SLabel4b: TLabel;
47
    LivesLabel: TLabel;
48
    Quelltext1: TMenuItem;
49
    StatusBar: TStatusBar;
50
    N1: TMenuItem;
51
    Spielfelderweitern1: TMenuItem;
52
    LivesEdt: TEdit;
53
    Lives: TUpDown;
54
    procedure DXDrawFinalize(Sender: TObject);
55
    procedure DXDrawInitialize(Sender: TObject);
56
    procedure FormCreate(Sender: TObject);
57
    procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
58
    procedure BeendenClick(Sender: TObject);
59
    procedure FormDestroy(Sender: TObject);
60
    procedure LevelClick(Sender: TObject);
61
    procedure FormShow(Sender: TObject);
62
    procedure InformationenClick(Sender: TObject);
63
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
64
    procedure DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
65
      Shift: TShiftState; X, Y: Integer);
66
    procedure EnemyClick(Sender: TObject);
67
    procedure EnemyAdd(x, y, art, lives: integer);
68
    procedure NeuClick(Sender: TObject);
69
    procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
70
      Y: Integer);
71
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
72
    procedure Quelltext1Click(Sender: TObject);
73
    procedure Spielfelderweitern1Click(Sender: TObject);
74
    procedure ScrollBarScroll(Sender: TObject; ScrollCode: TScrollCode;
75
      var ScrollPos: Integer);
76
    procedure LivesClick(Sender: TObject; Button: TUDBtnType);
77
    procedure LivesEdtKeyPress(Sender: TObject; var Key: Char);
78
    procedure LivesEdtChange(Sender: TObject);
79
  public
80
    { VCL-Ersatz }
81
    spriteengine: tdxspriteengine;
82
    dxtimer: tdxtimer;
83
    imagelist: tdximagelist;
84
    dxdraw: tdxdraw;
85
    { Variablen }
86
    FMenuItem: integer;
87
    Enemys: TStrings;
88
    ArtChecked: integer;
89
    LiveEdit: integer;
90
    ScrollP: integer;
91
    AltScrollPos: integer;
92
    Boss: boolean;
93
    LevChanged: boolean;
94
    NumEnemys: integer;
95
    { Level-Routinen }
96
    procedure EnemyCreate(x, y: integer);
97
    procedure DestroyLevel;
98
    procedure AnzeigeAct;
99
    { Initialisiations-Routinen }
100
    procedure DXInit;
101
    procedure ProgramInit;
102
    { Farb-Routinen }
103
    function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
104
    procedure PalleteAnim(Col: TRGBQuad; Time: Integer);
105
    { Sonstiges }
106
    procedure LivesChange(newval: integer);
107
  end;
108
 
109
var
110
  MainForm: TMainForm;
111
 
112
implementation
113
 
114
uses
14 daniel-mar 115
  Global, LevSplash, LevSpeicherung, ComInfo, LevSource, LevOptions,
116
  ComLevelReader;
1 daniel-mar 117
 
118
const
119
  FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
120
  status_info = ' Zeigen Sie mit dem Mauszeiger auf eine Einheit, um deren Eigenschaften anzuzeigen...';
121
  status_lives = ' Leben: ';
122
  status_nolives = ' Einheit hat keine Lebensangabe';
123
  RasterW = 48;
124
  RasterH = 32;
125
 
126
{$R *.DFM}
127
 
128
type
129
  TBackground = class(TBackgroundSprite)
130
  protected
131
    procedure DoMove(MoveCount: Integer); override;
132
  end;
133
 
134
  TEnemy = class(TImageSprite)
135
  private
136
    Lives: integer;
137
    Art: integer;
138
    XCor: integer;
139
    CorInit: boolean;
140
  protected
141
    procedure DoMove(MoveCount: Integer); override;
142
  public
143
    constructor Create(AParent: TSprite); override;
144
  end;
145
 
146
procedure TMainForm.DXInit;
147
begin
148
  Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg');
149
  ImageList.Items.MakeColorTable;
150
  DXDraw.ColorTable := ImageList.Items.ColorTable;
151
  DXDraw.DefColorTable := ImageList.Items.ColorTable;
152
  DXDraw.UpdatePalette;
153
  DXDraw.Initialize;
154
end;
155
 
156
procedure TEnemy.DoMove(MoveCount: Integer);
157
begin
158
  if not CorInit then
159
  begin
160
    XCor := trunc(x) + (MainForm.ScrollP * RasterW);
161
    CorInit := true;
162
  end;
163
  if MainForm.Enemys.IndexOf(floattostr(XCor)+'-'+floattostr(y)+':'+
164
    inttostr(Art)+'('+inttostr(Lives)+')') = -1 then dead;
165
  X := XCor - (MainForm.ScrollP * RasterW);
166
end;
167
 
168
procedure TBackground.DoMove(MoveCount: Integer);
169
begin
170
  X := -(MainForm.ScrollP * RasterW);
171
end;
172
 
173
constructor TEnemy.Create(AParent: TSprite);
174
begin
175
  inherited Create(AParent);
176
  if MainForm.ArtChecked = 1 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
177
  if MainForm.ArtChecked = 2 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
178
  if MainForm.ArtChecked = 3 then Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
179
  if MainForm.ArtChecked = 4 then Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
180
  if MainForm.ArtChecked = 5 then Image := MainForm.ImageList.Items.Find('Enemy-Disk');
181
  if MainForm.ArtChecked = 6 then Image := MainForm.ImageList.Items.Find('Enemy-Disk2');
182
  if MainForm.ArtChecked = 7 then Image := MainForm.ImageList.Items.Find('Enemy-Boss');
183
  if MainForm.ArtChecked = 4 then Lives := 0 else Lives := MainForm.LiveEdit;
184
  Art := MainForm.ArtChecked;
185
  Width := Image.Width;
186
  Height := Image.Height;
187
  PixelCheck := True;
188
end;
189
 
190
procedure TMainForm.FormCreate(Sender: TObject);
191
var
14 daniel-mar 192
  LevelData: TLevelData;
1 daniel-mar 193
begin
194
  { VCL-Ersatz start }
195
  dxtimer := tdxtimer.create(self);
196
  dxtimer.Interval := 100;
197
  dxtimer.ActiveOnly := false;
198
  dxtimer.Enabled := false;
199
  dxtimer.OnTimer := DxTimerTimer;
200
 
201
  dxdraw := tdxdraw.Create(self);
202
  dxdraw.Parent := self;
203
  dxdraw.Left := 0;
204
  dxdraw.Top := 0;
205
  dxdraw.Width := 640;
206
  dxdraw.Height := 480;
207
  dxdraw.AutoInitialize := False;
208
  dxdraw.AutoSize := False;
209
  dxdraw.Color := clBlack;
210
  dxdraw.Display.BitCount := 24;
211
  dxdraw.Display.FixedBitCount := False;
212
  dxdraw.Display.FixedRatio := False;
213
  dxdraw.Display.FixedSize := False;
214
  dxdraw.Display.Height := 600;
215
  dxdraw.Display.Width := 800;
4 daniel-mar 216
  dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, {doRetainedMode,} doHardware, doSelectDriver];
1 daniel-mar 217
  dxdraw.OnFinalize := DXDrawFinalize;
218
  dxdraw.OnInitialize := DXDrawInitialize;
219
  dxdraw.ParentShowHint := False;
220
  dxdraw.ShowHint := False;
221
  dxdraw.TabOrder := 0;
222
  dxdraw.OnMouseDown := DXDrawMouseDown;
223
  dxdraw.OnMouseMove := DXDrawMouseMove;
224
 
225
  spriteengine := tdxspriteengine.create(self);
226
  spriteengine.DXDraw := dxdraw;
227
 
228
  imagelist := tdximagelist.create(self);
229
  imagelist.DXDraw := dxdraw;
230
 
231
  { VCL-Ersatz ende }
232
 
233
  ArtChecked := 1;
234
  LiveEdit := 1;
235
  // Leeres Level am Anfang braucht keine Beenden-Bestätigung.
236
  // LevChanged := true;
2 daniel-mar 237
 
238
  //Application.Title := 'SpaceMission '+ProgramVersion+' - Leveleditor';
239
  Caption := 'SpaceMission '+ProgramVersion+' - Leveleditor';
1 daniel-mar 240
  DXInit;
241
  if (paramcount > 0) and (fileexists(paramstr(1))) then
242
  begin
14 daniel-mar 243
    LevelData := TLevelData.Create;
244
    try
245
      try
246
        LevelData.Load(paramstr(1));
247
      except
248
        showmessage(FileError);
249
        ProgramInit;
250
        exit;
251
      end;
252
    finally
253
      FreeAndNil(LevelData);
1 daniel-mar 254
    end;
255
    { Laden }
256
    exit;
257
  end;
258
  if fileexists(fdirectory+'Bilder\Auswahl.bmp') then
259
    Image1.Picture.LoadFromFile(fdirectory+'Bilder\Auswahl.bmp');
260
  {else
261
    SelPanel.visible := false;}
262
  ProgramInit;
263
end;
264
 
265
procedure TMainForm.FormDestroy(Sender: TObject);
266
begin
267
  Enemys.Free;
268
  //spriteengine.Free;
269
  dxtimer.Free;
270
  imagelist.Free;
271
  dxdraw.free;
272
end;
273
 
274
procedure TMainForm.BeendenClick(Sender: TObject);
275
begin
276
  close;
277
end;
278
 
279
procedure TMainForm.DXDrawInitialize(Sender: TObject);
280
begin
281
  DXTimer.Enabled := True;
282
end;
283
 
284
procedure TMainForm.DXDrawFinalize(Sender: TObject);
285
begin
286
  DXTimer.Enabled := False;
287
end;
288
 
289
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
290
begin
291
  if not DXDraw.CanDraw then exit;
292
  LagCount := 1000 div 60;
293
  SpriteEngine.Move(LagCount);
294
  SpriteEngine.Dead;
295
  DxDraw.Surface.Fill(0);
296
  SpriteEngine.Draw;
297
  DXDraw.Flip;
298
end;
299
 
300
function TMainForm.ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
301
begin
302
  with Result do
303
  begin
304
    rgbRed := Src.rgbRed+((Dest.rgbRed-Src.rgbRed)*Percent div 256);
305
    rgbGreen := Src.rgbGreen+((Dest.rgbGreen-Src.rgbGreen)*Percent div 256);
306
    rgbBlue := Src.rgbBlue+((Dest.rgbBlue-Src.rgbBlue)*Percent div 256);
307
    rgbReserved := 0;
308
  end;
309
end;
310
 
311
procedure TMainForm.PalleteAnim(Col: TRGBQuad; Time: Integer);
312
var
313
  i: Integer;
314
  t, t2: DWORD;
315
  ChangePalette: Boolean;
316
  c: Integer;
317
begin
318
  if DXDraw.Initialized then
319
  begin
320
    c := DXDraw.Surface.ColorMatch(RGB(Col.rgbRed, Col.rgbGreen, Col.rgbBlue));
321
    ChangePalette := False;
322
    if DXDraw.CanPaletteAnimation then
323
    begin
324
      t := GetTickCount;
325
      while Abs(GetTickCount-t)<Time do
326
      begin
327
        t2 := Trunc(Abs(GetTickCount-t)/Time*255);
328
        for i := 0 to 255 do
329
          DXDraw.ColorTable[i] := ComposeColor(Col, DXDraw.DefColorTable[i], t2);
330
        DXDraw.UpdatePalette;
331
        ChangePalette := True;
332
      end;
333
    end else
334
      Sleep(Time);
335
    for i := 0 to 4 do
336
    begin
337
      DXDraw.Surface.Fill(c);
338
      DXDraw.Flip;
339
    end;
340
    if ChangePalette then
341
    begin
342
      DXDraw.ColorTable := DXDraw.DefColorTable;
343
      DXDraw.UpdatePalette;
344
    end;
345
    DXDraw.Surface.Fill(c);
346
    DXDraw.Flip;
347
  end;
348
end;
349
 
350
procedure TMainForm.ProgramInit;
351
{var
352
  i, j: Integer;}
353
begin
354
  Enemys := TStringList.create;
355
  sleep(500);
356
  //PlayerSprite
357
  with TBackground.Create(SpriteEngine.Engine) do
358
  begin
359
    SetMapSize(1, 1);
360
    Image := mainform.ImageList.Items.Find('Star3');
361
    Z := -13;
362
    Y := 40;
363
    Tile := True;
364
  end;
365
  with TBackground.Create(SpriteEngine.Engine) do
366
  begin
367
    SetMapSize(1, 1);
368
    Image := mainform.ImageList.Items.Find('Star2');
369
    Z := -12;
370
    Y := 30;
371
    Tile := True;
372
  end;
373
  with TBackground.Create(SpriteEngine.Engine) do
374
  begin
375
    SetMapSize(1, 1);
376
    Image := mainform.ImageList.Items.Find('Star1');
377
    Z := -11;
378
    Y := 10;
379
    Tile := True;
380
  end;
381
  with TBackground.Create(SpriteEngine.Engine) do
382
  begin
383
    SetMapSize(1, 1);
384
    Image := mainform.ImageList.Items.Find('Matrix');
385
    Z := -10;
386
    Tile := True;
387
  end;
388
  {with TBackground.Create(SpriteEngine.Engine) do
389
  begin
390
    SetMapSize(200, 10);
391
    Y := 10;
392
    Z := -13;
393
    FSpeed := 1 / 2;
394
    Tile := True;
395
    for i := 0 to MapHeight-1 do
396
    begin
397
      for j := 0 to MapWidth-1 do
398
      begin
399
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 8);
400
        if Random(100)<95 then Chips[j, i] := -1;
401
      end;
402
    end;
403
  end;
404
  with TBackground.Create(SpriteEngine.Engine) do
405
  begin
406
    SetMapSize(200, 10);
407
    Y := 30;
408
    Z := -12;
409
    FSpeed := 1;
410
    Tile := True;
411
    for i := 0 to MapHeight-1 do
412
    begin
413
      for j := 0 to MapWidth-1 do
414
      begin
415
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 4);
416
        if Random(100)<95 then Chips[j, i] := -1;
417
      end;
418
    end;
419
  end;
420
  with TBackground.Create(SpriteEngine.Engine) do
421
  begin
422
    SetMapSize(200, 10);
423
    Y := 40;
424
    Z := -11;
425
    FSpeed := 2;
426
    Tile := True;
427
    for i := 0 to MapHeight-1 do
428
    begin
429
      for j := 0 to MapWidth-1 do
430
      begin
431
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 2);
432
        if Random(100)<95 then Chips[j, i] := -1;
433
      end;
434
    end;
435
  end;}
436
  PalleteAnim(RGBQuad(0, 0, 0), 300);
437
  mainform.Visible := true;
438
end;
439
 
440
procedure TMainForm.LevelClick(Sender: TObject);
441
begin
442
  speicherungform.showmodal;
443
end;
444
 
445
procedure TMainForm.FormShow(Sender: TObject);
446
begin
447
  SplashForm.Hide;
448
  SplashForm.Free;
449
 
450
  dxtimer.Enabled := true;
451
  dxtimer.ActiveOnly := true;
452
end;
453
 
454
procedure TMainForm.InformationenClick(Sender: TObject);
455
begin
3 daniel-mar 456
  mainform.dxtimer.enabled := false;
1 daniel-mar 457
  InfoForm.showmodal;
3 daniel-mar 458
  mainform.dxtimer.enabled := true;
1 daniel-mar 459
end;
460
 
461
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
462
begin
463
  SpriteEngine.Engine.Clear;
464
  DXTimer.Enabled := False;
465
end;
466
 
467
procedure TMainForm.DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
468
  Shift: TShiftState; X, Y: Integer);
469
var
470
  i, j, k, l, ex, ey: integer;
471
  ok, breaked: boolean;
472
begin
473
  ex := trunc(x/RasterW) * RasterW;
474
  ey := trunc(y/RasterH) * RasterH;
475
  EnemyCreate(ex, ey);
476
  breaked := false;
477
  { Setzen }
478
  if Button = mbLeft then
479
  begin
480
    ok := true;
481
    if (ArtChecked = 7) and boss then ok := false
482
    else
483
    begin
484
      for i := 1 to 7 do
485
      begin
486
        for j := 0 to 999 do
487
        begin
488
          if boss then
489
          begin
490
            for k := 0 to 3 do
491
            begin
492
              for l := 0 to 1 do
493
              begin
494
                if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':7('+inttostr(j)+')') <> -1 then
495
                begin
496
                  ok := false;
497
                  break;
498
                end;
499
              end;
500
              if not ok then break;
501
            end;
502
            if not ok then break;
503
          end;
504
          if Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
505
            inttostr(i)+'('+inttostr(j)+')') <> -1 then
506
          begin
507
            ok := false;
508
            break;
509
          end;
510
        end;
511
        if not ok then break;
512
      end;
513
    end;
514
    if ok then
515
    begin
516
      if ArtChecked <> 4 then
517
        Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
518
          inttostr(ArtChecked)+'('+inttostr(LiveEdit)+')')
519
      else
520
        Enemys.Add(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
521
          inttostr(ArtChecked)+'(0)');
522
      inc(NumEnemys);
523
      if ArtChecked = 7 then boss := true;
524
    end
525
    else beep;
526
  end
527
  { Löschen }
528
  else if Button = mbRight then
529
  begin
530
    for i := 1 to 7 do
531
    begin
532
      for j := 0 to 999 do
533
      begin
534
        if boss and (i = 7) then
535
        begin
536
          for k := 0 to 3 do
537
          begin
538
            for l := 0 to 1 do
539
            begin
540
              if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then
541
              begin
542
                Enemys.Delete(Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')'));
543
                Boss := false;
544
                dec(NumEnemys);
545
                breaked := true;
546
                break;
547
              end;
548
            end;
549
            if breaked then break;
550
          end;
551
        end;
552
        if Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
553
          inttostr(i)+'('+inttostr(j)+')') <> -1 then
554
        begin
555
          Enemys.Delete(Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+
556
            ':'+inttostr(i)+'('+inttostr(j)+')'));
557
          if i = 7 then Boss := false;
558
          dec(NumEnemys);
559
          breaked := true;
560
          break;
561
        end;
562
      end;
563
      if breaked then break;
564
    end;
565
  end;
566
  LevChanged := true;
567
  AnzeigeAct;
568
end;
569
 
570
procedure TMainForm.EnemyClick(Sender: TObject);
571
begin
572
  if sender = Enemy1 then ArtChecked := 1;
573
  if sender = Enemy2 then ArtChecked := 2;
574
  if sender = Enemy3 then ArtChecked := 3;
575
  if sender = Enemy4 then ArtChecked := 4;
576
  if sender = Enemy5 then ArtChecked := 5;
577
  if sender = Enemy6 then ArtChecked := 6;
578
  if sender = Enemy7 then ArtChecked := 7;
579
  Image1.Left := -(87 * (ArtChecked - 1)) + 1;
580
  Lives.Enabled := sender <> Enemy4;
581
  LivesLabel.Enabled := sender <> Enemy4;
582
  if sender = Enemy4 then LivesEdt.Font.Color := clBtnShadow // andere farbe?
583
    else LivesEdt.Font.Color := clWindowText;
584
end;
585
 
586
procedure TMainForm.EnemyCreate(x, y: integer);
587
var
588
  Enemy: TSprite;
589
begin
590
  Enemy := TEnemy.Create(SpriteEngine.Engine);
591
  Enemy.x := x;
592
  Enemy.y := y;
593
end;
594
 
595
procedure TMainForm.DestroyLevel;
596
begin
8 daniel-mar 597
  ScrollBar.Position := 0; // this doesn't call ScrollBarScroll()
598
  ScrollP := 0;
1 daniel-mar 599
  Enemys.Clear;
600
  NumEnemys := 0;
601
  Boss := false;
602
  LevChanged := true;
603
  Lives.Position := 1;
604
  LivesChange(Lives.Position);
605
  Enemy1.Checked := true;
606
  EnemyClick(Enemy1);
607
  AnzeigeAct;
608
end;
609
 
610
procedure TMainForm.AnzeigeAct;
611
begin
612
  SLabel1b.Caption := inttostr(NumEnemys);
613
  if Boss then SLabel2b.Caption := 'Ja' else SLabel2b.Caption := 'Nein';
614
  SLabel3b.Caption := inttostr(ScrollBar.Max);
615
  if LevChanged then
616
  begin
617
    SLabel4a.Font.Color := $00000096;
618
    SLabel4b.Font.Color := $00000096;
619
    SLabel4b.Caption := 'Nein';
620
  end
621
  else
622
  begin
623
    SLabel4a.Font.Color := $00009600;
624
    SLabel4b.Font.Color := $00009600;
625
    SLabel4b.Caption := 'Ja';
626
  end;
627
end;
628
 
629
procedure TMainForm.EnemyAdd(x, y, art, lives: integer);
630
begin
631
  Enemys.Add(inttostr(x)+'-'+inttostr(y)+':'+inttostr(art)+'('+inttostr(lives)+')');
632
end;
633
 
634
procedure TMainForm.NeuClick(Sender: TObject);
635
begin
636
  if MessageDlg('Level wirklich löschen?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
637
    DestroyLevel;
638
end;
639
 
640
procedure TMainForm.DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X,
641
  Y: Integer);
642
var
643
  ex, ey, i, j, k, l, wert: integer;
644
  breaked: boolean;
645
begin
646
  if sender <> DxDraw then
647
  begin
648
    StatusBar.SimpleText := status_info;
649
    exit;
650
  end;
651
  ex := trunc(x/RasterW) * RasterW;
652
  ey := trunc(y/RasterH) * RasterH;
653
  wert := -1;
654
  breaked := false;
655
  for i := 1 to 7 do
656
  begin
657
    for j := 0 to 999 do
658
    begin
659
      if boss and (i = 7) then
660
      begin
661
        for k := 0 to 3 do
662
        begin
663
          for l := 0 to 1 do
664
          begin
665
            if Enemys.IndexOf(floattostr(ex + ((ScrollP - k) * RasterW))+'-'+floattostr(ey - (RasterH * l))+':'+inttostr(i)+'('+inttostr(j)+')') <> -1 then
666
            begin
667
              wert := j;
668
              breaked := true;
669
              break;
670
            end;
671
          end;
672
          if breaked then break;
673
        end;
674
      end;
675
      if (breaked = false) and (Enemys.IndexOf(floattostr(ex + (ScrollP * RasterW))+'-'+floattostr(ey)+':'+
676
        inttostr(i)+'('+inttostr(j)+')') <> -1) then
677
      begin
678
        wert := j;
679
        breaked := true;
680
        break;
681
      end;
682
    end;
683
    if breaked then break;
684
  end;
685
  if wert <> -1 then
686
  begin
687
    if wert > 0 then
688
      StatusBar.SimpleText := status_lives + inttostr(wert)
689
    else
690
      StatusBar.SimpleText := status_nolives;
691
  end
692
  else
693
    StatusBar.SimpleText := status_info;
694
end;
695
 
696
procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
697
begin
698
  if LevChanged then
699
    CanClose := MessageDlg('Beenden ohne abspeichern?', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
700
end;
701
 
702
procedure TMainForm.Quelltext1Click(Sender: TObject);
703
begin
704
  SourceForm.Aktualisieren;
705
  SourceForm.showmodal;
706
end;
707
 
708
procedure TMainForm.Spielfelderweitern1Click(Sender: TObject);
709
begin
710
  LevelForm.Aktualisieren;
711
  LevelForm.showmodal;
712
end;
713
 
714
procedure TMainForm.ScrollBarScroll(Sender: TObject;
715
  ScrollCode: TScrollCode; var ScrollPos: Integer);
716
begin
717
  ScrollP := ScrollPos;
718
end;
719
 
720
procedure TMainForm.LivesChange(newval: integer);
721
begin
722
  LiveEdit := newval;
723
  livesedt.Text := inttostr(LiveEdit);
724
  lives.Position := newval;
725
end;
726
 
727
procedure TMainForm.LivesClick(Sender: TObject; Button: TUDBtnType);
728
begin
729
  LivesChange(lives.Position);
730
end;
731
 
732
procedure TMainForm.LivesEdtKeyPress(Sender: TObject; var Key: Char);
733
begin
15 daniel-mar 734
  {$IFDEF UNICODE}
735
  if not CharInSet(Key, [#13, #08, '0'..'9']) then
736
  {$ELSE}
1 daniel-mar 737
  if not (Key in [#13, #08, '0'..'9']) then
15 daniel-mar 738
  {$ENDIF}
1 daniel-mar 739
    Key := #0;
740
end;
741
 
742
procedure TMainForm.LivesEdtChange(Sender: TObject);
743
begin
744
  LivesChange(strtoint(livesedt.text));
745
end;
746
 
747
end.
748