Subversion Repositories spacemission

Rev

Rev 6 | Rev 11 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6 Rev 7
Line 91... Line 91...
91
  public
91
  public
92
    constructor Create(AParent: TSprite); override;
92
    constructor Create(AParent: TSprite); override;
93
    destructor Destroy; override;
93
    destructor Destroy; override;
94
  end;
94
  end;
95
 
95
 
-
 
96
  TEnemyClass = class of TEnemy;
96
  TEnemy = class(TImageSprite)
97
  TEnemy = class(TImageSprite)
97
  private
98
  private
98
    FCounter: Integer;
99
    FCounter: Integer;
99
    FLife: integer;
100
    FLife: integer;
100
    FMode: Integer;
101
    FMode: Integer;
101
    procedure Hit; virtual;
-
 
102
  protected
102
  protected
103
    procedure HitEnemy(ADead: Boolean); virtual;
103
    procedure HitEnemy(ADead: Boolean); virtual;
104
  public
104
  public
-
 
105
    procedure Hit(AHitStrength: integer = 1);
105
    constructor Create(AParent: TSprite); override;
106
    constructor Create(AParent: TSprite; ALifes: integer); virtual;
106
    destructor Destroy; override;
107
    destructor Destroy; override;
107
  end;
108
  end;
108
 
109
 
109
  TEnemyTama = class(TImageSprite)
110
  TEnemyTama = class(TImageSprite)
110
  private
111
  private
Line 118... Line 119...
118
  TEnemyMeteor = class(TEnemy)
119
  TEnemyMeteor = class(TEnemy)
119
  protected
120
  protected
120
    procedure DoMove(MoveCount: Integer); override;
121
    procedure DoMove(MoveCount: Integer); override;
121
    procedure HitEnemy(ADead: Boolean); override;
122
    procedure HitEnemy(ADead: Boolean); override;
122
  public
123
  public
123
    constructor Create(AParent: TSprite); override;
124
    constructor Create(AParent: TSprite; ALifes: integer); override;
124
  end;
125
  end;
125
 
126
 
126
  TEnemyUFO = class(TEnemy)
127
  TEnemyUFO = class(TEnemy)
127
  protected
128
  protected
128
    procedure DoMove(MoveCount: Integer); override;
129
    procedure DoMove(MoveCount: Integer); override;
129
    procedure HitEnemy(ADead: Boolean); override;
130
    procedure HitEnemy(ADead: Boolean); override;
130
  public
131
  public
131
    constructor Create(AParent: TSprite); override;
132
    constructor Create(AParent: TSprite; ALifes: integer); override;
132
  end;
133
  end;
133
 
134
 
134
  TEnemyUFO2 = class(TEnemy)
135
  TEnemyUFO2 = class(TEnemy)
135
  private
136
  private
136
    FCounter: Integer;
137
    FCounter: Integer;
Line 138... Line 139...
138
    FOldTamaTime: Integer;
139
    FOldTamaTime: Integer;
139
  protected
140
  protected
140
    procedure DoMove(MoveCount: Integer); override;
141
    procedure DoMove(MoveCount: Integer); override;
141
    procedure HitEnemy(ADead: Boolean); override;
142
    procedure HitEnemy(ADead: Boolean); override;
142
  public
143
  public
143
    constructor Create(AParent: TSprite); override;
144
    constructor Create(AParent: TSprite; ALifes: integer); override;
144
  end;
145
  end;
145
 
146
 
146
  TEnemyAttacker = class(TEnemy)
147
  TEnemyAttacker = class(TEnemy)
147
  protected
148
  protected
148
    procedure DoMove(MoveCount: Integer); override;
149
    procedure DoMove(MoveCount: Integer); override;
149
    procedure HitEnemy(ADead: Boolean); override;
150
    procedure HitEnemy(ADead: Boolean); override;
150
  public
151
  public
151
    constructor Create(AParent: TSprite); override;
152
    constructor Create(AParent: TSprite; ALifes: integer); override;
152
  end;
153
  end;
153
 
154
 
154
  TEnemyAttacker2 = class(TEnemy)
155
  TEnemyAttacker2 = class(TEnemy)
155
  private
156
  private
156
    FCounter: Integer;
157
    FCounter: Integer;
Line 159... Line 160...
159
    FPutTama: Boolean;
160
    FPutTama: Boolean;
160
  protected
161
  protected
161
    procedure DoMove(MoveCount: Integer); override;
162
    procedure DoMove(MoveCount: Integer); override;
162
    procedure HitEnemy(ADead: Boolean); override;
163
    procedure HitEnemy(ADead: Boolean); override;
163
  public
164
  public
164
    constructor Create(AParent: TSprite); override;
165
    constructor Create(AParent: TSprite; ALifes: integer); override;
165
  end;
166
  end;
166
 
167
 
167
  TEnemyAttacker3 = class(TEnemy)
168
  TEnemyAttacker3 = class(TEnemy)
168
  private
169
  private
169
    FCounter: Integer;
170
    FCounter: Integer;
Line 171... Line 172...
171
    FOldTamaTime: Integer;
172
    FOldTamaTime: Integer;
172
  protected
173
  protected
173
    procedure DoMove(MoveCount: Integer); override;
174
    procedure DoMove(MoveCount: Integer); override;
174
    procedure HitEnemy(ADead: Boolean); override;
175
    procedure HitEnemy(ADead: Boolean); override;
175
  public
176
  public
176
    constructor Create(AParent: TSprite); override;
177
    constructor Create(AParent: TSprite; ALifes: integer); override;
177
  end;
178
  end;
178
 
179
 
179
  TEnemyBoss = class(TEnemy)
180
  TEnemyBoss = class(TEnemy)
180
  private
181
  private
181
    FCounter: Integer;
182
    FCounter: Integer;
Line 185... Line 186...
185
    waiter1, waiter2: integer;
186
    waiter1, waiter2: integer;
186
  protected
187
  protected
187
    procedure DoMove(MoveCount: Integer); override;
188
    procedure DoMove(MoveCount: Integer); override;
188
    procedure HitEnemy(ADead: Boolean); override;
189
    procedure HitEnemy(ADead: Boolean); override;
189
  public
190
  public
190
    constructor Create(AParent: TSprite); override;
191
    constructor Create(AParent: TSprite; ALifes: integer); override;
191
  end;
192
  end;
192
 
193
 
193
  TNothing = class(TImageSprite);
-
 
194
 
-
 
195
  TSpriteClass = class of TSprite;
-
 
196
 
-
 
197
  TEnemyAdvent = record
194
  TEnemyAdvent = record
198
    spriteClass: TSpriteClass;
195
    spriteClass: TEnemyClass;
199
    x: extended;
196
    x: extended;
200
    y: extended;
197
    y: extended;
201
    lifes: integer;
198
    lifes: integer;
202
  end;
199
  end;
203
 
200
 
Line 263... Line 260...
263
    FMusic: TMusicTrack;
260
    FMusic: TMusicTrack;
264
    FBlink: DWORD;
261
    FBlink: DWORD;
265
    FBlinkTime: DWORD;
262
    FBlinkTime: DWORD;
266
    FFrame, FAngle, FCounter, FEnemyAdventPos: Integer;
263
    FFrame, FAngle, FCounter, FEnemyAdventPos: Integer;
267
    PlayerSprite: TPlayerSprite;
264
    PlayerSprite: TPlayerSprite;
-
 
265
    TimerCS: TRTLCriticalSection;
268
    procedure StartScene(Scene: TGameScene);
266
    procedure StartScene(Scene: TGameScene);
269
    procedure EndScene;
267
    procedure EndScene;
270
    procedure BlinkStart;
268
    procedure BlinkStart;
271
    procedure BlinkUpdate;
269
    procedure BlinkUpdate;
272
    procedure StartSceneTitle;
270
    procedure StartSceneTitle;
Line 290... Line 288...
290
    FNotSave: boolean;
288
    FNotSave: boolean;
291
    FLife: integer;
289
    FLife: integer;
292
    FLevel: integer;
290
    FLevel: integer;
293
    FMenuItem: integer;
291
    FMenuItem: integer;
294
    FBossLife: integer;
292
    FBossLife: integer;
295
    FRestEnemys: integer;
293
    FRestEnemies: integer;
296
    FCheat: boolean;
294
    FCheat: boolean;
297
    { VCL-Ersatz }
295
    { VCL-Ersatz }
298
    dxdraw: TDxDraw;
296
    dxdraw: TDxDraw;
299
    imagelist: TDxImageList;
297
    imagelist: TDxImageList;
300
    spriteengine: tdxspriteengine;
298
    spriteengine: tdxspriteengine;
Line 329... Line 327...
329
  end;
327
  end;
330
 
328
 
331
var
329
var
332
  MainForm: TMainForm;
330
  MainForm: TMainForm;
333
 
331
 
-
 
332
implementation
-
 
333
 
-
 
334
uses
-
 
335
  GamSplash, GamSpeicherung, ComInfo, GamCheat, Global;
-
 
336
 
334
const
337
const
335
  // TODO: ini file
338
  // TODO: ini file
336
  conleicht = 650 div 60; // 10
339
  conleicht = 650 div 60; // 10
337
  conmittel = 1000 div 60; // 16
340
  conmittel = 1000 div 60; // 16
338
  conschwer = 1350 div 60; // 22
341
  conschwer = 1350 div 60; // 22
339
  conmaster = 2000 div 60; // 33
342
  conmaster = 2000 div 60; // 33
340
  lives = 6;
343
  lives = 6;
341
 
344
 
-
 
345
  // TODO: Auch für Enemies
-
 
346
  PLAYER_MODE_NORMAL = 0;
342
implementation
347
  PLAYER_MODE_DEAD = 1;
-
 
348
  PLAYER_MODE_DEAD_VANISHED = 2;
-
 
349
  PLAYER_MODE_FLYAWAY = 3;
-
 
350
  PLAYER_MODE_ENTER = 4;
343
 
351
 
344
uses
-
 
345
  GamSplash, GamSpeicherung, ComInfo, GamCheat, Global;
352
  DEFAULT_ANIMSPEED = 15/1000;
346
 
353
 
347
resourcestring
354
resourcestring
348
  FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
