Subversion Repositories spacemission

Rev

Rev 6 | Rev 11 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6 Rev 7
1
unit GamMain;
1
unit GamMain;
2
 
2
 
3
interface
3
interface
4
 
4
 
5
uses
5
uses
6
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem, Dialogs,
6
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, MMSystem, Dialogs,
7
  StdCtrls, ExtCtrls, Menus, DIB, DXClass, DXSprite, DXDraws, DXInput, DXSounds,
7
  StdCtrls, ExtCtrls, Menus, DIB, DXClass, DXSprite, DXDraws, DXInput, DXSounds,
8
  INIFiles, ShellAPI, wininet{$IF CompilerVersion >= 23.0}, Winapi.DirectDraw,
8
  INIFiles, ShellAPI, wininet{$IF CompilerVersion >= 23.0}, Winapi.DirectDraw,
9
  System.UITypes{$ELSE}, DirectX{$IFEND};
9
  System.UITypes{$ELSE}, DirectX{$IFEND};
10
 
10
 
11
type
11
type
12
  TGameScene = (
12
  TGameScene = (
13
    gsNone,
13
    gsNone,
14
    gsTitle,
14
    gsTitle,
15
    gsMain,
15
    gsMain,
16
    gsGameOver,
16
    gsGameOver,
17
    gsNewLevel,
17
    gsNewLevel,
18
    gsWin
18
    gsWin
19
  );
19
  );
20
 
20
 
21
  TGameInterval = (
21
  TGameInterval = (
22
    giMittel,
22
    giMittel,
23
    giLeicht,
23
    giLeicht,
24
    giSchwer,
24
    giSchwer,
25
    giMaster
25
    giMaster
26
  );
26
  );
27
 
27
 
28
  TMusicTrack = (
28
  TMusicTrack = (
29
    mtNone,
29
    mtNone,
30
    mtGame,
30
    mtGame,
31
    mtBoss,
31
    mtBoss,
32
    mtScene,
32
    mtScene,
33
    mtTitle
33
    mtTitle
34
  );
34
  );
35
 
35
 
36
  {TSoundFile = (
36
  {TSoundFile = (
37
    sfNone,
37
    sfNone,
38
    sfSceneMov,
38
    sfSceneMov,
39
    sfExplosion,
39
    sfExplosion,
40
    sfHit,
40
    sfHit,
41
    sfShoot,
41
    sfShoot,
42
    sfDanger,
42
    sfDanger,
43
    sfEnde,
43
    sfEnde,
44
    sfFrage,
44
    sfFrage,
45
    sfLevIntro
45
    sfLevIntro
46
  );}
46
  );}
47
 
47
 
48
  TBackground = class(TBackgroundSprite)
48
  TBackground = class(TBackgroundSprite)
49
  private
49
  private
50
    FSpeed: Double;
50
    FSpeed: Double;
51
  protected
51
  protected
52
    procedure DoMove(MoveCount: Integer); override;
52
    procedure DoMove(MoveCount: Integer); override;
53
  end;
53
  end;
54
 
54
 
55
  TBackgroundSpecial = class(TBackgroundSprite)
55
  TBackgroundSpecial = class(TBackgroundSprite)
56
  private
56
  private
57
    FSpeed: Double;
57
    FSpeed: Double;
58
  protected
58
  protected
59
    procedure DoMove(MoveCount: Integer); override;
59
    procedure DoMove(MoveCount: Integer); override;
60
  end;
60
  end;
61
 
61
 
62
  TExplosion = class(TImageSprite)
62
  TExplosion = class(TImageSprite)
63
  private
63
  private
64
    FCounter: Integer;
64
    FCounter: Integer;
65
  protected
65
  protected
66
    procedure DoMove(MoveCount: Integer); override;
66
    procedure DoMove(MoveCount: Integer); override;
67
  public
67
  public
68
    constructor Create(AParent: TSprite); override;
68
    constructor Create(AParent: TSprite); override;
69
  end;
69
  end;
70
 
70
 
71
  TPlayerSprite = class(TImageSprite)
71
  TPlayerSprite = class(TImageSprite)
72
  private
72
  private
73
    FCounter: Integer;
73
    FCounter: Integer;
74
    FMode: Integer;
74
    FMode: Integer;
75
    FTamaCount: Integer;
75
    FTamaCount: Integer;
76
    FOldTamaTime: Integer;
76
    FOldTamaTime: Integer;
77
  protected
77
  protected
78
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
78
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
79
    procedure DoMove(MoveCount: Integer); override;
79
    procedure DoMove(MoveCount: Integer); override;
80
  public
80
  public
81
    constructor Create(AParent: TSprite); override;
81
    constructor Create(AParent: TSprite); override;
82
    procedure FlyAway;
82
    procedure FlyAway;
83
  end;
83
  end;
84
 
84
 
85
  TTamaSprite = class(TImageSprite)
85
  TTamaSprite = class(TImageSprite)
86
  private
86
  private
87
    FPlayerSprite: TPlayerSprite;
87
    FPlayerSprite: TPlayerSprite;
88
  protected
88
  protected
89
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
89
    procedure DoCollision(Sprite: TSprite; var Done: Boolean); override;
90
    procedure DoMove(MoveCount: Integer); override;
90
    procedure DoMove(MoveCount: Integer); override;
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
111
    FPlayerSprite: TSprite;
112
    FPlayerSprite: TSprite;
112
  protected
113
  protected
113
    procedure DoMove(MoveCount: Integer); override;
114
    procedure DoMove(MoveCount: Integer); override;
114
  public
115
  public
115
    constructor Create(AParent: TSprite); override;
116
    constructor Create(AParent: TSprite); override;
116
  end;
117
  end;
117
 
118
 
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;
137
    FTamaCount: Integer;
138
    FTamaCount: Integer;
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;
157
    FTamaF: Integer;
158
    FTamaF: Integer;
158
    FTamaT: Integer;
159
    FTamaT: Integer;
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;
170
    FTamaCount: Integer;
171
    FTamaCount: Integer;
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;
182
    FTamaF: Integer;
183
    FTamaF: Integer;
183
    FTamaT: Integer;
184
    FTamaT: Integer;
184
    FPutTama: Boolean;
185
    FPutTama: Boolean;
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
 
204
  TMainForm = class(TDXForm)
201
  TMainForm = class(TDXForm)
205
    MainMenu: TMainMenu;
202
    MainMenu: TMainMenu;
206
    Spiel: TMenuItem;
203
    Spiel: TMenuItem;
207
    GameStart: TMenuItem;
204
    GameStart: TMenuItem;
208
    GamePause: TMenuItem;
205
    GamePause: TMenuItem;
209
    Beenden: TMenuItem;
206
    Beenden: TMenuItem;
210
    Einstellungen: TMenuItem;
207
    Einstellungen: TMenuItem;
211
    OptionFullScreen: TMenuItem;
208
    OptionFullScreen: TMenuItem;
212
    OptionMusic: TMenuItem;
209
    OptionMusic: TMenuItem;
213
    Leer2: TMenuItem;
210
    Leer2: TMenuItem;
214
    Leer4: TMenuItem;
211
    Leer4: TMenuItem;
215
    Hilfe: TMenuItem;
212
    Hilfe: TMenuItem;
216
    OptionSound: TMenuItem;
213
    OptionSound: TMenuItem;
217
    Leer3: TMenuItem;
214
    Leer3: TMenuItem;
218
    Spielstand: TMenuItem;
215
    Spielstand: TMenuItem;
219
    Leer5: TMenuItem;
216
    Leer5: TMenuItem;
220
    Neustart: TMenuItem;
217
    Neustart: TMenuItem;
221
    OptionBreitbild: TMenuItem;
218
    OptionBreitbild: TMenuItem;
222
    Spielgeschwindigkeit: TMenuItem;
219
    Spielgeschwindigkeit: TMenuItem;
223
    Leicht: TMenuItem;
220
    Leicht: TMenuItem;
224
    Mittel: TMenuItem;
221
    Mittel: TMenuItem;
225
    Schwer: TMenuItem;
222
    Schwer: TMenuItem;
226
    Informationen: TMenuItem;
223
    Informationen: TMenuItem;
227
    Leer6: TMenuItem;
224
    Leer6: TMenuItem;
228
    Leer1: TMenuItem;
225
    Leer1: TMenuItem;
229
    Cheat: TMenuItem;
226
    Cheat: TMenuItem;
230
    CheckUpdates: TMenuItem;
227
    CheckUpdates: TMenuItem;
231
    Master: TMenuItem;
228
    Master: TMenuItem;
232
    procedure DXDrawFinalize(Sender: TObject);
229
    procedure DXDrawFinalize(Sender: TObject);
233
    procedure DXDrawInitialize(Sender: TObject);
230
    procedure DXDrawInitialize(Sender: TObject);
234
    procedure FormCreate(Sender: TObject);
231
    procedure FormCreate(Sender: TObject);
235
    procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
232
    procedure DXTimerTimer(Sender: TObject; LagCount: Integer);
236
    procedure DXTimerActivate(Sender: TObject);
233
    procedure DXTimerActivate(Sender: TObject);
237
    procedure DXTimerDeactivate(Sender: TObject);
234
    procedure DXTimerDeactivate(Sender: TObject);
238
    procedure OptionFullScreenClick(Sender: TObject);
235
    procedure OptionFullScreenClick(Sender: TObject);
239
    procedure DXDrawInitializing(Sender: TObject);
236
    procedure DXDrawInitializing(Sender: TObject);
240
    procedure GameStartClick(Sender: TObject);
237
    procedure GameStartClick(Sender: TObject);
241
    procedure GamePauseClick(Sender: TObject);
238
    procedure GamePauseClick(Sender: TObject);
242
    procedure BeendenClick(Sender: TObject);
239
    procedure BeendenClick(Sender: TObject);
243
    procedure OptionSoundClick(Sender: TObject);
240
    procedure OptionSoundClick(Sender: TObject);
244
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
241
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
245
    procedure OptionMusicClick(Sender: TObject);
242
    procedure OptionMusicClick(Sender: TObject);
246
    procedure SpielstandClick(Sender: TObject);
243
    procedure SpielstandClick(Sender: TObject);
247
    procedure NeustartClick(Sender: TObject);
244
    procedure NeustartClick(Sender: TObject);
248
    procedure OptionBreitbildClick(Sender: TObject);
245
    procedure OptionBreitbildClick(Sender: TObject);
249
    procedure LeichtClick(Sender: TObject);
246
    procedure LeichtClick(Sender: TObject);
250
    procedure MittelClick(Sender: TObject);
247
    procedure MittelClick(Sender: TObject);
251
    procedure SchwerClick(Sender: TObject);
248
    procedure SchwerClick(Sender: TObject);
252
    procedure FormShow(Sender: TObject);
249
    procedure FormShow(Sender: TObject);
253
    procedure InformationenClick(Sender: TObject);
250
    procedure InformationenClick(Sender: TObject);
254
    procedure CheatClick(Sender: TObject);
251
    procedure CheatClick(Sender: TObject);
255
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
252
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
256
    procedure FormDestroy(Sender: TObject);
253
    procedure FormDestroy(Sender: TObject);
257
    procedure CheckUpdatesClick(Sender: TObject);
254
    procedure CheckUpdatesClick(Sender: TObject);
258
    procedure MasterClick(Sender: TObject);
255
    procedure MasterClick(Sender: TObject);
259
  private
256
  private
260
    ProgrammGestartet: boolean;
257
    ProgrammGestartet: boolean;
261
    FInterval: TGameInterval;
258
    FInterval: TGameInterval;
262
    FScene: TGameScene;
259
    FScene: TGameScene;
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;
273
    procedure SceneTitle;
271
    procedure SceneTitle;
274
    procedure EndSceneTitle;
272
    procedure EndSceneTitle;
275
    procedure StartSceneMain;
273
    procedure StartSceneMain;
276
    procedure SceneMain;
274
    procedure SceneMain;
277
    procedure EndSceneMain;
275
    procedure EndSceneMain;
278
    procedure StartSceneGameOver;
276
    procedure StartSceneGameOver;
279
    procedure SceneGameOver;
277
    procedure SceneGameOver;
280
    procedure EndSceneGameOver;
278
    procedure EndSceneGameOver;
281
    procedure StartSceneWin;
279
    procedure StartSceneWin;
282
    procedure SceneWin;
280
    procedure SceneWin;
283
    procedure EndSceneWin;
281
    procedure EndSceneWin;
284
    procedure StartSceneNewLevel;
282
    procedure StartSceneNewLevel;
285
    procedure SceneNewLevel;
283
    procedure SceneNewLevel;
286
    procedure EndSceneNewLevel;
284
    procedure EndSceneNewLevel;
287
  public
285
  public
288
    FNextScene: TGameScene;
286
    FNextScene: TGameScene;
289
    FScore: Integer;
287
    FScore: Integer;
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;
301
    dxsound: tdxsound;
299
    dxsound: tdxsound;
302
    wavelist: tdxwavelist;
300
    wavelist: tdxwavelist;
303
    dxinput: tdxinput;
301
    dxinput: tdxinput;
304
    dxtimer: tdxtimer;
302
    dxtimer: tdxtimer;
305
    { Level-Routinen }
303
    { Level-Routinen }
306
    procedure NewLevel(lev: integer);
304
    procedure NewLevel(lev: integer);
307
    procedure DeleteArray;
305
    procedure DeleteArray;
308
    { MCI-Routinen }
306
    { MCI-Routinen }
309
    function StatusMusic(Name: TMusicTrack): string;
307
    function StatusMusic(Name: TMusicTrack): string;
310
    procedure PlayMusic(Name: TMusicTrack);
308
    procedure PlayMusic(Name: TMusicTrack);
311
    //procedure StopMusic(Name: TMusicTrack);
309
    //procedure StopMusic(Name: TMusicTrack);
312
    procedure PauseMusic(Name: TMusicTrack);
