Subversion Repositories spacemission

Rev

Rev 3 | Rev 6 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 daniel-mar 1
unit GamMain;
2
 
3
interface
4
 
5
uses
6
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem, Dialogs,
7
  StdCtrls, ExtCtrls, Menus, DIB, DXClass, DXSprite, DXDraws, DXInput,
4 daniel-mar 8
  DXSounds, INIFiles, ShellAPI, wininet, Winapi.DirectDraw, System.UITypes;
3 daniel-mar 9
 
10
type
11
  TGameScene = (
12
    gsNone,
13
    gsTitle,
14
    gsMain,
15
    gsGameOver,
16
    gsNewLevel,
17
    gsWin
18
  );
19
 
20
  TGameInterval = (
21
    giMittel,
22
    giLeicht,
23
    giSchwer,
24
    giMaster
25
  );
26
 
27
  TMusicTrack = (
28
    mtNone,
29
    mtGame,
30
    mtBoss,
31
    mtScene,
32
    mtTitle
33
  );
34
 
35
  {TSoundFile = (
36
    sfNone,
37
    sfSceneMov,
38
    sfExplosion,
39
    sfHit,
40
    sfShoot,
41
    sfDanger,
42
    sfEnde,
43
    sfFrage,
44
    sfLevIntro
45
  );}
46
 
47
  TBackground = class(TBackgroundSprite)
48
  private
49
    FSpeed: Double;
50
  protected
51
    procedure DoMove(MoveCount: Integer); override;
52
  end;
53
 
54
  TBackgroundSpecial = class(TBackgroundSprite)
55
  private
56
    FSpeed: Double;
57
  protected
58
    procedure DoMove(MoveCount: Integer); override;
59
  end;
60
 
61
  TExplosion = class(TImageSprite)
62
  private
63
    FCounter: Integer;
64
  protected
65
    procedure DoMove(MoveCount: Integer); override;
66
  public
67
    constructor Create(AParent: TSprite); override;
68
  end;
69
 
70
  TPlayerSprite = class(TImageSprite)
71
  private
72
    FCounter: Integer;
73
    FMode: Integer;
74
    FTamaCount: Integer;
75
    FOldTamaTime: Integer;
76
  protected
77
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
78
    procedure DoMove(MoveCount: Integer); override;
79
  public
80
    constructor Create(AParent: TSprite); override;
81
    procedure FlyAway;
82
  end;
83
 
84
  TTamaSprite = class(TImageSprite)
85
  private
86
    FPlayerSprite: TPlayerSprite;
87
  protected
88
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
89
    procedure DoMove(MoveCount: Integer); override;
90
  public
91
    constructor Create(AParent: TSprite); override;
92
    destructor Destroy; override;
93
  end;
94
 
95
  TEnemy = class(TImageSprite)
96
  private
97
    FCounter: Integer;
98
    FLife: integer;
99
    FMode: Integer;
100
    procedure Hit; virtual;
101
  protected
102
    procedure HitEnemy(ADead: Boolean); virtual;
103
  public
104
    constructor Create(AParent: TSprite); override;
105
    destructor Destroy; override;
106
  end;
107
 
108
  TEnemyTama = class(TImageSprite)
109
  private
110
    FPlayerSprite: TSprite;
111
  protected
112
    procedure DoMove(MoveCount: Integer); override;
113
  public
114
    constructor Create(AParent: TSprite); override;
115
  end;
116
 
117
  TEnemyMeteor = class(TEnemy)
118
  protected
119
    procedure DoMove(MoveCount: Integer); override;
120
    procedure HitEnemy(ADead: Boolean); override;
121
  public
122
    constructor Create(AParent: TSprite); override;
123
  end;
124
 
125
  TEnemyUFO = class(TEnemy)
126
  protected
127
    procedure DoMove(MoveCount: Integer); override;
128
    procedure HitEnemy(ADead: Boolean); override;
129
  public
130
    constructor Create(AParent: TSprite); override;
131
  end;
132
 
133
  TEnemyUFO2 = class(TEnemy)
134
  private
135
    FCounter: Integer;
136
    FTamaCount: Integer;
137
    FOldTamaTime: Integer;
138
  protected
139
    procedure DoMove(MoveCount: Integer); override;
140
    procedure HitEnemy(ADead: Boolean); override;
141
  public
142
    constructor Create(AParent: TSprite); override;
143
  end;
144
 
145
  TEnemyAttacker = class(TEnemy)
146
  protected
147
    procedure DoMove(MoveCount: Integer); override;
148
    procedure HitEnemy(ADead: Boolean); override;
149
  public
150
    constructor Create(AParent: TSprite); override;
151
  end;
152
 
153
  TEnemyAttacker2 = class(TEnemy)
154
  private
155
    FCounter: Integer;
156
    FTamaF: Integer;
157
    FTamaT: Integer;
158
    FPutTama: Boolean;
159
  protected
160
    procedure DoMove(MoveCount: Integer); override;
161
    procedure HitEnemy(ADead: Boolean); override;
162
  public
163
    constructor Create(AParent: TSprite); override;
164
  end;
165
 
166
  TEnemyAttacker3 = class(TEnemy)
167
  private
168
    FCounter: Integer;
169
    FTamaCount: Integer;
170
    FOldTamaTime: Integer;
171
  protected
172
    procedure DoMove(MoveCount: Integer); override;
173
    procedure HitEnemy(ADead: Boolean); override;
174
  public
175
    constructor Create(AParent: TSprite); override;
176
  end;
177
 
178
  TEnemyBoss = class(TEnemy)
179
  private
180
    FCounter: Integer;
181
    FTamaF: Integer;
182
    FTamaT: Integer;
183
    FPutTama: Boolean;
184
    waiter1, waiter2: integer;
185
  protected
186
    procedure DoMove(MoveCount: Integer); override;
187
    procedure HitEnemy(ADead: Boolean); override;
188
  public
189
    constructor Create(AParent: TSprite); override;
190
  end;
191
 
192
  TNothing = class(TImageSprite);
193
 
194
  TSpriteClass = class of TSprite;
195
 
196
  TEnemyAdvent = record
197
    spriteClass: TSpriteClass;
198
    x: extended;
199
    y: extended;
200
    lifes: integer;
201
  end;
202
 
203
  TMainForm = class(TDXForm)
204
    MainMenu: TMainMenu;
205
    Spiel: TMenuItem;
206
    GameStart: TMenuItem;
207
    GamePause: TMenuItem;
208
    Beenden: TMenuItem;
209
    Einstellungen: TMenuItem;
210
    OptionFullScreen: TMenuItem;
211
    OptionMusic: TMenuItem;
212
    Leer2: TMenuItem;
213
    Leer4: TMenuItem;
214
    Hilfe: TMenuItem;
215
    OptionSound: TMenuItem;
216
    Leer3: TMenuItem;
217
    Spielstand: TMenuItem;
218
    Leer5: TMenuItem;
219
    Neustart: TMenuItem;
220
    OptionBreitbild: TMenuItem;
221
    Spielgeschwindigkeit: TMenuItem;
222
    Leicht: TMenuItem;
223
    Mittel: TMenuItem;
224
    Schwer: TMenuItem;
225
    Informationen: TMenuItem;
226
    Leer6: TMenuItem;
227
    Leer1: TMenuItem;
228
    Cheat: TMenuItem;
229
    CheckUpdates: TMenuItem;
230
    Master: TMenuItem;
231
    procedure DXDrawFinalize(Sender: TObject);
232
    procedure DXDrawInitialize(Sender: TObject);
233
    procedure FormCreate(Sender: TObject);
234
    procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
235
    procedure DXTimerActivate(Sender: TObject);
236
    procedure DXTimerDeactivate(Sender: TObject);
237
    procedure OptionFullScreenClick(Sender: TObject);
238
    procedure DXDrawInitializing(Sender: TObject);
239
    procedure GameStartClick(Sender: TObject);
240
    procedure GamePauseClick(Sender: TObject);
241
    procedure BeendenClick(Sender: TObject);
242
    procedure OptionSoundClick(Sender: TObject);
243
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
244
    procedure OptionMusicClick(Sender: TObject);
245
    procedure SpielstandClick(Sender: TObject);
246
    procedure NeustartClick(Sender: TObject);
247
    procedure OptionBreitbildClick(Sender: TObject);
248
    procedure LeichtClick(Sender: TObject);
249
    procedure MittelClick(Sender: TObject);
250
    procedure SchwerClick(Sender: TObject);
251
    procedure FormShow(Sender: TObject);
252
    procedure InformationenClick(Sender: TObject);
253
    procedure CheatClick(Sender: TObject);
254
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
255
    procedure FormDestroy(Sender: TObject);
256
    procedure CheckUpdatesClick(Sender: TObject);
257
    procedure MasterClick(Sender: TObject);
258
  private
259
    ProgrammGestartet: boolean;
260
    FInterval: TGameInterval;
261
    FScene: TGameScene;
262
    FMusic: TMusicTrack;
263
    FBlink: DWORD;
264
    FBlinkTime: DWORD;
265
    FFrame, FAngle, FCounter, FEnemyAdventPos: Integer;
266
    PlayerSprite: TPlayerSprite;
267
    procedure StartScene(Scene: TGameScene);
268
    procedure EndScene;
269
    procedure BlinkStart;
270
    procedure BlinkUpdate;
271
    procedure StartSceneTitle;
272
    procedure SceneTitle;
273
    procedure EndSceneTitle;
274
    procedure StartSceneMain;
275
    procedure SceneMain;
276
    procedure EndSceneMain;
277
    procedure StartSceneGameOver;
278
    procedure SceneGameOver;
279
    procedure EndSceneGameOver;
280
    procedure StartSceneWin;
281
    procedure SceneWin;
282
    procedure EndSceneWin;
283
    procedure StartSceneNewLevel;
284
    procedure SceneNewLevel;
285
    procedure EndSceneNewLevel;
286
  public
287
    FNextScene: TGameScene;
288
    FScore: Integer;
289
    FNotSave: boolean;
290
    FLife: integer;
291
    FLevel: integer;
292
    FMenuItem: integer;
293
    FBossLife: integer;
294
    FRestEnemys: integer;
295
    FCheat: boolean;
296
    { VCL-Ersatz }
297
    dxdraw: TDxDraw;
298
    imagelist: TDxImageList;
299
    spriteengine: tdxspriteengine;
300
    dxsound: tdxsound;
301
    wavelist: tdxwavelist;
302
    dxinput: tdxinput;
303
    dxtimer: tdxtimer;
304
    { Level-Routinen }
305
    procedure NewLevel(lev: integer);
306
    procedure DeleteArray;
307
    { MCI-Routinen }
308
    function StatusMusic(Name: TMusicTrack): string;
309
    procedure PlayMusic(Name: TMusicTrack);
310
    //procedure StopMusic(Name: TMusicTrack);
311
    procedure PauseMusic(Name: TMusicTrack);
312
    procedure ResumeMusic(Name: TMusicTrack);
313
    procedure DestroyMusic(Name: TMusicTrack);
314
    procedure OpenMusic(Name: TMusicTrack);
315
    { Sound-Routinen }
316
    function SoundKarte: boolean;
317
    procedure PlaySound(Name: string; Wait: Boolean);
318
    { Initialisiations-Routinen }
319
    procedure DXInit;
320
    procedure SoundInit;
321
    procedure MusicInit;
322
    { Einstellungs-Routinen }
323
    procedure LoadOptions;
324
    procedure WriteOptions;
325
    { Farb-Routinen }
326
    function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
327
    procedure PalleteAnim(Col: TRGBQuad; Time: Integer);