355
  FileError = 'Die Datei kann von SpaceMission nicht geöffnet werden!';
349
 
356
 
350
{$R *.DFM}
357
{$R *.DFM}
351
 
358
 
352
var // TODO: irgendwo hinpacken. irgendwo!!!
359
var // TODO: irgendwo hinpacken. irgendwo!!!
353
  EnemyAdventTable: array[0..9999] of TEnemyAdvent; // TODO: dyn
360
  EnemyAdventTable: array of TEnemyAdvent;
354
  Crash2, ec: integer;
361
  Crash2, EnemyCounter: integer;
355
  BossExists, Crash, crashsound: boolean;
362
  BossExists, Crash, crashsound: boolean;
356
  pos: array[1..4] of integer;
-
 
357
  enemys: array[1..27] of TSpriteClass;
-
 
358
  levact: integer;
-
 
359
 
363
 
360
const
364
const
361
  DXInputButton = [isButton1, isButton2, isButton3,
365
  DXInputButton = [isButton1, isButton2, isButton3,
362
    isButton4, isButton5, isButton6, isButton7, isButton8, isButton9, isButton10, isButton11,
366
    isButton4, isButton5, isButton6, isButton7, isButton8, isButton9, isButton10, isButton11,
363
    isButton12, isButton13, isButton14, isButton15, isButton16, isButton17, isButton18,
367
    isButton12, isButton13, isButton14, isButton15, isButton16, isButton17, isButton18,
364
    isButton19, isButton20, isButton21, isButton22, isButton23, isButton24, isButton25,
368
    isButton19, isButton20, isButton21, isButton22, isButton23, isButton24, isButton25,
365
    isButton26, isButton27, isButton28, isButton29, isButton30, isButton31, isButton32];
369
    isButton26, isButton27, isButton28, isButton29, isButton30, isButton31, isButton32];
366
 
370
 
367
const // TODO: Auch für Enemies
-
 
368
  PLAYER_MODE_NORMAL = 0;
-
 
369
  PLAYER_MODE_DEAD = 1;
-
 
370
  PLAYER_MODE_DEAD_VANISHED = 2;
-
 
371
  PLAYER_MODE_FLYAWAY = 3;
-
 
372
  PLAYER_MODE_ENTER = 4;
-
 
373
 
-
 
374
  DEFAULT_ANIMSPEED = 15/1000;
-
 
375
 
-
 
376
// TODO: Code komplett überarbeiten. Bessere Ableitungen machen
371
// TODO: Code komplett überarbeiten. Bessere Ableitungen machen
377
 
372
 
378
constructor TPlayerSprite.Create(AParent: TSprite);
373
constructor TPlayerSprite.Create(AParent: TSprite);
379
begin
374
begin
380
  inherited Create(AParent);
375
  inherited Create(AParent);
Line 455... Line 450...
455
        end;
450
        end;
456
        FOldTamaTime := FCounter;
451
        FOldTamaTime := FCounter;
457
      end;
452
      end;
458
    end;
453
    end;
459
    Collision;
454
    Collision;
-
 
455
  end
460
  end else if FMode=PLAYER_MODE_DEAD then
456
  else if FMode=PLAYER_MODE_DEAD then
461
  begin
457
  begin
462
    if FCounter>200 then
458
    if FCounter>200 then
463
    begin
459
    begin
464
      FCounter := 0;
460
      FCounter := 0;
465
      FMode := PLAYER_MODE_DEAD_VANISHED;
461
      FMode := PLAYER_MODE_DEAD_VANISHED;
466
      Visible := false;
462
      Visible := false;
467
    end;
463
    end;
-
 
464
  end
468
  end else if FMode=PLAYER_MODE_DEAD_VANISHED then
465
  else if FMode=PLAYER_MODE_DEAD_VANISHED then
469
  begin
466
  begin
470
    if FCounter>1500 then
467
    if FCounter>1500 then
471
    begin
468
    begin
472
      MainForm.FNextScene := gsGameOver;
469
      MainForm.FNextScene := gsGameOver;
473
      MainForm.PlaySound('SceneMov', false);
470
      MainForm.PlaySound('SceneMov', false);
474
      MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
471
      MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
475
      Sleep(200);
472
      Sleep(200);
476
    end;
473
    end;
-
 
474
  end
477
  end else if FMode=PLAYER_MODE_FLYAWAY then
475
  else if FMode=PLAYER_MODE_FLYAWAY then
478
  begin
476
  begin
479
    // FUT: "Wusch" sound?
477
    // FUT: "Wusch" sound?
480
    X := X + MoveCount*(300/1000) * (X/MainForm.DXDraw.Width + WegduesKonstante);
478
    X := X + MoveCount*(300/1000) * (X/MainForm.DXDraw.Width + WegduesKonstante);
481
    if X > MainForm.DXDraw.Width+Width then
479
    if X > MainForm.DXDraw.Width+Width then
482
    begin
480
    begin
Line 484... Line 482...
484
      inc(mainform.FLevel);
482
      inc(mainform.FLevel);
485
      MainForm.FNextScene := gsNewLevel;
483
      MainForm.FNextScene := gsNewLevel;
486
      MainForm.PlaySound('SceneMov', false);
484
      MainForm.PlaySound('SceneMov', false);
487
      MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
485
      MainForm.PalleteAnim(RGBQuad(0, 0, 0), 300);
488
    end;
486
    end;
-
 
487
  end
489
  end else if FMode = PLAYER_MODE_ENTER then
488
  else if FMode = PLAYER_MODE_ENTER then
490
  begin
489
  begin
491
    X := X + MoveCount*(300/1000);
490
    X := X + MoveCount*(300/1000);
492
    if X > 19 then FMode := PLAYER_MODE_NORMAL;
491
    if X > 19 then FMode := PLAYER_MODE_NORMAL;
493
  end;
492
  end;
494
  inc(FCounter, MoveCount);
493
  inc(FCounter, MoveCount);
Line 511... Line 510...
511
    DXDraw.Finalize;
510
    DXDraw.Finalize;
512
    if OptionFullScreen.Checked then
511
    if OptionFullScreen.Checked then
513
    begin
512
    begin
514
      if not (doFullScreen in DXDraw.Options) then StoreWindow;
513
      if not (doFullScreen in DXDraw.Options) then StoreWindow;
515
      DXDraw.Options := DXDraw.Options + [doFullScreen];
514
      DXDraw.Options := DXDraw.Options + [doFullScreen];
-
 
515
    end
516
    end else
516
    else
517
    begin
517
    begin
518
      if doFullScreen in DXDraw.Options then RestoreWindow;
518
      if doFullScreen in DXDraw.Options then RestoreWindow;
519
      DXDraw.Options := DXDraw.Options - [doFullScreen];
519
      DXDraw.Options := DXDraw.Options - [doFullScreen];
520
    end;
520
    end;
521
    if not OptionBreitBild.checked then
521
    if not OptionBreitBild.checked then
Line 555... Line 555...
555
  Dec(FPlayerSprite.FTamaCount);
555
  Dec(FPlayerSprite.FTamaCount);
556
end;
556
end;
557
 
557
 
558
procedure TTamaSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
558
procedure TTamaSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
559
begin
559
begin
560
  if (Sprite is TEnemy) and (not (Sprite is TEnemyTama)) then
560
  if (Sprite is TEnemy) and not (Sprite is TEnemyTama) then
561
  begin
561
  begin
562
    TEnemy(Sprite).Hit;
562
    TEnemy(Sprite).Hit;
563
    Dead;
563
    Dead;
564
  end;
564
  end;
565
  Done := False;
565
  Done := False;
Line 695... Line 695...
695
  inherited DoMove(MoveCount);
695
  inherited DoMove(MoveCount);
696
  X := X - MoveCount*(600/1000);
696
  X := X - MoveCount*(600/1000);
697
  if X<-Width then Dead;
697
  if X<-Width then Dead;
698
end;
698
end;
699
 
699
 
700
procedure TEnemy.Hit;
700
procedure TEnemy.Hit(AHitStrength: integer = 1);
701
begin
701
begin
702
  Dec(FLife);
702
  Dec(FLife, AHitStrength);
703
  if FLife<=0 then
703
  if FLife<=0 then
704
  begin
704
  begin
705
    Collisioned := False;
705
    Collisioned := False;
706
    HitEnemy(True);
706
    HitEnemy(True);
707
  end
707
  end
Line 709... Line 709...
709
    HitEnemy(False);
709
    HitEnemy(False);
710
end;
710
end;
711
 
711
 
712
procedure TEnemy.HitEnemy(ADead: Boolean);
712
procedure TEnemy.HitEnemy(ADead: Boolean);
713
begin
713
begin
-
 
714
  if ADead then
714
  if ADead then MainForm.PlaySound('Explosion', False);
715
    MainForm.PlaySound('Explosion', False)
-
 
716
  else
-
 
717
    MainForm.PlaySound('Hit', False);
715
end;
718
end;
716
 
719
 
717
constructor TEnemyUFO.Create(AParent: TSprite);
720
constructor TEnemyUFO.Create(AParent: TSprite; ALifes: integer);
718
begin
721
begin
719
  inherited Create(AParent);
722
  inherited Create(AParent, ALifes);
720
  Image := MainForm.ImageList.Items.Find('Enemy-disk');
723
  Image := MainForm.ImageList.Items.Find('Enemy-disk');
721
  Width := Image.Width;
724
  Width := Image.Width;
722
  Height := Image.Height;
725
  Height := Image.Height;
723
  AnimCount := Image.PatternCount;
726
  AnimCount := Image.PatternCount;
724
  AnimLooped := True;
727
  AnimLooped := True;
725
  AnimSpeed := DEFAULT_ANIMSPEED;
728
  AnimSpeed := DEFAULT_ANIMSPEED;
726
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
-
 
727
end;
729
end;
728
 
730
 
729
constructor TEnemy.Create(AParent: TSprite);
731
constructor TEnemy.Create(AParent: TSprite; ALifes: integer);
730
begin
732
begin
731
  inherited Create(AParent);
733
  inherited Create(AParent);
732
  dec(mainform.FRestEnemys);
734
  FLife := ALifes;
733
  inc(ec);
