Subversion Repositories spacemission

Rev

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

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