310
    procedure PauseMusic(Name: TMusicTrack);
313
    procedure ResumeMusic(Name: TMusicTrack);
311
    procedure ResumeMusic(Name: TMusicTrack);
314
    procedure DestroyMusic(Name: TMusicTrack);
312
    procedure DestroyMusic(Name: TMusicTrack);
315
    procedure OpenMusic(Name: TMusicTrack);
313
    procedure OpenMusic(Name: TMusicTrack);
316
    { Sound-Routinen }
314
    { Sound-Routinen }
317
    function SoundKarte: boolean;
315
    function SoundKarte: boolean;
318
    procedure PlaySound(Name: string; Wait: Boolean);
316
    procedure PlaySound(Name: string; Wait: Boolean);
319
    { Initialisiations-Routinen }
317
    { Initialisiations-Routinen }
320
    procedure DXInit;
318
    procedure DXInit;
321
    procedure SoundInit;
319
    procedure SoundInit;
322
    procedure MusicInit;
320
    procedure MusicInit;
323
    { Einstellungs-Routinen }
321
    { Einstellungs-Routinen }
324
    procedure LoadOptions;
322
    procedure LoadOptions;
325
    procedure WriteOptions;
323
    procedure WriteOptions;
326
    { Farb-Routinen }
324
    { Farb-Routinen }
327
    function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
325
    function ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
328
    procedure PalleteAnim(Col: TRGBQuad; Time: Integer);
326
    procedure PalleteAnim(Col: TRGBQuad; Time: Integer);
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);
381
  Image := MainForm.ImageList.Items.Find('Machine');
376
  Image := MainForm.ImageList.Items.Find('Machine');
382
  Width := Image.Width;
377
  Width := Image.Width;
383
  Height := Image.Height;
378
  Height := Image.Height;
384
  X := -70{20};
379
  X := -70{20};
385
  Y := mainform.dxdraw.surfaceHeight / 2 - (height / 2);
380
  Y := mainform.dxdraw.surfaceHeight / 2 - (height / 2);
386
  Z := 2;
381
  Z := 2;
387
  AnimCount := Image.PatternCount;
382
  AnimCount := Image.PatternCount;
388
  AnimLooped := True;
383
  AnimLooped := True;
389
  AnimSpeed := DEFAULT_ANIMSPEED;
384
  AnimSpeed := DEFAULT_ANIMSPEED;
390
  FMode := PLAYER_MODE_ENTER;
385
  FMode := PLAYER_MODE_ENTER;
391
end;
386
end;
392
 
387
 
393
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
388
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean);
394
begin
389
begin
395
  if mainform.FCheat then exit;
390
  if mainform.FCheat then exit;
396
  if (Sprite is TEnemy) or (Sprite is TEnemyTama) then
391
  if (Sprite is TEnemy) or (Sprite is TEnemyTama) then
397
  begin
392
  begin
398
    if not crash then
393
    if not crash then
399
    begin
394
    begin
400
      dec(MainForm.FLife);
395
      dec(MainForm.FLife);
401
      Crash := true;
396
      Crash := true;
402
      if MainForm.Flife=0 then
397
      if MainForm.Flife=0 then
403
      begin
398
      begin
404
        MainForm.PlaySound('Explosion', false);
399
        MainForm.PlaySound('Explosion', false);
405
        Collisioned := false;
400
        Collisioned := false;
406
        FCounter := 0;
401
        FCounter := 0;
407
        FMode := PLAYER_MODE_DEAD;
402
        FMode := PLAYER_MODE_DEAD;
408
        Done := false;
403
        Done := false;
409
        Image := MainForm.ImageList.Items.Find('Explosion');
404
        Image := MainForm.ImageList.Items.Find('Explosion');
410
        Width := Image.Width;
405
        Width := Image.Width;
411
        Height := Image.Height;
406
        Height := Image.Height;
412
        AnimCount := Image.PatternCount;
407
        AnimCount := Image.PatternCount;
413
        AnimLooped := False;
408
        AnimLooped := False;
414
        AnimSpeed := DEFAULT_ANIMSPEED;
409
        AnimSpeed := DEFAULT_ANIMSPEED;
415
        AnimPos := 0;
410
        AnimPos := 0;
416
      end;
411
      end;
417
    end
412
    end
418
    else
413
    else
419
    begin
414
    begin
420
      if not crashsound then
415
      if not crashsound then
421
      begin
416
      begin
422
        MainForm.PlaySound('Hit', False);
417
        MainForm.PlaySound('Hit', False);
423
        crashsound := true;
418
        crashsound := true;
424
      end;
419
      end;
425
    end;
420
    end;
426
  end;
421
  end;
427
end;
422
end;
428
 
423
 
429
procedure TPlayerSprite.DoMove(MoveCount: Integer);
424
procedure TPlayerSprite.DoMove(MoveCount: Integer);
430
const
425
const
431
  WegduesKonstante = 1.75;
426
  WegduesKonstante = 1.75;
432
begin
427
begin
433
  inherited DoMove(MoveCount);
428
  inherited DoMove(MoveCount);
434
  if FMode=PLAYER_MODE_NORMAL then
429
  if FMode=PLAYER_MODE_NORMAL then
435
  begin
430
  begin
436
    if isUp in MainForm.DXInput.States then Y := Y - (250/1000)*MoveCount;
431
    if isUp in MainForm.DXInput.States then Y := Y - (250/1000)*MoveCount;
437
    if isDown in MainForm.DXInput.States then Y := Y + (250/1000)*MoveCount;
432
    if isDown in MainForm.DXInput.States then Y := Y + (250/1000)*MoveCount;
438
    if isLeft in MainForm.DXInput.States then X := X - (250/1000)*MoveCount;
433
    if isLeft in MainForm.DXInput.States then X := X - (250/1000)*MoveCount;
439
    if isRight in MainForm.DXInput.States then X := X + (250/1000)*MoveCount;
434
    if isRight in MainForm.DXInput.States then X := X + (250/1000)*MoveCount;
440
    if X<0 then X := 0;
435
    if X<0 then X := 0;
441
    if X>mainform.dxdraw.surfacewidth-Width then X := mainform.dxdraw.surfacewidth-Width;
436
    if X>mainform.dxdraw.surfacewidth-Width then X := mainform.dxdraw.surfacewidth-Width;
442
    if Y<0 then Y := 0;
437
    if Y<0 then Y := 0;
443
    if Y>mainform.dxdraw.surfaceheight-Height then Y := mainform.dxdraw.surfaceheight-Height;
438
    if Y>mainform.dxdraw.surfaceheight-Height then Y := mainform.dxdraw.surfaceheight-Height;
444
    if isButton1 in MainForm.DXInput.States then
439
    if isButton1 in MainForm.DXInput.States then
445
    begin
440
    begin
446
      if (FTamaCount<8) and (FCounter-FOldTamaTime>=100) then
441
      if (FTamaCount<8) and (FCounter-FOldTamaTime>=100) then
447
      begin
442
      begin
448
        Inc(FTamaCount);
443
        Inc(FTamaCount);
449
        with TTamaSprite.Create(Engine) do
444
        with TTamaSprite.Create(Engine) do
450
        begin
445
        begin
451
          FPlayerSprite := Self;
446
          FPlayerSprite := Self;
452
          X := Self.X+Self.Width;
447
          X := Self.X+Self.Width;
453
          Y := Self.Y+Self.Height div 2-Height div 2;
448
          Y := Self.Y+Self.Height div 2-Height div 2;
454
          Z := 10;
449
          Z := 10;
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
483
      Dead;
481
      Dead;
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);
495
end;
494
end;
496
 
495
 
497
procedure TPlayerSprite.FlyAway;
496
procedure TPlayerSprite.FlyAway;
498
begin
497
begin
499
  FMode := PLAYER_MODE_FLYAWAY;
498
  FMode := PLAYER_MODE_FLYAWAY;
500
end;
499
end;
501
 
500
 
502
procedure TMainForm.DXInit;
501
procedure TMainForm.DXInit;
503
begin
502
begin
504
  try
503
  try
505
    Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg');
504
    Imagelist.Items.LoadFromFile(FDirectory+'DirectX\Graphic.dxg');
506
    ImageList.Items.MakeColorTable;
505
    ImageList.Items.MakeColorTable;
507
    DXDraw.ColorTable := ImageList.Items.ColorTable;
506
    DXDraw.ColorTable := ImageList.Items.ColorTable;
508
    DXDraw.DefColorTable := ImageList.Items.ColorTable;
507
    DXDraw.DefColorTable := ImageList.Items.ColorTable;
509
    DXDraw.UpdatePalette;
508
    DXDraw.UpdatePalette;
510
    OptionBreitBild.enabled := OptionFullScreen.checked;
509
    OptionBreitBild.enabled := OptionFullScreen.checked;
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
522
    begin
522
    begin
523
      dxdraw.autosize := false;
523
      dxdraw.autosize := false;
524
      dxdraw.Top := 0;
524
      dxdraw.Top := 0;
525
      dxdraw.Left := 0;
525
      dxdraw.Left := 0;
526
      dxdraw.width := 640;    // TODO: besser die dimensionen des fensters
526
      dxdraw.width := 640;    // TODO: besser die dimensionen des fensters
527
      dxdraw.height := 480;
527
      dxdraw.height := 480;
528
      dxdraw.surfacewidth := 640;
528
      dxdraw.surfacewidth := 640;
529
      dxdraw.surfaceheight := 480;
529
      dxdraw.surfaceheight := 480;
530
    end
530
    end
531
    else dxdraw.autosize := true;
531
    else dxdraw.autosize := true;
532
    DXDraw.Initialize;
532
    DXDraw.Initialize;
533
  except
533
  except
534
    //Imagelist.Items.clear;
534
    //Imagelist.Items.clear;
535
    //application.terminate;
535
    //application.terminate;
536
  end;
536
  end;
537
end;
537
end;
538
 
538
 
539
constructor TTamaSprite.Create(AParent: TSprite);
539
constructor TTamaSprite.Create(AParent: TSprite);
540
begin
540
begin
541
  inherited Create(AParent);
541
  inherited Create(AParent);
542
  Image := MainForm.ImageList.Items.Find('Bounce');
542
  Image := MainForm.ImageList.Items.Find('Bounce');
543
  Z := 2;
543
  Z := 2;
544
  Width := Image.Width;
544
  Width := Image.Width;
545
  Height := Image.Height;
545
  Height := Image.Height;
546
  AnimCount := Image.PatternCount;
546
  AnimCount := Image.PatternCount;
547
  AnimLooped := True;
547
  AnimLooped := True;
548
  AnimSpeed := DEFAULT_ANIMSPEED;
548
  AnimSpeed := DEFAULT_ANIMSPEED;
549
  MainForm.PlaySound('Shoot', False);
549
  MainForm.PlaySound('Shoot', False);
550
end;
550
end;
551
 
551
 
552
destructor TTamaSprite.Destroy;
552
destructor TTamaSprite.Destroy;
553
begin
553
begin
554
  inherited Destroy;
554
  inherited Destroy;
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;
566
end;
566
end;
567
 
567
 
568
procedure TTamaSprite.DoMove(MoveCount: Integer);
568
procedure TTamaSprite.DoMove(MoveCount: Integer);
569
begin
569
begin
570
  inherited DoMove(MoveCount);
570
  inherited DoMove(MoveCount);
571
  X := X+(800/1000)*MoveCount;
571
  X := X+(800/1000)*MoveCount;
572
  if X>=mainform.dxdraw.surfacewidth then Dead;
572
  if X>=mainform.dxdraw.surfacewidth then Dead;
573
  Collision;
573
  Collision;
574
end;
574
end;
575
 
575
 
576
procedure TBackground.DoMove(MoveCount: Integer);
576
procedure TBackground.DoMove(MoveCount: Integer);
577
var
577
var
578
  ran: integer;
578
  ran: integer;
579
begin
579
begin
580
  inherited DoMove(MoveCount);
580
  inherited DoMove(MoveCount);
581
  X := X - MoveCount*(60/1000)*FSpeed;
581
  X := X - MoveCount*(60/1000)*FSpeed;
582
  randomize;
582
  randomize;
583
  ran := Random(1500);
583
  ran := Random(1500);
584
  if ran = 150 then
584
  if ran = 150 then
585
  begin
585
  begin
586
    with TBackgroundSpecial.Create(mainform.SpriteEngine.Engine) do
586
    with TBackgroundSpecial.Create(mainform.SpriteEngine.Engine) do
587
    begin
587
    begin
588
      SetMapSize(1, 1);
588
      SetMapSize(1, 1);
589
      Image := mainform.ImageList.Items.Find('Background-Planet1');
589
      Image := mainform.ImageList.Items.Find('Background-Planet1');
590
      Width := Image.Width;
590
      Width := Image.Width;
591
      Height := Image.Height;
591
      Height := Image.Height;
592
 
592
 
593
      Y := random(mainform.dxdraw.height);
593
      Y := random(mainform.dxdraw.height);
594
      X := mainform.dxdraw.width;
594
      X := mainform.dxdraw.width;
595
 
595
 
596
      ran := Random(2);
596
      ran := Random(2);
597
      if ran = 0 then
597
      if ran = 0 then
598
      begin
598
      begin
599
        Z := -20;
599
        Z := -20;
600
        FSpeed := 1.8;
600
        FSpeed := 1.8;
601
      end
601
      end
602
      else if ran = 1 then
602
      else if ran = 1 then
603
      begin
603
      begin
604
        Z := -40;
604
        Z := -40;
605
        FSpeed := 0.8;
605
        FSpeed := 0.8;
606
      end
606
      end
607
      else if ran = 2 then
607
      else if ran = 2 then
608
      begin
608
      begin
609
        Z := -60;
609
        Z := -60;
610
        FSpeed := 0.3;
610
        FSpeed := 0.3;
611
      end;
611
      end;
612
    end;
612
    end;