735
  inc(EnemyCounter);
734
end;
736
end;
735
 
737
 
736
destructor TEnemy.Destroy;
738
destructor TEnemy.Destroy;
737
begin
739
begin
738
  inherited Destroy;
740
  inherited Destroy;
739
  dec(ec);
741
  dec(EnemyCounter);
740
end;
742
end;
741
 
743
 
742
procedure TEnemyUFO.HitEnemy(ADead: Boolean);
744
procedure TEnemyUFO.HitEnemy(ADead: Boolean);
743
begin
745
begin
-
 
746
  inherited HitEnemy(ADead);
-
 
747
 
744
  if ADead then
748
  if ADead then
745
  begin
749
  begin
746
    MainForm.PlaySound('Explosion', False);
-
 
747
    FMode := 2;
750
    FMode := 2;
748
    FCounter := 0;
751
    FCounter := 0;
749
    Inc(MainForm.FScore, 1000);
752
    Inc(MainForm.FScore, 1000);
750
    Image := MainForm.ImageList.Items.Find('Explosion');
753
    Image := MainForm.ImageList.Items.Find('Explosion');
751
    Width := Image.Width;
754
    Width := Image.Width;
752
    Height := Image.Height;
755
    Height := Image.Height;
753
    AnimCount := Image.PatternCount;
756
    AnimCount := Image.PatternCount;
754
    AnimLooped := False;
757
    AnimLooped := False;
755
    AnimSpeed := DEFAULT_ANIMSPEED;
758
    AnimSpeed := DEFAULT_ANIMSPEED;
756
    AnimPos := 0;
759
    AnimPos := 0;
-
 
760
  end
757
  end else
761
  else
758
  begin
762
  begin
759
    MainForm.PlaySound('Hit', False);
-
 
760
    Inc(MainForm.FScore, 100);
763
    Inc(MainForm.FScore, 100);
761
  end;
764
  end;
762
end;
765
end;
763
 
766
 
764
procedure TEnemyUFO2.DoMove(MoveCount: Integer);
767
procedure TEnemyUFO2.DoMove(MoveCount: Integer);
Line 779... Line 782...
779
        Y := Self.Y+Self.Height div 2-Height div 2;
782
        Y := Self.Y+Self.Height div 2-Height div 2;
780
        Z := 10;
783
        Z := 10;
781
      end;
784
      end;
782
      FOldTamaTime := FCounter;
785
      FOldTamaTime := FCounter;
783
    end;
786
    end;
-
 
787
  end
784
  end else if FMode=2 then
788
  else if FMode=2 then
785
  begin
789
  begin
786
    X := X - MoveCount*(300/1000);
790
    X := X - MoveCount*(300/1000);
787
    if FCounter>200 then Dead;
791
    if FCounter>200 then Dead;
788
  end;
792
  end;
789
  inc(FCounter, MoveCount);
793
  inc(FCounter, MoveCount);
790
end;
794
end;
791
 
795
 
792
procedure TEnemyUFO2.HitEnemy(ADead: Boolean);
796
procedure TEnemyUFO2.HitEnemy(ADead: Boolean);
793
begin
797
begin
-
 
798
  inherited HitEnemy(ADead);
-
 
799
 
794
  if ADead then
800
  if ADead then
795
  begin
801
  begin
796
    MainForm.PlaySound('Explosion', False);
-
 
797
    FMode := 2;
802
    FMode := 2;
798
    FCounter := 0;
803
    FCounter := 0;
799
    Inc(MainForm.FScore, 1000);
804
    Inc(MainForm.FScore, 1000);
800
    Image := MainForm.ImageList.Items.Find('Explosion');
805
    Image := MainForm.ImageList.Items.Find('Explosion');
801
    Width := Image.Width;
806
    Width := Image.Width;
802
    Height := Image.Height;
807
    Height := Image.Height;
803
    AnimCount := Image.PatternCount;
808
    AnimCount := Image.PatternCount;
804
    AnimLooped := False;
809
    AnimLooped := False;
805
    AnimSpeed := DEFAULT_ANIMSPEED;
810
    AnimSpeed := DEFAULT_ANIMSPEED;
806
    AnimPos := 0;
811
    AnimPos := 0;
-
 
812
  end
807
  end else
813
  else
808
  begin
814
  begin
809
    MainForm.PlaySound('Hit', False);
-
 
810
    Inc(MainForm.FScore, 100);
815
    Inc(MainForm.FScore, 100);
811
  end;
816
  end;
812
end;
817
end;
813
 
818
 
814
constructor TEnemyUFO2.Create(AParent: TSprite);
819
constructor TEnemyUFO2.Create(AParent: TSprite; ALifes: integer);
815
begin
820
begin
816
  inherited Create(AParent);
821
  inherited Create(AParent, ALifes);
817
  Image := MainForm.ImageList.Items.Find('Enemy-disk2');
822
  Image := MainForm.ImageList.Items.Find('Enemy-disk2');
818
  Width := Image.Width;
823
  Width := Image.Width;
819
  Height := Image.Height;
824
  Height := Image.Height;
820
  AnimCount := Image.PatternCount;
825
  AnimCount := Image.PatternCount;
821
  AnimLooped := True;
826
  AnimLooped := True;
822
  AnimSpeed := DEFAULT_ANIMSPEED;
827
  AnimSpeed := DEFAULT_ANIMSPEED;
823
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
-
 
824
end;
828
end;
825
 
829
 
826
procedure TEnemyUFO.DoMove(MoveCount: Integer);
830
procedure TEnemyUFO.DoMove(MoveCount: Integer);
827
begin
831
begin
828
  inherited DoMove(MoveCount);
832
  inherited DoMove(MoveCount);
829
  if FMode=0 then
833
  if FMode=0 then
830
  begin
834
  begin
831
    X := X - MoveCount*(300/1000);
835
    X := X - MoveCount*(300/1000);
832
    Y := Y + Cos256(FCounter div 15)*2;
836
    Y := Y + Cos256(FCounter div 15)*2;
833
    if X<-Width then Dead;
837
    if X<-Width then Dead;
-
 
838
  end
834
  end else if FMode=2 then
839
  else if FMode=2 then
835
  begin
840
  begin
836
    X := X - MoveCount*(300/1000);
841
    X := X - MoveCount*(300/1000);
837
    if FCounter>200 then Dead;
842
    if FCounter>200 then Dead;
838
  end;
843
  end;
839
  inc(FCounter, MoveCount);
844
  inc(FCounter, MoveCount);
840
end;
845
end;
841
 
846
 
842
constructor TEnemyAttacker.Create(AParent: TSprite);
847
constructor TEnemyAttacker.Create(AParent: TSprite; ALifes: integer);
843
begin
848
begin
844
  inherited Create(AParent);
849
  inherited Create(AParent, ALifes);
845
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
850
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker');
846
  Width := Image.Width;
851
  Width := Image.Width;
847
  Height := Image.Height;
852
  Height := Image.Height;
848
  AnimCount := Image.PatternCount;
853
  AnimCount := Image.PatternCount;
849
  AnimLooped := True;
854
  AnimLooped := True;
850
  AnimSpeed := DEFAULT_ANIMSPEED;
855
  AnimSpeed := DEFAULT_ANIMSPEED;
851
  PixelCheck := True;
856
  PixelCheck := True;
852
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
-
 
853
end;
857
end;
854
 
858
 
855
procedure TEnemyAttacker.HitEnemy(ADead: Boolean);
859
procedure TEnemyAttacker.HitEnemy(ADead: Boolean);
856
begin
860
begin
-
 
861
  inherited HitEnemy(ADead);
-
 
862
 
857
  if ADead then
863
  if ADead then
858
  begin
864
  begin
859
    MainForm.PlaySound('Explosion', False);
-
 
860
    FMode := 2;
865
    FMode := 2;
861
    FCounter := 0;
866
    FCounter := 0;
862
    Inc(MainForm.FScore, 1000);
867
    Inc(MainForm.FScore, 1000);
863
    Image := MainForm.ImageList.Items.Find('Explosion');
868
    Image := MainForm.ImageList.Items.Find('Explosion');
864
    Width := Image.Width;
869
    Width := Image.Width;
865
    Height := Image.Height;
870
    Height := Image.Height;
866
    AnimCount := Image.PatternCount;
871
    AnimCount := Image.PatternCount;
867
    AnimLooped := False;
872
    AnimLooped := False;
868
    AnimSpeed := DEFAULT_ANIMSPEED;
873
    AnimSpeed := DEFAULT_ANIMSPEED;
869
    AnimPos := 0;
874
    AnimPos := 0;
-
 
875
  end
870
  end else
876
  else
871
  begin
877
  begin
872
    MainForm.PlaySound('Hit', False);
-
 
873
    Inc(MainForm.FScore, 100);
878
    Inc(MainForm.FScore, 100);
874
  end;
879
  end;
875
end;
880
end;
876
 
881
 
877
procedure TEnemyAttacker.DoMove(MoveCount: Integer);
882
procedure TEnemyAttacker.DoMove(MoveCount: Integer);
Line 879... Line 884...
879
  inherited DoMove(MoveCount);
884
  inherited DoMove(MoveCount);
880
  if FMode=0 then
885
  if FMode=0 then
881
  begin
886
  begin
882
    X := X - MoveCount*(300/1000)-FCounter div 128;
887
    X := X - MoveCount*(300/1000)-FCounter div 128;
883
    if X < -Width then Dead;
888
    if X < -Width then Dead;
-
 
889
  end
884
  end else if FMode=2 then
890
  else if FMode=2 then
885
  begin
891
  begin
886
    X := X - MoveCount*(300/1000);
892
    X := X - MoveCount*(300/1000);
887
    if FCounter>200 then Dead;
893
    if FCounter>200 then Dead;
888
  end;
894
  end;
889
  inc(FCounter, MoveCount);
895
  inc(FCounter, MoveCount);
890
end;
896
end;
891
 
897
 
892
constructor TEnemyBoss.Create(AParent: TSprite);
898
constructor TEnemyBoss.Create(AParent: TSprite; ALifes: integer);
893
begin
899
begin
894
  inherited Create(AParent);
900
  inherited Create(AParent, ALifes);