328
  end;
329
 
330
var
331
  MainForm: TMainForm;
332
 
333
const
4 daniel-mar 334
  // TODO: ini file
3 daniel-mar 335
  conleicht = 650 div 60; // 10
336
  conmittel = 1000 div 60; // 16
337
  conschwer = 1350 div 60; // 22
338
  conmaster = 2000 div 60; // 33
339
  lives = 6;
340
 
341
implementation
342
 
343
uses
4 daniel-mar 344
  GamSplash, GamSpeicherung, ComInfo, GamCheat, Global;
3 daniel-mar 345
 
346
resourcestring
347
  FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
348
 
349
{$R *.DFM}
350
 
351
var // TODO: irgendwo hinpacken. irgendwo!!!
352
  EnemyAdventTable: array[0..9999] of TEnemyAdvent; // TODO: dyn
353
  Crash2, ec: integer;
354
  BossExists, Crash, crashsound: boolean;
355
  pos: array[1..4] of integer;
356
  enemys: array[1..27] of TSpriteClass;
357
  levact: integer;
358
 
359
const
360
  DXInputButton = [isButton1, isButton2, isButton3,
361
    isButton4, isButton5, isButton6, isButton7, isButton8, isButton9, isButton10, isButton11,
362
    isButton12, isButton13, isButton14, isButton15, isButton16, isButton17, isButton18,
363
    isButton19, isButton20, isButton21, isButton22, isButton23, isButton24, isButton25,
364
    isButton26, isButton27, isButton28, isButton29, isButton30, isButton31, isButton32];
365
 
366
const // TODO: Auch für Enemies
367
  PLAYER_MODE_NORMAL = 0;
368
  PLAYER_MODE_DEAD = 1;
369
  PLAYER_MODE_DEAD_VANISHED = 2;
370
  PLAYER_MODE_FLYAWAY = 3;
371
  PLAYER_MODE_ENTER = 4;
372
 
4 daniel-mar 373
  DEFAULT_ANIMSPEED = 15/1000;
374
 
3 daniel-mar 375
// TODO: Code komplett überarbeiten. Bessere Ableitungen machen
376
 
377
constructor TPlayerSprite.Create(AParent: TSprite);
378
begin
379
  inherited Create(AParent);
380
  Image := MainForm.ImageList.Items.Find('Machine');
381
  Width := Image.Width;
382
  Height := Image.Height;
383
  X := -70{20};
384
  Y := mainform.dxdraw.surfaceHeight / 2 - (height / 2);
385
  Z := 2;
386
  AnimCount := Image.PatternCount;
387
  AnimLooped := True;
4 daniel-mar 388
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 389
  FMode := PLAYER_MODE_ENTER;
390
end;
391
 
392
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
393
begin
394
  if mainform.FCheat then exit;
395
  if (Sprite is TEnemy) or (Sprite is TEnemyTama) then
396
  begin
397
    if not crash then
398
    begin
399
      dec(MainForm.FLife);
400
      Crash := true;
401
      if MainForm.Flife=0 then
402
      begin
403
        MainForm.PlaySound('Explosion', false);
404
        Collisioned := false;
405
        FCounter := 0;
406
        FMode := PLAYER_MODE_DEAD;
407
        Done := false;
408
        Image := MainForm.ImageList.Items.Find('Explosion');
409
        Width := Image.Width;
410
        Height := Image.Height;
411
        AnimCount := Image.PatternCount;
412
        AnimLooped := False;
4 daniel-mar 413
        AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 414
        AnimPos := 0;
415
      end;
416
    end
417
    else
418
    begin
419
      if not crashsound then
420
      begin
421
        MainForm.PlaySound('Hit', False);
422
        crashsound := true;
423
      end;
424
    end;
425
  end;
426
end;
427
 
428
procedure TPlayerSprite.DoMove(MoveCount: Integer);
429
const
430
  WegduesKonstante = 1.75;
431
begin
432
  inherited DoMove(MoveCount);
433
  if FMode=PLAYER_MODE_NORMAL then
434
  begin
435
    if isUp in MainForm.DXInput.States then Y := Y - (250/1000)*MoveCount;
436
    if isDown in MainForm.DXInput.States then Y := Y + (250/1000)*MoveCount;
437
    if isLeft in MainForm.DXInput.States then X := X - (250/1000)*MoveCount;
438
    if isRight in MainForm.DXInput.States then X := X + (250/1000)*MoveCount;
439
    if X<0 then X := 0;
440
    if X>mainform.dxdraw.surfacewidth-Width then X := mainform.dxdraw.surfacewidth-Width;
441
    if Y<0 then Y := 0;
442
    if Y>mainform.dxdraw.surfaceheight-Height then Y := mainform.dxdraw.surfaceheight-Height;
443
    if isButton1 in MainForm.DXInput.States then
444
    begin
445
      if (FTamaCount<8) and (FCounter-FOldTamaTime>=100) then
446
      begin
447
        Inc(FTamaCount);
448
        with TTamaSprite.Create(Engine) do
449
        begin
450
          FPlayerSprite := Self;
451
          X := Self.X+Self.Width;
452
          Y := Self.Y+Self.Height div 2-Height div 2;
453
          Z := 10;
454
        end;
455
        FOldTamaTime := FCounter;
456
      end;
457
    end;
458
    Collision;
459
  end else if FMode=PLAYER_MODE_DEAD then
460
  begin
461
    if FCounter>200 then
462
    begin
463
      FCounter := 0;
464
      FMode := PLAYER_MODE_DEAD_VANISHED;
465
      Visible := false;
466
    end;
467
  end else if FMode=PLAYER_MODE_DEAD_VANISHED then
468
  begin
469
    if FCounter>1500 then
470
    begin
471
      MainForm.FNextScene := gsGameOver;
472
      MainForm.PlaySound('SceneMov', false);
473
      MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
474
      Sleep(200);
475
    end;
476
  end else if FMode=PLAYER_MODE_FLYAWAY then
477
  begin
478
    // FUT: "Wusch" sound?
479
    X := X + MoveCount*(300/1000) * (X/MainForm.DXDraw.Width + WegduesKonstante);
480
    if X > MainForm.DXDraw.Width+Width then
481
    begin
482
      Dead;
483
      inc(mainform.FLevel);
484
      MainForm.FNextScene := gsNewLevel;
485
      MainForm.PlaySound('SceneMov', false);
486
      MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
487
    end;
488
  end else if FMode = PLAYER_MODE_ENTER then
489
  begin
490
    X := X + MoveCount*(300/1000);
491
    if X > 19 then FMode := PLAYER_MODE_NORMAL;
492
  end;
493
  inc(FCounter, MoveCount);
494
end;
495
 
496
procedure TPlayerSprite.FlyAway;
497
begin
498
  FMode := PLAYER_MODE_FLYAWAY;
499
end;
500
 
501
procedure TMainForm.DXInit;
502
begin
503
  try
504
    Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg');
505
    ImageList.Items.MakeColorTable;
506
    DXDraw.ColorTable := ImageList.Items.ColorTable;
507
    DXDraw.DefColorTable := ImageList.Items.ColorTable;
508
    DXDraw.UpdatePalette;
509
    OptionBreitBild.enabled := OptionFullScreen.checked;
510
    DXDraw.Finalize;
511
    if OptionFullScreen.Checked then
512
    begin
513
      if not (doFullScreen in DXDraw.Options) then StoreWindow;
514
      DXDraw.Options := DXDraw.Options + [doFullScreen];
515
    end else
516
    begin
517
      if doFullScreen in DXDraw.Options then RestoreWindow;
518
      DXDraw.Options := DXDraw.Options - [doFullScreen];
519
    end;
520
    if not OptionBreitBild.checked then
521
    begin
522
      dxdraw.autosize := false;
523
      dxdraw.Top := 0;
524
      dxdraw.Left := 0;
4 daniel-mar 525
      dxdraw.width := 640;    // TODO: besser die dimensionen des fensters
3 daniel-mar 526
      dxdraw.height := 480;
527
      dxdraw.surfacewidth := 640;
528
      dxdraw.surfaceheight := 480;
529
    end
530
    else dxdraw.autosize := true;
531
    DXDraw.Initialize;
532
  except
533
    //Imagelist.Items.clear;
534
    //application.terminate;
535
  end;
536
end;
537
 
538
constructor TTamaSprite.Create(AParent: TSprite);
539
begin
540
  inherited Create(AParent);
541
  Image := MainForm.ImageList.Items.Find('Bounce');
542
  Z := 2;
543
  Width := Image.Width;
544
  Height := Image.Height;
545
  AnimCount := Image.PatternCount;
546
  AnimLooped := True;
4 daniel-mar 547
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 548
  MainForm.PlaySound('Shoot', False);
549
end;
550
 
551
destructor TTamaSprite.Destroy;
552
begin
553
  inherited Destroy;
554
  Dec(FPlayerSprite.FTamaCount);
555
end;
556
 
557
procedure TTamaSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
558
begin
559
  if (Sprite is TEnemy) and (not (Sprite is TEnemyTama)) then
560
  begin
561
    TEnemy(Sprite).Hit;
562
    Dead;
563
  end;
564
  Done := False;
565
end;
566
 
567
procedure TTamaSprite.DoMove(MoveCount: Integer);
568
begin
569
  inherited DoMove(MoveCount);
570
  X := X+(800/1000)*MoveCount;
571
  if X>=mainform.dxdraw.surfacewidth then Dead;
572
  Collision;
573
end;
574
 
575
procedure TBackground.DoMove(MoveCount: Integer);
576
var
577
  ran: integer;
578
begin
579
  inherited DoMove(MoveCount);
580
  X := X - MoveCount*(60/1000)*FSpeed;
581
  randomize;
582
  ran := Random(1500);
583
  if ran = 150 then
584
  begin
585
    with TBackgroundSpecial.Create(mainform.SpriteEngine.Engine) do
586
    begin
587
      SetMapSize(1, 1);
588
      Image := mainform.ImageList.Items.Find('Background-Planet1');
589
      Width := Image.Width;
590
      Height := Image.Height;
591
 
592
      Y := random(mainform.dxdraw.height);
593
      X := mainform.dxdraw.width;
594
 
595
      ran := Random(2);
596
      if ran = 0 then
597
      begin
598
        Z := -20;
599
        FSpeed := 1.8;
600
      end
601
      else if ran = 1 then
602
      begin
603
        Z := -40;
604
        FSpeed := 0.8;
605
      end
606
      else if ran = 2 then
607
      begin
608
        Z := -60;
609
        FSpeed := 0.3;
610
      end;
611
    end;
612
  end
613
  else if ran = 500 then
614
  begin
615
    with TBackgroundSpecial.Create(mainform.SpriteEngine.Engine) do
616
    begin
617
      SetMapSize(1, 1);
618
      ran := Random(4);
619
      if ran = 0 then
620
        Image := mainform.ImageList.Items.Find('Background-Red')
621
      else if ran = 1 then
622
        Image := mainform.ImageList.Items.Find('Background-Blue')
623
      else if ran = 2 then
624
        Image := mainform.ImageList.Items.Find('Background-Yellow')
625
      else if ran = 3 then
626
        Image := mainform.ImageList.Items.Find('Hintergrund-Rot');
627
      Width := Image.Width;
628
      Height := Image.Height;
629
 
630
      Y := random(mainform.dxdraw.height);
631
      X := mainform.dxdraw.width;
632
 
633
      { ran := Random(2);
634
      if ran = 0 then
635
      begin
636
        Z := -20;
637
        FSpeed := 1.8;
638
      end
639
      else if ran = 1 then
640
      begin
641
        Z := -40;
642
        FSpeed := 0.8;
643
      end
644
      else if ran = 2 then
645
      begin }
