Subversion Repositories spacemission

Rev

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

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