895
  Image := MainForm.ImageList.Items.Find('Enemy-boss');
901
  Image := MainForm.ImageList.Items.Find('Enemy-boss');
896
  Width := Image.Width;
902
  Width := Image.Width;
897
  Height := Image.Height;
903
  Height := Image.Height;
898
  BossExists := true;
904
  BossExists := true;
899
  MainForm.PlayMusic(mtBoss);
905
  MainForm.PlayMusic(mtBoss);
900
  AnimCount := Image.PatternCount;
906
  AnimCount := Image.PatternCount;
901
  AnimLooped := True;
907
  AnimLooped := True;
902
  AnimSpeed := DEFAULT_ANIMSPEED;
908
  AnimSpeed := DEFAULT_ANIMSPEED;
903
  PixelCheck := True;
909
  PixelCheck := True;
904
  Collisioned := False;
910
  Collisioned := False;
905
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
-
 
906
  MainForm.FBossLife := FLife;
911
  MainForm.FBossLife := FLife;
907
  waiter1 := 0;
912
  waiter1 := 0;
908
  waiter2 := 0;
913
  waiter2 := 0;
909
end;
914
end;
910
 
915
 
911
procedure TEnemyBoss.HitEnemy(ADead: Boolean);
916
procedure TEnemyBoss.HitEnemy(ADead: Boolean);
912
begin
917
begin
-
 
918
  inherited HitEnemy(ADead);
-
 
919
 
913
  if ADead then
920
  if ADead then
914
  begin
921
  begin
915
    MainForm.PlaySound('Explosion', False);
-
 
916
    FMode := 2;
922
    FMode := 2;
917
    FCounter := 0;
923
    FCounter := 0;
918
    Inc(MainForm.FScore, 100000);
924
    Inc(MainForm.FScore, 100000);
919
    BossExists := false;
925
    BossExists := false;
920
    dec(MainForm.FBossLife);
926
    dec(MainForm.FBossLife);
-
 
927
  end
921
  end else
928
  else
922
  begin
929
  begin
923
    MainForm.PlaySound('Hit', False);
-
 
924
    Inc(MainForm.FScore, 100);
930
    Inc(MainForm.FScore, 100);
925
    dec(MainForm.FBossLife);
931
    dec(MainForm.FBossLife);
926
  end;
932
  end;
927
end;
933
end;
928
 
934
 
Line 938... Line 944...
938
      Collisioned := True;
944
      Collisioned := True;
939
      FMode := 1;
945
      FMode := 1;
940
      FPutTama := True;
946
      FPutTama := True;
941
    end;
947
    end;
942
    Y := Y + Cos256(FCounter div 15)*5;
948
    Y := Y + Cos256(FCounter div 15)*5;
-
 
949
  end
943
  end else if FMode=1 then
950
  else if FMode=1 then
944
  begin
951
  begin
945
    Y := Y + Cos256(FCounter div 15)*5;
952
    Y := Y + Cos256(FCounter div 15)*5;
946
    if FPutTama then
953
    if FPutTama then
947
    begin
954
    begin
948
      if FTamaT>100 then
955
      if FTamaT>100 then
Line 957... Line 964...
957
        Inc(FTamaF);
964
        Inc(FTamaF);
958
        if FTamaF>Random(30) then FPutTama := False;
965
        if FTamaF>Random(30) then FPutTama := False;
959
        FTamaT := 0;
966
        FTamaT := 0;
960
      end;
967
      end;
961
      FTamaT := FTamaT + MoveCount;
968
      FTamaT := FTamaT + MoveCount;
-
 
969
    end
962
    end else
970
    else
963
    begin
971
    begin
964
      FTamaT := FTamaT + MoveCount;
972
      FTamaT := FTamaT + MoveCount;
965
      if FTamaT>2000+Random(500) then
973
      if FTamaT>2000+Random(500) then
966
      begin
974
      begin
967
        FPutTama := True;
975
        FPutTama := True;
968
        FTamaF := 0;
976
        FTamaF := 0;
969
        FTamaT := 0;
977
        FTamaT := 0;
970
      end;
978
      end;
971
    end;
979
    end;
-
 
980
  end
972
  end else if FMode=2 then
981
  else if FMode=2 then
973
  begin
982
  begin
974
    inc(waiter1);
983
    inc(waiter1);
975
    if waiter1 = 3 then
984
    if waiter1 = 3 then
976
    begin
985
    begin
977
      waiter1 := 0;
986
      waiter1 := 0;
Line 989... Line 998...
989
      begin
998
      begin
990
        Inc(MainForm.FScore, 1000);
999
        Inc(MainForm.FScore, 1000);
991
        FMode := 3;
1000
        FMode := 3;
992
      end;
1001
      end;
993
    end;
1002
    end;
-
 
1003
  end
994
  end else if FMode=3 then
1004
  else if FMode=3 then
995
  begin
1005
  begin
996
    if FCounter>4000 then dead;
1006
    if FCounter>4000 then Dead;
997
  end;
1007
  end;
998
  inc(FCounter, MoveCount);
1008
  inc(FCounter, MoveCount);
999
end;
1009
end;
1000
 
1010
 
1001
constructor TEnemyAttacker2.Create(AParent: TSprite);
1011
constructor TEnemyAttacker2.Create(AParent: TSprite; ALifes: integer);
1002
begin
1012
begin
1003
  inherited Create(AParent);
1013
  inherited Create(AParent, ALifes);
1004
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
1014
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker2');
1005
  Width := Image.Width;
1015
  Width := Image.Width;
1006
  Height := Image.Height;
1016
  Height := Image.Height;
1007
  AnimCount := Image.PatternCount;
1017
  AnimCount := Image.PatternCount;
1008
  AnimLooped := True;
1018
  AnimLooped := True;
1009
  AnimSpeed := DEFAULT_ANIMSPEED;
1019
  AnimSpeed := DEFAULT_ANIMSPEED;
1010
  PixelCheck := True;
1020
  PixelCheck := True;
1011
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
-
 
1012
end;
1021
end;
1013
 
1022
 
1014
procedure TEnemyAttacker2.HitEnemy(ADead: Boolean);
1023
procedure TEnemyAttacker2.HitEnemy(ADead: Boolean);
1015
begin
1024
begin
-
 
1025
  inherited HitEnemy(ADead);
-
 
1026
 
1016
  if ADead then
1027
  if ADead then
1017
  begin
1028
  begin
1018
    MainForm.PlaySound('Explosion', False);
-
 
1019
    FMode := 2;
1029
    FMode := 2;
1020
    FCounter := 0;
1030
    FCounter := 0;
1021
    Inc(MainForm.FScore, 5000);
1031
    Inc(MainForm.FScore, 5000);
1022
    Image := MainForm.ImageList.Items.Find('Explosion');
1032
    Image := MainForm.ImageList.Items.Find('Explosion');
1023
    Width := Image.Width;
1033
    Width := Image.Width;
1024
    Height := Image.Height;
1034
    Height := Image.Height;
1025
    AnimCount := Image.PatternCount;
1035
    AnimCount := Image.PatternCount;
1026
    AnimLooped := False;
1036
    AnimLooped := False;
1027
    AnimSpeed := DEFAULT_ANIMSPEED;
1037
    AnimSpeed := DEFAULT_ANIMSPEED;
1028
    AnimPos := 0;
1038
    AnimPos := 0;
-
 
1039
  end
1029
  end else
1040
  else
1030
  begin
1041
  begin
1031
    MainForm.PlaySound('Hit', False);
-
 
1032
    Inc(MainForm.FScore, 100);
1042
    Inc(MainForm.FScore, 100);
1033
  end;
1043
  end;
1034
end;
1044
end;
1035
 
1045
 
1036
procedure TEnemyAttacker2.DoMove(MoveCount: Integer);
1046
procedure TEnemyAttacker2.DoMove(MoveCount: Integer);
Line 1045... Line 1055...
1045
      Collisioned := True;
1055
      Collisioned := True;
1046
      FMode := 1;
1056
      FMode := 1;
1047
      FPutTama := True;
1057
      FPutTama := True;
1048
    end;
1058
    end;
1049
    Y := Y + Cos256(FCounter div 15)*5;
1059
    Y := Y + Cos256(FCounter div 15)*5;
-
 
1060
  end
1050
  end else if FMode=1 then
1061
  else if FMode=1 then
1051
  begin
1062
  begin
1052
    Y := Y + Cos256(FCounter div 15)*5;
1063
    Y := Y + Cos256(FCounter div 15)*5;
1053
    if FPutTama then
1064
    if FPutTama then
1054
    begin
1065
    begin
1055
      if FTamaT>100 then
1066
      if FTamaT>100 then
Line 1064... Line 1075...
1064
        Inc(FTamaF);
1075
        Inc(FTamaF);
1065
        if FTamaF>Random(30) then FPutTama := False;
1076
        if FTamaF>Random(30) then FPutTama := False;
1066
        FTamaT := 0;
1077
        FTamaT := 0;
1067
      end;
1078
      end;
1068
      FTamaT := FTamaT + MoveCount;
1079
      FTamaT := FTamaT + MoveCount;
-
 
1080
    end
1069
    end else
1081
    else
1070
    begin
1082
    begin
1071
      FTamaT := FTamaT + MoveCount;
1083
      FTamaT := FTamaT + MoveCount;
1072
      if FTamaT>2000+Random(500) then
1084
      if FTamaT>2000+Random(500) then
1073
      begin
1085
      begin
1074
        FPutTama := True;
1086
        FPutTama := True;
1075
        FTamaF := 0;
1087
        FTamaF := 0;
1076
        FTamaT := 0;
1088
        FTamaT := 0;
1077
      end;
1089
      end;
1078
    end;
1090
    end;
-
 
1091
  end
1079
  end else if FMode=2 then
1092
  else if FMode=2 then
1080
  begin
1093
  begin
1081
    if FCounter>200 then Dead;
1094
    if FCounter>200 then Dead;
1082
  end;
1095
  end;
1083
  inc(FCounter, MoveCount);
1096
  inc(FCounter, MoveCount);
1084
end;
1097
end;
1085
 
1098
 