646
        Z := -60;
647
        FSpeed := 0.3;
648
      { end; }
649
    end;
650
  end;
651
end;
652
 
653
procedure TBackgroundSpecial.DoMove(MoveCount: Integer);
654
begin
655
  inherited DoMove(MoveCount);
656
  X := X - MoveCount*(60/1000)*FSpeed;
657
  if X<-Width then Dead;
658
end;
659
 
660
constructor TExplosion.Create(AParent: TSprite);
661
begin
662
  inherited Create(AParent);
663
  mainform.PlaySound('Explosion', false);
664
  Image := MainForm.ImageList.Items.Find('Explosion');
665
  Width := Image.Width;
666
  Height := Image.Height;
667
  AnimCount := Image.PatternCount;
668
  AnimLooped := True;
4 daniel-mar 669
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 670
  AnimPos := Random(AnimCount);
671
end;
672
 
673
procedure TExplosion.DoMove(MoveCount: Integer);
674
begin
675
  inherited DoMove(MoveCount);
676
  inc(FCounter, MoveCount);
677
  if FCounter > 2999 then dead;
678
end;
679
 
680
constructor TEnemyTama.Create(AParent: TSprite);
681
begin
682
  inherited Create(AParent);
683
  Image := MainForm.ImageList.Items.Find('Bounce2');
684
  Width := Image.Width;
685
  Height := Image.Height;
686
  AnimCount := Image.PatternCount;
687
  AnimLooped := True;
4 daniel-mar 688
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 689
  MainForm.PlaySound('Shoot', False);
690
end;
691
 
692
procedure TEnemyTama.DoMove(MoveCount: Integer);
693
begin
694
  inherited DoMove(MoveCount);
695
  X := X - MoveCount*(600/1000);
696
  if X<-Width then Dead;
697
end;
698
 
699
procedure TEnemy.Hit;
700
begin
701
  Dec(FLife);
702
  if FLife<=0 then
703
  begin
704
    Collisioned := False;
705
    HitEnemy(True);
706
  end
707
  else
708
    HitEnemy(False);
709
end;
710
 
711
procedure TEnemy.HitEnemy(ADead: Boolean);
712
begin
713
  if ADead then MainForm.PlaySound('Explosion', False);
714
end;
715
 
716
constructor TEnemyUFO.Create(AParent: TSprite);
717
begin
718
  inherited Create(AParent);
719
  Image := MainForm.ImageList.Items.Find('Enemy-disk');
720
  Width := Image.Width;
721
  Height := Image.Height;
722
  AnimCount := Image.PatternCount;
723
  AnimLooped := True;
4 daniel-mar 724
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 725
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
726
end;
727
 
728
constructor TEnemy.Create(AParent: TSprite);
729
begin
730
  inherited Create(AParent);
731
  dec(mainform.FRestEnemys);
732
  inc(ec);
733
end;
734
 
735
destructor TEnemy.Destroy;
736
begin
737
  inherited Destroy;
738
  dec(ec);
739
end;
740
 
741
procedure TEnemyUFO.HitEnemy(ADead: Boolean);
742
begin
743
  if ADead then
744
  begin
745
    MainForm.PlaySound('Explosion', False);
746
    FMode := 2;
747
    FCounter := 0;
748
    Inc(MainForm.FScore, 1000);
749
    Image := MainForm.ImageList.Items.Find('Explosion');
750
    Width := Image.Width;
751
    Height := Image.Height;
752
    AnimCount := Image.PatternCount;
753
    AnimLooped := False;
4 daniel-mar 754
    AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 755
    AnimPos := 0;
756
  end else
757
  begin
758
    MainForm.PlaySound('Hit', False);
759
    Inc(MainForm.FScore, 100);
760
  end;
761
end;
762
 
763
procedure TEnemyUFO2.DoMove(MoveCount: Integer);
764
begin
765
  inherited DoMove(MoveCount);
766
  if FMode=0 then
767
  begin
768
    X := X - MoveCount*(300/1000);
769
    Y := Y + Cos256(FCounter div 15)*2;
770
    if X<-Width then Dead;
771
    if FCounter-FOldTamaTime>=100 then
772
    begin
773
      Inc(FTamaCount);
774
      with TEnemyTama.Create(Engine) do
775
      begin
776
        FPlayerSprite := Self;
777
        X := Self.X;
778
        Y := Self.Y+Self.Height div 2-Height div 2;
779
        Z := 10;
780
      end;
781
      FOldTamaTime := FCounter;
782
    end;
783
  end else if FMode=2 then
784
  begin
785
    X := X - MoveCount*(300/1000);
786
    if FCounter>200 then Dead;
787
  end;
788
  inc(FCounter, MoveCount);
789
end;
790
 
791
procedure TEnemyUFO2.HitEnemy(ADead: Boolean);
792
begin
793
  if ADead then
794
  begin
795
    MainForm.PlaySound('Explosion', False);
796
    FMode := 2;
797
    FCounter := 0;
798
    Inc(MainForm.FScore, 1000);
799
    Image := MainForm.ImageList.Items.Find('Explosion');
800
    Width := Image.Width;
801
    Height := Image.Height;
802
    AnimCount := Image.PatternCount;
803
    AnimLooped := False;
4 daniel-mar 804
    AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 805
    AnimPos := 0;
806
  end else
807
  begin
808
    MainForm.PlaySound('Hit', False);
809
    Inc(MainForm.FScore, 100);
810
  end;
811
end;
812
 
813
constructor TEnemyUFO2.Create(AParent: TSprite);
814
begin
815
  inherited Create(AParent);
816
  Image := MainForm.ImageList.Items.Find('Enemy-disk2');
817
  Width := Image.Width;
818
  Height := Image.Height;
819
  AnimCount := Image.PatternCount;
820
  AnimLooped := True;
4 daniel-mar 821
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 822
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
823
end;
824
 
825
procedure TEnemyUFO.DoMove(MoveCount: Integer);
826
begin
827
  inherited DoMove(MoveCount);
828
  if FMode=0 then
829
  begin
830
    X := X - MoveCount*(300/1000);
831
    Y := Y + Cos256(FCounter div 15)*2;
832
    if X<-Width then Dead;
833
  end else if FMode=2 then
834
  begin
835
    X := X - MoveCount*(300/1000);
836
    if FCounter>200 then Dead;
837
  end;
838
  inc(FCounter, MoveCount);
839
end;
840
 
841
constructor TEnemyAttacker.Create(AParent: TSprite);
842
begin
843
  inherited Create(AParent);
844
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
845
  Width := Image.Width;
846
  Height := Image.Height;
847
  AnimCount := Image.PatternCount;
848
  AnimLooped := True;
4 daniel-mar 849
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 850
  PixelCheck := True;
851
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
852
end;
853
 
854
procedure TEnemyAttacker.HitEnemy(ADead: Boolean);
855
begin
856
  if ADead then
857
  begin
858
    MainForm.PlaySound('Explosion', False);
859
    FMode := 2;
860
    FCounter := 0;
861
    Inc(MainForm.FScore, 1000);
862
    Image := MainForm.ImageList.Items.Find('Explosion');
863
    Width := Image.Width;
864
    Height := Image.Height;
865
    AnimCount := Image.PatternCount;
866
    AnimLooped := False;
4 daniel-mar 867
    AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 868
    AnimPos := 0;
869
  end else
870
  begin
871
    MainForm.PlaySound('Hit', False);
872
    Inc(MainForm.FScore, 100);
873
  end;
874
end;
875
 
876
procedure TEnemyAttacker.DoMove(MoveCount: Integer);
877
begin
878
  inherited DoMove(MoveCount);
879
  if FMode=0 then
880
  begin
881
    X := X - MoveCount*(300/1000)-FCounter div 128;
882
    if X < -Width then Dead;
883
  end else if FMode=2 then
884
  begin
885
    X := X - MoveCount*(300/1000);
886
    if FCounter>200 then Dead;
887
  end;
888
  inc(FCounter, MoveCount);
889
end;
890
 
891
constructor TEnemyBoss.Create(AParent: TSprite);
892
begin
893
  inherited Create(AParent);
894
  Image := MainForm.ImageList.Items.Find('Enemy-boss');
895
  Width := Image.Width;
896
  Height := Image.Height;
897
  BossExists := true;
898
  MainForm.PlayMusic(mtBoss);
899
  AnimCount := Image.PatternCount;
900
  AnimLooped := True;
4 daniel-mar 901
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 902
  PixelCheck := True;
903
  Collisioned := False;
904
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
905
  MainForm.FBossLife := FLife;
906
  waiter1 := 0;
907
  waiter2 := 0;
908
end;
909
 
910
procedure TEnemyBoss.HitEnemy(ADead: Boolean);
911
begin
912
  if ADead then
913
  begin
914
    MainForm.PlaySound('Explosion', False);
915
    FMode := 2;
916
    FCounter := 0;
917
    Inc(MainForm.FScore, 100000);
918
    BossExists := false;
919
    dec(MainForm.FBossLife);
920
  end else
921
  begin
922
    MainForm.PlaySound('Hit', False);
923
    Inc(MainForm.FScore, 100);
924
    dec(MainForm.FBossLife);
925
  end;
926
end;
927
 
928
procedure TEnemyBoss.DoMove(MoveCount: Integer);
929
begin
930
  inherited DoMove(MoveCount);
931
  if FMode=0 then
932
  begin
933
    if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/4)){450} then
934
      X := X - MoveCount*(300/1000)
935
    else
936
    begin
937
      Collisioned := True;
938
      FMode := 1;
939
      FPutTama := True;
940
    end;
941
    Y := Y + Cos256(FCounter div 15)*5;
942
  end else if FMode=1 then
943
  begin
944
    Y := Y + Cos256(FCounter div 15)*5;
945
    if FPutTama then
946
    begin
947
      if FTamaT>100 then
948
      begin
949
        with TEnemyTama.Create(Engine) do
950
        begin
951
          FPlayerSprite := Self;
952
          Z := 1;
953
          X := Self.X-Width;
954
          Y := Self.Y+Self.Height div 2-Height div 2;
955
        end;
956
        Inc(FTamaF);
957
        if FTamaF>Random(30) then FPutTama := False;
958
        FTamaT := 0;
959
      end;
960
      FTamaT := FTamaT + MoveCount;
961
    end else
962
    begin
963
      FTamaT := FTamaT + MoveCount;
964
      if FTamaT>2000+Random(500) then
965
      begin
966
        FPutTama := True;
967
        FTamaF := 0;
968
        FTamaT := 0;
969
      end;
970
    end;
971
  end else if FMode=2 then
972
  begin
973
    inc(waiter1);
974
    if waiter1 = 3 then
975
    begin
976
      waiter1 := 0;
977
      inc(waiter2);
978
      if waiter2 <= 20 then
979
      begin
980
        with TExplosion.Create(Engine) do
981
        begin
982
          Z := 10;
983
          X := Self.X+Random(Self.Width)-16;
984
          Y := Self.Y+Random(Self.Height)-16;
985
        end;
986
      end
987
      else
988
      begin
989
        Inc(MainForm.FScore, 1000);
990
        FMode := 3;
991
      end;
992
    end;
993
  end else if FMode=3 then
994
  begin
995
    if FCounter>4000 then dead;
996
  end;
997
  inc(FCounter, MoveCount);
998
end;
999
 
1000
constructor TEnemyAttacker2.Create(AParent: TSprite);
1001
begin
1002
  inherited Create(AParent);
1003
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
1004
  Width := Image.Width;
