Subversion Repositories spacemission

Rev

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