1086
procedure TEnemyAttacker3.HitEnemy(ADead: Boolean);
1099
procedure TEnemyAttacker3.HitEnemy(ADead: Boolean);
1087
begin
1100
begin
-
 
1101
  inherited HitEnemy(ADead);
-
 
1102
 
1088
  if ADead then
1103
  if ADead then
1089
  begin
1104
  begin
1090
    MainForm.PlaySound('Explosion', False);
-
 
1091
    FMode := 1;
1105
    FMode := 1;
1092
    FCounter := 0;
1106
    FCounter := 0;
1093
    Inc(MainForm.FScore, 5000);
1107
    Inc(MainForm.FScore, 5000);
1094
    Image := MainForm.ImageList.Items.Find('Explosion');
1108
    Image := MainForm.ImageList.Items.Find('Explosion');
1095
    Width := Image.Width;
1109
    Width := Image.Width;
1096
    Height := Image.Height;
1110
    Height := Image.Height;
1097
    AnimCount := Image.PatternCount;
1111
    AnimCount := Image.PatternCount;
1098
    AnimLooped := False;
1112
    AnimLooped := False;
1099
    AnimSpeed := DEFAULT_ANIMSPEED;
1113
    AnimSpeed := DEFAULT_ANIMSPEED;
1100
    AnimPos := 0;
1114
    AnimPos := 0;
-
 
1115
  end
1101
  end else
1116
  else
1102
  begin
1117
  begin
1103
    MainForm.PlaySound('Hit', False);
-
 
1104
    Inc(MainForm.FScore, 100);
1118
    Inc(MainForm.FScore, 100);
1105
  end;
1119
  end;
1106
end;
1120
end;
1107
 
1121
 
1108
procedure TEnemyAttacker3.DoMove(MoveCount: Integer);
1122
procedure TEnemyAttacker3.DoMove(MoveCount: Integer);
Line 1122... Line 1136...
1122
        Y := Self.Y+Self.Height div 2-Height div 2;
1136
        Y := Self.Y+Self.Height div 2-Height div 2;
1123
        Z := 10;
1137
        Z := 10;
1124
      end;
1138
      end;
1125
      FOldTamaTime := FCounter;
1139
      FOldTamaTime := FCounter;
1126
     end;
1140
     end;
-
 
1141
  end
1127
  end else if FMode=1 then
1142
  else if FMode=1 then
1128
  begin
1143
  begin
1129
    if FCounter>200 then Dead;
1144
    if FCounter>200 then Dead;
1130
  end;
1145
  end;
1131
  inc(FCounter, MoveCount);
1146
  inc(FCounter, MoveCount);
1132
end;
1147
end;
1133
 
1148
 
1134
constructor TEnemyAttacker3.Create(AParent: TSprite);
1149
constructor TEnemyAttacker3.Create(AParent: TSprite; ALifes: integer);
1135
begin
1150
begin
1136
  inherited Create(AParent);
1151
  inherited Create(AParent, ALifes);
1137
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
1152
  Image := MainForm.ImageList.Items.Find('Enemy-Attacker3');
1138
  Width := Image.Width;
1153
  Width := Image.Width;
1139
  Height := Image.Height;
1154
  Height := Image.Height;
1140
  AnimCount := Image.PatternCount;
1155
  AnimCount := Image.PatternCount;
1141
  AnimLooped := True;
1156
  AnimLooped := True;
1142
  AnimSpeed := DEFAULT_ANIMSPEED;
1157
  AnimSpeed := DEFAULT_ANIMSPEED;
1143
  PixelCheck := True;
1158
  PixelCheck := True;
1144
  FLife := EnemyAdventTable[mainform.FEnemyAdventPos].lifes;
-
 
1145
end;
1159
end;
1146
 
1160
 
1147
function TMainForm.SoundKarte: boolean;
1161
function TMainForm.SoundKarte: boolean;
1148
begin
1162
begin
1149
  result := WaveOutGetNumDevs > 0;
1163
  result := WaveOutGetNumDevs > 0;
Line 1201... Line 1215...
1201
  imagelist.DXDraw := dxdraw;
1215
  imagelist.DXDraw := dxdraw;
1202
 
1216
 
1203
  spriteengine := tdxspriteengine.create(self);
1217
  spriteengine := tdxspriteengine.create(self);
1204
  spriteengine.DXDraw := dxdraw;
1218
  spriteengine.DXDraw := dxdraw;
1205
 
1219
 
-
 
1220
  InitializeCriticalSection(TimerCS);
-
 
1221
 
1206
  { Ende VCL-Ersatz }
1222
  { Ende VCL-Ersatz }
1207
 
1223
 
1208
  Application.Title := 'SpaceMission '+ProgramVersion;
1224
  Application.Title := 'SpaceMission '+ProgramVersion;
1209
  LoadOptions;
1225
  LoadOptions;
1210
  DXInit;
1226
  DXInit;
Line 1252... Line 1268...
1252
 
1268
 
1253
procedure TMainForm.GamePauseClick(Sender: TObject);
1269
procedure TMainForm.GamePauseClick(Sender: TObject);
1254
begin
1270
begin
1255
  GamePause.Checked := not GamePause.Checked;
1271
  GamePause.Checked := not GamePause.Checked;
1256
  DXTimer.Enabled := not GamePause.Checked;
1272
  DXTimer.Enabled := not GamePause.Checked;
1257
  if GamePause.Checked then PauseMusic(FMusic) else
1273
  if GamePause.Checked then
-
 
1274
    PauseMusic(FMusic)
-
 
1275
  else
1258
    ResumeMusic(FMusic);
1276
    ResumeMusic(FMusic);
1259
end;
1277
end;
1260
 
1278
 
1261
// http://www.delphipraxis.net/post43515.html
1279
// http://www.delphipraxis.net/post43515.html
1262
Function GetHTML(AUrl: string): string;
1280
Function GetHTML(AUrl: string): string;
Line 1455... Line 1473...
1455
begin
1473
begin
1456
  if doFullScreen in DXDraw.Options then
1474
  if doFullScreen in DXDraw.Options then
1457
  begin
1475
  begin
1458
    BorderStyle := bsNone;
1476
    BorderStyle := bsNone;
1459
    DXDraw.Cursor := crNone;
1477
    DXDraw.Cursor := crNone;
-
 
1478
  end
1460
  end else
1479
  else
1461
  begin
1480
  begin
1462
    BorderStyle := bsSingle;
1481
    BorderStyle := bsSingle;
1463
    DXDraw.Cursor := crDefault;
1482
    DXDraw.Cursor := crDefault;
1464
  end;
1483
  end;
1465
end;
1484
end;
Line 1507... Line 1526...
1507
  result := MCIStatus;
1526
  result := MCIStatus;
1508
end;
1527
end;
1509
 
1528
 
1510
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
1529
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer);
1511
begin
1530
begin
-
 
1531
  EnterCriticalSection(TimerCS);
-
 
1532
  try
1512
  if StatusMusic(FMusic) = 'stopped' then
1533
    if StatusMusic(FMusic) = 'stopped' then
1513
    PlayMusic(FMusic); {...}
1534
      PlayMusic(FMusic); {...}
1514
  if crash then
1535
    if crash then
1515
  begin
1536
    begin
1516
    inc(Crash2);
1537
      inc(Crash2);
Line 1534... Line 1555...
1534
  begin
1555
    begin
1535
    StartScene(FNextScene);
1556
      StartScene(FNextScene);
1536
    FNextScene := gsNone;
1557
      FNextScene := gsNone;
1537
  end;
1558
    end;
1538
  DXDraw.Flip;
1559
    DXDraw.Flip;
-
 
1560
  finally
-
 
1561
    LeaveCriticalSection(TimerCS);
-
 
1562
  end;
1539
end;
1563
end;
1540
 
1564
 
1541
procedure TMainForm.BlinkStart;
1565
procedure TMainForm.BlinkStart;
1542
begin
1566
begin
1543
  FBlink := 0;
1567
  FBlink := 0;
Line 1547... Line 1571...
1547
procedure TMainForm.WriteOptions;
1571
procedure TMainForm.WriteOptions;
1548
var
1572
var
1549
  INIDatei: TIniFile;
1573
  INIDatei: TIniFile;
1550
begin
1574
begin
1551
  INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
1575
  INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
-
 
1576
  try
1552
  if OptionMusic.checked then INIDatei.WriteBool('Settings', 'Music', true)
1577
    if OptionMusic.checked then INIDatei.WriteBool('Settings', 'Music', true)
1553
    else INIDatei.WriteBool('Settings', 'Music', false);
1578
      else INIDatei.WriteBool('Settings', 'Music', false);
1554
  if OptionSound.checked then INIDatei.WriteBool('Settings', 'Sound', true)
1579
    if OptionSound.checked then INIDatei.WriteBool('Settings', 'Sound', true)
1555
    else INIDatei.WriteBool('Settings', 'Sound', false);
1580
      else INIDatei.WriteBool('Settings', 'Sound', false);
1556
  if OptionFullScreen.checked then INIDatei.WriteBool('Settings', 'FullScreen', true)
1581
    if OptionFullScreen.checked then INIDatei.WriteBool('Settings', 'FullScreen', true)
Line 1559... Line 1584...
1559
    else INIDatei.WriteBool('Settings', 'ScreenAutoSize', false);
1584
      else INIDatei.WriteBool('Settings', 'ScreenAutoSize', false);
1560
  if FInterval = giLeicht then INIDatei.WriteInteger('Settings', 'Speed', 1);
1585
    if FInterval = giLeicht then INIDatei.WriteInteger('Settings', 'Speed', 1);
1561
  if FInterval = giMittel then INIDatei.WriteInteger('Settings', 'Speed', 2);
1586
    if FInterval = giMittel then INIDatei.WriteInteger('Settings', 'Speed', 2);
1562
  if FInterval = giSchwer then INIDatei.WriteInteger('Settings', 'Speed', 3);
1587
    if FInterval = giSchwer then INIDatei.WriteInteger('Settings', 'Speed', 3);
1563
  if FInterval = giMaster then INIDatei.WriteInteger('Settings', 'Speed', 4);
1588
    if FInterval = giMaster then INIDatei.WriteInteger('Settings', 'Speed', 4);