1005
  Height := Image.Height;
1006
  AnimCount := Image.PatternCount;
1007
  AnimLooped := True;
4 daniel-mar 1008
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 1009
  PixelCheck := True;
1010
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
1011
end;
1012
 
1013
procedure TEnemyAttacker2.HitEnemy(ADead: Boolean);
1014
begin
1015
  if ADead then
1016
  begin
1017
    MainForm.PlaySound('Explosion', False);
1018
    FMode := 2;
1019
    FCounter := 0;
1020
    Inc(MainForm.FScore, 5000);
1021
    Image := MainForm.ImageList.Items.Find('Explosion');
1022
    Width := Image.Width;
1023
    Height := Image.Height;
1024
    AnimCount := Image.PatternCount;
1025
    AnimLooped := False;
4 daniel-mar 1026
    AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 1027
    AnimPos := 0;
1028
  end else
1029
  begin
1030
    MainForm.PlaySound('Hit', False);
1031
    Inc(MainForm.FScore, 100);
1032
  end;
1033
end;
1034
 
1035
procedure TEnemyAttacker2.DoMove(MoveCount: Integer);
1036
begin
1037
  inherited DoMove(MoveCount);
1038
  if FMode=0 then
1039
  begin
1040
    if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/2)){450} then
1041
      X := X - MoveCount*(300/1000)
1042
    else
1043
    begin
1044
      Collisioned := True;
1045
      FMode := 1;
1046
      FPutTama := True;
1047
    end;
1048
    Y := Y + Cos256(FCounter div 15)*5;
1049
  end else if FMode=1 then
1050
  begin
1051
    Y := Y + Cos256(FCounter div 15)*5;
1052
    if FPutTama then
1053
    begin
1054
      if FTamaT>100 then
1055
      begin
1056
        with TEnemyTama.Create(Engine) do
1057
        begin
1058
          FPlayerSprite := Self;
1059
          Z := 1;
1060
          X := Self.X-Width;
1061
          Y := Self.Y+Self.Height div 2-Height div 2;
1062
        end;
1063
        Inc(FTamaF);
1064
        if FTamaF>Random(30) then FPutTama := False;
1065
        FTamaT := 0;
1066
      end;
1067
      FTamaT := FTamaT + MoveCount;
1068
    end else
1069
    begin
1070
      FTamaT := FTamaT + MoveCount;
1071
      if FTamaT>2000+Random(500) then
1072
      begin
1073
        FPutTama := True;
1074
        FTamaF := 0;
1075
        FTamaT := 0;
1076
      end;
1077
    end;
1078
  end else if FMode=2 then
1079
  begin
1080
    if FCounter>200 then Dead;
1081
  end;
1082
  inc(FCounter, MoveCount);
1083
end;
1084
 
1085
procedure TEnemyAttacker3.HitEnemy(ADead: Boolean);
1086
begin
1087
  if ADead then
1088
  begin
1089
    MainForm.PlaySound('Explosion', False);
1090
    FMode := 1;
1091
    FCounter := 0;
1092
    Inc(MainForm.FScore, 5000);
1093
    Image := MainForm.ImageList.Items.Find('Explosion');
1094
    Width := Image.Width;
1095
    Height := Image.Height;
1096
    AnimCount := Image.PatternCount;
1097
    AnimLooped := False;
4 daniel-mar 1098
    AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 1099
    AnimPos := 0;
1100
  end else
1101
  begin
1102
    MainForm.PlaySound('Hit', False);
1103
    Inc(MainForm.FScore, 100);
1104
  end;
1105
end;
1106
 
1107
procedure TEnemyAttacker3.DoMove(MoveCount: Integer);
1108
begin
1109
  inherited DoMove(MoveCount);
1110
  if FMode=0 then
1111
  begin
1112
    X := X - (250/1000)*MoveCount;
1113
    if X<-Width then Dead;
1114
    if FCounter-FOldTamaTime>=100 then
1115
    begin
1116
      Inc(FTamaCount);
1117
      with TEnemyTama.Create(Engine) do
1118
      begin
1119
        FPlayerSprite := Self;
1120
        X := Self.X;
1121
        Y := Self.Y+Self.Height div 2-Height div 2;
1122
        Z := 10;
1123
      end;
1124
      FOldTamaTime := FCounter;
1125
     end;
1126
  end else if FMode=1 then
1127
  begin
1128
    if FCounter>200 then Dead;
1129
  end;
1130
  inc(FCounter, MoveCount);
1131
end;
1132
 
1133
constructor TEnemyAttacker3.Create(AParent: TSprite);
1134
begin
1135
  inherited Create(AParent);
1136
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
1137
  Width := Image.Width;
1138
  Height := Image.Height;
1139
  AnimCount := Image.PatternCount;
1140
  AnimLooped := True;
4 daniel-mar 1141
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 1142
  PixelCheck := True;
1143
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
1144
end;
1145
 
1146
function TMainForm.SoundKarte: boolean;
1147
begin
1148
  result := WaveOutGetNumDevs > 0;
1149
end;
1150
 
1151
procedure TMainForm.FormCreate(Sender: TObject);
1152
var
1153
  Ergebnis: string;
1154
  daten: textfile;
1155
  ok: boolean;
1156
begin
1157
  { Beginne VCL-Ersatz }
1158
  dxtimer := tdxtimer.Create(self);
1159
  dxtimer.Interval := 33;
1160
  dxtimer.OnActivate := DXTimerActivate;
1161
  dxtimer.OnDeactivate := DXTimerDeactivate;
1162
  dxtimer.OnTimer := DXTimerTimer;
1163
  dxtimer.ActiveOnly := false;
1164
  dxtimer.Enabled := false;
1165
 
1166
  dxdraw := tdxdraw.Create(self);
1167
  dxdraw.Parent := self;
1168
  dxdraw.Align := alClient;
1169
  dxdraw.Left := 0;
1170
  dxdraw.Top := 0;
1171
  dxdraw.Width := 640;
1172
  dxdraw.Height := 480;
1173
  dxdraw.AutoInitialize := False;
1174
  dxdraw.AutoSize := False;
1175
  dxdraw.Color := clBlack;
1176
  dxdraw.Display.BitCount := 24;
1177
  dxdraw.Display.FixedBitCount := False;
1178
  dxdraw.Display.FixedRatio := False;
1179
  dxdraw.Display.FixedSize := False;
1180
  dxdraw.Display.Height := 600;
1181
  dxdraw.Display.Width := 800;
4 daniel-mar 1182
  dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, {doRetainedMode,} doHardware, doSelectDriver];
3 daniel-mar 1183
  dxdraw.TabOrder := 0;
1184
  dxdraw.Visible := true;
1185
  dxdraw.OnFinalize := DXDrawFinalize;
1186
  dxdraw.OnInitialize := DXDrawInitialize;
1187
  dxdraw.OnInitializing := DXDrawInitializing;
1188
 
1189
  dxsound := tdxsound.Create(self);
1190
  dxsound.AutoInitialize := false;
1191
 
1192
  dxinput := tdxinput.Create(self);
1193
  dxinput.Joystick.ForceFeedback := true;
1194
  dxinput.Keyboard.ForceFeedback := true;
1195
 
1196
  wavelist := tdxwavelist.Create(self);
1197
  wavelist.DXSound := dxsound;
1198
 
1199
  imagelist := tdximagelist.create(self);
1200
  imagelist.DXDraw := dxdraw;
1201
 
1202
  spriteengine := tdxspriteengine.create(self);
1203
  spriteengine.DXDraw := dxdraw;
1204
 
1205
  { Ende VCL-Ersatz }
1206
 
1207
  Application.Title := 'SpaceMission '+ProgramVersion;
1208
  LoadOptions;
1209
  DXInit;
1210
  SoundInit;
1211
  MusicInit;
1212
  DeleteArray;
1213
  if (paramcount = 0) and (fileexists(paramstr(1))) then // (paramcount > 0)
1214
  begin
1215
    AssignFile(daten, paramstr(1));
1216
    Reset(daten);
1217
    ok := true;
1218
    ReadLN(daten, Ergebnis);
1219
    if Ergebnis <> '; SpaceMission '+ProgramVersion then ok := false;
1220
    ReadLN(daten, Ergebnis);
1221
    if ergebnis <> '; SAV-File' then ok := false;
1222
    if not ok then
1223
    begin
1224
      showmessage(FileError);
1225
      CloseFile(daten);
1226
      GameStartClick(GameStart);
1227
      exit;
1228
    end;
1229
    ReadLN(daten, mainform.FScore);
1230
    ReadLN(daten, mainform.FLife);
1231
    ReadLN(daten, mainform.Flevel);
1232
    ReadLN(daten, mainform.FMenuItem);
1233
    CloseFile(daten);
1234
    mainform.FNextScene := gsNewLevel;
1235
    exit;
1236
  end;
1237
  GameStartClick(GameStart);
1238
end;
1239
 
1240
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
1241
  Shift: TShiftState);
1242
begin
1243
  if (ssAlt in Shift) and (Key=VK_RETURN) then
1244
    OptionFullScreenClick(OptionFullScreen);
1245
end;
1246
 
1247
procedure TMainForm.GameStartClick(Sender: TObject);
1248
begin
1249
  StartScene(gsTitle);
1250
end;
1251
 
1252
procedure TMainForm.GamePauseClick(Sender: TObject);
1253
begin
1254
  GamePause.Checked := not GamePause.Checked;
1255
  DXTimer.Enabled := not GamePause.Checked;
1256
  if GamePause.Checked then PauseMusic(FMusic) else
1257
    ResumeMusic(FMusic);
1258
end;
1259
 
1260
// http://www.delphipraxis.net/post43515.html
1261
Function GetHTML(AUrl: string): string;
1262
var
1263
  databuffer : array[0..4095] of char;
1264
  ResStr : string;
1265
  hSession, hfile: hInternet;
1266
  dwindex,dwcodelen,dwread,dwNumber: cardinal;
1267
  dwcode : array[1..20] of char;
1268
  res    : pchar;
1269
  Str    : pchar;
1270
begin
1271
  ResStr:='';
1272
  if system.pos('http://',lowercase(AUrl))=0 then
1273
     AUrl:='http://'+AUrl;
1274
 
1275
  // Hinzugefügt
1276
  application.ProcessMessages;
1277
 
1278
  hSession:=InternetOpen('InetURL:/1.0',
1279
                         INTERNET_OPEN_TYPE_PRECONFIG,
1280
                         nil,
1281
                         nil,
1282
                         0);
1283
  if assigned(hsession) then
1284
  begin
1285
    // Hinzugefügt
1286
    application.ProcessMessages;
1287
 
1288
    hfile:=InternetOpenUrl(
1289
           hsession,
1290
           pchar(AUrl),
1291
           nil,
1292
           0,
1293
           INTERNET_FLAG_RELOAD,
1294
           0);
1295
    dwIndex  := 0;
1296
    dwCodeLen := 10;
1297
 
1298
    // Hinzugefügt
1299
    application.ProcessMessages;
1300
 
1301
    HttpQueryInfo(hfile,
1302
                  HTTP_QUERY_STATUS_CODE,
1303
                  @dwcode,
1304
                  dwcodeLen,
1305
                  dwIndex);
1306
    res := pchar(@dwcode);
1307
    dwNumber := sizeof(databuffer)-1;
1308
    if (res ='200') or (res ='302') then
1309
    begin
1310
      while (InternetReadfile(hfile,
1311
                              @databuffer,
1312
                              dwNumber,
1313
                              DwRead)) do
1314
      begin
1315
 
1316
        // Hinzugefügt
1317
        application.ProcessMessages;