613
  end
613
  end
614
  else if ran = 500 then
614
  else if ran = 500 then
615
  begin
615
  begin
616
    with TBackgroundSpecial.Create(mainform.SpriteEngine.Engine) do
616
    with TBackgroundSpecial.Create(mainform.SpriteEngine.Engine) do
617
    begin
617
    begin
618
      SetMapSize(1, 1);
618
      SetMapSize(1, 1);
619
      ran := Random(4);
619
      ran := Random(4);
620
      if ran = 0 then
620
      if ran = 0 then
621
        Image := mainform.ImageList.Items.Find('Background-Red')
621
        Image := mainform.ImageList.Items.Find('Background-Red')
622
      else if ran = 1 then
622
      else if ran = 1 then
623
        Image := mainform.ImageList.Items.Find('Background-Blue')
623
        Image := mainform.ImageList.Items.Find('Background-Blue')
624
      else if ran = 2 then
624
      else if ran = 2 then
625
        Image := mainform.ImageList.Items.Find('Background-Yellow')
625
        Image := mainform.ImageList.Items.Find('Background-Yellow')
626
      else if ran = 3 then
626
      else if ran = 3 then
627
        Image := mainform.ImageList.Items.Find('Hintergrund-Rot');
627
        Image := mainform.ImageList.Items.Find('Hintergrund-Rot');
628
      Width := Image.Width;
628
      Width := Image.Width;
629
      Height := Image.Height;
629
      Height := Image.Height;
630
 
630
 
631
      Y := random(mainform.dxdraw.height);
631
      Y := random(mainform.dxdraw.height);
632
      X := mainform.dxdraw.width;
632
      X := mainform.dxdraw.width;
633
 
633
 
634
      { ran := Random(2);
634
      { ran := Random(2);
635
      if ran = 0 then
635
      if ran = 0 then
636
      begin
636
      begin
637
        Z := -20;
637
        Z := -20;
638
        FSpeed := 1.8;
638
        FSpeed := 1.8;
639
      end
639
      end
640
      else if ran = 1 then
640
      else if ran = 1 then
641
      begin
641
      begin
642
        Z := -40;
642
        Z := -40;
643
        FSpeed := 0.8;
643
        FSpeed := 0.8;
644
      end
644
      end
645
      else if ran = 2 then
645
      else if ran = 2 then
646
      begin }
646
      begin }
647
        Z := -60;
647
        Z := -60;
648
        FSpeed := 0.3;
648
        FSpeed := 0.3;
649
      { end; }
649
      { end; }
650
    end;
650
    end;
651
  end;
651
  end;
652
end;
652
end;
653
 
653
 
654
procedure TBackgroundSpecial.DoMove(MoveCount: Integer);
654
procedure TBackgroundSpecial.DoMove(MoveCount: Integer);
655
begin
655
begin
656
  inherited DoMove(MoveCount);
656
  inherited DoMove(MoveCount);
657
  X := X - MoveCount*(60/1000)*FSpeed;
657
  X := X - MoveCount*(60/1000)*FSpeed;
658
  if X<-Width then Dead;
658
  if X<-Width then Dead;
659
end;
659
end;
660
 
660
 
661
constructor TExplosion.Create(AParent: TSprite);
661
constructor TExplosion.Create(AParent: TSprite);
662
begin
662
begin
663
  inherited Create(AParent);
663
  inherited Create(AParent);
664
  mainform.PlaySound('Explosion', false);
664
  mainform.PlaySound('Explosion', false);
665
  Image := MainForm.ImageList.Items.Find('Explosion');
665
  Image := MainForm.ImageList.Items.Find('Explosion');
666
  Width := Image.Width;
666
  Width := Image.Width;
667
  Height := Image.Height;
667
  Height := Image.Height;
668
  AnimCount := Image.PatternCount;
668
  AnimCount := Image.PatternCount;
669
  AnimLooped := True;
669
  AnimLooped := True;
670
  AnimSpeed := DEFAULT_ANIMSPEED;
670
  AnimSpeed := DEFAULT_ANIMSPEED;
671
  AnimPos := Random(AnimCount);
671
  AnimPos := Random(AnimCount);
672
end;
672
end;
673
 
673
 
674
procedure TExplosion.DoMove(MoveCount: Integer);
674
procedure TExplosion.DoMove(MoveCount: Integer);
675
begin
675
begin
676
  inherited DoMove(MoveCount);
676
  inherited DoMove(MoveCount);
677
  inc(FCounter, MoveCount);
677
  inc(FCounter, MoveCount);
678
  if FCounter > 2999 then dead;
678
  if FCounter > 2999 then dead;
679
end;
679
end;
680
 
680
 
681
constructor TEnemyTama.Create(AParent: TSprite);
681
constructor TEnemyTama.Create(AParent: TSprite);
682
begin
682
begin
683
  inherited Create(AParent);
683
  inherited Create(AParent);
684
  Image := MainForm.ImageList.Items.Find('Bounce2');
684
  Image := MainForm.ImageList.Items.Find('Bounce2');
685
  Width := Image.Width;
685
  Width := Image.Width;
686
  Height := Image.Height;
686
  Height := Image.Height;
687
  AnimCount := Image.PatternCount;
687
  AnimCount := Image.PatternCount;
688
  AnimLooped := True;
688
  AnimLooped := True;
689
  AnimSpeed := DEFAULT_ANIMSPEED;
689
  AnimSpeed := DEFAULT_ANIMSPEED;
690
  MainForm.PlaySound('Shoot', False);
690
  MainForm.PlaySound('Shoot', False);
691
end;
691
end;
692
 
692
 
693
procedure TEnemyTama.DoMove(MoveCount: Integer);
693
procedure TEnemyTama.DoMove(MoveCount: Integer);
694
begin
694
begin
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
708
  else
708
  else
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);
765
begin
768
begin
766
  inherited DoMove(MoveCount);
769
  inherited DoMove(MoveCount);
767
  if FMode=0 then
770
  if FMode=0 then
768
  begin
771
  begin
769
    X := X - MoveCount*(300/1000);
772
    X := X - MoveCount*(300/1000);
770
    Y := Y + Cos256(FCounter div 15)*2;
773
    Y := Y + Cos256(FCounter div 15)*2;
771
    if X<-Width then Dead;
774
    if X<-Width then Dead;
772
    if FCounter-FOldTamaTime>=100 then
775
    if FCounter-FOldTamaTime>=100 then
773
    begin
776
    begin
774
      Inc(FTamaCount);
777
      Inc(FTamaCount);
775
      with TEnemyTama.Create(Engine) do
778
      with TEnemyTama.Create(Engine) do
776
      begin
779
      begin
777
        FPlayerSprite := Self;
780
        FPlayerSprite := Self;
778
        X := Self.X;
781
        X := Self.X;
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);
878
begin
883
begin
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
 
929
procedure TEnemyBoss.DoMove(MoveCount: Integer);
935
procedure TEnemyBoss.DoMove(MoveCount: Integer);
930
begin
936
begin
931
  inherited DoMove(MoveCount);
937
  inherited DoMove(MoveCount);
932
  if FMode=0 then
938
  if FMode=0 then
933
  begin
939
  begin
934
    if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/4)){450} then
940
    if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/4)){450} then
935
      X := X - MoveCount*(300/1000)
941
      X := X - MoveCount*(300/1000)
936
    else
942
    else
937
    begin
943
    begin
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
949
      begin
956
      begin
950
        with TEnemyTama.Create(Engine) do
957
        with TEnemyTama.Create(Engine) do
951
        begin
958
        begin
952
          FPlayerSprite := Self;
959
          FPlayerSprite := Self;
953
          Z := 1;
960
          Z := 1;
954
          X := Self.X-Width;
961
          X := Self.X-Width;
955
          Y := Self.Y+Self.Height div 2-Height div 2;
962
          Y := Self.Y+Self.Height div 2-Height div 2;
956
        end;
963
        end;
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;
978
      inc(waiter2);
987
      inc(waiter2);
979
      if waiter2 <= 20 then
988
      if waiter2 <= 20 then
980
      begin
989
      begin
981
        with TExplosion.Create(Engine) do
990
        with TExplosion.Create(Engine) do
982
        begin
991
        begin
983
          Z := 10;
992
          Z := 10;
984
          X := Self.X+Random(Self.Width)-16;
993
          X := Self.X+Random(Self.Width)-16;
985
          Y := Self.Y+Random(Self.Height)-16;
994
          Y := Self.Y+Random(Self.Height)-16;
986
        end;
995
        end;
987
      end
996
      end
988
      else
997
      else
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);
1037
begin
1047
begin
1038
  inherited DoMove(MoveCount);
1048
  inherited DoMove(MoveCount);
1039
  if FMode=0 then
1049
  if FMode=0 then
1040
  begin
1050
  begin
1041
    if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/2)){450} then
1051
    if X>((mainform.dxdraw.width/4) + (mainform.dxdraw.width/2) - (width/2)){450} then
1042
      X := X - MoveCount*(300/1000)
1052
      X := X - MoveCount*(300/1000)
1043
    else
1053
    else
1044
    begin
1054
    begin
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
1056
      begin
1067
      begin
1057
        with TEnemyTama.Create(Engine) do
1068
        with TEnemyTama.Create(Engine) do
1058
        begin
1069
        begin
1059
          FPlayerSprite := Self;
1070
          FPlayerSprite := Self;
1060
          Z := 1;
1071
          Z := 1;
1061
          X := Self.X-Width;
1072
          X := Self.X-Width;
1062
          Y := Self.Y+Self.Height div 2-Height div 2;
1073
          Y := Self.Y+Self.Height div 2-Height div 2;
1063
        end;
1074
        end;
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);
1109
begin
1123
begin
1110
  inherited DoMove(MoveCount);
1124
  inherited DoMove(MoveCount);
1111
  if FMode=0 then
1125
  if FMode=0 then
1112
  begin
1126
  begin
1113
    X := X - (250/1000)*MoveCount;
1127
    X := X - (250/1000)*MoveCount;
1114
    if X<-Width then Dead;
1128
    if X<-Width then Dead;
1115
    if FCounter-FOldTamaTime>=100 then
1129
    if FCounter-FOldTamaTime>=100 then
1116
    begin
1130
    begin
1117
      Inc(FTamaCount);
1131
      Inc(FTamaCount);
1118
      with TEnemyTama.Create(Engine) do
1132
      with TEnemyTama.Create(Engine) do
1119
      begin
1133
      begin
1120
        FPlayerSprite := Self;
1134
        FPlayerSprite := Self;
1121
        X := Self.X;
1135
        X := Self.X;
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;
1150
end;
1164
end;
1151
 
1165
 
1152
procedure TMainForm.FormCreate(Sender: TObject);
1166
procedure TMainForm.FormCreate(Sender: TObject);
1153
var
1167
var
1154
  Ergebnis: string;
1168
  Ergebnis: string;
1155
  daten: textfile;
1169
  daten: textfile;
1156
  ok: boolean;
1170
  ok: boolean;
1157
begin
1171
begin
1158
  { Beginne VCL-Ersatz }
1172
  { Beginne VCL-Ersatz }
1159
  dxtimer := tdxtimer.Create(self);
1173
  dxtimer := tdxtimer.Create(self);
1160
  dxtimer.Interval := 33;
1174
  dxtimer.Interval := 33;
1161
  dxtimer.OnActivate := DXTimerActivate;
1175
  dxtimer.OnActivate := DXTimerActivate;
1162
  dxtimer.OnDeactivate := DXTimerDeactivate;
1176
  dxtimer.OnDeactivate := DXTimerDeactivate;
1163
  dxtimer.OnTimer := DXTimerTimer;
1177
  dxtimer.OnTimer := DXTimerTimer;
1164
  dxtimer.ActiveOnly := false;
1178
  dxtimer.ActiveOnly := false;
1165
  dxtimer.Enabled := false;
1179
  dxtimer.Enabled := false;
1166
 
1180
 
1167
  dxdraw := tdxdraw.Create(self);
1181
  dxdraw := tdxdraw.Create(self);
1168
  dxdraw.Parent := self;
1182
  dxdraw.Parent := self;
1169
  dxdraw.Align := alClient;
1183
  dxdraw.Align := alClient;
1170
  dxdraw.Left := 0;
1184
  dxdraw.Left := 0;
1171
  dxdraw.Top := 0;
1185
  dxdraw.Top := 0;
1172
  dxdraw.Width := 640;
1186
  dxdraw.Width := 640;
1173
  dxdraw.Height := 480;
1187
  dxdraw.Height := 480;
1174
  dxdraw.AutoInitialize := False;
1188
  dxdraw.AutoInitialize := False;
1175
  dxdraw.AutoSize := False;
1189
  dxdraw.AutoSize := False;
1176
  dxdraw.Color := clBlack;
1190
  dxdraw.Color := clBlack;
1177
  dxdraw.Display.BitCount := 24;
1191
  dxdraw.Display.BitCount := 24;
1178
  dxdraw.Display.FixedBitCount := False;
1192
  dxdraw.Display.FixedBitCount := False;
1179
  dxdraw.Display.FixedRatio := False;
1193
  dxdraw.Display.FixedRatio := False;
1180
  dxdraw.Display.FixedSize := False;
1194
  dxdraw.Display.FixedSize := False;
1181
  dxdraw.Display.Height := 600;
1195
  dxdraw.Display.Height := 600;
1182
  dxdraw.Display.Width := 800;
1196
  dxdraw.Display.Width := 800;
1183
  dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, {doRetainedMode,} doHardware, doSelectDriver];
1197
  dxdraw.Options := [doAllowReboot, doWaitVBlank, doAllowPalette256, doCenter, {doRetainedMode,} doHardware, doSelectDriver];
1184
  dxdraw.TabOrder := 0;
1198
  dxdraw.TabOrder := 0;
1185
  dxdraw.Visible := true;
1199
  dxdraw.Visible := true;