-
 
1589
  finally
1564
  INIDatei.Free;
1590
    INIDatei.Free;
1565
end;
1591
  end;
-
 
1592
end;
1566
 
1593
 
1567
procedure TMainForm.LoadOptions;
1594
procedure TMainForm.LoadOptions;
1568
var
1595
var
1569
  INIDatei: TIniFile;
1596
  INIDatei: TIniFile;
1570
begin
1597
begin
1571
  INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
1598
  INIDatei := TIniFile.Create(FDirectory+'Einstellungen\SpaceMission.ini');
-
 
1599
  try
1572
  optionmusic.checked := INIDatei.ReadBool('Settings', 'Music', true);
1600
    optionmusic.checked := INIDatei.ReadBool('Settings', 'Music', true);
1573
  optionsound.checked := INIDatei.ReadBool('Settings', 'Sound', true);
1601
    optionsound.checked := INIDatei.ReadBool('Settings', 'Sound', true);
1574
  optionfullscreen.checked := INIDatei.ReadBool('Settings', 'fullscreen', false);
1602
    optionfullscreen.checked := INIDatei.ReadBool('Settings', 'fullscreen', false);
1575
  OptionBreitBild.checked := INIDatei.ReadBool('Settings', 'ScreenAutoSize', true);
1603
    OptionBreitBild.checked := INIDatei.ReadBool('Settings', 'ScreenAutoSize', true);
1576
  if INIDatei.ReadInteger('Settings', 'Speed', 2) = 1 then
1604
    if INIDatei.ReadInteger('Settings', 'Speed', 2) = 1 then
Line 1591... Line 1619...
1591
  if INIDatei.ReadInteger('Settings', 'Speed', 2) = 4 then
1619
    if INIDatei.ReadInteger('Settings', 'Speed', 2) = 4 then
1592
  begin
1620
    begin
1593
    FInterval := giMaster;
1621
      FInterval := giMaster;
1594
    Master.checked := true;
1622
      Master.checked := true;
1595
  end;
1623
    end;
-
 
1624
  finally
1596
  INIDatei.Free;
1625
    INIDatei.Free;
-
 
1626
  end;
1597
  WriteOptions;
1627
  WriteOptions;
1598
end;
1628
end;
1599
 
1629
 
1600
procedure TMainForm.BlinkUpdate;
1630
procedure TMainForm.BlinkUpdate;
1601
begin
1631
begin
Line 1656... Line 1686...
1656
        for i := 0 to 255 do
1686
        for i := 0 to 255 do
1657
          DXDraw.ColorTable[i] := ComposeColor(Col, DXDraw.DefColorTable[i], t2);
1687
          DXDraw.ColorTable[i] := ComposeColor(Col, DXDraw.DefColorTable[i], t2);
1658
        DXDraw.UpdatePalette;
1688
        DXDraw.UpdatePalette;
1659
        ChangePalette := True;
1689
        ChangePalette := True;
1660
      end;
1690
      end;
-
 
1691
    end
1661
    end else
1692
    else
-
 
1693
    begin
1662
      Sleep(Time);
1694
      Sleep(Time);
-
 
1695
    end;
1663
    for i := 0 to 4 do
1696
    for i := 0 to 4 do
1664
    begin
1697
    begin
1665
      DXDraw.Surface.Fill(c);
1698
      DXDraw.Surface.Fill(c);
1666
      DXDraw.Flip;
1699
      DXDraw.Flip;
1667
    end;
1700
    end;
Line 1715... Line 1748...
1715
  sleep(500);
1748
  sleep(500);
1716
  FCounter := 0;
1749
  FCounter := 0;
1717
  NewLevel(FLevel);
1750
  NewLevel(FLevel);
1718
  BossExists := false;
1751
  BossExists := false;
1719
  PlayMusic(mtGame);
1752
  PlayMusic(mtGame);
1720
  FEnemyAdventPos := 1;
1753
  FEnemyAdventPos := 0;
1721
  FFrame := -4;
1754
  FFrame := -4;
1722
  PlayerSprite := TPlayerSprite.Create(SpriteEngine.Engine);
1755
  PlayerSprite := TPlayerSprite.Create(SpriteEngine.Engine);
1723
  with TBackground.Create(SpriteEngine.Engine) do
1756
  with TBackground.Create(SpriteEngine.Engine) do
1724
  begin
1757
  begin
1725
    SetMapSize(1, 1);
1758
    SetMapSize(1, 1);
Line 1857... Line 1890...
1857
begin
1890
begin
1858
  {  Ende Win  }
1891
  {  Ende Win  }
1859
end;
1892
end;
1860
 
1893
 
1861
procedure TMainForm.DeleteArray();
1894
procedure TMainForm.DeleteArray();
1862
var
-
 
1863
  i: integer;
-
 
1864
begin
1895
begin
1865
  for i := Low(EnemyAdventTable) to High(EnemyAdventTable) do
-
 
1866
  begin
-
 
1867
    EnemyAdventTable[i].spriteClass := TNothing;
-
 
1868
    EnemyAdventTable[i].x := 0;
1896
  SetLength(EnemyAdventTable, 0);
1869
    EnemyAdventTable[i].y := 0;
1897
  FRestEnemies := 0;
1870
    EnemyAdventTable[i].lifes := 0;
-
 
1871
  end;
1898
end;
-
 
1899
 
-
 
1900
const
1872
  FRestEnemys := 0;
1901
  ADDITIONAL_ENEMIES_PER_LEVEL = 75;
-
 
1902
 
-
 
1903
function GetLevelFileName(lev: integer): string;
-
 
1904
begin
-
 
1905
  result := FDirectory+'Levels\Level '+inttostr(lev)+'.lev';
1873
end;
1906
end;
1874
 
1907
 
1875
procedure TMainForm.NewLevel(lev: integer);
1908
procedure TMainForm.NewLevel(lev: integer);
1876
resourcestring
1909
resourcestring
1877
  LNG_LEVEL_INVALID = 'Das Level Nr. %d ist ungültig!'+#13#10+'Das Programm wird beendet.';
1910
  LNG_LEVEL_INVALID = 'Das Level Nr. %d ist ungültig!'+#13#10+'Das Programm wird beendet.';
1878
var
1911
var
1879
  act: integer;
1912
  act: integer;
1880
  filex: textfile;
1913
  filex: textfile;
1881
  ergebniss: string;
1914
  ergebniss: string;
-
 
1915
  Enemies: array[1..27] of TEnemyClass;
-
 
1916
  e: TEnemyAdvent;
1882
begin
1917
begin
1883
  DeleteArray;
1918
  DeleteArray;
1884
  if FMenuItem = 2 then
1919
  if FMenuItem = 2 then
1885
  begin
1920
  begin
1886
    enemys[1] := TEnemyAttacker;
1921
    Enemies[1] := TEnemyAttacker;
1887
    enemys[2] := TEnemyMeteor;
1922
    Enemies[2] := TEnemyMeteor;
1888
    enemys[3] := TEnemyUFO;
1923
    Enemies[3] := TEnemyUFO;
1889
    enemys[4] := TEnemyAttacker;
1924
    Enemies[4] := TEnemyAttacker;
1890
    enemys[5] := TEnemyMeteor;
1925
    Enemies[5] := TEnemyMeteor;
1891
    enemys[6] := TEnemyUFO;
1926
    Enemies[6] := TEnemyUFO;
1892
    enemys[7] := TEnemyAttacker;
1927
    Enemies[7] := TEnemyAttacker;
1893
    enemys[8] := TEnemyMeteor;
1928
    Enemies[8] := TEnemyMeteor;
1894
    enemys[9] := TEnemyUFO;
1929
    Enemies[9] := TEnemyUFO;
1895
    enemys[10] := TEnemyAttacker;
1930
    Enemies[10] := TEnemyAttacker;
1896
    enemys[11] := TEnemyMeteor;
1931
    Enemies[11] := TEnemyMeteor;
1897
    enemys[12] := TEnemyUFO;
1932
    Enemies[12] := TEnemyUFO;
1898
    enemys[13] := TEnemyAttacker;
1933
    Enemies[13] := TEnemyAttacker;
1899
    enemys[14] := TEnemyMeteor;
1934
    Enemies[14] := TEnemyMeteor;
1900
    enemys[15] := TEnemyUFO;
1935
    Enemies[15] := TEnemyUFO;
1901
    enemys[16] := TEnemyAttacker3;
1936
    Enemies[16] := TEnemyAttacker3;
1902
    enemys[17] := TEnemyAttacker;
1937
    Enemies[17] := TEnemyAttacker;
1903
    enemys[18] := TEnemyMeteor;
1938
    Enemies[18] := TEnemyMeteor;
1904
    enemys[19] := TEnemyUFO;
1939
    Enemies[19] := TEnemyUFO;
1905
    enemys[20] := TEnemyUFO2;
1940
    Enemies[20] := TEnemyUFO2;
1906
    enemys[21] := TEnemyAttacker;
1941
    Enemies[21] := TEnemyAttacker;
1907
    enemys[22] := TEnemyMeteor;
1942
    Enemies[22] := TEnemyMeteor;
1908
    enemys[23] := TEnemyUFO;
1943
    Enemies[23] := TEnemyUFO;
1909
    enemys[24] := TEnemyAttacker2;
1944
    Enemies[24] := TEnemyAttacker2;
1910
    enemys[25] := TEnemyMeteor;
1945
    Enemies[25] := TEnemyMeteor;
1911
    enemys[26] := TEnemyUFO;
1946
    Enemies[26] := TEnemyUFO;
1912
    enemys[27] := TEnemyAttacker;
1947
    Enemies[27] := TEnemyAttacker;
1913
    randomize;
1948
    randomize;
-
 
1949
    FRestEnemies := lev*ADDITIONAL_ENEMIES_PER_LEVEL+1;
-
 
1950
    SetLength(EnemyAdventTable, FRestEnemies);
1914
    for act := 1 to lev*75-1 do
1951
    for act := 0 to lev*ADDITIONAL_ENEMIES_PER_LEVEL-1 do
-
 
1952
    begin
-
 
1953
      e.spriteClass := Enemies[min(random(lev+2)+1, High(Enemies))];