1318
 
1319
        if dwRead =0 then
1320
          break;
1321
        databuffer[dwread]:=#0;
1322
        Str := pchar(@databuffer);
1323
        resStr := resStr + Str;
1324
      end;
1325
    end
1326
    else
1327
      ResStr := 'Status:'+res;
1328
    if assigned(hfile) then
1329
      InternetCloseHandle(hfile);
1330
  end;
1331
 
1332
  // Hinzugefügt
1333
  application.ProcessMessages;
1334
 
1335
  InternetCloseHandle(hsession);
1336
  Result := resStr;
1337
end;
1338
 
1339
procedure TMainForm.CheckUpdatesClick(Sender: TObject);
1340
var
1341
  temp: string;
1342
begin
1343
  temp := GetHTML('http://www.viathinksoft.de/update/?id=spacemission');
1344
  if copy(temp, 0, 7) = 'Status:' then
1345
  begin
1346
    Application.MessageBox('Ein Fehler ist aufgetreten. Wahrscheinlich ist keine Internetverbindung aufgebaut, oder der der ViaThinkSoft-Server temporär offline.', 'Fehler', MB_OK + MB_ICONERROR)
1347
  end
1348
  else
1349
  begin
1350
    if GetHTML('http://www.viathinksoft.de/update/?id=spacemission') <> ProgramVersion then
1351
    begin
1352
      if Application.MessageBox('Eine neue Programmversion ist vorhanden. Möchten Sie diese jetzt herunterladen?', 'Information', MB_YESNO + MB_ICONASTERISK) = ID_YES then
1353
        shellexecute(application.handle, 'open', pchar('http://www.viathinksoft.de/update/?id=@spacemission'), '', '', sw_normal);
1354
    end
1355
    else
1356
    begin
1357
      Application.MessageBox('Es ist keine neue Programmversion vorhanden.', 'Information', MB_OK + MB_ICONASTERISK);
1358
    end;
1359
  end;
1360
end;
1361
 
1362
procedure TMainForm.BeendenClick(Sender: TObject);
1363
begin
1364
  close;
1365
end;
1366
 
1367
procedure TMainForm.OptionFullScreenClick(Sender: TObject);
1368
begin
1369
  OptionFullScreen.Checked := not OptionFullScreen.Checked;
1370
  DXInit;
1371
  writeoptions;
1372
end;
1373
 
1374
procedure TMainForm.OptionSoundClick(Sender: TObject);
1375
begin
1376
  OptionSound.Checked := not OptionSound.Checked;
1377
  SoundInit;
1378
  WriteOptions;
1379
end;
1380
 
1381
procedure TMainForm.SoundInit;
1382
begin
1383
  if OptionSound.Checked then
1384
  begin
1385
    if not DXSound.Initialized then
1386
    begin
1387
      try
1388
        DXSound.Initialize;
1389
        WaveList.Items.LoadFromFile(FDirectory+'DirectX\Sound.dxw');
1390
      except
1391
        OptionSound.enabled := False;
1392
        WaveList.items.clear;
1393
      end;
1394
    end;
1395
  end
1396
  else DXSound.Finalize;
1397
end;
1398
 
1399
procedure TMainForm.MusicInit;
1400
begin
1401
  optionmusic.enabled := SoundKarte;
1402
end;
1403
 
1404
procedure TMainForm.DestroyMusic(Name: TMusicTrack);
1405
begin
1406
  if Name = mtBoss then
1407
  begin