1186
  dxdraw.OnFinalize := DXDrawFinalize;
1200
  dxdraw.OnFinalize := DXDrawFinalize;
1187
  dxdraw.OnInitialize := DXDrawInitialize;
1201
  dxdraw.OnInitialize := DXDrawInitialize;
1188
  dxdraw.OnInitializing := DXDrawInitializing;
1202
  dxdraw.OnInitializing := DXDrawInitializing;
1189
 
1203
 
1190
  dxsound := tdxsound.Create(self);
1204
  dxsound := tdxsound.Create(self);
1191
  dxsound.AutoInitialize := false;
1205
  dxsound.AutoInitialize := false;
1192
 
1206
 
1193
  dxinput := tdxinput.Create(self);
1207
  dxinput := tdxinput.Create(self);
1194
  dxinput.Joystick.ForceFeedback := true;
1208
  dxinput.Joystick.ForceFeedback := true;
1195
  dxinput.Keyboard.ForceFeedback := true;
1209
  dxinput.Keyboard.ForceFeedback := true;
1196
 
1210
 
1197
  wavelist := tdxwavelist.Create(self);
1211
  wavelist := tdxwavelist.Create(self);
1198
  wavelist.DXSound := dxsound;
1212
  wavelist.DXSound := dxsound;
1199
 
1213
 
1200
  imagelist := tdximagelist.create(self);
1214
  imagelist := tdximagelist.create(self);
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;
1211
  SoundInit;
1227
  SoundInit;
1212
  MusicInit;
1228
  MusicInit;
1213
  DeleteArray;
1229
  DeleteArray;
1214
  if (paramcount = 0) and (fileexists(paramstr(1))) then // (paramcount > 0)
1230
  if (paramcount = 0) and (fileexists(paramstr(1))) then // (paramcount > 0)
1215
  begin
1231
  begin
1216
    AssignFile(daten, paramstr(1));
1232
    AssignFile(daten, paramstr(1));
1217
    Reset(daten);
1233
    Reset(daten);
1218
    ok := true;
1234
    ok := true;
1219
    ReadLN(daten, Ergebnis);
1235
    ReadLN(daten, Ergebnis);
1220
    if Ergebnis <> '; SpaceMission '+ProgramVersion then ok := false;
1236
    if Ergebnis <> '; SpaceMission '+ProgramVersion then ok := false;
1221
    ReadLN(daten, Ergebnis);
1237
    ReadLN(daten, Ergebnis);
1222
    if ergebnis <> '; SAV-File' then ok := false;
1238
    if ergebnis <> '; SAV-File' then ok := false;
1223
    if not ok then
1239
    if not ok then
1224
    begin
1240
    begin
1225
      showmessage(FileError);
1241
      showmessage(FileError);
1226
      CloseFile(daten);
1242
      CloseFile(daten);
1227
      GameStartClick(GameStart);
1243
      GameStartClick(GameStart);
1228
      exit;
1244
      exit;
1229
    end;
1245
    end;
1230
    ReadLN(daten, mainform.FScore);
1246
    ReadLN(daten, mainform.FScore);
1231
    ReadLN(daten, mainform.FLife);
1247
    ReadLN(daten, mainform.FLife);
1232
    ReadLN(daten, mainform.Flevel);
1248
    ReadLN(daten, mainform.Flevel);
1233
    ReadLN(daten, mainform.FMenuItem);
1249
    ReadLN(daten, mainform.FMenuItem);
1234
    CloseFile(daten);
1250
    CloseFile(daten);
1235
    mainform.FNextScene := gsNewLevel;
1251
    mainform.FNextScene := gsNewLevel;
1236
    exit;
1252
    exit;
1237
  end;
1253
  end;
1238
  GameStartClick(GameStart);
1254
  GameStartClick(GameStart);
1239
end;
1255
end;
1240
 
1256
 
1241
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
1257
procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
1242
  Shift: TShiftState);
1258
  Shift: TShiftState);
1243
begin
1259
begin
1244
  if (ssAlt in Shift) and (Key=VK_RETURN) then
1260
  if (ssAlt in Shift) and (Key=VK_RETURN) then
1245
    OptionFullScreenClick(OptionFullScreen);
1261
    OptionFullScreenClick(OptionFullScreen);
1246
end;
1262
end;
1247
 
1263
 
1248
procedure TMainForm.GameStartClick(Sender: TObject);
1264
procedure TMainForm.GameStartClick(Sender: TObject);
1249
begin
1265
begin
1250
  StartScene(gsTitle);
1266
  StartScene(gsTitle);
1251
end;
1267
end;
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;
1263
var
1281
var
1264
  databuffer : array[0..4095] of char;
1282
  databuffer : array[0..4095] of char;
1265
  ResStr : string;
1283
  ResStr : string;
1266
  hSession, hfile: hInternet;
1284
  hSession, hfile: hInternet;
1267
  dwindex,dwcodelen,dwread,dwNumber: cardinal;
1285
  dwindex,dwcodelen,dwread,dwNumber: cardinal;
1268
  dwcode : array[1..20] of char;
1286
  dwcode : array[1..20] of char;
1269
  res    : pchar;
1287
  res    : pchar;
1270
  Str    : pchar;
1288
  Str    : pchar;
1271
begin
1289
begin
1272
  ResStr:='';
1290
  ResStr:='';
1273
  if system.pos('http://',lowercase(AUrl))=0 then
1291
  if system.pos('http://',lowercase(AUrl))=0 then
1274
     AUrl:='http://'+AUrl;
1292
     AUrl:='http://'+AUrl;
1275
 
1293
 
1276
  // Hinzugefügt
1294
  // Hinzugefügt
1277
  application.ProcessMessages;
1295
  application.ProcessMessages;
1278
 
1296
 
1279
  hSession:=InternetOpen('InetURL:/1.0',
1297
  hSession:=InternetOpen('InetURL:/1.0',
1280
                         INTERNET_OPEN_TYPE_PRECONFIG,
1298
                         INTERNET_OPEN_TYPE_PRECONFIG,
1281
                         nil,
1299
                         nil,
1282
                         nil,
1300
                         nil,
1283
                         0);
1301
                         0);
1284
  if assigned(hsession) then
1302
  if assigned(hsession) then
1285
  begin
1303
  begin
1286
    // Hinzugefügt
1304
    // Hinzugefügt
1287
    application.ProcessMessages;
1305
    application.ProcessMessages;
1288
 
1306
 
1289
    hfile:=InternetOpenUrl(
1307
    hfile:=InternetOpenUrl(
1290
           hsession,
1308
           hsession,
1291
           pchar(AUrl),
1309
           pchar(AUrl),
1292
           nil,
1310
           nil,
1293
           0,
1311
           0,
1294
           INTERNET_FLAG_RELOAD,
1312
           INTERNET_FLAG_RELOAD,
1295
           0);
1313
           0);
1296
    dwIndex  := 0;
1314
    dwIndex  := 0;
1297
    dwCodeLen := 10;
1315
    dwCodeLen := 10;
1298
 
1316
 
1299
    // Hinzugefügt
1317
    // Hinzugefügt
1300
    application.ProcessMessages;
1318
    application.ProcessMessages;
1301
 
1319
 
1302
    HttpQueryInfo(hfile,
1320
    HttpQueryInfo(hfile,
1303
                  HTTP_QUERY_STATUS_CODE,
1321
                  HTTP_QUERY_STATUS_CODE,
1304
                  @dwcode,
1322
                  @dwcode,
1305
                  dwcodeLen,
1323
                  dwcodeLen,
1306
                  dwIndex);
1324
                  dwIndex);
1307
    res := pchar(@dwcode);
1325
    res := pchar(@dwcode);
1308
    dwNumber := sizeof(databuffer)-1;
1326
    dwNumber := sizeof(databuffer)-1;
1309
    if (res ='200') or (res ='302') then
1327
    if (res ='200') or (res ='302') then
1310
    begin
1328
    begin
1311
      while (InternetReadfile(hfile,
1329
      while (InternetReadfile(hfile,
1312
                              @databuffer,
1330
                              @databuffer,
1313
                              dwNumber,
1331
                              dwNumber,
1314
                              DwRead)) do
1332
                              DwRead)) do
1315
      begin
1333
      begin
1316
 
1334
 
1317
        // Hinzugefügt
1335
        // Hinzugefügt
1318
        application.ProcessMessages;
1336
        application.ProcessMessages;
1319
 
1337
 
1320
        if dwRead =0 then
1338
        if dwRead =0 then
1321
          break;
1339
          break;
1322
        databuffer[dwread]:=#0;
1340
        databuffer[dwread]:=#0;
1323
        Str := pchar(@databuffer);
1341
        Str := pchar(@databuffer);
1324
        resStr := resStr + Str;
1342
        resStr := resStr + Str;
1325
      end;
1343
      end;
1326
    end
1344
    end
1327
    else
1345
    else
1328
      ResStr := 'Status:'+res;
1346
      ResStr := 'Status:'+res;
1329
    if assigned(hfile) then
1347
    if assigned(hfile) then
1330
      InternetCloseHandle(hfile);
1348
      InternetCloseHandle(hfile);
1331
  end;
1349
  end;
1332
 
1350
 
1333
  // Hinzugefügt
1351
  // Hinzugefügt
1334
  application.ProcessMessages;
1352
  application.ProcessMessages;
1335
 
1353
 
1336
  InternetCloseHandle(hsession);
1354
  InternetCloseHandle(hsession);
1337
  Result := resStr;
1355
  Result := resStr;
1338
end;
1356
end;
1339
 
1357
 
1340
procedure TMainForm.CheckUpdatesClick(Sender: TObject);
1358
procedure TMainForm.CheckUpdatesClick(Sender: TObject);
1341
var
1359
var
1342
  temp: string;
1360
  temp: string;
1343
begin
1361
begin
1344
  temp := GetHTML('http://www.viathinksoft.de/update/?id=spacemission');
1362
  temp := GetHTML('http://www.viathinksoft.de/update/?id=spacemission');
1345
  if copy(temp, 0, 7) = 'Status:' then
1363
  if copy(temp, 0, 7) = 'Status:' then
1346
  begin
1364
  begin
1347
    Application.MessageBox('Ein Fehler ist aufgetreten. Wahrscheinlich ist keine Internetverbindung aufgebaut, oder der der ViaThinkSoft-Server temporär offline.', 'Fehler', MB_OK + MB_ICONERROR)
1365
    Application.MessageBox('Ein Fehler ist aufgetreten. Wahrscheinlich ist keine Internetverbindung aufgebaut, oder der der ViaThinkSoft-Server temporär offline.', 'Fehler', MB_OK + MB_ICONERROR)
1348
  end
1366
  end
1349
  else
1367
  else
1350
  begin
1368
  begin
1351
    if GetHTML('http://www.viathinksoft.de/update/?id=spacemission') <> ProgramVersion then
1369
    if GetHTML('http://www.viathinksoft.de/update/?id=spacemission') <> ProgramVersion then
1352
    begin
1370
    begin
1353
      if Application.MessageBox('Eine neue Programmversion ist vorhanden. Möchten Sie diese jetzt herunterladen?', 'Information', MB_YESNO + MB_ICONASTERISK) = ID_YES then
1371
      if Application.MessageBox('Eine neue Programmversion ist vorhanden. Möchten Sie diese jetzt herunterladen?', 'Information', MB_YESNO + MB_ICONASTERISK) = ID_YES then
1354
        shellexecute(application.handle, 'open', pchar('http://www.viathinksoft.de/update/?id=@spacemission'), '', '', sw_normal);
1372
        shellexecute(application.handle, 'open', pchar('http://www.viathinksoft.de/update/?id=@spacemission'), '', '', sw_normal);
1355
    end
1373
    end
1356
    else
1374
    else
1357
    begin
1375
    begin
1358
      Application.MessageBox('Es ist keine neue Programmversion vorhanden.', 'Information', MB_OK + MB_ICONASTERISK);
1376
      Application.MessageBox('Es ist keine neue Programmversion vorhanden.', 'Information', MB_OK + MB_ICONASTERISK);
1359
    end;
1377
    end;
1360
  end;
1378
  end;
1361
end;
1379
end;
1362
 
1380
 
1363
procedure TMainForm.BeendenClick(Sender: TObject);
1381
procedure TMainForm.BeendenClick(Sender: TObject);
1364
begin
1382
begin
1365
  close;
1383
  close;
1366
end;
1384
end;
1367
 
1385
 
1368
procedure TMainForm.OptionFullScreenClick(Sender: TObject);
1386
procedure TMainForm.OptionFullScreenClick(Sender: TObject);
1369
begin
1387
begin
1370
  OptionFullScreen.Checked := not OptionFullScreen.Checked;
1388
  OptionFullScreen.Checked := not OptionFullScreen.Checked;
1371
  DXInit;
1389
  DXInit;
1372
  writeoptions;
1390
  writeoptions;
1373
end;
1391
end;
1374
 
1392
 
1375
procedure TMainForm.OptionSoundClick(Sender: TObject);
1393
procedure TMainForm.OptionSoundClick(Sender: TObject);
1376
begin
1394
begin
1377
  OptionSound.Checked := not OptionSound.Checked;
1395
  OptionSound.Checked := not OptionSound.Checked;
1378
  SoundInit;
1396
  SoundInit;
1379
  WriteOptions;
1397
  WriteOptions;
1380
end;
1398
end;
1381
 
1399
 
1382
procedure TMainForm.SoundInit;
1400
procedure TMainForm.SoundInit;
1383
begin
1401
begin
1384
  if OptionSound.Checked then
1402
  if OptionSound.Checked then
1385
  begin
1403
  begin
1386
    if not DXSound.Initialized then
1404
    if not DXSound.Initialized then
1387
    begin
1405
    begin
1388
      try
1406
      try
1389
        DXSound.Initialize;
1407
        DXSound.Initialize;