-
 
1954
      if e.spriteClass = TEnemyAttacker2 then
1915
    begin
1955
      begin
1916
      inc(FRestEnemys);
-
 
1917
      EnemyAdventTable[act].spriteClass := enemys[random(lev+2)+1];
1956
        e.spriteClass := Enemies[min(random(lev+2)+1, High(Enemies))]; {O_o}
1918
      if EnemyAdventTable[act].spriteClass = TEnemyAttacker2 then EnemyAdventTable[act].spriteClass := enemys[random(lev+2)+1]; {O_o}
-
 
-
 
1957
      end;
1919
      EnemyAdventTable[act].x := act*30 + random(85-(lev+(random(lev))*2)){O_o};
1958
      e.x := act*30 + random(85-(lev+(random(lev))*2)){O_o};
1920
      EnemyAdventTable[act].y := random(dxdraw.surfaceheight);
1959
      e.y := random(dxdraw.surfaceheight);
1921
      if (EnemyAdventTable[act].spriteClass <> TEnemyMeteor) and (EnemyAdventTable[act].spriteClass <> TEnemyAttacker2) then EnemyAdventTable[act].lifes := random(lev)+1;
1960
      if e.spriteClass = TEnemyAttacker2 then
-
 
1961
      begin
1922
      if EnemyAdventTable[act].spriteClass = TEnemyAttacker2 then EnemyAdventTable[act].lifes := random(6)+1{O_o};
1962
        e.lifes := random(6)+1{O_o};
-
 
1963
      end
-
 
1964
      else
-
 
1965
      begin
-
 
1966
        e.lifes := random(lev)+1;
-
 
1967
      end;
-
 
1968
 
-
 
1969
      EnemyAdventTable[act] := e;
1923
    end;
1970
    end;
1924
    EnemyAdventTable[lev*75].spriteClass := TEnemyBoss;
1971
    e.spriteClass := TEnemyBoss;
1925
    EnemyAdventTable[lev*75].x := lev*75*30{O_o} div lev;
1972
    e.x := lev*75*30{O_o} div lev;
1926
    EnemyAdventTable[lev*75].y := (dxdraw.surfaceheight div 2) - (MainForm.ImageList.Items.Find('Enemy-boss').height div 2);
1973
    e.y := (dxdraw.surfaceheight div 2) - (MainForm.ImageList.Items.Find('Enemy-boss').height div 2);
1927
    EnemyAdventTable[lev*75].lifes := lev*5;
1974
    e.lifes := lev*5;
1928
    inc(FRestEnemys);
1975
    EnemyAdventTable[lev*ADDITIONAL_ENEMIES_PER_LEVEL] := e;
1929
  end
1976
  end
1930
  else
1977
  else
1931
  begin
1978
  begin
1932
    enemys[1] := TEnemyAttacker;
1979
    Enemies[1] := TEnemyAttacker;
1933
    enemys[2] := TEnemyAttacker2;
1980
    Enemies[2] := TEnemyAttacker2;
1934
    enemys[3] := TEnemyAttacker3;
1981
    Enemies[3] := TEnemyAttacker3;
1935
    enemys[4] := TEnemyMeteor;
1982
    Enemies[4] := TEnemyMeteor;
1936
    enemys[5] := TEnemyUFO;
1983
    Enemies[5] := TEnemyUFO;
1937
    enemys[6] := TEnemyUFO2;
1984
    Enemies[6] := TEnemyUFO2;
1938
    enemys[7] := TEnemyBoss;
1985
    Enemies[7] := TEnemyBoss;
1939
    if fileexists(FDirectory+'Levels\Level '+inttostr(lev)+'.lev') then
1986
    if fileexists(GetLevelFileName(lev)) then
1940
    begin
1987
    begin
1941
      levact := 0;
-
 
1942
      assignfile(filex, FDirectory+'Levels\Level '+inttostr(lev)+'.lev');
1988
      assignfile(filex, GetLevelFileName(lev));
1943
      reset(filex);
1989
      reset(filex);
-
 
1990
      try
-
 
1991
        readln(filex, ergebniss);
-
 
1992
        Assert(ergebniss = '; SpaceMission '+FCompVersion);
-
 
1993
        readln(filex, ergebniss);
-
 
1994
        Assert(ergebniss = '; LEV-File');
-
 
1995
 
-
 
1996
        readln(filex); // Länge der Karte
-
 
1997
 
1944
      while not seekEoF(filex) do
1998
        while not seekEoF(filex) do
1945
      begin
1999
        begin
1946
        if levact = 0 then
-
 
1947
        begin
-
 
1948
          readln(filex, ergebniss);
2000
          readln(filex, ergebniss);
1949
          if ergebniss <> '; SpaceMission '+FCompVersion then
2001
          e.spriteClass := Enemies[strtoint(ergebniss)];
1950
          begin
-
 
1951
            showmessage(Format(LNG_LEVEL_INVALID, [lev]));
-
 
1952
            application.terminate;
-
 
1953
            exit;
-
 
1954
          end;
-
 
1955
          readln(filex, ergebniss);
2002
          readln(filex, ergebniss);
1956
          if ergebniss <> '; LEV-File' then
-
 
1957
          begin
-
 
1958
            showmessage(Format(LNG_LEVEL_INVALID, [lev]));
-
 
1959
            application.terminate;
2003
          e.x := strtoint(ergebniss);
1960
            exit;
-
 
1961
          end;
-
 
1962
          readln(filex);
-
 
1963
        end;
-
 
1964
        inc(levact);
-
 
1965
        readln(filex, ergebniss);
2004
          readln(filex, ergebniss);
1966
        if levact = 5 then levact := 1;
2005
          e.y := strtoint(ergebniss);
1967
        if levact = 1 then
-
 
1968
        begin
-
 
1969
          inc(pos[levact]);
-
 
1970
          inc(FRestEnemys);
2006
          readln(filex, ergebniss);
1971
          EnemyAdventTable[pos[levact]].spriteClass := enemys[strtoint(ergebniss)];
-
 
1972
        end;
-
 
1973
        if levact = 2 then
-
 
1974
        begin
-
 
1975
          inc(pos[levact]);
-
 
1976
          EnemyAdventTable[pos[levact]].x := strtoint(ergebniss);
2007
          e.lifes := strtoint(ergebniss);
1977
        end;
2008
 
1978
        if levact = 3 then
-
 
1979
        begin
-
 
1980
          inc(pos[levact]);
2009
          inc(FRestEnemies);
1981
          EnemyAdventTable[pos[levact]].y := strtoint(ergebniss);
2010
          SetLength(EnemyAdventTable, FRestEnemies);
1982
        end;
-
 
1983
        if levact = 4 then
-
 
1984
        begin
-
 
1985
          inc(pos[levact]);
-
 
1986
          EnemyAdventTable[pos[levact]].lifes := strtoint(ergebniss);
2011
          EnemyAdventTable[FRestEnemies-1] := e;
1987
        end;
2012
        end;
-
 
2013
      except
-
 
2014
        showmessage(Format(LNG_LEVEL_INVALID, [lev]));
-
 
2015
        DeleteArray;
1988
      end;
2016
      end;
1989
      closefile(filex);
2017
      closefile(filex);
1990
    end;
2018
    end;
1991
  end;
2019
  end;
-
 
2020
  Assert(FRestEnemies = Length(EnemyAdventTable));
1992
end;
2021
end;
1993
 
2022
 
1994
procedure TMainForm.SceneTitle;
2023
procedure TMainForm.SceneTitle;
1995
var
2024
var
1996
  Logo: TPictureCollectionItem;
2025
  Logo: TPictureCollectionItem;
Line 2046... Line 2075...
2046
  end;
2075
  end;
2047
  // Weiter mit Leertaste oder Enter
2076
  // Weiter mit Leertaste oder Enter
2048
  if (isButton1 in DXInput.States) or (isButton2 in DXInput.States) then
2077
  if (isButton1 in DXInput.States) or (isButton2 in DXInput.States) then
2049
  begin
2078
  begin
2050
    FLevel := 1;
2079
    FLevel := 1;
2051
    if ((FMenuItem=1) and (fileexists(FDirectory+'Levels\Level '+inttostr(FLevel)+'.lev')=false)) or ((FMenuItem=2) and (FLevel > 20)) then
2080
    if ((FMenuItem=1) and not fileexists(GetLevelFileName(FLevel))) or ((FMenuItem=2) and (FLevel > 20)) then
2052
    begin
2081
    begin
2053
      //PlaySound('Frage', False);
2082
      //PlaySound('Frage', False);
2054
      exit;
2083
      exit;
2055
    end;
2084
    end;
2056
    NewLevel(FLevel);
2085
    NewLevel(FLevel);
Line 2063... Line 2092...
2063
 
2092
 
2064
procedure TMainForm.SceneMain;
2093
procedure TMainForm.SceneMain;
2065
var
2094
var
2066
  Enemy: TSprite;
2095
  Enemy: TSprite;
2067
begin
2096
begin
-
 
2097
  case FInterval of
2068
  if FInterval = giLeicht then SpriteEngine.Move(conleicht);
2098
    giMittel: SpriteEngine.Move(conleicht);
2069
  if FInterval = giMittel then SpriteEngine.Move(conmittel);
2099
    giLeicht: SpriteEngine.Move(conmittel);
2070
  if FInterval = giSchwer then SpriteEngine.Move(conschwer);
2100
    giSchwer: SpriteEngine.Move(conschwer);
2071
  if FInterval = giMaster then SpriteEngine.Move(conmaster);
2101
    giMaster: SpriteEngine.Move(conmaster);
-
 
2102
  end;
2072
  SpriteEngine.Dead;
2103
  SpriteEngine.Dead;
2073
  while (Low(EnemyAdventTable)<=FEnemyAdventPos) and
2104
  while (FEnemyAdventPos >= Low(EnemyAdventTable)) and
2074
    (FEnemyAdventPos<=High(EnemyAdventTable)) and
2105
    (FEnemyAdventPos <= High(EnemyAdventTable)) and
2075
    ((EnemyAdventTable[FEnemyAdventPos].x / 4)<=FFrame) and
2106
    ((EnemyAdventTable[FEnemyAdventPos].x / 4) <= FFrame) and