1408
    MCISendString(pchar('stop "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1409
    MCISendString(pchar('close "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1410
  end;
1411
  if Name = mtGame then
1412
  begin
1413
    MCISendString(pchar('stop "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1414
    MCISendString(pchar('close "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1415
  end;
1416
  if Name = mtScene then
1417
  begin
1418
    MCISendString(pchar('stop "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1419
    MCISendString(pchar('close "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1420
  end;
1421
  if Name = mtTitle then
1422
  begin
1423
    MCISendString(pchar('stop "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1424
    MCISendString(pchar('close "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1425
  end;
1426
end;
1427
 
1428
procedure TMainForm.OpenMusic(Name: TMusicTrack);
1429
begin
1430
  if Name = mtBoss then
1431
    MCISendString(pchar('open "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1432
  if Name = mtGame then
1433
    MCISendString(pchar('open "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1434
  if Name = mtScene then
1435
    MCISendString(pchar('open "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1436
  if Name = mtTitle then
1437
    MCISendString(pchar('open "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1438
end;
1439
 
1440
procedure TMainForm.PauseMusic(Name: TMusicTrack);
1441
begin
1442
  if not OptionMusic.checked then exit;
1443
  if Name = mtBoss then
1444
    MCISendString(pchar('stop "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1445
  if Name = mtGame then
1446
    MCISendString(pchar('stop "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1447
  if Name = mtScene then
1448
    MCISendString(pchar('stop "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1449
  if Name = mtTitle then
1450
    MCISendString(pchar('stop "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1451
end;
1452
 
1453
procedure TMainForm.DXDrawInitializing(Sender: TObject);
1454
begin
1455
  if doFullScreen in DXDraw.Options then
1456
  begin
1457
    BorderStyle := bsNone;
1458
    DXDraw.Cursor := crNone;
1459
  end else
1460
  begin
1461
    BorderStyle := bsSingle;
1462
    DXDraw.Cursor := crDefault;
1463
  end;
1464
end;
1465
 
1466
procedure TMainForm.DXDrawInitialize(Sender: TObject);
1467
begin
1468
  DXTimer.Enabled := True;
1469
end;
1470
 
1471
procedure TMainForm.DXDrawFinalize(Sender: TObject);
1472
begin
1473
  DXTimer.Enabled := False;
1474
end;
1475
 
1476
procedure TMainForm.DXTimerActivate(Sender: TObject);
1477
begin
1478
  Caption := Application.Title;
1479
  if not ProgrammGestartet then
1480
  begin
1481
    Programmgestartet := true;
1482
    exit;
1483
  end;
1484
  ResumeMusic(FMusic);
1485
end;
1486
 
1487
procedure TMainForm.DXTimerDeactivate(Sender: TObject);
1488
begin
1489
  Caption := Application.Title + ' [Pause]';
1490
  PauseMusic(FMusic);
1491
end;
1492
 
1493
function TMainForm.StatusMusic(Name: TMusicTrack): string;
1494
var
1495
  MCIStatus: array[0..255] of char;
1496
begin
1497
  if not OptionMusic.checked then exit;
1498
  if FMusic = mtGame then
1499
    MCISendString(pchar('status "'+FDirectory+'Musik\Game.mid" mode'), MCIStatus, 255, 0);
1500
  if FMusic = mtBoss then
1501
    MCISendString(pchar('status "'+FDirectory+'Musik\Boss.mid" mode'), MCIStatus, 255, 0);
1502
  if FMusic = mtScene then
1503
    MCISendString(pchar('status "'+FDirectory+'Musik\Scene.mid" mode'), MCIStatus, 255, 0);
1504
  if FMusic = mtTitle then
1505
    MCISendString(pchar('status "'+FDirectory+'Musik\Title.mid" mode'), MCIStatus, 255, 0);
1506
  result := MCIStatus;
1507
end;
1508
 
1509
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
1510
begin
1511
  if StatusMusic(FMusic) = 'stopped' then
1512
    PlayMusic(FMusic); {...}
1513
  if crash then
1514
  begin
1515
    inc(Crash2);
1516
    if crash2=30 then
1517
    begin
1518
      Crash2 := 0;
1519
      crash := false;
1520
      crashsound := false;
1521
    end;
1522
  end;
1523
  if not DXDraw.CanDraw then exit;
1524
  DXInput.Update;
1525
  case FScene of
1526
    gsTitle   : SceneTitle;
1527
    gsMain    : SceneMain;
1528
    gsGameOver: SceneGameOver;
1529
    gsWin     : SceneWin;
1530
    gsNewLevel: SceneNewLevel;
1531
  end;
1532
  if FNextScene<>gsNone then
1533
  begin
1534
    StartScene(FNextScene);
1535
    FNextScene := gsNone;
1536
  end;
1537
  DXDraw.Flip;
1538
end;
1539
 
1540
procedure TMainForm.BlinkStart;
1541
begin
1542
  FBlink := 0;
1543
  FBlinkTime := GetTickCount;
1544
end;
1545
 
1546
procedure TMainForm.WriteOptions;
1547
var
1548
  INIDatei: TIniFile;
1549
begin
1550
  INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
1551
  if OptionMusic.checked then INIDatei.WriteBool('Settings', 'Music', true)
1552
    else INIDatei.WriteBool('Settings', 'Music', false);
1553
  if OptionSound.checked then INIDatei.WriteBool('Settings', 'Sound', true)
1554
    else INIDatei.WriteBool('Settings', 'Sound', false);
1555
  if OptionFullScreen.checked then INIDatei.WriteBool('Settings', 'FullScreen', true)
1556
    else INIDatei.WriteBool('Settings', 'FullScreen', false);
1557
  if OptionBreitbild.checked then INIDatei.WriteBool('Settings', 'ScreenAutoSize', true)
1558
    else INIDatei.WriteBool('Settings', 'ScreenAutoSize', false);
1559
  if FInterval = giLeicht then INIDatei.WriteInteger('Settings', 'Speed', 1);
1560
  if FInterval = giMittel then INIDatei.WriteInteger('Settings', 'Speed', 2);
1561
  if FInterval = giSchwer then INIDatei.WriteInteger('Settings', 'Speed', 3);
1562
  if FInterval = giMaster then INIDatei.WriteInteger('Settings', 'Speed', 4);
1563
  INIDatei.Free;
1564
end;
1565
 
1566
procedure TMainForm.LoadOptions;
1567
var
1568
  INIDatei: TIniFile;
1569
begin
1570
  INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
1571
  optionmusic.checked := INIDatei.ReadBool('Settings', 'Music', true);
1572
  optionsound.checked := INIDatei.ReadBool('Settings', 'Sound', true);
1573
  optionfullscreen.checked := INIDatei.ReadBool('Settings', 'fullscreen', false);
1574
  OptionBreitBild.checked := INIDatei.ReadBool('Settings', 'ScreenAutoSize', true);
1575
  if INIDatei.ReadInteger('Settings', 'Speed', 2) = 1 then
1576
  begin
1577
    FInterval := giLeicht;
1578
    Leicht.checked := true;
1579
  end;
1580
  if INIDatei.ReadInteger('Settings', 'Speed', 2) = 2 then
1581
  begin
1582
    FInterval := giMittel;
1583
    Mittel.checked := true;
1584
  end;
1585
  if INIDatei.ReadInteger('Settings', 'Speed', 2) = 3 then
1586
  begin
1587
    FInterval := giSchwer;
1588
    Schwer.checked := true;
1589
  end;
1590
  if INIDatei.ReadInteger('Settings', 'Speed', 2) = 4 then
1591
  begin
1592
    FInterval := giMaster;
1593
    Master.checked := true;
1594
  end;
1595
  INIDatei.Free;
1596
  WriteOptions;
1597
end;
1598
 
1599
procedure TMainForm.BlinkUpdate;
1600
begin
1601
  if GetTickCount<>FBlinkTime then
1602
  begin
1603
    FBlink := FBlink + (GetTickCount-FBlinkTime);
1604
    FBlinkTime := GetTickCount;
1605
  end;
1606
end;
1607
 
1608
procedure TMainForm.PlaySound(Name: string; Wait: Boolean);
1609
begin
1610
  if (OptionSound.Checked) and (OptionSound.Enabled) then
1611
    WaveList.Items.Find(Name).Play(Wait);
1612
end;
1613
 
1614
procedure TMainForm.PlayMusic(Name: TMusicTrack);
1615
begin
1616
  if (not mainform.active) and (mainform.visible) then //1st Programmstart
1617
    exit;
1618
  if (OptionMusic.checked) and (OptionMusic.enabled) then
1619
  begin
1620
    DestroyMusic(FMusic);
1621
    OpenMusic(Name);
1622
    ResumeMusic(Name);
1623
  end;
1624
  FMusic := Name;
1625
end;
1626
 
1627
function TMainForm.ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
1628
begin
1629
  with Result do
1630
  begin
1631
    rgbRed := Src.rgbRed+((Dest.rgbRed-Src.rgbRed)*Percent div 256);
1632
    rgbGreen := Src.rgbGreen+((Dest.rgbGreen-Src.rgbGreen)*Percent div 256);
1633
    rgbBlue := Src.rgbBlue+((Dest.rgbBlue-Src.rgbBlue)*Percent div 256);
1634
    rgbReserved := 0;
1635
  end;
1636
end;
1637
 
1638
procedure TMainForm.PalleteAnim(Col: TRGBQuad; Time: Integer);
1639
var
1640
  i: Integer;
1641
  t, t2: DWORD;
1642
  ChangePalette: Boolean;
1643
  c: Integer;
1644
begin
1645
  if DXDraw.Initialized then
1646
  begin
1647
    c := DXDraw.Surface.ColorMatch(RGB(Col.rgbRed, Col.rgbGreen, Col.rgbBlue));
1648
    ChangePalette := False;
1649
    if DXDraw.CanPaletteAnimation then
1650
    begin
1651
      t := GetTickCount;
1652
      while Abs(GetTickCount-t)<Time do
1653
      begin
1654
        t2 := Trunc(Abs(GetTickCount-t)/Time*255);
1655
        for i := 0 to 255 do
1656
          DXDraw.ColorTable[i] := ComposeColor(Col, DXDraw.DefColorTable[i], t2);
1657
        DXDraw.UpdatePalette;
1658
        ChangePalette := True;
1659
      end;
1660
    end else
1661
      Sleep(Time);
1662
    for i := 0 to 4 do
1663
    begin
1664
      DXDraw.Surface.Fill(c);
1665
      DXDraw.Flip;
1666
    end;
1667
    if ChangePalette then
1668
    begin
1669
      DXDraw.ColorTable := DXDraw.DefColorTable;
1670
      DXDraw.UpdatePalette;
1671
    end;
1672
    DXDraw.Surface.Fill(c);
1673
    DXDraw.Flip;
1674
  end;
1675
end;
1676
 
1677
procedure TMainForm.StartScene(Scene: TGameScene);
1678
begin
1679
  EndScene;
1680
  DXInput.States := DXInput.States - DXInputButton;
1681
  FScene := Scene;
1682
  BlinkStart;
1683
  case FScene of
1684
    gsTitle   : StartSceneTitle;
1685
    gsMain    : StartSceneMain;
1686
    gsGameOver: StartSceneGameOver;
1687
    gsWin     : StartSceneWin;
1688
    gsNewLevel: StartSceneNewLevel;
1689
  end;
1690
end;
1691
 
1692
procedure TMainForm.StartSceneTitle;
1693
begin
1694
  sleep(500);
1695
  FCheat := false;
1696
  BossExists := false;
1697
  FLife := Lives;
1698
  FLevel := 0;
1699
  FScore := 0;
1700
  FNotSave := true;
1701
  Cheat.enabled := false;
1702
  Neustart.enabled := false;
1703
  GamePause.enabled := false;
1704
  GameStart.enabled := false;
1705
  Spielgeschwindigkeit.enabled := false;
1706
  mainform.Visible := true;
1707
  PlayMusic(mtTitle);
1708
end;
1709
 
1710
procedure TMainForm.StartSceneMain;
1711
{var
1712
  i, j: Integer;}
1713
begin
1714
  sleep(500);
1715
  FCounter := 0;
1716
  NewLevel(FLevel);
1717
  BossExists := false;
1718
  PlayMusic(mtGame);
1719
  FEnemyAdventPos := 1;
1720
  FFrame := -4;
1721
  PlayerSprite := TPlayerSprite.Create(SpriteEngine.Engine);
1722
  with TBackground.Create(SpriteEngine.Engine) do
1723
  begin
1724
    SetMapSize(1, 1);
1725
    Image := mainform.ImageList.Items.Find('Star3');
1726
    Z := -13;
1727
    Y := 40;
1728
    FSpeed := 1 / 2;
1729
    Tile := True;
1730
  end;
1731
  with TBackground.Create(SpriteEngine.Engine) do
1732
  begin
1733
    SetMapSize(1, 1);
1734
    Image := mainform.ImageList.Items.Find('Star2');
1735
    Z := -12;
1736
    Y := 30;
1737
    FSpeed := 1;
1738
    Tile := True;
1739
  end;
1740
  with TBackground.Create(SpriteEngine.Engine) do
1741
  begin
1742
    SetMapSize(1, 1);
1743
    Image := mainform.ImageList.Items.Find('Star1');
1744
    Z := -11;
1745
    Y := 10;
1746
    FSpeed := 2;
1747
    Tile := True;
1748
  end;
1749
  {with TBackground.Create(SpriteEngine.Engine) do
1750
  begin
1751
    SetMapSize(200, 10);
1752
    Y := 10;
1753
    Z := -13;
1754
    FSpeed := 1 / 2;
1755
    Tile := True;
1756
    for i := 0 to MapHeight-1 do
1757
    begin
1758
      for j := 0 to MapWidth-1 do
1759
      begin
1760
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 8);
1761
        if Random(100)<95 then Chips[j, i] := -1;
1762
      end;
1763
    end;
1764
  end;
1765
  with TBackground.Create(SpriteEngine.Engine) do
1766
  begin
1767
    SetMapSize(200, 10);
1768
    Y := 30;
1769
    Z := -12;
1770
    FSpeed := 1;
1771
    Tile := True;
1772
    for i := 0 to MapHeight-1 do
1773
    begin
1774
      for j := 0 to MapWidth-1 do
1775
      begin
1776
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 4);
1777
        if Random(100)<95 then Chips[j, i] := -1;
1778
      end;
1779
    end;
1780
  end;
1781
  with TBackground.Create(SpriteEngine.Engine) do
1782
  begin
1783
    SetMapSize(200, 10);
1784
    Y := 40;
1785
    Z := -11;
1786
    FSpeed := 2;
1787
    Tile := True;
1788
    for i := 0 to MapHeight-1 do
1789
    begin
1790
      for j := 0 to MapWidth-1 do
1791
      begin
1792
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 2);
1793
        if Random(100)<95 then Chips[j, i] := -1;
1794
      end;
1795
    end;
1796
  end;}
1797
  FNotSave := false;
1798
  Cheat.enabled := true;
1799
  Neustart.enabled := true;
1800
  GamePause.enabled := true;
1801
  GameStart.enabled := true;
1802
  Spielgeschwindigkeit.enabled := true;
1803
end;
1804
 
1805
procedure TMainForm.StartSceneGameOver;
1806
begin
1807
  sleep(500);
1808
  FNotSave := true;
1809
  Cheat.enabled := false;
1810
  Spielgeschwindigkeit.enabled := false;
1811
  Neustart.enabled := false;
1812
  GamePause.enabled := false;
1813
  PlayMusic(mtScene);
1814
  BossExists := false;
1815
end;
1816
 
1817
procedure TMainForm.StartSceneWin;
1818
begin
1819
  sleep(500);
1820
  FNotSave := true;
1821
  Cheat.enabled := false;
1822
  Spielgeschwindigkeit.enabled := false;
1823
  Neustart.enabled := false;
1824
  GamePause.enabled := false;
1825
  PlayMusic(mtScene);
1826
  BossExists := false;
1827
end;
1828
 
1829
procedure TMainForm.EndScene;
1830
begin
1831
  case FScene of
1832
    gsTitle   : EndSceneTitle;
1833
    gsMain    : EndSceneMain;
1834
    gsGameOver: EndSceneGameOver;
1835
    gsWin     : EndSceneWin;
1836
    gsNewLevel: EndSceneNewLevel;
1837
  end;
1838
end;
1839
 
1840
procedure TMainForm.EndSceneTitle;
1841
begin
1842
  {  Ende Title  }
1843
end;
1844
 
1845
procedure TMainForm.EndSceneMain;
1846
begin
1847
  SpriteEngine.Engine.Clear;
1848
end;
1849
 
1850
procedure TMainForm.EndSceneGameOver;
1851
begin
1852
  {  Ende GameOver  }
1853
end;
1854
 
1855
procedure TMainForm.EndSceneWin;
1856
begin
1857
  {  Ende Win  }
1858
end;
1859
 
1860
procedure TMainForm.DeleteArray();
1861
var
1862
  i: integer;
1863
begin
1864
  for i := Low(EnemyAdventTable) to High(EnemyAdventTable) do
1865
  begin
1866
    EnemyAdventTable[i].spriteClass := TNothing;
1867
    EnemyAdventTable[i].x := 0;
1868
    EnemyAdventTable[i].y := 0;
1869
    EnemyAdventTable[i].lifes := 0;
1870
  end;
1871
  FRestEnemys := 0;
1872
end;
1873
 
1874
procedure TMainForm.NewLevel(lev: integer);
1875
resourcestring
1876
  LNG_LEVEL_INVALID = 'Das Level Nr. %d ist ungültig!'+#13#10+'Das Programm wird beendet.';
1877
var
1878
  act: integer;
1879
  filex: textfile;
1880
  ergebniss: string;
1881
begin
1882
  DeleteArray;
1883
  if FMenuItem = 2 then
1884
  begin
1885
    enemys[1] := TEnemyAttacker;
1886
    enemys[2] := TEnemyMeteor;
1887
    enemys[3] := TEnemyUFO;
1888
    enemys[4] := TEnemyAttacker;
1889
    enemys[5] := TEnemyMeteor;
1890
    enemys[6] := TEnemyUFO;
1891
    enemys[7] := TEnemyAttacker;
1892
    enemys[8] := TEnemyMeteor;
1893
    enemys[9] := TEnemyUFO;
1894
    enemys[10] := TEnemyAttacker;
1895
    enemys[11] := TEnemyMeteor;
1896
    enemys[12] := TEnemyUFO;
1897
    enemys[13] := TEnemyAttacker;
1898
    enemys[14] := TEnemyMeteor;
1899
    enemys[15] := TEnemyUFO;
1900
    enemys[16] := TEnemyAttacker3;
1901
    enemys[17] := TEnemyAttacker;
1902
    enemys[18] := TEnemyMeteor;
1903
    enemys[19] := TEnemyUFO;
1904
    enemys[20] := TEnemyUFO2;
1905
    enemys[21] := TEnemyAttacker;
1906
    enemys[22] := TEnemyMeteor;
1907
    enemys[23] := TEnemyUFO;
1908
    enemys[24] := TEnemyAttacker2;
1909
    enemys[25] := TEnemyMeteor;
1910
    enemys[26] := TEnemyUFO;
1911
    enemys[27] := TEnemyAttacker;
1912
    randomize;
1913
    for act := 1 to lev*75-1 do
1914
    begin
1915
      inc(FRestEnemys);
1916
      EnemyAdventTable[act].spriteClass := enemys[random(lev+2)+1];
1917
      if EnemyAdventTable[act].spriteClass = TEnemyAttacker2 then EnemyAdventTable[act].spriteClass := enemys[random(lev+2)+1]; {O_o}
1918
      EnemyAdventTable[act].x := act*30 + random(85-(lev+(random(lev))*2)){O_o};
1919
      EnemyAdventTable[act].y := random(dxdraw.surfaceheight);
1920
      if (EnemyAdventTable[act].spriteClass <> TEnemyMeteor) and (EnemyAdventTable[act].spriteClass <> TEnemyAttacker2) then EnemyAdventTable[act].lifes := random(lev)+1;
1921
      if EnemyAdventTable[act].spriteClass = TEnemyAttacker2 then EnemyAdventTable[act].lifes := random(6)+1{O_o};
1922
    end;
1923
    EnemyAdventTable[lev*75].spriteClass := TEnemyBoss;
1924
    EnemyAdventTable[lev*75].x := lev*75*30{O_o} div lev;
1925
    EnemyAdventTable[lev*75].y := (dxdraw.surfaceheight div 2) - (MainForm.ImageList.Items.Find('Enemy-boss').height div 2);
1926
    EnemyAdventTable[lev*75].lifes := lev*5;
1927
    inc(FRestEnemys);
1928
  end
1929
  else
1930
  begin
1931
    enemys[1] := TEnemyAttacker;
1932
    enemys[2] := TEnemyAttacker2;
1933
    enemys[3] := TEnemyAttacker3;
1934
    enemys[4] := TEnemyMeteor;
1935
    enemys[5] := TEnemyUFO;
1936
    enemys[6] := TEnemyUFO2;
1937
    enemys[7] := TEnemyBoss;
1938
    if fileexists(FDirectory+'Levels\Level '+inttostr(lev)+'.lev') then
1939
    begin
1940
      levact := 0;
1941
      assignfile(filex, FDirectory+'Levels\Level '+inttostr(lev)+'.lev');
1942
      reset(filex);
1943
      while not seekEoF(filex) do
1944
      begin
1945
        if levact = 0 then
1946
        begin
1947
          readln(filex, ergebniss);
1948
          if ergebniss <> '; SpaceMission '+FCompVersion then
1949
          begin
1950
            showmessage(Format(LNG_LEVEL_INVALID, [lev]));
1951
            application.terminate;
1952
            exit;
1953
          end;
1954
          readln(filex, ergebniss);
1955
          if ergebniss <> '; LEV-File' then
1956
          begin
1957
            showmessage(Format(LNG_LEVEL_INVALID, [lev]));
1958
            application.terminate;
1959
            exit;
1960
          end;
1961
          readln(filex);
1962
        end;
1963
        inc(levact);
1964
        readln(filex, ergebniss);
1965
        if levact = 5 then levact := 1;
1966
        if levact = 1 then
1967
        begin
1968
          inc(pos[levact]);
1969
          inc(FRestEnemys);
1970
          EnemyAdventTable[pos[levact]].spriteClass := enemys[strtoint(ergebniss)];
1971
        end;
1972
        if levact = 2 then
1973
        begin
1974
          inc(pos[levact]);
1975
          EnemyAdventTable[pos[levact]].x := strtoint(ergebniss);
1976
        end;
1977
        if levact = 3 then
1978
        begin
1979
          inc(pos[levact]);
1980
          EnemyAdventTable[pos[levact]].y := strtoint(ergebniss);
1981
        end;
1982
        if levact = 4 then
1983
        begin
1984
          inc(pos[levact]);
1985
          EnemyAdventTable[pos[levact]].lifes := strtoint(ergebniss);
1986
        end;
1987
      end;
1988
      closefile(filex);
1989
    end;
1990
  end;
1991
end;
1992
 
1993
procedure TMainForm.SceneTitle;
1994
var
1995
  Logo: TPictureCollectionItem;
1996
begin
1997
  DXDraw.Surface.Fill(0);
1998
  Logo := ImageList.Items.Find('Logo');
1999
  {Logo.DrawWaveX(DXDraw.Surface, (dxdraw.surfaceWidth div 2) - 181, 65, Logo.Width, Logo.Height, 0,
2000
    Trunc(16 - Cos256(FBlink div 60) * 16), 32, -FBlink div 5);}
2001
  Logo.DrawWaveX(DXDraw.Surface, trunc((dxdraw.surfaceWidth / 2) - (Logo.Width / 2)), 65, Logo.Width, Logo.Height, 0,
2002
    2, 80, Fangle * 4);
2003
  inc(Fangle);
2004
  with DXDraw.Surface.Canvas do
2005
  begin
2006
    if (isDown in MainForm.DXInput.States) and (FMenuItem=1) then FMenuItem := 2;
2007
    if ((isUp in MainForm.DXInput.States) and (FMenuItem=2)) or (FMenuItem=0) then FMenuItem := 1;
2008
    Brush.Style := bsClear;
2009
    Font.Size := 30;
2010
    if FMenuItem = 1 then
2011
    begin
2012
      Font.Color := clMaroon;
2013
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-52, 'Normales Spiel');
2014
      Textout((dxdraw.surfaceWidth div 2)-187, (dxdraw.surfaceheight div 2)-52, '>');
2015
      Font.Color := clRed;
2016
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2)-50, 'Normales Spiel');
2017
      Textout((dxdraw.surfaceWidth div 2)-185, (dxdraw.surfaceheight div 2)-50, '>');
2018
      Font.Color := clOlive;
2019
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-2, 'Zufallslevel');
2020
      Font.Color := clYellow;
2021
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2), 'Zufallslevel');
2022
    end
2023
    else
2024
    begin
2025
      Font.Color := clOlive;
2026
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-52, 'Normales Spiel');
2027
      Font.Color := clYellow;
2028
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2)-50, 'Normales Spiel');
2029
      Font.Color := clMaroon;
2030
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-2, 'Zufallslevel');
2031
      Textout((dxdraw.surfaceWidth div 2)-187, (dxdraw.surfaceheight div 2)-2, '>');
2032
      Font.Color := clRed;
2033
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2), 'Zufallslevel');
2034
      Textout((dxdraw.surfaceWidth div 2)-185, (dxdraw.surfaceheight div 2), '>');
2035
    end;
2036
    { if (FBlink div 300) mod 2=0 then
2037
    begin
2038
      Font.Color := clGreen;
2039
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2040
      Font.Color := clLime;
2041
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2042
    end; }
2043
    BlinkUpdate;
2044
    Release;
2045
  end;
2046
  // Weiter mit Leertaste oder Enter
2047
  if (isButton1 in DXInput.States) or (isButton2 in DXInput.States) then
2048
  begin
2049
    FLevel := 1;
2050
    if ((FMenuItem=1) and (fileexists(FDirectory+'Levels\Level '+inttostr(FLevel)+'.lev')=false)) or ((FMenuItem=2) and (FLevel > 20)) then
2051
    begin
2052
      //PlaySound('Frage', False);
2053
      exit;
2054
    end;
2055
    NewLevel(FLevel);
2056
    PlaySound('SceneMov', False);
2057
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2058
    Sleep(200);
2059
    StartScene(gsMain);
2060
  end;
2061
end;
2062
 
2063
procedure TMainForm.SceneMain;
2064
var
2065
  Enemy: TSprite;
2066
begin
2067
  if FInterval = giLeicht then SpriteEngine.Move(conleicht);
2068
  if FInterval = giMittel then SpriteEngine.Move(conmittel);
2069
  if FInterval = giSchwer then SpriteEngine.Move(conschwer);
2070
  if FInterval = giMaster then SpriteEngine.Move(conmaster);
2071
  SpriteEngine.Dead;
2072
  while (Low(EnemyAdventTable)<=FEnemyAdventPos) and
2073
    (FEnemyAdventPos<=High(EnemyAdventTable)) and
2074
    ((EnemyAdventTable[FEnemyAdventPos].x / 4)<=FFrame) and
2075
    (FRestEnemys>0) do
2076
  begin
2077
    if EnemyAdventTable[FEnemyAdventPos].spriteClass <> TNothing then
2078
    begin
2079
      with EnemyAdventTable[FEnemyAdventPos] do
2080
      begin
2081
        Enemy := spriteClass.Create(SpriteEngine.Engine);
2082
        Enemy.x := dxdraw.surfacewidth;
2083
        //Enemy.y := y;
2084
        if y <> 0 then Enemy.y := dxdraw.surfaceheight / (480{maximale Bandbreite im alten Format} / y)
2085
          else Enemy.y := 0;
2086
      end;
2087
    end;
2088
    Inc(FEnemyAdventPos);
2089
  end;
2090
  Inc(FFrame);
2091
  DXDraw.Surface.Fill(0);
2092
  if FNextScene=gsNone then
2093
  begin
2094
    SpriteEngine.Draw;
2095
    if MainForm.flife > 0 then
2096
    begin
2097
      with DXDraw.Surface.Canvas do
2098
      begin
2099
        Brush.Style := bsClear;
2100
        Font.Size := 20;
2101
        Font.Color := clOlive;
2102
        Textout(9, 9, 'Punkte: ' + FloatToStrF(FScore,ffNumber,14,0));
2103
        Font.Color := clYellow;
2104
        Textout(10, 10, 'Punkte: ' + FloatToStrF(FScore,ffNumber,14,0));
2105
        Font.Color := clMaroon;
2106
        Textout(dxdraw.surfacewidth-141, 9, 'Level: ' + IntToStr(MainForm.flevel));
2107
        Font.Color := clRed;
2108
        Textout(dxdraw.surfacewidth-140, 10, 'Level: ' + IntToStr(MainForm.flevel));
2109
        if FLife<0 then mainform.FLife := 0;
2110
        if FCheat then
2111
        begin
2112
          Font.Color := clPurple;
2113
          Textout(9, dxdraw.surfaceheight-41, 'Leben: ?');
2114
          Font.Color := clFuchsia;
2115
          Textout(10, dxdraw.surfaceheight-40, 'Leben: ?');
2116
        end
2117
        else
2118
        begin
2119
          if ((Flife = 1) and ((FBlink div 300) mod 2=0)) or (Flife <> 1) then
2120
          begin
2121
            Font.Color := clPurple;
2122
            Textout(9, dxdraw.surfaceheight-41, 'Leben: ' + IntToStr(MainForm.flife));
2123
            Font.Color := clFuchsia;
2124
            Textout(10, dxdraw.surfaceheight-40, 'Leben: ' + IntToStr(MainForm.flife));
2125
          end;
2126
          if Flife = 1 then BlinkUpdate;
2127
        end;
2128
        {if BossExists and (FBossLife>0) then
2129
        begin
2130
          Font.Color := clPurple;
2131
          Textout(449, 439, 'Boss: ' + IntToStr(FBossLife));
2132
          Font.Color := clFuchsia;
2133
          Textout(450, 440, 'Boss: ' + IntToStr(FBossLife));
2134
        end
2135
        else
2136
          if RestlicheEinheiten>0 then
2137
          begin
2138
            Font.Color := clPurple;
2139
            Textout(449, 439, 'Einheiten: ' + IntToStr(RestlicheEinheiten));
2140
            Font.Color := clFuchsia;
2141
            Textout(450, 440, 'Einheiten: ' + IntToStr(RestlicheEinheiten));
2142
          end;}
2143
        if BossExists and (FBossLife>0) then
2144
        begin
2145
          if (FRestEnemys>0) then
2146
          begin
2147
            Font.Color := clGreen;
2148
            Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-81, 'Boss: ' + IntToStr(FBossLife));
2149
            Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemys));
2150
            Font.Color := clLime;
2151
            Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-80, 'Boss: ' + IntToStr(FBossLife));
2152
            Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys));
2153
          end;
2154
          if (FRestEnemys<1) then
2155
          begin
2156
            Font.Color := clGreen;
2157
            Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Boss: ' + IntToStr(FBossLife));
2158
            Font.Color := clLime;
2159
            Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Boss: ' + IntToStr(FBossLife));
2160
          end;
2161
        end;
2162
        if (FRestEnemys>0) and not Bossexists then
2163
        begin
2164
          Font.Color := clGreen;
2165
          Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemys));
2166
          Font.Color := clLime;
2167
          Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys));
2168
        end;
2169
        Release;
2170
      end;
2171
    end
2172
    else
2173
    begin
2174
      DXDraw.Surface.Canvas.Font.Color := clGreen; // Grüne schrift bei gescheitert? FIXME
2175
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission gescheitert!');
2176
      DXDraw.Surface.Canvas.Font.Color := clLime;
2177
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission gescheitert!');
2178
      DXDraw.Surface.Canvas.Release;
2179
    end;
2180
    if FRestEnemys<0 then FRestEnemys := 0; //Muss das sein?
2181
    if (Ec=0) and (FRestEnemys=0){ and (SpielerFliegtFort = false)}
2182
    and ((BossExists and (FBossLife=0)) or not BossExists) then
2183
    begin
2184
      DXDraw.Surface.Canvas.Font.Color := clGreen;
2185
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission erfolgreich!');
2186
      DXDraw.Surface.Canvas.Font.Color := clLime;
2187
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission erfolgreich!');
2188
      DXDraw.Surface.Canvas.Release;
2189
      Sleep(1);
2190
      inc(FCounter);
2191
      if FCounter>150{200} then PlayerSprite.FlyAway;
2192
    end;
2193
  end;
2194
end;
2195
 
2196
procedure TMainForm.SceneGameOver;
2197
begin
2198
  DXDraw.Surface.Fill(0);
2199
  with DXDraw.Surface.Canvas do
2200
  begin
2201
    FNotSave := true;
2202
    Cheat.enabled := false;
2203
    GamePause.enabled := false;
2204
    Neustart.enabled := false;
2205
    Brush.Style := bsClear;
2206
    Font.Size := 35;
2207
    Font.Color := clMaroon;
2208
    Textout((dxdraw.surfacewidth div 2)-127, 98, 'Verloren!');
2209
    Font.Color := clRed;
2210
    Textout((dxdraw.surfacewidth div 2)-125, 100, 'Verloren!');
2211
    if (FBlink div 300) mod 2=0 then
2212
    begin
2213
      Font.Size := 30;
2214
      Font.Color := clOlive;
2215
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2216
      Font.Color := clYellow;
2217
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2218
    end;
2219
    BlinkUpdate;
2220
    Release;
2221
  end;
2222
  if isButton1 in DXInput.States then
2223
  begin
2224
    PlaySound('SceneMov', False);
2225
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2226
    Sleep(200);
2227
    StartScene(gsTitle);
2228
  end;
2229
end;
2230
 
2231
procedure TMainForm.SceneWin;
2232
begin
2233
  DXDraw.Surface.Fill(0);
2234
  with DXDraw.Surface.Canvas do
2235
  begin
2236
    FNotSave := true;
2237
    Cheat.enabled := false;
2238
    GamePause.enabled := false;
2239
    Neustart.enabled := false;
2240
    Brush.Style := bsClear;
2241
    Font.Size := 35;
2242
    Font.Color := clMaroon;
2243
    Textout((dxdraw.surfaceWidth div 2)-127, 98, 'Gewonnen!');
2244
    Font.Color := clRed;
2245
    Textout((dxdraw.surfaceWidth div 2)-125, 100, 'Gewonnen!');
2246
    if (FBlink div 300) mod 2=0 then
2247
    begin
2248
      Font.Size := 30;
2249
      Font.Color := clOlive;
2250
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2251
      Font.Color := clYellow;
2252
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2253
    end;
2254
    BlinkUpdate;
2255
    Release;
2256
  end;
2257
  if isButton1 in DXInput.States then
2258
  begin
2259
    PlaySound('SceneMov', False);
2260
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2261
    Sleep(200);
2262
    StartScene(gsTitle);
2263
  end;
2264
end;
2265
 
2266
procedure TMainForm.StartSceneNewLevel;
2267
begin
2268
  sleep(500);
2269
  FNotSave := false;
2270
  Cheat.enabled := false;
2271
  Neustart.enabled := false;
2272
  GamePause.enabled := false;
2273
  GameStart.enabled := true;
2274
  Spielgeschwindigkeit.enabled := false;
2275
  BossExists := false;
2276
  Spielgeschwindigkeit.enabled := false;
2277
  if ((FMenuItem=1) and (not fileexists(FDirectory+'Levels\Level '+inttostr(FLevel)+'.lev'))) or ((FMenuItem=2) and (FLevel > 25)) then
2278
  begin
2279
    //PlaySound('SceneMov', False);
2280
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2281
    Sleep(200);
2282
    StartScene(gsWin);
2283
    exit;
2284
  end;
2285
  PlayMusic(mtScene);
2286
end;
2287
 
2288
procedure TMainForm.EndSceneNewLevel;
2289
begin
2290
  {  Ende NewLevel  }
2291
end;
2292
 
2293
procedure TMainForm.SceneNewLevel;
2294
begin
2295
  DXDraw.Surface.Fill(0);
2296
  with DXDraw.Surface.Canvas do
2297
  begin
2298
    Brush.Style := bsClear;
2299
    Font.Size := 40;
2300
    Font.Color := clMaroon;
2301
    Textout((dxdraw.surfaceWidth div 2)-(83+(length(inttostr(flevel))*22)), 98, 'Level '+inttostr(flevel));
2302
    Font.Color := clRed;
2303
    Textout((dxdraw.surfaceWidth div 2)-(81+(length(inttostr(flevel))*22)), 100, 'Level '+inttostr(flevel));
2304
    if (FBlink div 300) mod 2=0 then
2305
    begin
2306
      Font.Size := 30;
2307
      Font.Color := clOlive;
2308
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2309
      Font.Color := clYellow;
2310
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2311
    end;
2312
    BlinkUpdate;
2313
    Release;
2314
  end;
2315
  if isButton1 in DXInput.States then
2316
  begin
2317
    PlaySound('SceneMov', False);
2318
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2319
    Sleep(200);
2320
    StartScene(gsMain);
2321
  end;
2322
end;
2323
 
2324
procedure TMainForm.OptionMusicClick(Sender: TObject);
2325
begin
2326
  OptionMusic.Checked := not OptionMusic.Checked;
2327
  if OptionMusic.Checked then
2328
  begin
2329
    PlayMusic(FMusic)
2330
  end
2331
  else
2332
  begin
2333
    DestroyMusic(FMusic);
2334
  end;
2335
  WriteOptions;
2336
end;
2337
 
2338
procedure TMainForm.MasterClick(Sender: TObject);
2339
begin
2340
  master.checked := true;
2341
  FInterval := giMaster;
2342
  writeoptions;
2343
end;
2344
 
2345
procedure TEnemyMeteor.DoMove(MoveCount: Integer);
2346
begin
2347
  X := X - MoveCount*(250/1000);
2348
  if X < -Width then Dead;
2349
end;
2350
 
2351
procedure TEnemyMeteor.HitEnemy(ADead: Boolean);
2352
begin
2353
  if ADead then Collisioned := True;
2354
  MainForm.PlaySound('Hit', False);
2355
end;
2356
 
2357
{procedure TMainForm.StopMusic;
2358
begin
2359
  PauseMusic(FMusic);
2360
  MCISendString(pchar('seek "'+FDirectory+'Musik\Boss.mid" to start'), nil, 255, 0);
2361
  MCISendString(pchar('seek "'+FDirectory+'Musik\Game.mid" to start'), nil, 255, 0);
2362
  MCISendString(pchar('seek "'+FDirectory+'Musik\Title.mid" to start'), nil, 255, 0);
2363
  MCISendString(pchar('seek "'+FDirectory+'Musik\Scene.mid" to start'), nil, 255, 0);
2364
end;}
2365
 
2366
procedure TMainForm.ResumeMusic(Name: TMusicTrack);
2367
begin
2368
  if not OptionMusic.checked then exit;
2369
  if Name = mtBoss then
2370
    MCISendString(pchar('play "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
2371
  if Name = mtGame then
2372
    MCISendString(pchar('play "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
2373
  if Name = mtScene then
2374
    MCISendString(pchar('play "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
2375
  if Name = mtTitle then
2376
    MCISendString(pchar('play "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
2377
end;
2378
 
2379
constructor TEnemyMeteor.Create(AParent: TSprite);
2380
begin
2381
  inherited Create(AParent);
2382
  Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
2383
  Width := Image.Width;
2384
  Height := Image.Height;
2385
  AnimCount := Image.PatternCount;
2386
  AnimLooped := True;
4 daniel-mar 2387
  AnimSpeed := DEFAULT_ANIMSPEED;
3 daniel-mar 2388
  PixelCheck := True;
2389
end;
2390
 
2391
procedure TMainForm.SpielstandClick(Sender: TObject);
2392
begin
2393
  speicherungform.showmodal;
2394
end;
2395
 
2396
procedure TMainForm.NeustartClick(Sender: TObject);
2397
begin
2398
  FLife := Lives;
2399
  FLevel := 1; // ???
2400
  FScore := 0;
2401
  ec := 0;
2402
  StartScene(gsMain);
2403
  PlayMusic(mtGame);
2404
end;
2405
 
2406
procedure TMainForm.OptionBreitbildClick(Sender: TObject);
2407
begin
2408
  OptionBreitbild.Checked := not OptionBreitbild.Checked;
2409
  DXInit;
2410
  writeoptions;
2411
end;
2412
 
2413
procedure TMainForm.LeichtClick(Sender: TObject);
2414
begin
2415
  leicht.checked := true;
2416
  FInterval := giLeicht;
2417
  writeoptions;
2418
end;
2419
 
2420
procedure TMainForm.MittelClick(Sender: TObject);
2421
begin
2422
  mittel.checked := true;
2423
  FInterval := giMittel;
2424
  writeoptions;
2425
end;
2426
 
2427
procedure TMainForm.SchwerClick(Sender: TObject);
2428
begin
2429
  schwer.checked := true;
2430
  FInterval := giSchwer;
2431
  writeoptions;
2432
end;
2433
 
2434
procedure TMainForm.FormShow(Sender: TObject);
2435
begin
2436
  SplashForm.Hide;
2437
  SplashForm.Free;
2438
 
2439
  dxtimer.Enabled := true;
2440
  dxtimer.ActiveOnly := true;
2441
end;
2442
 
2443
procedure TMainForm.InformationenClick(Sender: TObject);
2444
begin
2445
  dxtimer.enabled := false;
2446
  InfoForm.showmodal;
2447
  if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
2448
end;
2449
 
2450
procedure TMainForm.CheatClick(Sender: TObject);
2451
begin
2452
  CheatForm.showmodal;
2453
end;
2454
 
2455
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
2456
begin
2457
  if optionMusic.checked then DestroyMusic(FMusic);
2458
  SpriteEngine.Engine.Clear;
2459
  dxsound.Finalize;
2460
  dxinput.Destroy;
2461
  DXTimer.Enabled := False;
2462
end;
2463
 
2464
procedure TMainForm.FormDestroy(Sender: TObject);
2465
begin
2466
  imagelist.free;
2467
  spriteengine.free;
2468
  dxdraw.Free;
2469
  wavelist.free;
2470
  dxsound.free;
2471
  //dxinput.free;
2472
  dxtimer.Free;
2473
end;
2474
 
2475
end.
2476