1390
        WaveList.Items.LoadFromFile(FDirectory+'DirectX\Sound.dxw');
1408
        WaveList.Items.LoadFromFile(FDirectory+'DirectX\Sound.dxw');
1391
      except
1409
      except
1392
        OptionSound.enabled := False;
1410
        OptionSound.enabled := False;
1393
        WaveList.items.clear;
1411
        WaveList.items.clear;
1394
      end;
1412
      end;
1395
    end;
1413
    end;
1396
  end
1414
  end
1397
  else DXSound.Finalize;
1415
  else DXSound.Finalize;
1398
end;
1416
end;
1399
 
1417
 
1400
procedure TMainForm.MusicInit;
1418
procedure TMainForm.MusicInit;
1401
begin
1419
begin
1402
  optionmusic.enabled := SoundKarte;
1420
  optionmusic.enabled := SoundKarte;
1403
end;
1421
end;
1404
 
1422
 
1405
procedure TMainForm.DestroyMusic(Name: TMusicTrack);
1423
procedure TMainForm.DestroyMusic(Name: TMusicTrack);
1406
begin
1424
begin
1407
  if Name = mtBoss then
1425
  if Name = mtBoss then
1408
  begin
1426
  begin
1409
    MCISendString(pchar('stop "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1427
    MCISendString(pchar('stop "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1410
    MCISendString(pchar('close "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1428
    MCISendString(pchar('close "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1411
  end;
1429
  end;
1412
  if Name = mtGame then
1430
  if Name = mtGame then
1413
  begin
1431
  begin
1414
    MCISendString(pchar('stop "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1432
    MCISendString(pchar('stop "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1415
    MCISendString(pchar('close "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1433
    MCISendString(pchar('close "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1416
  end;
1434
  end;
1417
  if Name = mtScene then
1435
  if Name = mtScene then
1418
  begin
1436
  begin
1419
    MCISendString(pchar('stop "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1437
    MCISendString(pchar('stop "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1420
    MCISendString(pchar('close "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1438
    MCISendString(pchar('close "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1421
  end;
1439
  end;
1422
  if Name = mtTitle then
1440
  if Name = mtTitle then
1423
  begin
1441
  begin
1424
    MCISendString(pchar('stop "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1442
    MCISendString(pchar('stop "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1425
    MCISendString(pchar('close "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1443
    MCISendString(pchar('close "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1426
  end;
1444
  end;
1427
end;
1445
end;
1428
 
1446
 
1429
procedure TMainForm.OpenMusic(Name: TMusicTrack);
1447
procedure TMainForm.OpenMusic(Name: TMusicTrack);
1430
begin
1448
begin
1431
  if Name = mtBoss then
1449
  if Name = mtBoss then
1432
    MCISendString(pchar('open "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1450
    MCISendString(pchar('open "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1433
  if Name = mtGame then
1451
  if Name = mtGame then
1434
    MCISendString(pchar('open "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1452
    MCISendString(pchar('open "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1435
  if Name = mtScene then
1453
  if Name = mtScene then
1436
    MCISendString(pchar('open "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1454
    MCISendString(pchar('open "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1437
  if Name = mtTitle then
1455
  if Name = mtTitle then
1438
    MCISendString(pchar('open "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1456
    MCISendString(pchar('open "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1439
end;
1457
end;
1440
 
1458
 
1441
procedure TMainForm.PauseMusic(Name: TMusicTrack);
1459
procedure TMainForm.PauseMusic(Name: TMusicTrack);
1442
begin
1460
begin
1443
  if not OptionMusic.checked then exit;
1461
  if not OptionMusic.checked then exit;
1444
  if Name = mtBoss then
1462
  if Name = mtBoss then
1445
    MCISendString(pchar('stop "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1463
    MCISendString(pchar('stop "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
1446
  if Name = mtGame then
1464
  if Name = mtGame then
1447
    MCISendString(pchar('stop "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1465
    MCISendString(pchar('stop "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
1448
  if Name = mtScene then
1466
  if Name = mtScene then
1449
    MCISendString(pchar('stop "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1467
    MCISendString(pchar('stop "'+FDirectory+'Musik\Scene.mid"'), nil, 255, 0);
1450
  if Name = mtTitle then
1468
  if Name = mtTitle then
1451
    MCISendString(pchar('stop "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1469
    MCISendString(pchar('stop "'+FDirectory+'Musik\Title.mid"'), nil, 255, 0);
1452
end;
1470
end;
1453
 
1471
 
1454
procedure TMainForm.DXDrawInitializing(Sender: TObject);
1472
procedure TMainForm.DXDrawInitializing(Sender: TObject);
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;
1466
 
1485
 
1467
procedure TMainForm.DXDrawInitialize(Sender: TObject);
1486
procedure TMainForm.DXDrawInitialize(Sender: TObject);
1468
begin
1487
begin
1469
  DXTimer.Enabled := True;
1488
  DXTimer.Enabled := True;
1470
end;
1489
end;
1471
 
1490
 
1472
procedure TMainForm.DXDrawFinalize(Sender: TObject);
1491
procedure TMainForm.DXDrawFinalize(Sender: TObject);
1473
begin
1492
begin
1474
  DXTimer.Enabled := False;
1493
  DXTimer.Enabled := False;
1475
end;
1494
end;
1476
 
1495
 
1477
procedure TMainForm.DXTimerActivate(Sender: TObject);
1496
procedure TMainForm.DXTimerActivate(Sender: TObject);
1478
begin
1497
begin
1479
  Caption := Application.Title;
1498
  Caption := Application.Title;
1480
  if not ProgrammGestartet then
1499
  if not ProgrammGestartet then
1481
  begin
1500
  begin
1482
    Programmgestartet := true;
1501
    Programmgestartet := true;
1483
    exit;
1502
    exit;
1484
  end;
1503
  end;
1485
  ResumeMusic(FMusic);
1504
  ResumeMusic(FMusic);
1486
end;
1505
end;
1487
 
1506
 
1488
procedure TMainForm.DXTimerDeactivate(Sender: TObject);
1507
procedure TMainForm.DXTimerDeactivate(Sender: TObject);
1489
begin
1508
begin
1490
  Caption := Application.Title + ' [Pause]';
1509
  Caption := Application.Title + ' [Pause]';
1491
  PauseMusic(FMusic);
1510
  PauseMusic(FMusic);
1492
end;
1511
end;
1493
 
1512
 
1494
function TMainForm.StatusMusic(Name: TMusicTrack): string;
1513
function TMainForm.StatusMusic(Name: TMusicTrack): string;
1495
var
1514
var
1496
  MCIStatus: array[0..255] of char;
1515
  MCIStatus: array[0..255] of char;
1497
begin
1516
begin
1498
  if not OptionMusic.checked then exit;
1517
  if not OptionMusic.checked then exit;
1499
  if FMusic = mtGame then
1518
  if FMusic = mtGame then
1500
    MCISendString(pchar('status "'+FDirectory+'Musik\Game.mid" mode'), MCIStatus, 255, 0);
1519
    MCISendString(pchar('status "'+FDirectory+'Musik\Game.mid" mode'), MCIStatus, 255, 0);
1501
  if FMusic = mtBoss then
1520
  if FMusic = mtBoss then
1502
    MCISendString(pchar('status "'+FDirectory+'Musik\Boss.mid" mode'), MCIStatus, 255, 0);
1521
    MCISendString(pchar('status "'+FDirectory+'Musik\Boss.mid" mode'), MCIStatus, 255, 0);
1503
  if FMusic = mtScene then
1522
  if FMusic = mtScene then
1504
    MCISendString(pchar('status "'+FDirectory+'Musik\Scene.mid" mode'), MCIStatus, 255, 0);
1523
    MCISendString(pchar('status "'+FDirectory+'Musik\Scene.mid" mode'), MCIStatus, 255, 0);
1505
  if FMusic = mtTitle then
1524
  if FMusic = mtTitle then
1506
    MCISendString(pchar('status "'+FDirectory+'Musik\Title.mid" mode'), MCIStatus, 255, 0);
1525
    MCISendString(pchar('status "'+FDirectory+'Musik\Title.mid" mode'), MCIStatus, 255, 0);
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);
1517
    if crash2=30 then
1538
      if crash2 = 30 then
1518
    begin
1539
      begin
1519
      Crash2 := 0;
1540
        Crash2 := 0;
1520
      crash := false;
1541
        crash := false;
1521
      crashsound := false;
1542
        crashsound := false;
1522
    end;
1543
      end;
1523
  end;
1544
    end;
1524
  if not DXDraw.CanDraw then exit;
1545
    if not DXDraw.CanDraw then exit;
1525
  DXInput.Update;
1546
    DXInput.Update;
1526
  case FScene of
1547
    case FScene of
1527
    gsTitle   : SceneTitle;
1548
      gsTitle   : SceneTitle;
1528
    gsMain    : SceneMain;
1549
      gsMain    : SceneMain;
1529
    gsGameOver: SceneGameOver;
1550
      gsGameOver: SceneGameOver;
1530
    gsWin     : SceneWin;
1551
      gsWin     : SceneWin;
1531
    gsNewLevel: SceneNewLevel;
1552
      gsNewLevel: SceneNewLevel;
1532
  end;
1553
    end;
1533
  if FNextScene<>gsNone then
1554
    if FNextScene<>gsNone then
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;
1544
  FBlinkTime := GetTickCount;
1568
  FBlinkTime := GetTickCount;
1545
end;
1569
end;
1546
 
1570
 
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)
1557
    else INIDatei.WriteBool('Settings', 'FullScreen', false);
1582
      else INIDatei.WriteBool('Settings', 'FullScreen', false);
1558
  if OptionBreitbild.checked then INIDatei.WriteBool('Settings', 'ScreenAutoSize', true)
1583
    if OptionBreitbild.checked then INIDatei.WriteBool('Settings', 'ScreenAutoSize', true)
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
1577
  begin
1605
    begin
1578
    FInterval := giLeicht;
1606
      FInterval := giLeicht;
1579
    Leicht.checked := true;
1607
      Leicht.checked := true;
1580
  end;
1608
    end;
1581
  if INIDatei.ReadInteger('Settings', 'Speed', 2) = 2 then
1609
    if INIDatei.ReadInteger('Settings', 'Speed', 2) = 2 then
1582
  begin
1610
    begin
1583
    FInterval := giMittel;
1611
      FInterval := giMittel;
1584
    Mittel.checked := true;
1612
      Mittel.checked := true;
1585
  end;
1613
    end;
1586
  if INIDatei.ReadInteger('Settings', 'Speed', 2) = 3 then
1614
    if INIDatei.ReadInteger('Settings', 'Speed', 2) = 3 then
1587
  begin
1615
    begin
1588
    FInterval := giSchwer;
1616
      FInterval := giSchwer;
1589
    Schwer.checked := true;
1617
      Schwer.checked := true;
1590
  end;
1618
    end;
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
1602
  if GetTickCount<>FBlinkTime then
1632
  if GetTickCount<>FBlinkTime then
1603
  begin
1633
  begin
1604
    FBlink := FBlink + (GetTickCount-FBlinkTime);
1634
    FBlink := FBlink + (GetTickCount-FBlinkTime);
1605
    FBlinkTime := GetTickCount;
1635
    FBlinkTime := GetTickCount;
1606
  end;
1636
  end;
1607
end;
1637
end;
1608
 
1638
 
1609
procedure TMainForm.PlaySound(Name: string; Wait: Boolean);
1639
procedure TMainForm.PlaySound(Name: string; Wait: Boolean);
1610
begin
1640
begin
1611
  if (OptionSound.Checked) and (OptionSound.Enabled) then
1641
  if (OptionSound.Checked) and (OptionSound.Enabled) then
1612
    WaveList.Items.Find(Name).Play(Wait);
1642
    WaveList.Items.Find(Name).Play(Wait);
1613
end;
1643
end;
1614
 
1644
 
1615
procedure TMainForm.PlayMusic(Name: TMusicTrack);
1645
procedure TMainForm.PlayMusic(Name: TMusicTrack);
1616
begin
1646
begin
1617
  if (not mainform.active) and (mainform.visible) then //1st Programmstart
1647
  if (not mainform.active) and (mainform.visible) then //1st Programmstart
1618
    exit;
1648
    exit;
1619
  if (OptionMusic.checked) and (OptionMusic.enabled) then
1649
  if (OptionMusic.checked) and (OptionMusic.enabled) then
1620
  begin
1650
  begin
1621
    DestroyMusic(FMusic);
1651
    DestroyMusic(FMusic);
1622
    OpenMusic(Name);
1652
    OpenMusic(Name);
1623
    ResumeMusic(Name);
1653
    ResumeMusic(Name);
1624
  end;
1654
  end;
1625
  FMusic := Name;
1655
  FMusic := Name;
1626
end;
1656
end;
1627
 
1657
 
1628
function TMainForm.ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
1658
function TMainForm.ComposeColor(Dest, Src: TRGBQuad; Percent: Integer): TRGBQuad;
1629
begin
1659
begin
1630
  with Result do
1660
  with Result do
1631
  begin
1661
  begin
1632
    rgbRed := Src.rgbRed+((Dest.rgbRed-Src.rgbRed)*Percent div 256);
1662
    rgbRed := Src.rgbRed+((Dest.rgbRed-Src.rgbRed)*Percent div 256);
1633
    rgbGreen := Src.rgbGreen+((Dest.rgbGreen-Src.rgbGreen)*Percent div 256);
1663
    rgbGreen := Src.rgbGreen+((Dest.rgbGreen-Src.rgbGreen)*Percent div 256);
1634
    rgbBlue := Src.rgbBlue+((Dest.rgbBlue-Src.rgbBlue)*Percent div 256);
1664
    rgbBlue := Src.rgbBlue+((Dest.rgbBlue-Src.rgbBlue)*Percent div 256);
1635
    rgbReserved := 0;
1665
    rgbReserved := 0;
1636
  end;
1666
  end;
1637
end;
1667
end;
1638
 
1668
 
1639
procedure TMainForm.PalleteAnim(Col: TRGBQuad; Time: Integer);
1669
procedure TMainForm.PalleteAnim(Col: TRGBQuad; Time: Integer);
1640
var
1670
var
1641
  i: Integer;
1671
  i: Integer;
1642
  t, t2: DWORD;
1672
  t, t2: DWORD;
1643
  ChangePalette: Boolean;
1673
  ChangePalette: Boolean;
1644
  c: Integer;
1674
  c: Integer;
1645
begin
1675
begin
1646
  if DXDraw.Initialized then
1676
  if DXDraw.Initialized then
1647
  begin
1677
  begin
1648
    c := DXDraw.Surface.ColorMatch(RGB(Col.rgbRed, Col.rgbGreen, Col.rgbBlue));
1678
    c := DXDraw.Surface.ColorMatch(RGB(Col.rgbRed, Col.rgbGreen, Col.rgbBlue));
1649
    ChangePalette := False;
1679
    ChangePalette := False;
1650
    if DXDraw.CanPaletteAnimation then
1680
    if DXDraw.CanPaletteAnimation then
1651
    begin
1681
    begin
1652
      t := GetTickCount;
1682
      t := GetTickCount;
1653
      while Abs(GetTickCount-t)<Time do
1683
      while Abs(GetTickCount-t)<Time do
1654
      begin
1684
      begin
1655
        t2 := Trunc(Abs(GetTickCount-t)/Time*255);
1685
        t2 := Trunc(Abs(GetTickCount-t)/Time*255);
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;
1668
    if ChangePalette then
1701
    if ChangePalette then
1669
    begin
1702
    begin
1670
      DXDraw.ColorTable := DXDraw.DefColorTable;
1703
      DXDraw.ColorTable := DXDraw.DefColorTable;
1671
      DXDraw.UpdatePalette;
1704
      DXDraw.UpdatePalette;
1672
    end;
1705
    end;
1673
    DXDraw.Surface.Fill(c);
1706
    DXDraw.Surface.Fill(c);
1674
    DXDraw.Flip;
1707
    DXDraw.Flip;
1675
  end;
1708
  end;
1676
end;
1709
end;
1677
 
1710
 
1678
procedure TMainForm.StartScene(Scene: TGameScene);
1711
procedure TMainForm.StartScene(Scene: TGameScene);
1679
begin
1712
begin
1680
  EndScene;
1713
  EndScene;
1681
  DXInput.States := DXInput.States - DXInputButton;
1714
  DXInput.States := DXInput.States - DXInputButton;
1682
  FScene := Scene;
1715
  FScene := Scene;
1683
  BlinkStart;
1716
  BlinkStart;
1684
  case FScene of
1717
  case FScene of
1685
    gsTitle   : StartSceneTitle;
1718
    gsTitle   : StartSceneTitle;
1686
    gsMain    : StartSceneMain;
1719
    gsMain    : StartSceneMain;
1687
    gsGameOver: StartSceneGameOver;
1720
    gsGameOver: StartSceneGameOver;
1688
    gsWin     : StartSceneWin;
1721
    gsWin     : StartSceneWin;
1689
    gsNewLevel: StartSceneNewLevel;
1722
    gsNewLevel: StartSceneNewLevel;
1690
  end;
1723
  end;
1691
end;
1724
end;
1692
 
1725
 
1693
procedure TMainForm.StartSceneTitle;
1726
procedure TMainForm.StartSceneTitle;
1694
begin
1727
begin
1695
  sleep(500);
1728
  sleep(500);
1696
  FCheat := false;
1729
  FCheat := false;
1697
  BossExists := false;
1730
  BossExists := false;
1698
  FLife := Lives;
1731
  FLife := Lives;
1699
  FLevel := 0;
1732
  FLevel := 0;
1700
  FScore := 0;
1733
  FScore := 0;
1701
  FNotSave := true;
1734
  FNotSave := true;
1702
  Cheat.enabled := false;
1735
  Cheat.enabled := false;
1703
  Neustart.enabled := false;
1736
  Neustart.enabled := false;
1704
  GamePause.enabled := false;
1737
  GamePause.enabled := false;
1705
  GameStart.enabled := false;
1738
  GameStart.enabled := false;
1706
  Spielgeschwindigkeit.enabled := false;
1739
  Spielgeschwindigkeit.enabled := false;
1707
  mainform.Visible := true;
1740
  mainform.Visible := true;
1708
  PlayMusic(mtTitle);
1741
  PlayMusic(mtTitle);
1709
end;
1742
end;
1710
 
1743
 
1711
procedure TMainForm.StartSceneMain;
1744
procedure TMainForm.StartSceneMain;
1712
{var
1745
{var
1713
  i, j: Integer;}
1746
  i, j: Integer;}
1714
begin
1747
begin
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);
1726
    Image := mainform.ImageList.Items.Find('Star3');
1759
    Image := mainform.ImageList.Items.Find('Star3');
1727
    Z := -13;
1760
    Z := -13;
1728
    Y := 40;
1761
    Y := 40;
1729
    FSpeed := 1 / 2;
1762
    FSpeed := 1 / 2;
1730
    Tile := True;
1763
    Tile := True;
1731
  end;
1764
  end;
1732
  with TBackground.Create(SpriteEngine.Engine) do
1765
  with TBackground.Create(SpriteEngine.Engine) do
1733
  begin
1766
  begin
1734
    SetMapSize(1, 1);
1767
    SetMapSize(1, 1);
1735
    Image := mainform.ImageList.Items.Find('Star2');
1768
    Image := mainform.ImageList.Items.Find('Star2');
1736
    Z := -12;
1769
    Z := -12;
1737
    Y := 30;
1770
    Y := 30;
1738
    FSpeed := 1;
1771
    FSpeed := 1;
1739
    Tile := True;
1772
    Tile := True;
1740
  end;
1773
  end;
1741
  with TBackground.Create(SpriteEngine.Engine) do
1774
  with TBackground.Create(SpriteEngine.Engine) do
1742
  begin
1775
  begin
1743
    SetMapSize(1, 1);
1776
    SetMapSize(1, 1);
1744
    Image := mainform.ImageList.Items.Find('Star1');
1777
    Image := mainform.ImageList.Items.Find('Star1');
1745
    Z := -11;
1778
    Z := -11;
1746
    Y := 10;
1779
    Y := 10;
1747
    FSpeed := 2;
1780
    FSpeed := 2;
1748
    Tile := True;
1781
    Tile := True;
1749
  end;
1782
  end;
1750
  {with TBackground.Create(SpriteEngine.Engine) do
1783
  {with TBackground.Create(SpriteEngine.Engine) do
1751
  begin
1784
  begin
1752
    SetMapSize(200, 10);
1785
    SetMapSize(200, 10);
1753
    Y := 10;
1786
    Y := 10;
1754
    Z := -13;
1787
    Z := -13;
1755
    FSpeed := 1 / 2;
1788
    FSpeed := 1 / 2;
1756
    Tile := True;
1789
    Tile := True;
1757
    for i := 0 to MapHeight-1 do
1790
    for i := 0 to MapHeight-1 do
1758
    begin
1791
    begin
1759
      for j := 0 to MapWidth-1 do
1792
      for j := 0 to MapWidth-1 do
1760
      begin
1793
      begin
1761
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 8);
1794
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 8);
1762
        if Random(100)<95 then Chips[j, i] := -1;
1795
        if Random(100)<95 then Chips[j, i] := -1;
1763
      end;
1796
      end;
1764
    end;
1797
    end;
1765
  end;
1798
  end;
1766
  with TBackground.Create(SpriteEngine.Engine) do
1799
  with TBackground.Create(SpriteEngine.Engine) do
1767
  begin
1800
  begin
1768
    SetMapSize(200, 10);
1801
    SetMapSize(200, 10);
1769
    Y := 30;
1802
    Y := 30;
1770
    Z := -12;
1803
    Z := -12;
1771
    FSpeed := 1;
1804
    FSpeed := 1;
1772
    Tile := True;
1805
    Tile := True;
1773
    for i := 0 to MapHeight-1 do
1806
    for i := 0 to MapHeight-1 do
1774
    begin
1807
    begin
1775
      for j := 0 to MapWidth-1 do
1808
      for j := 0 to MapWidth-1 do
1776
      begin
1809
      begin
1777
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 4);
1810
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 4);
1778
        if Random(100)<95 then Chips[j, i] := -1;
1811
        if Random(100)<95 then Chips[j, i] := -1;
1779
      end;
1812
      end;
1780
    end;
1813
    end;
1781
  end;
1814
  end;
1782
  with TBackground.Create(SpriteEngine.Engine) do
1815
  with TBackground.Create(SpriteEngine.Engine) do
1783
  begin
1816
  begin
1784
    SetMapSize(200, 10);
1817
    SetMapSize(200, 10);
1785
    Y := 40;
1818
    Y := 40;
1786
    Z := -11;
1819
    Z := -11;
1787
    FSpeed := 2;
1820
    FSpeed := 2;
1788
    Tile := True;
1821
    Tile := True;
1789
    for i := 0 to MapHeight-1 do
1822
    for i := 0 to MapHeight-1 do
1790
    begin
1823
    begin
1791
      for j := 0 to MapWidth-1 do
1824
      for j := 0 to MapWidth-1 do
1792
      begin
1825
      begin
1793
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 2);
1826
        Chips[j, i] := Image.PatternCount-Random(Image.PatternCount div 2);
1794
        if Random(100)<95 then Chips[j, i] := -1;
1827
        if Random(100)<95 then Chips[j, i] := -1;
1795
      end;
1828
      end;
1796
    end;
1829
    end;
1797
  end;}
1830
  end;}
1798
  FNotSave := false;
1831
  FNotSave := false;
1799
  Cheat.enabled := true;
1832
  Cheat.enabled := true;
1800
  Neustart.enabled := true;
1833
  Neustart.enabled := true;
1801
  GamePause.enabled := true;
1834
  GamePause.enabled := true;
1802
  GameStart.enabled := true;
1835
  GameStart.enabled := true;
1803
  Spielgeschwindigkeit.enabled := true;
1836
  Spielgeschwindigkeit.enabled := true;
1804
end;
1837
end;
1805
 
1838
 
1806
procedure TMainForm.StartSceneGameOver;
1839
procedure TMainForm.StartSceneGameOver;
1807
begin
1840
begin
1808
  sleep(500);
1841
  sleep(500);
1809
  FNotSave := true;
1842
  FNotSave := true;
1810
  Cheat.enabled := false;
1843
  Cheat.enabled := false;
1811
  Spielgeschwindigkeit.enabled := false;
1844
  Spielgeschwindigkeit.enabled := false;
1812
  Neustart.enabled := false;
1845
  Neustart.enabled := false;
1813
  GamePause.enabled := false;
1846
  GamePause.enabled := false;
1814
  PlayMusic(mtScene);
1847
  PlayMusic(mtScene);
1815
  BossExists := false;
1848
  BossExists := false;
1816
end;
1849
end;
1817
 
1850
 
1818
procedure TMainForm.StartSceneWin;
1851
procedure TMainForm.StartSceneWin;
1819
begin
1852
begin
1820
  sleep(500);
1853
  sleep(500);
1821
  FNotSave := true;
1854
  FNotSave := true;
1822
  Cheat.enabled := false;
1855
  Cheat.enabled := false;
1823
  Spielgeschwindigkeit.enabled := false;
1856
  Spielgeschwindigkeit.enabled := false;
1824
  Neustart.enabled := false;
1857
  Neustart.enabled := false;
1825
  GamePause.enabled := false;
1858
  GamePause.enabled := false;
1826
  PlayMusic(mtScene);
1859
  PlayMusic(mtScene);
1827
  BossExists := false;
1860
  BossExists := false;
1828
end;
1861
end;
1829
 
1862
 
1830
procedure TMainForm.EndScene;
1863
procedure TMainForm.EndScene;
1831
begin
1864
begin
1832
  case FScene of
1865
  case FScene of
1833
    gsTitle   : EndSceneTitle;
1866
    gsTitle   : EndSceneTitle;
1834
    gsMain    : EndSceneMain;
1867
    gsMain    : EndSceneMain;
1835
    gsGameOver: EndSceneGameOver;
1868
    gsGameOver: EndSceneGameOver;
1836
    gsWin     : EndSceneWin;
1869
    gsWin     : EndSceneWin;
1837
    gsNewLevel: EndSceneNewLevel;
1870
    gsNewLevel: EndSceneNewLevel;
1838
  end;
1871
  end;
1839
end;
1872
end;
1840
 
1873
 
1841
procedure TMainForm.EndSceneTitle;
1874
procedure TMainForm.EndSceneTitle;
1842
begin
1875
begin
1843
  {  Ende Title  }
1876
  {  Ende Title  }
1844
end;
1877
end;
1845
 
1878
 
1846
procedure TMainForm.EndSceneMain;
1879
procedure TMainForm.EndSceneMain;
1847
begin
1880
begin
1848
  SpriteEngine.Engine.Clear;
1881
  SpriteEngine.Engine.Clear;
1849
end;
1882
end;
1850
 
1883
 
1851
procedure TMainForm.EndSceneGameOver;
1884
procedure TMainForm.EndSceneGameOver;
1852
begin
1885
begin
1853
  {  Ende GameOver  }
1886
  {  Ende GameOver  }
1854
end;
1887
end;
1855
 
1888
 
1856
procedure TMainForm.EndSceneWin;
1889
procedure TMainForm.EndSceneWin;
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;
1997
begin
2026
begin
1998
  DXDraw.Surface.Fill(0);
2027
  DXDraw.Surface.Fill(0);
1999
  Logo := ImageList.Items.Find('Logo');
2028
  Logo := ImageList.Items.Find('Logo');
2000
  {Logo.DrawWaveX(DXDraw.Surface, (dxdraw.surfaceWidth div 2) - 181, 65, Logo.Width, Logo.Height, 0,
2029
  {Logo.DrawWaveX(DXDraw.Surface, (dxdraw.surfaceWidth div 2) - 181, 65, Logo.Width, Logo.Height, 0,
2001
    Trunc(16 - Cos256(FBlink div 60) * 16), 32, -FBlink div 5);}
2030
    Trunc(16 - Cos256(FBlink div 60) * 16), 32, -FBlink div 5);}
2002
  Logo.DrawWaveX(DXDraw.Surface, trunc((dxdraw.surfaceWidth / 2) - (Logo.Width / 2)), 65, Logo.Width, Logo.Height, 0,
2031
  Logo.DrawWaveX(DXDraw.Surface, trunc((dxdraw.surfaceWidth / 2) - (Logo.Width / 2)), 65, Logo.Width, Logo.Height, 0,
2003
    2, 80, Fangle * 4);
2032
    2, 80, Fangle * 4);
2004
  inc(Fangle);
2033
  inc(Fangle);
2005
  with DXDraw.Surface.Canvas do
2034
  with DXDraw.Surface.Canvas do
2006
  begin
2035
  begin
2007
    if (isDown in MainForm.DXInput.States) and (FMenuItem=1) then FMenuItem := 2;
2036
    if (isDown in MainForm.DXInput.States) and (FMenuItem=1) then FMenuItem := 2;
2008
    if ((isUp in MainForm.DXInput.States) and (FMenuItem=2)) or (FMenuItem=0) then FMenuItem := 1;
2037
    if ((isUp in MainForm.DXInput.States) and (FMenuItem=2)) or (FMenuItem=0) then FMenuItem := 1;
2009
    Brush.Style := bsClear;
2038
    Brush.Style := bsClear;
2010
    Font.Size := 30;
2039
    Font.Size := 30;
2011
    if FMenuItem = 1 then
2040
    if FMenuItem = 1 then
2012
    begin
2041
    begin
2013
      Font.Color := clMaroon;
2042
      Font.Color := clMaroon;
2014
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-52, 'Normales Spiel');
2043
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-52, 'Normales Spiel');
2015
      Textout((dxdraw.surfaceWidth div 2)-187, (dxdraw.surfaceheight div 2)-52, '>');
2044
      Textout((dxdraw.surfaceWidth div 2)-187, (dxdraw.surfaceheight div 2)-52, '>');
2016
      Font.Color := clRed;
2045
      Font.Color := clRed;
2017
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2)-50, 'Normales Spiel');
2046
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2)-50, 'Normales Spiel');
2018
      Textout((dxdraw.surfaceWidth div 2)-185, (dxdraw.surfaceheight div 2)-50, '>');
2047
      Textout((dxdraw.surfaceWidth div 2)-185, (dxdraw.surfaceheight div 2)-50, '>');
2019
      Font.Color := clOlive;
2048
      Font.Color := clOlive;
2020
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-2, 'Zufallslevel');
2049
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-2, 'Zufallslevel');
2021
      Font.Color := clYellow;
2050
      Font.Color := clYellow;
2022
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2), 'Zufallslevel');
2051
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2), 'Zufallslevel');
2023
    end
2052
    end
2024
    else
2053
    else
2025
    begin
2054
    begin
2026
      Font.Color := clOlive;
2055
      Font.Color := clOlive;
2027
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-52, 'Normales Spiel');
2056
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-52, 'Normales Spiel');
2028
      Font.Color := clYellow;
2057
      Font.Color := clYellow;
2029
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2)-50, 'Normales Spiel');
2058
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2)-50, 'Normales Spiel');
2030
      Font.Color := clMaroon;
2059
      Font.Color := clMaroon;
2031
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-2, 'Zufallslevel');
2060
      Textout((dxdraw.surfaceWidth div 2)-152, (dxdraw.surfaceheight div 2)-2, 'Zufallslevel');
2032
      Textout((dxdraw.surfaceWidth div 2)-187, (dxdraw.surfaceheight div 2)-2, '>');
2061
      Textout((dxdraw.surfaceWidth div 2)-187, (dxdraw.surfaceheight div 2)-2, '>');
2033
      Font.Color := clRed;
2062
      Font.Color := clRed;
2034
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2), 'Zufallslevel');
2063
      Textout((dxdraw.surfaceWidth div 2)-150, (dxdraw.surfaceheight div 2), 'Zufallslevel');
2035
      Textout((dxdraw.surfaceWidth div 2)-185, (dxdraw.surfaceheight div 2), '>');
2064
      Textout((dxdraw.surfaceWidth div 2)-185, (dxdraw.surfaceheight div 2), '>');
2036
    end;
2065
    end;
2037
    { if (FBlink div 300) mod 2=0 then
2066
    { if (FBlink div 300) mod 2=0 then
2038
    begin
2067
    begin
2039
      Font.Color := clGreen;
2068
      Font.Color := clGreen;
2040
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2069
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2041
      Font.Color := clLime;
2070
      Font.Color := clLime;
2042
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2071
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2043
    end; }
2072
    end; }
2044
    BlinkUpdate;
2073
    BlinkUpdate;
2045
    Release;
2074
    Release;
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);
2057
    PlaySound('SceneMov', False);
2086
    PlaySound('SceneMov', False);
2058
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2087
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2059
    Sleep(200);
2088
    Sleep(200);
2060
    StartScene(gsMain);
2089
    StartScene(gsMain);
2061
  end;
2090
  end;
2062
end;
2091
end;
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);
2093
  if FNextScene=gsNone then
2124
  if FNextScene=gsNone then
2094
  begin
2125
  begin
2095
    SpriteEngine.Draw;
2126
    SpriteEngine.Draw;
2096
    if MainForm.flife > 0 then
2127
    if MainForm.flife > 0 then
2097
    begin
2128
    begin
2098
      with DXDraw.Surface.Canvas do
2129
      with DXDraw.Surface.Canvas do
2099
      begin
2130
      begin
2100
        Brush.Style := bsClear;
2131
        Brush.Style := bsClear;
2101
        Font.Size := 20;
2132
        Font.Size := 20;
2102
        Font.Color := clOlive;
2133
        Font.Color := clOlive;
2103
        Textout(9, 9, 'Punkte: ' + FloatToStrF(FScore,ffNumber,14,0));
2134
        Textout(9, 9, 'Punkte: ' + FloatToStrF(FScore,ffNumber,14,0));
2104
        Font.Color := clYellow;
2135
        Font.Color := clYellow;
2105
        Textout(10, 10, 'Punkte: ' + FloatToStrF(FScore,ffNumber,14,0));
2136
        Textout(10, 10, 'Punkte: ' + FloatToStrF(FScore,ffNumber,14,0));
2106
        Font.Color := clMaroon;
2137
        Font.Color := clMaroon;
2107
        Textout(dxdraw.surfacewidth-141, 9, 'Level: ' + IntToStr(MainForm.flevel));
2138
        Textout(dxdraw.surfacewidth-141, 9, 'Level: ' + IntToStr(MainForm.flevel));
2108
        Font.Color := clRed;
2139
        Font.Color := clRed;
2109
        Textout(dxdraw.surfacewidth-140, 10, 'Level: ' + IntToStr(MainForm.flevel));
2140
        Textout(dxdraw.surfacewidth-140, 10, 'Level: ' + IntToStr(MainForm.flevel));
2110
        if FLife<0 then mainform.FLife := 0;
2141
        if FLife<0 then mainform.FLife := 0;
2111
        if FCheat then
2142
        if FCheat then
2112
        begin
2143
        begin
2113
          Font.Color := clPurple;
2144
          Font.Color := clPurple;
2114
          Textout(9, dxdraw.surfaceheight-41, 'Leben: ?');
2145
          Textout(9, dxdraw.surfaceheight-41, 'Leben: ?');
2115
          Font.Color := clFuchsia;
2146
          Font.Color := clFuchsia;
2116
          Textout(10, dxdraw.surfaceheight-40, 'Leben: ?');
2147
          Textout(10, dxdraw.surfaceheight-40, 'Leben: ?');
2117
        end
2148
        end
2118
        else
2149
        else
2119
        begin
2150
        begin
2120
          if ((Flife = 1) and ((FBlink div 300) mod 2=0)) or (Flife <> 1) then
2151
          if ((Flife = 1) and ((FBlink div 300) mod 2=0)) or (Flife <> 1) then
2121
          begin
2152
          begin
2122
            Font.Color := clPurple;
2153
            Font.Color := clPurple;
2123
            Textout(9, dxdraw.surfaceheight-41, 'Leben: ' + IntToStr(MainForm.flife));
2154
            Textout(9, dxdraw.surfaceheight-41, 'Leben: ' + IntToStr(MainForm.flife));
2124
            Font.Color := clFuchsia;
2155
            Font.Color := clFuchsia;
2125
            Textout(10, dxdraw.surfaceheight-40, 'Leben: ' + IntToStr(MainForm.flife));
2156
            Textout(10, dxdraw.surfaceheight-40, 'Leben: ' + IntToStr(MainForm.flife));
2126
          end;
2157
          end;
2127
          if Flife = 1 then BlinkUpdate;
2158
          if Flife = 1 then BlinkUpdate;
2128
        end;
2159
        end;
2129
        {if BossExists and (FBossLife>0) then
2160
        {if BossExists and (FBossLife>0) then
2130
        begin
2161
        begin
2131
          Font.Color := clPurple;
2162
          Font.Color := clPurple;
2132
          Textout(449, 439, 'Boss: ' + IntToStr(FBossLife));
2163
          Textout(449, 439, 'Boss: ' + IntToStr(FBossLife));
2133
          Font.Color := clFuchsia;
2164
          Font.Color := clFuchsia;
2134
          Textout(450, 440, 'Boss: ' + IntToStr(FBossLife));
2165
          Textout(450, 440, 'Boss: ' + IntToStr(FBossLife));
2135
        end
2166
        end
2136
        else
2167
        else
2137
          if RestlicheEinheiten>0 then
2168
          if RestlicheEinheiten>0 then
2138
          begin
2169
          begin
2139
            Font.Color := clPurple;
2170
            Font.Color := clPurple;
2140
            Textout(449, 439, 'Einheiten: ' + IntToStr(RestlicheEinheiten));
2171
            Textout(449, 439, 'Einheiten: ' + IntToStr(RestlicheEinheiten));
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
2174
    begin
2205
    begin
2175
      DXDraw.Surface.Canvas.Font.Color := clGreen; // Grüne schrift bei gescheitert? FIXME
2206
      DXDraw.Surface.Canvas.Font.Color := clGreen; // Grüne schrift bei gescheitert? FIXME
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;
2188
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission erfolgreich!');
2218
      DXDraw.Surface.Canvas.Textout(dxdraw.surfacewidth-250, dxdraw.surfaceheight-40, 'Mission erfolgreich!');
2189
      DXDraw.Surface.Canvas.Release;
2219
      DXDraw.Surface.Canvas.Release;
2190
      Sleep(1);
2220
      Sleep(1);
2191
      inc(FCounter);
2221
      inc(FCounter);
2192
      if FCounter>150{200} then PlayerSprite.FlyAway;
2222
      if FCounter>150{200} then PlayerSprite.FlyAway;
2193
    end;
2223
    end;
2194
  end;
2224
  end;
2195
end;
2225
end;
2196
 
2226
 
2197
procedure TMainForm.SceneGameOver;
2227
procedure TMainForm.SceneGameOver;
2198
begin
2228
begin
2199
  DXDraw.Surface.Fill(0);
2229
  DXDraw.Surface.Fill(0);
2200
  with DXDraw.Surface.Canvas do
2230
  with DXDraw.Surface.Canvas do
2201
  begin
2231
  begin
2202
    FNotSave := true;
2232
    FNotSave := true;
2203
    Cheat.enabled := false;
2233
    Cheat.enabled := false;
2204
    GamePause.enabled := false;
2234
    GamePause.enabled := false;
2205
    Neustart.enabled := false;
2235
    Neustart.enabled := false;
2206
    Brush.Style := bsClear;
2236
    Brush.Style := bsClear;
2207
    Font.Size := 35;
2237
    Font.Size := 35;
2208
    Font.Color := clMaroon;
2238
    Font.Color := clMaroon;
2209
    Textout((dxdraw.surfacewidth div 2)-127, 98, 'Verloren!');
2239
    Textout((dxdraw.surfacewidth div 2)-127, 98, 'Verloren!');
2210
    Font.Color := clRed;
2240
    Font.Color := clRed;
2211
    Textout((dxdraw.surfacewidth div 2)-125, 100, 'Verloren!');
2241
    Textout((dxdraw.surfacewidth div 2)-125, 100, 'Verloren!');
2212
    if (FBlink div 300) mod 2=0 then
2242
    if (FBlink div 300) mod 2=0 then
2213
    begin
2243
    begin
2214
      Font.Size := 30;
2244
      Font.Size := 30;
2215
      Font.Color := clOlive;
2245
      Font.Color := clOlive;
2216
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2246
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2217
      Font.Color := clYellow;
2247
      Font.Color := clYellow;
2218
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2248
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2219
    end;
2249
    end;
2220
    BlinkUpdate;
2250
    BlinkUpdate;
2221
    Release;
2251
    Release;
2222
  end;
2252
  end;
2223
  if isButton1 in DXInput.States then
2253
  if isButton1 in DXInput.States then
2224
  begin
2254
  begin
2225
    PlaySound('SceneMov', False);
2255
    PlaySound('SceneMov', False);
2226
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2256
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2227
    Sleep(200);
2257
    Sleep(200);
2228
    StartScene(gsTitle);
2258
    StartScene(gsTitle);
2229
  end;
2259
  end;
2230
end;
2260
end;
2231
 
2261
 
2232
procedure TMainForm.SceneWin;
2262
procedure TMainForm.SceneWin;
2233
begin
2263
begin
2234
  DXDraw.Surface.Fill(0);
2264
  DXDraw.Surface.Fill(0);
2235
  with DXDraw.Surface.Canvas do
2265
  with DXDraw.Surface.Canvas do
2236
  begin
2266
  begin
2237
    FNotSave := true;
2267
    FNotSave := true;
2238
    Cheat.enabled := false;
2268
    Cheat.enabled := false;
2239
    GamePause.enabled := false;
2269
    GamePause.enabled := false;
2240
    Neustart.enabled := false;
2270
    Neustart.enabled := false;
2241
    Brush.Style := bsClear;
2271
    Brush.Style := bsClear;
2242
    Font.Size := 35;
2272
    Font.Size := 35;
2243
    Font.Color := clMaroon;
2273
    Font.Color := clMaroon;
2244
    Textout((dxdraw.surfaceWidth div 2)-127, 98, 'Gewonnen!');
2274
    Textout((dxdraw.surfaceWidth div 2)-127, 98, 'Gewonnen!');
2245
    Font.Color := clRed;
2275
    Font.Color := clRed;
2246
    Textout((dxdraw.surfaceWidth div 2)-125, 100, 'Gewonnen!');
2276
    Textout((dxdraw.surfaceWidth div 2)-125, 100, 'Gewonnen!');
2247
    if (FBlink div 300) mod 2=0 then
2277
    if (FBlink div 300) mod 2=0 then
2248
    begin
2278
    begin
2249
      Font.Size := 30;
2279
      Font.Size := 30;
2250
      Font.Color := clOlive;
2280
      Font.Color := clOlive;
2251
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2281
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2252
      Font.Color := clYellow;
2282
      Font.Color := clYellow;
2253
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2283
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2254
    end;
2284
    end;
2255
    BlinkUpdate;
2285
    BlinkUpdate;
2256
    Release;
2286
    Release;
2257
  end;
2287
  end;
2258
  if isButton1 in DXInput.States then
2288
  if isButton1 in DXInput.States then
2259
  begin
2289
  begin
2260
    PlaySound('SceneMov', False);
2290
    PlaySound('SceneMov', False);
2261
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2291
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2262
    Sleep(200);
2292
    Sleep(200);
2263
    StartScene(gsTitle);
2293
    StartScene(gsTitle);
2264
  end;
2294
  end;
2265
end;
2295
end;
2266
 
2296
 
2267
procedure TMainForm.StartSceneNewLevel;
2297
procedure TMainForm.StartSceneNewLevel;
2268
begin
2298
begin
2269
  sleep(500);
2299
  sleep(500);
2270
  FNotSave := false;
2300
  FNotSave := false;
2271
  Cheat.enabled := false;
2301
  Cheat.enabled := false;
2272
  Neustart.enabled := false;
2302
  Neustart.enabled := false;
2273
  GamePause.enabled := false;
2303
  GamePause.enabled := false;
2274
  GameStart.enabled := true;
2304
  GameStart.enabled := true;
2275
  Spielgeschwindigkeit.enabled := false;
2305
  Spielgeschwindigkeit.enabled := false;
2276
  BossExists := false;
2306
  BossExists := false;
2277
  Spielgeschwindigkeit.enabled := false;
2307
  Spielgeschwindigkeit.enabled := false;
2278
  if ((FMenuItem=1) and (not fileexists(FDirectory+'Levels\Level '+inttostr(FLevel)+'.lev'))) or ((FMenuItem=2) and (FLevel > 25)) then
2308
  if ((FMenuItem=1) and (not fileexists(FDirectory+'Levels\Level '+inttostr(FLevel)+'.lev'))) or ((FMenuItem=2) and (FLevel > 25)) then
2279
  begin
2309
  begin
2280
    //PlaySound('SceneMov', False);
2310
    //PlaySound('SceneMov', False);
2281
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2311
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2282
    Sleep(200);
2312
    Sleep(200);
2283
    StartScene(gsWin);
2313
    StartScene(gsWin);
2284
    exit;
2314
    exit;
2285
  end;
2315
  end;
2286
  PlayMusic(mtScene);
2316
  PlayMusic(mtScene);
2287
end;
2317
end;
2288
 
2318
 
2289
procedure TMainForm.EndSceneNewLevel;
2319
procedure TMainForm.EndSceneNewLevel;
2290
begin
2320
begin
2291
  {  Ende NewLevel  }
2321
  {  Ende NewLevel  }
2292
end;
2322
end;
2293
 
2323
 
2294
procedure TMainForm.SceneNewLevel;
2324
procedure TMainForm.SceneNewLevel;
2295
begin
2325
begin
2296
  DXDraw.Surface.Fill(0);
2326
  DXDraw.Surface.Fill(0);
2297
  with DXDraw.Surface.Canvas do
2327
  with DXDraw.Surface.Canvas do
2298
  begin
2328
  begin
2299
    Brush.Style := bsClear;
2329
    Brush.Style := bsClear;
2300
    Font.Size := 40;
2330
    Font.Size := 40;
2301
    Font.Color := clMaroon;
2331
    Font.Color := clMaroon;
2302
    Textout((dxdraw.surfaceWidth div 2)-(83+(length(inttostr(flevel))*22)), 98, 'Level '+inttostr(flevel));
2332
    Textout((dxdraw.surfaceWidth div 2)-(83+(length(inttostr(flevel))*22)), 98, 'Level '+inttostr(flevel));
2303
    Font.Color := clRed;
2333
    Font.Color := clRed;
2304
    Textout((dxdraw.surfaceWidth div 2)-(81+(length(inttostr(flevel))*22)), 100, 'Level '+inttostr(flevel));
2334
    Textout((dxdraw.surfaceWidth div 2)-(81+(length(inttostr(flevel))*22)), 100, 'Level '+inttostr(flevel));
2305
    if (FBlink div 300) mod 2=0 then
2335
    if (FBlink div 300) mod 2=0 then
2306
    begin
2336
    begin
2307
      Font.Size := 30;
2337
      Font.Size := 30;
2308
      Font.Color := clOlive;
2338
      Font.Color := clOlive;
2309
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2339
      Textout((dxdraw.surfaceWidth div 2)-187, dxdraw.surfaceheight-117, 'Weiter mit Leertaste');
2310
      Font.Color := clYellow;
2340
      Font.Color := clYellow;
2311
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2341
      Textout((dxdraw.surfaceWidth div 2)-185, dxdraw.surfaceheight-115, 'Weiter mit Leertaste');
2312
    end;
2342
    end;
2313
    BlinkUpdate;
2343
    BlinkUpdate;
2314
    Release;
2344
    Release;
2315
  end;
2345
  end;
2316
  if isButton1 in DXInput.States then
2346
  if isButton1 in DXInput.States then
2317
  begin
2347
  begin
2318
    PlaySound('SceneMov', False);
2348
    PlaySound('SceneMov', False);
2319
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2349
    PalleteAnim(RGBQuad(0, 0, 0), 300);
2320
    Sleep(200);
2350
    Sleep(200);
2321
    StartScene(gsMain);
2351
    StartScene(gsMain);
2322
  end;
2352
  end;
2323
end;
2353
end;
2324
 
2354
 
2325
procedure TMainForm.OptionMusicClick(Sender: TObject);
2355
procedure TMainForm.OptionMusicClick(Sender: TObject);
2326
begin
2356
begin
2327
  OptionMusic.Checked := not OptionMusic.Checked;
2357
  OptionMusic.Checked := not OptionMusic.Checked;
2328
  if OptionMusic.Checked then
2358
  if OptionMusic.Checked then
2329
  begin
2359
  begin
2330
    PlayMusic(FMusic)
2360
    PlayMusic(FMusic)
2331
  end
2361
  end
2332
  else
2362
  else
2333
  begin
2363
  begin
2334
    DestroyMusic(FMusic);
2364
    DestroyMusic(FMusic);
2335
  end;
2365
  end;
2336
  WriteOptions;
2366
  WriteOptions;
2337
end;
2367
end;
2338
 
2368
 
2339
procedure TMainForm.MasterClick(Sender: TObject);
2369
procedure TMainForm.MasterClick(Sender: TObject);
2340
begin
2370
begin
2341
  master.checked := true;
2371
  master.checked := true;
2342
  FInterval := giMaster;
2372
  FInterval := giMaster;
2343
  writeoptions;
2373
  writeoptions;
2344
end;
2374
end;
2345
 
2375
 
2346
procedure TEnemyMeteor.DoMove(MoveCount: Integer);
2376
procedure TEnemyMeteor.DoMove(MoveCount: Integer);
2347
begin
2377
begin
2348
  X := X - MoveCount*(250/1000);
2378
  X := X - MoveCount*(250/1000);
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);
2361
  MCISendString(pchar('seek "'+FDirectory+'Musik\Boss.mid" to start'), nil, 255, 0);
2392
  MCISendString(pchar('seek "'+FDirectory+'Musik\Boss.mid" to start'), nil, 255, 0);
2362
  MCISendString(pchar('seek "'+FDirectory+'Musik\Game.mid" to start'), nil, 255, 0);
2393
  MCISendString(pchar('seek "'+FDirectory+'Musik\Game.mid" to start'), nil, 255, 0);
2363
  MCISendString(pchar('seek "'+FDirectory+'Musik\Title.mid" to start'), nil, 255, 0);
2394
  MCISendString(pchar('seek "'+FDirectory+'Musik\Title.mid" to start'), nil, 255, 0);
2364
  MCISendString(pchar('seek "'+FDirectory+'Musik\Scene.mid" to start'), nil, 255, 0);
2395
  MCISendString(pchar('seek "'+FDirectory+'Musik\Scene.mid" to start'), nil, 255, 0);
2365
end;}
2396
end;}
2366
 
2397
 
2367
procedure TMainForm.ResumeMusic(Name: TMusicTrack);
2398
procedure TMainForm.ResumeMusic(Name: TMusicTrack);
2368
begin
2399
begin
2369
  if not OptionMusic.checked then exit;
2400
  if not OptionMusic.checked then exit;
2370
  if Name = mtBoss then
2401
  if Name = mtBoss then
2371
    MCISendString(pchar('play "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
2402
    MCISendString(pchar('play "'+FDirectory+'Musik\Boss.mid"'), nil, 255, 0);
2372
  if Name = mtGame then
2403
  if Name = mtGame then
2373
    MCISendString(pchar('play "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
2404
    MCISendString(pchar('play "'+FDirectory+'Musik\Game.mid"'), nil, 255, 0);
2374
  if Name = mtScene then
2405
  if Name = mtScene then
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;
2388
  AnimSpeed := DEFAULT_ANIMSPEED;
2419
  AnimSpeed := DEFAULT_ANIMSPEED;
2389
  PixelCheck := True;
2420
  PixelCheck := True;
2390
end;
2421
end;
2391
 
2422
 
2392
procedure TMainForm.SpielstandClick(Sender: TObject);
2423
procedure TMainForm.SpielstandClick(Sender: TObject);
2393
begin
2424
begin
2394
  speicherungform.showmodal;
2425
  speicherungform.showmodal;
2395
end;
2426
end;
2396
 
2427
 
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);
2408
begin
2439
begin
2409
  OptionBreitbild.Checked := not OptionBreitbild.Checked;
2440
  OptionBreitbild.Checked := not OptionBreitbild.Checked;
2410
  DXInit;
2441
  DXInit;
2411
  writeoptions;
2442
  writeoptions;
2412
end;
2443
end;
2413
 
2444
 
2414
procedure TMainForm.LeichtClick(Sender: TObject);
2445
procedure TMainForm.LeichtClick(Sender: TObject);
2415
begin
2446
begin
2416
  leicht.checked := true;
2447
  leicht.checked := true;
2417
  FInterval := giLeicht;
2448
  FInterval := giLeicht;
2418
  writeoptions;
2449
  writeoptions;
2419
end;
2450
end;
2420
 
2451
 
2421
procedure TMainForm.MittelClick(Sender: TObject);
2452
procedure TMainForm.MittelClick(Sender: TObject);
2422
begin
2453
begin
2423
  mittel.checked := true;
2454
  mittel.checked := true;
2424
  FInterval := giMittel;
2455
  FInterval := giMittel;
2425
  writeoptions;
2456
  writeoptions;
2426
end;
2457
end;
2427
 
2458
 
2428
procedure TMainForm.SchwerClick(Sender: TObject);
2459
procedure TMainForm.SchwerClick(Sender: TObject);
2429
begin
2460
begin
2430
  schwer.checked := true;
2461
  schwer.checked := true;
2431
  FInterval := giSchwer;
2462
  FInterval := giSchwer;
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
 
2444
procedure TMainForm.InformationenClick(Sender: TObject);
2478
procedure TMainForm.InformationenClick(Sender: TObject);
2445
begin
2479
begin
2446
  dxtimer.enabled := false;
2480
  dxtimer.enabled := false;
2447
  InfoForm.showmodal;
2481
  InfoForm.showmodal;
2448
  if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
2482
  if not mainform.gamepause.checked then mainform.dxtimer.enabled := true;
2449
end;
2483
end;
2450
 
2484
 
2451
procedure TMainForm.CheatClick(Sender: TObject);
2485
procedure TMainForm.CheatClick(Sender: TObject);
2452
begin
2486
begin
2453
  CheatForm.showmodal;
2487
  CheatForm.showmodal;
2454
end;
2488
end;
2455
 
2489
 
2456
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
2490
procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
2457
begin
2491
begin
2458
  if optionMusic.checked then DestroyMusic(FMusic);
2492
  if optionMusic.checked then DestroyMusic(FMusic);
2459
  SpriteEngine.Engine.Clear;
2493
  SpriteEngine.Engine.Clear;
2460
  dxsound.Finalize;
2494
  dxsound.Finalize;
2461
  dxinput.Destroy;
2495
  dxinput.Destroy;
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
 
2478
 
2513