2076
    (FRestEnemys>0) do
2107
    (FRestEnemies > 0) do
2077
  begin
-
 
2078
    if EnemyAdventTable[FEnemyAdventPos].spriteClass <> TNothing then
-
 
2079
    begin
2108
  begin
-
 
2109
    Dec(FRestEnemies);
2080
      with EnemyAdventTable[FEnemyAdventPos] do
2110
    with EnemyAdventTable[FEnemyAdventPos] do
2081
      begin
2111
    begin
2082
        Enemy := spriteClass.Create(SpriteEngine.Engine);
2112
      Enemy := spriteClass.Create(SpriteEngine.Engine, lifes);
2083
        Enemy.x := dxdraw.surfacewidth;
2113
      Enemy.x := dxdraw.surfacewidth;
2084
        //Enemy.y := y;
2114
      //Enemy.y := y;
-
 
2115
      if y <> 0 then
2085
        if y <> 0 then Enemy.y := dxdraw.surfaceheight / (480{maximale Bandbreite im alten Format} / y)
2116
        Enemy.y := dxdraw.surfaceheight / (480{maximale Bandbreite im alten Format} / y)
2086
          else Enemy.y := 0;
2117
      else
2087
      end;
2118
        Enemy.y := 0;
2088
    end;
2119
    end;
2089
    Inc(FEnemyAdventPos);
2120
    Inc(FEnemyAdventPos);
2090
  end;
2121
  end;
2091
  Inc(FFrame);
2122
  Inc(FFrame);
2092
  DXDraw.Surface.Fill(0);
2123
  DXDraw.Surface.Fill(0);
Line 2141... Line 2172...
2141
            Font.Color := clFuchsia;
2172
            Font.Color := clFuchsia;
2142
            Textout(450, 440, 'Einheiten: ' + IntToStr(RestlicheEinheiten));
2173
            Textout(450, 440, 'Einheiten: ' + IntToStr(RestlicheEinheiten));
2143
          end;}
2174
          end;}
2144
        if BossExists and (FBossLife>0) then
2175
        if BossExists and (FBossLife>0) then
2145
        begin
2176
        begin
2146
          if (FRestEnemys>0) then
2177
          if (FRestEnemies>0) then
2147
          begin
2178
          begin
2148
            Font.Color := clGreen;
2179
            Font.Color := clGreen;
2149
            Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-81, 'Boss: ' + IntToStr(FBossLife));
2180
            Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-81, 'Boss: ' + IntToStr(FBossLife));
2150
            Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemys));
2181
            Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemies));
2151
            Font.Color := clLime;
2182
            Font.Color := clLime;
2152
            Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-80, 'Boss: ' + IntToStr(FBossLife));
2183
            Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-80, 'Boss: ' + IntToStr(FBossLife));
2153
            Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys));
2184
            Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemies));
2154
          end;
2185
          end;
2155
          if (FRestEnemys<1) then
2186
          if (FRestEnemies<1) then
2156
          begin
2187
          begin
2157
            Font.Color := clGreen;
2188
            Font.Color := clGreen;
2158
            Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Boss: ' + IntToStr(FBossLife));
2189
            Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Boss: ' + IntToStr(FBossLife));
2159
            Font.Color := clLime;
2190
            Font.Color := clLime;
2160
            Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Boss: ' + IntToStr(FBossLife));
2191
            Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Boss: ' + IntToStr(FBossLife));
2161
          end;
2192
          end;
2162
        end;
2193
        end;
2163
        if (FRestEnemys>0) and not Bossexists then
2194
        if (FRestEnemies>0) and not Bossexists then
2164
        begin
2195
        begin
2165
          Font.Color := clGreen;
2196
          Font.Color := clGreen;
2166
          Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemys));
2197
          Textout(dxdraw.surfacewidth-191, dxdraw.surfaceheight-41, 'Einheiten: ' + IntToStr(FRestEnemies));
2167
          Font.Color := clLime;
2198
          Font.Color := clLime;
2168
          Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemys));
2199
          Textout(dxdraw.surfacewidth-190, dxdraw.surfaceheight-40, 'Einheiten: ' + IntToStr(FRestEnemies));
2169
        end;
2200
        end;
2170
        Release;
2201
        Release;
2171
      end;
2202
      end;
2172
    end
2203
    end
2173
    else
2204
    else
Line 2176... Line 2207...
2176
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission gescheitert!');
2207
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission gescheitert!');
2177
      DXDraw.Surface.Canvas.Font.Color := clLime;
2208
      DXDraw.Surface.Canvas.Font.Color := clLime;
2178
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission gescheitert!');
2209
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission gescheitert!');
2179
      DXDraw.Surface.Canvas.Release;
2210
      DXDraw.Surface.Canvas.Release;
2180
    end;
2211
    end;
2181
    if FRestEnemys<0 then FRestEnemys := 0; //Muss das sein?
-
 
2182
    if (Ec=0) and (FRestEnemys=0){ and (SpielerFliegtFort = false)}
2212
    if (EnemyCounter=0) and (FRestEnemies=0){ and (SpielerFliegtFort = false)}
2183
    and ((BossExists and (FBossLife=0)) or not BossExists) then
2213
    and ((BossExists and (FBossLife=0)) or not BossExists) then
2184
    begin
2214
    begin
2185
      DXDraw.Surface.Canvas.Font.Color := clGreen;
2215
      DXDraw.Surface.Canvas.Font.Color := clGreen;
2186
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission erfolgreich!');
2216
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-251, dxdraw.surfaceheight-41, 'Mission erfolgreich!');
2187
      DXDraw.Surface.Canvas.Font.Color := clLime;
2217
      DXDraw.Surface.Canvas.Font.Color := clLime;
Line 2349... Line 2379...
2349
  if X < -Width then Dead;
2379
  if X < -Width then Dead;
2350
end;
2380
end;
2351
 
2381
 
2352
procedure TEnemyMeteor.HitEnemy(ADead: Boolean);
2382
procedure TEnemyMeteor.HitEnemy(ADead: Boolean);
2353
begin
2383
begin
-
 
2384
  inherited HitEnemy(False);
-
 
2385
 
2354
  if ADead then Collisioned := True;
2386
  if ADead then Collisioned := True;
2355
  MainForm.PlaySound('Hit', False);
-
 
2356
end;
2387
end;
2357
 
2388
 
2358
{procedure TMainForm.StopMusic;
2389
{procedure TMainForm.StopMusic;
2359
begin
2390
begin
2360
  PauseMusic(FMusic);
2391
  PauseMusic(FMusic);
Line 2375... Line 2406...
2375
    MCISendString(pchar('play "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
2406
    MCISendString(pchar('play "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
2376
  if Name = mtTitle then
2407
  if Name = mtTitle then
2377
    MCISendString(pchar('play "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
2408
    MCISendString(pchar('play "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
2378
end;
2409
end;
2379
 
2410
 
2380
constructor TEnemyMeteor.Create(AParent: TSprite);
2411
constructor TEnemyMeteor.Create(AParent: TSprite; ALifes: integer);
2381
begin
2412
begin
2382
  inherited Create(AParent);
2413
  inherited Create(AParent, ALifes);
2383
  Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
2414
  Image := MainForm.ImageList.Items.Find('Enemy-Meteor');
2384
  Width := Image.Width;
2415
  Width := Image.Width;
2385
  Height := Image.Height;
2416
  Height := Image.Height;
2386
  AnimCount := Image.PatternCount;
2417
  AnimCount := Image.PatternCount;
2387
  AnimLooped := True;
2418
  AnimLooped := True;
Line 2397... Line 2428...
2397
procedure TMainForm.NeustartClick(Sender: TObject);
2428
procedure TMainForm.NeustartClick(Sender: TObject);
2398
begin
2429
begin
2399
  FLife := Lives;
2430
  FLife := Lives;
2400
  FLevel := 1; // ???
2431
  FLevel := 1; // ???
2401
  FScore := 0;
2432
  FScore := 0;
2402
  ec := 0;
2433
  EnemyCounter := 0;
2403
  StartScene(gsMain);
2434
  StartScene(gsMain);
2404
  PlayMusic(mtGame);
2435
  PlayMusic(mtGame);
2405
end;
2436
end;
2406
 
2437
 
2407
procedure TMainForm.OptionBreitbildClick(Sender: TObject);
2438
procedure TMainForm.OptionBreitbildClick(Sender: TObject);
Line 2432... Line 2463...
2432
  writeoptions;
2463
  writeoptions;
2433
end;
2464
end;
2434
 
2465
 
2435
procedure TMainForm.FormShow(Sender: TObject);
2466
procedure TMainForm.FormShow(Sender: TObject);
2436
begin
2467
begin
-
 
2468
  if Assigned(SplashForm) then
-
 
2469
  begin
2437
  SplashForm.Hide;
2470
    SplashForm.Hide;
2438
  SplashForm.Free;
2471
    FreeAndNil(SplashForm);
-
 
2472
  end;
2439
 
2473
 
2440
  dxtimer.Enabled := true;
2474
  dxtimer.Enabled := true;
2441
  dxtimer.ActiveOnly := true;
2475
  dxtimer.ActiveOnly := true;
2442
end;
2476
end;
2443
 
2477
 
Line 2462... Line 2496...
2462
  DXTimer.Enabled := False;
2496
  DXTimer.Enabled := False;
2463
end;
2497
end;
2464
 
2498
 
2465
procedure TMainForm.FormDestroy(Sender: TObject);
2499
procedure TMainForm.FormDestroy(Sender: TObject);
2466
begin
2500
begin
2467
  imagelist.free;
2501
  imagelist.Free;
2468
  spriteengine.free;
2502
  spriteengine.Free;
2469
  dxdraw.Free;
2503
  dxdraw.Free;
2470
  wavelist.free;
2504
  wavelist.Free;
2471
  dxsound.free;
2505
  dxsound.Free;
2472
  //dxinput.free;
2506
  //dxinput.Free;
2473
  dxtimer.Free;
2507
  dxtimer.Free;
-
 
2508
  DeleteCriticalSection(TimerCS);
2474
end;
2509
end;
2475
 
2510
 
2476
end.
2511
end.
2477
 
2512