Subversion Repositories spacemission

Rev

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

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